docs: update functional roadmap

This commit is contained in:
2026-02-22 10:15:32 +05:00
parent 01b8eb75e7
commit 8d8fe1f48a
+41 -52
View File
@@ -41,15 +41,16 @@
- Использование file-saver и JSZip - Использование file-saver и JSZip
- **Приоритет:** High - финальная цель пользователя - **Приоритет:** High - финальная цель пользователя
#### 1.4 Система фоновых изображений (частичная) #### 1.4 Система фоновых изображений
**Файлы:** [`src/states/imageConfig.svelte.ts`](src/states/imageConfig.svelte.ts), [`src/components/image/ImageManager.svelte`](src/components/image/ImageManager.svelte), [`src/components/image/CropInline.svelte`](src/components/image/CropInline.svelte) **Файлы:** [`src/states/image.svelte.ts`](src/states/image.svelte.ts), [`src/components/image/ImageManager.svelte`](src/components/image/ImageManager.svelte), [`src/components/image/CropInline.svelte`](src/components/image/CropInline.svelte), [`src/services/uploadService.ts`](src/services/uploadService.ts)
- Загрузка изображения по URL (только UI кнопки) - Загрузка изображений из файла, URL или буфера обмена
- Визуальный интерфейс для обрезки (crop box с handles) - Визуальный интерфейс для обрезки (crop box с handles)
- Настройки яркости и контраста (только UI слайдеры) - Настройки яркости, контраста, оттенка, насыщенности и яркости
- Автозагрузка дефолтного фона при старте - Применение фильтров с debounce (150ms)
- **Приоритет:** Low - нерабочая система - Сохранение настроек в localStorage
- **Приоритет:** High - полностью рабочий функционал
#### 1.5 Базовый UI/UX #### 1.5 Базовый UI/UX
@@ -66,67 +67,55 @@
--- ---
## 2. Low-hanging fruit (Ближайшие улучшения) ## 2. Ближайшие улучшения
### 2.1 Завершение системы изображений (High Priority) ### 2.1 Улучшение валидации и UX (Medium Priority)
**Проблема:** [`src/components/image/ImageManager.svelte`](src/components/image/ImageManager.svelte) имеет UI, но нет логики загрузки/обработки. **Текущее состояние:** Основной функционал работает, но можно улучшить пользовательский опыт.
**Требуемые правки:** **Требуемые улучшения:**
1. **Реализовать загрузку изображений** в [`src/services/imageService.ts`](src/services/imageService.ts): 1. **Валидация текстов:**
- Drag & drop поддержка - Добавить ограничение на длину текста (max 100 символов)
- Paste из буфера обмена - Показать счетчик символов
- Загрузка по URL с валидацией - Визуальная индикация ошибки при превышении лимита
- Валидация форматов (JPEG, PNG, WebP, GIF) и размера (10MB max)
- **Контракт:** `imageService.uploadImage(source: File | string): Promise<ImageConfig>`
2. **Интегрировать cropperjs** в [`src/components/image/CropInline.svelte`](src/components/image/CropInline.svelte): 2. **Валидация изображений:**
- Инициализация cropper.js на canvas - Проверка формата (JPEG, PNG, WebP, GIF)
- Привязка crop box к данным состояния - Проверка размера файла (10MB max)
- Реализовать drag & drop для перемещения - Показать ошибку при неудачной загрузке
- Реализовать resize через 8 handles
- **Контракт:** `onCropChange(crop: { left, top, right, bottom })`
3. **Применить фильтры яркости/контраста**: 3. **Состояния загрузки:**
- В [`src/states/imageConfig.svelte.ts`](src/states/imageConfig.svelte.ts) добавить `brightness: number`, `contrast: number` - Показать индикатор загрузки при загрузке по URL
- Применить CSS filters к Konva Image в [`src/components/panel/Preview.svelte`](src/components/panel/Preview.svelte) - Отключить кнопки во время загрузки
- **Контракт:** `filter: brightness(${brightness}%) contrast(${contrast}%)` - Показать toast уведомление об успехе/ошибке
4. **Сохранить обрезанное изображение**: 4. **Пустые состояния:**
- Метод `imageState.applyCrop()` должен обновлять `image` с обрезанными данными - Показать красивый empty state когда нет текстов
- Использовать canvas для actual cropping - Показать placeholder с инструкцией когда нет изображения
### 2.2 Валидация и состояния загрузки (Medium Priority) ### 2.2 Улучшение доступности (Medium Priority)
**Тексты:** **Файлы для правок:**
- [`src/components/text/TextInput.svelte`](src/components/text/TextInput.svelte): добавить валидацию длины (max 100 chars из [`src/lib/constants.ts`](src/lib/constants.ts):32) - Все кнопки уже имеют `aria-label`
- Показать ошибку при превышении длины - [`src/components/text/TextInput.svelte`](src/components/text/TextInput.svelte): добавить `aria-describedby` для валидации
- Добавить счетчик символов "3/100" - [`src/components/text/TextInlineEdit.svelte`](src/components/text/TextInlineEdit.svelte): добавить `aria-label` на delete button (уже есть)
- Добавить `role="region"` и `aria-label` на карточки
- Убедиться, что фокусный порядок логичен (Tab navigation)
**Изображения:** ### 2.3 Расширенные настройки текста (Medium Priority)
- [`src/components/image/ImageManager.svelte`](src/components/image/ImageManager.svelte): показать состояние загрузки (spinner) при загрузке по URL **Файлы для модификации:** [`src/states/textConfig.svelte.ts`](src/states/textConfig.svelte.ts), [`src/components/text/TextConfig.svelte`](src/components/text/TextConfig.svelte)
- Показать ошибку при неудачной загрузке
- Валидация формата/размера до загрузки
**Экспорт:** Добавить:
- [`src/services/downloadService.ts`](src/services/downloadService.ts): показать прогресс-бар при `downloadAll()` - **Тень текста:** `textShadow: { offsetX, offsetY, blur, color }`
- Отключить кнопки во время экспорта - **Прозрачность:** `opacity: number` (0-100)
- Показать toast уведомление об успехе/ошибке - **Градиент:** `gradient: { type: 'linear' | 'radial', colors: HexColor[], angle? }` (сложнее)
- **Несколько текстовых блоков на панели:** потребует переархитектуры Preview.svelte
### 2.3 Пустые состояния (Medium Priority) **Приоритет:** Medium - улучшает качество панелей, но требует работы с Konva.
**Списки:**
- [`src/components/text/TextManager.svelte`](src/components/text/TextManager.svelte): когда `textsState.texts.length === 0`, показать красивый empty state вместо пустого UL
- [`src/components/panel/PreviewManager.svelte`](src/components/panel/PreviewManager.svelte): уже есть empty state, но можно улучшить (иконка + текст + CTA)
**Изображение:**
- [`src/components/image/ImageManager.svelte`](src/components/image/ImageManager.svelte): когда нет изображения, показать placeholder с инструкцией
### 2.4 Улучшение доступности (Medium Priority) ### 2.4 Улучшение доступности (Medium Priority)