[{"data":1,"prerenderedAt":431},["ShallowReactive",2],{"docs-nav":3,"docs-\u002Fdocs\u002Farchitecture":52,"docs-surround-\u002Fdocs\u002Farchitecture":426},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,32,36,40,44,48],{"title":10,"path":6,"stem":11},"Accueil","docs\u002Findex",{"title":13,"path":14,"stem":15},"Suivi","\u002Fdocs\u002Fsuivi","docs\u002F1.suivi",{"title":17,"path":18,"stem":19},"Début découverte","\u002Fdocs\u002Fearly-discovery","docs\u002F10.early-discovery",{"title":21,"path":22,"stem":23},"Idée","\u002Fdocs\u002Fidee","docs\u002F2.idee",{"title":25,"path":26,"stem":27},"Roadmap","\u002Fdocs\u002Froadmap","docs\u002F3.roadmap",{"title":29,"path":30,"stem":31},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F4.architecture",{"title":33,"path":34,"stem":35},"Gameplay","\u002Fdocs\u002Fgameplay","docs\u002F5.gameplay",{"title":37,"path":38,"stem":39},"Backlog","\u002Fdocs\u002Fbacklog","docs\u002F6.backlog",{"title":41,"path":42,"stem":43},"Changelog","\u002Fdocs\u002Fchangelog","docs\u002F7.changelog",{"title":45,"path":46,"stem":47},"Catalogue","\u002Fdocs\u002Fcatalogue","docs\u002F8.catalogue",{"title":49,"path":50,"stem":51},"Firebase Auth","\u002Fdocs\u002Ffirebase-auth","docs\u002F9.firebase-auth",{"id":53,"title":29,"body":54,"description":418,"extension":419,"meta":420,"navigation":421,"path":30,"seo":422,"status":423,"stem":31,"updated":424,"__hash__":425},"docs\u002Fdocs\u002F4.architecture.md",{"type":55,"value":56,"toc":407},"minimark",[57,61,66,79,103,113,117,127,131,137,141,191,195,301,305,400,404],[58,59,29],"h1",{"id":60},"architecture",[62,63,65],"h2",{"id":64},"stack","Stack",[67,68,69,70,74,75,78],"p",{},"Nuxt 4 · Vue 3 · Vue Flow · Pinia · Dexie · Tailwind v4 · Nuxt Content · ",[71,72,73],"strong",{},"PWA"," · Firebase Auth (phase 0) · Vitest (",[71,76,77],{},"281"," tests, 49 fichiers) · pnpm · ESLint (imports UI)",[67,80,81,82,86,87,90,91,94,95,98,99,102],{},"Dev : ",[83,84,85],"code",{},"pnpm dev"," (port ",[71,88,89],{},"9087","). Jeu : ",[83,92,93],{},"\u002Fplay",". Déploiement : push ",[83,96,97],{},"main"," → Docker sur VPS (",[83,100,101],{},".github\u002Fworkflows\u002Fdeploy.yml",").",[67,104,105,108,109,112],{},[71,106,107],{},"P2 :"," Auth UI → cloud save → FCM. Persistance locale (Dexie) jusqu’au cloud save. Voir ",[110,111,49],"a",{"href":50},".",[62,114,116],{"id":115},"couches","Couches",[118,119,125],"pre",{"className":120,"code":122,"language":123,"meta":124},[121],"language-text","Vue → Pinia (game + schemaUi + auth) → SimulationEngine → GameState → Dexie\n         ↘ Firebase Auth (phase 0) → (P2 cloud save) → Firestore\n         ↘ (P2) FCM après Auth UI\n","text","",[83,126,122],{"__ignoreMap":124},[62,128,130],{"id":129},"dossiers","Dossiers",[118,132,135],{"className":133,"code":134,"language":123,"meta":124},[121],"app\u002Fpages\u002F             \u002F (site), \u002Fplay, \u002Fdocs, \u002Flegal\napp\u002Flib\u002Ffirebase\u002F      config, client lazy, types, userSnapshot\napp\u002Fstores\u002Fauth.ts     session Firebase (orthogonal au game save)\napp\u002Fcomponents\u002Fgame\u002F   Canvas, HUD (pocket \u002F settings), shop, craft, research, objectives, PWA\napp\u002Fcomposables\u002F       useSchema* · useSiteSeo\napp\u002Fstores\u002Fgame\u002F       session · economy · graph · research (façade Pinia)\napp\u002Futils\u002Fseo.ts       constantes site (nom, description, URL)\napp\u002Fcomponents\u002Fnodes\u002F  deposit, extractor, storage, storage_tap, furnace, lab, market, splitter, merger\ngame\u002Fmodels\u002Fnodes\u002F     types + familles par machine\ngame\u002Fdefinitions\u002F      machines, tech, objectives, handCraft, shopUnlocks, deposits\ngame\u002Fselectors\u002F        helpers lecture seule pour l’UI et le store\ngame\u002Fengine\u002F           production · logistics · economy · research · debug\ngame\u002Fpersistence\u002F      Dexie + migrations + normalize\u002F{nodes,fields} + validate\nserver\u002Froutes\u002F         sitemap.xml (docs dynamiques)\npublic\u002F                robots.txt · og\u002Fdefault.png · icônes PWA\n",[83,136,134],{"__ignoreMap":124},[62,138,140],{"id":139},"imports-ui-domaine","Imports UI ↔ domaine",[142,143,144,152,158,164,181],"ul",{},[145,146,147,148,151],"li",{},"Mutations → ",[83,149,150],{},"useGameStore"," uniquement",[145,153,154,155],{},"Catalogues → ",[83,156,157],{},"@game\u002Fdefinitions",[145,159,160,161],{},"Helpers lecture → ",[83,162,163],{},"@game\u002Fselectors",[145,165,166,169,170,173,174,177,178],{},[83,167,168],{},"@game\u002Fengine"," (",[83,171,172],{},"apply*",") → slices store seulement ; ",[71,175,176],{},"ESLint"," bloque tout import direct ailleurs dans ",[83,179,180],{},"app\u002F",[145,182,183,184,186,187,190],{},"Firebase → ",[83,185,180],{}," uniquement ; ",[83,188,189],{},"@game\u002F*"," reste sans Firebase",[62,192,194],{"id":193},"seo-état","SEO (état)",[196,197,198,211],"table",{},[199,200,201],"thead",{},[202,203,204,208],"tr",{},[205,206,207],"th",{},"Élément",[205,209,210],{},"État",[212,213,214,228,240,255,271,290],"tbody",{},[202,215,216,223],{},[217,218,219,222],"td",{},[83,220,221],{},"useSiteSeo"," + canonical \u002F OG \u002F Twitter",[217,224,225],{},[71,226,227],{},"Fait",[202,229,230,236],{},[217,231,232,233],{},"Image OG ",[83,234,235],{},"public\u002Fog\u002Fdefault.png",[217,237,238],{},[71,239,227],{},[202,241,242,251],{},[217,243,244,245,248,249],{},"JSON-LD landing ",[83,246,247],{},"\u002F"," + WebApplication ",[83,250,93],{},[217,252,253],{},[71,254,227],{},[202,256,257,267],{},[217,258,259,262,263,266],{},[83,260,261],{},"sitemap.xml"," (docs Nuxt Content) · ",[83,264,265],{},"robots.txt"," dynamique",[217,268,269],{},[71,270,227],{},[202,272,273,286],{},[217,274,275,276,278,279,278,282,285],{},"Prerender ",[83,277,247],{},", ",[83,280,281],{},"\u002Fdocs\u002F*",[83,283,284],{},"\u002Flegal\u002F*"," · perf landing",[217,287,288],{},[71,289,227],{},[202,291,292,295],{},[217,293,294],{},"Search Console (ops prod)",[217,296,297,300],{},[71,298,299],{},"P1"," — env prêt, soumission manuelle",[62,302,304],{"id":303},"état-clé","État clé",[196,306,307,317],{},[199,308,309],{},[202,310,311,314],{},[205,312,313],{},"Champ",[205,315,316],{},"Rôle",[212,318,319,329,339,356,366,379,390],{},[202,320,321,326],{},[217,322,323],{},[83,324,325],{},"saveSchemaVersion",[217,327,328],{},"Révision schéma save (migrations au load)",[202,330,331,336],{},[217,332,333],{},[83,334,335],{},"handCraftQueue",[217,337,338],{},"File crafts",[202,340,341,353],{},[217,342,343,346,347,346,350],{},[83,344,345],{},"researchPoints"," \u002F ",[83,348,349],{},"activeResearchId",[83,351,352],{},"techProgress",[217,354,355],{},"Recherche",[202,357,358,363],{},[217,359,360],{},[83,361,362],{},"unlockedTechs",[217,364,365],{},"Effets tech",[202,367,368,376],{},[217,369,370,346,373],{},[83,371,372],{},"score",[83,374,375],{},"completedObjectiveIds",[217,377,378],{},"Objectifs",[202,380,381,387],{},[217,382,383,386],{},[83,384,385],{},"enabled"," (machines)",[217,388,389],{},"Interrupteur ON\u002FOFF (tech Interrupteurs)",[202,391,392,397],{},[217,393,394],{},[83,395,396],{},"viewport",[217,398,399],{},"Pan\u002Fzoom persisté",[62,401,403],{"id":402},"décisions","Décisions",[67,405,406],{},"Tick unique · stocks entiers · lab = drag + câble · gisement \u002F coffre dockés · marché 200 (tech 50) · offline ≤ 8 h · PWA · local-first jusqu’à cloud save (P2) · FCM après Auth UI",{"title":124,"searchDepth":408,"depth":408,"links":409},3,[410,412,413,414,415,416,417],{"id":64,"depth":411,"text":65},2,{"id":115,"depth":411,"text":116},{"id":129,"depth":411,"text":130},{"id":139,"depth":411,"text":140},{"id":193,"depth":411,"text":194},{"id":303,"depth":411,"text":304},{"id":402,"depth":411,"text":403},"Stack technique, couches applicatives et décisions structurantes.","md",{},{"title":29},{"title":29,"description":418},"done","2026-08-28","VTGwl_ZfVL4t5cNaj82BcOtN60aqNrwBiUNo_e6QYSM",[427,429],{"title":25,"path":26,"stem":27,"description":428,"children":-1},"Prochaines étapes priorisées pour faire grandir le prototype.",{"title":33,"path":34,"stem":35,"description":430,"children":-1},"Comment jouer au prototype et comprendre la boucle validée.",1787932110286]