Setup complet de l'infrastructure projet : - Frontend Nuxt 4 (SSR, TypeScript, i18n, Pinia, TailwindCSS) - Backend Laravel 12 API-only avec middleware X-API-Key et CORS - Design tokens (sky-dark, sky-accent, sky-text) et polices (Merriweather, Inter) - Documentation planning et implementation artifacts Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
41 KiB
Portfolio Gamifié - Product Requirements Document (PRD)
1. Goals and Background Context
1.1 Goals
- Différenciation : Créer un portfolio qui se démarque par une expérience narrative immersive et gamifiée
- Engagement visiteur : Transformer la visite en aventure avec quĂȘte principale "Trouver le dĂ©veloppeur"
- Respect du temps : Offrir une double entrée (Mode Aventure vs Mode Pressé) pour s'adapter à chaque visiteur
- Rejouabilité : Proposer des chemins multiples (4-8 parcours différents) pour une expérience unique
- Contact optimisé : Transformer le formulaire de contact en récompense narrative plutÎt qu'en corvée
- Démonstration technique : Utiliser des animations avancées et interactions comme preuve de compétences
- International : Support FR + EN dĂšs le lancement
1.2 Background Context
Le portfolio actuel utilise une navigation et présentation classiques. L'analyse des besoins de trois personas (recruteur pressé, client potentiel, développeur pair) révÚle une opportunité de différenciation majeure : un portfolio qui raconte une histoire plutÎt que de lister des informations.
Le concept central retenu est de traiter le portfolio comme une aventure narrative inspirée de Zelda BOTW, avec des PNJ (témoignages sous forme de dialogues), un arbre de compétences RPG, une carte interactive, et des easter eggs. La stack technique validée (Nuxt 3 SSR / Laravel API / MariaDB / TailwindCSS / Konva.js / vis.js) permet de réaliser cette vision avec une architecture moderne offrant SEO optimal, navigation fluide et API maintenable.
1.3 Change Log
| Date | Version | Description | Author |
|---|---|---|---|
| 2026-01-26 | 0.1 | Création initiale basée sur le brainstorming | John (PM) |
| 2026-01-26 | 1.0 | PRD complet avec 4 epics, 37 stories, checklist validée | John (PM) |
| 2026-01-27 | 1.1 | Migration stack frontend vers Vue 3 + Composition API + Pinia | John (PM) |
| 2026-01-27 | 1.2 | Adoption Nuxt 3 pour SSR + navigation SPA fluide | John (PM) |
| 2026-01-27 | 1.3 | Backend API avec Laravel au lieu de PHP natif | John (PM) |
1.4 Out of Scope (MVP)
Les éléments suivants sont explicitement hors du scope MVP :
- Application mobile native (iOS/Android)
- Authentification utilisateur / comptes persistants
- CMS / back-office d'administration du contenu
- Analytics avancées (au-delà de Lighthouse et logs basiques)
- SystĂšme de commentaires ou blog
- Intégration réseaux sociaux (partage, login social)
- Mode multijoueur ou classements
- Notifications push
- PWA complĂšte (service worker, offline mode)
1.5 Success Metrics (MVP)
| Métrique | Objectif | Méthode de mesure |
|---|---|---|
| Taux de complétion parcours aventure | > 60% | LocalStorage progression + logs serveur |
| Temps moyen sur site | > 3 minutes | Analytics basiques ou logs |
| Taux d'accĂšs au contact | > 40% des visiteurs | Logs page contact |
| Score Lighthouse Performance | > 90 | Audit Lighthouse |
| Easter eggs découverts (moyenne) | > 2/visiteur | LocalStorage stats |
2. Requirements
2.1 Functional Requirements
- FR1: Le systÚme offre une double entrée au visiteur : "Partir à l'aventure" (expérience complÚte) ou "Je n'ai pas le temps" (mode express avec roadmap)
- FR2: Les transitions entre pages sont animées de maniÚre seamless via Vue/Nuxt transitions, créant une impression de "changement de zone" immersive
- FR3: Un narrateur-guide accompagne le visiteur avec des textes contextuels tout au long de l'expérience
- FR4: Une carte interactive (Konva.js) permet la navigation non-linéaire et affiche la progression du visiteur
- FR5: Un arbre de compétences interactif (vis.js) visualise les skills avec niveaux évoluant selon les projets
- FR6: Les compétences sont cliquables et mÚnent directement aux projets qui les utilisent
- FR7: Les témoignages s'affichent sous forme de dialogues PNJ style Zelda avec avatar, bulles, effet typewriter et personnalités variées
- FR8: Une barre de progression globale indique l'avancement dans l'exploration du site
- FR9: Le systÚme propose 2-3 choix binaires créant 4-8 parcours narratifs différents, tous menant au contact
- FR10: Un challenge/puzzle accessible doit ĂȘtre rĂ©solu pour accĂ©der au formulaire de contact (avec systĂšme d'indices)
- FR11: Des easter eggs cachés récompensent l'exploration avec des snippets de code ou anecdotes
- FR12: La progression est sauvegardée automatiquement en LocalStorage pour permettre la reprise
- FR13: Le site supporte deux langues (FR par défaut + EN) avec détection par URL (/en/...)
- FR14: Le formulaire de contact est présenté comme la récompense finale "Tu m'as trouvé !" avec célébration
2.2 Non-Functional Requirements
- NFR1: Le bundle JS total (Nuxt + Konva + vis.js) ne doit pas dépasser 170kb gzippé, avec lazy-loading des composants lourds
- NFR2: Le temps de chargement initial (LCP) doit rester sous 2.5 secondes sur connexion 3G
- NFR3: Le site doit ĂȘtre responsive et offrir une expĂ©rience adaptĂ©e mobile (carte simplifiĂ©e)
- NFR4: Le site doit fonctionner sur les navigateurs modernes (Chrome, Firefox, Safari, Edge - 2 derniĂšres versions)
- NFR5: Les URLs doivent ĂȘtre SEO-friendly et le contenu principal accessible aux crawlers
- NFR6: Les animations doivent respecter
prefers-reduced-motionpour l'accessibilité - NFR7: Le systÚme i18n utilise @nuxtjs/i18n avec fichiers JSON, rendu SSR pour SEO optimal
- NFR8: Les images sont optimisées en WebP avec lazy loading
3. User Interface Design Goals
3.1 Overall UX Vision
L'expérience utilisateur vise à transformer un portfolio classique en aventure narrative immersive. Le visiteur ne consulte pas un CV interactif, il part à la découverte d'un développeur. Chaque interaction est pensée pour créer de la surprise, de l'engagement et de la mémorabilité. L'ambiance s'inspire des jeux d'aventure/RPG (notamment Zelda BOTW) tout en restant professionnelle et accessible.
Mots-clés UX : Immersion, Découverte, Surprise, Fluidité, Personnalisation du parcours.
3.2 Key Interaction Paradigms
| Paradigme | Description |
|---|---|
| Navigation narrative | Pas de menu burger classique - la carte interactive et le narrateur guident le visiteur |
| Choix binaires | à plusieurs moments clés, le visiteur choisit son chemin |
| Dialogues interactifs | Clic pour "parler" aux PNJ (témoignages), avec effet typewriter progressif |
| Progression visible | Barre/indicateur montrant l'avancement dans l'exploration globale |
| Récompenses cachées | Easter eggs déclenchés par exploration (clics, hover, scroll, Konami code) |
| Transitions cinématiques | Changements de "zone" animés entre chaque section majeure |
3.3 Core Screens and Views
| Ăcran | Description | RĂŽle narratif |
|---|---|---|
| Landing / Choix initial | Double entrĂ©e : Aventure vs Mode PressĂ© | Point de dĂ©part de la quĂȘte |
| Intro narrative | Présentation du héros mystérieux | Accroche et intrigue |
| Carte interactive | Vue globale des zones Ă explorer, progression visible | Hub de navigation |
| Zone Projets | Galerie de projets avec previews et détails | Preuves concrÚtes |
| Zone Compétences | Arbre de skills interactif avec niveaux | Démonstration technique |
| Zone Parcours/Timeline | Histoire professionnelle narrative | Contexte et crédibilité |
| Zone Témoignages | Dialogues PNJ avec personnalités | Validation sociale |
| Challenge final | Puzzle à résoudre avec systÚme d'indices | Climax de l'aventure |
| Contact / Récompense | "Tu m'as trouvé !" + formulaire + célébration | Conclusion satisfaisante |
| Roadmap (Mode Pressé) | Vue condensée avec accÚs direct aux sections | Alternative rapide |
3.4 Accessibility: WCAG AA
- Respect de
prefers-reduced-motion: animations désactivées ou réduites - Contraste suffisant sur tous les textes narratifs
- Navigation au clavier possible (focus visible, skip links)
- Alternative textuelle pour la carte interactive
- Le mode pressé sert aussi de fallback accessible
3.5 Branding
| ĂlĂ©ment | Direction |
|---|---|
| Ton visuel | Moderne, légÚrement fantaisiste, inspiré RPG mais pas cartoon |
| Palette | Tons sombres avec accents colorés pour les interactions |
| Typographie | Sans-serif moderne pour le corps, display font pour titres narratifs |
| Iconographie | SVG custom ou sprite, style cohérent avec l'univers RPG light |
| Avatars PNJ | Illustrations stylisées pour les témoignages |
3.6 Target Devices and Platforms: Web Responsive
| Device | Expérience |
|---|---|
| Desktop (>1024px) | Expérience complÚte : carte interactive, animations, skill tree complet |
| Tablet (768-1024px) | Expérience adaptée : carte simplifiée, interactions touch |
| Mobile (<768px) | Expérience repensée : navigation linéaire, carte en minimap, skill tree scrollable |
4. Technical Assumptions
4.1 Repository Structure: Nouveau Repo Dédié
Projet standalone en monorepo (Nuxt 3 frontend SSR + API PHP) :
portfolio-gamifie/
âââ frontend/ # Application Nuxt 3
â âââ pages/ # Routes automatiques (fichier-based)
â â âââ index.vue # / (landing double entrĂ©e)
â â âââ aventure.vue # /aventure (intro narrative)
â â âââ roadmap.vue # /roadmap (mode pressĂ©)
â â âââ projets/
â â â âââ index.vue # /projets (galerie)
â â â âââ [slug].vue # /projets/:slug (dĂ©tail)
â â âââ competences.vue # /competences (skill tree)
â â âââ temoignages.vue # /temoignages (dialogues PNJ)
â â âââ parcours.vue # /parcours (timeline)
â â âââ challenge.vue # /challenge (puzzle)
â â âââ contact.vue # /contact (rĂ©compense finale)
â âââ components/ # Auto-importĂ©s
â â âââ DialoguePNJ.vue
â â âââ Narrator.vue
â â âââ ProgressBar.vue
â â âââ InteractiveMap.client.vue # Client-only (Konva)
â â âââ SkillTree.client.vue # Client-only (vis.js)
â âââ composables/ # Auto-importĂ©s
â â âââ useTypewriter.ts
â â âââ useNarrator.ts
â â âââ useEasterEggs.ts
â âââ stores/ # Pinia stores
â â âââ progression.ts
â âââ layouts/
â â âââ default.vue # Layout avec narrateur + progress bar
â â âââ minimal.vue # Layout mode pressĂ©
â âââ i18n/
â â âââ fr.json
â â âââ en.json
â âââ assets/
â âââ public/
â âââ nuxt.config.ts
â âââ tailwind.config.js
â âââ package.json
âââ api/ # Backend Laravel API
â âââ app/
â â âââ Http/
â â â âââ Controllers/Api/
â â â â âââ ProjectController.php
â â â â âââ SkillController.php
â â â â âââ TestimonialController.php
â â â â âââ NarratorController.php
â â â â âââ ContactController.php
â â â âââ Requests/ # Form Request validation
â â â âââ Resources/ # API Resources (transformers)
â â âââ Models/
â â âââ Project.php
â â âââ Skill.php
â â âââ Testimonial.php
â â âââ NarratorText.php
â âââ database/
â â âââ migrations/
â â âââ seeders/
â â âââ factories/
â âââ routes/
â â âââ api.php # Routes API
â âââ config/
â âââ tests/
â âââ .env.example
â âââ composer.json
âââ README.md
4.2 Service Architecture: Nuxt 3 SSR + Laravel API
| Composant | Technologie | Justification |
|---|---|---|
| Frontend SSR | Nuxt 3 | Rendu serveur SEO + hydration SPA |
| Backend API | Laravel 11 | Framework PHP robuste, conventions claires, Eloquent ORM |
| Base de données | MariaDB | Relationnel adapté aux données structurées (skills, projets) |
| ORM | Eloquent | Relations fluides (belongsToMany, hasMany), query builder |
| Routing API | Laravel Router | RESTful, middleware, rate limiting |
| Validation | Form Requests | Validation déclarative, messages localisés |
| Laravel Mail | PHPMailer intégré, templates Blade | |
| Cache | Laravel Cache | Redis ou file driver selon hébergement |
4.3 Frontend Stack
| Librairie | Version | Poids gzip | RĂŽle |
|---|---|---|---|
| Nuxt 3 | 3.x | ~50kb | Meta-framework Vue avec SSR natif |
| Vue 3 | 3.5+ | (inclus) | Framework réactif, Composition API |
| Pinia | 2.x | ~1kb | Gestion d'état (progression, choix, easter eggs) |
| @nuxtjs/i18n | 8.x | ~5kb | Internationalisation avec SSR |
| TailwindCSS | 3.x | ~10kb | Styling, animations CSS |
| Konva.js | 9.x | ~50kb | Carte interactive (chargé cÎté client) |
| vue-konva | 3.x | ~2kb | Binding Vue pour Konva |
| vis-network | 9.x | ~50kb | Arbre de compétences (chargé cÎté client) |
Total estimé : ~160-170kb gzippé (avec lazy-loading des librairies lourdes)
Justification Nuxt 3
- SSR natif : HTML complet pour les crawlers, SEO optimal sans configuration
- Hydration intelligente : Premier rendu serveur, puis navigation SPA fluide
- Routing fichier-based :
pages/projets/[slug].vueâ URL/projets/mon-projetautomatique - Transitions de page :
<NuxtPage>avecpageTransitionconfiguration native - Auto-imports : Composables et composants importés automatiquement
- i18n SSR : URLs localisées (
/en/projects) avec contenu traduit cÎté serveur - Lazy components :
<LazyKonvaMap>charge Konva uniquement quand nécessaire
4.4 Testing Requirements: Unit + Integration
| Type | Scope | Outils |
|---|---|---|
| Unit Tests Laravel | Models, Services, Form Requests | Pest PHP ou PHPUnit |
| Feature Tests Laravel | API endpoints, middleware | Laravel HTTP Tests |
| Unit Tests Nuxt | Composants, composables, stores | Vitest + @nuxt/test-utils |
| E2E Tests | Parcours utilisateur critiques, SSR | Playwright |
| Tests manuels | UX gamification, animations, transitions | Checklist QA |
4.5 Additional Technical Assumptions
- Hébergement :
- Frontend Nuxt : Node.js (Vercel, Netlify, ou serveur Node)
- API Laravel : Serveur PHP 8.2+ avec MariaDB (Laravel Forge, shared hosting, VPS)
- Mode SSR : Nuxt en mode
ssr: true(défaut), rendu serveur + hydration client - Versioning : Git, branches feature, main = production
- Build Frontend : Nitro (bundler Nuxt), optimisations automatiques
- Build API : Composer,
php artisan optimizeen production - Composants client-only : Konva et vis.js avec suffix
.client.vue(pas de SSR) - Images :
<NuxtImg>avec optimisation automatique (nuxt/image) - Ătat global : Pinia avec
persistedStateplugin, compatible SSR - Sécurité Laravel : CORS middleware, Sanctum (si auth future), rate limiting, validation
- Sécurité Nuxt : Headers sécurité via nuxt.config.ts
- SEO :
useHead()etuseSeoMeta()pour meta tags dynamiques SSR - Transitions :
pageTransitiondansnuxt.config.ts+ CSS personnalisé - API Resources : Laravel Resources pour transformer les réponses JSON
5. Epic List
| Epic | Titre | Objectif |
|---|---|---|
| Epic 1 | Setup Projet & Infrastructure i18n | Créer le nouveau repo Nuxt 3, structure projet, schéma BDD MariaDB, systÚme i18n, routing SSR, transitions de page et double entrée (Aventure/Pressé) |
| Epic 2 | Contenu Interactif | ImplĂ©menter les compĂ©tences cliquables â projets, les tĂ©moignages style dialogue PNJ, et la timeline narrative |
| Epic 3 | Gamification & Navigation | Créer la carte interactive (Konva.js), l'arbre de compétences (vis.js), la barre de progression et le narrateur-guide |
| Epic 4 | Expérience ComplÚte & Finalisation | Implémenter les chemins narratifs multiples, le challenge/puzzle final, les easter eggs et la célébration contact |
6. Epic Details
Epic 1 : Setup Projet & Infrastructure i18n
Objectif : Créer le nouveau projet Nuxt 3 from scratch avec une infrastructure solide : structure de fichiers, base de données MariaDB, systÚme d'internationalisation SSR (FR/EN), routing avec transitions de pages seamless, et la premiÚre fonctionnalité utilisateur visible (double entrée Aventure/Pressé).
Story 1.1 : Initialisation du projet
As a développeur, I want une structure de projet moderne initialisée (Nuxt 3 SSR + Laravel API), so that je peux commencer le développement sur des bases solides.
Acceptance Criteria :
- Repository Git initialisé avec
.gitignoreapproprié - Structure monorepo :
/frontend(Nuxt 3) +/api(Laravel) - Frontend :
npx nuxi@latest initavec TypeScript activé - Modules Nuxt installés :
@nuxtjs/i18n,@nuxtjs/tailwindcss,@pinia/nuxt - Backend :
laravel new apioucomposer create-project laravel/laravel api - Laravel configuré en mode API-only (sans Blade views inutiles)
nuxt.config.tsconfiguré avec SSR activé et pageTransition- Fichiers
.env.examplepour frontend et backend - CORS configuré dans Laravel pour autoriser le frontend Nuxt
- README.md avec instructions d'installation et déploiement
Story 1.2 : Configuration base de données Laravel
As a développeur, I want une connexion MariaDB fonctionnelle avec Eloquent et migrations Laravel, so that je peux créer et versionner le schéma de données.
Acceptance Criteria :
- Configuration DB dans
.env(DB_CONNECTION=mysql, DB_HOST, etc.) config/database.phpconfiguré pour MariaDB- Commande
php artisan migratefonctionnelle - Commande
php artisan db:seedpour données initiales - Factories définies pour les tests (
ProjectFactory,SkillFactory, etc.) - Connexion testée avec
php artisan tinker
Story 1.3 : Schéma de données initial (Migrations Laravel)
As a développeur, I want les tables principales créées via migrations Laravel, so that l'application peut stocker projets, compétences et témoignages.
Acceptance Criteria :
- Migration
create_projects_table(id, slug, title, description, image, url, github_url, date_completed, is_featured, timestamps) - Migration
create_skills_table(id, slug, name, icon, category, max_level, timestamps) - Migration
create_project_skill_table(pivot avec level_before, level_after) - Migration
create_testimonials_table(id, name, role, company, avatar, content, personality, project_id, timestamps) - Migration
create_narrator_texts_table(id, context, content, variant, timestamps) - Models Eloquent avec relations :
Project->belongsToMany(Skill),Skill->belongsToMany(Project),Testimonial->belongsTo(Project) - Seeders :
ProjectSeeder,SkillSeeder,TestimonialSeederavec données de test DatabaseSeederappelant tous les seeders dans le bon ordre
Story 1.4 : SystĂšme d'internationalisation (i18n) frontend
As a visiteur, I want voir le site dans ma langue (FR ou EN), so that je comprends le contenu.
Acceptance Criteria :
- Fichiers JSON de traduction (
i18n/fr.json,i18n/en.json) - Composable
useI18n()avect()pour accéder aux traductions - Traductions chargées cÎté serveur (SSR) pour SEO
- Fallback vers FR si clé manquante en EN
- Détection de la langue via URL (
/en/...) avecprefix_except_default - Sélecteur de langue avec
switchLocalePath() - Traductions de base définies (navigation, boutons, messages)
Story 1.5 : Configuration @nuxtjs/i18n et URLs localisées
As a visiteur, I want des URLs propres et localisées, so that je peux naviguer et partager des liens.
Acceptance Criteria :
- Module
@nuxtjs/i18nconfiguré avec stratégieprefix_except_default - URLs FR par défaut :
/,/projets,/competences,/parcours,/contact - URLs EN préfixées :
/en,/en/projects,/en/skills,/en/journey,/en/contact - Fichiers de traduction JSON dans
i18n/fr.jsoneti18n/en.json - Composable
useI18n()et$t()pour les traductions SSR <NuxtLink>aveclocalePath()pour liens localisés- Page 404 (
error.vue) personnalisée bilingue - SEO :
hreflangautomatiques dans le<head>
Story 1.6 : Layout de base et intégration TailwindCSS
As a visiteur, I want une interface visuelle cohérente, so that l'expérience est agréable.
Acceptance Criteria :
- Layout principal dans
src/Views/layouts/main.php - TailwindCSS configuré avec thÚme custom
- Build CSS via PostCSS avec minification production
- Police(s) variable font chargée(s)
- Meta tags SEO dynamiques par page
- Favicon configuré
- Classes utilitaires thĂšme sombre avec accents
Story 1.7 : Configuration Nuxt Routing et Transitions de page
As a visiteur, I want des transitions fluides entre les pages sans rechargement visible, so that l'expérience est immersive comme une application native.
Acceptance Criteria :
- Routing fichier-based Nuxt avec structure
pages/définie pageTransitionconfiguré dansnuxt.config.ts(fade + slide)- CSS transitions avec classes
page-enter-active,page-leave-active - Navigation via
<NuxtLink>pour hydration SPA (pas de rechargement) - Middleware de navigation pour tracking progression visiteur
scrollBehaviorpersonnalisé (smooth, retour position sauvegardée)- Respect de
prefers-reduced-motionvia media query CSS - Fallback gracieux si JS désactivé (SSR HTML complet)
Story 1.8 : Landing page - Double entrée
As a visiteur, I want choisir entre explorer l'aventure ou aller à l'essentiel, so that mon temps est respecté.
Acceptance Criteria :
- Landing page avec deux CTA distincts
- Bouton "Partir Ă l'aventure" â intro narrative (placeholder)
- Bouton "Je n'ai pas le temps..." â roadmap express
- Animation d'entrée subtile
- Texte d'accroche intrigant bilingue
- Design responsive
Story 1.9 : Mode Pressé - Roadmap express
As a visiteur pressé, I want une vue condensée de toutes les sections, so that je trouve rapidement ce que je cherche.
Acceptance Criteria :
- Page roadmap avec liens directs vers chaque section
- Affichage en grille avec icĂŽnes et descriptions
- Indication visuelle "Partie sauvée" si progression existante
- Message humoristique sympathique
- Lien pour "changer d'avis" et partir Ă l'aventure
- Fonctionnel en FR et EN
Epic 2 : Contenu Interactif
Objectif : Enrichir le site avec les contenus principaux de maniÚre interactive : pages projets avec détails, compétences cliquables menant aux projets associés, témoignages présentés comme des dialogues de PNJ style Zelda, et une timeline narrative du parcours professionnel.
Story 2.1 : Page Projets - Galerie
As a visiteur, I want voir la liste des projets réalisés, so that je peux évaluer les compétences du développeur.
Acceptance Criteria :
- Page
/projets(FR) et/en/projects(EN) fonctionnelle - Affichage en grille responsive des projets (cards)
- Chaque card affiche : image, titre, description courte
- Projets triĂ©s par date avec option "featured" en tĂȘte
- Animation d'entrée progressive des cards
- Hover effect révélant un CTA "Découvrir"
- Données chargées depuis la table
projects
Story 2.2 : Page Projet - Détail
As a visiteur, I want voir les détails d'un projet spécifique, so that je comprends le travail réalisé et les technologies utilisées.
Acceptance Criteria :
- Page
/projets/{slug}dynamique avec routing - Affichage : titre, description complĂšte, image(s), date
- Liste des compétences utilisées avec niveaux
- Liens externes : URL du projet, repository GitHub
- Navigation "Projet précédent / suivant"
- Bouton retour vers la galerie
- Meta tags SEO dynamiques
Story 2.3 : Page Compétences - Affichage par catégories
As a visiteur, I want voir les compétences du développeur organisées par catégorie, so that je comprends son profil technique.
Acceptance Criteria :
- Page
/competences(FR) et/en/skills(EN) fonctionnelle - Compétences groupées par catégorie (Frontend, Backend, Tools, Soft skills)
- Chaque compétence affiche : icÎne, nom, niveau actuel
- Design en grille ou liste selon la catégorie
- Animation d'entrée des éléments
- Données chargées depuis la table
skills
Story 2.4 : CompĂ©tences cliquables â Projets liĂ©s
As a visiteur, I want cliquer sur une compétence pour voir les projets qui l'utilisent, so that je peux voir des preuves concrÚtes.
Acceptance Criteria :
- Chaque compétence est cliquable
- Au clic, affichage d'un panneau/modal avec les projets liés
- Pour chaque projet lié : titre, description courte, lien vers le détail
- Indication du niveau avant/aprĂšs chaque projet
- Animation d'ouverture/fermeture fluide
- Fermeture par clic extérieur ou bouton close
- Fonctionne au clavier (accessibilité)
Story 2.5 : Page Témoignages - Structure de base
As a visiteur, I want voir les témoignages des personnes ayant travaillé avec le développeur, so that j'ai une validation sociale de ses compétences.
Acceptance Criteria :
- Page
/temoignages(FR) et/en/testimonials(EN) fonctionnelle - Liste des témoignages depuis la table
testimonials - Chaque témoignage : nom, rÎle, entreprise, avatar, texte
- Design préparé pour le composant dialogue PNJ
- Lien vers le projet associé si pertinent
- Ordre d'affichage configurable
Story 2.6 : Composant Dialogue PNJ - Style Zelda
As a visiteur, I want lire les témoignages comme des dialogues de personnages, so that l'expérience est immersive et mémorable.
Acceptance Criteria :
- Composant réutilisable "DialoguePNJ" avec avatar et bulle
- Avatar stylisé à gauche, bulle de texte à droite
- Effet typewriter sur le texte (lettre par lettre)
- Clic pour accélérer/passer le texte complet
- Personnalités visuelles selon le champ
personality - Son optionnel "blip" désactivable
- Respect de
prefers-reduced-motion
Story 2.7 : Carousel de témoignages avec dialogues
As a visiteur, I want naviguer entre les différents témoignages, so that je peux tous les consulter.
Acceptance Criteria :
- Navigation entre témoignages (précédent/suivant)
- Transition animée entre les PNJ
- Indicateur du témoignage actuel
- Auto-play optionnel avec pause au hover
- Navigation au clavier (flĂšches)
- Mémoire du témoignage consulté
Story 2.8 : Page Parcours - Timeline narrative
As a visiteur, I want découvrir le parcours professionnel du développeur, so that je comprends son évolution et son expérience.
Acceptance Criteria :
- Page
/parcours(FR) et/en/journey(EN) fonctionnelle - Timeline verticale avec étapes chronologiques
- Chaque étape : date, titre, description narrative
- Alternance gauche/droite sur desktop, linéaire sur mobile
- Animation d'apparition au scroll
- IcÎnes ou images pour les étapes clés
- Contenu bilingue
Epic 3 : Gamification & Navigation
Objectif : Implémenter les éléments de gamification et la navigation alternative : narrateur-guide accompagnant le visiteur, barre de progression globale, sauvegarde de la progression, arbre de compétences interactif (vis.js), et carte interactive pour la navigation (Konva.js).
Story 3.1 : Table narrator_texts et systĂšme narrateur
As a développeur, I want un systÚme de gestion des textes du narrateur, so that le narrateur peut afficher des messages contextuels.
Acceptance Criteria :
- Table
narrator_textscréée (id, context, text_key, variant) - Contextes définis : intro, transition_projects, transition_skills, hint, encouragement
- Support de variantes (sélection aléatoire)
- Helper PHP
getNarratorText($context, $lang) - Textes de base insérés en FR et EN
- Migration SQL ajoutée
Story 3.2 : Composant Narrateur UI
As a visiteur, I want voir un narrateur qui me guide à travers le site, so that je me sens accompagné dans mon exploration.
Acceptance Criteria :
- Composant UI narrateur fixe (coin bas)
- Avatar/icĂŽne du narrateur identifiable
- Bulle de texte avec message contextuel
- Effet typewriter similaire aux dialogues PNJ
- Apparition/disparition animée non intrusive
- Bouton pour fermer/minimiser
- Ne bloque pas la navigation
Story 3.3 : Textes narrateur contextuels
As a visiteur, I want que le narrateur réagisse à mes actions, so that l'expérience est personnalisée.
Acceptance Criteria :
- Message d'accueil à l'arrivée (mode aventure)
- Messages de transition entre sections
- Encouragements lors de la progression (25%, 50%, 75%)
- Indices si visiteur semble perdu
- Message spécial premiÚre visite vs retour
- Intégration avec hooks de navigation Nuxt (middleware)
Story 3.4 : Barre de progression globale
As a visiteur, I want voir ma progression dans l'exploration du site, so that je sais combien il me reste à découvrir.
Acceptance Criteria :
- Barre de progression discrĂšte dans le header
- Pourcentage calculé selon sections visitées
- Sections trackées : Projets, Compétences, Témoignages, Parcours
- Animation fluide lors de la mise Ă jour
- Tooltip indiquant sections visitées/restantes
- Design XP bar style RPG
Story 3.5 : Store Pinia Progression avec persistance LocalStorage
As a visiteur, I want que ma progression soit sauvegardée, so that je peux reprendre mon exploration plus tard.
Acceptance Criteria :
- Store Pinia
useProgressionStoreavec état réactif - Données : sections visitées (Set), choix narratifs (Array), easter eggs (Array)
- Getters : pourcentage completion, sections restantes
- Plugin
pinia-plugin-persistedstatepour sync LocalStorage automatique - Session ID unique généré au premier accÚs
- DĂ©tection progression existante â message "Bienvenue Ă nouveau"
- Action
$reset()pour réinitialiser la progression
Story 3.6 : Table user_progress (sauvegarde cloud optionnelle)
As a visiteur, I want optionnellement sauvegarder ma progression en ligne, so that je peux la retrouver sur un autre appareil.
Acceptance Criteria :
- Table
user_progresscréée - Formulaire "Sauvegarder ma progression" (email)
- Endpoint API POST pour sauvegarder
- Endpoint API GET pour récupérer (lien magique)
- Validation email basique
- RGPD : consentement, possibilité suppression
Story 3.7 : Arbre de compétences interactif (vis.js)
As a visiteur, I want voir mes compétences sous forme d'arbre interactif, so that je visualise les connexions et la progression.
Acceptance Criteria :
- Intégration vis.js Network sur page compétences
- NĆuds reprĂ©sentant compĂ©tences avec icĂŽnes
- Liens entre compétences liées
- Taille/couleur des nĆuds selon le niveau
- Clic sur nĆud â projets liĂ©s
- Zoom et pan pour naviguer
- Layout esthétique
Story 3.8 : Carte interactive - Design Konva.js
As a visiteur, I want voir une carte du "monde" du portfolio, so that je comprends la structure et ma position.
Acceptance Criteria :
- Canvas Konva.js dans page/modal dédiée
- Design de carte stylisé (ßles, régions, chemins)
- Zones : Projets, Compétences, Parcours, Témoignages, Contact
- Indicateurs visuels zones visitées
- Position actuelle marquée
- Style visuel RPG cohérent
- Assets graphiques SVG/PNG
Story 3.9 : Carte interactive - Navigation
As a visiteur, I want naviguer vers les sections en cliquant sur la carte, so that j'explore librement.
Acceptance Criteria :
- Zones cliquables sur la carte
- Clic â navigation vers section
- Animation de "voyage" optionnelle
- Hover â nom et statut de la zone
- Bouton ouvrir/fermer carte depuis toute page
- Navigation via
<NuxtLink>avec transition intégrée
Story 3.10 : Minimap mobile
As a visiteur mobile, I want une version simplifiée de la carte, so that je peux naviguer sur petit écran.
Acceptance Criteria :
- Minimap compacte sur mobile
- Mode "liste visuelle" ou carte schématique
- Indicateurs de progression visibles
- Touch-friendly
- Accessible via bouton flottant
- Performance optimisée (pas Konva lourd)
Epic 4 : Expérience ComplÚte & Finalisation
Objectif : Finaliser l'expérience gamifiée avec les éléments avancés : chemins narratifs multiples, challenge/puzzle final, easter eggs, et célébration de fin avec le formulaire de contact comme récompense narrative.
Story 4.1 : Intro narrative - Mode Aventure
As a visiteur aventurier, I want une introduction narrative captivante, so that je suis immergé dans l'expérience dÚs le début.
Acceptance Criteria :
- Page/séquence d'intro aprÚs choix "Partir à l'aventure"
- Présentation du "héros mystérieux" (le développeur)
- Texte narratif avec effet typewriter
- Ambiance visuelle immersive
- Bouton "Continuer" pour avancer
- Transition fluide vers le premier choix
- Contenu bilingue FR/EN
Story 4.2 : SystĂšme de choix narratifs
As a visiteur, I want faire des choix qui influencent mon parcours, so that mon expérience est unique.
Acceptance Criteria :
- Structure de données pour les choix (table ou JSON)
- 2-3 points de choix binaires dans le parcours
- Chaque choix mÚne à un chemin différent
- Choix stockés dans la progression LocalStorage
- Interface de choix claire (2 options distinctes)
- Pas de "mauvais" choix - tous mĂšnent au contact
Story 4.3 : Chemins narratifs différenciés
As a visiteur, I want que mes choix aient un impact visible, so that je sens que mon parcours est personnalisé.
Acceptance Criteria :
- 4-8 parcours possibles selon combinaisons
- Ordre des sections varie selon le chemin
- Textes du narrateur adaptés au chemin
- Transitions contextuelles entre sections
- Tous les chemins couvrent tout le contenu
Story 4.4 : Page Challenge - Structure
As a visiteur, I want relever un défi avant d'accéder au contact, so that l'accÚs au développeur est une récompense méritée.
Acceptance Criteria :
- Page
/challengeaccessible aprÚs exploration minimum - Introduction narrative "Une derniÚre épreuve..."
- Zone de puzzle/challenge visible
- SystĂšme d'indices (bouton "Besoin d'aide ?")
- Blocage accÚs direct contact sans challenge complété
Story 4.5 : Puzzle principal
As a visiteur, I want rĂ©soudre un puzzle intĂ©ressant mais accessible, so that je me sens intelligent sans ĂȘtre frustrĂ©.
Acceptance Criteria :
- Puzzle logique/code simple (réordonner, compléter, décoder)
- Difficulté calibrée : 1-3 minutes
- Validation avec feedback clair
- Animation de succĂšs
- 3 niveaux d'indices progressifs
- Option "Passer" aprĂšs 3 indices
- Thématique développement/code
Story 4.6 : Page Contact - Célébration finale
As a visiteur ayant complété le parcours, I want une conclusion mémorable et satisfaisante, so that je me souviens de cette expérience.
Acceptance Criteria :
- Page
/contactaccessible aprÚs le challenge - Animation célébration "Tu m'as trouvé !" (confettis)
- Message de félicitations avec stats du parcours
- Formulaire : nom, email, message
- Validation cÎté client et serveur
- Envoi email via PHPMailer
Story 4.7 : Table easter_eggs et systĂšme
As a développeur, I want un systÚme pour gérer les easter eggs, so that je peux ajouter des surprises cachées.
Acceptance Criteria :
- Table
easter_eggs(id, slug, location, trigger_type, reward_type, reward_key) - Trigger types : click, hover, konami, scroll, sequence
- Reward types : snippet, anecdote, image, badge
- Helper
checkEasterEgg($slug) - Stockage easter eggs trouvés dans progression
- 5-10 easter eggs définis
Story 4.8 : Easter eggs - Implémentation UI
As a visiteur curieux, I want découvrir des surprises cachées dans le site, so that l'exploration est récompensée.
Acceptance Criteria :
- Easter eggs placés sur différentes pages
- Déclencheurs variés selon le type
- Animation de découverte (popup, effet visuel)
- Affichage de la récompense
- Notification "Easter egg trouvé ! (X/Y)"
- Bouton fermer pour continuer
Story 4.9 : Collection d'easter eggs
As a visiteur, I want voir ma collection d'easter eggs trouvés, so that je sais ce qu'il me reste à découvrir.
Acceptance Criteria :
- Section "Collection" accessible
- Grille avec easter eggs trouvés et silhouettes mystÚre
- Détails visibles pour les découverts
- Compteur X/Y trouvés
- Badge spéciale si 100% trouvés
Story 4.10 : Polissage et optimisations finales
As a visiteur, I want une expérience fluide et sans bugs, so that je profite pleinement du site.
Acceptance Criteria :
- Audit performance (Lighthouse > 90)
- Test de tous les parcours narratifs
- Vérification accessibilité WCAG AA
- Test responsive sur devices réels
- Corrections bugs identifiés
- Optimisation assets
- Génération sitemap.xml et robots.txt
7. Checklist Results Report
Executive Summary
| CritĂšre | Ăvaluation |
|---|---|
| Complétude PRD | 87% |
| Scope MVP | Approprié |
| PrĂȘt pour Architecture | â READY |
Category Analysis
| Category | Status |
|---|---|
| 1. Problem Definition & Context | â PASS |
| 2. MVP Scope Definition | â PASS |
| 3. User Experience Requirements | â PASS |
| 4. Functional Requirements | â PASS |
| 5. Non-Functional Requirements | â PASS |
| 6. Epic & Story Structure | â PASS |
| 7. Technical Guidance | â PASS |
| 8. Cross-Functional Requirements | â PASS |
| 9. Clarity & Communication | â PASS |
Notes
- Story 3.6 (sauvegarde cloud) marquée optionnelle - à confirmer post-MVP
- Assets graphiques pour la carte interactive (Story 3.8) nécessitent design
- Puzzle principal (Story 4.5) : type à finaliser avec l'équipe
8. Next Steps
8.1 UX Expert Prompt
Je suis l'UX Expert. J'ai besoin de créer les wireframes et le design system pour le projet "Portfolio Gamifié".
Contexte : Portfolio web transformé en aventure narrative immersive avec :
- Double entrée (Aventure vs Mode Pressé)
- Navigation par carte interactive
- Dialogues PNJ style Zelda pour les témoignages
- Arbre de compétences interactif
- SystÚme de progression gamifié
- Challenge/puzzle avant accĂšs au contact
Documents Ă consulter :
- PRD : docs/prd-gamification.md
- Brainstorming : docs/brainstorming-gamification-2026-01-26.md
Livrables attendus :
1. Wireframes des écrans principaux (Landing, Carte, Projets, Skills, Témoignages, Challenge, Contact)
2. Design system (couleurs RPG, typographie, composants)
3. Spécifications du composant Dialogue PNJ
4. Maquettes de la carte interactive
5. Guidelines responsive (desktop â mobile)
Contraintes : WCAG AA, prefers-reduced-motion, thÚme sombre avec accents colorés.
8.2 Architect Prompt
Je suis l'Architecte. J'ai besoin de créer l'architecture technique pour le projet "Portfolio Gamifié".
Contexte : Nouveau projet avec Nuxt 3 SSR et backend Laravel API.
Stack validée :
- Frontend : Nuxt 3 (SSR) / Vue 3 / Pinia / @nuxtjs/i18n / TailwindCSS
- Backend : Laravel 11 / Eloquent ORM / MariaDB
- Librairies : Konva.js (vue-konva, client-only) / vis-network (client-only)
- Build : Nitro (Nuxt) + Composer (Laravel)
- Tests : Pest/PHPUnit (Laravel) + Vitest + @nuxt/test-utils + Playwright (E2E)
Documents Ă consulter :
- PRD : docs/prd-gamification.md
- Brainstorming (schéma DB détaillé) : docs/brainstorming-gamification-2026-01-26.md
Livrables attendus :
1. Architecture document avec structure monorepo (frontend Nuxt + api Laravel)
2. Schéma de base de données final (migrations Laravel)
3. Design API REST endpoints avec Laravel Resources
4. Configuration nuxt.config.ts (SSR, i18n, transitions, modules)
5. Structure des stores Pinia avec persistedstate (SSR-compatible)
6. Composables réutilisables (useTypewriter, useNarrator, useEasterEggs)
7. Stratégie composants client-only (*.client.vue) pour Konva/vis.js
8. Configuration @nuxtjs/i18n (stratégie prefix_except_default, SEO hreflang)
9. Configuration Laravel : CORS, Form Requests, API Resources, rate limiting
10. Stratégie déploiement (Node.js pour Nuxt SSR + PHP pour Laravel API)
11. Coding standards et conventions (PSR-12 PHP, ESLint/Prettier Vue)
Contraintes : Bundle JS < 170kb gzip, LCP < 2.5s, SSR pour SEO, navigation SPA fluide.