{"_id":"@ai-markdown/vue","_rev":"3-e88c87097eaafaae03bdb9eff23ed9b7","name":"@ai-markdown/vue","dist-tags":{"beta":"3.0.0-beta.2","latest":"3.0.0","rc":"3.0.0-rc.1"},"versions":{"3.0.0-beta.2":{"name":"@ai-markdown/vue","version":"3.0.0-beta.2","license":"MIT","_id":"@ai-markdown/vue@3.0.0-beta.2","maintainers":[{"name":"aiephoenix","email":"aiephoenixbl@gmail.com"}],"homepage":"https://github.com/ai-markdown/ai-markdown/tree/main/packages/vue#readme","bugs":{"url":"https://github.com/ai-markdown/ai-markdown/issues"},"dist":{"shasum":"b9a05db820f74d70acb52cd45ceac64c8017decc","tarball":"https://registry.npmjs.org/@ai-markdown/vue/-/vue-3.0.0-beta.2.tgz","fileCount":14,"integrity":"sha512-WldsWFbn/NnxeznIHEdCtGEiFDMRm0J9dlfw98ilwqWUlqKeKwrX3SXf9I17KRQn2gEB8yz7BxGnKTmp6wAUcQ==","signatures":[{"sig":"MEQCIEjcDV75hzo5kvG7JNVRZppBbvX0uR0woR7yRch3zdmLAiA9CA2yQcm8ETLfI2SDIRYICbBEnBGIt1cfyNO68Bzvzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-markdown%2fvue@3.0.0-beta.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":302399},"main":"./dist/index.cjs","type":"module","_from":"file:/home/runner/work/_temp/first-publish-packs/ai-markdown-vue-3.0.0-beta.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.js","require":"./dist/index.cjs","development":{"import":"./dist/index.dev.js","require":"./dist/index.dev.cjs"}},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"test":"vitest --run","build":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsup && node scripts/assert-dist.mjs","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"aiephoenix","email":"aiephoenixbl@gmail.com"},"_resolved":"/home/runner/work/_temp/first-publish-packs/ai-markdown-vue-3.0.0-beta.2.tgz","_integrity":"sha512-WldsWFbn/NnxeznIHEdCtGEiFDMRm0J9dlfw98ilwqWUlqKeKwrX3SXf9I17KRQn2gEB8yz7BxGnKTmp6wAUcQ==","repository":{"url":"git+https://github.com/ai-markdown/ai-markdown.git","type":"git","directory":"packages/vue"},"_npmVersion":"10.9.8","description":"Vue 3 Markdown rendering, document coordination and streaming composables for ai-markdown.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"@types/hast":"^3.0.5","unist-util-visit":"^5.1.0","@ai-markdown/core":"3.0.0-beta.2","@ai-markdown/engine":"3.0.0-beta.2","property-information":"^7.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","@types/node":"^25.9.5","@vue/server-renderer":"^3.5.0"},"peerDependencies":{"vue":"^3.5.0","katex":"^0.16 || ^0.17"},"peerDependenciesMeta":{"katex":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vue_3.0.0-beta.2_1788963539579_0.8980581812969075","host":"s3://npm-registry-packages-npm-production"}},"3.0.0-rc.1":{"name":"@ai-markdown/vue","version":"3.0.0-rc.1","license":"MIT","_id":"@ai-markdown/vue@3.0.0-rc.1","maintainers":[{"name":"aiephoenix","email":"aiephoenixbl@gmail.com"}],"homepage":"https://github.com/ai-markdown/ai-markdown/tree/main/packages/vue#readme","bugs":{"url":"https://github.com/ai-markdown/ai-markdown/issues"},"dist":{"shasum":"ab8795eb63da0592240d6cccf1e535c5aa117a27","tarball":"https://registry.npmjs.org/@ai-markdown/vue/-/vue-3.0.0-rc.1.tgz","fileCount":14,"integrity":"sha512-lgX8lGSAxwHfEuDu9spWg1bOE1rOa9elGg+AxUAsiv/D7/6Fle55C/tqJ/L7n7x01HBG19SLXv3mJn06koTWyQ==","signatures":[{"sig":"MEQCIHSFxypxkePvYMuhY3jEqXSn+h5IcmxMNOB2e94ppF9eAiBJfTTAZDZLRmMhJB+0gBr3YHjjv3xUwibyf+sChbLBRQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-markdown%2fvue@3.0.0-rc.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":306472},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.js","require":"./dist/index.cjs","development":{"import":"./dist/index.dev.js","require":"./dist/index.dev.cjs"}},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"test":"vitest --run","build":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsup && node scripts/assert-dist.mjs","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d1eb31f5-cbc8-4819-a638-4a84ffaccf66"}},"repository":{"url":"git+https://github.com/ai-markdown/ai-markdown.git","type":"git","directory":"packages/vue"},"description":"Vue 3 Markdown rendering, document coordination and streaming composables for ai-markdown.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"@types/hast":"^3.0.5","unist-util-visit":"^5.1.0","@ai-markdown/core":"3.0.0-rc.1","@ai-markdown/engine":"3.0.0-rc.1","property-information":"^7.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","@types/node":"^25.9.5","@storybook/vue3-vite":"10.6.0","@vue/server-renderer":"^3.5.0","@ai-markdown/storybook-kit":"0.0.0"},"peerDependencies":{"vue":"^3.5.0","katex":"^0.16 || ^0.17"},"peerDependenciesMeta":{"katex":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vue_3.0.0-rc.1_1789052994621_0.8079720644453561","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@ai-markdown/vue","version":"3.0.0","description":"Vue 3 Markdown rendering, document coordination and streaming composables for ai-markdown.","type":"module","license":"MIT","engines":{"node":"^20.19.0 || >=22.12.0"},"sideEffects":["**/*.css"],"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"development":{"import":"./dist/index.dev.js","require":"./dist/index.dev.cjs"},"import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json","./styles.css":"./dist/styles.css"},"dependencies":{"@types/hast":"^3.0.5","unist-util-visit":"^5.1.0","property-information":"^7.1.0","@ai-markdown/core":"3.0.0","@ai-markdown/engine":"3.0.0"},"devDependencies":{"vue":"^3.5.0","@vue/server-renderer":"^3.5.0","@types/node":"^25.9.5","@storybook/vue3-vite":"10.6.0","@ai-markdown/storybook-kit":"0.0.0"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/ai-markdown/ai-markdown.git","directory":"packages/vue"},"homepage":"https://github.com/ai-markdown/ai-markdown/tree/main/packages/vue#readme","bugs":{"url":"https://github.com/ai-markdown/ai-markdown/issues"},"peerDependencies":{"vue":"^3.5.0","katex":"^0.16 || ^0.17"},"peerDependenciesMeta":{"katex":{"optional":true}},"scripts":{"build":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsup && node scripts/assert-dist.mjs","typecheck":"tsc --noEmit -p tsconfig.json","test":"vitest --run"},"_nodeVersion":"26.0.0","_id":"@ai-markdown/vue@3.0.0","dist":{"integrity":"sha512-8EEOXRgDrQeuGpllkg6oTNx3ho1T5chEcbWkBVvLxIQjYav+cWRu65uuI10LoB3O4x0Z0N199Xjm6DyNxwVIJw==","shasum":"638e45e4b0e134a9dbf42a88c704a075d9d0ea81","tarball":"https://registry.npmjs.org/@ai-markdown/vue/-/vue-3.0.0.tgz","fileCount":14,"unpackedSize":306436,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-markdown%2fvue@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC7Ix+6tE+QZxBSJKOWcHEeJztrOL7Xj06qR/RzBOrrfgIhALoP2H2p8xmZJYkIzzvbjc6mB0/4oLTu2J+7byfW8Int"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d1eb31f5-cbc8-4819-a638-4a84ffaccf66"}},"directories":{},"maintainers":[{"name":"aiephoenix","email":"aiephoenixbl@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vue_3.0.0_1789054138501_0.777002072354223"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-09T14:18:59.376Z","modified":"2026-09-10T15:28:59.073Z","3.0.0-beta.2":"2026-09-09T14:18:59.742Z","3.0.0-rc.1":"2026-09-10T15:09:54.760Z","3.0.0":"2026-09-10T15:28:58.636Z"},"bugs":{"url":"https://github.com/ai-markdown/ai-markdown/issues"},"license":"MIT","homepage":"https://github.com/ai-markdown/ai-markdown/tree/main/packages/vue#readme","repository":{"type":"git","url":"git+https://github.com/ai-markdown/ai-markdown.git","directory":"packages/vue"},"description":"Vue 3 Markdown rendering, document coordination and streaming composables for ai-markdown.","maintainers":[{"name":"aiephoenix","email":"aiephoenixbl@gmail.com"}],"readme":"# @ai-markdown/vue\n\n[![@ai-markdown/vue stable](https://img.shields.io/npm/v/@ai-markdown/vue?label=npm&color=blue)](https://www.npmjs.com/package/@ai-markdown/vue?activeTab=versions)\n[![@ai-markdown/vue monthly downloads](https://img.shields.io/npm/dm/@ai-markdown/vue?label=downloads%2Fmonth&color=blue)](https://www.npmjs.com/package/@ai-markdown/vue)\n[![TypeScript declarations included](https://img.shields.io/badge/TypeScript-included-3178c6?logo=typescript&logoColor=white)](https://github.com/ai-markdown/ai-markdown/tree/main/packages/vue)\n[![MIT license](https://img.shields.io/badge/license-MIT-blue)](https://github.com/ai-markdown/ai-markdown/blob/main/LICENSE)\n\n[![Vue ^3.5](https://img.shields.io/badge/Vue-%5E3.5-42b883?logo=vuedotjs&logoColor=white)](#requirements-and-dependencies)\n\nVue 3 Markdown rendering built on the framework-independent `@ai-markdown/core` and `@ai-markdown/engine`. This package supplies real Vue VNodes, server rendering and hydration, scoped document references, component/slot customization, smooth streaming and a measured streaming cursor. It replaces the earlier private lifecycle prototype.\n\n**Available starting with `3.0.0-beta.2`.** The earlier `3.0.0-beta.1` release did not include Vue. Vue joins the stable 3.0.0 train with the same shared engine and core as React.\n\n## Requirements and dependencies\n\n- Vue **3.5 or later within Vue 3** (`^3.5.0`). The adapter uses `useId()` for application-local IDs that match between server rendering and hydration. Earlier Vue 3 minors do not provide this API.\n- Node `^20.19.0 || >=22.12.0` for server/build consumers; verification records identify the actual tested Node version.\n- Modern browsers with `ResizeObserver`, `MutationObserver`, `requestAnimationFrame` and Web Crypto. The browser acceptance suite runs Chromium, Firefox and WebKit; this is not a claim that every browser/version has been exercised.\n- `@ai-markdown/core` and `@ai-markdown/engine` are ordinary dependencies at the exact release-train version. Applications do not need to install them separately. Vue remains a peer and is external to both ESM and CJS output.\n- KaTeX is an optional peer (`^0.16 || ^0.17`). Declare it directly when importing its stylesheet rather than depending on hoisting.\n\nInstall the stable release:\n\n```bash\npnpm add @ai-markdown/vue vue@^3.5.0 katex\n```\n\nSee [Getting started](../../docs/getting-started.md) for the package map and React/Vue API differences. The Vue package exposes its helpers from the root; it has no `/plugins` entry or React typography variants.\n\n## Minimal component\n\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport AIMarkdown from '@ai-markdown/vue';\nimport '@ai-markdown/vue/styles.css';\nimport 'katex/dist/katex.min.css';\n\nconst content = ref('# Answer\\n\\n**Markdown**, $x^2$ and 中文.');\n</script>\n\n<template>\n  <AIMarkdown :content=\"content\" />\n</template>\n```\n\nPass the **complete accumulated Markdown string**. Append decoded network data to your application state; the renderer does not own Fetch, SSE framing, UTF-8 decoding, cancellation or retries. Replacing the string is supported and invalidates retained parsing when necessary. `streaming` controls UI state; it is not the switch that enables incremental parsing.\n\n`styles.css` provides a small base stylesheet, including code overflow, tables and cursor animation. It is optional when the application supplies its own presentation. KaTeX CSS is separate. The renderer never uses `v-html` or `innerHTML` to insert the Markdown result.\n\n## Component props\n\n| Prop                       | Default                  | Contract                                                                                            |\n| -------------------------- | ------------------------ | --------------------------------------------------------------------------------------------------- |\n| `content`                  | Required                 | Complete current source string                                                                      |\n| `documentId`               | Vue `useId()`            | Explicit IDs coordinate only inside `AIMarkdownDocuments`; generated IDs stay standalone            |\n| `documentIndex`            | Mount order              | Optional ordering hint for the reference registry; supply it for reordered/remounted logical chunks |\n| `streaming`                | `false`                  | Passed to custom components and element slots, controls cursor and `aria-busy`                      |\n| `incrementalParse`         | `true` after mount       | Uses verified retained-prefix parsing; server and hydration's first render use the full pipeline    |\n| `preserveOrphanReferences` | `false`                  | Preserve unreferenced footnote definitions in rendered output                                       |\n| `enginePlugins`            | All five shipped plugins | Sealed catalog selection; membership changes, canonical ordering does not                           |\n| `contentPreprocessors`     | `[]`                     | Synchronous string transforms after built-in LaTeX normalization                                    |\n| `sanitizeSchema`           | Library schema           | Treat as immutable; derive a fresh schema with `extendSanitizeSchema`                               |\n| `urlTransform`             | Safe default transform   | Final attribute-specific URL policy after sanitization                                              |\n| `components`               | `{}`                     | Tag-to-Vue-component mapping                                                                        |\n| `metadata`                 | `undefined`              | Application-owned value passed to mapped components and scoped element slots                        |\n| `streamingCursor`          | `true`                   | Enable the cursor while streaming; custom rendering uses the `cursor` slot                          |\n\nRoot attributes such as `class`, `id` and `style` fall through to the wrapper. The wrapper establishes a relative positioning context for the cursor. Supplying a different `position` style can change that geometry.\n\n## Custom Vue components and slots\n\nA mapped component receives the sanitized element attributes plus `node`, `streaming` and `metadata`. Its default slot contains converted Vue children. Declare the props you consume and forward attributes deliberately; framework event handlers belong to your component code, not Markdown attributes.\n\n```vue\n<script setup lang=\"ts\">\nimport AIMarkdown from '@ai-markdown/vue';\nimport CodeBlock from './CodeBlock.vue';\nconst components = { code: CodeBlock };\n</script>\n\n<template>\n  <AIMarkdown content=\"**Hello**\" :components=\"components\" :metadata=\"{ messageId: 'a' }\"> </AIMarkdown>\n</template>\n```\n\nFor arbitrary VNode children, a render-function slot is often simpler than a template loop:\n\n```ts\nimport { h } from 'vue';\nimport AIMarkdown, { type MarkdownElementContext } from '@ai-markdown/vue';\n\nconst render = () =>\n  h(\n    AIMarkdown,\n    { content: '**Hello**' },\n    {\n      strong: ({ children, metadata }: MarkdownElementContext) =>\n        h('strong', { title: String(metadata ?? '') }, children),\n    }\n  );\n```\n\nAn element slot takes precedence over the matching `components` entry. Markdown text is not interpreted as a Vue template. The adapter rejects event attributes and DOM insertion properties even if a broadened sanitizer admits them. Custom components and slots are trusted application code and are responsible for their own output policy.\n\n## Multiple chunks in one document\n\n```vue\n<script setup lang=\"ts\">\nimport AIMarkdown, { AIMarkdownDocuments } from '@ai-markdown/vue';\nconst chunks = ['A claim[^source] and [site][url].', '[^source]: Shared citation\\n\\n[url]: https://example.com'];\n</script>\n\n<template>\n  <AIMarkdownDocuments>\n    <AIMarkdown\n      v-for=\"(chunk, index) in chunks\"\n      :key=\"index\"\n      :content=\"chunk\"\n      document-id=\"answer-1\"\n      :document-index=\"index\"\n    />\n  </AIMarkdownDocuments>\n</template>\n```\n\nChunks are intentionally complete logical Markdown sections. A code fence, table row or other syntax construct split across arbitrary transport chunks is not joined by the registry. Prefer one accumulated `content` unless the application genuinely needs independently mounted sections.\n\nReferences may precede definitions. The shared registry supplies canonical link/image destinations, global footnote numbering and occurrence IDs. The last registered chunk renders the aggregate footer. Updating/removing a definition updates readers; switching `documentId` releases the old registration. Different IDs and different provider instances remain independent.\n\nSSR renders each chunk's local content and local footnotes without registering or publishing contributions. The first hydration render uses the same path. Cross-chunk resolution becomes available after mounted contributions commit. Consequently, a definition supplied only by another chunk is not pre-resolved in server HTML. If server-only output needs fully resolved references, render the complete document through one component.\n\n## Smooth streaming and turn-taking\n\n`AIMarkdownSmoothStream` accepts the base props plus `pacing` (`smooth`, `balanced`, `responsive`) and `coordinate` (default `true`). Its initial content is shown completely, including SSR and remounts. Future appends animate. Finishing the source drains the remaining reveal before clearing the rendered streaming state. Replacements snap rather than replaying unrelated content.\n\nInside `AIMarkdownDocuments`, explicitly named smooth chunks share a turn-taking coordinator. A chunk mounted empty waits until earlier registered smooth chunks finish. A chunk mounted with content does not hide already visible text. Completion is sticky for the current registration: a later resumed stream does not re-gate successors. Reveal order is mount order; `documentIndex` orders references, not smooth turns.\n\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { AIMarkdownSmoothStream } from '@ai-markdown/vue';\n\nconst content = ref('');\nconst finished = ref(false);\n// Append decoded transport data to content.value; set finished.value on completion.\n</script>\n\n<template>\n  <AIMarkdownSmoothStream :content=\"content\" :streaming=\"!finished\" pacing=\"responsive\" document-id=\"answer-1\">\n    <template #waiting><span>Waiting for the previous section…</span></template>\n    <template #cursor><span>▍</span></template>\n  </AIMarkdownSmoothStream>\n</template>\n```\n\nThe `waiting` slot is used only when this component is inside `AIMarkdownDocuments` and an earlier smooth chunk is still producing or draining. The standalone example above does not enter that waiting state.\n\nThe component exposes `flush()` through its template ref. Flushing respects the engine's grapheme hold-back while the source is live; it does not pretend that an unfinished grapheme is complete.\n\nFor your own wrapper, call `useSmoothStream(() => ({ content, streaming, pacing }))` or `useDocumentSmoothStream(() => ({ content, streaming, pacing, documentId, coordinate }))` during setup. Returned `content` and `streaming` are read-only computed refs; the document variant also returns `pending`. Pass `.value` in render functions and let templates unwrap refs. Always pass a getter over live state rather than capturing a one-time object snapshot.\n\n## Cursor behavior\n\nThe cursor measures the final visible prose text using DOM ranges and follows content mutation, resizing and scrolling. Code, math, image and unsupported element tails hide it rather than anchoring to an earlier paragraph. Shared `deriveTailSignal` identifies invisible link definitions and footnote-definition tails; a footnote cursor is shown only when its actual footer is in this component. Observers and animation frames are released on unmount. The default animation respects reduced motion.\n\n## API and distribution\n\nThe root exports `AIMarkdown` (also default), `AIMarkdownDocuments`, `AIMarkdownSmoothStream`, `AIMarkdownStreamingCursor`, `useSmoothStream` and `useDocumentSmoothStream`, plus their prop/context/input types. It re-exports the sealed plugin catalog, LaTeX/remend preprocessor factories, schema extension and default URL policy. See the [checked public declaration](../../docs/api/vue.api.txt) for exact names and signatures.\n\nESM and CJS each have development and production entries, with matching declaration files. Vue, core and engine remain external. There is no React peer, React context or `use client` directive. The public package exposes only its root, stylesheet and `package.json`; lifecycle helpers and the HAST converter are implementation details.\n\n## Verification and scope\n\n```bash\npnpm build\npnpm --filter @ai-markdown/vue typecheck\npnpm --filter @ai-markdown/vue test\npnpm test:vue-browser\npnpm test:vue-browser:compat\npnpm check:public-api\npnpm test:packed-consumers\n```\n\nUnit tests exercise SSR, sanitization, custom rendering and lifecycle publication/release. Browser tests cover the three planned acceptance paths: standalone hydration; cross-chunk references and document switching; customization, smooth waiting/drain and cursor layout. Packed consumers load ESM/CJS in both export conditions, compile installed declarations and resolve CSS outside the workspace.\n\nThis implementation does not claim React/Mantine UI parity: Mantine remains React-only, and Vue has no built-in Mermaid/code-toolbar integration. Nuxt-specific packaging and KeepAlive/Suspense combinations require their own integration coverage before being advertised. Parsing correctness continues to use the repository's shared oracle and release soak gates.\n\n## Interactive examples\n\nRun `pnpm storybook:vue` from the repository root. The development launcher resolves package source and styles directly for live updates on port 6008; `pnpm storybook` also starts React and the combined entry on port 6006.\n\nThe chapter names and order follow the React catalog. Start with **Streaming/Streaming Basics**, then **Incremental Parsing**, **Smooth Streaming**, **Streaming Cursor**, **Turn Taking** and **Error Recovery** for the corresponding lifecycle contracts. **Documents/Cross-Chunk Coordination** covers late definitions and repeated footnotes; **Definition Lifecycle** covers updates and isolation. **Basics/Engine Plugins** demonstrates reactive plugin selection. **Customization/Custom Components** and **Metadata** cover mapping, scoped slots and context; **URL Sanitization**, **Content Preprocessors** and **Orphan References** cover output policies. Each chapter includes usage notes and browser assertions; relevant examples expose editable Controls.\n\nReact-specific typography tokens, extra-style registries, context factories, Mantine widgets and render profiling remain separate. The Vue Introduction explains those boundaries; the shared catalog guide maps all common chapters and records renamed Vue story URLs.\n\nGeneral examples read corpus excerpts. Cross-chunk and plugin syntax fixtures remain purpose-built to isolate their contracts. See the [catalog guide](../../docs/storybook.md) for comparable React examples and run `pnpm test:storybook:vue` to verify the Vue stories in Chromium.\n\n## Browser stress verification\n\nAfter building the workspace, run `pnpm test:vue-browser` from the repository root. This command is included in CI, release verification, and local preflight. It checks hydration, cross-chunk references, custom rendering, smooth-stream turn-taking, and cursor placement in Chromium.\n\nThe same command keeps a document provider mounted through 24 document lifecycles and 288 append updates. It checks that queued chunks wait for their predecessor, completion drains correctly, cancelling a producing predecessor releases its successor, replacement and document switches update the rendered result, and unmount releases every instrumented document subscription. Weak references to actual registries and smooth coordinators must clear after forced garbage collection while the provider remains mounted. This catches retained document state without relying on a noisy absolute heap-size threshold.\n\nThese are bounded browser regressions, not an engine equivalence soak or a proof of unlimited-session memory stability. Forced-GC ownership checks remain Chromium-specific; Firefox/WebKit run the functional hydration, reference, customization, smooth-stream and cursor paths through `pnpm test:vue-browser:compat`. These checks do not establish Nuxt, KeepAlive or Suspense integration. The engine's separate six-leg campaign does not substitute for these Vue lifecycle checks.\n","readmeFilename":""}