[{"data":1,"prerenderedAt":551},["ShallowReactive",2],{"docs-navigation:en":3,"content-page:docs:xjCBV8q1ykigFRtle2L4Ht-tLL0FSlqi4KM5mrNybnQ":113,"content-page-surround:docs:xjCBV8q1ykigFRtle2L4Ht-tLL0FSlqi4KM5mrNybnQ":544,"i-lucide:clipboard":547},[4,32,68,108],{"title":5,"id":6,"canonicalKey":7,"locale":8,"draft":9,"path":10,"children":11},"Getting started","content:docs:1.getting-started:.navigation.yml","1","en",false,"\u002Fdocs\u002Fgetting-started",[12,17,22,27],{"title":13,"id":14,"canonicalKey":15,"locale":8,"draft":9,"path":16},"Nuxt guide","content:docs:1.getting-started:2.nuxt.md","1\u002F2","\u002Fdocs\u002Fgetting-started\u002Fnuxt",{"title":18,"id":19,"canonicalKey":20,"locale":8,"draft":9,"path":21},"Vue guide","content:docs:1.getting-started:3.vue.md","1\u002F3","\u002Fdocs\u002Fgetting-started\u002Fvue",{"title":23,"id":24,"canonicalKey":25,"locale":8,"draft":9,"path":26},"Customize the tour","content:docs:1.getting-started:4.customization.md","1\u002F4","\u002Fdocs\u002Fgetting-started\u002Fcustomization",{"title":28,"id":29,"canonicalKey":30,"locale":8,"draft":9,"path":31},"Troubleshooting","content:docs:1.getting-started:5.troubleshooting.md","1\u002F5","\u002Fdocs\u002Fgetting-started\u002Ftroubleshooting",{"title":33,"id":34,"canonicalKey":35,"locale":8,"draft":9,"path":36,"children":37},"Recipes","content:docs:2.recipes:.navigation.yml","2","\u002Fdocs\u002Frecipes",[38,43,48,53,58,63],{"title":39,"id":40,"canonicalKey":41,"locale":8,"draft":9,"path":42},"Rich content and images","content:docs:2.recipes:2.rich-content.md","2\u002F2","\u002Fdocs\u002Frecipes\u002Frich-content",{"title":44,"id":45,"canonicalKey":46,"locale":8,"draft":9,"path":47},"Routes and dynamic targets","content:docs:2.recipes:3.routes-and-targets.md","2\u002F3","\u002Fdocs\u002Frecipes\u002Froutes-and-targets",{"title":49,"id":50,"canonicalKey":51,"locale":8,"draft":9,"path":52},"Conditions and preparation","content:docs:2.recipes:4.conditions-and-preparation.md","2\u002F4","\u002Fdocs\u002Frecipes\u002Fconditions-and-preparation",{"title":54,"id":55,"canonicalKey":56,"locale":8,"draft":9,"path":57},"Interaction and focus","content:docs:2.recipes:5.interaction-and-focus.md","2\u002F5","\u002Fdocs\u002Frecipes\u002Finteraction-and-focus",{"title":59,"id":60,"canonicalKey":61,"locale":8,"draft":9,"path":62},"Customization and labels","content:docs:2.recipes:6.customization.md","2\u002F6","\u002Fdocs\u002Frecipes\u002Fcustomization",{"title":64,"id":65,"canonicalKey":66,"locale":8,"draft":9,"path":67},"Events and progress","content:docs:2.recipes:7.events-and-progress.md","2\u002F7","\u002Fdocs\u002Frecipes\u002Fevents-and-progress",{"title":69,"page":9,"canonicalKey":70,"locale":8,"id":71,"draft":9,"children":72},"Design","3","content:docs:3.design:.navigation.yml",[73,78,83,88,93,98,103],{"title":74,"id":75,"canonicalKey":76,"locale":8,"draft":9,"path":77},"Product and scope","content:docs:3.design:1.product-and-scope.md","3\u002F1","\u002Fdocs\u002Fdesign\u002Fproduct-and-scope",{"title":79,"id":80,"canonicalKey":81,"locale":8,"draft":9,"path":82},"Public API","content:docs:3.design:2.public-api.md","3\u002F2","\u002Fdocs\u002Fdesign\u002Fpublic-api",{"title":84,"id":85,"canonicalKey":86,"locale":8,"draft":9,"path":87},"Runtime semantics","content:docs:3.design:3.runtime-semantics.md","3\u002F3","\u002Fdocs\u002Fdesign\u002Fruntime-semantics",{"title":89,"id":90,"canonicalKey":91,"locale":8,"draft":9,"path":92},"Nuxt and Vue integration","content:docs:3.design:4.nuxt-and-vue.md","3\u002F4","\u002Fdocs\u002Fdesign\u002Fnuxt-and-vue",{"title":94,"id":95,"canonicalKey":96,"locale":8,"draft":9,"path":97},"Rendering and accessibility","content:docs:3.design:5.rendering-and-accessibility.md","3\u002F5","\u002Fdocs\u002Fdesign\u002Frendering-and-accessibility",{"title":99,"id":100,"canonicalKey":101,"locale":8,"draft":9,"path":102},"Architecture and testing","content:docs:3.design:6.architecture-and-testing.md","3\u002F6","\u002Fdocs\u002Fdesign\u002Farchitecture-and-testing",{"title":104,"id":105,"canonicalKey":106,"locale":8,"draft":9,"path":107},"Research decisions","content:docs:3.design:7.research-decisions.md","3\u002F7","\u002Fdocs\u002Fdesign\u002Fresearch-decisions",{"title":109,"id":110,"canonicalKey":111,"locale":8,"draft":9,"path":112},"Implementation","content:docs:4.implementation:.navigation.yml","4","\u002Fdocs\u002Fimplementation",{"title":99,"description":114,"body":115,"type":531,"id":100,"canonicalKey":101,"draft":9,"partial":9,"locale":8,"collection":532,"navigationFile":9,"file":533,"route":539,"resolution":541},"Define internal ownership and the evidence required before release.",{"type":116,"children":117,"toc":522},"root",[118,126,133,244,257,263,412,417,423,428,495,501,506,511,517],{"type":119,"tag":120,"props":121,"children":123},"element","h1",{"id":122},"architecture-and-testing",[124],{"type":125,"value":99},"text",{"type":119,"tag":127,"props":128,"children":130},"h2",{"id":129},"internal-ownership",[131],{"type":125,"value":132},"Internal ownership",{"type":119,"tag":134,"props":135,"children":137},"pre",{"language":125,"class":136},"shiki shiki-themes material-theme-lighter material-theme-palenight dark:material-theme-palenight",[138],{"type":119,"tag":139,"props":140,"children":142},"code",{"class":141},"language-text",[143,154,156,164,165,173,174,182,183,191,192,200,201,209,210,217,218,226,227,235,236],{"type":119,"tag":144,"props":145,"children":148},"span",{"class":146,"style":147},"line","display: inline",[149],{"type":119,"tag":144,"props":150,"children":151},{},[152],{"type":125,"value":153},"Nuxt module",{"type":125,"value":155},"\n",{"type":119,"tag":144,"props":157,"children":158},{"class":146,"style":147},[159],{"type":119,"tag":144,"props":160,"children":161},{},[162],{"type":125,"value":163},"  -> discovers app\u002Ftours files",{"type":125,"value":155},{"type":119,"tag":144,"props":166,"children":167},{"class":146,"style":147},[168],{"type":119,"tag":144,"props":169,"children":170},{},[171],{"type":125,"value":172},"  -> generates registry and types",{"type":125,"value":155},{"type":119,"tag":144,"props":175,"children":176},{"class":146,"style":147},[177],{"type":119,"tag":144,"props":178,"children":179},{},[180],{"type":125,"value":181},"  -> registers auto-imports, components, plugin, router adapter, and CSS",{"type":125,"value":155},{"type":119,"tag":144,"props":184,"children":185},{"class":146,"style":147},[186],{"type":119,"tag":144,"props":187,"children":188},{},[189],{"type":125,"value":190},"",{"type":125,"value":155},{"type":119,"tag":144,"props":193,"children":194},{"class":146,"style":147},[195],{"type":119,"tag":144,"props":196,"children":197},{},[198],{"type":125,"value":199},"Vue runtime",{"type":125,"value":155},{"type":119,"tag":144,"props":202,"children":203},{"class":146,"style":147},[204],{"type":119,"tag":144,"props":205,"children":206},{},[207],{"type":125,"value":208},"  -> owns definitions, target registry, active tour, events, and transitions",{"type":125,"value":155},{"type":119,"tag":144,"props":211,"children":212},{"class":146,"style":147},[213],{"type":119,"tag":144,"props":214,"children":215},{},[216],{"type":125,"value":190},{"type":125,"value":155},{"type":119,"tag":144,"props":219,"children":220},{"class":146,"style":147},[221],{"type":119,"tag":144,"props":222,"children":223},{},[224],{"type":125,"value":225},"Tour host",{"type":125,"value":155},{"type":119,"tag":144,"props":228,"children":229},{"class":146,"style":147},[230],{"type":119,"tag":144,"props":231,"children":232},{},[233],{"type":125,"value":234},"  -> reads runtime state",{"type":125,"value":155},{"type":119,"tag":144,"props":237,"children":238},{"class":146,"style":147},[239],{"type":119,"tag":144,"props":240,"children":241},{},[242],{"type":125,"value":243},"  -> owns dialog, overlay, positioning, focus, and visual transitions",{"type":119,"tag":245,"props":246,"children":247},"p",{},[248,250,255],{"type":125,"value":249},"The transition controller remains framework-light internally so it can be unit\ntested, but it is not a public ",{"type":119,"tag":139,"props":251,"children":252},{},[253],{"type":125,"value":254},"core",{"type":125,"value":256}," export. Domain behavior does not live in\nthe Nuxt module or Vue component.",{"type":119,"tag":127,"props":258,"children":260},{"id":259},"source-layout",[261],{"type":125,"value":262},"Source layout",{"type":119,"tag":134,"props":264,"children":265},{"language":125,"class":136},[266],{"type":119,"tag":139,"props":267,"children":268},{"class":141},[269,277,278,286,287,295,296,304,305,313,314,322,323,331,332,340,341,349,350,358,359,367,368,376,377,385,386,394,395,403,404],{"type":119,"tag":144,"props":270,"children":271},{"class":146,"style":147},[272],{"type":119,"tag":144,"props":273,"children":274},{},[275],{"type":125,"value":276},"src\u002F",{"type":125,"value":155},{"type":119,"tag":144,"props":279,"children":280},{"class":146,"style":147},[281],{"type":119,"tag":144,"props":282,"children":283},{},[284],{"type":125,"value":285},"  module.ts",{"type":125,"value":155},{"type":119,"tag":144,"props":288,"children":289},{"class":146,"style":147},[290],{"type":119,"tag":144,"props":291,"children":292},{},[293],{"type":125,"value":294},"  discovery.ts",{"type":125,"value":155},{"type":119,"tag":144,"props":297,"children":298},{"class":146,"style":147},[299],{"type":119,"tag":144,"props":300,"children":301},{},[302],{"type":125,"value":303},"  runtime\u002F",{"type":125,"value":155},{"type":119,"tag":144,"props":306,"children":307},{"class":146,"style":147},[308],{"type":119,"tag":144,"props":309,"children":310},{},[311],{"type":125,"value":312},"    controller.ts",{"type":125,"value":155},{"type":119,"tag":144,"props":315,"children":316},{"class":146,"style":147},[317],{"type":119,"tag":144,"props":318,"children":319},{},[320],{"type":125,"value":321},"    registry.ts",{"type":125,"value":155},{"type":119,"tag":144,"props":324,"children":325},{"class":146,"style":147},[326],{"type":119,"tag":144,"props":327,"children":328},{},[329],{"type":125,"value":330},"    router.ts",{"type":125,"value":155},{"type":119,"tag":144,"props":333,"children":334},{"class":146,"style":147},[335],{"type":119,"tag":144,"props":336,"children":337},{},[338],{"type":125,"value":339},"    nuxt-router.ts",{"type":125,"value":155},{"type":119,"tag":144,"props":342,"children":343},{"class":146,"style":147},[344],{"type":119,"tag":144,"props":345,"children":346},{},[347],{"type":125,"value":348},"    targets.ts",{"type":125,"value":155},{"type":119,"tag":144,"props":351,"children":352},{"class":146,"style":147},[353],{"type":119,"tag":144,"props":354,"children":355},{},[356],{"type":125,"value":357},"    types.ts",{"type":125,"value":155},{"type":119,"tag":144,"props":360,"children":361},{"class":146,"style":147},[362],{"type":119,"tag":144,"props":363,"children":364},{},[365],{"type":125,"value":366},"    vue\u002F",{"type":125,"value":155},{"type":119,"tag":144,"props":369,"children":370},{"class":146,"style":147},[371],{"type":119,"tag":144,"props":372,"children":373},{},[374],{"type":125,"value":375},"playground\u002F",{"type":125,"value":155},{"type":119,"tag":144,"props":378,"children":379},{"class":146,"style":147},[380],{"type":119,"tag":144,"props":381,"children":382},{},[383],{"type":125,"value":384},"test\u002F",{"type":125,"value":155},{"type":119,"tag":144,"props":387,"children":388},{"class":146,"style":147},[389],{"type":119,"tag":144,"props":390,"children":391},{},[392],{"type":125,"value":393},"  fixtures\u002F",{"type":125,"value":155},{"type":119,"tag":144,"props":396,"children":397},{"class":146,"style":147},[398],{"type":119,"tag":144,"props":399,"children":400},{},[401],{"type":125,"value":402},"  browser\u002F",{"type":125,"value":155},{"type":119,"tag":144,"props":405,"children":406},{"class":146,"style":147},[407],{"type":119,"tag":144,"props":408,"children":409},{},[410],{"type":125,"value":411},"docs\u002F",{"type":119,"tag":245,"props":413,"children":414},{},[415],{"type":125,"value":416},"Use Nuxt Module Builder for the package entry and runtime files. Use Nuxt Kit\nfor generated templates, imports, components, and type declarations. Do not\ninvent a second module build system.",{"type":119,"tag":127,"props":418,"children":420},{"id":419},"contract-tests",[421],{"type":125,"value":422},"Contract tests",{"type":119,"tag":245,"props":424,"children":425},{},[426],{"type":125,"value":427},"Unit and integration tests must prove:",{"type":119,"tag":429,"props":430,"children":431},"ul",{},[432,438,450,455,460,465,470,475,480,485,490],{"type":119,"tag":433,"props":434,"children":435},"li",{},[436],{"type":125,"value":437},"duplicate and empty definitions fail;",{"type":119,"tag":433,"props":439,"children":440},{},[441,443,448],{"type":125,"value":442},"the first step becomes active before ",{"type":119,"tag":139,"props":444,"children":445},{},[446],{"type":125,"value":447},"start()",{"type":125,"value":449}," resolves;",{"type":119,"tag":433,"props":451,"children":452},{},[453],{"type":125,"value":454},"false conditional steps cause no side effects;",{"type":119,"tag":433,"props":456,"children":457},{},[458],{"type":125,"value":459},"routes settle before preparation and target lookup;",{"type":119,"tag":433,"props":461,"children":462},{},[463],{"type":125,"value":464},"preparation cleanup runs once on every exit path;",{"type":119,"tag":433,"props":466,"children":467},{},[468],{"type":125,"value":469},"missing targets skip or fail according to policy;",{"type":119,"tag":433,"props":471,"children":472},{},[473],{"type":125,"value":474},"duplicate commands do not advance twice;",{"type":119,"tag":433,"props":476,"children":477},{},[478],{"type":125,"value":479},"conflicting commands fail predictably;",{"type":119,"tag":433,"props":481,"children":482},{},[483],{"type":125,"value":484},"cancellation aborts route, preparation, and target waits;",{"type":119,"tag":433,"props":486,"children":487},{},[488],{"type":125,"value":489},"replacement fully ends the previous tour; and",{"type":119,"tag":433,"props":491,"children":492},{},[493],{"type":125,"value":494},"another start works after every failure.",{"type":119,"tag":127,"props":496,"children":498},{"id":497},"browser-tests",[499],{"type":125,"value":500},"Browser tests",{"type":119,"tag":245,"props":502,"children":503},{},[504],{"type":125,"value":505},"Browser coverage must include late and removed targets, nested and horizontal\nscrolling, fixed and sticky elements, transformed ancestors, responsive layout\nmovement, cross-route tours, browser Back, keyboard-only use, focus restoration,\nEscape, reduced motion, a custom card, SSR hydration, and rapid double clicks.",{"type":119,"tag":245,"props":507,"children":508},{},[509],{"type":125,"value":510},"The release browser gate runs Chromium, Firefox, WebKit, mobile Chromium, and\nmobile WebKit serially. A fixture setup failure fails the suite; it does not\nskip the contract.",{"type":119,"tag":127,"props":512,"children":514},{"id":513},"package-proof",[515],{"type":125,"value":516},"Package proof",{"type":119,"tag":245,"props":518,"children":519},{},[520],{"type":125,"value":521},"The packed consumer must install the tarball, load the Nuxt module, build a clean\nfixture, and exercise the smallest public tour. Documentation becomes another\npacked-package consumer before release. Local source aliases are not sufficient\nrelease evidence.",{"title":190,"searchDepth":523,"depth":523,"links":524},4,[525,527,528,529,530],{"id":129,"depth":526,"text":132},2,{"id":259,"depth":526,"text":262},{"id":419,"depth":526,"text":422},{"id":497,"depth":526,"text":500},{"id":513,"depth":526,"text":516},"markdown","docs",{"source":534,"path":535,"stem":536,"dir":537,"extension":538},"content","docs\u002F3.design\u002F6.architecture-and-testing.md","docs\u002F3.design\u002F6.architecture-and-testing","design","md",{"requestedPath":102,"resolvedPath":102,"alternates":540},[],{"requested":542,"resolved":543,"usedFallback":9},{},{"locale":8},{"previous":545,"next":546},{"title":94,"id":95,"canonicalKey":96,"locale":8,"draft":9,"path":97},{"title":104,"id":105,"canonicalKey":106,"locale":8,"draft":9,"path":107},{"left":548,"top":548,"width":549,"height":549,"rotate":548,"vFlip":9,"hFlip":9,"body":550},0,24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"\u002F>\u003Cpath d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"\u002F>\u003C\u002Fg>",1788188689445]