From a6a623e680cb8deca4b450bfd9f3e1841218fc14 Mon Sep 17 00:00:00 2001 From: "s.zotov" Date: Sun, 12 Apr 2026 20:46:46 +0000 Subject: [PATCH] Add "Frontend-State" --- Frontend-State.-.md | 145 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 Frontend-State.-.md diff --git a/Frontend-State.-.md b/Frontend-State.-.md new file mode 100644 index 0000000..b36de70 --- /dev/null +++ b/Frontend-State.-.md @@ -0,0 +1,145 @@ +# Frontend State + +## Все переменные состояния App.svelte + +### Авторизация +| Переменная | Тип | Описание | +|------------|-----|----------| +| `currentUser` | object | `{id, login, name, role, projects, theme, activePage, previewZoom}` | +| `authChecked` | bool | Проверка авторизации завершена | +| `loginForm` | object | `{login, password}` | +| `loginError` | string | Ошибка логина | +| `loginLoading` | bool | | +| `loginBg` | string | Случайный фон из 5 изображений | + +### Блоки +| Переменная | Тип | Описание | +|------------|-----|----------| +| `availableBlocks` | array | Блоки из Block.pug | +| `assembledBlocks` | array | Текущие блоки в конструкторе. Каждый: `{id, name, content, collapsed, schema, addSpacing, spacing, segment, swapCenter}` | +| `customBlocksList` | array | Кастомные блоки из settings | +| `allBlocks` | array | Merged available + custom | + +### Гендер +| Переменная | Тип | Описание | +|------------|-----|----------| +| `currentGenderVersion` | string | 'female' / 'male' | +| `segmentFlipped` | bool | Состояние toggle flip | +| `partsFiles` | array | Список pug-файлов header/footer | + +### Превью +| Переменная | Тип | Описание | +|------------|-----|----------| +| `previewHtml` | string | HTML с подстановкой Mindbox | +| `rawPreviewHtml` | string | HTML без Mindbox | +| `previewLoading` | bool | | +| `previewError` | string | | +| `previewGeneratedAt` | string | ISO timestamp | +| `previewStale` | bool | Есть несохранённые изменения | +| `previewSourcePug` | string | PUG при последнем рендере | +| `previewZoom` | number | 40-100 | +| `outputPanelMode` | string | 'pug' / 'preview' / 'html' | +| `previewContentWidth/Height` | number | Размеры контента | +| `previewScale` | number | Масштаб для viewport | + +### Фид / Mindbox +| Переменная | Тип | Описание | +|------------|-----|----------| +| `unavailableProducts` | array | Товары не в наличии | +| `feedSyncedAt` | number | Timestamp последней синхронизации | +| `suggestForProduct` | object | Товар для замены | +| `suggestResults` | array | Рекомендации замены | + +### FTP +| Переменная | Тип | Описание | +|------------|-----|----------| +| `showFtpGalleryModal` | bool | | +| `ftpGalleryImages` | array | Файлы в галерее | +| `ftpGalleryFolder` | string | Текущая папка | +| `ftpGalleryCache` | object | `{folder: files[]}` | +| `ftpUploading` | bool | | +| `ftpUploadProgress` | string | Текст прогресса | + +### План / Yonote +| Переменная | Тип | Описание | +|------------|-----|----------| +| `planRows` | array | Строки из Yonote | +| `planCalMonth` | Date | Текущий месяц календаря | +| `planCalSelectedDate` | string | Выбранная дата | +| `planShowDone` | bool | Показывать отправленные | +| `planPollingTimer` | number | ID интервала (3 мин) | +| `assemblyInfo` | object | Данные карточки сборки | + +### Spell / Link check +| Переменная | Тип | Описание | +|------------|-----|----------| +| `spellCheckActive` | bool | | +| `spellErrors` | array | Найденные ошибки | +| `spellerHtml` | string | HTML с метками ошибок | +| `linkCheckActive` | bool | | +| `linkCheckResults` | array | Результаты проверки | + +### Письма +| Переменная | Тип | Описание | +|------------|-----|----------| +| `letters` | array | Все письма юзера | +| `currentLetterId` | string | Текущее письмо | +| `currentLetterName/Title/Date` | string | Поля письма | +| `history` | array | Undo stack (макс 50) | +| `isDirty` | bool | Есть несохранённые изменения | + +### UI +| Переменная | Тип | Описание | +|------------|-----|----------| +| `theme` | string | 'light' / 'dark' | +| `activePage` | string | 'builder' / 'settings' / 'presets' / 'notes' / 'plan' / 'stats' / 'admin' | +| `settingsTab` | string | Активная вкладка настроек | +| `toasts` | array | Уведомления | + +## localStorage + +| Ключ | Описание | +|------|----------| +| `va-theme` | 'light' / 'dark' | +| `va-active-page` | Последняя страница | +| `va-previewZoom` | Масштаб превью | +| `va-plan-cache` | Кэш плана `{rows, ts}` | + +## Cookies + +| Cookie | Описание | +|--------|----------| +| `va_token` | Сессия (HttpOnly, Secure, SameSite=Strict, 7 дней) | + +## Keyboard Shortcuts + +| Комбинация | Действие | +|------------|----------| +| `Ctrl/Cmd + S` | Сохранить | +| `Ctrl/Cmd + G` | Рендер превью | +| `Ctrl/Cmd + Z` | Undo (только вне input/textarea) | +| `Shift + Enter` | Вставить `
` в поле блока | + +## CSS Темы + +### Light (`:root`) +```css +--bg: #ffffff +--text: #130F33 +--accent: #130F33 +--accent-secondary: #AAC8C8 +--panel: #ffffff +--pill: #f4f4f6 +``` + +### Dark (`body.theme-dark`) +```css +--bg: #130F33 +--text: #e4e7ec +--accent: #AAC8C8 +--accent-contrast: #130F33 +--panel: #1a1545 +--pill: #221c52 +``` + +Акцентный цвет проекта настраивается в settings → `accentColor` и устанавливается через CSS custom properties `--project-accent`.