mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-09-14 13:36:36 +00:00
docs: update plans
This commit is contained in:
@@ -0,0 +1,122 @@
|
|||||||
|
# План C17: перенос preview → корень + (old) → /v1/
|
||||||
|
|
||||||
|
> Статус: план к выполнению. Предпосылки: tech debt закрыт, backlog №14 (старые
|
||||||
|
> файлы → lib/old/) выполнен. Домен НЕ блокер (см. plan-redesign.md §10,
|
||||||
|
> plan-seo.md §6).
|
||||||
|
|
||||||
|
## Цель
|
||||||
|
|
||||||
|
Новый дизайн становится основным на корневых маршрутах (`/`, `/tools/[id]`,
|
||||||
|
`/list-tools`). Старый дизайн переезжает на `/v1/*` как архив для справки.
|
||||||
|
Удаление старого кода (C19) откладывается до полной приёмки нового дизайна.
|
||||||
|
|
||||||
|
## Структура маршрутов (до → после)
|
||||||
|
|
||||||
|
**До:** `(old)/` даёт URLs `/`, `/demo`, `/list-tools`, `/tools/[id]`.
|
||||||
|
`preview/` даёт `/preview`, `/preview/list-tools`, `/preview/tools/[id]`,
|
||||||
|
`/preview/kit`.
|
||||||
|
|
||||||
|
**После:** `v1/` даёт `/v1/`, `/v1/demo`, `/v1/list-tools`, `/v1/tools/[id]`.
|
||||||
|
Корень даёт `/`, `/list-tools`, `/tools/[id]`. Витрина kit — на реальном
|
||||||
|
маршруте `/kit` (дизайн в стадии тестирования).
|
||||||
|
|
||||||
|
## Решения
|
||||||
|
|
||||||
|
1. **`v1/` — реальная папка, НЕ route group** — group `(v1)/` не меняет URL, а
|
||||||
|
нам нужно чтобы старые страницы жили по `/v1/*`.
|
||||||
|
2. **Корневой layout: shell нового дизайна** — TopBar, Footer, тема, хлебные
|
||||||
|
крошки, импорт `app.css`, `@layer app, design;`.
|
||||||
|
3. **`v1/+layout.svelte` — только импорт `app_v1.css`** — без header/footer/shell.
|
||||||
|
4. **Тема:** использовать `theme.svelte.ts` (не дублировать локальный `$state`).
|
||||||
|
5. **`@layer app, design;`** остаётся — design выигрывает у app везде.
|
||||||
|
6. **`noindex` остаётся** на `tools/[id]/+page.svelte` до покупки домена.
|
||||||
|
7. **CSS-файлы переименовываются:** `preview.css` → `app.css`, `old.css` →
|
||||||
|
`app_v1.css`. Все ссылки обновляются.
|
||||||
|
8. **`kit/` витрина → `/kit`** — переносится на реальный маршрут вместе с
|
||||||
|
остальными preview-страницами; отдельный `preview/+layout` удаляется
|
||||||
|
(`/kit` наследует корневой shell).
|
||||||
|
|
||||||
|
## Что делать (шаги)
|
||||||
|
|
||||||
|
### 1. Rename `(old)/` → `v1/`
|
||||||
|
|
||||||
|
Переименовать папку. Обновить `v1/+layout.svelte`:
|
||||||
|
убрать «Preview v2» ссылку, обновить пути навигации, поправить импорт CSS.
|
||||||
|
|
||||||
|
### 2. Новый корневой `+layout.svelte` + rename CSS
|
||||||
|
|
||||||
|
Перезаписать текущий нейтральный layout содержимым из `preview/+layout.svelte`
|
||||||
|
(с правками: тема через `theme.svelte.ts`, путь к CSS). Переименовать
|
||||||
|
`src/preview.css` → `src/app.css`, `src/old.css` → `src/app_v1.css`.
|
||||||
|
Обновить все ссылки на эти файлы в проекте ( layout, лайнтеры, eslint-плагины,
|
||||||
|
скрипты, тесты).
|
||||||
|
|
||||||
|
### 3. Move preview pages → корень
|
||||||
|
|
||||||
|
Переместить страницы из `preview/` в корень `routes/`: `+page` → `/`,
|
||||||
|
`list-tools` → `/`, `tools/[id]` → `/`, витрину `kit` → `/kit`. Удалить
|
||||||
|
`preview/+layout.svelte` (корневой shell заменяет его).
|
||||||
|
|
||||||
|
### 4. Flatten `kit/` → `components/`
|
||||||
|
|
||||||
|
Перенести компоненты из `lib/components/kit/` в `lib/components/`, обновить
|
||||||
|
все импорты, удалить пустую `kit/`.
|
||||||
|
|
||||||
|
### 5. Update hardcoded `/preview/` URLs
|
||||||
|
|
||||||
|
В компонентах с захардкоженными путями `/preview/` заменить на корневые.
|
||||||
|
|
||||||
|
### 6. E2E тесты + playwright config
|
||||||
|
|
||||||
|
Заменить `/preview/...` на `/...` во всех e2e файлах и конфиге playwright.
|
||||||
|
|
||||||
|
### 7. ESLint config + AGENTS.md
|
||||||
|
|
||||||
|
Обновить glob-паттерны: `routes/preview/**` → `routes/**`,
|
||||||
|
`components/kit/**` → `components/**`. Обновить `AGENTS.md`.
|
||||||
|
|
||||||
|
### 8. Isolation plugin
|
||||||
|
|
||||||
|
Обновить `DEFAULT_OLD`: `routes/(old)/**` → `routes/v1/**`.
|
||||||
|
Убрать `routes/preview/**` из `DEFAULT_NEW`.
|
||||||
|
|
||||||
|
### 9. Archive audit scripts
|
||||||
|
|
||||||
|
Перенести скрипты аудита в `scripts/archive/`, убрать вызовы из манифестов.
|
||||||
|
|
||||||
|
## Порядок коммитов
|
||||||
|
|
||||||
|
| # | Описание | Зависит от |
|
||||||
|
| --- | ----------------------------------------------- | ---------- |
|
||||||
|
| 1 | Rename `(old)/` → `v1/`, правки v1/layout | — |
|
||||||
|
| 2 | Новый корневой layout + rename CSS | — |
|
||||||
|
| 3 | Move preview pages → корень (+ `/preview/kit` → | 2 |
|
||||||
|
| | `/kit`, удалить `preview/+layout`) | |
|
||||||
|
| 4 | Flatten kit/ → components/, обновить импорты | — |
|
||||||
|
| 5 | TopNav + ToolCard: убрать `/preview/` из URL | 3 |
|
||||||
|
| 6 | E2E тесты + playwright config | 3 |
|
||||||
|
| 7 | ESLint config + AGENTS.md | 3, 4 |
|
||||||
|
| 8 | Isolation plugin | 1 |
|
||||||
|
| 9 | Archive audit scripts + убрать из манифестов | — |
|
||||||
|
|
||||||
|
> **3+5 делаются вместе (один коммит):** после переноса страниц в корень
|
||||||
|
> `ToolCard`/`TopNav` продолжают линковать `/preview/...`, prerender падает на
|
||||||
|
> 404 — между шагами 3 и 5 билд не зелёный.
|
||||||
|
|
||||||
|
После каждого коммита: `pnpm --dir web lint` + `pnpm --dir web build` (+
|
||||||
|
`pnpm --dir web test` если затронуты e2e).
|
||||||
|
|
||||||
|
## Что НЕ меняется
|
||||||
|
|
||||||
|
- `$lib/preview/`, `$lib/registry-new/` — без изменений
|
||||||
|
- `$lib/old/components/` — без изменений (каждая сторона хранит свою копию)
|
||||||
|
- `routes/+layout.ts` — prerender = true остаётся
|
||||||
|
- Слаги инструментов (`*-png`) — без изменений
|
||||||
|
- `/kit` — витрина дизайна остаётся (в стадии тестирования)
|
||||||
|
|
||||||
|
## Риски
|
||||||
|
|
||||||
|
- **v1/ без shell** — старый дизайн без header/footer.
|
||||||
|
- **`@layer` взаимодействие** — проверить что design-токены перекрывают
|
||||||
|
app-токены на обоих маршрутах.
|
||||||
|
- **Isolation: shared-классификация** — маршруты нового дизайна shared до C19.
|
||||||
+20
-12
@@ -3,8 +3,10 @@
|
|||||||
> Статус: план к выполнению. Шаги 5–6 (C17–C21) остаются **следующим этапом**.
|
> Статус: план к выполнению. Шаги 5–6 (C17–C21) остаются **следующим этапом**.
|
||||||
> Они больше не привязаны к «верности против рефа»:
|
> Они больше не привязаны к «верности против рефа»:
|
||||||
> `docs/archive/plan-design-fix.md` закрыт, аудит против рефа прекращён.
|
> `docs/archive/plan-design-fix.md` закрыт, аудит против рефа прекращён.
|
||||||
> Tech debt закрыт (`docs/archive/plan-tech-debt.md`). Перед C17: backlog №14
|
> Tech debt закрыт (`docs/archive/plan-tech-debt.md`). Backlog №14 (переезд
|
||||||
> (переезд старых файлов в `old/`) и покупка домена (`plan-domain.local.md`).
|
> старых файлов в `old/`) — **выполнено**. Покупка домена НЕ блокер C17:
|
||||||
|
> домен нужен для S1 (`plan-seo.md`) — canonical, sitemap, снятие `noindex`.
|
||||||
|
> C17 можно запускать без домена (см. §10).
|
||||||
>
|
>
|
||||||
> Источники: `refs/` — Next/React-референс (правда по пикселям и интерактиву),
|
> Источники: `refs/` — Next/React-референс (правда по пикселям и интерактиву),
|
||||||
> `refs-html/` — статические HTML-снимки для быстрого просмотра в браузере.
|
> `refs-html/` — статические HTML-снимки для быстрого просмотра в браузере.
|
||||||
@@ -358,18 +360,23 @@ src/routes/preview/tools/[id]/+page.svelte
|
|||||||
|
|
||||||
### Шаг 5. Сделать новый дизайн основным — СЛЕДУЮЩИЙ ЭТАП
|
### Шаг 5. Сделать новый дизайн основным — СЛЕДУЮЩИЙ ЭТАП
|
||||||
|
|
||||||
> Tech debt закрыт. Перед стартом C17: покупка домена (`plan-domain.local.md`).
|
> Tech debt закрыт. Backlog №14 (переезд старых файлов в `lib/old/`) — **выполнено**.
|
||||||
> Переезд старых файлов в `lib/old/` (backlog №14) — **выполнено**.
|
> Покупка домена — НЕ блокер C17. C17 переносит маршруты и делает новый дизайн
|
||||||
|
> основным; `noindex` остаётся до покупки домена и запуска S1 (`plan-seo.md`).
|
||||||
|
> Детальный план см. в `docs/plan-c17.md` (старый `(old)/` → `/v1/`, удаление
|
||||||
|
> отложено до C19).
|
||||||
|
|
||||||
- [ ] **[C17]** Перенести `preview/*` → реальные маршруты (move), удалить
|
- [ ] **[C17]** Перенести `preview/*` → реальные маршруты (move), удалить
|
||||||
`(old)/`, корневой `+layout.svelte` импортирует `design2.css` + новый
|
`(old)/`, корневой `+layout.svelte` импортирует `design2.css` + новый
|
||||||
shell. Убрать флаг/кнопку. **И обновить `newCode` в
|
shell. Убрать флаг/кнопку. **Снять `noindex, nofollow`** со страницы
|
||||||
|
инструмента (`preview/tools/[id]/+page.svelte`) — страницы становятся
|
||||||
|
боевыми лендингами ровно в момент переезда (SEO: `plan-seo.md`, S1a).
|
||||||
|
**Временное решение:** если домен ещё не куплен, `noindex` можно оставить
|
||||||
|
до S1 — тогда C17 делается без снятия `noindex`, а снятие происходит
|
||||||
|
вместе с подключением canonical в S1. **И обновить `newCode` в
|
||||||
`web/eslint.config.js`:** заменить `src/routes/preview/**` на
|
`web/eslint.config.js`:** заменить `src/routes/preview/**` на
|
||||||
`src/routes/**` (после переезда все маршруты — новый дизайн), компонентный
|
`src/routes/**` (после переезда все маршруты — новый дизайн), компонентный
|
||||||
glob `src/lib/components/kit/**` пока оставить. **И снять
|
glob `src/lib/components/kit/**` пока оставить.
|
||||||
`noindex, nofollow`** со страницы инструмента
|
|
||||||
(`preview/tools/[id]/+page.svelte`) — страницы становятся боевыми
|
|
||||||
лендингами ровно в момент переезда (SEO: `plan-seo.md`, S1a).
|
|
||||||
- [ ] **[C18]** Правки импортов/редиректов после переноса, проверка билда.
|
- [ ] **[C18]** Правки импортов/редиректов после переноса, проверка билда.
|
||||||
|
|
||||||
### Шаг 6. Удаление старого
|
### Шаг 6. Удаление старого
|
||||||
@@ -401,9 +408,10 @@ src/routes/preview/tools/[id]/+page.svelte
|
|||||||
> существовать в том же коммите.
|
> существовать в том же коммите.
|
||||||
> - Коммиты **C3→C16 не трогают старый сайт** `(old)/` — они только добавляют
|
> - Коммиты **C3→C16 не трогают старый сайт** `(old)/` — они только добавляют
|
||||||
> новые файлы/маршруты, сломать старый сайт на них нельзя.
|
> новые файлы/маршруты, сломать старый сайт на них нельзя.
|
||||||
> - **C17 — единственный атомарный переключатель**: перенос `preview/*` на
|
> - **C17 — атомарный переключатель**: перенос `preview/*` на реальные пути +
|
||||||
> реальные пути + удаление `(old)/` + смена root-layout должны быть в ОДНОМ
|
> удаление `(old)/` + смена root-layout — в ОДНОМ коммите. Снятие `noindex`
|
||||||
> коммите (иначе конфликт маршрутов или пропажа страниц). Не дробить.
|
> также в C17, **если домен уже куплен**; иначе — отложить на S1. Не дробить
|
||||||
|
> сам C17.
|
||||||
> - **C19 должен идти строго после C17** (старый `app.css`/`ui/` удаляем только
|
> - **C19 должен идти строго после C17** (старый `app.css`/`ui/` удаляем только
|
||||||
> когда old-сайт уже выключен).
|
> когда old-сайт уже выключен).
|
||||||
> - Очерёдность зависимостей: `design2.css` (C3) и kit-компоненты (C5–C7) должны
|
> - Очерёдность зависимостей: `design2.css` (C3) и kit-компоненты (C5–C7) должны
|
||||||
|
|||||||
+40
-22
@@ -1,8 +1,11 @@
|
|||||||
# План: SEO + GEO — индексация и конкуренция в image tools
|
# План: SEO + GEO — индексация и конкуренция в image tools
|
||||||
|
|
||||||
> **Статус (2026-09-09):** план к выполнению. Старт — после C17
|
> **Статус (2026-09-10):** план к выполнению. Старт — после C17
|
||||||
> (`plan-redesign.md`): до переезда `preview/*` на реальные маршруты страницы
|
> (`plan-redesign.md`): до переезда `preview/*` на реальные маршруты страницы
|
||||||
> инструментов в `noindex`, применять техминимум некуда.
|
> инструментов в `noindex`, применять техминимум некуда.
|
||||||
|
> **Уточнено:** домен НЕ блокер C17 (см. §6). Задачи S1 разбиты на
|
||||||
|
> domain-free (можно делать параллельно с покупкой домена) и domain-required
|
||||||
|
> (после покупки и настройки домена на Vercel).
|
||||||
>
|
>
|
||||||
> **Цель:** каждая страница инструмента — индексируемый лендинг под конкретный
|
> **Цель:** каждая страница инструмента — индексируемый лендинг под конкретный
|
||||||
> интент («crop png», «make png transparent», «jpg to png»…), конкуренция с
|
> интент («crop png», «make png transparent», «jpg to png»…), конкуренция с
|
||||||
@@ -133,22 +136,16 @@
|
|||||||
|
|
||||||
### S1. Технический минимум (сразу после C17)
|
### S1. Технический минимум (сразу после C17)
|
||||||
|
|
||||||
- [ ] **[S1a]** Снять `noindex, nofollow` со страницы инструмента
|
Разбито на две группы: **domain-free** (делаем параллельно с покупкой домена)
|
||||||
(`preview/tools/[id]/+page.svelte`) — встроено в C17 как атомарный шаг
|
и **domain-required** (после покупки и DNS-настройки).
|
||||||
(см. `plan-redesign.md`).
|
|
||||||
- [ ] **[S1b]** Скрипт `web/scripts/gen-sitemap.mjs`: генерирует `sitemap.xml` в
|
#### S1-free: без домена (параллельно с C18–C19)
|
||||||
`build/` из `TOOLS` реестра (`registry-new`) + статических страниц. Вызов
|
|
||||||
из `pnpm build` после `vite build` (adapter-static пишет в `build/`,
|
|
||||||
дописываем файл там же). Origin — из env (`PUBLIC_SITE_ORIGIN`), учёт
|
|
||||||
опционального `BASE_PATH`.
|
|
||||||
- [ ] **[S1c]** `robots.txt`: `Sitemap:` + закрыть служебные маршруты
|
|
||||||
(`/preview/kit` до C17; после — вернуть минимальный allow-all).
|
|
||||||
- [ ] **[S1d]** Компонент `Seo.svelte` (kit): canonical (абсолютный URL по
|
|
||||||
актуальному маршруту), OG-теги (title/description/type/url/image),
|
|
||||||
twitter:card. Подключить в root-layout.
|
|
||||||
- [ ] **[S1e]** OG-картинки per-tool: генерация PNG-карточек скриптом на
|
- [ ] **[S1e]** OG-картинки per-tool: генерация PNG-карточек скриптом на
|
||||||
существующем ядре (мы сами умеем рисовать PNG) — имя инструмента + бренд,
|
существующем ядре (мы сами умеем рисовать PNG) — имя инструмента + бренд,
|
||||||
файл `static/og/[id].png`, ссылка из `Seo.svelte`.
|
файл `static/og/[id].png`, ссылка из `Seo.svelte`. Относительные пути
|
||||||
|
(`/og/crop-png.png`) работают без домена; при деплое на Vercel с
|
||||||
|
собственным доменом OG-картинки будут корректными.
|
||||||
- [ ] **[S1f]** Download-кнопка с селектором формата PNG/JPG/WebP/BMP (+quality
|
- [ ] **[S1f]** Download-кнопка с селектором формата PNG/JPG/WebP/BMP (+quality
|
||||||
для lossy) для всех инструментов — механика `ToolEntry.output` уже есть
|
для lossy) для всех инструментов — механика `ToolEntry.output` уже есть
|
||||||
(backlog №7, райз «выбор формата/качества»). Продуктовая основа «image
|
(backlog №7, райз «выбор формата/качества»). Продуктовая основа «image
|
||||||
@@ -159,8 +156,27 @@
|
|||||||
png. Существующие страницы не трогать: `jpg-to-png`, `png-to-jpg`,
|
png. Существующие страницы не трогать: `jpg-to-png`, `png-to-jpg`,
|
||||||
`png-to-webp`, `png-to-bmp` остаются самостоятельными лендингами со своим
|
`png-to-webp`, `png-to-bmp` остаются самостоятельными лендингами со своим
|
||||||
контентом (§5).
|
контентом (§5).
|
||||||
- Гейты: build зелёный; в `build/` лежит корректный `sitemap.xml` со всеми
|
|
||||||
инструментами; canonical/OG присутствуют на всех страницах; e2e зелёные.
|
#### S1-domain: с доменом (после покупки + DNS на Vercel)
|
||||||
|
|
||||||
|
- [ ] **[S1a]** Снять `noindex, no_follow` со страницы инструмента
|
||||||
|
(`tools/[id]/+page.svelte`) — делается одновременно с S1d (canonical)
|
||||||
|
чтобы Google сразу проиндексировал с правильным доменом.
|
||||||
|
- [ ] **[S1b]** Скрипт `web/scripts/gen-sitemap.mjs`: генерирует `sitemap.xml` в
|
||||||
|
`build/` из `TOOLS` реестра (`registry-new`) + статических страниц. Вызов
|
||||||
|
из `pnpm build` после `vite build` (adapter-static пишет в `build/`,
|
||||||
|
дописываем файл там же). Origin — из env (`PUBLIC_SITE_ORIGIN`), учёт
|
||||||
|
опционального `BASE_PATH`.
|
||||||
|
- [ ] **[S1c]** `robots.txt`: `Sitemap:` + закрыть служебные маршруты
|
||||||
|
(`/kit` до C19; после — вернуть минимальный allow-all).
|
||||||
|
- [ ] **[S1d]** Компонент `Seo.svelte` (kit): canonical (абсолютный URL по
|
||||||
|
актуальному маршруту), OG-теги (title/description/type/url/image),
|
||||||
|
twitter:card. Подключить в root-layout. **Требует `PUBLIC_SITE_ORIGIN`**
|
||||||
|
для абсолютных URL в canonical и OG:url.
|
||||||
|
|
||||||
|
> **Порядок S1:** S1e/S1f/S1g → покупка домена → S1a+S1b+S1c+S1d.
|
||||||
|
> Гейты: build зелёный; в `build/` лежит корректный `sitemap.xml` со всеми
|
||||||
|
> инструментами; canonical/OG присутствуют на всех страницах; e2e зелёные.
|
||||||
|
|
||||||
### S2. Контентный слой (параллельно C18–C19, волнами по категориям)
|
### S2. Контентный слой (параллельно C18–C19, волнами по категориям)
|
||||||
|
|
||||||
@@ -297,7 +313,7 @@ with PNG, JPG, WebP» в тексте + селектор формата в Downl
|
|||||||
интенты, которые подтверждены вордстатом, и сразу с контентом S2 (страница без
|
интенты, которые подтверждены вордстатом, и сразу с контентом S2 (страница без
|
||||||
текста — потраченный URL).
|
текста — потраченный URL).
|
||||||
|
|
||||||
## 6. Переименование бренда и домен (сделать до S1, дёшево сейчас)
|
## 6. Переименование бренда и домен (сделать до S1-domain, дёшево сейчас)
|
||||||
|
|
||||||
Новое имя и конкретный домен **не записаны в этом репозитории** — детальный
|
Новое имя и конкретный домен **не записаны в этом репозитории** — детальный
|
||||||
чек-лист в `docs/plan-domain.local.md` (исключён из git через `.gitignore`),
|
чек-лист в `docs/plan-domain.local.md` (исключён из git через `.gitignore`),
|
||||||
@@ -311,10 +327,12 @@ with PNG, JPG, WebP» в тексте + селектор формата в Downl
|
|||||||
ключи localStorage (`easy-png-tools:*` — или мигрировать отдельной
|
ключи localStorage (`easy-png-tools:*` — или мигрировать отдельной
|
||||||
мелочью), историю docs/archive.
|
мелочью), историю docs/archive.
|
||||||
- [ ] **[R2]** Купить выбранный домен (кандидаты и пробы — в локальном плане) и
|
- [ ] **[R2]** Купить выбранный домен (кандидаты и пробы — в локальном плане) и
|
||||||
настроить деплой без `BASE_PATH` (§0). Домен нужен до S1: canonical и
|
настроить деплой на Vercel без `BASE_PATH` (§0). Домен нужен до S1-domain:
|
||||||
sitemap генерятся от `PUBLIC_SITE_ORIGIN`.
|
canonical и sitemap генерятся от `PUBLIC_SITE_ORIGIN`.
|
||||||
- Порядок: R1+R2 в любой момент до C17; после индексации переименование =
|
- **Порядок:** R1+R2 можно делать параллельно с C17/C18/C19 (не блокируют).
|
||||||
переезд с 301, потеря позиций и ссылок — не делать.
|
R2 (домен) — блокер только для S1-domain (canonical + sitemap + снятие
|
||||||
|
`noindex`). После индексации переименование = переезд с 301, потеря позиций
|
||||||
|
и ссылок — не делать. Поэтому R1/R2 — до S1-domain, но не обязательно до C17.
|
||||||
|
|
||||||
## 7. Что осознанно НЕ делаем
|
## 7. Что осознанно НЕ делаем
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -3,7 +3,9 @@
|
|||||||
> **Статус:** Фаза 1 (полноценный TS-сайт) в основном выполнена —
|
> **Статус:** Фаза 1 (полноценный TS-сайт) в основном выполнена —
|
||||||
> сайт живёт, каталог переведён в типизированный `registry-new` (121/125), идёт
|
> сайт живёт, каталог переведён в типизированный `registry-new` (121/125), идёт
|
||||||
> редизайн на `preview/*` по `plan-redesign.md` (параллельная ветка, старый UI
|
> редизайн на `preview/*` по `plan-redesign.md` (параллельная ветка, старый UI
|
||||||
> на `(old)/`). Tech debt закрыт. Фазы 2–8 — будущие. Фазы 9–10
|
> на `(old)/`). Tech debt закрыт. Переезд старых файлов в `old/` выполнен.
|
||||||
|
> Следующий этап: C17 (перенос preview → корневые маршруты). Домен НЕ блокер
|
||||||
|
> C17, нужен для SEO (`plan-seo.md`, S1-domain). Фазы 2–8 — будущие. Фазы 9–10
|
||||||
> спланированы в `docs/plan-platform.md`.
|
> спланированы в `docs/plan-platform.md`.
|
||||||
|
|
||||||
## 0. Решения
|
## 0. Решения
|
||||||
|
|||||||
Reference in New Issue
Block a user