--- phase: 02-ssr-shell plan: 02 type: execute wave: 2 depends_on: [02-01] files_modified: - app/components/layout/AppHeader.vue - app/components/layout/AppFooter.vue - app/layouts/default.vue - app/app.vue autonomous: true requirements: [COMP-05, COMP-06, I18N-03, THEME-01] must_haves: truths: - "Header is sticky with logo left, nav center-right, toggles far right" - "Language toggle switches FR/EN and persists via cookie" - "Theme toggle switches dark/light and persists via cookie" - "Mobile hamburger opens UDrawer with nav links and toggles" - "Footer shows copyright and social icon links" - "Default layout wraps all pages with header + slot + footer" artifacts: - path: "app/components/layout/AppHeader.vue" provides: "Sticky header with nav, lang toggle, theme toggle, mobile drawer" min_lines: 80 - path: "app/components/layout/AppFooter.vue" provides: "Minimal footer with copyright and social icons" min_lines: 20 - path: "app/layouts/default.vue" provides: "Default Nuxt layout: header + slot + footer" contains: "AppHeader" key_links: - from: "app/components/layout/AppHeader.vue" to: "@nuxtjs/i18n" via: "setLocale() for language switching" pattern: "setLocale" - from: "app/components/layout/AppHeader.vue" to: "@nuxtjs/color-mode" via: "useColorMode() for theme toggle" pattern: "useColorMode" - from: "app/layouts/default.vue" to: "app/components/layout/AppHeader.vue" via: "component import" pattern: "AppHeader" --- Build the header (with desktop nav, mobile drawer, language/theme toggles), footer, and default layout. Purpose: Provide the visible SSR shell that wraps all pages — navigation, toggles, and footer are functional. Output: AppHeader.vue, AppFooter.vue, default.vue layout, updated app.vue. @~/.claude/get-shit-done/workflows/execute-plan.md @~/.claude/get-shit-done/templates/summary.md @.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/02-ssr-shell/02-CONTEXT.md @.planning/phases/02-ssr-shell/02-RESEARCH.md @.planning/phases/02-ssr-shell/02-UI-SPEC.md @.planning/phases/02-ssr-shell/02-01-SUMMARY.md Task 1: AppHeader with nav, language toggle, theme toggle, mobile drawer app/components/layout/AppHeader.vue - src/components/layout/AppHeader.vue (old header — migration reference for structure and nav links) - .planning/phases/02-ssr-shell/02-UI-SPEC.md (Component Inventory: AppHeader, LanguageToggle, ThemeToggle, MobileDrawer specs; Interaction States table; Copywriting Contract for aria-labels) - .planning/phases/02-ssr-shell/02-RESEARCH.md (Pattern 2: Language Switcher with useSetLocale; Pattern 1: ThemeToggle with useColorMode) - app/locales/fr.json (verify nav.* and a11y.* keys exist from Plan 01) - src/config/site.ts (check logo image path — public/images/logo.webp) Create `app/components/layout/AppHeader.vue` as a single-file component containing: **Structure (per D-01, D-03):** - `
` with `class="sticky top-0 z-[1020] bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800"` - Inner wrapper: `
` **Left — Logo:** - `` - Contains `` + `Killian` **Center-Right — Desktop nav (hidden md:flex):** - Use `