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>
This commit is contained in:
nns 2026-10-08 17:34:27 +05:00
parent ec7d2dc601
commit 57f36d8dee
20 changed files with 33 additions and 30 deletions

View file

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 10 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -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" },

View file

@ -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>

View file

@ -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}
/> />
) )

View file

@ -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>

View file

@ -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>

View file

@ -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">

View file

@ -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 шага — и можно работать."
/> />

View file

@ -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 минуты или пропустите.`}
/> />

View file

@ -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>

View file

@ -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>

View file

@ -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">
Этот установщик поможет создать первую организацию и подготовить систему к работе. Этот установщик поможет создать первую организацию и подготовить систему к работе.
Займёт минуту: укажете данные магазина, заведёте первого администратора и можно работать. Займёт минуту: укажете данные магазина, заведёте первого администратора и можно работать.