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>
<meta charset="UTF-8" />
<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" />
<title>FOOD MARKET</title>
<title>ALL MARKET</title>
<meta name="theme-color" content="#00B207" />
<!-- PWA: manifest + apple-touch-meta. SW регистрируется в main.tsx. -->
<link rel="manifest" href="/manifest.webmanifest" />
<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-title" content="Food Market" />
<link rel="apple-touch-icon" href="/favicon.svg" />
<meta name="apple-mobile-web-app-title" content="ALL MARKET" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
</head>
<body>
<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 — управление магазином",
"short_name": "Food Market",
"name": "ALL MARKET — управление магазином",
"short_name": "ALL MARKET",
"description": "Дашборд и отчёты владельца. Учёт товаров, продаж и остатков.",
"id": "/",
"scope": "/",
@ -11,8 +11,9 @@
"theme_color": "#00B207",
"lang": "ru-KZ",
"icons": [
{ "src": "/favicon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any maskable" },
{ "src": "/logo.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" }
{ "src": "/favicon.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": [
{ "name": "Дашборд", "url": "/dashboard" },

View file

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<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" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<style>
@ -45,7 +45,7 @@
<h1>Нет интернета</h1>
<p>Кэш отчётов остался — попробуйте открыть «Дашборд» или «Отчёт по продажам». Создание чеков и изменения требуют связи с сервером.</p>
<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>
</body>
</html>

View file

@ -2,19 +2,20 @@ import { cn } from '@/lib/utils'
interface Props { className?: string; variant?: 'light' | 'dark' }
/** Wordmark Food Market (FOOD-зелёный + яблоко в О + MARKET-серый).
/** Логотип ALL MARKET (знак «ручка корзины» над «all» + «market»,
* зелёный #0DB70D + графит, шрифт Onest в кривых).
* variant='dark' переключает на белую версию для тёмного фона
* (например — sidebar супер-админки на indigo-950).
*
* Текстовая версия удалена: теперь inline SVG из public/, чтобы один
* source мог использоваться и в favicon, и в hero, и в шапке. */
* Готовые файлы бренда из public/ (logo.svg — color, logo-light.svg — white).
* Не перерисовывать и не перекрашивать — только менять размер. */
export function Logo({ className, variant = 'light' }: Props) {
const src = variant === 'dark' ? '/logo-light.svg' : '/logo.svg'
return (
<img
src={src}
alt="Food Market"
className={cn('h-7 w-auto select-none', className)}
alt="ALL MARKET"
className={cn('h-8 w-auto select-none', className)}
draggable={false}
/>
)

View file

@ -41,7 +41,7 @@ export function ForgotPasswordPage() {
return (
<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">
<Logo />
<Logo className="h-12" />
{!submitted ? (
<form onSubmit={submit} noValidate className="space-y-4">
<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"
>
<div>
<Logo />
<Logo className="h-12" />
<p className="text-sm text-slate-500 mt-2.5">Вход в систему</p>
</div>

View file

@ -17,7 +17,7 @@ export function NoOrganizationPage() {
return (
<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">
<Logo />
<Logo className="h-12" />
<div className="space-y-2">
<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">

View file

@ -60,7 +60,7 @@ export function OnboardingPage() {
<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">
<PageHeader
title="Первые шаги в Food Market"
title="Первые шаги в ALL MARKET"
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="max-w-3xl mx-auto p-4 sm:p-6 space-y-5">
<PageHeader
title="Добро пожаловать в Food Market"
title="Добро пожаловать в ALL MARKET"
description={`Шаг ${step} из ${TOTAL_STEPS}. Пройдите за 2-3 минуты или пропустите.`}
/>

View file

@ -47,7 +47,7 @@ export function ResetPasswordPage() {
return (
<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">
<Logo />
<Logo className="h-12" />
{!done ? (
<form onSubmit={submit} noValidate className="space-y-4">
<div>

View file

@ -33,7 +33,7 @@ interface Form {
const blankForm = (): Form => ({
smtpHost: '', smtpPort: '', smtpUseSsl: false, smtpStartTls: true,
smtpUsername: '', newSmtpPassword: '',
fromEmail: '', fromName: 'Food Market',
fromEmail: '', fromName: 'ALL MARKET',
reason: '',
})
@ -51,8 +51,8 @@ export function SuperAdminPlatformSettingsPage() {
// Тестовая отправка.
const [testTo, setTestTo] = useState('')
const [testSubject, setTestSubject] = useState('Тест Food Market')
const [testBody, setTestBody] = useState('Если вы видите это письмо — SMTP в Food Market настроен корректно.')
const [testSubject, setTestSubject] = useState('Тест ALL MARKET')
const [testBody, setTestBody] = useState('Если вы видите это письмо — SMTP в ALL MARKET настроен корректно.')
const [testBusy, setTestBusy] = useState(false)
const [testResult, setTestResult] = useState<{ ok: boolean; message: string } | null>(null)
@ -66,7 +66,7 @@ export function SuperAdminPlatformSettingsPage() {
smtpUsername: data.smtpUsername ?? '',
newSmtpPassword: '',
fromEmail: data.fromEmail ?? '',
fromName: data.fromName ?? 'Food Market',
fromName: data.fromName ?? 'ALL MARKET',
reason: '',
})
setLoaded(true)
@ -189,7 +189,7 @@ export function SuperAdminPlatformSettingsPage() {
<Field label="From — имя отправителя">
<TextInput value={form.fromName}
onChange={(e) => setForm({ ...form, fromName: e.target.value })}
placeholder="Food Market" />
placeholder="ALL MARKET" />
</Field>
</div>
</section>

View file

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