diff --git a/docs/plan-c17.md b/docs/plan-c17.md new file mode 100644 index 0000000..3a0308f --- /dev/null +++ b/docs/plan-c17.md @@ -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. diff --git a/docs/plan-redesign.md b/docs/plan-redesign.md index a04b621..42a04ba 100644 --- a/docs/plan-redesign.md +++ b/docs/plan-redesign.md @@ -3,8 +3,10 @@ > Статус: план к выполнению. Шаги 5–6 (C17–C21) остаются **следующим этапом**. > Они больше не привязаны к «верности против рефа»: > `docs/archive/plan-design-fix.md` закрыт, аудит против рефа прекращён. -> Tech debt закрыт (`docs/archive/plan-tech-debt.md`). Перед C17: backlog №14 -> (переезд старых файлов в `old/`) и покупка домена (`plan-domain.local.md`). +> Tech debt закрыт (`docs/archive/plan-tech-debt.md`). Backlog №14 (переезд +> старых файлов в `old/`) — **выполнено**. Покупка домена НЕ блокер C17: +> домен нужен для S1 (`plan-seo.md`) — canonical, sitemap, снятие `noindex`. +> C17 можно запускать без домена (см. §10). > > Источники: `refs/` — Next/React-референс (правда по пикселям и интерактиву), > `refs-html/` — статические HTML-снимки для быстрого просмотра в браузере. @@ -358,18 +360,23 @@ src/routes/preview/tools/[id]/+page.svelte ### Шаг 5. Сделать новый дизайн основным — СЛЕДУЮЩИЙ ЭТАП -> Tech debt закрыт. Перед стартом C17: покупка домена (`plan-domain.local.md`). -> Переезд старых файлов в `lib/old/` (backlog №14) — **выполнено**. +> Tech debt закрыт. Backlog №14 (переезд старых файлов в `lib/old/`) — **выполнено**. +> Покупка домена — НЕ блокер C17. C17 переносит маршруты и делает новый дизайн +> основным; `noindex` остаётся до покупки домена и запуска S1 (`plan-seo.md`). +> Детальный план см. в `docs/plan-c17.md` (старый `(old)/` → `/v1/`, удаление +> отложено до C19). - [ ] **[C17]** Перенести `preview/*` → реальные маршруты (move), удалить `(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/**` на `src/routes/**` (после переезда все маршруты — новый дизайн), компонентный - glob `src/lib/components/kit/**` пока оставить. **И снять - `noindex, nofollow`** со страницы инструмента - (`preview/tools/[id]/+page.svelte`) — страницы становятся боевыми - лендингами ровно в момент переезда (SEO: `plan-seo.md`, S1a). + glob `src/lib/components/kit/**` пока оставить. - [ ] **[C18]** Правки импортов/редиректов после переноса, проверка билда. ### Шаг 6. Удаление старого @@ -401,9 +408,10 @@ src/routes/preview/tools/[id]/+page.svelte > существовать в том же коммите. > - Коммиты **C3→C16 не трогают старый сайт** `(old)/` — они только добавляют > новые файлы/маршруты, сломать старый сайт на них нельзя. -> - **C17 — единственный атомарный переключатель**: перенос `preview/*` на -> реальные пути + удаление `(old)/` + смена root-layout должны быть в ОДНОМ -> коммите (иначе конфликт маршрутов или пропажа страниц). Не дробить. +> - **C17 — атомарный переключатель**: перенос `preview/*` на реальные пути + +> удаление `(old)/` + смена root-layout — в ОДНОМ коммите. Снятие `noindex` +> также в C17, **если домен уже куплен**; иначе — отложить на S1. Не дробить +> сам C17. > - **C19 должен идти строго после C17** (старый `app.css`/`ui/` удаляем только > когда old-сайт уже выключен). > - Очерёдность зависимостей: `design2.css` (C3) и kit-компоненты (C5–C7) должны diff --git a/docs/plan-seo.md b/docs/plan-seo.md index 986aaab..2b8bb5a 100644 --- a/docs/plan-seo.md +++ b/docs/plan-seo.md @@ -1,8 +1,11 @@ # План: SEO + GEO — индексация и конкуренция в image tools -> **Статус (2026-09-09):** план к выполнению. Старт — после C17 +> **Статус (2026-09-10):** план к выполнению. Старт — после C17 > (`plan-redesign.md`): до переезда `preview/*` на реальные маршруты страницы > инструментов в `noindex`, применять техминимум некуда. +> **Уточнено:** домен НЕ блокер C17 (см. §6). Задачи S1 разбиты на +> domain-free (можно делать параллельно с покупкой домена) и domain-required +> (после покупки и настройки домена на Vercel). > > **Цель:** каждая страница инструмента — индексируемый лендинг под конкретный > интент («crop png», «make png transparent», «jpg to png»…), конкуренция с @@ -133,22 +136,16 @@ ### S1. Технический минимум (сразу после C17) -- [ ] **[S1a]** Снять `noindex, nofollow` со страницы инструмента - (`preview/tools/[id]/+page.svelte`) — встроено в C17 как атомарный шаг - (см. `plan-redesign.md`). -- [ ] **[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:` + закрыть служебные маршруты - (`/preview/kit` до C17; после — вернуть минимальный allow-all). -- [ ] **[S1d]** Компонент `Seo.svelte` (kit): canonical (абсолютный URL по - актуальному маршруту), OG-теги (title/description/type/url/image), - twitter:card. Подключить в root-layout. +Разбито на две группы: **domain-free** (делаем параллельно с покупкой домена) +и **domain-required** (после покупки и DNS-настройки). + +#### S1-free: без домена (параллельно с C18–C19) + - [ ] **[S1e]** OG-картинки per-tool: генерация 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 для lossy) для всех инструментов — механика `ToolEntry.output` уже есть (backlog №7, райз «выбор формата/качества»). Продуктовая основа «image @@ -159,8 +156,27 @@ png. Существующие страницы не трогать: `jpg-to-png`, `png-to-jpg`, `png-to-webp`, `png-to-bmp` остаются самостоятельными лендингами со своим контентом (§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, волнами по категориям) @@ -297,7 +313,7 @@ with PNG, JPG, WebP» в тексте + селектор формата в Downl интенты, которые подтверждены вордстатом, и сразу с контентом S2 (страница без текста — потраченный URL). -## 6. Переименование бренда и домен (сделать до S1, дёшево сейчас) +## 6. Переименование бренда и домен (сделать до S1-domain, дёшево сейчас) Новое имя и конкретный домен **не записаны в этом репозитории** — детальный чек-лист в `docs/plan-domain.local.md` (исключён из git через `.gitignore`), @@ -311,10 +327,12 @@ with PNG, JPG, WebP» в тексте + селектор формата в Downl ключи localStorage (`easy-png-tools:*` — или мигрировать отдельной мелочью), историю docs/archive. - [ ] **[R2]** Купить выбранный домен (кандидаты и пробы — в локальном плане) и - настроить деплой без `BASE_PATH` (§0). Домен нужен до S1: canonical и - sitemap генерятся от `PUBLIC_SITE_ORIGIN`. -- Порядок: R1+R2 в любой момент до C17; после индексации переименование = - переезд с 301, потеря позиций и ссылок — не делать. + настроить деплой на Vercel без `BASE_PATH` (§0). Домен нужен до S1-domain: + canonical и sitemap генерятся от `PUBLIC_SITE_ORIGIN`. +- **Порядок:** R1+R2 можно делать параллельно с C17/C18/C19 (не блокируют). + R2 (домен) — блокер только для S1-domain (canonical + sitemap + снятие + `noindex`). После индексации переименование = переезд с 301, потеря позиций + и ссылок — не делать. Поэтому R1/R2 — до S1-domain, но не обязательно до C17. ## 7. Что осознанно НЕ делаем diff --git a/docs/roadmap.md b/docs/roadmap.md index 929190d..850a6dd 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -3,7 +3,9 @@ > **Статус:** Фаза 1 (полноценный TS-сайт) в основном выполнена — > сайт живёт, каталог переведён в типизированный `registry-new` (121/125), идёт > редизайн на `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`. ## 0. Решения