{"_id":"@cjh0/markstream-vue","_rev":"5-eb167af0c6d3414dfe8c665c999ba06d","name":"@cjh0/markstream-vue","dist-tags":{"latest":"1.2.2"},"versions":{"1.0.1":{"name":"@cjh0/markstream-vue","version":"1.0.1","keywords":["vue","vue3","markdown","markdown-to-html","markdown-renderer","vue-markdown","vue-markdown-renderer","vue-markdown-component","markdown-preview","markdown-viewer","vue-component","nuxt","vite","sse","ai-chat","streaming-markdown","html","renderer","custom-component","mermaid","progressive-mermaid","streaming-diff","diff-codeblock","large-documents","performance","real-time-preview","markstream-vue"],"author":{"name":"Simon He"},"license":"MIT","_id":"@cjh0/markstream-vue@1.0.1","maintainers":[{"name":"cjh0","email":"1054535289@qq.com"}],"homepage":"https://github.com/cjh-store/markstream-vue","bugs":{"url":"https://github.com/cjh-store/markstream-vue/issues"},"dist":{"shasum":"7ef7e5147ba43f05bc2cefb802824abd025802ee","tarball":"https://registry.npmjs.org/@cjh0/markstream-vue/-/markstream-vue-1.0.1.tgz","fileCount":21,"integrity":"sha512-PIOxLRafkDt7PLkKUG04+HI1y+n+wvqxRaOAchk/YwBu7QckbtaWrQV/tsQgrt3dPr0L3aFFd81Ai3AEROHmDQ==","signatures":[{"sig":"MEQCIGY7/mkfWDsfr8w65hCm1pklmBVkBiXHV45sMV8Mofp7AiBvNfmBCnHRMeuKYSWMS7gfqndWlEZ8cHG1oxxa/dsvUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":833013},"main":"./dist/index.js","type":"module","_from":"file:cjh0-markstream-vue-1.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./tailwind":"./dist/tailwind.ts","./index.css":"./dist/index.css","./index.px.css":"./dist/index.px.css","./index.tailwind.css":"./dist/index.tailwind.css","./workers/katexRenderer.worker":"./dist/workers/katexRenderer.worker.js","./workers/mermaidParser.worker":"./dist/workers/mermaidParser.worker.js"},"scripts":{"dev":"pnpm run -C playground dev","lint":"eslint . --cache","play":"pnpm run -C playground dev","test":"vitest","build":"vite build --mode npm && vite build --config vite.config.tailwind.ts --mode npm && node scripts/copy-tailwind-css.mjs && node scripts/generate-px-css.mjs && pnpm run build:dts","preview":"pnpm run -C playground preview","test:ui":"vitest --ui","docs:dev":"vitepress dev docs","lint:fix":"pnpm run lint --fix","build:dts":"rollup -c ./scripts/rollup.dts.config.mjs && node ./scripts/clean-dts.cjs","changelog":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","check:ssr":"vitest --run -t \"SSR import safety\"","typecheck":"vue-tsc --noEmit","build:demo":"vite build","build:view":"vite preview","docs:build":"vitepress build docs","docs:serve":"vitepress serve docs","play:build":"pnpm run -C playground build","size:check":"node scripts/check-package-size.mjs","docs:deploy":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build && pnpm docs:serve","test:update":"vitest -u","build:parser":"pnpm run -C packages/markdown-parser build","docs:sync-zh":"node scripts/sync-zh-docs.mjs","build:analyze":"ANALYZE=true pnpm build","docs:build:ci":"pnpm run build && vitepress build docs","docs:build:gh":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build","docs:check-zh":"node scripts/check-zh-parity.mjs","check:peer-deps":"node ./scripts/check-peer-deps.cjs","docs:build:netlify":"VITEPRESS_BASE=/ pnpm docs:build"},"_npmUser":{"name":"cjh0","email":"1054535289@qq.com"},"_resolved":"/tmp/1a06406106f17ee9818fa9da899bfd96/cjh0-markstream-vue-1.0.1.tgz","_integrity":"sha512-PIOxLRafkDt7PLkKUG04+HI1y+n+wvqxRaOAchk/YwBu7QckbtaWrQV/tsQgrt3dPr0L3aFFd81Ai3AEROHmDQ==","repository":{"url":"git+https://github.com/cjh-store/markstream-vue.git","type":"git","homepage":"https://github.com/cjh-store/markstream-vue#readme"},"_npmVersion":"10.8.2","description":"Vue 3 Markdown renderer optimized for large docs: progressive Mermaid, streaming diff code blocks, and fast real-time preview.","directories":{},"lint-staged":{"*.{vue,js,ts,jsx,tsx,md,json}":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.0","dependencies":{"markdown-it-ts":"0.0.4","markdown-it-ins":"^4.0.0","markdown-it-sub":"^2.0.0","markdown-it-sup":"^2.0.0","@floating-ui/dom":"^1.7.5","markdown-it-mark":"^4.0.0","markdown-it-footnote":"^4.0.0","markdown-it-container":"^4.0.0","markdown-it-task-checkbox":"^1.0.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vue":"^3.5.27","vite":"^7.3.1","bumpp":"^8.2.1","eslint":"^9.39.2","rollup":"^3.29.5","terser":"^5.46.0","vitest":"^4.0.18","vue-tsc":"^2.2.12","lz-string":"^1.5.0","vitepress":"^1.6.4","@vitest/ui":"^4.0.18","picocolors":"^1.1.1","typescript":"^5.9.3","@types/node":"^18.19.130","lint-staged":"^13.3.0","postcss-cli":"^11.0.1","tailwindcss":"^3.4.19","autoprefixer":"^10.4.24","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.4","vite-svg-loader":"^5.1.0","markdown-it-emoji":"^3.0.0","rollup-plugin-dts":"^5.3.1","vite-plugin-pages":"^0.33.3","@vitejs/plugin-vue":"^5.2.4","@antfu/eslint-config":"^5.4.1","unplugin-vue-components":"^28.8.0","@types/markdown-it-emoji":"^3.0.1","rollup-plugin-visualizer":"^6.0.5","unplugin-class-extractor":"^0.0.22","conventional-changelog-cli":"^5.0.0"},"peerDependencies":{"vue":">=3.0.0","katex":">=0.16.22","shiki":"^3.13.0","mermaid":">=11","vue-i18n":">=9","stream-monaco":">=0.0.17","@terrastruct/d2":">=0.1.33","stream-markdown":">=0.0.14","@antv/infographic":"^0.2.3"},"peerDependenciesMeta":{"katex":{"optional":true},"shiki":{"optional":true},"mermaid":{"optional":true},"vue-i18n":{"optional":true},"stream-monaco":{"optional":true},"@terrastruct/d2":{"optional":true},"stream-markdown":{"optional":true},"@antv/infographic":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/markstream-vue_1.0.1_1772768993710_0.4351621488226438","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@cjh0/markstream-vue","version":"1.1.0","keywords":["vue","vue3","markdown","markdown-to-html","markdown-renderer","vue-markdown","vue-markdown-renderer","vue-markdown-component","markdown-preview","markdown-viewer","vue-component","nuxt","vite","sse","ai-chat","streaming-markdown","html","renderer","custom-component","mermaid","progressive-mermaid","streaming-diff","diff-codeblock","large-documents","performance","real-time-preview","markstream-vue"],"author":{"name":"Simon He"},"license":"MIT","_id":"@cjh0/markstream-vue@1.1.0","maintainers":[{"name":"cjh0","email":"1054535289@qq.com"}],"homepage":"https://github.com/cjh-store/markstream-vue","bugs":{"url":"https://github.com/cjh-store/markstream-vue/issues"},"dist":{"shasum":"faa11a328a298cc7b1bdc1f249a47ccf63d4f4ae","tarball":"https://registry.npmjs.org/@cjh0/markstream-vue/-/markstream-vue-1.1.0.tgz","fileCount":21,"integrity":"sha512-vbym9GgBMXJ4dzf65kqX/Q0ZMNTG0BcVBvmv1GLsQI7WYqujKLdgvP3tWSt4yAm6ZQVXQTO+wan+wnCbccmMPw==","signatures":[{"sig":"MEUCIQDTYOWFtmdSXAftZr1Et5r9cElduzhLH3/57I6gnEHzmgIgCYrxgySzrCHTdH4daxF/AdS85cPd9gwTPi0lqGDaso4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":832710},"main":"./dist/index.js","type":"module","_from":"file:cjh0-markstream-vue-1.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./tailwind":"./dist/tailwind.ts","./index.css":"./dist/index.css","./index.px.css":"./dist/index.px.css","./index.tailwind.css":"./dist/index.tailwind.css","./workers/katexRenderer.worker":"./dist/workers/katexRenderer.worker.js","./workers/mermaidParser.worker":"./dist/workers/mermaidParser.worker.js"},"scripts":{"dev":"pnpm run -C playground dev","lint":"eslint . --cache","play":"pnpm run -C playground dev","test":"vitest","build":"vite build --mode npm && vite build --config vite.config.tailwind.ts --mode npm && node scripts/copy-tailwind-css.mjs && node scripts/generate-px-css.mjs && pnpm run build:dts","preview":"pnpm run -C playground preview","test:ui":"vitest --ui","docs:dev":"vitepress dev docs","lint:fix":"pnpm run lint --fix","build:dts":"rollup -c ./scripts/rollup.dts.config.mjs && node ./scripts/clean-dts.cjs","changelog":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","check:ssr":"vitest --run -t \"SSR import safety\"","typecheck":"vue-tsc --noEmit","build:demo":"vite build","build:view":"vite preview","docs:build":"vitepress build docs","docs:serve":"vitepress serve docs","play:build":"pnpm run -C playground build","size:check":"node scripts/check-package-size.mjs","docs:deploy":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build && pnpm docs:serve","test:update":"vitest -u","build:parser":"pnpm run -C packages/markdown-parser build","docs:sync-zh":"node scripts/sync-zh-docs.mjs","build:analyze":"ANALYZE=true pnpm build","docs:build:ci":"pnpm run build && vitepress build docs","docs:build:gh":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build","docs:check-zh":"node scripts/check-zh-parity.mjs","check:peer-deps":"node ./scripts/check-peer-deps.cjs","docs:build:netlify":"VITEPRESS_BASE=/ pnpm docs:build"},"_npmUser":{"name":"cjh0","email":"1054535289@qq.com"},"_resolved":"/tmp/ec4e3c2606e5605099ede8897d0d6c98/cjh0-markstream-vue-1.1.0.tgz","_integrity":"sha512-vbym9GgBMXJ4dzf65kqX/Q0ZMNTG0BcVBvmv1GLsQI7WYqujKLdgvP3tWSt4yAm6ZQVXQTO+wan+wnCbccmMPw==","repository":{"url":"git+https://github.com/cjh-store/markstream-vue.git","type":"git","homepage":"https://github.com/cjh-store/markstream-vue#readme"},"_npmVersion":"10.8.2","description":"Vue 3 Markdown renderer optimized for large docs: progressive Mermaid, streaming diff code blocks, and fast real-time preview.","directories":{},"lint-staged":{"*.{vue,js,ts,jsx,tsx,md,json}":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.0","dependencies":{"markdown-it-ts":"0.0.4","markdown-it-ins":"^4.0.0","markdown-it-sub":"^2.0.0","markdown-it-sup":"^2.0.0","@floating-ui/dom":"^1.7.5","markdown-it-mark":"^4.0.0","markdown-it-footnote":"^4.0.0","markdown-it-container":"^4.0.0","markdown-it-task-checkbox":"^1.0.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vue":"^3.5.27","vite":"^7.3.1","bumpp":"^8.2.1","eslint":"^9.39.2","rollup":"^3.29.5","terser":"^5.46.0","vitest":"^4.0.18","vue-tsc":"^2.2.12","lz-string":"^1.5.0","vitepress":"^1.6.4","@vitest/ui":"^4.0.18","picocolors":"^1.1.1","typescript":"^5.9.3","@types/node":"^18.19.130","lint-staged":"^13.3.0","postcss-cli":"^11.0.1","tailwindcss":"^3.4.19","autoprefixer":"^10.4.24","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.4","vite-svg-loader":"^5.1.0","markdown-it-emoji":"^3.0.0","rollup-plugin-dts":"^5.3.1","vite-plugin-pages":"^0.33.3","@vitejs/plugin-vue":"^5.2.4","@antfu/eslint-config":"^5.4.1","unplugin-vue-components":"^28.8.0","@types/markdown-it-emoji":"^3.0.1","rollup-plugin-visualizer":"^6.0.5","unplugin-class-extractor":"^0.0.22","conventional-changelog-cli":"^5.0.0"},"peerDependencies":{"vue":">=3.0.0","katex":">=0.16.22","shiki":"^3.13.0","mermaid":">=11","vue-i18n":">=9","stream-monaco":">=0.0.17","@terrastruct/d2":">=0.1.33","stream-markdown":">=0.0.14","@antv/infographic":"^0.2.3"},"peerDependenciesMeta":{"katex":{"optional":true},"shiki":{"optional":true},"mermaid":{"optional":true},"vue-i18n":{"optional":true},"stream-monaco":{"optional":true},"@terrastruct/d2":{"optional":true},"stream-markdown":{"optional":true},"@antv/infographic":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/markstream-vue_1.1.0_1772790067069_0.5682626466419167","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@cjh0/markstream-vue","version":"1.2.0","keywords":["vue","vue3","markdown","markdown-to-html","markdown-renderer","vue-markdown","vue-markdown-renderer","vue-markdown-component","markdown-preview","markdown-viewer","vue-component","nuxt","vite","sse","ai-chat","streaming-markdown","html","renderer","custom-component","mermaid","progressive-mermaid","streaming-diff","diff-codeblock","large-documents","performance","real-time-preview","markstream-vue"],"author":{"name":"Simon He"},"license":"MIT","_id":"@cjh0/markstream-vue@1.2.0","maintainers":[{"name":"cjh0","email":"1054535289@qq.com"}],"homepage":"https://github.com/cjh-store/markstream-vue","bugs":{"url":"https://github.com/cjh-store/markstream-vue/issues"},"dist":{"shasum":"856d9fe918ced8d178477c7abd965471b1d742bf","tarball":"https://registry.npmjs.org/@cjh0/markstream-vue/-/markstream-vue-1.2.0.tgz","fileCount":21,"integrity":"sha512-BcCcCLYBQPw7rzya45EN6uuUntEfJH5k54/44kPjDp5AS4/FlgxSm4ctya9E0cH0E8QjacUdCVeE1azS9xcORA==","signatures":[{"sig":"MEUCIQC4vm07t7IiidLPqZU68exqzNyqk5UzhVls+fsTXGw9qQIgRu+qJjsmzdD8OmmGbqIZZQqCBU2x0apATyiefJsnMt4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":833507},"main":"./dist/index.js","type":"module","_from":"file:cjh0-markstream-vue-1.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./tailwind":"./dist/tailwind.ts","./index.css":"./dist/index.css","./index.px.css":"./dist/index.px.css","./index.tailwind.css":"./dist/index.tailwind.css","./workers/katexRenderer.worker":"./dist/workers/katexRenderer.worker.js","./workers/mermaidParser.worker":"./dist/workers/mermaidParser.worker.js"},"scripts":{"dev":"pnpm run -C playground dev","lint":"eslint . --cache","play":"pnpm run -C playground dev","test":"vitest","build":"vite build --mode npm && vite build --config vite.config.tailwind.ts --mode npm && node scripts/copy-tailwind-css.mjs && node scripts/generate-px-css.mjs && pnpm run build:dts","preview":"pnpm run -C playground preview","test:ui":"vitest --ui","docs:dev":"vitepress dev docs","lint:fix":"pnpm run lint --fix","build:dts":"rollup -c ./scripts/rollup.dts.config.mjs && node ./scripts/clean-dts.cjs","changelog":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","check:ssr":"vitest --run -t \"SSR import safety\"","typecheck":"vue-tsc --noEmit","build:demo":"vite build","build:view":"vite preview","docs:build":"vitepress build docs","docs:serve":"vitepress serve docs","play:build":"pnpm run -C playground build","size:check":"node scripts/check-package-size.mjs","docs:deploy":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build && pnpm docs:serve","test:update":"vitest -u","build:parser":"pnpm run -C packages/markdown-parser build","docs:sync-zh":"node scripts/sync-zh-docs.mjs","build:analyze":"ANALYZE=true pnpm build","docs:build:ci":"pnpm run build && vitepress build docs","docs:build:gh":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build","docs:check-zh":"node scripts/check-zh-parity.mjs","check:peer-deps":"node ./scripts/check-peer-deps.cjs","docs:build:netlify":"VITEPRESS_BASE=/ pnpm docs:build"},"_npmUser":{"name":"cjh0","email":"1054535289@qq.com"},"_resolved":"/tmp/a480853955f3ab022e8f5cf50d448226/cjh0-markstream-vue-1.2.0.tgz","_integrity":"sha512-BcCcCLYBQPw7rzya45EN6uuUntEfJH5k54/44kPjDp5AS4/FlgxSm4ctya9E0cH0E8QjacUdCVeE1azS9xcORA==","repository":{"url":"git+https://github.com/cjh-store/markstream-vue.git","type":"git","homepage":"https://github.com/cjh-store/markstream-vue#readme"},"_npmVersion":"10.8.2","description":"Vue 3 Markdown renderer optimized for large docs: progressive Mermaid, streaming diff code blocks, and fast real-time preview.","directories":{},"lint-staged":{"*.{vue,js,ts,jsx,tsx,md,json}":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.1","dependencies":{"markdown-it-ts":"0.0.4","markdown-it-ins":"^4.0.0","markdown-it-sub":"^2.0.0","markdown-it-sup":"^2.0.0","@floating-ui/dom":"^1.7.5","markdown-it-mark":"^4.0.0","markdown-it-footnote":"^4.0.0","markdown-it-container":"^4.0.0","markdown-it-task-checkbox":"^1.0.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vue":"^3.5.27","vite":"^7.3.1","bumpp":"^8.2.1","eslint":"^9.39.2","rollup":"^3.29.5","terser":"^5.46.0","vitest":"^4.0.18","vue-tsc":"^2.2.12","lz-string":"^1.5.0","vitepress":"^1.6.4","@vitest/ui":"^4.0.18","picocolors":"^1.1.1","typescript":"^5.9.3","@types/node":"^18.19.130","lint-staged":"^13.3.0","postcss-cli":"^11.0.1","tailwindcss":"^3.4.19","autoprefixer":"^10.4.24","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.4","vite-svg-loader":"^5.1.0","markdown-it-emoji":"^3.0.0","rollup-plugin-dts":"^5.3.1","vite-plugin-pages":"^0.33.3","@vitejs/plugin-vue":"^5.2.4","@antfu/eslint-config":"^5.4.1","unplugin-vue-components":"^28.8.0","@types/markdown-it-emoji":"^3.0.1","rollup-plugin-visualizer":"^6.0.5","unplugin-class-extractor":"^0.0.22","conventional-changelog-cli":"^5.0.0"},"peerDependencies":{"vue":">=3.0.0","katex":">=0.16.22","shiki":"^3.13.0","mermaid":">=11","vue-i18n":">=9","stream-monaco":">=0.0.17","@terrastruct/d2":">=0.1.33","stream-markdown":">=0.0.14","@antv/infographic":"^0.2.3"},"peerDependenciesMeta":{"katex":{"optional":true},"shiki":{"optional":true},"mermaid":{"optional":true},"vue-i18n":{"optional":true},"stream-monaco":{"optional":true},"@terrastruct/d2":{"optional":true},"stream-markdown":{"optional":true},"@antv/infographic":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/markstream-vue_1.2.0_1773976864047_0.9110492026163308","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@cjh0/markstream-vue","version":"1.2.1","keywords":["vue","vue3","markdown","markdown-to-html","markdown-renderer","vue-markdown","vue-markdown-renderer","vue-markdown-component","markdown-preview","markdown-viewer","vue-component","nuxt","vite","sse","ai-chat","streaming-markdown","html","renderer","custom-component","mermaid","progressive-mermaid","streaming-diff","diff-codeblock","large-documents","performance","real-time-preview","markstream-vue"],"author":{"name":"Simon He"},"license":"MIT","_id":"@cjh0/markstream-vue@1.2.1","maintainers":[{"name":"cjh0","email":"1054535289@qq.com"}],"homepage":"https://github.com/cjh-store/markstream-vue","bugs":{"url":"https://github.com/cjh-store/markstream-vue/issues"},"dist":{"shasum":"4e112ce67f8f5457925aee87ddd4e11e0541dfb0","tarball":"https://registry.npmjs.org/@cjh0/markstream-vue/-/markstream-vue-1.2.1.tgz","fileCount":21,"integrity":"sha512-XFO4Bn4NsfNiAe5EdEaly7Gfu1PsAcndo9msMJmhxIIidbpnatLUsncDUfG/aps8T+Pum1l7iE5QLwE/o9ZrCg==","signatures":[{"sig":"MEUCIQDop9dLAvMSk12ucvY2bxViR6QZe0tMoQ456J6iJELDLQIgMDgxh/EfsHEG2NIgt/FIL298ZCt48ofOgDbw0SK7slo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":835028},"main":"./dist/index.js","type":"module","_from":"file:cjh0-markstream-vue-1.2.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./tailwind":"./dist/tailwind.ts","./index.css":"./dist/index.css","./index.px.css":"./dist/index.px.css","./index.tailwind.css":"./dist/index.tailwind.css","./workers/katexRenderer.worker":"./dist/workers/katexRenderer.worker.js","./workers/mermaidParser.worker":"./dist/workers/mermaidParser.worker.js"},"scripts":{"dev":"pnpm run -C playground dev","lint":"eslint . --cache","play":"pnpm run -C playground dev","test":"vitest","build":"vite build --mode npm && vite build --config vite.config.tailwind.ts --mode npm && node scripts/copy-tailwind-css.mjs && node scripts/generate-px-css.mjs && pnpm run build:dts","preview":"pnpm run -C playground preview","test:ui":"vitest --ui","docs:dev":"vitepress dev docs","lint:fix":"pnpm run lint --fix","build:dts":"rollup -c ./scripts/rollup.dts.config.mjs && node ./scripts/clean-dts.cjs","changelog":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","check:ssr":"vitest --run -t \"SSR import safety\"","typecheck":"vue-tsc --noEmit","build:demo":"vite build","build:view":"vite preview","docs:build":"vitepress build docs","docs:serve":"vitepress serve docs","play:build":"pnpm run -C playground build","size:check":"node scripts/check-package-size.mjs","docs:deploy":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build && pnpm docs:serve","test:update":"vitest -u","build:parser":"pnpm run -C packages/markdown-parser build","docs:sync-zh":"node scripts/sync-zh-docs.mjs","build:analyze":"ANALYZE=true pnpm build","docs:build:ci":"pnpm run build && vitepress build docs","docs:build:gh":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build","docs:check-zh":"node scripts/check-zh-parity.mjs","check:peer-deps":"node ./scripts/check-peer-deps.cjs","docs:build:netlify":"VITEPRESS_BASE=/ pnpm docs:build"},"_npmUser":{"name":"cjh0","email":"1054535289@qq.com"},"_resolved":"/tmp/9c347e74b06569ec75b9cdba74c22936/cjh0-markstream-vue-1.2.1.tgz","_integrity":"sha512-XFO4Bn4NsfNiAe5EdEaly7Gfu1PsAcndo9msMJmhxIIidbpnatLUsncDUfG/aps8T+Pum1l7iE5QLwE/o9ZrCg==","repository":{"url":"git+https://github.com/cjh-store/markstream-vue.git","type":"git","homepage":"https://github.com/cjh-store/markstream-vue#readme"},"_npmVersion":"10.8.2","description":"Vue 3 Markdown renderer optimized for large docs: progressive Mermaid, streaming diff code blocks, and fast real-time preview.","directories":{},"lint-staged":{"*.{vue,js,ts,jsx,tsx,md,json}":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.1","dependencies":{"markdown-it-ts":"0.0.4","markdown-it-ins":"^4.0.0","markdown-it-sub":"^2.0.0","markdown-it-sup":"^2.0.0","@floating-ui/dom":"^1.7.5","markdown-it-mark":"^4.0.0","markdown-it-footnote":"^4.0.0","markdown-it-container":"^4.0.0","markdown-it-task-checkbox":"^1.0.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vue":"^3.5.27","vite":"^7.3.1","bumpp":"^8.2.1","eslint":"^9.39.2","rollup":"^3.29.5","terser":"^5.46.0","vitest":"^4.0.18","vue-tsc":"^2.2.12","lz-string":"^1.5.0","vitepress":"^1.6.4","@vitest/ui":"^4.0.18","picocolors":"^1.1.1","typescript":"^5.9.3","@types/node":"^18.19.130","lint-staged":"^13.3.0","postcss-cli":"^11.0.1","tailwindcss":"^3.4.19","autoprefixer":"^10.4.24","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.4","vite-svg-loader":"^5.1.0","markdown-it-emoji":"^3.0.0","rollup-plugin-dts":"^5.3.1","vite-plugin-pages":"^0.33.3","@vitejs/plugin-vue":"^5.2.4","@antfu/eslint-config":"^5.4.1","unplugin-vue-components":"^28.8.0","@types/markdown-it-emoji":"^3.0.1","rollup-plugin-visualizer":"^6.0.5","unplugin-class-extractor":"^0.0.22","conventional-changelog-cli":"^5.0.0"},"peerDependencies":{"vue":">=3.0.0","katex":">=0.16.22","shiki":"^3.13.0","mermaid":">=11","vue-i18n":">=9","stream-monaco":">=0.0.17","@terrastruct/d2":">=0.1.33","stream-markdown":">=0.0.14","@antv/infographic":"^0.2.3"},"peerDependenciesMeta":{"katex":{"optional":true},"shiki":{"optional":true},"mermaid":{"optional":true},"vue-i18n":{"optional":true},"stream-monaco":{"optional":true},"@terrastruct/d2":{"optional":true},"stream-markdown":{"optional":true},"@antv/infographic":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/markstream-vue_1.2.1_1773978572021_0.7502431726443581","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@cjh0/markstream-vue","type":"module","version":"1.2.2","description":"Vue 3 Markdown renderer optimized for large docs: progressive Mermaid, streaming diff code blocks, and fast real-time preview.","author":{"name":"Simon He"},"license":"MIT","publishConfig":{"access":"public"},"homepage":"https://github.com/cjh-store/markstream-vue","repository":{"type":"git","url":"git+https://github.com/cjh-store/markstream-vue.git","homepage":"https://github.com/cjh-store/markstream-vue#readme"},"bugs":{"url":"https://github.com/cjh-store/markstream-vue/issues"},"keywords":["vue","vue3","markdown","markdown-to-html","markdown-renderer","vue-markdown","vue-markdown-renderer","vue-markdown-component","markdown-preview","markdown-viewer","vue-component","nuxt","vite","sse","ai-chat","streaming-markdown","html","renderer","custom-component","mermaid","progressive-mermaid","streaming-diff","diff-codeblock","large-documents","performance","real-time-preview","markstream-vue"],"sideEffects":["**/*.css"],"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./index.css":"./dist/index.css","./index.px.css":"./dist/index.px.css","./index.tailwind.css":"./dist/index.tailwind.css","./tailwind":"./dist/tailwind.ts","./workers/katexRenderer.worker":"./dist/workers/katexRenderer.worker.js","./workers/mermaidParser.worker":"./dist/workers/mermaidParser.worker.js"},"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","peerDependencies":{"@antv/infographic":"^0.2.3","@terrastruct/d2":">=0.1.33","katex":">=0.16.22","mermaid":">=11","shiki":"^3.13.0","stream-markdown":">=0.0.14","stream-monaco":">=0.0.17","vue":">=3.0.0","vue-i18n":">=9"},"peerDependenciesMeta":{"@antv/infographic":{"optional":true},"@terrastruct/d2":{"optional":true},"katex":{"optional":true},"mermaid":{"optional":true},"shiki":{"optional":true},"stream-markdown":{"optional":true},"stream-monaco":{"optional":true},"vue-i18n":{"optional":true}},"dependencies":{"@floating-ui/dom":"^1.7.5","markdown-it-container":"^4.0.0","markdown-it-footnote":"^4.0.0","markdown-it-ins":"^4.0.0","markdown-it-mark":"^4.0.0","markdown-it-sub":"^2.0.0","markdown-it-sup":"^2.0.0","markdown-it-task-checkbox":"^1.0.6","markdown-it-ts":"0.0.4"},"devDependencies":{"@antfu/eslint-config":"^5.4.1","@types/markdown-it-emoji":"^3.0.1","@types/node":"^18.19.130","@vitejs/plugin-vue":"^5.2.4","@vitest/ui":"^4.0.18","@vue/test-utils":"^2.4.6","autoprefixer":"^10.4.24","bumpp":"^8.2.1","conventional-changelog-cli":"^5.0.0","eslint":"^9.39.2","lint-staged":"^13.3.0","lz-string":"^1.5.0","markdown-it-emoji":"^3.0.0","picocolors":"^1.1.1","postcss-cli":"^11.0.1","rollup":"^3.29.5","rollup-plugin-dts":"^5.3.1","rollup-plugin-visualizer":"^6.0.5","tailwindcss":"^3.4.19","terser":"^5.46.0","tsx":"^4.21.0","typescript":"^5.9.3","unplugin-class-extractor":"^0.0.22","unplugin-vue-components":"^28.8.0","vite":"^7.3.1","vite-plugin-dts":"^4.5.4","vite-plugin-pages":"^0.33.3","vite-svg-loader":"^5.1.0","vitepress":"^1.6.4","vitest":"^4.0.18","vue":"^3.5.27","vue-tsc":"^2.2.12"},"lint-staged":{"*.{vue,js,ts,jsx,tsx,md,json}":"eslint --fix"},"scripts":{"dev":"pnpm run -C playground dev","test":"vitest","lint":"eslint . --cache","lint:fix":"pnpm run lint --fix","test:ui":"vitest --ui","test:update":"vitest -u","typecheck":"vue-tsc --noEmit","check:ssr":"vitest --run -t \"SSR import safety\"","play":"pnpm run -C playground dev","play:build":"pnpm run -C playground build","preview":"pnpm run -C playground preview","build:parser":"pnpm run -C packages/markdown-parser build","build":"vite build --mode npm && vite build --config vite.config.tailwind.ts --mode npm && node scripts/copy-tailwind-css.mjs && node scripts/generate-px-css.mjs && pnpm run build:dts","build:analyze":"ANALYZE=true pnpm build","size:check":"node scripts/check-package-size.mjs","docs:dev":"vitepress dev docs","docs:sync-zh":"node scripts/sync-zh-docs.mjs","docs:check-zh":"node scripts/check-zh-parity.mjs","docs:build":"vitepress build docs","docs:build:ci":"pnpm run build && vitepress build docs","docs:build:netlify":"VITEPRESS_BASE=/ pnpm docs:build","docs:build:gh":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build","docs:serve":"vitepress serve docs","docs:deploy":"VITEPRESS_BASE=/markstream-vue/ pnpm docs:build && pnpm docs:serve","build:dts":"rollup -c ./scripts/rollup.dts.config.mjs && node ./scripts/clean-dts.cjs","build:demo":"vite build","build:view":"vite preview","changelog":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","check:peer-deps":"node ./scripts/check-peer-deps.cjs"},"_id":"@cjh0/markstream-vue@1.2.2","_integrity":"sha512-8QpNUyX3M7nAPVQeAT3AWjOLvv/hQvG9pKbEFh+8jWwoCu+aGRLPDXH+MqL0ZyUZjh2ZP7rJ6K0L0v8ko6rLeQ==","_resolved":"/tmp/e1abd9f1ba187afe724aafd9952c9428/cjh0-markstream-vue-1.2.2.tgz","_from":"file:cjh0-markstream-vue-1.2.2.tgz","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-8QpNUyX3M7nAPVQeAT3AWjOLvv/hQvG9pKbEFh+8jWwoCu+aGRLPDXH+MqL0ZyUZjh2ZP7rJ6K0L0v8ko6rLeQ==","shasum":"a7c13cab43b12c09bd882bc7877d5afc594aad3e","tarball":"https://registry.npmjs.org/@cjh0/markstream-vue/-/markstream-vue-1.2.2.tgz","fileCount":21,"unpackedSize":835327,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC7+hxNQC3n5v+d3cCBHlKiJG/Wt2XM/9Tcc8MFvaxoiwIgS2xcwT5W7fOI72f+2pO6I6vLzP5I1DV0M2uWXXvYZUo="}]},"_npmUser":{"name":"cjh0","email":"1054535289@qq.com"},"directories":{},"maintainers":[{"name":"cjh0","email":"1054535289@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/markstream-vue_1.2.2_1774418109803_0.18737208465469668"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-06T03:49:53.589Z","modified":"2026-03-25T05:55:10.166Z","1.0.1":"2026-03-06T03:49:53.940Z","1.1.0":"2026-03-06T09:41:07.262Z","1.2.0":"2026-03-20T03:21:04.193Z","1.2.1":"2026-03-20T03:49:32.179Z","1.2.2":"2026-03-25T05:55:10.029Z"},"bugs":{"url":"https://github.com/cjh-store/markstream-vue/issues"},"author":{"name":"Simon He"},"license":"MIT","homepage":"https://github.com/cjh-store/markstream-vue","keywords":["vue","vue3","markdown","markdown-to-html","markdown-renderer","vue-markdown","vue-markdown-renderer","vue-markdown-component","markdown-preview","markdown-viewer","vue-component","nuxt","vite","sse","ai-chat","streaming-markdown","html","renderer","custom-component","mermaid","progressive-mermaid","streaming-diff","diff-codeblock","large-documents","performance","real-time-preview","markstream-vue"],"repository":{"type":"git","url":"git+https://github.com/cjh-store/markstream-vue.git","homepage":"https://github.com/cjh-store/markstream-vue#readme"},"description":"Vue 3 Markdown renderer optimized for large docs: progressive Mermaid, streaming diff code blocks, and fast real-time preview.","maintainers":[{"name":"cjh0","email":"1054535289@qq.com"}],"readme":"# markstream-vue\n\n> 针对 Vue 3 的高性能、流式友好型 Markdown 渲染组件 — 支持渐进式 Mermaid、流式 diff 代码块以及为大文档优化的实时预览。\n\n[![NPM version](https://img.shields.io/npm/v/markstream-vue?color=a1b858&label=)](https://www.npmjs.com/package/markstream-vue)\n[![English](https://img.shields.io/badge/docs-English-blue)](README.md)\n[![Docs](https://img.shields.io/badge/docs-中文文档-blue)](https://markstream-vue-docs.simonhe.me/zh/guide/)\n[![Playground](https://img.shields.io/badge/playground-在线体验-34c759)](https://markstream-vue.simonhe.me/)\n[![Test page](https://img.shields.io/badge/test-可分享复现-0A84FF)](https://markstream-vue.simonhe.me/test)\n[![NPM downloads](https://img.shields.io/npm/dm/markstream-vue)](https://www.npmjs.com/package/markstream-vue)\n[![Bundle size](https://img.shields.io/bundlephobia/minzip/markstream-vue)](https://bundlephobia.com/package/markstream-vue)\n[![Release](https://img.shields.io/github/v/release/Simon-He95/markstream-vue?display_name=release&logo=github)](https://github.com/Simon-He95/markstream-vue/releases)\n[![Discussions](https://img.shields.io/github/discussions/Simon-He95/markstream-vue?logo=github)](https://github.com/Simon-He95/markstream-vue/discussions)\n[![Discord](https://img.shields.io/discord/986352439269560380?label=discord&logo=discord&logoColor=fff&color=5865F2)](https://discord.gg/vkzdkjeRCW)\n[![Support](https://img.shields.io/badge/support-guide-ff6f61)](./SUPPORT.md)\n[![Security](https://img.shields.io/badge/security-policy-8A2BE2)](./SECURITY.md)\n[![CI](https://github.com/Simon-He95/markstream-vue/actions/workflows/ci.yml/badge.svg)](https://github.com/Simon-He95/markstream-vue/actions/workflows/ci.yml)\n[![License](https://img.shields.io/npm/l/markstream-vue)](./license)\n\n需要其他框架/版本？\n\n- Vue 2.6：请使用 [`markstream-vue2`](./packages/markstream-vue2/README.md)（基础移植版，功能更精简）\n- React：请参考 `packages/markstream-react` 的说明 [`packages/markstream-react/README.md`](./packages/markstream-react/README.md)（初步移植版）\n\n## 目录\n\n- [速览](#速览)\n- [立即试用](#-立即试用)\n- [社区与支持](#-社区与支持)\n- [快速上手](#-快速上手)\n- [常用命令](#-常用命令)\n- [30 秒流式接入](#-30-秒流式接入)\n- [性能模式](#-性能模式)\n- [关键属性速览](#-关键属性速览)\n- [适用场景](#-适用场景)\n- [快问快答](#-快问快答)\n- [为什么选择 markstream-vue](#-为什么选择-markstream-vue而不是普通-markdown-渲染器)\n- [Roadmap](#-roadmap快照)\n- [发布](#-发布)\n- [案例与展示](#-案例与展示)\n- [介绍视频](#介绍视频)\n- [核心特性](#核心特性)\n- [贡献与社区](#-贡献与社区)\n- [故障排查](#故障排查--常见问题)\n- [鸣谢](#鸣谢)\n- [Star 历史](#star-历史)\n- [许可](#许可)\n\n> 📖 所有详细文档、API、示例和高级用法已迁移至 VitePress 中文文档站点：\n> https://markstream-vue-docs.simonhe.me/zh/guide/\n\n## 速览\n\n- 为 **流式 Markdown**（AI/聊天/SSE）打造，避免闪烁，内存可预期。\n- **双渲染模式**：长文档虚拟化窗口，或“打字机”式增量批次。\n- **渐进式图表**（Mermaid）与 **流式代码块**（Monaco/Shiki），跟上 diff/增量输出。\n- 同时支持 **Markdown 字符串或预解析节点**，可在 Markdown 中嵌入 **自定义 Vue 组件**。\n- TypeScript 优先，开箱默认即可上线（导入 CSS 即用）。\n\n## 🚀 立即试用\n\n- Playground（交互演示）： https://markstream-vue.simonhe.me/\n- 交互测试页（可分享链接，便于复现）： https://markstream-vue.simonhe.me/test\n- 文档： https://markstream-vue-docs.simonhe.me/zh/guide/\n- AI/LLM 项目索引（中文）： https://markstream-vue-docs.simonhe.me/llms.zh-CN\n- AI/LLM 项目索引（英文）： https://markstream-vue-docs.simonhe.me/llms\n- 一键 StackBlitz 体验： https://stackblitz.com/github/Simon-He95/markstream-vue?file=playground/src/App.vue\n- 更新日志： [CHANGELOG.md](./CHANGELOG.md)\n- Nuxt playground：`pnpm play:nuxt`\n- Discord： https://discord.gg/vkzdkjeRCW\n\n## 💬 社区与支持\n\n- Discussions：https://github.com/Simon-He95/markstream-vue/discussions\n- Discord：https://discord.gg/vkzdkjeRCW\n- Issues：请使用模板并附上复现链接（https://markstream-vue.simonhe.me/test）\n\n测试页内置编辑器 + 实时预览，并提供“生成分享链接”功能（过长内容会回退为直接打开或预填 GitHub Issue）。\n\n## ⚡ 快速上手\n\n```bash\npnpm add markstream-vue\n# npm install markstream-vue\n# yarn add markstream-vue\n```\n\n```ts\nimport MarkdownRender from 'markstream-vue'\n// main.ts\nimport { createApp } from 'vue'\nimport 'markstream-vue/index.css'\n\ncreateApp({\n  components: { MarkdownRender },\n  template: '<MarkdownRender custom-id=\"docs\" :content=\"doc\" />',\n  setup() {\n    const doc = '# Hello markstream-vue\\\\n\\\\n支持 **流式** 节点。'\n    return { doc }\n  },\n}).mount('#app')\n```\n\n确保在 CSS reset（如 `@tailwind base` 或 `@unocss/reset`）之后导入 `markstream-vue/index.css`，最好放在 `@layer components` 中以避免 Tailwind/UnoCSS 覆盖组件样式。根据需求再按需安装可选 peer 依赖：`stream-monaco`（Monaco 代码块）、`shiki` + `stream-markdown`（Shiki 高亮）、`mermaid`（Mermaid 图表）、`katex`（数学公式）。\n如果你的移动端会主动调大根字号（`html`/`body`），建议改用 `markstream-vue/index.px.css`，避免 `rem` 跟随根字号导致整体放大。\n\n渲染器的 CSS 会作用于内部 `.markstream-vue` 容器下，以尽量降低对全局的影响；如果你脱离 `MarkdownRender` 单独使用导出的节点组件，请在外层包一层带 `markstream-vue` 类名的容器。\n\n暗色变量可以通过给祖先节点加 `.dark`，或直接给 `MarkdownRender` 传入 `:is-dark=\"true\"`（仅对渲染器生效）。\n\n按需启用重型依赖：\n\n```ts\nimport { enableKatex, enableMermaid } from 'markstream-vue'\nimport 'markstream-vue/index.css'\nimport 'katex/dist/katex.min.css'\n\n// 安装对应 peer 后再启用\nenableMermaid()\nenableKatex()\n```\n\n<details>\n<summary>可选：CDN Worker（KaTeX / Mermaid）</summary>\n\n如果你是用 CDN 引入 KaTeX，并且希望公式在 Web Worker 中渲染（不打包 / 不安装可选 peer），可以注入一个“CDN 加载 KaTeX”的 worker：\n\n```ts\nimport { createKaTeXWorkerFromCDN, setKaTeXWorker } from 'markstream-vue'\n\nconst { worker } = createKaTeXWorkerFromCDN({\n  mode: 'classic',\n  // worker 内通过 importScripts() 加载的 UMD 构建\n  katexUrl: 'https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.js',\n  mhchemUrl: 'https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/contrib/mhchem.min.js',\n})\n\nif (worker)\n  setKaTeXWorker(worker)\n```\n\n如果你是用 CDN 引入 Mermaid，并且希望 Mermaid 的解析在 worker 中进行（用于渐进式 Mermaid 渲染的后台解析），可以注入 Mermaid parser worker：\n\n```ts\nimport { createMermaidWorkerFromCDN, setMermaidWorker } from 'markstream-vue'\n\nconst { worker } = createMermaidWorkerFromCDN({\n  // Mermaid CDN 构建通常是 ESM，推荐 module worker。\n  mode: 'module',\n  workerOptions: { type: 'module' },\n  mermaidUrl: 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs',\n})\n\nif (worker)\n  setMermaidWorker(worker)\n```\n\n</details>\n\n<details>\n<summary>Nuxt 快速接入</summary>\n\n```ts\n// plugins/markstream-vue.client.ts\nimport { defineNuxtPlugin } from '#app'\nimport MarkdownRender from 'markstream-vue'\nimport 'markstream-vue/index.css'\n\nexport default defineNuxtPlugin((nuxtApp) => {\n  nuxtApp.vueApp.component('MarkdownRender', MarkdownRender)\n})\n```\n\n然后在页面中直接使用 `<MarkdownRender :content=\\\"md\\\" />`。\n\n</details>\n\n## 🛠️ 常用命令\n\n- `pnpm dev` — playground 开发\n- `pnpm play:nuxt` — Nuxt playground 开发\n- `pnpm build` — 构建库与 CSS\n- `pnpm build:analyze` — 带可视化报告的构建（输出 `bundle-visualizer.html`、`bundle-visualizer-tailwind.html`）\n- `pnpm size:check` — 本地执行 dist + npm 包体积预算检查（与 CI 一致）\n- `pnpm test` — Vitest 测试（快照用 `pnpm test:update`）\n- `pnpm typecheck` / `pnpm lint` — 类型检查与 Lint\n\n## ⏱️ 30 秒流式接入\n\n用 SSE / WebSocket 增量渲染 Markdown：\n\n```ts\nimport type { ParsedNode } from 'markstream-vue'\nimport MarkdownRender, { getMarkdown, parseMarkdownToStructure } from 'markstream-vue'\nimport { ref } from 'vue'\n\nconst nodes = ref<ParsedNode[]>([])\nconst buffer = ref('')\nconst md = getMarkdown()\n\nfunction addChunk(chunk: string) {\n  buffer.value += chunk\n  nodes.value = parseMarkdownToStructure(buffer.value, md)\n}\n\n// 例如在 SSE / onmessage 处理器中\neventSource.onmessage = event => addChunk(event.data)\n\n// template\n// <MarkdownRender\n//   :nodes=\"nodes\"\n//   :max-live-nodes=\"0\"\n//   :batch-rendering=\"{\n//     renderBatchSize: 16,\n//     renderBatchDelay: 8,\n//   }\"\n// />\n```\n\n按页面需要切换渲染风格：\n\n- 虚拟化窗口（默认）：长文档滚动平稳、内存稳定。\n- 增量批次：将 `:max-live-nodes=\"0\"`，获得更明显的“打字机”体验与轻量占位。\n\n<details>\n<summary>进阶：SSR / Worker / 流式续写</summary>\n\n### SSR / Worker（确定性输出）\n\n在服务端或 Worker 预解析 Markdown，前端直接渲染节点：\n\n```ts\n// server or worker\nimport { getMarkdown, parseMarkdownToStructure } from 'markstream-vue'\n\nconst md = getMarkdown()\nconst nodes = parseMarkdownToStructure('# Hello\\n\\n服务端解析一次', md)\n// 将 nodes JSON 下发到客户端\n```\n\n```vue\n<!-- client -->\n<MarkdownRender :nodes=\"nodesFromServer\" />\n```\n\n这样可以避免前端解析，保持 SSR/水合的一致性。\n\n### 混合模式：SSR + 流式续写\n\n- 服务端：解析首批 Markdown，序列化 `initialNodes`（以及 `initialMarkdown`，便于后续流式追加）。\n- 客户端：用相同的解析配置水合，然后继续流式追加：\n\n```ts\nimport type { ParsedNode } from 'markstream-vue'\nimport { getMarkdown, parseMarkdownToStructure } from 'markstream-vue'\nimport { ref } from 'vue'\n\nconst nodes = ref<ParsedNode[]>(initialNodes)\nconst buffer = ref(initialMarkdown)\nconst md = getMarkdown() // 与服务端保持一致\n\nfunction addChunk(chunk: string) {\n  buffer.value += chunk\n  nodes.value = parseMarkdownToStructure(buffer.value, md)\n}\n```\n\n这样无需重新解析 SSR 内容，同时还能通过 SSE/WebSocket 持续追加后续片段。\n\n> 提示：当你明确知道流已结束（消息已完整）时，建议用 `parseMarkdownToStructure(buffer.value, md, { final: true })` 或在组件上设置 `:final=\"true\"`，以关闭解析器的中间态（loading）策略，避免末尾残留分隔符（如 `$$`、未闭合 code fence）导致永久 loading。\n\n</details>\n\n## ⚙️ 性能模式\n\n- **默认虚拟化窗口**：保持 `max-live-nodes` 默认值（`320`），渲染器会立即渲染当前窗口的节点，同时只保留有限数量的 DOM 节点，实现平滑滚动与可控内存，占位骨架极少。\n- **增量流式模式**：当需要更明显的“打字机”体验时，将 `:max-live-nodes=\"0\"`。这会关闭虚拟化并启用 `batchRendering` 系列参数控制的增量渲染，新的节点会以小批次加上占位骨架的形式进入视图。\n\n可根据页面类型选择最合适的模式：虚拟化适合长文档/回溯需求，增量流式适合聊天或 AI 输出面板。\n\n> 小贴士：聊天场景可使用 `max-live-nodes=\"0\"`，并将 `renderBatchSize` 调小（如 `16`），`renderBatchDelay` 设为较小值（如 `8ms`），获得平滑的“打字”节奏且避免大段跳变。如需限制单帧 CPU，可适当调低 `renderBatchBudgetMs`。\n\n## 🧰 关键属性速览\n\n- `content` 与 `nodes`：传原始 Markdown 或预解析节点（来自 `parseMarkdownToStructure`）。\n- `max-live-nodes`：`320`（默认虚拟化）或 `0`（增量批次）。\n- `batchRendering`：用 `initialRenderBatchSize`、`renderBatchSize`、`renderBatchDelay`、`renderBatchBudgetMs` 微调批次。\n- `enableMermaid` / `enableKatex`：用于（重新）启用重型依赖或自定义 loader（可与 `disableMermaid` / `disableKatex` 配合）。\n- `parse-options`：在组件上复用解析钩子（如 `preTransformTokens`、`requireClosingStrong`）。\n- `final`：标记“最终态/流结束”，关闭中间态 loading 解析并强制收敛未闭合结构。\n- `custom-html-tags`：扩展流式 HTML 白名单并将这些标签输出为自定义节点，便于 `setCustomComponents` 直接映射（如 `['thinking']`）。\n- `setCustomComponents(customId?, mapping)`：为自定义标签/标记注册内嵌 Vue 组件（传 `custom-id` 可限定作用域）。\n\n示例：将 Markdown 占位符映射到 Vue 组件（作用域）\n\n```ts\nimport { setCustomComponents } from 'markstream-vue'\n\nsetCustomComponents('docs', {\n  CALLOUT: () => import('./components/Callout.vue'),\n})\n\n// Markdown: [[CALLOUT:warning title=\"提示\" body=\"具体内容\"]]\n```\n\n渲染时使用同一个 `custom-id`：\n\n```vue\n<MarkdownRender\n  :content=\"doc\"\n  custom-id=\"docs\"\n/>\n```\n\n解析钩子示例（服务端/客户端保持一致）：\n\n```vue\n<MarkdownRender\n  :content=\"doc\"\n  :parse-options=\"{\n    requireClosingStrong: true,\n    preTransformTokens: (tokens) => tokens,\n  }\"\n/>\n```\n\n## 🔥 适用场景\n\n- AI / 聊天界面：Markdown token 通过 SSE/WebSocket 持续抵达，要求无闪烁与稳定内存。\n- 文档、变更日志、知识库：需要即时加载，同时保持长内容滚动的流畅性。\n- 流式 diff / 代码审查：Monaco 增量更新让大代码块也能跟上变更。\n- 图表与示意：Mermaid 渐进式渲染，避免阻塞主渲染。\n- Markdown 驱动的界面中嵌入 Vue 组件（callout、交互式挂件、CTA 等）。\n\n## ❓ 快问快答\n\n- Mermaid / KaTeX 不显示？安装对应 peer（`mermaid` / `katex`），并传入 `:enable-mermaid=\"true\"` / `:enable-katex=\"true\"` 或调用 loader 设置函数。如果你是用 CDN `<script>` 引入，库也会自动读取 `window.mermaid` / `window.katex`。\n- CDN + KaTeX worker：如果你不打包 `katex` 但仍希望公式在 worker 中渲染（不占主线程），可以用 `createKaTeXWorkerFromCDN()` 创建一个“CDN 加载 KaTeX”的 worker，然后通过 `setKaTeXWorker()` 注入。\n- 体积问题：可选 peer 不会被打包，CSS 只需导入一次；对代码块可用 Shiki（`MarkdownCodeBlockNode`）替代 Monaco。低频语言图标已拆分为异步 chunk 并按需加载；如果希望首屏就避免图标回退，可在空闲时调用 `preloadExtendedLanguageIcons()` 预热。\n- 自定义 UI：通过 `setCustomComponents`（全局或作用域）注册组件，在 Markdown 中放置占位标记并映射到 Vue 组件。\n\n## 🆚 为什么选择 markstream-vue，而不是普通 Markdown 渲染器？\n\n| 需求 | 普通 Markdown 预览 | markstream-vue |\n| --- | --- | --- |\n| 流式输入 | 全量重渲染、易闪烁 | 虚拟窗口 + 增量批次 |\n| 大代码块 | 重新高亮速度慢 | Monaco 流式更新 + 可选 Shiki |\n| 图表 | 解析/渲染阻塞 | Mermaid 渐进式渲染与回退 |\n| 自定义 UI | 插槽有限 | Markdown 内嵌 Vue 组件与类型化节点 |\n| 长文档 | 内存峰值高 | 可配置 live-node 上限，滚动稳定 |\n\n## 🗺️ Roadmap（快照）\n\n- 更多「即开即用」模板（Vite / Nuxt / Tailwind）与 StackBlitz 更新。\n- 代码块预设扩展（适合 diff 的 Shiki 主题、Monaco 装饰/标注辅助）。\n- AI / 聊天场景的 Cookbook（SSE/WebSocket、重试与续传、Markdown 中间态处理）。\n- 展示更多在 Markdown 中嵌入 Vue 组件的示例与实践。\n\n## 📦 发布\n\n- 最新版本与升级提示：[Releases](https://github.com/Simon-He95/markstream-vue/releases)\n- 完整历史：[CHANGELOG.md](./CHANGELOG.md)\n- 最新亮点（0.0.3-beta.1/beta.0）：\n  - 解析器升级到 `stream-markdown-parser@0.0.36`，修复多项解析问题。\n  - Monaco 升级，更多语言/主题，代码块对 diff 更友好。\n  - Playground 增加 HTML/SVG 预览对话框与 AST 调试视图。\n\n## 🧭 案例与展示\n\n用 markstream-vue 做了什么？欢迎提 PR 把你的项目放到这里（附链接 + 截图/GIF）。理想场景：AI/聊天界面、流式文档、diff/代码审查、或在 Markdown 驱动页面中嵌入 Vue 组件。\n\n- **FlowNote** —— 流式 Markdown 笔记示例（SSE + 虚拟化窗口）：https://markstream-vue.simonhe.me/\n- **AI Chat 场景** —— playground “test” 页展示增量批次与分享链接：https://markstream-vue.simonhe.me/test\n\n## 介绍视频\n\n一段短视频介绍了 markstream-vue 的关键特性与使用方式。\n\n[![在 Bilibili 查看介绍](https://i1.hdslb.com/bfs/archive/f073718bd0e51acaea436d7197880478213113c6.jpg)](https://www.bilibili.com/video/BV17Z4qzpE9c/)\n\n在 Bilibili 上观看： [Open in Bilibili](https://www.bilibili.com/video/BV17Z4qzpE9c/)\n\n## 核心特性\n\n- ⚡ 极致性能：为流式场景设计的最小化重渲染和高效 DOM 更新\n- 🌊 流式优先：原生支持不完整或频繁更新的 token 化 Markdown 内容\n- 🧠 Monaco 流式更新：高性能的 Monaco 集成，支持大代码块的平滑增量更新\n- 🪄 渐进式 Mermaid：图表在语法可用时即时渲染，并在后续更新中完善\n- 🧩 自定义组件：允许在 Markdown 内容中嵌入自定义 Vue 组件\n- 📝 完整 Markdown 支持：表格、公式、Emoji、复选框、代码块等\n- 🔄 实时更新：支持增量内容而不破坏格式\n- 📦 TypeScript 优先：提供完善的类型定义与智能提示\n- 🔌 零配置：开箱即可在 Vue 3 项目中使用\n- 🎨 灵活的代码块渲染：可选 Monaco 编辑器 (`CodeBlockNode`) 或轻量的 Shiki 高亮 (`MarkdownCodeBlockNode`)\n- 🧰 解析工具集：[`stream-markdown-parser`](./packages/markdown-parser) 文档现已覆盖如何在 Worker/SSE 流中复用解析器、直接向 `<MarkdownRender :nodes>` 输送 AST、以及注册全局插件/数学辅助函数的方式。\n\n## 🙌 贡献与社区\n\n- 阅读贡献指南与 PR 模板：[CONTRIBUTING.md](./CONTRIBUTING.md)\n- 遵守 [行为准则](./CODE_OF_CONDUCT.md)。\n- 提交 Issue 时使用模板；渲染问题尽量附上测试页复现链接：https://markstream-vue.simonhe.me/test\n- 有问题先讨论：https://github.com/Simon-He95/markstream-vue/discussions\n- 实时交流：Discord https://discord.gg/vkzdkjeRCW\n- 新手贡献入口：[good first issues](https://github.com/Simon-He95/markstream-vue/labels/good%20first%20issue)\n- 支持与求助入口：[SUPPORT.md](./SUPPORT.md)\n- 提交 PR 时遵循 Conventional Commits，渲染/解析改动补充测试，UI 改动附上截图/GIF。\n- 如果本项目对你有帮助，欢迎点 Star、分享给需要的人，助力项目持续演进。\n- 安全披露：请通过 [SECURITY.md](./SECURITY.md) 中的邮件私下报告潜在漏洞。\n\n### 快速参与的方式\n\n- 在现有 issue 中补充复现链接/截图。\n- 完善文档或示例（尤其是流式 + SSR/Worker 场景）。\n- 分享 playground/test 链接，展示性能边界或有趣用法。\n\n## 故障排查 & 常见问题\n\n详细故障排查与常见问题已迁移至文档站点：\nhttps://markstream-vue-docs.simonhe.me/zh/guide/troubleshooting\n\n如需更多帮助，请到 GitHub Issues 创建问题：\nhttps://github.com/Simon-He95/markstream-vue/issues\n\n### 快速提交问题\n\n1. 在测试页复现并点击“生成分享链接”：https://markstream-vue.simonhe.me/test\n2. 打开 Bug 模板并附上链接与截图：https://github.com/Simon-He95/markstream-vue/issues/new?template=bug_report.yml\n\n## 鸣谢\n\n### 贡献者\n\n感谢所有为项目做出贡献的开发者！\n\n[![Contributors](https://contrib.rocks/image?repo=Simon-He95/markstream-vue)](https://github.com/Simon-He95/markstream-vue/graphs/contributors)\n\n### 依赖项目\n\n本项目使用并受益于：\n\n- [stream-monaco](https://github.com/Simon-He95/stream-monaco)\n- [stream-markdown](https://github.com/Simon-He95/stream-markdown)\n- [mermaid](https://mermaid-js.github.io/mermaid)\n- [katex](https://katex.org/)\n- [shiki](https://github.com/shikijs/shiki)\n- [markdown-it-ts](https://github.com/Simon-He95/markdown-it-ts)\n\n感谢这些项目的作者与贡献者！\n\n## Star 历史\n\n[![Star History Chart](https://api.star-history.com/svg?repos=Simon-He95/markstream-vue&type=Date)](https://www.star-history.com/#Simon-He95/markstream-vue&Date)\n\n## 许可\n\n[MIT](./license) © [Simon He](https://github.com/Simon-He95)\n","readmeFilename":"README.zh-CN.md"}