--- phase: 03-pages-ship plan: 03 type: execute wave: 2 depends_on: ["03-01"] files_modified: - app/pages/about.vue - app/pages/contact.vue - app/pages/fiverr.vue - app/error.vue autonomous: true requirements: - PAGE-04 - PAGE-05 - PAGE-06 - PAGE-08 must_haves: truths: - "About page affiche bio + tech stack badges par categorie" - "Contact page affiche formulaire 3 champs + infos contact + reseaux sociaux" - "Fiverr page affiche hero + service cards + FAQ accordion + CTA" - "404 page affiche code erreur + message + bouton retour accueil" artifacts: - path: "app/pages/about.vue" provides: "Page about avec bio et tech stack" - path: "app/pages/contact.vue" provides: "Page contact avec formulaire" - path: "app/pages/fiverr.vue" provides: "Page fiverr avec services" - path: "app/error.vue" provides: "Page 404 custom" key_links: - from: "app/pages/contact.vue" to: "app/components/ContactForm.vue" via: "auto-import" pattern: "ContactForm" - from: "app/pages/fiverr.vue" to: "app/components/sections/FAQSection.vue" via: "auto-import" pattern: "FAQSection" --- Construire les 4 pages restantes : About, Contact, Fiverr, et error.vue (404). Ces pages consomment les composants partages du Plan 01. Purpose: Complete le portfolio avec toutes les pages necessaires — About pour la credibilite, Contact pour la conversion, Fiverr pour les services, 404 pour l'UX. Output: 4 pages fonctionnelles. @C:\Users\minit\.claude\get-shit-done\workflows\execute-plan.md @C:\Users\minit\.claude\get-shit-done\templates\summary.md @.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/03-pages-ship/03-CONTEXT.md @.planning/phases/03-pages-ship/03-RESEARCH.md @.planning/phases/03-pages-ship/03-01-SUMMARY.md @src/views/AboutPage.vue @src/views/ContactPage.vue @src/views/FiverrPage.vue @app/data/techstack.ts @app/data/faq.ts @src/config/site.ts Composants disponibles (auto-importes, crees en Plan 01): - ContactForm — pas de props (formulaire autonome avec Zod + useToast) - FAQSection — props: faqs (FAQ[]), title, subtitle - TechBadge — props: tech (Technology | string), showLevel?, showImage? From app/data/site.ts (cree en Plan 01): ```typescript export const siteConfig: SiteConfig // siteConfig.contact: { email, phone, location } // siteConfig.social: SocialLink[] // siteConfig.fiverr: { profileUrl, services: FiverrService[] } ``` From app/data/techstack.ts: ```typescript export const techStack: TechStack // .programming, .front, .database, .devtools, .operating_systems, .socials ``` From app/data/faq.ts: ```typescript export const homeFAQs: FAQ[] ``` Task 1: Pages About + Contact app/pages/about.vue, app/pages/contact.vue **about.vue** (per D-16, D-17, PAGE-04) : Migrer depuis src/views/AboutPage.vue. 1. Section hero : titre `t('about.title')`, sous-titre, intro content (2 paragraphes bio) 2. Section Skills : 4 categories tech (programming, front, database, devtools) en grille 2x2 avec `UCard`. Chaque card : icone, titre categorie, grille `TechBadge` avec `showLevel`. Section OS separee en bas. 3. Section Approach : 4 cards (performance, architecture, quality, collaboration) avec `UCard`, icones lucide. 4. Section CTA : titre + 2 boutons (Contact, Projets) via `UButton`. 5. `useSeoMeta()` avec titre/description about. **contact.vue** (per D-08, D-10, D-16, PAGE-05) : Migrer depuis src/views/ContactPage.vue. 1. Section hero : titre `t('contact.title')`, sous-titre, stats (24-48h response, 100% satisfaction, Remote) 2. Layout 2 colonnes : - Colonne gauche : `` (auto-importe du Plan 01, gere tout seul — Zod, $fetch, UToast) - Colonne droite : Infos contact (`UCard` avec email cliquable, telephone, localisation depuis `siteConfig.contact`) + Reseaux sociaux (`UCard` avec liens `siteConfig.social` — icones pour Gitea/LinkedIn/Discord) 3. Section FAQ en bas : 3 cards info (temps reponse, types projets, collaboration) avec `UCard`. 4. `useSeoMeta()` specifique contact. Importer `siteConfig` depuis `~/data/site`. cd C:/Users/minit/Desktop/portfolio/portfolio && grep -q "TechBadge" app/pages/about.vue && grep -q "techStack" app/pages/about.vue && grep -q "ContactForm" app/pages/contact.vue && grep -q "siteConfig" app/pages/contact.vue && echo "PASS" About page avec bio + 5 categories tech stack badges, Contact page avec ContactForm + infos contact + reseaux sociaux Task 2: Page Fiverr avec hero + services + FAQ accordion + CTA app/pages/fiverr.vue Migrer depuis src/views/FiverrPage.vue (per D-18, PAGE-06). 1. **Script setup** : Importer `siteConfig` depuis `~/data/site`. Computed `services` = `siteConfig.fiverr.services`. Computed `heroStats` avec nombre services dispo + rating "5 etoiles". 2. **Section Hero** : titre `t('fiverr.title')`, sous-titre, stats (services count, rating), bouton CTA `UButton` vers `siteConfig.fiverr.profileUrl` (external link, target blank). 3. **Section Services** : grille de service cards. Pour chaque service dans `siteConfig.fiverr.services`, utiliser `UCard` avec : - Image service via `NuxtImg :src="service.image"` - Badge prix : `t('fiverr.pricing.startingAt') + ' ' + service.price` - Badge statut : "Disponible" (vert) si url !== '#', "Bientot" (jaune) sinon - Titre et description via `t('fiverr.serviceData.${service.id}.title/description')` - Features liste via i18n (recuperer du fichier de traduction comme dans src/views/FiverrPage.vue) - Bouton commander / en savoir plus 4. **Section FAQ** (per D-18) : Utiliser `` du Plan 01 avec les FAQs fiverr. Creer un array computed de FAQ fiverr depuis les cles i18n `fiverr.faq.*` si elles existent, sinon reutiliser `homeFAQs`. 5. **Section CTA finale** : titre `t('fiverr.cta.title')`, sous-titre, bouton vers profil Fiverr. 6. `useSeoMeta()` specifique fiverr. cd C:/Users/minit/Desktop/portfolio/portfolio && grep -q "siteConfig" app/pages/fiverr.vue && grep -q "fiverr" app/pages/fiverr.vue && grep -q "FAQSection\|UAccordion" app/pages/fiverr.vue && echo "PASS" Page Fiverr avec hero stats, service cards, FAQ accordion UAccordion, CTA vers profil Fiverr Task 3: Page 404 (error.vue) app/error.vue Creer `app/error.vue` (per D-20, PAGE-08). IMPORTANT : dans `app/`, PAS dans `app/pages/` (per RESEARCH.md Pitfall 6). Implementation exacte du RESEARCH.md Pattern 5 : ```vue ``` Ajouter les cles i18n manquantes si necessaire : `error.notFound` ("Page introuvable"), `error.generic` ("Une erreur est survenue"), `error.backHome` ("Retour a l'accueil") dans les fichiers de traduction FR/EN. Si les cles n'existent pas encore, les ajouter dans `i18n/locales/fr.json` et `i18n/locales/en.json`. cd C:/Users/minit/Desktop/portfolio/portfolio && test -f app/error.vue && grep -q "clearError" app/error.vue && grep -q "statusCode" app/error.vue && echo "PASS" error.vue dans app/ avec affichage code erreur, message i18n, bouton retour accueil via clearError ## Trust Boundaries | Boundary | Description | |----------|-------------| | Aucune nouvelle | Les pages About/Fiverr/404 ne traitent pas de donnees utilisateur. Contact est gere par ContactForm du Plan 01. | ## STRIDE Threat Register | Threat ID | Category | Component | Disposition | Mitigation Plan | |-----------|----------|-----------|-------------|-----------------| | T-03-06 | Information Disclosure | contact.vue | accept | email/telephone affiches publiquement — voulu par le proprietaire du site | - `npx nuxi dev` puis naviguer vers `/about` — bio + 5 categories tech visible - `/contact` — formulaire 3 champs fonctionnel + infos contact visibles - `/fiverr` — 4 services, FAQ accordion, boutons CTA - `/une-page-inexistante` — page 404 custom avec bouton retour - `curl http://localhost:3000/about` — HTML complet avec meta tags - About affiche bio + tech stack par categorie avec TechBadge (per D-17) - Contact affiche ContactForm (3 champs) + infos contact + reseaux (per D-08) - Fiverr affiche hero + services + FAQ accordion + CTA (per D-18) - error.vue dans app/ (pas pages/), affiche 404, bouton clearError (per D-20) - Toutes les pages ont useSeoMeta() After completion, create `.planning/phases/03-pages-ship/03-03-SUMMARY.md`