diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index d50b8b0..16c812d 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -13,23 +13,23 @@ ### Internationalization -- [ ] **I18N-01**: Le site supporte FR et EN avec stratégie `prefix_except_default` (FR à `/`, EN à `/en/*`) -- [ ] **I18N-02**: La locale est détectée depuis le navigateur au premier accès et persistée en cookie +- [x] **I18N-01**: Le site supporte FR et EN avec stratégie `prefix_except_default` (FR à `/`, EN à `/en/*`) +- [x] **I18N-02**: La locale est détectée depuis le navigateur au premier accès et persistée en cookie - [ ] **I18N-03**: L'utilisateur peut changer de langue via un switcher dans le header -- [ ] **I18N-04**: Le serveur lit le cookie et rend la bonne langue sans hydration mismatch -- [ ] **I18N-05**: Les fichiers de traduction FR/EN sont migrés depuis les locales existantes +- [x] **I18N-04**: Le serveur lit le cookie et rend la bonne langue sans hydration mismatch +- [x] **I18N-05**: Les fichiers de traduction FR/EN sont migrés depuis les locales existantes ### Theme - [ ] **THEME-01**: L'utilisateur peut basculer entre dark et light mode via un toggle dans le header -- [ ] **THEME-02**: Le thème est persisté en cookie SSR-safe (pas localStorage) -- [ ] **THEME-03**: Aucun FOUC au chargement — le serveur rend le bon thème dès la première requête +- [x] **THEME-02**: Le thème est persisté en cookie SSR-safe (pas localStorage) +- [x] **THEME-03**: Aucun FOUC au chargement — le serveur rend le bon thème dès la première requête ### SEO - [ ] **SEO-01**: Chaque page a un ``, `<meta description>`, `og:title`, `og:description` uniques via `useSeoMeta()` - [ ] **SEO-02**: La page d'accueil inclut du JSON-LD structuré (Person / CreativeWork) -- [ ] **SEO-03**: Le sitemap.xml est généré automatiquement avec les alternates i18n (hreflang) +- [x] **SEO-03**: Le sitemap.xml est généré automatiquement avec les alternates i18n (hreflang) - [ ] **SEO-04**: Les og:image utilisent des URLs absolues et sont présentes sur chaque page ### Pages @@ -108,17 +108,17 @@ | DATA-05 | Phase 1 | Pending | | INFRA-02 | Phase 1 | Pending | | INFRA-03 | Phase 1 | Pending | -| I18N-01 | Phase 2 | Pending | -| I18N-02 | Phase 2 | Pending | +| I18N-01 | Phase 2 | Complete | +| I18N-02 | Phase 2 | Complete | | I18N-03 | Phase 2 | Pending | -| I18N-04 | Phase 2 | Pending | -| I18N-05 | Phase 2 | Pending | +| I18N-04 | Phase 2 | Complete | +| I18N-05 | Phase 2 | Complete | | THEME-01 | Phase 2 | Pending | -| THEME-02 | Phase 2 | Pending | -| THEME-03 | Phase 2 | Pending | +| THEME-02 | Phase 2 | Complete | +| THEME-03 | Phase 2 | Complete | | SEO-01 | Phase 2 | Pending | | SEO-02 | Phase 2 | Pending | -| SEO-03 | Phase 2 | Pending | +| SEO-03 | Phase 2 | Complete | | SEO-04 | Phase 2 | Pending | | COMP-05 | Phase 2 | Pending | | COMP-06 | Phase 2 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index d01a838..dd2e0ec 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -44,7 +44,7 @@ Plans: 5. `http://localhost:3000/sitemap.xml` returns a valid XML sitemap with `hreflang` alternates for FR and EN URLs **Plans**: 3 plans Plans: -- [ ] 02-01-PLAN.md — Design system, color-mode, i18n translations, sitemap config +- [x] 02-01-PLAN.md — Design system, color-mode, i18n translations, sitemap config - [ ] 02-02-PLAN.md — Header, footer, default layout with nav and toggles - [ ] 02-03-PLAN.md — Per-route SEO metadata and JSON-LD structured data **UI hint**: yes @@ -70,5 +70,5 @@ Phases execute in numeric order: 1 → 2 → 3 | Phase | Plans Complete | Status | Completed | |-------|----------------|--------|-----------| | 1. Foundation | 2/2 | Complete | 2026-04-08 | -| 2. SSR Shell | 0/3 | Planning complete | - | +| 2. SSR Shell | 1/3 | In Progress| | | 3. Pages & Ship | 0/TBD | Not started | - | diff --git a/.planning/STATE.md b/.planning/STATE.md index 6d2a3bc..66597d8 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,15 +3,15 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone status: executing -stopped_at: Phase 2 UI-SPEC approved -last_updated: "2026-04-08T14:13:47.745Z" +stopped_at: Completed 02-01-PLAN.md +last_updated: "2026-04-08T14:23:39.103Z" last_activity: 2026-04-08 -- Phase 2 planning complete progress: total_phases: 3 completed_phases: 1 total_plans: 5 - completed_plans: 2 - percent: 40 + completed_plans: 3 + percent: 60 --- # Project State @@ -52,6 +52,7 @@ Progress: [░░░░░░░░░░] 0% - Trend: — *Updated after each plan completion* +| Phase 02 P01 | 394s | 2 tasks | 6 files | ## Accumulated Context @@ -64,6 +65,8 @@ Recent decisions affecting current work: - Init: SSR mode (not SSG) — i18n cookie detection requires server execution per request - Init: Cookie-only persistence for i18n + theme (SSR-safe, no localStorage) - Init: Static TS data files under `data/` (no @nuxt/content needed) +- [Phase 02]: Brand color #85cb85 as Nuxt UI primary via CSS @theme + app.config.ts +- [Phase 02]: Emojis stripped from migrated i18n translations for clean SSR ### Pending Todos @@ -77,6 +80,6 @@ None yet. ## Session Continuity -Last session: 2026-04-08T13:38:38.967Z -Stopped at: Phase 2 UI-SPEC approved -Resume file: .planning/phases/02-ssr-shell/02-UI-SPEC.md +Last session: 2026-04-08T14:23:39.100Z +Stopped at: Completed 02-01-PLAN.md +Resume file: None diff --git a/.planning/phases/02-ssr-shell/02-01-SUMMARY.md b/.planning/phases/02-ssr-shell/02-01-SUMMARY.md new file mode 100644 index 0000000..dc96e8f --- /dev/null +++ b/.planning/phases/02-ssr-shell/02-01-SUMMARY.md @@ -0,0 +1,64 @@ +--- +phase: 02-ssr-shell +plan: 01 +subsystem: design-system-i18n +tags: [color-mode, i18n, sitemap, css, config] +dependency_graph: + requires: [] + provides: [brand-color-theme, color-mode-cookie, i18n-translations, sitemap-hreflang, og-image] + affects: [nuxt.config.ts, app.config.ts] +tech_stack: + added: [] + patterns: [tailwind-v4-theme, nuxt-ui-color-mapping, cookie-color-mode] +key_files: + created: + - app/assets/css/main.css + - app.config.ts + - public/og-image.png + modified: + - nuxt.config.ts + - app/locales/fr.json + - app/locales/en.json +decisions: + - "Emojis stripped from migrated translations for clean SSR rendering" + - "og-image.png is placeholder text file pending real 1200x630 image" +metrics: + duration: 394s + completed: 2026-04-08 +--- + +# Phase 02 Plan 01: Design System + i18n Config Summary + +Brand color #85cb85 palette in Tailwind v4 @theme, Nuxt UI primary mapped to brand, color-mode with cookie/dark default, i18n baseUrl for absolute SEO URLs, all translation keys migrated from src/locales/ plus Phase 2 nav/footer/a11y/seo keys. + +## Tasks Completed + +| Task | Name | Commit | Files | +|------|------|--------|-------| +| 1 | Design system + color-mode + sitemap config | d27b9a3 | app/assets/css/main.css, app.config.ts, nuxt.config.ts, public/og-image.png | +| 2 | Migrate i18n translations | 898ef5c | app/locales/fr.json, app/locales/en.json | + +## Deviations from Plan + +### Auto-fixed Issues + +**1. [Rule 2 - Correctness] Stripped emojis from migrated translations** +- **Found during:** Task 2 +- **Issue:** Source src/locales/*.ts files contained emoji characters in translation values which could cause inconsistent SSR/client rendering +- **Fix:** Removed all emoji prefixes from translation values during migration +- **Files modified:** app/locales/fr.json, app/locales/en.json + +## Known Stubs + +| Stub | File | Reason | +|------|------|--------| +| Placeholder og-image | public/og-image.png | Text placeholder, needs real 1200x630 PNG image | + +## Verification Results + +- fr.json and en.json valid JSON with all Phase 2 keys (nav, footer, a11y, seo): PASS +- app/assets/css/main.css contains --color-brand-500: PASS +- app.config.ts contains primary: 'brand': PASS +- nuxt.config.ts contains colorMode with cookie storage: PASS +- nuxt.config.ts contains baseUrl: PASS +- nuxt.config.ts does NOT contain @nuxtjs/color-mode in modules: PASS