{"_id":"streamdown-svelte","_rev":"6-bfffe58173da1c749bd6df6733f2a91c","name":"streamdown-svelte","dist-tags":{"latest":"3.0.6"},"versions":{"3.0.1":{"name":"streamdown-svelte","version":"3.0.1","keywords":["svelte"],"license":"MIT","_id":"streamdown-svelte@3.0.1","maintainers":[{"name":"betterandbetterii","email":"betterspace1@outlook.com"}],"homepage":"https://github.com/BetterAndBetterII/svelte-streamdown#readme","bugs":{"url":"https://github.com/BetterAndBetterII/svelte-streamdown/issues"},"dist":{"shasum":"b259c36591f29a0d137dfff1575715307a59700a","tarball":"https://registry.npmjs.org/streamdown-svelte/-/streamdown-svelte-3.0.1.tgz","fileCount":189,"integrity":"sha512-FLT4xackRkxd8Urh5UynDbvDa4Y3y7BRaoJCLeaxHB730qdRmDnQEfWRfQszKkSzCzx09HKRiBc4tbzwxpEjLA==","signatures":[{"sig":"MEYCIQDcaSqIxoGvMqBukb62wJj/ZsSiN/LrFIXUIHAH9BgNDQIhAIN+PuWPTGL0e8vuv2Ue82j9p7N3CzqfE0qMCy6xUDY3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444197},"type":"module","_from":"file:artifacts/publish-check/root/streamdown-svelte-3.0.1.tgz","types":"./dist/index.d.ts","volta":{"node":"22.22.1","pnpm":"10.32.1"},"svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./code":{"types":"./dist/Elements/Code.svelte.d.ts","svelte":"./dist/Elements/Code.svelte"},"./math":{"types":"./dist/Elements/Math.svelte.d.ts","svelte":"./dist/Elements/Math.svelte"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./remend":{"types":"./dist/remend.d.ts","import":"./dist/remend.js"},"./mermaid":{"types":"./dist/Elements/Mermaid.svelte.d.ts","svelte":"./dist/Elements/Mermaid.svelte"},"./plugins":{"types":"./dist/plugins.d.ts","import":"./dist/plugins.js"},"./url-policy":{"types":"./dist/url-policy.d.ts","import":"./dist/url-policy.js"},"./icon-context":{"types":"./dist/icon-context.d.ts","import":"./dist/icon-context.js"},"./plugin-context":{"types":"./dist/plugin-context.d.ts","import":"./dist/plugin-context.js"},"./detect-direction":{"types":"./dist/detect-direction.d.ts","import":"./dist/detect-direction.js"}},"scripts":{"dev":"vite dev","lint":"prettier --check .","test":"npm run test:unit -- --run","bench":"pnpm bench:ported && pnpm bench:compare","build":"pnpm build:packages && vite build && pnpm package:root","check":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","preview":"vite preview","test:ui":"vitest --ui","test:unit":"vitest --reporter=dot --silent=passed-only","check:watch":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","verify:pack":"node scripts/verify-pack.mjs","bench:ported":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/ported --run --project server --outputJson coverage/benchmarks/ported.json","package:root":"svelte-kit sync && svelte-package && publint","bench:compare":"node scripts/benchmark-report.mjs","test:coverage":"node scripts/coverage-report.mjs","build:packages":"pnpm -r --filter './packages/*' build","test:contracts":"vitest --reporter=dot --silent=passed-only --run tests/contracts/*.spec.ts","verify:exports":"node scripts/verify-exports.mjs","release:metadata":"node scripts/release-metadata.mjs","verify:toolchain":"node scripts/verify-toolchain.mjs","bench:compare:raw":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/compare --run --project server --outputJson coverage/benchmarks/compare.json && node scripts/benchmark-summary.mjs coverage/benchmarks/compare.json","verify:api-surface":"pnpm verify:reference-api-surface && pnpm verify:local-api-surface && pnpm test:contracts","verify:clean-build":"node scripts/verify-clean-build.mjs","test:coverage:parity":"node scripts/coverage-report.mjs parity","test:coverage:parser":"node scripts/coverage-report.mjs parser","test:playwright:parity":"playwright test tests/playwright/parity --reporter=dot --quiet","verify:workspace-smoke":"node scripts/verify-workspace-smoke.mjs","verify:release-metadata":"node scripts/verify-release-metadata.mjs","snapshot:commonmark-spec":"node scripts/fetch-commonmark-spec.mjs","test:coverage:components":"node scripts/coverage-report.mjs components","verify:dependency-policy":"node scripts/verify-dependency-policy.mjs","verify:local-api-surface":"node scripts/local-api-surface.mjs --check","test:playwright:streaming":"playwright test tests/playwright/parity/streaming.spec.ts --reporter=dot --quiet","docs:test-migration-status":"node scripts/test-migration-status.mjs --write","snapshot:local-api-surface":"node scripts/local-api-surface.mjs --write","test:playwright:commonmark":"playwright test tests/playwright/commonmark --reporter=dot --quiet","verify:reference-api-surface":"node scripts/reference-api-surface.mjs --check","verify:test-migration-status":"node scripts/test-migration-status.mjs --check","snapshot:reference-api-surface":"node scripts/reference-api-surface.mjs --write"},"_npmUser":{"name":"betterandbetterii","email":"betterspace1@outlook.com"},"_resolved":"/home/yuzhong/workspace/svelte-streamdown/artifacts/publish-check/root/streamdown-svelte-3.0.1.tgz","_integrity":"sha512-FLT4xackRkxd8Urh5UynDbvDa4Y3y7BRaoJCLeaxHB730qdRmDnQEfWRfQszKkSzCzx09HKRiBc4tbzwxpEjLA==","repository":{"url":"git+https://github.com/BetterAndBetterII/svelte-streamdown.git","type":"git"},"_npmVersion":"10.9.4","description":"Svelte port of [Vercel Streamdown](https://streamdown.ai/) for rendering AI-generated markdown with streaming-friendly parsing, hardened HTML handling, extensible plugins, and Svelte-native customization hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.1","dependencies":{"clsx":"^2.1.1","katex":"^0.16.22","shiki":"^3.13.0","marked":"^16.2.1","remend":"1.3.0","mermaid":"^11.11.0","unified":"^11.0.5","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","rehype-harden":"^1.1.8","remark-rehype":"^11.1.2","@shikijs/langs":"^3.17.1","tailwind-merge":"^3.3.1","@shikijs/themes":"^3.17.1","rehype-sanitize":"^6.0.0","@floating-ui/dom":"^1.7.4","rehype-stringify":"^10.0.1","unist-util-visit":"^5.1.0","remark-cjk-friendly":"^2.0.1","@streamdown-svelte/plugin-core":"1.0.0","remark-cjk-friendly-gfm-strikethrough":"^2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vite":"^7.3.2","pngjs":"^7.0.0","react":"^19.2.4","svelte":"^5.0.0","vitest":"^3.2.3","publint":"^0.3.2","prettier":"^3.4.2","wrangler":"^4.34.0","react-dom":"^19.2.4","@vitest/ui":"^3.2.4","pixelmatch":"^7.1.0","playwright":"^1.53.0","typescript":"^5.0.0","@types/node":"^24.6.1","remark-math":"^6.0.0","tailwindcss":"^4.0.0","@types/mdast":"^4.0.4","@types/pngjs":"^6.0.5","@types/react":"^19.2.14","@types/unist":"^3.0.3","rehype-katex":"^7.0.1","svelte-check":"^4.0.0","@sveltejs/kit":"^2.22.0","svelte-themes":"^2.0.8","@vitest/browser":"^3.2.3","@playwright/test":"^1.55.0","@types/react-dom":"^19.2.3","remark-stringify":"^11.0.0","@sveltejs/package":"^2.0.0","@tailwindcss/vite":"^4.0.0","@vitest/coverage-v8":"^3.2.3","html-url-attributes":"^3.0.1","@vitejs/plugin-react":"^5.1.2","vitest-browser-svelte":"^0.1.0","@streamdown-svelte/cjk":"1.0.3","prettier-plugin-svelte":"^3.3.3","stick-to-bottom-svelte":"^1.0.1","@streamdown-svelte/code":"1.1.1","@streamdown-svelte/math":"1.0.2","hast-util-to-jsx-runtime":"^2.3.6","unist-util-visit-parents":"^6.0.2","@cloudflare/workers-types":"^4.20250906.0","vite-plugin-devtools-json":"^1.0.0","@streamdown-svelte/mermaid":"1.0.2","prettier-plugin-tailwindcss":"^0.6.11","@sveltejs/adapter-cloudflare":"^7.0.0","@sveltejs/vite-plugin-svelte":"^6.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/streamdown-svelte_3.0.1_1775570841770_0.7028215292036062","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"streamdown-svelte","version":"3.0.2","keywords":["svelte"],"license":"Apache-2.0","_id":"streamdown-svelte@3.0.2","maintainers":[{"name":"betterandbetterii","email":"betterspace1@outlook.com"}],"homepage":"https://github.com/PacificStudio/streamdown-svelte#readme","bugs":{"url":"https://github.com/PacificStudio/streamdown-svelte/issues"},"dist":{"shasum":"36b7552815549452235e45b18e64bd8cd28de6ad","tarball":"https://registry.npmjs.org/streamdown-svelte/-/streamdown-svelte-3.0.2.tgz","fileCount":191,"integrity":"sha512-ffhALl5Gv2jJrMse6hYE3+mvt0p0pQmIN0fq3Z1szpXJZ/ePFJ2rNI5i4rqfB3OGDxXqjpv2O8Va3uue4tQtuQ==","signatures":[{"sig":"MEQCIFwnaRwrByfJcpay+DJgUTGjepOnMpobMUtNMrew0BwMAiBn2aO7XsNyHTKT2Y0QjrP8LszpCLZGxPjOK2MdOS/xHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/streamdown-svelte@3.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":455204},"type":"module","_from":"file:artifacts/release/streamdown-svelte-3.0.2.tgz","types":"./dist/index.d.ts","volta":{"node":"22.22.1","pnpm":"10.32.1"},"svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./code":{"types":"./dist/Elements/Code.svelte.d.ts","svelte":"./dist/Elements/Code.svelte"},"./math":{"types":"./dist/Elements/Math.svelte.d.ts","svelte":"./dist/Elements/Math.svelte"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./remend":{"types":"./dist/remend.d.ts","import":"./dist/remend.js"},"./mermaid":{"types":"./dist/Elements/Mermaid.svelte.d.ts","svelte":"./dist/Elements/Mermaid.svelte"},"./plugins":{"types":"./dist/plugins.d.ts","import":"./dist/plugins.js"},"./url-policy":{"types":"./dist/url-policy.d.ts","import":"./dist/url-policy.js"},"./icon-context":{"types":"./dist/icon-context.d.ts","import":"./dist/icon-context.js"},"./plugin-context":{"types":"./dist/plugin-context.d.ts","import":"./dist/plugin-context.js"},"./detect-direction":{"types":"./dist/detect-direction.d.ts","import":"./dist/detect-direction.js"}},"scripts":{"dev":"vite dev","lint":"prettier --check .","test":"npm run test:unit -- --run","bench":"pnpm bench:ported && pnpm bench:compare","build":"pnpm build:packages && vite build && pnpm package:root","check":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","preview":"vite preview","test:ui":"vitest --ui","test:unit":"vitest --reporter=dot --silent=passed-only","check:watch":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","verify:pack":"node scripts/verify-pack.mjs","bench:ported":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/ported --run --project server --outputJson coverage/benchmarks/ported.json","package:root":"svelte-kit sync && svelte-package && publint","bench:compare":"node scripts/benchmark-report.mjs","test:coverage":"node scripts/coverage-report.mjs","build:packages":"pnpm -r --filter './packages/*' build","test:contracts":"vitest --reporter=dot --silent=passed-only --run tests/contracts/*.spec.ts","verify:exports":"node scripts/verify-exports.mjs","release:metadata":"node scripts/release-metadata.mjs","verify:toolchain":"node scripts/verify-toolchain.mjs","bench:compare:raw":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/compare --run --project server --outputJson coverage/benchmarks/compare.json && node scripts/benchmark-summary.mjs coverage/benchmarks/compare.json","verify:api-surface":"pnpm verify:reference-api-surface && pnpm verify:local-api-surface && pnpm test:contracts","verify:clean-build":"node scripts/verify-clean-build.mjs","test:coverage:parity":"node scripts/coverage-report.mjs parity","test:coverage:parser":"node scripts/coverage-report.mjs parser","test:playwright:parity":"playwright test tests/playwright/parity --reporter=dot --quiet","verify:workspace-smoke":"node scripts/verify-workspace-smoke.mjs","verify:release-metadata":"node scripts/verify-release-metadata.mjs","snapshot:commonmark-spec":"node scripts/fetch-commonmark-spec.mjs","test:coverage:components":"node scripts/coverage-report.mjs components","verify:dependency-policy":"node scripts/verify-dependency-policy.mjs","verify:local-api-surface":"node scripts/local-api-surface.mjs --check","test:playwright:streaming":"playwright test tests/playwright/parity/streaming.spec.ts --reporter=dot --quiet","docs:test-migration-status":"node scripts/test-migration-status.mjs --write","snapshot:local-api-surface":"node scripts/local-api-surface.mjs --write","test:playwright:commonmark":"playwright test tests/playwright/commonmark --reporter=dot --quiet","verify:reference-api-surface":"node scripts/reference-api-surface.mjs --check","verify:test-migration-status":"node scripts/test-migration-status.mjs --check","snapshot:reference-api-surface":"node scripts/reference-api-surface.mjs --write"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dd74883e-9b5c-4370-9aaf-5575e5c5783c"}},"_resolved":"/home/runner/work/streamdown-svelte/streamdown-svelte/artifacts/release/streamdown-svelte-3.0.2.tgz","_integrity":"sha512-ffhALl5Gv2jJrMse6hYE3+mvt0p0pQmIN0fq3Z1szpXJZ/ePFJ2rNI5i4rqfB3OGDxXqjpv2O8Va3uue4tQtuQ==","repository":{"url":"git+https://github.com/PacificStudio/streamdown-svelte.git","type":"git"},"_npmVersion":"11.12.1","description":"Svelte port of [Vercel Streamdown](https://streamdown.ai/) for rendering AI-generated markdown with streaming-friendly parsing, hardened HTML handling, extensible plugins, and Svelte-native customization hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.1","dependencies":{"clsx":"^2.1.1","katex":"^0.16.22","shiki":"^3.13.0","marked":"^16.2.1","remend":"1.3.0","mermaid":"^11.11.0","unified":"^11.0.5","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","rehype-harden":"^1.1.8","remark-rehype":"^11.1.2","@shikijs/langs":"^3.17.1","tailwind-merge":"^3.3.1","@shikijs/themes":"^3.17.1","rehype-sanitize":"^6.0.0","@floating-ui/dom":"^1.7.4","rehype-stringify":"^10.0.1","unist-util-visit":"^5.1.0","remark-cjk-friendly":"^2.0.1","@streamdown-svelte/plugin-core":"1.0.0","remark-cjk-friendly-gfm-strikethrough":"^2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vite":"^7.3.2","pngjs":"^7.0.0","react":"^19.2.4","svelte":"^5.0.0","vitest":"^3.2.3","publint":"^0.3.2","prettier":"^3.4.2","wrangler":"^4.34.0","react-dom":"^19.2.4","@vitest/ui":"^3.2.4","pixelmatch":"^7.1.0","playwright":"^1.53.0","typescript":"^5.0.0","@types/node":"^24.6.1","remark-math":"^6.0.0","tailwindcss":"^4.0.0","@types/mdast":"^4.0.4","@types/pngjs":"^6.0.5","@types/react":"^19.2.14","@types/unist":"^3.0.3","rehype-katex":"^7.0.1","svelte-check":"^4.0.0","@sveltejs/kit":"^2.22.0","svelte-themes":"^2.0.8","@vitest/browser":"^3.2.3","@playwright/test":"^1.55.0","@types/react-dom":"^19.2.3","remark-stringify":"^11.0.0","@sveltejs/package":"^2.0.0","@tailwindcss/vite":"^4.0.0","@vitest/coverage-v8":"^3.2.3","html-url-attributes":"^3.0.1","@vitejs/plugin-react":"^5.1.2","vitest-browser-svelte":"^0.1.0","@streamdown-svelte/cjk":"1.0.3","prettier-plugin-svelte":"^3.3.3","stick-to-bottom-svelte":"^1.0.1","@streamdown-svelte/code":"1.1.1","@streamdown-svelte/math":"1.0.2","hast-util-to-jsx-runtime":"^2.3.6","unist-util-visit-parents":"^6.0.2","@cloudflare/workers-types":"^4.20250906.0","vite-plugin-devtools-json":"^1.0.0","@streamdown-svelte/mermaid":"1.0.2","prettier-plugin-tailwindcss":"^0.6.11","@sveltejs/adapter-cloudflare":"^7.0.0","@sveltejs/vite-plugin-svelte":"^6.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/streamdown-svelte_3.0.2_1775575790186_0.43366801320536164","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"streamdown-svelte","version":"3.0.3","keywords":["svelte"],"license":"Apache-2.0","_id":"streamdown-svelte@3.0.3","maintainers":[{"name":"betterandbetterii","email":"betterspace1@outlook.com"}],"homepage":"https://streamdown-svelte.pacificstudio.ai","bugs":{"url":"https://github.com/PacificStudio/streamdown-svelte/issues"},"dist":{"shasum":"62ed352673bc4872e15de3e8eb3d8f4d9df4ed06","tarball":"https://registry.npmjs.org/streamdown-svelte/-/streamdown-svelte-3.0.3.tgz","fileCount":197,"integrity":"sha512-FfQns2gFznQRCRTEG9hBHUpKOC3L7qh1DOuYf7LIhHvi1xmgBWrRmaa2089mvvfioKykCnbkv79ZXhHkVCCllg==","signatures":[{"sig":"MEYCIQDQ9WJp4fCoLIN+lebkbk84iK+U440PJ246h/pt+UWVJgIhAP8Ym+4cRI5FVWJb7TqFkxCuh1+iQzsdNIzjbZRso+47","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/streamdown-svelte@3.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":473428},"type":"module","_from":"file:artifacts/release/streamdown-svelte-3.0.3.tgz","types":"./dist/index.d.ts","volta":{"node":"22.22.1","pnpm":"10.32.1"},"svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./code":{"types":"./dist/Elements/Code.svelte.d.ts","svelte":"./dist/Elements/Code.svelte"},"./math":{"types":"./dist/Elements/Math.svelte.d.ts","svelte":"./dist/Elements/Math.svelte"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./remend":{"types":"./dist/remend.d.ts","import":"./dist/remend.js"},"./mermaid":{"types":"./dist/Elements/Mermaid.svelte.d.ts","svelte":"./dist/Elements/Mermaid.svelte"},"./plugins":{"types":"./dist/plugins.d.ts","import":"./dist/plugins.js"},"./url-policy":{"types":"./dist/url-policy.d.ts","import":"./dist/url-policy.js"},"./icon-context":{"types":"./dist/icon-context.d.ts","import":"./dist/icon-context.js"},"./plugin-context":{"types":"./dist/plugin-context.d.ts","import":"./dist/plugin-context.js"},"./detect-direction":{"types":"./dist/detect-direction.d.ts","import":"./dist/detect-direction.js"}},"scripts":{"dev":"vite dev","lint":"prettier --check .","test":"npm run test:unit -- --run","bench":"pnpm bench:ported && pnpm bench:compare","build":"pnpm build:packages && vite build && pnpm package:root","check":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","preview":"vite preview","test:ui":"vitest --ui","test:unit":"vitest --reporter=dot --silent=passed-only","check:watch":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","verify:pack":"node scripts/verify-pack.mjs","bench:ported":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/ported --run --project server --outputJson coverage/benchmarks/ported.json","package:root":"svelte-kit sync && svelte-package && publint","bench:compare":"node scripts/benchmark-report.mjs","test:coverage":"node scripts/coverage-report.mjs","build:packages":"pnpm -r --filter './packages/*' build","test:contracts":"vitest --reporter=dot --silent=passed-only --run tests/contracts/*.spec.ts","verify:exports":"node scripts/verify-exports.mjs","release:metadata":"node scripts/release-metadata.mjs","verify:toolchain":"node scripts/verify-toolchain.mjs","bench:compare:raw":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/compare --run --project server --outputJson coverage/benchmarks/compare.json && node scripts/benchmark-summary.mjs coverage/benchmarks/compare.json","verify:api-surface":"pnpm verify:reference-api-surface && pnpm verify:local-api-surface && pnpm test:contracts","verify:clean-build":"node scripts/verify-clean-build.mjs","test:coverage:parity":"node scripts/coverage-report.mjs parity","test:coverage:parser":"node scripts/coverage-report.mjs parser","test:playwright:parity":"playwright test tests/playwright/parity --reporter=dot --quiet","verify:workspace-smoke":"node scripts/verify-workspace-smoke.mjs","verify:release-metadata":"node scripts/verify-release-metadata.mjs","snapshot:commonmark-spec":"node scripts/fetch-commonmark-spec.mjs","test:coverage:components":"node scripts/coverage-report.mjs components","verify:dependency-policy":"node scripts/verify-dependency-policy.mjs","verify:local-api-surface":"node scripts/local-api-surface.mjs --check","test:playwright:streaming":"playwright test tests/playwright/parity/streaming.spec.ts --reporter=dot --quiet","docs:test-migration-status":"node scripts/test-migration-status.mjs --write","snapshot:local-api-surface":"node scripts/local-api-surface.mjs --write","test:playwright:commonmark":"playwright test tests/playwright/commonmark --reporter=dot --quiet","verify:reference-api-surface":"node scripts/reference-api-surface.mjs --check","verify:test-migration-status":"node scripts/test-migration-status.mjs --check","snapshot:reference-api-surface":"node scripts/reference-api-surface.mjs --write"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dd74883e-9b5c-4370-9aaf-5575e5c5783c"}},"_resolved":"/home/runner/work/streamdown-svelte/streamdown-svelte/artifacts/release/streamdown-svelte-3.0.3.tgz","_integrity":"sha512-FfQns2gFznQRCRTEG9hBHUpKOC3L7qh1DOuYf7LIhHvi1xmgBWrRmaa2089mvvfioKykCnbkv79ZXhHkVCCllg==","repository":{"url":"git+https://github.com/PacificStudio/streamdown-svelte.git","type":"git"},"_npmVersion":"11.12.1","description":"<p align=\"center\">   <img src=\"https://raw.githubusercontent.com/PacificStudio/streamdown-svelte/master/static/favicon.svg\" alt=\"Streamdown Svelte favicon\" width=\"96\" height=\"96\" /> </p>","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.1","dependencies":{"clsx":"^2.1.1","katex":"^0.16.22","shiki":"^3.13.0","marked":"^16.2.1","remend":"1.3.0","esm-env":"^1.2.2","mermaid":"^11.11.0","unified":"^11.0.5","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","rehype-harden":"^1.1.8","remark-rehype":"^11.1.2","@shikijs/langs":"^3.17.1","tailwind-merge":"^3.3.1","@shikijs/themes":"^3.17.1","rehype-sanitize":"^6.0.0","@floating-ui/dom":"^1.7.4","rehype-stringify":"^10.0.1","unist-util-visit":"^5.1.0","remark-cjk-friendly":"^2.0.1","@streamdown-svelte/plugin-core":"1.0.0","remark-cjk-friendly-gfm-strikethrough":"^2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vite":"^7.3.2","pngjs":"^7.0.0","react":"^19.2.4","svelte":"^5.0.0","vitest":"^3.2.3","publint":"^0.3.2","prettier":"^3.4.2","wrangler":"^4.34.0","react-dom":"^19.2.4","@vitest/ui":"^3.2.4","pixelmatch":"^7.1.0","playwright":"^1.53.0","typescript":"^5.0.0","@types/node":"^24.6.1","remark-math":"^6.0.0","tailwindcss":"^4.0.0","@types/mdast":"^4.0.4","@types/pngjs":"^6.0.5","@types/react":"^19.2.14","@types/unist":"^3.0.3","rehype-katex":"^7.0.1","svelte-check":"^4.0.0","@sveltejs/kit":"^2.22.0","svelte-themes":"^2.0.8","@vitest/browser":"^3.2.3","@playwright/test":"^1.55.0","@types/react-dom":"^19.2.3","remark-stringify":"^11.0.0","@sveltejs/package":"^2.0.0","@tailwindcss/vite":"^4.0.0","@vitest/coverage-v8":"^3.2.3","html-url-attributes":"^3.0.1","@vitejs/plugin-react":"^5.1.2","vitest-browser-svelte":"^0.1.0","@streamdown-svelte/cjk":"1.0.3","prettier-plugin-svelte":"^3.3.3","stick-to-bottom-svelte":"^1.0.1","@streamdown-svelte/code":"1.1.1","@streamdown-svelte/math":"1.0.2","hast-util-to-jsx-runtime":"^2.3.6","unist-util-visit-parents":"^6.0.2","@cloudflare/workers-types":"^4.20250906.0","vite-plugin-devtools-json":"^1.0.0","@streamdown-svelte/mermaid":"1.0.2","prettier-plugin-tailwindcss":"^0.6.11","@sveltejs/adapter-cloudflare":"^7.0.0","@sveltejs/vite-plugin-svelte":"^6.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/streamdown-svelte_3.0.3_1775593706262_0.31052775720735193","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"streamdown-svelte","version":"3.0.4","keywords":["svelte"],"license":"Apache-2.0","_id":"streamdown-svelte@3.0.4","maintainers":[{"name":"betterandbetterii","email":"betterspace1@outlook.com"}],"homepage":"https://streamdown-svelte.pacificstudio.ai","bugs":{"url":"https://github.com/PacificStudio/streamdown-svelte/issues"},"dist":{"shasum":"93ed5d44cfb93262bee2778c102b1f0fad827cea","tarball":"https://registry.npmjs.org/streamdown-svelte/-/streamdown-svelte-3.0.4.tgz","fileCount":197,"integrity":"sha512-V+OxV+wKgV2KRODXwGurMNcGbZtM1Q01qCBKh35ECc4raZcm7OEiA4Mj0LZWJaSjZoT+Aj0iTfUQrT9IUk1CXg==","signatures":[{"sig":"MEYCIQDrajdVBh0aFkzybkY7T3zXFTX8xoYz4l/RmOXb8ktaPAIhAO2UvIJpo01yaP0h9uG9x9IBv7J+qPK3oq8jnAVcnqhE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/streamdown-svelte@3.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":480627},"type":"module","_from":"file:artifacts/release/streamdown-svelte-3.0.4.tgz","types":"./dist/index.d.ts","volta":{"node":"22.22.1","pnpm":"10.32.1"},"svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./code":{"types":"./dist/Elements/Code.svelte.d.ts","svelte":"./dist/Elements/Code.svelte"},"./math":{"types":"./dist/Elements/Math.svelte.d.ts","svelte":"./dist/Elements/Math.svelte"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./remend":{"types":"./dist/remend.d.ts","import":"./dist/remend.js"},"./mermaid":{"types":"./dist/Elements/Mermaid.svelte.d.ts","svelte":"./dist/Elements/Mermaid.svelte"},"./plugins":{"types":"./dist/plugins.d.ts","import":"./dist/plugins.js"},"./url-policy":{"types":"./dist/url-policy.d.ts","import":"./dist/url-policy.js"},"./icon-context":{"types":"./dist/icon-context.d.ts","import":"./dist/icon-context.js"},"./plugin-context":{"types":"./dist/plugin-context.d.ts","import":"./dist/plugin-context.js"},"./detect-direction":{"types":"./dist/detect-direction.d.ts","import":"./dist/detect-direction.js"}},"scripts":{"dev":"vite dev","lint":"prettier --check .","test":"npm run test:unit -- --run","bench":"pnpm bench:ported && pnpm bench:compare","build":"pnpm build:packages && vite build && pnpm package:root","check":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","preview":"vite preview","test:ui":"vitest --ui","test:unit":"vitest --reporter=dot --silent=passed-only","check:watch":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","verify:pack":"node scripts/verify-pack.mjs","bench:ported":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/ported --run --project server --outputJson coverage/benchmarks/ported.json","package:root":"svelte-kit sync && svelte-package && publint","bench:compare":"node scripts/benchmark-report.mjs","test:coverage":"node scripts/coverage-report.mjs","build:packages":"pnpm -r --filter './packages/*' build","test:contracts":"vitest --reporter=dot --silent=passed-only --run tests/contracts/*.spec.ts","verify:exports":"node scripts/verify-exports.mjs","release:metadata":"node scripts/release-metadata.mjs","verify:toolchain":"node scripts/verify-toolchain.mjs","bench:compare:raw":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/compare --run --project server --outputJson coverage/benchmarks/compare.json && node scripts/benchmark-summary.mjs coverage/benchmarks/compare.json","verify:api-surface":"pnpm verify:reference-api-surface && pnpm verify:local-api-surface && pnpm test:contracts","verify:clean-build":"node scripts/verify-clean-build.mjs","test:coverage:parity":"node scripts/coverage-report.mjs parity","test:coverage:parser":"node scripts/coverage-report.mjs parser","test:playwright:parity":"playwright test tests/playwright/parity --reporter=dot --quiet","verify:workspace-smoke":"node scripts/verify-workspace-smoke.mjs","verify:release-metadata":"node scripts/verify-release-metadata.mjs","snapshot:commonmark-spec":"node scripts/fetch-commonmark-spec.mjs","test:coverage:components":"node scripts/coverage-report.mjs components","verify:dependency-policy":"node scripts/verify-dependency-policy.mjs","verify:local-api-surface":"node scripts/local-api-surface.mjs --check","test:playwright:streaming":"playwright test tests/playwright/parity/streaming.spec.ts --reporter=dot --quiet","docs:test-migration-status":"node scripts/test-migration-status.mjs --write","snapshot:local-api-surface":"node scripts/local-api-surface.mjs --write","test:playwright:commonmark":"playwright test tests/playwright/commonmark --reporter=dot --quiet","verify:reference-api-surface":"node scripts/reference-api-surface.mjs --check","verify:test-migration-status":"node scripts/test-migration-status.mjs --check","snapshot:reference-api-surface":"node scripts/reference-api-surface.mjs --write"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dd74883e-9b5c-4370-9aaf-5575e5c5783c"}},"_resolved":"/home/runner/work/streamdown-svelte/streamdown-svelte/artifacts/release/streamdown-svelte-3.0.4.tgz","_integrity":"sha512-V+OxV+wKgV2KRODXwGurMNcGbZtM1Q01qCBKh35ECc4raZcm7OEiA4Mj0LZWJaSjZoT+Aj0iTfUQrT9IUk1CXg==","repository":{"url":"git+https://github.com/PacificStudio/streamdown-svelte.git","type":"git"},"_npmVersion":"11.12.1","description":"<p align=\"center\">   <img src=\"https://raw.githubusercontent.com/PacificStudio/streamdown-svelte/master/static/favicon.svg\" alt=\"Streamdown Svelte favicon\" width=\"96\" height=\"96\" /> </p>","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.1","dependencies":{"clsx":"^2.1.1","katex":"^0.16.22","shiki":"^3.13.0","marked":"^16.2.1","remend":"1.3.0","esm-env":"^1.2.2","mermaid":"^11.11.0","unified":"^11.0.5","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","rehype-harden":"^1.1.8","remark-rehype":"^11.1.2","@shikijs/langs":"^3.17.1","tailwind-merge":"^3.3.1","@shikijs/themes":"^3.17.1","rehype-sanitize":"^6.0.0","@floating-ui/dom":"^1.7.4","rehype-stringify":"^10.0.1","unist-util-visit":"^5.1.0","remark-cjk-friendly":"^2.0.1","@streamdown-svelte/plugin-core":"1.0.0","remark-cjk-friendly-gfm-strikethrough":"^2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vite":"^7.3.2","pngjs":"^7.0.0","react":"^19.2.4","svelte":"^5.0.0","vitest":"^3.2.3","publint":"^0.3.2","prettier":"^3.4.2","wrangler":"^4.34.0","react-dom":"^19.2.4","@vitest/ui":"^3.2.4","pixelmatch":"^7.1.0","playwright":"^1.53.0","typescript":"^5.0.0","@types/node":"^24.6.1","remark-math":"^6.0.0","tailwindcss":"^4.0.0","@types/mdast":"^4.0.4","@types/pngjs":"^6.0.5","@types/react":"^19.2.14","@types/unist":"^3.0.3","rehype-katex":"^7.0.1","svelte-check":"^4.0.0","@sveltejs/kit":"^2.22.0","svelte-themes":"^2.0.8","@vitest/browser":"^3.2.3","@playwright/test":"^1.55.0","@types/react-dom":"^19.2.3","remark-stringify":"^11.0.0","@sveltejs/package":"^2.0.0","@tailwindcss/vite":"^4.0.0","@vitest/coverage-v8":"^3.2.3","html-url-attributes":"^3.0.1","@vitejs/plugin-react":"^5.1.2","vitest-browser-svelte":"^0.1.0","@streamdown-svelte/cjk":"1.0.3","prettier-plugin-svelte":"^3.3.3","stick-to-bottom-svelte":"^1.0.1","@streamdown-svelte/code":"1.1.1","@streamdown-svelte/math":"1.0.2","hast-util-to-jsx-runtime":"^2.3.6","unist-util-visit-parents":"^6.0.2","@cloudflare/workers-types":"^4.20250906.0","vite-plugin-devtools-json":"^1.0.0","@streamdown-svelte/mermaid":"1.0.2","prettier-plugin-tailwindcss":"^0.6.11","@sveltejs/adapter-cloudflare":"^7.0.0","@sveltejs/vite-plugin-svelte":"^6.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/streamdown-svelte_3.0.4_1775725165937_0.42416660703188147","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"streamdown-svelte","version":"3.0.5","keywords":["svelte"],"license":"Apache-2.0","_id":"streamdown-svelte@3.0.5","maintainers":[{"name":"betterandbetterii","email":"betterspace1@outlook.com"}],"homepage":"https://streamdown-svelte.pacificstudio.ai","bugs":{"url":"https://github.com/PacificStudio/streamdown-svelte/issues"},"dist":{"shasum":"3101c1a531ef6cd45a88fb60d6bd7a7804ed5655","tarball":"https://registry.npmjs.org/streamdown-svelte/-/streamdown-svelte-3.0.5.tgz","fileCount":197,"integrity":"sha512-aP+svGNc3wYmkm5xzpYBiSg7kQMYJ0xktMi62fSYr04EAwB0yGLS4GMjK95KVatN2hX1OIe5A9tqvXqYU0WokQ==","signatures":[{"sig":"MEQCIDA1FSEnNJFChSglMfBCKayCdxxH2L9XEqG4vDBUCKuwAiAXbjM51xPB6RnV7IA72P659WbkXCmQ1JlYnZpFMRj/bQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":481132},"pnpm":{"overrides":{"defu":"^6.1.6"},"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","volta":{"node":"22.22.1","pnpm":"10.32.1"},"svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./code":{"types":"./dist/Elements/Code.svelte.d.ts","svelte":"./dist/Elements/Code.svelte"},"./math":{"types":"./dist/Elements/Math.svelte.d.ts","svelte":"./dist/Elements/Math.svelte"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./remend":{"types":"./dist/remend.d.ts","import":"./dist/remend.js"},"./mermaid":{"types":"./dist/Elements/Mermaid.svelte.d.ts","svelte":"./dist/Elements/Mermaid.svelte"},"./plugins":{"types":"./dist/plugins.d.ts","import":"./dist/plugins.js"},"./url-policy":{"types":"./dist/url-policy.d.ts","import":"./dist/url-policy.js"},"./icon-context":{"types":"./dist/icon-context.d.ts","import":"./dist/icon-context.js"},"./plugin-context":{"types":"./dist/plugin-context.d.ts","import":"./dist/plugin-context.js"},"./detect-direction":{"types":"./dist/detect-direction.d.ts","import":"./dist/detect-direction.js"}},"gitHead":"fb3f14ea87a58d582ef4f7eeeb98313e903616fb","scripts":{"dev":"vite dev","lint":"prettier --check .","test":"npm run test:unit -- --run","bench":"pnpm bench:ported && pnpm bench:compare","build":"pnpm build:packages && vite build && pnpm package:root","check":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","prepack":"pnpm build:packages && pnpm package:root","prepare":"svelte-kit sync || echo ''","preview":"vite preview","test:ui":"vitest --ui","test:unit":"vitest --reporter=dot --silent=passed-only","check:watch":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","verify:pack":"node scripts/verify-pack.mjs","bench:ported":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/ported --run --project server --outputJson coverage/benchmarks/ported.json","package:root":"svelte-kit sync && svelte-package && publint","bench:compare":"node scripts/benchmark-report.mjs","test:coverage":"node scripts/coverage-report.mjs","build:packages":"pnpm -r --filter './packages/*' build","test:contracts":"vitest --reporter=dot --silent=passed-only --run tests/contracts/*.spec.ts","verify:exports":"node scripts/verify-exports.mjs","release:metadata":"node scripts/release-metadata.mjs","verify:toolchain":"node scripts/verify-toolchain.mjs","bench:compare:raw":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/compare --run --project server --outputJson coverage/benchmarks/compare.json && node scripts/benchmark-summary.mjs coverage/benchmarks/compare.json","verify:api-surface":"pnpm verify:reference-api-surface && pnpm verify:local-api-surface && pnpm test:contracts","verify:clean-build":"node scripts/verify-clean-build.mjs","test:coverage:parity":"node scripts/coverage-report.mjs parity","test:coverage:parser":"node scripts/coverage-report.mjs parser","test:playwright:parity":"playwright test tests/playwright/parity --reporter=dot --quiet","verify:workspace-smoke":"node scripts/verify-workspace-smoke.mjs","verify:release-metadata":"node scripts/verify-release-metadata.mjs","snapshot:commonmark-spec":"node scripts/fetch-commonmark-spec.mjs","test:coverage:components":"node scripts/coverage-report.mjs components","verify:dependency-policy":"node scripts/verify-dependency-policy.mjs","verify:local-api-surface":"node scripts/local-api-surface.mjs --check","test:playwright:streaming":"playwright test tests/playwright/parity/streaming.spec.ts --reporter=dot --quiet","docs:test-migration-status":"node scripts/test-migration-status.mjs --write","snapshot:local-api-surface":"node scripts/local-api-surface.mjs --write","test:playwright:commonmark":"playwright test tests/playwright/commonmark --reporter=dot --quiet","verify:reference-api-surface":"node scripts/reference-api-surface.mjs --check","verify:test-migration-status":"node scripts/test-migration-status.mjs --check","snapshot:reference-api-surface":"node scripts/reference-api-surface.mjs --write"},"_npmUser":{"name":"betterandbetterii","email":"betterspace1@outlook.com"},"repository":{"url":"git+https://github.com/PacificStudio/streamdown-svelte.git","type":"git"},"_npmVersion":"10.9.4","description":"<p align=\"center\">   <img src=\"https://raw.githubusercontent.com/PacificStudio/streamdown-svelte/master/static/favicon.svg\" alt=\"Streamdown Svelte favicon\" width=\"96\" height=\"96\" /> </p>","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.0","dependencies":{"clsx":"^2.1.1","katex":"^0.16.22","shiki":"^3.13.0","marked":"^16.2.1","esm-env":"^1.2.2","mermaid":"^11.11.0","unified":"^11.0.5","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","rehype-harden":"^1.1.8","remark-rehype":"^11.1.2","@shikijs/langs":"^3.17.1","tailwind-merge":"^3.3.1","@shikijs/themes":"^3.17.1","rehype-sanitize":"^6.0.0","@floating-ui/dom":"^1.7.4","rehype-stringify":"^10.0.1","unist-util-visit":"^5.1.0","remark-cjk-friendly":"^2.0.1","@streamdown-svelte/remend":"workspace:*","@streamdown-svelte/plugin-core":"workspace:*","remark-cjk-friendly-gfm-strikethrough":"^2.0.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.32.1","devDependencies":{"tsup":"^8.5.0","vite":"^7.3.2","pngjs":"^7.0.0","react":"^19.2.4","svelte":"^5.0.0","vitest":"^3.2.3","publint":"^0.3.2","prettier":"^3.4.2","wrangler":"^4.34.0","react-dom":"^19.2.4","@vitest/ui":"^3.2.4","pixelmatch":"^7.1.0","playwright":"^1.53.0","typescript":"^5.0.0","@types/node":"^24.6.1","remark-math":"^6.0.0","tailwindcss":"^4.0.0","@types/mdast":"^4.0.4","@types/pngjs":"^6.0.5","@types/react":"^19.2.14","@types/unist":"^3.0.3","rehype-katex":"^7.0.1","svelte-check":"^4.0.0","@sveltejs/kit":"^2.22.0","svelte-themes":"^2.0.8","@vitest/browser":"^3.2.3","@playwright/test":"^1.55.0","@types/react-dom":"^19.2.3","remark-stringify":"^11.0.0","@sveltejs/package":"^2.0.0","@tailwindcss/vite":"^4.0.0","@vitest/coverage-v8":"^3.2.3","html-url-attributes":"^3.0.1","@vitejs/plugin-react":"^5.1.2","vitest-browser-svelte":"^0.1.0","@streamdown-svelte/cjk":"workspace:*","prettier-plugin-svelte":"^3.3.3","stick-to-bottom-svelte":"^1.0.1","@streamdown-svelte/code":"workspace:*","@streamdown-svelte/math":"workspace:*","hast-util-to-jsx-runtime":"^2.3.6","unist-util-visit-parents":"^6.0.2","@cloudflare/workers-types":"^4.20250906.0","vite-plugin-devtools-json":"^1.0.0","@streamdown-svelte/mermaid":"workspace:*","prettier-plugin-tailwindcss":"^0.6.11","@sveltejs/adapter-cloudflare":"^7.0.0","@sveltejs/vite-plugin-svelte":"^6.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/streamdown-svelte_3.0.5_1775807012110_0.6640981894715949","host":"s3://npm-registry-packages-npm-production"}},"3.0.6":{"name":"streamdown-svelte","version":"3.0.6","sideEffects":["**/*.css"],"svelte":"./dist/index.js","types":"./dist/index.d.ts","type":"module","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./code":{"types":"./dist/Elements/Code.svelte.d.ts","svelte":"./dist/Elements/Code.svelte"},"./detect-direction":{"types":"./dist/detect-direction.d.ts","import":"./dist/detect-direction.js"},"./icon-context":{"types":"./dist/icon-context.d.ts","import":"./dist/icon-context.js"},"./math":{"types":"./dist/Elements/Math.svelte.d.ts","svelte":"./dist/Elements/Math.svelte"},"./mermaid":{"types":"./dist/Elements/Mermaid.svelte.d.ts","svelte":"./dist/Elements/Mermaid.svelte"},"./plugin-context":{"types":"./dist/plugin-context.d.ts","import":"./dist/plugin-context.js"},"./plugins":{"types":"./dist/plugins.d.ts","import":"./dist/plugins.js"},"./remend":{"types":"./dist/remend.d.ts","import":"./dist/remend.js"},"./url-policy":{"types":"./dist/url-policy.d.ts","import":"./dist/url-policy.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"}},"peerDependencies":{"svelte":"^5.0.0"},"devDependencies":{"@cloudflare/workers-types":"^4.20250906.0","@playwright/test":"^1.55.0","@sveltejs/adapter-cloudflare":"^7.0.0","@sveltejs/kit":"^2.22.0","@sveltejs/package":"^2.0.0","@sveltejs/vite-plugin-svelte":"^6.0.0","@tailwindcss/vite":"^4.0.0","@types/mdast":"^4.0.4","@types/node":"^24.6.1","@types/pngjs":"^6.0.5","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@types/unist":"^3.0.3","@vitejs/plugin-react":"^5.1.2","@vitest/browser":"^3.2.3","@vitest/coverage-v8":"^3.2.3","@vitest/ui":"^3.2.4","hast-util-to-jsx-runtime":"^2.3.6","html-url-attributes":"^3.0.1","pixelmatch":"^7.1.0","playwright":"^1.53.0","pngjs":"^7.0.0","prettier":"^3.4.2","prettier-plugin-svelte":"^3.3.3","prettier-plugin-tailwindcss":"^0.6.11","publint":"^0.3.2","react":"^19.2.4","react-dom":"^19.2.4","rehype-katex":"^7.0.1","remark-math":"^6.0.0","remark-stringify":"^11.0.0","stick-to-bottom-svelte":"^1.0.1","svelte":"^5.0.0","svelte-check":"^4.0.0","svelte-themes":"^2.0.8","tailwindcss":"^4.0.0","tsup":"^8.5.0","typescript":"^5.0.0","unist-util-visit-parents":"^6.0.2","vite":"^7.3.2","vite-plugin-devtools-json":"^1.0.0","vitest":"^3.2.3","vitest-browser-svelte":"^0.1.0","wrangler":"^4.34.0","@streamdown-svelte/cjk":"1.0.5","@streamdown-svelte/math":"1.0.4","@streamdown-svelte/mermaid":"1.0.4","@streamdown-svelte/code":"1.1.3"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/PacificStudio/streamdown-svelte.git"},"homepage":"https://streamdown-svelte.pacificstudio.ai","keywords":["svelte"],"dependencies":{"@floating-ui/dom":"^1.7.4","@shikijs/langs":"^3.17.1","@shikijs/themes":"^3.17.1","clsx":"^2.1.1","esm-env":"^1.2.2","katex":"^0.16.22","marked":"^16.2.1","mermaid":"^11.11.0","rehype-harden":"^1.1.8","rehype-raw":"^7.0.0","rehype-sanitize":"^6.0.0","rehype-stringify":"^10.0.1","remark-cjk-friendly":"^2.0.1","remark-cjk-friendly-gfm-strikethrough":"^2.0.1","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","shiki":"^3.13.0","tailwind-merge":"^3.3.1","unified":"^11.0.5","unist-util-visit":"^5.1.0","@streamdown-svelte/plugin-core":"1.0.0","@streamdown-svelte/remend":"1.3.0"},"volta":{"node":"22.22.1","pnpm":"10.32.1"},"scripts":{"dev":"vite dev","build":"pnpm build:packages && vite build && pnpm package:root","preview":"vite preview","check":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","check:watch":"pnpm build:packages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","format":"prettier --write .","lint":"prettier --check .","test:ui":"vitest --ui","test:unit":"vitest --reporter=dot --silent=passed-only","test:coverage":"node scripts/coverage-report.mjs","test:coverage:parser":"node scripts/coverage-report.mjs parser","test:coverage:components":"node scripts/coverage-report.mjs components","test:coverage:parity":"node scripts/coverage-report.mjs parity","test:contracts":"vitest --reporter=dot --silent=passed-only --run tests/contracts/*.spec.ts","test:playwright:parity":"playwright test tests/playwright/parity --reporter=dot --quiet","test:playwright:streaming":"playwright test tests/playwright/parity/streaming.spec.ts --reporter=dot --quiet","test":"npm run test:unit -- --run","docs:test-migration-status":"node scripts/test-migration-status.mjs --write","verify:test-migration-status":"node scripts/test-migration-status.mjs --check","verify:pack":"node scripts/verify-pack.mjs","verify:exports":"node scripts/verify-exports.mjs","snapshot:reference-api-surface":"node scripts/reference-api-surface.mjs --write","verify:reference-api-surface":"node scripts/reference-api-surface.mjs --check","snapshot:local-api-surface":"node scripts/local-api-surface.mjs --write","verify:local-api-surface":"node scripts/local-api-surface.mjs --check","verify:api-surface":"pnpm verify:reference-api-surface && pnpm verify:local-api-surface && pnpm test:contracts","verify:toolchain":"node scripts/verify-toolchain.mjs","verify:clean-build":"node scripts/verify-clean-build.mjs","verify:dependency-policy":"node scripts/verify-dependency-policy.mjs","release:metadata":"node scripts/release-metadata.mjs","verify:release-metadata":"node scripts/verify-release-metadata.mjs","build:packages":"pnpm -r --filter './packages/*' build","package:root":"svelte-kit sync && svelte-package && publint","verify:workspace-smoke":"node scripts/verify-workspace-smoke.mjs","snapshot:commonmark-spec":"node scripts/fetch-commonmark-spec.mjs","test:playwright:commonmark":"playwright test tests/playwright/commonmark --reporter=dot --quiet","bench:ported":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/ported --run --project server --outputJson coverage/benchmarks/ported.json","bench:compare":"node scripts/benchmark-report.mjs","bench:compare:raw":"mkdir -p coverage/benchmarks && pnpm vitest bench tests/benchmarks/compare --run --project server --outputJson coverage/benchmarks/compare.json && node scripts/benchmark-summary.mjs coverage/benchmarks/compare.json","bench":"pnpm bench:ported && pnpm bench:compare"},"_id":"streamdown-svelte@3.0.6","description":"<p align=\"center\">   <img src=\"https://raw.githubusercontent.com/PacificStudio/streamdown-svelte/master/static/favicon.svg\" alt=\"Streamdown Svelte favicon\" width=\"96\" height=\"96\" /> </p>","bugs":{"url":"https://github.com/PacificStudio/streamdown-svelte/issues"},"_integrity":"sha512-RL+tYt0N8OocUH9qJuiiJRe50q31ZM4MiaHQaC1I6wA+J4WpuJd0amNOqbjkjrVKeJlgIs4CX/ELMBqMjF46QQ==","_resolved":"/home/runner/work/streamdown-svelte/streamdown-svelte/artifacts/release/streamdown-svelte-3.0.6.tgz","_from":"file:artifacts/release/streamdown-svelte-3.0.6.tgz","_nodeVersion":"22.22.1","_npmVersion":"11.12.1","dist":{"integrity":"sha512-RL+tYt0N8OocUH9qJuiiJRe50q31ZM4MiaHQaC1I6wA+J4WpuJd0amNOqbjkjrVKeJlgIs4CX/ELMBqMjF46QQ==","shasum":"52485b2a14798c5b3c0672bef5a656e84e1e519a","tarball":"https://registry.npmjs.org/streamdown-svelte/-/streamdown-svelte-3.0.6.tgz","fileCount":197,"unpackedSize":480836,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/streamdown-svelte@3.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCg6lsCJINB43wptLJQQZgCGI+aA6Q31v/1vZo2O6poWwIgAy3VWSTxR+vntgmPP7a2ibyemVUaqLWminwIJ5BTkwQ="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dd74883e-9b5c-4370-9aaf-5575e5c5783c"}},"directories":{},"maintainers":[{"name":"betterandbetterii","email":"betterspace1@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/streamdown-svelte_3.0.6_1775809604019_0.3414602988613107"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-07T14:07:21.769Z","modified":"2026-04-10T08:26:44.437Z","3.0.1":"2026-04-07T14:07:21.918Z","3.0.2":"2026-04-07T15:29:50.409Z","3.0.3":"2026-04-07T20:28:26.506Z","3.0.4":"2026-04-09T08:59:26.069Z","3.0.5":"2026-04-10T07:43:32.244Z","3.0.6":"2026-04-10T08:26:44.163Z"},"bugs":{"url":"https://github.com/PacificStudio/streamdown-svelte/issues"},"license":"Apache-2.0","homepage":"https://streamdown-svelte.pacificstudio.ai","keywords":["svelte"],"repository":{"type":"git","url":"git+https://github.com/PacificStudio/streamdown-svelte.git"},"description":"<p align=\"center\">   <img src=\"https://raw.githubusercontent.com/PacificStudio/streamdown-svelte/master/static/favicon.svg\" alt=\"Streamdown Svelte favicon\" width=\"96\" height=\"96\" /> </p>","maintainers":[{"name":"betterandbetterii","email":"betterspace1@outlook.com"}],"readme":"<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/PacificStudio/streamdown-svelte/master/static/favicon.svg\" alt=\"Streamdown Svelte favicon\" width=\"96\" height=\"96\" />\n</p>\n\n<h1 align=\"center\">Svelte Streamdown</h1>\n\nSvelte port of [Vercel Streamdown](https://streamdown.ai/) for rendering AI-generated markdown with streaming-friendly parsing, hardened HTML handling, extensible plugins, and Svelte-native customization hooks.\n\nThe published package name is `streamdown-svelte`. Thanks to the earlier `svelte-streamdown` groundwork - this repository continues building on that foundation.\n\nDocs and playground live at `https://streamdown-svelte.pacificstudio.ai`.\n\n## Installation\n\n```bash\npnpm add streamdown-svelte\n```\n\n## Quick Start\n\n```svelte\n<script lang=\"ts\">\n\timport { Streamdown } from 'streamdown-svelte';\n\n\tlet content = `# Hello\n\nStreamdown renders **markdown**, tables, alerts, footnotes, citations, and more.`;\n</script>\n\n<Streamdown {content} />\n```\n\n## Consumer Setup\n\n### Tailwind v4 / SvelteKit\n\nIf your app uses Tailwind v4, add Streamdown's published files as a source so Tailwind keeps the package's utility classes in the final CSS. In a SvelteKit app that keeps its main stylesheet at `src/app.css`:\n\n```css\n@import 'tailwindcss';\n@source \"../node_modules/streamdown-svelte/dist/**/*.{js,svelte,ts}\";\n```\n\nIf your stylesheet lives elsewhere, adjust the relative path from that file to `node_modules/streamdown-svelte/dist`. Without `@source`, built-in code blocks, tables, alerts, and theme classes can render unstyled in production builds.\n\n### Shiki themes\n\n`shikiTheme` controls the active built-in Shiki theme. `shikiThemes` is the registration map for custom theme names when you want to switch between imported themes by string.\n\nUse a single bundled theme name when one theme is enough:\n\n```svelte\n<Streamdown {content} shikiTheme=\"github-dark\" />\n```\n\nUse a light/dark tuple when your app already toggles `.dark`, `[data-theme='dark']`, or `color-scheme: dark` on `<html>` / `<body>` and you want Streamdown to follow that mode automatically:\n\n```svelte\n<Streamdown {content} shikiTheme={['github-light', 'github-dark']} />\n```\n\nYou can also pass imported Shiki theme objects directly:\n\n````svelte\n<script lang=\"ts\">\n\timport { Streamdown } from 'streamdown-svelte';\n\timport vitesseDark from '@shikijs/themes/vitesse-dark';\n\timport vitesseLight from '@shikijs/themes/vitesse-light';\n\n\tlet content = '```ts\\nconsole.log(\\\"hi\\\");\\n```';\n</script>\n\n<Streamdown {content} shikiTheme={[vitesseLight, vitesseDark]} />\n````\n\nWhen you want to switch custom themes by name at runtime, register them once with `shikiThemes` and then update `shikiTheme` reactively:\n\n````svelte\n<script lang=\"ts\">\n\timport { Streamdown } from 'streamdown-svelte';\n\timport vitesseDark from '@shikijs/themes/vitesse-dark';\n\timport vitesseLight from '@shikijs/themes/vitesse-light';\n\n\tlet content = '```ts\\nconsole.log(\\\"hi\\\");\\n```';\n\tlet isDark = false;\n\n\tconst shikiThemes = {\n\t\t'vitesse-light': vitesseLight,\n\t\t'vitesse-dark': vitesseDark\n\t};\n</script>\n\n<button type=\"button\" onclick={() => (isDark = !isDark)}> Toggle code theme </button>\n\n<Streamdown {content} shikiTheme={isDark ? 'vitesse-dark' : 'vitesse-light'} {shikiThemes} />\n````\n\nThere is no `shikiPreloadThemes` prop in the current API. Theme switching is supported by updating `shikiTheme`, and custom theme registrations should be passed through `shikiThemes` or directly inside the `shikiTheme` tuple.\n\nIf you pass a custom `plugins.code`, its `getThemes()` result becomes the active code-block theme source instead of `shikiTheme`.\n\n### Math and Mermaid\n\nMath and Mermaid are opt-in plugins. The minimal consumer setup is:\n\n```svelte\n<script lang=\"ts\">\n\timport { Streamdown, createMathPlugin, createMermaidPlugin } from 'streamdown-svelte';\n\n\tlet content = `\n$$E = mc^2$$\n\n\\`\\`\\`mermaid\ngraph TD\n  A --> B\n\\`\\`\\`\n`;\n\n\tconst plugins = {\n\t\tmath: createMathPlugin(),\n\t\tmermaid: createMermaidPlugin()\n\t};\n</script>\n\n<Streamdown {content} {plugins} />\n```\n\nStreamdown's built-in math component imports the default KaTeX stylesheet for rendered math. Without `plugins.math`, math falls back to plain text. Without `plugins.mermaid`, Mermaid fences fall back to code-style output.\n\n## What Ships Today\n\n- Streaming and static rendering modes\n- Incomplete-markdown repair for streaming content\n- Streaming parse caching for block splits and per-block lexing\n- Hardened link, image, and raw HTML handling\n- Built-in code block rendering with syntax highlighting, copy, and download controls\n- Tables, alerts, footnotes, description lists, sub/sup text, and inline citations\n- MDX-style component tags and custom marked extensions\n- Snippet- and component-based rendering overrides\n- Theme, icon, translation, and control customization\n\n## Streaming Performance\n\n`streamdown-svelte` now keeps a parser cache around the active markdown stream. During streaming updates it reuses the latest document split and memoizes lexed results for stable block content, while the actively changing tail block stays transient so the cache does not grow without bound across token-by-token updates.\n\nThis closes the markdown parse-caching gap raised in `beynar/svelte-streamdown#18`. The remaining accepted performance drift versus the React reference is narrower: React-specific `memo` comparators and deferred-render internals are still framework-specific and documented separately in `docs/parity-matrix.md`.\n\n## Harness Engineering\n\nThis repository is developed with [OpenASE](https://github.com/PacificStudio/openase) driving Codex through a Harness Engineering workflow. The core idea is simple: define the hard boundaries first, then let implementation move fast inside those boundaries.\n\nFor `streamdown-svelte`, that means OpenASE is used to orchestrate Codex against validation-first harnesses around parser parity, API surface contracts, browser rendering parity, and end-to-end streaming and non-streaming behavior. Once those harnesses are in place, Codex can move quickly across parser fixes, rendering details, package boundaries, and interaction polish without drifting away from the expected observable behavior.\n\nIn practice, the harness comes before the speed:\n\n- acceptance criteria are written down as executable contracts\n- rendering behavior is pinned with browser and Playwright coverage\n- streaming and settled-document behavior are both tested explicitly\n- package/export boundaries are verified separately from UI behavior\n\nThat setup is what lets the project iterate quickly while still closing parity gaps in a controlled way.\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/PacificStudio/streamdown-svelte/master/static/openase-kanban-board.png\" alt=\"OpenASE kanban board\" width=\"100%\" />\n</p>\n<p align=\"center\">\n  OpenASE drives Codex through ticket-based execution while the harness keeps the engineering boundary explicit.\n</p>\n\n| Harness layer              | What it locks down                                                               | Why it matters                                                                            | Main validation entrypoints                                                                                                               |\n| -------------------------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| API surface harness        | Root exports, subpath exports, public types, package boundaries                  | Prevents accidental drift while refactoring internals or splitting packages               | `pnpm verify:api-surface`, `tests/contracts/api-surface.spec.ts`                                                                          |\n| Parser harness             | Block splitting, incomplete-markdown repair, normalized parser IR                | Keeps streaming repair and final parsing behavior aligned with the reference contract     | `tests/contracts/parser-parity.spec.ts`, `tests/ported/remend/*`, `tests/ported/streamdown/parser/*`                                      |\n| Rendering harness          | Observable DOM structure for markdown, tables, code, citations, and embeds       | Ensures UI work stays parity-first instead of becoming framework-specific guesswork       | `tests/playwright/parity/rendering.spec.ts`, `tests/ported/streamdown/rendering/*`                                                        |\n| Streaming harness          | Token-by-token updates, incomplete fences, caret, animations, stable-block reuse | Verifies the chat-style experience instead of only final static output                    | `tests/playwright/parity/streaming.spec.ts`, `tests/ported/streamdown/interactions/streaming-updates.svelte.test.ts`                      |\n| Non-streaming harness      | Settled final output, static rendering, CommonMark/GFM expectations              | Keeps the library reliable for normal markdown rendering, not just live streams           | `tests/playwright/commonmark/parity.spec.ts`, `tests/ported/streamdown/rendering/final-coverage.svelte.test.ts`                           |\n| Interaction harness        | Copy/download/fullscreen controls, link safety, Mermaid and table UX             | Protects user-facing behavior that is easy to regress during visual refactors             | `tests/ported/streamdown/interactivity/*`, `tests/playwright/parity/interactions.spec.ts`, `tests/playwright/parity/style-probes.spec.ts` |\n| Parallel execution harness | Explicit docs for accepted drift, migration state, and remaining gaps            | Lets multiple agents move quickly on different slices without redefining \"done\" each time | `docs/parity-contract.md`, `docs/test-migration-status.md`, `docs/parity-matrix.md`                                                       |\n\n## Rich Rendering Plugins\n\nCode blocks work out of the box. Math, Mermaid, custom code-fence renderers, and CJK autolink fixes are enabled through the `plugins` prop.\n\n```svelte\n<script lang=\"ts\">\n\timport {\n\t\tStreamdown,\n\t\tcreateCodePlugin,\n\t\tcreateMathPlugin,\n\t\tcreateMermaidPlugin\n\t} from 'streamdown-svelte';\n\n\tlet content = `\n\\`\\`\\`ts\nconsole.log('highlighted');\n\\`\\`\\`\n\n$$E = mc^2$$\n\n\\`\\`\\`mermaid\ngraph TD\n  A --> B\n\\`\\`\\`\n`;\n\n\tconst plugins = {\n\t\tcode: createCodePlugin(),\n\t\tmath: createMathPlugin(),\n\t\tmermaid: createMermaidPlugin()\n\t};\n</script>\n\n<Streamdown {content} {plugins} />\n```\n\nWithout `plugins.math`, math falls back to plain text. Without `plugins.mermaid`, Mermaid fences fall back to code-style output.\n\n## Security and HTML\n\nRaw HTML is processed through Streamdown's security layer. You can allow specific tags, keep literal content for specific tags, restrict link and image destinations, or disable HTML rendering for HTML-like blocks entirely.\n\n```svelte\n<script lang=\"ts\">\n\timport { Streamdown } from 'streamdown-svelte';\n\n\tlet content = `\n[Docs](https://example.com/docs)\n![Logo](https://cdn.example.com/logo.png)\n<Callout>safe custom tag</Callout>\n`;\n</script>\n\n<Streamdown\n\t{content}\n\tallowedLinkPrefixes={['https://example.com']}\n\tallowedImagePrefixes={['https://cdn.example.com']}\n\tallowedTags={{\n\t\tcallout: ['class']\n\t}}\n\tliteralTagContent={['script', 'style']}\n/>\n```\n\nUse `allowedElements`, `disallowedElements`, or `allowElement` to filter parsed markdown nodes before render. Set `unwrapDisallowed` to keep a filtered node's children in place, `skipHtml` to drop raw HTML tokens entirely, and `urlTransform` to rewrite or remove rendered `href` / `src` values.\n\n## Custom Rendering\n\n### Snippets\n\nUse snippets when you want to replace the markup for a markdown token while keeping Streamdown's parsing and traversal.\n\n```svelte\n<script lang=\"ts\">\n\timport { Streamdown } from 'streamdown-svelte';\n\n\tlet content = `## Custom heading`;\n</script>\n\n<Streamdown {content}>\n\t{#snippet heading({ token, children })}\n\t\t<svelte:element this={`h${token.depth}`} class=\"font-serif text-balance text-emerald-700\">\n\t\t\t{@render children()}\n\t\t</svelte:element>\n\t{/snippet}\n</Streamdown>\n```\n\nShipped snippet keys include `heading`, `paragraph`, `blockquote`, `code`, `codespan`, `ul`, `ol`, `li`, `table`, `thead`, `tbody`, `tfoot`, `tr`, `td`, `th`, `image`, `link`, `strong`, `em`, `del`, `hr`, `br`, `math`, `alert`, `mermaid`, `footnoteRef`, `footnotePopover`, `sup`, `sub`, `descriptionList`, `description`, `descriptionTerm`, `descriptionDetail`, `inlineCitation`, `inlineCitationPreview`, `inlineCitationContent`, `inlineCitationPopover`, and `mdx`.\n\n### Components\n\nUse `components` when you want to replace selected built-in Svelte components directly.\n\n```svelte\n<script lang=\"ts\">\n\timport { Streamdown } from 'streamdown-svelte';\n\timport InlineCode from './InlineCode.svelte';\n\n\tlet content = 'Use `pnpm test` to run the suite.';\n</script>\n\n<Streamdown\n\t{content}\n\tcomponents={{\n\t\tinlineCode: InlineCode\n\t}}\n/>\n```\n\n`components` supports heading tags (`h1` through `h6`), `p`, `a`, `img`, `table`, `inlineCode`, `code`, `mermaid`, `mermaidError`, and `math`.\n\n### MDX Components\n\nUppercase tags in markdown can be rendered with `mdxComponents`:\n\n```svelte\n<script lang=\"ts\">\n\timport { Streamdown } from 'streamdown-svelte';\n\timport Card from './Card.svelte';\n\n\tlet content = `\n<Card title=\"Hello\">\nThis content is still parsed as **markdown**.\n</Card>\n`;\n</script>\n\n<Streamdown {content} mdxComponents={{ Card }} />\n```\n\n### Custom Extensions\n\nStreamdown exposes marked extension hooks through the `extensions` prop and renders unmatched custom tokens through the `children` snippet.\n\n```svelte\n<script lang=\"ts\">\n\timport { Streamdown, type Extension } from 'streamdown-svelte';\n\n\tconst callout: Extension = {\n\t\tname: 'callout',\n\t\tlevel: 'block',\n\t\ttokenizer(this, src) {\n\t\t\tconst match = src.match(/^:::callout\\n([\\s\\S]*?)\\n:::/);\n\t\t\tif (!match) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: 'callout',\n\t\t\t\traw: match[0],\n\t\t\t\ttokens: this.lexer.blockTokens(match[1] ?? '')\n\t\t\t};\n\t\t}\n\t};\n\n\tlet content = `:::callout\nImportant content\n:::`;\n</script>\n\n<Streamdown {content} extensions={[callout]}>\n\t{#snippet children({ token, children })}\n\t\t{#if token.type === 'callout'}\n\t\t\t<aside class=\"rounded-lg border px-4 py-3\">\n\t\t\t\t{@render children()}\n\t\t\t</aside>\n\t\t{/if}\n\t{/snippet}\n</Streamdown>\n```\n\n## Props\n\nThe public `StreamdownProps` type is exported from the package.\n\n| Prop                        | Type                                                                                                                                               | Notes                                                                               |\n| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |\n| `content`                   | `string`                                                                                                                                           | Markdown source to render.                                                          |\n| `mode`                      | `'static' \\| 'streaming'`                                                                                                                          | Selects streaming repair behavior.                                                  |\n| `static`                    | `boolean`                                                                                                                                          | Compatibility alias for forcing static mode.                                        |\n| `parseIncompleteMarkdown`   | `boolean`                                                                                                                                          | Enables or disables incomplete-markdown repair.                                     |\n| `parseMarkdownIntoBlocksFn` | `(markdown: string) => string[]`                                                                                                                   | Custom block splitter.                                                              |\n| `dir`                       | `'auto' \\| 'ltr' \\| 'rtl'`                                                                                                                         | Controls text direction.                                                            |\n| `class`                     | `string`                                                                                                                                           | Root wrapper class.                                                                 |\n| `className`                 | `string`                                                                                                                                           | Alias that is merged with `class`.                                                  |\n| `defaultOrigin`             | `string`                                                                                                                                           | Base origin for relative URLs.                                                      |\n| `allowedLinkPrefixes`       | `string[]`                                                                                                                                         | Link allowlist.                                                                     |\n| `allowedImagePrefixes`      | `string[]`                                                                                                                                         | Image allowlist.                                                                    |\n| `linkSafety`                | `LinkSafetyConfig`                                                                                                                                 | Link confirmation hooks and modal renderer.                                         |\n| `allowedTags`               | `AllowedTags`                                                                                                                                      | Raw HTML tag allowlist.                                                             |\n| `allowedElements`           | `string[]`                                                                                                                                         | Markdown element allowlist, using normalized tag names such as `p` or `h2`.         |\n| `allowElement`              | `AllowElement`                                                                                                                                     | Callback for per-element markdown filtering decisions.                              |\n| `disallowedElements`        | `string[]`                                                                                                                                         | Markdown element denylist, using normalized tag names such as `strong` or `li`.     |\n| `literalTagContent`         | `string[]`                                                                                                                                         | Tags whose inner content should be treated literally.                               |\n| `normalizeHtmlIndentation`  | `boolean`                                                                                                                                          | Normalizes indentation before HTML handling.                                        |\n| `renderHtml`                | `boolean \\| ((token: Tokens.HTML \\| Tokens.Tag) => string)`                                                                                        | Controls raw HTML rendering.                                                        |\n| `skipHtml`                  | `boolean`                                                                                                                                          | Drops raw HTML tokens before render.                                                |\n| `unwrapDisallowed`          | `boolean`                                                                                                                                          | Keeps a filtered markdown node's children instead of dropping the full subtree.     |\n| `urlTransform`              | `UrlTransform`                                                                                                                                     | Rewrites or removes rendered URL attributes before link/image hardening.            |\n| `sources`                   | `Record<string, any>`                                                                                                                              | Citation source data.                                                               |\n| `inlineCitationsMode`       | `'list' \\| 'carousel'`                                                                                                                             | Citation popover layout.                                                            |\n| `plugins`                   | `PluginConfig`                                                                                                                                     | Enables math, Mermaid, CJK, custom renderers, or a custom highlighter contract.     |\n| `extensions`                | `Extension[]`                                                                                                                                      | Custom marked tokenizers.                                                           |\n| `components`                | `StreamdownComponents`                                                                                                                             | Component overrides for selected rendered elements.                                 |\n| `mdxComponents`             | `Record<string, Component>`                                                                                                                        | Component map for uppercase MDX-style tags.                                         |\n| `children`                  | `Snippet`                                                                                                                                          | Fallback renderer for unmatched custom tokens.                                      |\n| `theme`                     | `DeepPartialTheme`                                                                                                                                 | Theme overrides.                                                                    |\n| `baseTheme`                 | `'tailwind' \\| 'shadcn'`                                                                                                                           | Built-in theme base.                                                                |\n| `mergeTheme`                | `boolean`                                                                                                                                          | Merge custom theme with the selected base theme.                                    |\n| `prefix`                    | `string`                                                                                                                                           | Prefixes generated utility classes.                                                 |\n| `lineNumbers`               | `boolean`                                                                                                                                          | Enables line numbers for fenced code blocks when the fence allows them.             |\n| `shikiTheme`                | `string \\| ThemeRegistration \\| [string \\| ThemeRegistration, string \\| ThemeRegistration]`                                                        | Active bundled theme name, imported theme registration, or a `[light, dark]` tuple. |\n| `shikiLanguages`            | `LanguageInfo[]`                                                                                                                                   | Extra languages for the built-in highlighter.                                       |\n| `shikiThemes`               | `Record<string, ThemeRegistration>`                                                                                                                | Custom Shiki theme registrations referenced by `shikiTheme`.                        |\n| `mermaidConfig`             | `MermaidConfig`                                                                                                                                    | Mermaid configuration passed to the renderer.                                       |\n| `katexConfig`               | `KatexOptions \\| ((inline: boolean) => KatexOptions)`                                                                                              | KaTeX configuration.                                                                |\n| `translations`              | `Partial<StreamdownTranslations>`                                                                                                                  | UI label overrides.                                                                 |\n| `controls`                  | `{ code?, mermaid?, table? }`                                                                                                                      | Enables or disables built-in action controls.                                       |\n| `animation`                 | `{ enabled?, animateOnMount?, type?, duration?, timingFunction?, tokenize? }`                                                                      | Streaming animation configuration.                                                  |\n| `animated`                  | `boolean \\| AnimateOptions`                                                                                                                        | Compatibility animation API.                                                        |\n| `isAnimating`               | `boolean`                                                                                                                                          | Tells Streamdown whether content is actively streaming.                             |\n| `caret`                     | `keyof typeof carets`                                                                                                                              | Caret glyph shown while streaming.                                                  |\n| `onAnimationStart`          | `() => void`                                                                                                                                       | Called when `isAnimating` flips on.                                                 |\n| `onAnimationEnd`            | `() => void`                                                                                                                                       | Called when `isAnimating` flips off.                                                |\n| `streamdown`                | `StreamdownContext`                                                                                                                                | Bindable instance of the active context.                                            |\n| `element`                   | `HTMLElement`                                                                                                                                      | Bindable root element reference.                                                    |\n| `icons`                     | `{ copy?, download?, fullscreen?, zoomIn?, zoomOut?, fitView?, note?, tip?, warning?, caution?, important?, chevronLeft?, chevronRight?, check? }` | Snippet overrides for built-in icons.                                               |\n\n## Public Exports\n\nRoot exports include:\n\n- `Streamdown`\n- `useStreamdown`\n- `normalizeHtmlIndentation`\n- `theme`, `shadcnTheme`, `mergeTheme`\n- `lex`, `parseBlocks`, `parseIncompleteMarkdown`, `IncompleteMarkdownParser`\n- `createCodePlugin`, `createMathPlugin`, `createMermaidPlugin`, `createCjkPlugin`\n- `defaultTranslations`, `mergeTranslations`\n- `bundledLanguagesInfo`, `createLanguageSet`\n- `extractTableDataFromElement`, `tableDataToCSV`, `tableDataToMarkdown`, `tableDataToTSV`\n\nSubpath exports:\n\n- `streamdown-svelte/code`\n- `streamdown-svelte/math`\n- `streamdown-svelte/mermaid`\n- `streamdown-svelte/remend` (delegates to the standalone `@streamdown-svelte/remend` package contract)\n\n## Development\n\n```bash\npnpm install\npnpm build:packages\npnpm check\npnpm test\n```\n\n### Benchmarks\n\nRun the compare benchmark to generate a shareable performance report with platform metadata and charts:\n\n```bash\npnpm bench:compare\n```\n\nThis command runs the local/reference benchmark suite and writes these artifacts under `coverage/benchmarks`:\n\n- `compare.json`: raw `vitest bench` output\n- `compare-report.md`: markdown report with overall summary, suite summary, top improvements, regressions, and full breakdown\n- `compare-report.json`: machine-readable summary with platform metadata and computed deltas\n- `compare-by-suite.svg`: bar chart grouped by benchmark area such as `Parse Blocks`, `Remend Parser`, `Stream Render`, and `Table Utilities`\n- `compare-by-scenario.svg`: bar chart for individual scenarios, sorted by improvement/regression magnitude\n\nThe report automatically annotates the benchmark platform so screenshots and pasted results keep their execution context:\n\n- OS / kernel / architecture\n- CPU model and logical core count\n- total memory\n- Node and pnpm versions\n- git branch and commit\n\nIf you still want the legacy plain-text summary, use:\n\n```bash\npnpm bench:compare:raw\n```\n\nTypical `compare-report.md` output looks like this:\n\n```md\n# Benchmark Comparison Report\n\n- Generated: 2026-04-07T10:21:48.181Z\n- Source JSON: `coverage/benchmarks/compare.json`\n- Platform: linux 6.17.0-14-generic (x64)\n- CPU: Intel(R) Core(TM) Ultra 9 285K | 24 logical cores\n- Memory: 188.1 GiB\n- Runtime: Node v22.22.1 | pnpm 10.32.1\n- Git: `master` @ `07c8980`\n\n## Overall\n\n- Pairs: 31\n- Local wins: 19\n- Reference wins: 12\n- Geometric mean throughput: 1.32x (+31.8%)\n```\n\nExample charts from the current workspace snapshot are checked into `docs/benchmarks/` so the README can show a stable preview. These numbers are machine-dependent and should be treated as an example, not a canonical baseline.\n\n#### By Suite\n\n![Benchmark comparison by suite](docs/benchmarks/compare-by-suite.svg)\n\n#### By Scenario\n\n![Benchmark comparison by scenario](docs/benchmarks/compare-by-scenario.svg)\n\n## Workspace Baseline\n\nThe repository now keeps a pnpm workspace baseline for publishable packages:\n\n- repo root: `svelte-streamdown`\n- `packages/remend`: streaming markdown repair utilities prepared for standalone packing\n\nShared package conventions live in:\n\n- `pnpm-workspace.yaml`\n- `config/tsconfig.package.json`\n- `config/tsup-package.mjs`\n- `scripts/lib/publishable-packages.mjs`\n\nValidation entrypoints for the workspace split:\n\n- `pnpm verify:pack`\n- `pnpm verify:exports`\n- `pnpm verify:workspace-smoke`\n\nSee `docs/workspace-baseline.md` for the repo layout, local linking workflow, and packaging rules.\n\nSee [CONTRIBUTING.md](https://github.com/PacificStudio/streamdown-svelte/blob/master/CONTRIBUTING.md) for the regression intake workflow, parity fixture naming convention, and bug-fix PR expectations.\n\n## Friendly Link\n\n[LinuxDo](linux.do)\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}