rebrand: веб-админка ALL MARKET (лого, favicon, PWA, тексты)
- Логотипы: logo.svg/logo-light.svg/favicon.svg → готовые файлы ALL MARKET; добавлены apple-touch-icon.png (180), favicon-32.png, icon-192/512.png (PWA maskable). - index.html: <title>ALL MARKET, apple-touch-icon → png, favicon-32. - manifest.webmanifest: name/short_name ALL MARKET, PNG-иконки 192/512. - Logo.tsx: alt ALL MARKET, высота h-8; на экранах входа/восстановления — h-12 (охранное поле). - Онбординг, SuperAdmin-настройки (имя отправителя/тест), offline.html → ALL MARKET. - theme_color и цвета интерфейса не менялись. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
@ -3,15 +3,16 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
||||||
<title>FOOD MARKET</title>
|
<title>ALL MARKET</title>
|
||||||
<meta name="theme-color" content="#00B207" />
|
<meta name="theme-color" content="#00B207" />
|
||||||
<!-- PWA: manifest + apple-touch-meta. SW регистрируется в main.tsx. -->
|
<!-- PWA: manifest + apple-touch-meta. SW регистрируется в main.tsx. -->
|
||||||
<link rel="manifest" href="/manifest.webmanifest" />
|
<link rel="manifest" href="/manifest.webmanifest" />
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
||||||
<meta name="apple-mobile-web-app-title" content="Food Market" />
|
<meta name="apple-mobile-web-app-title" content="ALL MARKET" />
|
||||||
<link rel="apple-touch-icon" href="/favicon.svg" />
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|
|
||||||
BIN
src/food-market.web/public/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
src/food-market.web/public/favicon-32.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 10 KiB |
BIN
src/food-market.web/public/icon-192.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
src/food-market.web/public/icon-512.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 13 KiB |
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "Food Market — управление магазином",
|
"name": "ALL MARKET — управление магазином",
|
||||||
"short_name": "Food Market",
|
"short_name": "ALL MARKET",
|
||||||
"description": "Дашборд и отчёты владельца. Учёт товаров, продаж и остатков.",
|
"description": "Дашборд и отчёты владельца. Учёт товаров, продаж и остатков.",
|
||||||
"id": "/",
|
"id": "/",
|
||||||
"scope": "/",
|
"scope": "/",
|
||||||
|
|
@ -11,8 +11,9 @@
|
||||||
"theme_color": "#00B207",
|
"theme_color": "#00B207",
|
||||||
"lang": "ru-KZ",
|
"lang": "ru-KZ",
|
||||||
"icons": [
|
"icons": [
|
||||||
{ "src": "/favicon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any maskable" },
|
{ "src": "/favicon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" },
|
||||||
{ "src": "/logo.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" }
|
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" },
|
||||||
|
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" }
|
||||||
],
|
],
|
||||||
"shortcuts": [
|
"shortcuts": [
|
||||||
{ "name": "Дашборд", "url": "/dashboard" },
|
{ "name": "Дашборд", "url": "/dashboard" },
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Food Market — оффлайн</title>
|
<title>ALL MARKET — оффлайн</title>
|
||||||
<meta name="theme-color" content="#00B207" />
|
<meta name="theme-color" content="#00B207" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||||
<style>
|
<style>
|
||||||
|
|
@ -45,7 +45,7 @@
|
||||||
<h1>Нет интернета</h1>
|
<h1>Нет интернета</h1>
|
||||||
<p>Кэш отчётов остался — попробуйте открыть «Дашборд» или «Отчёт по продажам». Создание чеков и изменения требуют связи с сервером.</p>
|
<p>Кэш отчётов остался — попробуйте открыть «Дашборд» или «Отчёт по продажам». Создание чеков и изменения требуют связи с сервером.</p>
|
||||||
<button onclick="location.href='/dashboard'">Открыть дашборд</button>
|
<button onclick="location.href='/dashboard'">Открыть дашборд</button>
|
||||||
<div class="meta">Food Market PWA — offline mode</div>
|
<div class="meta">ALL MARKET PWA — offline mode</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -2,19 +2,20 @@ import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
interface Props { className?: string; variant?: 'light' | 'dark' }
|
interface Props { className?: string; variant?: 'light' | 'dark' }
|
||||||
|
|
||||||
/** Wordmark Food Market (FOOD-зелёный + яблоко в О + MARKET-серый).
|
/** Логотип ALL MARKET (знак «ручка корзины» над «all» + «market»,
|
||||||
|
* зелёный #0DB70D + графит, шрифт Onest в кривых).
|
||||||
* variant='dark' переключает на белую версию для тёмного фона
|
* variant='dark' переключает на белую версию для тёмного фона
|
||||||
* (например — sidebar супер-админки на indigo-950).
|
* (например — sidebar супер-админки на indigo-950).
|
||||||
*
|
*
|
||||||
* Текстовая версия удалена: теперь inline SVG из public/, чтобы один
|
* Готовые файлы бренда из public/ (logo.svg — color, logo-light.svg — white).
|
||||||
* source мог использоваться и в favicon, и в hero, и в шапке. */
|
* Не перерисовывать и не перекрашивать — только менять размер. */
|
||||||
export function Logo({ className, variant = 'light' }: Props) {
|
export function Logo({ className, variant = 'light' }: Props) {
|
||||||
const src = variant === 'dark' ? '/logo-light.svg' : '/logo.svg'
|
const src = variant === 'dark' ? '/logo-light.svg' : '/logo.svg'
|
||||||
return (
|
return (
|
||||||
<img
|
<img
|
||||||
src={src}
|
src={src}
|
||||||
alt="Food Market"
|
alt="ALL MARKET"
|
||||||
className={cn('h-7 w-auto select-none', className)}
|
className={cn('h-8 w-auto select-none', className)}
|
||||||
draggable={false}
|
draggable={false}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ export function ForgotPasswordPage() {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen flex items-center justify-center bg-slate-50 dark:bg-slate-900 p-4">
|
<div className="min-h-screen flex items-center justify-center bg-slate-50 dark:bg-slate-900 p-4">
|
||||||
<div className="w-full max-w-md bg-white dark:bg-slate-800 rounded-xl shadow-lg p-8 space-y-5">
|
<div className="w-full max-w-md bg-white dark:bg-slate-800 rounded-xl shadow-lg p-8 space-y-5">
|
||||||
<Logo />
|
<Logo className="h-12" />
|
||||||
{!submitted ? (
|
{!submitted ? (
|
||||||
<form onSubmit={submit} noValidate className="space-y-4">
|
<form onSubmit={submit} noValidate className="space-y-4">
|
||||||
<div>
|
<div>
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ export function LoginPage() {
|
||||||
className="w-full max-w-md bg-white dark:bg-slate-800 rounded-xl shadow-lg p-8 space-y-5"
|
className="w-full max-w-md bg-white dark:bg-slate-800 rounded-xl shadow-lg p-8 space-y-5"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<Logo />
|
<Logo className="h-12" />
|
||||||
<p className="text-sm text-slate-500 mt-2.5">Вход в систему</p>
|
<p className="text-sm text-slate-500 mt-2.5">Вход в систему</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ export function NoOrganizationPage() {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen flex items-center justify-center bg-slate-50 dark:bg-slate-900 p-4">
|
<div className="min-h-screen flex items-center justify-center bg-slate-50 dark:bg-slate-900 p-4">
|
||||||
<div className="w-full max-w-md bg-white dark:bg-slate-800 rounded-xl shadow-lg p-8 space-y-5">
|
<div className="w-full max-w-md bg-white dark:bg-slate-800 rounded-xl shadow-lg p-8 space-y-5">
|
||||||
<Logo />
|
<Logo className="h-12" />
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<h1 className="text-2xl font-bold text-slate-900 dark:text-slate-50">У вас нет активных организаций</h1>
|
<h1 className="text-2xl font-bold text-slate-900 dark:text-slate-50">У вас нет активных организаций</h1>
|
||||||
<p className="text-sm text-slate-600 dark:text-slate-400">
|
<p className="text-sm text-slate-600 dark:text-slate-400">
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ export function OnboardingPage() {
|
||||||
<div className="h-full overflow-auto">
|
<div className="h-full overflow-auto">
|
||||||
<div className="max-w-5xl mx-auto p-4 sm:p-6 space-y-5 sm:space-y-6">
|
<div className="max-w-5xl mx-auto p-4 sm:p-6 space-y-5 sm:space-y-6">
|
||||||
<PageHeader
|
<PageHeader
|
||||||
title="Первые шаги в Food Market"
|
title="Первые шаги в ALL MARKET"
|
||||||
description="Складской учёт, закупки и продажи в одной системе. Пройдите 4 шага — и можно работать."
|
description="Складской учёт, закупки и продажи в одной системе. Пройдите 4 шага — и можно работать."
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ export function OnboardingWizardPage() {
|
||||||
<div className="h-full overflow-auto bg-slate-50 dark:bg-slate-950">
|
<div className="h-full overflow-auto bg-slate-50 dark:bg-slate-950">
|
||||||
<div className="max-w-3xl mx-auto p-4 sm:p-6 space-y-5">
|
<div className="max-w-3xl mx-auto p-4 sm:p-6 space-y-5">
|
||||||
<PageHeader
|
<PageHeader
|
||||||
title="Добро пожаловать в Food Market"
|
title="Добро пожаловать в ALL MARKET"
|
||||||
description={`Шаг ${step} из ${TOTAL_STEPS}. Пройдите за 2-3 минуты или пропустите.`}
|
description={`Шаг ${step} из ${TOTAL_STEPS}. Пройдите за 2-3 минуты или пропустите.`}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ export function ResetPasswordPage() {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen flex items-center justify-center bg-slate-50 dark:bg-slate-900 p-4">
|
<div className="min-h-screen flex items-center justify-center bg-slate-50 dark:bg-slate-900 p-4">
|
||||||
<div className="w-full max-w-md bg-white dark:bg-slate-800 rounded-xl shadow-lg p-8 space-y-5">
|
<div className="w-full max-w-md bg-white dark:bg-slate-800 rounded-xl shadow-lg p-8 space-y-5">
|
||||||
<Logo />
|
<Logo className="h-12" />
|
||||||
{!done ? (
|
{!done ? (
|
||||||
<form onSubmit={submit} noValidate className="space-y-4">
|
<form onSubmit={submit} noValidate className="space-y-4">
|
||||||
<div>
|
<div>
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ interface Form {
|
||||||
const blankForm = (): Form => ({
|
const blankForm = (): Form => ({
|
||||||
smtpHost: '', smtpPort: '', smtpUseSsl: false, smtpStartTls: true,
|
smtpHost: '', smtpPort: '', smtpUseSsl: false, smtpStartTls: true,
|
||||||
smtpUsername: '', newSmtpPassword: '',
|
smtpUsername: '', newSmtpPassword: '',
|
||||||
fromEmail: '', fromName: 'Food Market',
|
fromEmail: '', fromName: 'ALL MARKET',
|
||||||
reason: '',
|
reason: '',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -51,8 +51,8 @@ export function SuperAdminPlatformSettingsPage() {
|
||||||
|
|
||||||
// Тестовая отправка.
|
// Тестовая отправка.
|
||||||
const [testTo, setTestTo] = useState('')
|
const [testTo, setTestTo] = useState('')
|
||||||
const [testSubject, setTestSubject] = useState('Тест Food Market')
|
const [testSubject, setTestSubject] = useState('Тест ALL MARKET')
|
||||||
const [testBody, setTestBody] = useState('Если вы видите это письмо — SMTP в Food Market настроен корректно.')
|
const [testBody, setTestBody] = useState('Если вы видите это письмо — SMTP в ALL MARKET настроен корректно.')
|
||||||
const [testBusy, setTestBusy] = useState(false)
|
const [testBusy, setTestBusy] = useState(false)
|
||||||
const [testResult, setTestResult] = useState<{ ok: boolean; message: string } | null>(null)
|
const [testResult, setTestResult] = useState<{ ok: boolean; message: string } | null>(null)
|
||||||
|
|
||||||
|
|
@ -66,7 +66,7 @@ export function SuperAdminPlatformSettingsPage() {
|
||||||
smtpUsername: data.smtpUsername ?? '',
|
smtpUsername: data.smtpUsername ?? '',
|
||||||
newSmtpPassword: '',
|
newSmtpPassword: '',
|
||||||
fromEmail: data.fromEmail ?? '',
|
fromEmail: data.fromEmail ?? '',
|
||||||
fromName: data.fromName ?? 'Food Market',
|
fromName: data.fromName ?? 'ALL MARKET',
|
||||||
reason: '',
|
reason: '',
|
||||||
})
|
})
|
||||||
setLoaded(true)
|
setLoaded(true)
|
||||||
|
|
@ -189,7 +189,7 @@ export function SuperAdminPlatformSettingsPage() {
|
||||||
<Field label="From — имя отправителя">
|
<Field label="From — имя отправителя">
|
||||||
<TextInput value={form.fromName}
|
<TextInput value={form.fromName}
|
||||||
onChange={(e) => setForm({ ...form, fromName: e.target.value })}
|
onChange={(e) => setForm({ ...form, fromName: e.target.value })}
|
||||||
placeholder="Food Market" />
|
placeholder="ALL MARKET" />
|
||||||
</Field>
|
</Field>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ export function SuperAdminSetupPage() {
|
||||||
|
|
||||||
{step === 1 && (
|
{step === 1 && (
|
||||||
<section className="rounded-xl border border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 p-6 space-y-3">
|
<section className="rounded-xl border border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 p-6 space-y-3">
|
||||||
<h2 className="text-xl font-bold">Добро пожаловать в Food Market</h2>
|
<h2 className="text-xl font-bold">Добро пожаловать в ALL MARKET</h2>
|
||||||
<p className="text-slate-600 dark:text-slate-400">
|
<p className="text-slate-600 dark:text-slate-400">
|
||||||
Этот установщик поможет создать первую организацию и подготовить систему к работе.
|
Этот установщик поможет создать первую организацию и подготовить систему к работе.
|
||||||
Займёт минуту: укажете данные магазина, заведёте первого администратора и можно работать.
|
Займёт минуту: укажете данные магазина, заведёте первого администратора и можно работать.
|
||||||
|
|
|
||||||