feat(epic-4): chemins narratifs, easter eggs, challenge et contact

Epic 4: Chemins Narratifs, Challenge & Contact

Stories implementees:
- 4.1: Composant ChoiceCards pour choix narratifs binaires
- 4.2: Sequence d'intro narrative avec Le Bug
- 4.3: Chemins narratifs differencies avec useNarrativePath
- 4.4: Table easter_eggs et systeme de detection (API + composable)
- 4.5: Easter eggs UI (popup, notification, collection)
- 4.6: Page challenge avec puzzle de code
- 4.7: Page revelation "Monde de Code"
- 4.8: Page contact avec formulaire et stats

Fichiers crees:
- Frontend: ChoiceCards, IntroSequence, ZoneEndChoice, EasterEggPopup,
  CodePuzzle, ChallengeSuccess, CodeWorld, et pages intro/challenge/revelation
- API: EasterEggController, Model, Migration, Seeder

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-08 13:35:12 +01:00
parent 64b1a33d10
commit 7e87a341a2
38 changed files with 3037 additions and 96 deletions

View File

@@ -179,6 +179,16 @@
"clickToSkip": "Click or press Space to skip",
"bugAlt": "The Bug - Stage {stage}"
},
"intro": {
"continue": "Continue",
"startExploring": "Start exploring",
"skip": "Skip intro",
"fallback": {
"seq1": "Welcome to my domain... I am The Bug, your guide for this adventure.",
"seq2": "There's someone here you're looking for... A mysterious developer who created everything you see.",
"seq3": "To find them, explore this world. Each zone hides a part of their story. Are you ready?"
}
},
"map": {
"ariaLabel": "Interactive portfolio map. Use Tab to navigate between zones and Enter to explore.",
"instructions": "Use Tab keys to navigate between zones and Enter or Space to explore a zone.",
@@ -252,5 +262,63 @@
"title": "Quick Resume",
"description": "The essentials at a glance"
}
},
"easterEgg": {
"found": "Easter Egg found!",
"count": "{found} / {total} discovered",
"difficulty": "Difficulty",
"collection": "My Collection",
"allFound": "Collection complete! You're a true explorer!",
"hint": "Keep exploring... surprises are hidden everywhere!"
},
"challenge": {
"title": "One last challenge...",
"intro": "Before meeting the developer, prove you understand the basics of code. Nothing too hard, I promise.",
"accept": "Accept the challenge",
"skip": "Skip to contact",
"puzzleTitle": "Put the code in order",
"puzzleInstruction": "Drag the lines to reconstruct the function that unlocks access to the developer.",
"hint1": "The function starts with function unlockDeveloper() {",
"hint2": "The secret variable is defined right after the opening brace",
"hint3": "The last line before the closing brace is return Keep exploring...",
"hintLabel": "Hint",
"needHint": "Need help?",
"validate": "Check",
"validating": "Checking...",
"wrongOrder": "That's not the right order... Try again!",
"moveUp": "Move up",
"moveDown": "Move down",
"success": "Well done!",
"successMessage": "You've proven your worth. The path to the developer is now open...",
"redirecting": "Redirecting..."
},
"revelation": {
"loading": "Loading...",
"bugSays": "The Bug says: You found them!",
"foundMe": "You found me!",
"message": "Welcome to my world of code. Thank you for exploring all this way to find me.",
"contactCta": "Contact me",
"srDescription": "Revelation page. You found the developer Celian. A button allows you to contact them.",
"codeWorldAlt": "An ASCII art world representing a code landscape with the message You found me in the center."
},
"contact": {
"statsTitle": "Your journey",
"zones": "Zones visited",
"easterEggs": "Easter eggs",
"challenge": "Challenge",
"title": "Contact me",
"subtitle": "Congratulations for exploring all this way! I'd be happy to chat with you.",
"name": "Name",
"namePlaceholder": "Your name",
"email": "Email",
"emailPlaceholder": "your.email(at)example.com",
"message": "Message",
"messagePlaceholder": "What brings you here?",
"send": "Send",
"sending": "Sending...",
"success": "Message sent!",
"successMessage": "Thanks for your message. I'll get back to you as soon as possible.",
"error": "An error occurred. Please try again later.",
"rateLimitError": "Too many attempts. Please wait a moment before trying again."
}
}