streamdown 1.1.6 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,8 +17,8 @@ Streamdown powers the [AI Elements Response](https://ai-sdk.dev/elements/compone
17
17
  - 🎨 **Unterminated block parsing** - Styles incomplete bold, italic, code, links, and headings
18
18
  - 📊 **GitHub Flavored Markdown** - Tables, task lists, and strikethrough support
19
19
  - 🔢 **Math rendering** - LaTeX equations via KaTeX
20
+ - 📈 **Mermaid diagrams** - Render Mermaid diagrams as code blocks with a button to render them
20
21
  - 🎯 **Code syntax highlighting** - Beautiful code blocks with Shiki
21
- - 📈 **Mermaid diagrams** - Render flowcharts, sequence diagrams, and more
22
22
  - 🛡️ **Security-first** - Built on harden-react-markdown for safe rendering
23
23
  - ⚡ **Performance optimized** - Memoized rendering for efficient updates
24
24
 
@@ -28,7 +28,7 @@ Streamdown powers the [AI Elements Response](https://ai-sdk.dev/elements/compone
28
28
  npm i streamdown
29
29
  ```
30
30
 
31
- Then, update your Tailwind `globals.css` to include the following:
31
+ Then, update your Tailwind `globals.css` to include the following.
32
32
 
33
33
  ```css
34
34
  @source "../node_modules/streamdown/dist/index.js";
@@ -45,7 +45,7 @@ import { Streamdown } from 'streamdown';
45
45
 
46
46
  export default function Page() {
47
47
  const markdown = "# Hello World\n\nThis is **streaming** markdown!";
48
-
48
+
49
49
  return <Streamdown>{markdown}</Streamdown>;
50
50
  }
51
51
  ```
@@ -76,14 +76,14 @@ sequenceDiagram
76
76
  participant User
77
77
  participant API
78
78
  participant Database
79
-
79
+
80
80
  User->>API: Request data
81
81
  API->>Database: Query
82
82
  Database-->>API: Results
83
83
  API-->>User: Response
84
84
  \`\`\`
85
85
  `;
86
-
86
+
87
87
  return <Streamdown>{markdown}</Streamdown>;
88
88
  }
89
89
  ```
@@ -165,6 +165,9 @@ Streamdown is built as a monorepo with:
165
165
  # Install dependencies
166
166
  pnpm install
167
167
 
168
+ # Build the streamdown package
169
+ pnpm --filter streamdown build
170
+
168
171
  # Run development server
169
172
  pnpm dev
170
173
 
package/dist/index.cjs CHANGED
@@ -1,5 +1,8 @@
1
- "use strict";"use client";var j=Object.create;var T=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var ne=(e,t)=>{for(var r in t)T(e,r,{get:t[r],enumerable:!0})},A=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ee(t))!re.call(e,o)&&o!==r&&T(e,o,{get:()=>t[o],enumerable:!(n=x(t,o))||n.enumerable});return e};var M=(e,t,r)=>(r=e!=null?j(te(e)):{},A(t||!e||!e.__esModule?T(r,"default",{value:e,enumerable:!0}):r,e)),oe=e=>A(T({},"__esModule",{value:!0}),e);var Re={};ne(Re,{ShikiThemeContext:()=>$,Streamdown:()=>Y});module.exports=oe(Re);var h=require("react"),G=M(require("react-markdown"),1),F=M(require("rehype-katex"),1),J=M(require("remark-gfm"),1),Q=M(require("remark-math"),1),Xe=require("katex/dist/katex.min.css"),H=M(require("harden-react-markdown"),1);var K=require("react");var B=require("lucide-react"),m=require("react"),P=require("shiki");var _=require("clsx"),R=require("tailwind-merge"),s=(...e)=>(0,R.twMerge)((0,_.clsx)(e));var k=require("react/jsx-runtime"),D=(0,m.createContext)({code:""});async function se(e,t,r){return Promise.all([await(0,P.codeToHtml)(e,{lang:t,theme:r[0]}),await(0,P.codeToHtml)(e,{lang:t,theme:r[1]})])}var E=({code:e,language:t,className:r,children:n,...o})=>{let[i,d]=(0,m.useState)(""),[c,l]=(0,m.useState)(""),u=(0,m.useRef)(!1),[g,y]=(0,m.useContext)($);return(0,m.useEffect)(()=>(se(e,t,[g,y]).then(([f,b])=>{u.current||(d(f),l(b),u.current=!0)}),()=>{u.current=!1}),[e,t,g,y]),(0,k.jsx)(D.Provider,{value:{code:e},children:(0,k.jsxs)("div",{className:"group relative",children:[(0,k.jsx)("div",{className:s("overflow-x-auto dark:hidden [&>pre]:bg-transparent!",r),dangerouslySetInnerHTML:{__html:i},...o}),(0,k.jsx)("div",{className:s("hidden overflow-x-auto dark:block [&>pre]:bg-transparent!",r),dangerouslySetInnerHTML:{__html:c},...o}),n]})})},S=({onCopy:e,onError:t,timeout:r=2e3,children:n,className:o,code:i,...d})=>{let[c,l]=(0,m.useState)(!1),u=(0,m.useContext)(D).code,g=i!=null?i:u,y=async()=>{var b;if(typeof window=="undefined"||!((b=navigator==null?void 0:navigator.clipboard)!=null&&b.writeText)){t==null||t(new Error("Clipboard API not available"));return}try{await navigator.clipboard.writeText(g),l(!0),e==null||e(),setTimeout(()=>l(!1),r)}catch(w){t==null||t(w)}},f=c?B.CheckIcon:B.CopyIcon;return(0,k.jsx)("button",{className:s("absolute top-2 right-2 shrink-0 rounded-md p-3 opacity-0 transition-all","hover:bg-secondary group-hover:opacity-100",o),onClick:y,type:"button",...d,children:n!=null?n:(0,k.jsx)(f,{size:14})})};var C=require("react");var p=require("react/jsx-runtime"),O=!1,ae=async()=>{if(!O){let r=(await import("mermaid")).default;return r.initialize({startOnLoad:!1,theme:"default",securityLevel:"strict",fontFamily:"monospace",suppressErrorRendering:!0}),O=!0,r}return(await import("mermaid")).default},U=({chart:e,className:t})=>{let[r,n]=(0,C.useState)(null),[o,i]=(0,C.useState)(!0),[d,c]=(0,C.useState)(""),[l,u]=(0,C.useState)("");if((0,C.useEffect)(()=>{(async()=>{try{n(null),i(!0);let f=await ae(),b=e.split("").reduce((L,Z)=>(L<<5)-L+Z.charCodeAt(0)|0,0),w=`mermaid-${Math.abs(b)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:I}=await f.render(w,e);c(I),u(I)}catch(f){if(!(l||d)){let b=f instanceof Error?f.message:"Failed to render Mermaid chart";n(b)}}finally{i(!1)}})()},[e]),o&&!d&&!l)return(0,p.jsx)("div",{className:s("my-4 flex justify-center p-4",t),children:(0,p.jsxs)("div",{className:"flex items-center space-x-2 text-muted-foreground",children:[(0,p.jsx)("div",{className:"h-4 w-4 animate-spin rounded-full border-current border-b-2"}),(0,p.jsx)("span",{className:"text-sm",children:"Loading diagram..."})]})});if(r&&!d&&!l)return(0,p.jsxs)("div",{className:s("rounded-lg border border-red-200 bg-red-50 p-4",t),children:[(0,p.jsxs)("p",{className:"font-mono text-red-700 text-sm",children:["Mermaid Error: ",r]}),(0,p.jsxs)("details",{className:"mt-2",children:[(0,p.jsx)("summary",{className:"cursor-pointer text-red-600 text-xs",children:"Show Code"}),(0,p.jsx)("pre",{className:"mt-2 overflow-x-auto rounded bg-red-100 p-2 text-red-800 text-xs",children:e})]})]});let g=d||l;return(0,p.jsx)("div",{"aria-label":"Mermaid chart",className:s("my-4 flex justify-center",t),dangerouslySetInnerHTML:{__html:g},role:"img"})};var a=require("react/jsx-runtime"),ie=/language-([^\s]+)/,de=({node:e,className:t,children:r,...n})=>{var l,u,g;if(((l=e==null?void 0:e.position)==null?void 0:l.start.line)===((u=e==null?void 0:e.position)==null?void 0:u.end.line))return(0,a.jsx)("code",{className:s("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...n,children:r});let i=t==null?void 0:t.match(ie),d=(g=i==null?void 0:i.at(1))!=null?g:"plaintext",c="";return(0,K.isValidElement)(r)&&r.props&&typeof r.props=="object"&&"children"in r.props&&typeof r.props.children=="string"?c=r.props.children:typeof r=="string"&&(c=r),d==="mermaid"?(0,a.jsxs)("div",{className:s("group relative my-4 h-auto rounded-lg border p-4",t),"data-streamdown":"mermaid-block",children:[(0,a.jsx)(U,{chart:c}),(0,a.jsx)(S,{code:c})]}):(0,a.jsx)(E,{className:s("my-4 h-auto rounded-lg border p-4",t),code:c,"data-language":d,"data-streamdown":"code-block",language:d,children:(0,a.jsx)(S,{})})},q={ol:({node:e,children:t,className:r,...n})=>(0,a.jsx)("ol",{className:s("ml-4 list-outside list-decimal",r),"data-streamdown":"ordered-list",...n,children:t}),li:({node:e,children:t,className:r,...n})=>(0,a.jsx)("li",{className:s("py-1",r),"data-streamdown":"list-item",...n,children:t}),ul:({node:e,children:t,className:r,...n})=>(0,a.jsx)("ul",{className:s("ml-4 list-outside list-disc",r),"data-streamdown":"unordered-list",...n,children:t}),hr:({node:e,className:t,...r})=>(0,a.jsx)("hr",{className:s("my-6 border-border",t),"data-streamdown":"horizontal-rule",...r}),strong:({node:e,children:t,className:r,...n})=>(0,a.jsx)("span",{className:s("font-semibold",r),"data-streamdown":"strong",...n,children:t}),a:({node:e,children:t,className:r,href:n,...o})=>(0,a.jsx)("a",{className:s("font-medium text-primary underline",r),"data-streamdown":"link",href:n,rel:"noreferrer",target:"_blank",...o,children:t}),h1:({node:e,children:t,className:r,...n})=>(0,a.jsx)("h1",{className:s("mt-6 mb-2 font-semibold text-3xl",r),"data-streamdown":"heading-1",...n,children:t}),h2:({node:e,children:t,className:r,...n})=>(0,a.jsx)("h2",{className:s("mt-6 mb-2 font-semibold text-2xl",r),"data-streamdown":"heading-2",...n,children:t}),h3:({node:e,children:t,className:r,...n})=>(0,a.jsx)("h3",{className:s("mt-6 mb-2 font-semibold text-xl",r),"data-streamdown":"heading-3",...n,children:t}),h4:({node:e,children:t,className:r,...n})=>(0,a.jsx)("h4",{className:s("mt-6 mb-2 font-semibold text-lg",r),"data-streamdown":"heading-4",...n,children:t}),h5:({node:e,children:t,className:r,...n})=>(0,a.jsx)("h5",{className:s("mt-6 mb-2 font-semibold text-base",r),"data-streamdown":"heading-5",...n,children:t}),h6:({node:e,children:t,className:r,...n})=>(0,a.jsx)("h6",{className:s("mt-6 mb-2 font-semibold text-sm",r),"data-streamdown":"heading-6",...n,children:t}),table:({node:e,children:t,className:r,...n})=>(0,a.jsx)("div",{className:"my-4 overflow-x-auto","data-streamdown":"table-wrapper",children:(0,a.jsx)("table",{className:s("w-full border-collapse border border-border",r),"data-streamdown":"table",...n,children:t})}),thead:({node:e,children:t,className:r,...n})=>(0,a.jsx)("thead",{className:s("bg-muted/50",r),"data-streamdown":"table-header",...n,children:t}),tbody:({node:e,children:t,className:r,...n})=>(0,a.jsx)("tbody",{className:s("divide-y divide-border",r),"data-streamdown":"table-body",...n,children:t}),tr:({node:e,children:t,className:r,...n})=>(0,a.jsx)("tr",{className:s("border-border border-b",r),"data-streamdown":"table-row",...n,children:t}),th:({node:e,children:t,className:r,...n})=>(0,a.jsx)("th",{className:s("px-4 py-2 text-left font-semibold text-sm",r),"data-streamdown":"table-header-cell",...n,children:t}),td:({node:e,children:t,className:r,...n})=>(0,a.jsx)("td",{className:s("px-4 py-2 text-sm",r),"data-streamdown":"table-cell",...n,children:t}),blockquote:({node:e,children:t,className:r,...n})=>(0,a.jsx)("blockquote",{className:s("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",r),"data-streamdown":"blockquote",...n,children:t}),code:de,pre:({children:e})=>e,sup:({node:e,children:t,className:r,...n})=>(0,a.jsx)("sup",{className:s("text-sm",r),"data-streamdown":"superscript",...n,children:t}),sub:({node:e,children:t,className:r,...n})=>(0,a.jsx)("sub",{className:s("text-sm",r),"data-streamdown":"subscript",...n,children:t})};var z=require("marked"),V=e=>z.marked.use({gfm:!0}).lexer(e).map(r=>r.raw);var le=/(!?\[)([^\]]*?)$/,ce=/(\*\*)([^*]*?)$/,me=/(__)([^_]*?)$/,ue=/(\*\*\*)([^*]*?)$/,pe=/(\*)([^*]*?)$/,ge=/(_)([^_]*?)$/,he=/(`)([^`]*?)$/,fe=/(~~)([^~]*?)$/,be=/(\$\$)([^$]*?)$/,N=e=>{let t=(e.match(/```/g)||[]).length;return t>0&&t%2===0&&e.includes(`
2
- `)},ke=e=>{let t=e.match(le);if(t){let r=e.lastIndexOf(t[1]);return e.substring(0,r)}return e},ye=e=>N(e)?e:e.match(ce)&&(e.match(/\*\*/g)||[]).length%2===1?`${e}**`:e,Me=e=>e.match(me)&&(e.match(/__/g)||[]).length%2===1?`${e}__`:e,Ce=e=>e.split("").reduce((t,r,n)=>{if(r==="*"){let o=e[n-1],i=e[n+1];if(o==="\\")return t;let d=n;for(let l=n-1;l>=0;l--){if(e[l]===`
3
- `){d=l+1;break}if(l===0){d=0;break}}if(e.substring(d,n).trim()===""&&(i===" "||i===" "))return t;if(o!=="*"&&i!=="*")return t+1}return t},0),we=e=>N(e)?e:e.match(pe)&&Ce(e)%2===1?`${e}*`:e,Be=(e,t)=>{let r=!1,n=!1;for(let o=0;o<e.length&&o<t;o++){if(e[o]==="\\"&&e[o+1]==="$"){o++;continue}e[o]==="$"&&(e[o+1]==="$"?(n=!n,o++,r=!1):n||(r=!r))}return r||n},ve=e=>e.split("").reduce((t,r,n)=>{if(r==="_"){let o=e[n-1],i=e[n+1];if(o==="\\"||Be(e,n))return t;if(o!=="_"&&i!=="_")return t+1}return t},0),Ie=e=>N(e)?e:e.match(ge)&&ve(e)%2===1?`${e}_`:e,Te=(e,t)=>{let r=e.substring(t,t+3)==="```",n=t>0&&e.substring(t-1,t+2)==="```",o=t>1&&e.substring(t-2,t+1)==="```";return r||n||o},$e=e=>{let t=0;for(let r=0;r<e.length;r++)e[r]==="`"&&!Te(e,r)&&t++;return t},Ne=e=>{if(e.match(/^```[^`\n]*```?$/)&&!e.includes(`
1
+ "use strict";"use client";var te=Object.create;var B=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty;var ie=(e,t)=>{for(var r in t)B(e,r,{get:t[r],enumerable:!0})},_=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ne(t))!se.call(e,o)&&o!==r&&B(e,o,{get:()=>t[o],enumerable:!(n=re(t,o))||n.enumerable});return e};var v=(e,t,r)=>(r=e!=null?te(oe(e)):{},_(t||!e||!e.__esModule?B(r,"default",{value:e,enumerable:!0}):r,e)),ae=e=>_(B({},"__esModule",{value:!0}),e);var ze={};ie(ze,{ShikiThemeContext:()=>I,Streamdown:()=>Z});module.exports=ae(ze);var k=require("react"),F=v(require("react-markdown"),1),X=v(require("rehype-katex"),1),J=v(require("remark-gfm"),1),Q=v(require("remark-math"),1),Ze=require("katex/dist/katex.min.css"),L=v(require("harden-react-markdown"),1);var G=require("react");var $=require("lucide-react"),g=require("react"),N=require("shiki"),W=require("shiki/engine/javascript");var R=require("clsx"),E=require("tailwind-merge"),i=(...e)=>(0,E.twMerge)((0,R.clsx)(e));var h=require("react/jsx-runtime"),le=/<pre(\s|>)/,z=(0,g.createContext)({code:""}),S=class{constructor(){this.lightHighlighter=null;this.darkHighlighter=null;this.lightTheme=null;this.darkTheme=null;this.loadedLanguages=new Set;this.initializationPromise=null}async ensureHighlightersInitialized(t,r){let[n,o]=t,s=(0,W.createJavaScriptRegexEngine)({forgiving:!0}),a=!this.lightHighlighter||this.lightTheme!==n,c=!this.darkHighlighter||this.darkTheme!==o;(a||c)&&this.loadedLanguages.clear();let l=!this.loadedLanguages.has(r);if(a?(this.lightHighlighter=await(0,N.createHighlighter)({themes:[n],langs:[r],engine:s}),this.lightTheme=n,this.loadedLanguages.add(r)):l&&await this.lightHighlighter.loadLanguage(r),c){let m=l?[...this.loadedLanguages,r]:Array.from(this.loadedLanguages);this.darkHighlighter=await(0,N.createHighlighter)({themes:[o],langs:m.length>0?m:[r],engine:s}),this.darkTheme=o}else l&&await this.darkHighlighter.loadLanguage(r);l&&this.loadedLanguages.add(r)}async highlightCode(t,r,n,o){this.initializationPromise&&await this.initializationPromise,this.initializationPromise=this.ensureHighlightersInitialized(n,r),await this.initializationPromise,this.initializationPromise=null;let s=u=>o?u.replace(le,`<pre class="${o}"$1`):u,[a,c]=n,l=this.lightHighlighter.codeToHtml(t,{lang:r,theme:a}),m=this.darkHighlighter.codeToHtml(t,{lang:r,theme:c});return[D(s(l)),D(s(m))]}},de=new S;async function ce(e,t,r,n){return de.highlightCode(e,t,r,n)}function D(e){return e.replace(/(<pre[^>]*)(style="[^"]*background[^";]*;?[^"]*")([^>]*>)/g,"$1$3")}var O=({code:e,language:t,className:r,children:n,preClassName:o,...s})=>{let[a,c]=(0,g.useState)(""),[l,m]=(0,g.useState)(""),u=(0,g.useRef)(!1),[y,f]=(0,g.useContext)(I);return(0,g.useEffect)(()=>(u.current=!0,ce(e,t,[y,f],o).then(([b,w])=>{u.current&&(c(b),m(w))}),()=>{u.current=!1}),[e,t,y,f,o]),(0,h.jsx)(z.Provider,{value:{code:e},children:(0,h.jsxs)("div",{className:"my-4 w-full overflow-hidden rounded-xl border","data-code-block-container":!0,"data-language":t,children:[(0,h.jsxs)("div",{className:"flex items-center justify-between bg-muted/80 p-3 text-muted-foreground text-xs","data-code-block-header":!0,"data-language":t,children:[(0,h.jsx)("span",{className:"ml-1 font-mono lowercase",children:t}),(0,h.jsx)("div",{children:n})]}),(0,h.jsx)("div",{className:"w-full",children:(0,h.jsxs)("div",{className:"min-w-full",children:[(0,h.jsx)("div",{className:i("overflow-x-auto dark:hidden",r),"data-code-block":!0,"data-language":t,dangerouslySetInnerHTML:{__html:a},...s}),(0,h.jsx)("div",{className:i("hidden overflow-x-auto dark:block",r),"data-code-block":!0,"data-language":t,dangerouslySetInnerHTML:{__html:l},...s})]})})]})})},H=({onCopy:e,onError:t,timeout:r=2e3,children:n,className:o,code:s,...a})=>{let[c,l]=(0,g.useState)(!1),m=(0,g.useContext)(z).code,u=s!=null?s:m,y=async()=>{var b;if(typeof window=="undefined"||!((b=navigator==null?void 0:navigator.clipboard)!=null&&b.writeText)){t==null||t(new Error("Clipboard API not available"));return}try{await navigator.clipboard.writeText(u),l(!0),e==null||e(),setTimeout(()=>l(!1),r)}catch(w){t==null||t(w)}},f=c?$.CheckIcon:$.CopyIcon;return(0,h.jsx)("button",{className:i("text-muted-foreground","p-1 transition-all",o),onClick:y,type:"button",...a,children:n!=null?n:(0,h.jsx)(f,{size:14})})};var M=require("react");var p=require("react/jsx-runtime"),U=!1,me=async()=>{if(!U){let r=(await import("mermaid")).default;return r.initialize({startOnLoad:!1,theme:"default",securityLevel:"strict",fontFamily:"monospace",suppressErrorRendering:!0}),U=!0,r}return(await import("mermaid")).default},q=({chart:e,className:t})=>{let[r,n]=(0,M.useState)(null),[o,s]=(0,M.useState)(!0),[a,c]=(0,M.useState)(""),[l,m]=(0,M.useState)("");if((0,M.useEffect)(()=>{(async()=>{try{n(null),s(!0);let f=await me(),b=e.split("").reduce((A,ee)=>(A<<5)-A+ee.charCodeAt(0)|0,0),w=`mermaid-${Math.abs(b)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:T}=await f.render(w,e);c(T),m(T)}catch(f){if(!(l||a)){let b=f instanceof Error?f.message:"Failed to render Mermaid chart";n(b)}}finally{s(!1)}})()},[e]),o&&!a&&!l)return(0,p.jsx)("div",{className:i("my-4 flex justify-center p-4",t),children:(0,p.jsxs)("div",{className:"flex items-center space-x-2 text-muted-foreground",children:[(0,p.jsx)("div",{className:"h-4 w-4 animate-spin rounded-full border-current border-b-2"}),(0,p.jsx)("span",{className:"text-sm",children:"Loading diagram..."})]})});if(r&&!a&&!l)return(0,p.jsxs)("div",{className:i("rounded-lg border border-red-200 bg-red-50 p-4",t),children:[(0,p.jsxs)("p",{className:"font-mono text-red-700 text-sm",children:["Mermaid Error: ",r]}),(0,p.jsxs)("details",{className:"mt-2",children:[(0,p.jsx)("summary",{className:"cursor-pointer text-red-600 text-xs",children:"Show Code"}),(0,p.jsx)("pre",{className:"mt-2 overflow-x-auto rounded bg-red-100 p-2 text-red-800 text-xs",children:e})]})]});let u=a||l;return(0,p.jsx)("div",{"aria-label":"Mermaid chart",className:i("my-4 flex justify-center",t),dangerouslySetInnerHTML:{__html:u},role:"img"})};var d=require("react/jsx-runtime"),ue=/language-([^\s]+)/,he=({node:e,className:t,children:r,...n})=>{var l,m,u;if(((l=e==null?void 0:e.position)==null?void 0:l.start.line)===((m=e==null?void 0:e.position)==null?void 0:m.end.line))return(0,d.jsx)("code",{className:i("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...n,children:r});let s=t==null?void 0:t.match(ue),a=(u=s==null?void 0:s.at(1))!=null?u:"",c="";return(0,G.isValidElement)(r)&&r.props&&typeof r.props=="object"&&"children"in r.props&&typeof r.props.children=="string"?c=r.props.children:typeof r=="string"&&(c=r),a==="mermaid"?(0,d.jsxs)("div",{className:i("group relative my-4 h-auto rounded-xl border p-4",t),"data-streamdown":"mermaid-block",children:[(0,d.jsx)("div",{className:"flex items-center justify-end",children:(0,d.jsx)(H,{code:c})}),(0,d.jsx)(q,{chart:c})]}):(0,d.jsx)(O,{className:i("overflow-x-auto border-t",t),code:c,"data-language":a,"data-streamdown":"code-block",language:a,preClassName:"overflow-x-auto font-mono text-xs p-4 bg-muted/40",children:(0,d.jsx)(H,{})})},V={ol:({node:e,children:t,className:r,...n})=>(0,d.jsx)("ol",{className:i("ml-4 list-outside list-decimal",r),"data-streamdown":"ordered-list",...n,children:t}),li:({node:e,children:t,className:r,...n})=>(0,d.jsx)("li",{className:i("py-1",r),"data-streamdown":"list-item",...n,children:t}),ul:({node:e,children:t,className:r,...n})=>(0,d.jsx)("ul",{className:i("ml-4 list-outside list-disc",r),"data-streamdown":"unordered-list",...n,children:t}),hr:({node:e,className:t,...r})=>(0,d.jsx)("hr",{className:i("my-6 border-border",t),"data-streamdown":"horizontal-rule",...r}),strong:({node:e,children:t,className:r,...n})=>(0,d.jsx)("span",{className:i("font-semibold",r),"data-streamdown":"strong",...n,children:t}),a:({node:e,children:t,className:r,href:n,...o})=>{let s=n==="streamdown:incomplete-link";return(0,d.jsx)("a",{className:i("font-medium text-primary underline",r),"data-incomplete":s,"data-streamdown":"link",href:n,rel:"noreferrer",target:"_blank",...o,children:t})},h1:({node:e,children:t,className:r,...n})=>(0,d.jsx)("h1",{className:i("mt-6 mb-2 font-semibold text-3xl",r),"data-streamdown":"heading-1",...n,children:t}),h2:({node:e,children:t,className:r,...n})=>(0,d.jsx)("h2",{className:i("mt-6 mb-2 font-semibold text-2xl",r),"data-streamdown":"heading-2",...n,children:t}),h3:({node:e,children:t,className:r,...n})=>(0,d.jsx)("h3",{className:i("mt-6 mb-2 font-semibold text-xl",r),"data-streamdown":"heading-3",...n,children:t}),h4:({node:e,children:t,className:r,...n})=>(0,d.jsx)("h4",{className:i("mt-6 mb-2 font-semibold text-lg",r),"data-streamdown":"heading-4",...n,children:t}),h5:({node:e,children:t,className:r,...n})=>(0,d.jsx)("h5",{className:i("mt-6 mb-2 font-semibold text-base",r),"data-streamdown":"heading-5",...n,children:t}),h6:({node:e,children:t,className:r,...n})=>(0,d.jsx)("h6",{className:i("mt-6 mb-2 font-semibold text-sm",r),"data-streamdown":"heading-6",...n,children:t}),table:({node:e,children:t,className:r,...n})=>(0,d.jsx)("div",{className:"my-4 overflow-x-auto","data-streamdown":"table-wrapper",children:(0,d.jsx)("table",{className:i("w-full border-collapse border border-border",r),"data-streamdown":"table",...n,children:t})}),thead:({node:e,children:t,className:r,...n})=>(0,d.jsx)("thead",{className:i("bg-muted/50",r),"data-streamdown":"table-header",...n,children:t}),tbody:({node:e,children:t,className:r,...n})=>(0,d.jsx)("tbody",{className:i("divide-y divide-border",r),"data-streamdown":"table-body",...n,children:t}),tr:({node:e,children:t,className:r,...n})=>(0,d.jsx)("tr",{className:i("border-border border-b",r),"data-streamdown":"table-row",...n,children:t}),th:({node:e,children:t,className:r,...n})=>(0,d.jsx)("th",{className:i("px-4 py-2 text-left font-semibold text-sm",r),"data-streamdown":"table-header-cell",...n,children:t}),td:({node:e,children:t,className:r,...n})=>(0,d.jsx)("td",{className:i("px-4 py-2 text-sm",r),"data-streamdown":"table-cell",...n,children:t}),blockquote:({node:e,children:t,className:r,...n})=>(0,d.jsx)("blockquote",{className:i("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",r),"data-streamdown":"blockquote",...n,children:t}),code:he,pre:({children:e})=>e,sup:({node:e,children:t,className:r,...n})=>(0,d.jsx)("sup",{className:i("text-sm",r),"data-streamdown":"superscript",...n,children:t}),sub:({node:e,children:t,className:r,...n})=>(0,d.jsx)("sub",{className:i("text-sm",r),"data-streamdown":"subscript",...n,children:t})};var x=require("marked"),K=e=>{let r=x.marked.use({gfm:!0}).lexer(e).map(o=>o.raw),n=[];for(let o=0;o<r.length;o++){let s=r[o];if(s.trim()==="$$"&&n.length>0){let a=n[n.length-1],c=a.trimStart().startsWith("$$"),l=(a.match(/\$\$/g)||[]).length;if(c&&l%2===1){n[n.length-1]=a+s;continue}}if(n.length>0&&s.trimEnd().endsWith("$$")){let a=n[n.length-1],c=a.trimStart().startsWith("$$"),l=(a.match(/\$\$/g)||[]).length,m=(s.match(/\$\$/g)||[]).length;if(c&&l%2===1&&!s.trimStart().startsWith("$$")&&m===1){n[n.length-1]=a+s;continue}}n.push(s)}return n};var ge=/(!?\[)([^\]]*?)$/,pe=/(\*\*)([^*]*?)$/,fe=/(__)([^_]*?)$/,ke=/(\*\*\*)([^*]*?)$/,be=/(\*)([^*]*?)$/,ye=/(_)([^_]*?)$/,we=/(`)([^`]*?)$/,ve=/(~~)([^~]*?)$/,P=e=>{let t=(e.match(/```/g)||[]).length;return t>0&&t%2===0&&e.includes(`
2
+ `)},Me=e=>{let t=e.match(ge);if(t){if(t[1].startsWith("!")){let n=e.lastIndexOf(t[1]);return e.substring(0,n)}return`${e}](streamdown:incomplete-link)`}return e},Ce=e=>P(e)?e:e.match(pe)&&(e.match(/\*\*/g)||[]).length%2===1?`${e}**`:e,Te=e=>e.match(fe)&&(e.match(/__/g)||[]).length%2===1?`${e}__`:e,Be=e=>e.split("").reduce((t,r,n)=>{if(r==="*"){let o=e[n-1],s=e[n+1];if(o==="\\")return t;let a=n;for(let l=n-1;l>=0;l--){if(e[l]===`
3
+ `){a=l+1;break}if(l===0){a=0;break}}if(e.substring(a,n).trim()===""&&(s===" "||s===" "))return t;if(o!=="*"&&s!=="*")return t+1}return t},0),$e=e=>P(e)?e:e.match(be)&&Be(e)%2===1?`${e}*`:e,Ie=(e,t)=>{let r=!1,n=!1;for(let o=0;o<e.length&&o<t;o++){if(e[o]==="\\"&&e[o+1]==="$"){o++;continue}e[o]==="$"&&(e[o+1]==="$"?(n=!n,o++,r=!1):n||(r=!r))}return r||n},Pe=e=>e.split("").reduce((t,r,n)=>{if(r==="_"){let o=e[n-1],s=e[n+1];if(o==="\\"||Ie(e,n))return t;if(o!=="_"&&s!=="_")return t+1}return t},0),Ne=e=>P(e)?e:e.match(ye)&&Pe(e)%2===1?`${e}_`:e,Se=(e,t)=>{let r=e.substring(t,t+3)==="```",n=t>0&&e.substring(t-1,t+2)==="```",o=t>1&&e.substring(t-2,t+1)==="```";return r||n||o},He=e=>{let t=0;for(let r=0;r<e.length;r++)e[r]==="`"&&!Se(e,r)&&t++;return t},Le=e=>{if(e.match(/^```[^`\n]*```?$/)&&!e.includes(`
4
4
  `))return e.endsWith("``")&&!e.endsWith("```")?`${e}\``:e;let r=(e.match(/```/g)||[]).length,n=r%2===1;return r>0&&r%2===0&&e.includes(`
5
- `)||(e.endsWith("```\n")||e.endsWith("```"))&&r%2===0?e:e.match(he)&&!n&&$e(e)%2===1?`${e}\``:e},Pe=e=>e.match(fe)&&(e.match(/~~/g)||[]).length%2===1?`${e}~~`:e;var Se=e=>e.match(be)&&(e.match(/\$\$/g)||[]).length%2===1?`${e}$$`:e;var He=e=>{let t=0,r=e.match(/\*+/g)||[];for(let n of r){let o=n.length;o>=3&&(t+=Math.floor(o/3))}return t},Le=e=>N(e)||/^\*{4,}$/.test(e)?e:e.match(ue)&&He(e)%2===1?`${e}***`:e,W=e=>{if(!e||typeof e!="string")return e;let t=e;return t=ke(t),t=Le(t),t=ye(t),t=Me(t),t=we(t),t=Ie(t),t=Ne(t),t=Pe(t),t=Se(t),t};var v=require("react/jsx-runtime"),Ae=H.default.default||H.default,_e=Ae(G.default),$=(0,h.createContext)(["github-light","github-dark"]),X=(0,h.memo)(({content:e,shouldParseIncompleteMarkdown:t,...r})=>{let n=(0,h.useMemo)(()=>typeof e=="string"&&t?W(e.trim()):e,[e,t]);return(0,v.jsx)(_e,{...r,children:n})},(e,t)=>e.content===t.content);X.displayName="Block";var Y=(0,h.memo)(({children:e,allowedImagePrefixes:t,allowedLinkPrefixes:r,defaultOrigin:n,parseIncompleteMarkdown:o=!0,components:i,rehypePlugins:d,remarkPlugins:c,className:l,shikiTheme:u=["github-light","github-dark"],...g})=>{let y=(0,h.useId)(),f=(0,h.useMemo)(()=>V(typeof e=="string"?e:""),[e]),b=(0,h.useMemo)(()=>()=>(0,F.default)({errorColor:"var(--color-muted-foreground)"}),[]);return(0,v.jsx)($.Provider,{value:u,children:(0,v.jsx)("div",{className:s("space-y-4",l),...g,children:f.map((w,I)=>(0,v.jsx)(X,{allowedImagePrefixes:t!=null?t:["*"],allowedLinkPrefixes:r!=null?r:["*"],components:{...q,...i},content:w,defaultOrigin:n,rehypePlugins:[b,...d!=null?d:[]],remarkPlugins:[J.default,[Q.default,{singleDollarTextMath:!1}],...c!=null?c:[]],shouldParseIncompleteMarkdown:o},`${y}-block_${I}`))})})},(e,t)=>e.children===t.children&&e.shikiTheme===t.shikiTheme);Y.displayName="Streamdown";0&&(module.exports={ShikiThemeContext,Streamdown});
5
+ `)||(e.endsWith("```\n")||e.endsWith("```"))&&r%2===0?e:e.match(we)&&!n&&He(e)%2===1?`${e}\``:e},Ae=e=>e.match(ve)&&(e.match(/~~/g)||[]).length%2===1?`${e}~~`:e;var _e=e=>{if((e.match(/\$\$/g)||[]).length%2===0)return e;let r=e.indexOf("$$");return r!==-1&&e.indexOf(`
6
+ `,r)!==-1&&!e.endsWith(`
7
+ `)?`${e}
8
+ $$`:`${e}$$`},Re=e=>{let t=0,r=e.match(/\*+/g)||[];for(let n of r){let o=n.length;o>=3&&(t+=Math.floor(o/3))}return t},Ee=e=>P(e)||/^\*{4,}$/.test(e)?e:e.match(ke)&&Re(e)%2===1?`${e}***`:e,j=e=>{if(!e||typeof e!="string")return e;let t=e,r=Me(t);return r.endsWith("](streamdown:incomplete-link)")?r:(t=r,t=Ee(t),t=Ce(t),t=Te(t),t=$e(t),t=Ne(t),t=Le(t),t=Ae(t),t=_e(t),t)};var C=require("react/jsx-runtime"),De=L.default.default||L.default,We=De(F.default),I=(0,k.createContext)(["github-light","github-dark"]),Y=(0,k.memo)(({content:e,shouldParseIncompleteMarkdown:t,...r})=>{let n=(0,k.useMemo)(()=>typeof e=="string"&&t?j(e.trim()):e,[e,t]);return(0,C.jsx)(We,{...r,children:n})},(e,t)=>e.content===t.content);Y.displayName="Block";var Z=(0,k.memo)(({children:e,allowedImagePrefixes:t,allowedLinkPrefixes:r,defaultOrigin:n,parseIncompleteMarkdown:o=!0,components:s,rehypePlugins:a,remarkPlugins:c,className:l,shikiTheme:m=["github-light","github-dark"],...u})=>{let y=(0,k.useId)(),f=(0,k.useMemo)(()=>K(typeof e=="string"?e:""),[e]),b=(0,k.useMemo)(()=>()=>(0,X.default)({errorColor:"var(--color-muted-foreground)"}),[]);return(0,C.jsx)(I.Provider,{value:m,children:(0,C.jsx)("div",{className:i("space-y-4",l),...u,children:f.map((w,T)=>(0,C.jsx)(Y,{allowedImagePrefixes:t!=null?t:["*"],allowedLinkPrefixes:r!=null?r:["*"],components:{...V,...s},content:w,defaultOrigin:n,rehypePlugins:[b,...a!=null?a:[]],remarkPlugins:[J.default,[Q.default,{singleDollarTextMath:!1}],...c!=null?c:[]],shouldParseIncompleteMarkdown:o},`${y}-block_${T}`))})})},(e,t)=>e.children===t.children&&e.shikiTheme===t.shikiTheme);Z.displayName="Streamdown";0&&(module.exports={ShikiThemeContext,Streamdown});
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
- "use client";import{createContext as Ne,memo as U,useId as Pe,useMemo as $}from"react";import Se from"react-markdown";import He from"rehype-katex";import Le from"remark-gfm";import Ae from"remark-math";import"katex/dist/katex.min.css";import O from"harden-react-markdown";import{isValidElement as x}from"react";import{CheckIcon as W,CopyIcon as G,RouteIcon as qe}from"lucide-react";import{createContext as F,useContext as S,useEffect as J,useRef as Q,useState as v}from"react";import{codeToHtml as P}from"shiki";import{clsx as z}from"clsx";import{twMerge as V}from"tailwind-merge";var o=(...e)=>V(z(e));import{jsx as k,jsxs as Y}from"react/jsx-runtime";var H=F({code:""});async function X(e,t,r){return Promise.all([await P(e,{lang:t,theme:r[0]}),await P(e,{lang:t,theme:r[1]})])}var L=({code:e,language:t,className:r,children:n,...s})=>{let[i,d]=v(""),[c,l]=v(""),m=Q(!1),[u,h]=S(T);return J(()=>(X(e,t,[u,h]).then(([p,g])=>{m.current||(d(p),l(g),m.current=!0)}),()=>{m.current=!1}),[e,t,u,h]),k(H.Provider,{value:{code:e},children:Y("div",{className:"group relative",children:[k("div",{className:o("overflow-x-auto dark:hidden [&>pre]:bg-transparent!",r),dangerouslySetInnerHTML:{__html:i},...s}),k("div",{className:o("hidden overflow-x-auto dark:block [&>pre]:bg-transparent!",r),dangerouslySetInnerHTML:{__html:c},...s}),n]})})},I=({onCopy:e,onError:t,timeout:r=2e3,children:n,className:s,code:i,...d})=>{let[c,l]=v(!1),m=S(H).code,u=i!=null?i:m,h=async()=>{var g;if(typeof window=="undefined"||!((g=navigator==null?void 0:navigator.clipboard)!=null&&g.writeText)){t==null||t(new Error("Clipboard API not available"));return}try{await navigator.clipboard.writeText(u),l(!0),e==null||e(),setTimeout(()=>l(!1),r)}catch(b){t==null||t(b)}},p=c?W:G;return k("button",{className:o("absolute top-2 right-2 shrink-0 rounded-md p-3 opacity-0 transition-all","hover:bg-secondary group-hover:opacity-100",s),onClick:h,type:"button",...d,children:n!=null?n:k(p,{size:14})})};import{useEffect as Z,useState as M}from"react";import{jsx as f,jsxs as C}from"react/jsx-runtime";var A=!1,j=async()=>{if(!A){let r=(await import("mermaid")).default;return r.initialize({startOnLoad:!1,theme:"default",securityLevel:"strict",fontFamily:"monospace",suppressErrorRendering:!0}),A=!0,r}return(await import("mermaid")).default},_=({chart:e,className:t})=>{let[r,n]=M(null),[s,i]=M(!0),[d,c]=M(""),[l,m]=M("");if(Z(()=>{(async()=>{try{n(null),i(!0);let p=await j(),g=e.split("").reduce((N,q)=>(N<<5)-N+q.charCodeAt(0)|0,0),b=`mermaid-${Math.abs(g)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:y}=await p.render(b,e);c(y),m(y)}catch(p){if(!(l||d)){let g=p instanceof Error?p.message:"Failed to render Mermaid chart";n(g)}}finally{i(!1)}})()},[e]),s&&!d&&!l)return f("div",{className:o("my-4 flex justify-center p-4",t),children:C("div",{className:"flex items-center space-x-2 text-muted-foreground",children:[f("div",{className:"h-4 w-4 animate-spin rounded-full border-current border-b-2"}),f("span",{className:"text-sm",children:"Loading diagram..."})]})});if(r&&!d&&!l)return C("div",{className:o("rounded-lg border border-red-200 bg-red-50 p-4",t),children:[C("p",{className:"font-mono text-red-700 text-sm",children:["Mermaid Error: ",r]}),C("details",{className:"mt-2",children:[f("summary",{className:"cursor-pointer text-red-600 text-xs",children:"Show Code"}),f("pre",{className:"mt-2 overflow-x-auto rounded bg-red-100 p-2 text-red-800 text-xs",children:e})]})]});let u=d||l;return f("div",{"aria-label":"Mermaid chart",className:o("my-4 flex justify-center",t),dangerouslySetInnerHTML:{__html:u},role:"img"})};import{jsx as a,jsxs as re}from"react/jsx-runtime";var ee=/language-([^\s]+)/,te=({node:e,className:t,children:r,...n})=>{var l,m,u;if(((l=e==null?void 0:e.position)==null?void 0:l.start.line)===((m=e==null?void 0:e.position)==null?void 0:m.end.line))return a("code",{className:o("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...n,children:r});let i=t==null?void 0:t.match(ee),d=(u=i==null?void 0:i.at(1))!=null?u:"plaintext",c="";return x(r)&&r.props&&typeof r.props=="object"&&"children"in r.props&&typeof r.props.children=="string"?c=r.props.children:typeof r=="string"&&(c=r),d==="mermaid"?re("div",{className:o("group relative my-4 h-auto rounded-lg border p-4",t),"data-streamdown":"mermaid-block",children:[a(_,{chart:c}),a(I,{code:c})]}):a(L,{className:o("my-4 h-auto rounded-lg border p-4",t),code:c,"data-language":d,"data-streamdown":"code-block",language:d,children:a(I,{})})},R={ol:({node:e,children:t,className:r,...n})=>a("ol",{className:o("ml-4 list-outside list-decimal",r),"data-streamdown":"ordered-list",...n,children:t}),li:({node:e,children:t,className:r,...n})=>a("li",{className:o("py-1",r),"data-streamdown":"list-item",...n,children:t}),ul:({node:e,children:t,className:r,...n})=>a("ul",{className:o("ml-4 list-outside list-disc",r),"data-streamdown":"unordered-list",...n,children:t}),hr:({node:e,className:t,...r})=>a("hr",{className:o("my-6 border-border",t),"data-streamdown":"horizontal-rule",...r}),strong:({node:e,children:t,className:r,...n})=>a("span",{className:o("font-semibold",r),"data-streamdown":"strong",...n,children:t}),a:({node:e,children:t,className:r,href:n,...s})=>a("a",{className:o("font-medium text-primary underline",r),"data-streamdown":"link",href:n,rel:"noreferrer",target:"_blank",...s,children:t}),h1:({node:e,children:t,className:r,...n})=>a("h1",{className:o("mt-6 mb-2 font-semibold text-3xl",r),"data-streamdown":"heading-1",...n,children:t}),h2:({node:e,children:t,className:r,...n})=>a("h2",{className:o("mt-6 mb-2 font-semibold text-2xl",r),"data-streamdown":"heading-2",...n,children:t}),h3:({node:e,children:t,className:r,...n})=>a("h3",{className:o("mt-6 mb-2 font-semibold text-xl",r),"data-streamdown":"heading-3",...n,children:t}),h4:({node:e,children:t,className:r,...n})=>a("h4",{className:o("mt-6 mb-2 font-semibold text-lg",r),"data-streamdown":"heading-4",...n,children:t}),h5:({node:e,children:t,className:r,...n})=>a("h5",{className:o("mt-6 mb-2 font-semibold text-base",r),"data-streamdown":"heading-5",...n,children:t}),h6:({node:e,children:t,className:r,...n})=>a("h6",{className:o("mt-6 mb-2 font-semibold text-sm",r),"data-streamdown":"heading-6",...n,children:t}),table:({node:e,children:t,className:r,...n})=>a("div",{className:"my-4 overflow-x-auto","data-streamdown":"table-wrapper",children:a("table",{className:o("w-full border-collapse border border-border",r),"data-streamdown":"table",...n,children:t})}),thead:({node:e,children:t,className:r,...n})=>a("thead",{className:o("bg-muted/50",r),"data-streamdown":"table-header",...n,children:t}),tbody:({node:e,children:t,className:r,...n})=>a("tbody",{className:o("divide-y divide-border",r),"data-streamdown":"table-body",...n,children:t}),tr:({node:e,children:t,className:r,...n})=>a("tr",{className:o("border-border border-b",r),"data-streamdown":"table-row",...n,children:t}),th:({node:e,children:t,className:r,...n})=>a("th",{className:o("px-4 py-2 text-left font-semibold text-sm",r),"data-streamdown":"table-header-cell",...n,children:t}),td:({node:e,children:t,className:r,...n})=>a("td",{className:o("px-4 py-2 text-sm",r),"data-streamdown":"table-cell",...n,children:t}),blockquote:({node:e,children:t,className:r,...n})=>a("blockquote",{className:o("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",r),"data-streamdown":"blockquote",...n,children:t}),code:te,pre:({children:e})=>e,sup:({node:e,children:t,className:r,...n})=>a("sup",{className:o("text-sm",r),"data-streamdown":"superscript",...n,children:t}),sub:({node:e,children:t,className:r,...n})=>a("sub",{className:o("text-sm",r),"data-streamdown":"subscript",...n,children:t})};import{marked as ne}from"marked";var D=e=>ne.use({gfm:!0}).lexer(e).map(r=>r.raw);var oe=/(!?\[)([^\]]*?)$/,se=/(\*\*)([^*]*?)$/,ae=/(__)([^_]*?)$/,ie=/(\*\*\*)([^*]*?)$/,de=/(\*)([^*]*?)$/,le=/(_)([^_]*?)$/,ce=/(`)([^`]*?)$/,me=/(~~)([^~]*?)$/,ue=/(\$\$)([^$]*?)$/,w=e=>{let t=(e.match(/```/g)||[]).length;return t>0&&t%2===0&&e.includes(`
2
- `)},pe=e=>{let t=e.match(oe);if(t){let r=e.lastIndexOf(t[1]);return e.substring(0,r)}return e},ge=e=>w(e)?e:e.match(se)&&(e.match(/\*\*/g)||[]).length%2===1?`${e}**`:e,he=e=>e.match(ae)&&(e.match(/__/g)||[]).length%2===1?`${e}__`:e,fe=e=>e.split("").reduce((t,r,n)=>{if(r==="*"){let s=e[n-1],i=e[n+1];if(s==="\\")return t;let d=n;for(let l=n-1;l>=0;l--){if(e[l]===`
3
- `){d=l+1;break}if(l===0){d=0;break}}if(e.substring(d,n).trim()===""&&(i===" "||i===" "))return t;if(s!=="*"&&i!=="*")return t+1}return t},0),be=e=>w(e)?e:e.match(de)&&fe(e)%2===1?`${e}*`:e,ke=(e,t)=>{let r=!1,n=!1;for(let s=0;s<e.length&&s<t;s++){if(e[s]==="\\"&&e[s+1]==="$"){s++;continue}e[s]==="$"&&(e[s+1]==="$"?(n=!n,s++,r=!1):n||(r=!r))}return r||n},ye=e=>e.split("").reduce((t,r,n)=>{if(r==="_"){let s=e[n-1],i=e[n+1];if(s==="\\"||ke(e,n))return t;if(s!=="_"&&i!=="_")return t+1}return t},0),Me=e=>w(e)?e:e.match(le)&&ye(e)%2===1?`${e}_`:e,Ce=(e,t)=>{let r=e.substring(t,t+3)==="```",n=t>0&&e.substring(t-1,t+2)==="```",s=t>1&&e.substring(t-2,t+1)==="```";return r||n||s},we=e=>{let t=0;for(let r=0;r<e.length;r++)e[r]==="`"&&!Ce(e,r)&&t++;return t},Be=e=>{if(e.match(/^```[^`\n]*```?$/)&&!e.includes(`
1
+ "use client";import{createContext as Le,memo as q,useId as Ae,useMemo as N}from"react";import _e from"react-markdown";import Re from"rehype-katex";import Ee from"remark-gfm";import De from"remark-math";import"katex/dist/katex.min.css";import U from"harden-react-markdown";import{isValidElement as oe}from"react";import{CheckIcon as j,CopyIcon as F}from"lucide-react";import{createContext as X,useContext as A,useEffect as J,useRef as Q,useState as B}from"react";import{createHighlighter as H}from"shiki";import{createJavaScriptRegexEngine as Y}from"shiki/engine/javascript";import{clsx as x}from"clsx";import{twMerge as K}from"tailwind-merge";var i=(...e)=>K(x(e));import{jsx as p,jsxs as T}from"react/jsx-runtime";var Z=/<pre(\s|>)/,_=X({code:""}),$=class{constructor(){this.lightHighlighter=null;this.darkHighlighter=null;this.lightTheme=null;this.darkTheme=null;this.loadedLanguages=new Set;this.initializationPromise=null}async ensureHighlightersInitialized(t,r){let[n,o]=t,s=Y({forgiving:!0}),a=!this.lightHighlighter||this.lightTheme!==n,c=!this.darkHighlighter||this.darkTheme!==o;(a||c)&&this.loadedLanguages.clear();let l=!this.loadedLanguages.has(r);if(a?(this.lightHighlighter=await H({themes:[n],langs:[r],engine:s}),this.lightTheme=n,this.loadedLanguages.add(r)):l&&await this.lightHighlighter.loadLanguage(r),c){let m=l?[...this.loadedLanguages,r]:Array.from(this.loadedLanguages);this.darkHighlighter=await H({themes:[o],langs:m.length>0?m:[r],engine:s}),this.darkTheme=o}else l&&await this.darkHighlighter.loadLanguage(r);l&&this.loadedLanguages.add(r)}async highlightCode(t,r,n,o){this.initializationPromise&&await this.initializationPromise,this.initializationPromise=this.ensureHighlightersInitialized(n,r),await this.initializationPromise,this.initializationPromise=null;let s=u=>o?u.replace(Z,`<pre class="${o}"$1`):u,[a,c]=n,l=this.lightHighlighter.codeToHtml(t,{lang:r,theme:a}),m=this.darkHighlighter.codeToHtml(t,{lang:r,theme:c});return[L(s(l)),L(s(m))]}},ee=new $;async function te(e,t,r,n){return ee.highlightCode(e,t,r,n)}function L(e){return e.replace(/(<pre[^>]*)(style="[^"]*background[^";]*;?[^"]*")([^>]*>)/g,"$1$3")}var R=({code:e,language:t,className:r,children:n,preClassName:o,...s})=>{let[a,c]=B(""),[l,m]=B(""),u=Q(!1),[f,h]=A(P);return J(()=>(u.current=!0,te(e,t,[f,h],o).then(([g,k])=>{u.current&&(c(g),m(k))}),()=>{u.current=!1}),[e,t,f,h,o]),p(_.Provider,{value:{code:e},children:T("div",{className:"my-4 w-full overflow-hidden rounded-xl border","data-code-block-container":!0,"data-language":t,children:[T("div",{className:"flex items-center justify-between bg-muted/80 p-3 text-muted-foreground text-xs","data-code-block-header":!0,"data-language":t,children:[p("span",{className:"ml-1 font-mono lowercase",children:t}),p("div",{children:n})]}),p("div",{className:"w-full",children:T("div",{className:"min-w-full",children:[p("div",{className:i("overflow-x-auto dark:hidden",r),"data-code-block":!0,"data-language":t,dangerouslySetInnerHTML:{__html:a},...s}),p("div",{className:i("hidden overflow-x-auto dark:block",r),"data-code-block":!0,"data-language":t,dangerouslySetInnerHTML:{__html:l},...s})]})})]})})},I=({onCopy:e,onError:t,timeout:r=2e3,children:n,className:o,code:s,...a})=>{let[c,l]=B(!1),m=A(_).code,u=s!=null?s:m,f=async()=>{var g;if(typeof window=="undefined"||!((g=navigator==null?void 0:navigator.clipboard)!=null&&g.writeText)){t==null||t(new Error("Clipboard API not available"));return}try{await navigator.clipboard.writeText(u),l(!0),e==null||e(),setTimeout(()=>l(!1),r)}catch(k){t==null||t(k)}},h=c?j:F;return p("button",{className:i("text-muted-foreground","p-1 transition-all",o),onClick:f,type:"button",...a,children:n!=null?n:p(h,{size:14})})};import{useEffect as re,useState as w}from"react";import{jsx as b,jsxs as v}from"react/jsx-runtime";var E=!1,ne=async()=>{if(!E){let r=(await import("mermaid")).default;return r.initialize({startOnLoad:!1,theme:"default",securityLevel:"strict",fontFamily:"monospace",suppressErrorRendering:!0}),E=!0,r}return(await import("mermaid")).default},D=({chart:e,className:t})=>{let[r,n]=w(null),[o,s]=w(!0),[a,c]=w(""),[l,m]=w("");if(re(()=>{(async()=>{try{n(null),s(!0);let h=await ne(),g=e.split("").reduce((S,V)=>(S<<5)-S+V.charCodeAt(0)|0,0),k=`mermaid-${Math.abs(g)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:y}=await h.render(k,e);c(y),m(y)}catch(h){if(!(l||a)){let g=h instanceof Error?h.message:"Failed to render Mermaid chart";n(g)}}finally{s(!1)}})()},[e]),o&&!a&&!l)return b("div",{className:i("my-4 flex justify-center p-4",t),children:v("div",{className:"flex items-center space-x-2 text-muted-foreground",children:[b("div",{className:"h-4 w-4 animate-spin rounded-full border-current border-b-2"}),b("span",{className:"text-sm",children:"Loading diagram..."})]})});if(r&&!a&&!l)return v("div",{className:i("rounded-lg border border-red-200 bg-red-50 p-4",t),children:[v("p",{className:"font-mono text-red-700 text-sm",children:["Mermaid Error: ",r]}),v("details",{className:"mt-2",children:[b("summary",{className:"cursor-pointer text-red-600 text-xs",children:"Show Code"}),b("pre",{className:"mt-2 overflow-x-auto rounded bg-red-100 p-2 text-red-800 text-xs",children:e})]})]});let u=a||l;return b("div",{"aria-label":"Mermaid chart",className:i("my-4 flex justify-center",t),dangerouslySetInnerHTML:{__html:u},role:"img"})};import{jsx as d,jsxs as ae}from"react/jsx-runtime";var se=/language-([^\s]+)/,ie=({node:e,className:t,children:r,...n})=>{var l,m,u;if(((l=e==null?void 0:e.position)==null?void 0:l.start.line)===((m=e==null?void 0:e.position)==null?void 0:m.end.line))return d("code",{className:i("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...n,children:r});let s=t==null?void 0:t.match(se),a=(u=s==null?void 0:s.at(1))!=null?u:"",c="";return oe(r)&&r.props&&typeof r.props=="object"&&"children"in r.props&&typeof r.props.children=="string"?c=r.props.children:typeof r=="string"&&(c=r),a==="mermaid"?ae("div",{className:i("group relative my-4 h-auto rounded-xl border p-4",t),"data-streamdown":"mermaid-block",children:[d("div",{className:"flex items-center justify-end",children:d(I,{code:c})}),d(D,{chart:c})]}):d(R,{className:i("overflow-x-auto border-t",t),code:c,"data-language":a,"data-streamdown":"code-block",language:a,preClassName:"overflow-x-auto font-mono text-xs p-4 bg-muted/40",children:d(I,{})})},W={ol:({node:e,children:t,className:r,...n})=>d("ol",{className:i("ml-4 list-outside list-decimal",r),"data-streamdown":"ordered-list",...n,children:t}),li:({node:e,children:t,className:r,...n})=>d("li",{className:i("py-1",r),"data-streamdown":"list-item",...n,children:t}),ul:({node:e,children:t,className:r,...n})=>d("ul",{className:i("ml-4 list-outside list-disc",r),"data-streamdown":"unordered-list",...n,children:t}),hr:({node:e,className:t,...r})=>d("hr",{className:i("my-6 border-border",t),"data-streamdown":"horizontal-rule",...r}),strong:({node:e,children:t,className:r,...n})=>d("span",{className:i("font-semibold",r),"data-streamdown":"strong",...n,children:t}),a:({node:e,children:t,className:r,href:n,...o})=>{let s=n==="streamdown:incomplete-link";return d("a",{className:i("font-medium text-primary underline",r),"data-incomplete":s,"data-streamdown":"link",href:n,rel:"noreferrer",target:"_blank",...o,children:t})},h1:({node:e,children:t,className:r,...n})=>d("h1",{className:i("mt-6 mb-2 font-semibold text-3xl",r),"data-streamdown":"heading-1",...n,children:t}),h2:({node:e,children:t,className:r,...n})=>d("h2",{className:i("mt-6 mb-2 font-semibold text-2xl",r),"data-streamdown":"heading-2",...n,children:t}),h3:({node:e,children:t,className:r,...n})=>d("h3",{className:i("mt-6 mb-2 font-semibold text-xl",r),"data-streamdown":"heading-3",...n,children:t}),h4:({node:e,children:t,className:r,...n})=>d("h4",{className:i("mt-6 mb-2 font-semibold text-lg",r),"data-streamdown":"heading-4",...n,children:t}),h5:({node:e,children:t,className:r,...n})=>d("h5",{className:i("mt-6 mb-2 font-semibold text-base",r),"data-streamdown":"heading-5",...n,children:t}),h6:({node:e,children:t,className:r,...n})=>d("h6",{className:i("mt-6 mb-2 font-semibold text-sm",r),"data-streamdown":"heading-6",...n,children:t}),table:({node:e,children:t,className:r,...n})=>d("div",{className:"my-4 overflow-x-auto","data-streamdown":"table-wrapper",children:d("table",{className:i("w-full border-collapse border border-border",r),"data-streamdown":"table",...n,children:t})}),thead:({node:e,children:t,className:r,...n})=>d("thead",{className:i("bg-muted/50",r),"data-streamdown":"table-header",...n,children:t}),tbody:({node:e,children:t,className:r,...n})=>d("tbody",{className:i("divide-y divide-border",r),"data-streamdown":"table-body",...n,children:t}),tr:({node:e,children:t,className:r,...n})=>d("tr",{className:i("border-border border-b",r),"data-streamdown":"table-row",...n,children:t}),th:({node:e,children:t,className:r,...n})=>d("th",{className:i("px-4 py-2 text-left font-semibold text-sm",r),"data-streamdown":"table-header-cell",...n,children:t}),td:({node:e,children:t,className:r,...n})=>d("td",{className:i("px-4 py-2 text-sm",r),"data-streamdown":"table-cell",...n,children:t}),blockquote:({node:e,children:t,className:r,...n})=>d("blockquote",{className:i("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",r),"data-streamdown":"blockquote",...n,children:t}),code:ie,pre:({children:e})=>e,sup:({node:e,children:t,className:r,...n})=>d("sup",{className:i("text-sm",r),"data-streamdown":"superscript",...n,children:t}),sub:({node:e,children:t,className:r,...n})=>d("sub",{className:i("text-sm",r),"data-streamdown":"subscript",...n,children:t})};import{marked as le}from"marked";var z=e=>{let r=le.use({gfm:!0}).lexer(e).map(o=>o.raw),n=[];for(let o=0;o<r.length;o++){let s=r[o];if(s.trim()==="$$"&&n.length>0){let a=n[n.length-1],c=a.trimStart().startsWith("$$"),l=(a.match(/\$\$/g)||[]).length;if(c&&l%2===1){n[n.length-1]=a+s;continue}}if(n.length>0&&s.trimEnd().endsWith("$$")){let a=n[n.length-1],c=a.trimStart().startsWith("$$"),l=(a.match(/\$\$/g)||[]).length,m=(s.match(/\$\$/g)||[]).length;if(c&&l%2===1&&!s.trimStart().startsWith("$$")&&m===1){n[n.length-1]=a+s;continue}}n.push(s)}return n};var de=/(!?\[)([^\]]*?)$/,ce=/(\*\*)([^*]*?)$/,me=/(__)([^_]*?)$/,ue=/(\*\*\*)([^*]*?)$/,he=/(\*)([^*]*?)$/,ge=/(_)([^_]*?)$/,pe=/(`)([^`]*?)$/,fe=/(~~)([^~]*?)$/,M=e=>{let t=(e.match(/```/g)||[]).length;return t>0&&t%2===0&&e.includes(`
2
+ `)},ke=e=>{let t=e.match(de);if(t){if(t[1].startsWith("!")){let n=e.lastIndexOf(t[1]);return e.substring(0,n)}return`${e}](streamdown:incomplete-link)`}return e},be=e=>M(e)?e:e.match(ce)&&(e.match(/\*\*/g)||[]).length%2===1?`${e}**`:e,ye=e=>e.match(me)&&(e.match(/__/g)||[]).length%2===1?`${e}__`:e,we=e=>e.split("").reduce((t,r,n)=>{if(r==="*"){let o=e[n-1],s=e[n+1];if(o==="\\")return t;let a=n;for(let l=n-1;l>=0;l--){if(e[l]===`
3
+ `){a=l+1;break}if(l===0){a=0;break}}if(e.substring(a,n).trim()===""&&(s===" "||s===" "))return t;if(o!=="*"&&s!=="*")return t+1}return t},0),ve=e=>M(e)?e:e.match(he)&&we(e)%2===1?`${e}*`:e,Me=(e,t)=>{let r=!1,n=!1;for(let o=0;o<e.length&&o<t;o++){if(e[o]==="\\"&&e[o+1]==="$"){o++;continue}e[o]==="$"&&(e[o+1]==="$"?(n=!n,o++,r=!1):n||(r=!r))}return r||n},Ce=e=>e.split("").reduce((t,r,n)=>{if(r==="_"){let o=e[n-1],s=e[n+1];if(o==="\\"||Me(e,n))return t;if(o!=="_"&&s!=="_")return t+1}return t},0),Te=e=>M(e)?e:e.match(ge)&&Ce(e)%2===1?`${e}_`:e,Be=(e,t)=>{let r=e.substring(t,t+3)==="```",n=t>0&&e.substring(t-1,t+2)==="```",o=t>1&&e.substring(t-2,t+1)==="```";return r||n||o},$e=e=>{let t=0;for(let r=0;r<e.length;r++)e[r]==="`"&&!Be(e,r)&&t++;return t},Ie=e=>{if(e.match(/^```[^`\n]*```?$/)&&!e.includes(`
4
4
  `))return e.endsWith("``")&&!e.endsWith("```")?`${e}\``:e;let r=(e.match(/```/g)||[]).length,n=r%2===1;return r>0&&r%2===0&&e.includes(`
5
- `)||(e.endsWith("```\n")||e.endsWith("```"))&&r%2===0?e:e.match(ce)&&!n&&we(e)%2===1?`${e}\``:e},ve=e=>e.match(me)&&(e.match(/~~/g)||[]).length%2===1?`${e}~~`:e;var Ie=e=>e.match(ue)&&(e.match(/\$\$/g)||[]).length%2===1?`${e}$$`:e;var Te=e=>{let t=0,r=e.match(/\*+/g)||[];for(let n of r){let s=n.length;s>=3&&(t+=Math.floor(s/3))}return t},$e=e=>w(e)||/^\*{4,}$/.test(e)?e:e.match(ie)&&Te(e)%2===1?`${e}***`:e,E=e=>{if(!e||typeof e!="string")return e;let t=e;return t=pe(t),t=$e(t),t=ge(t),t=he(t),t=be(t),t=Me(t),t=Be(t),t=ve(t),t=Ie(t),t};import{jsx as B}from"react/jsx-runtime";var _e=O.default||O,Re=_e(Se),T=Ne(["github-light","github-dark"]),K=U(({content:e,shouldParseIncompleteMarkdown:t,...r})=>{let n=$(()=>typeof e=="string"&&t?E(e.trim()):e,[e,t]);return B(Re,{...r,children:n})},(e,t)=>e.content===t.content);K.displayName="Block";var De=U(({children:e,allowedImagePrefixes:t,allowedLinkPrefixes:r,defaultOrigin:n,parseIncompleteMarkdown:s=!0,components:i,rehypePlugins:d,remarkPlugins:c,className:l,shikiTheme:m=["github-light","github-dark"],...u})=>{let h=Pe(),p=$(()=>D(typeof e=="string"?e:""),[e]),g=$(()=>()=>He({errorColor:"var(--color-muted-foreground)"}),[]);return B(T.Provider,{value:m,children:B("div",{className:o("space-y-4",l),...u,children:p.map((b,y)=>B(K,{allowedImagePrefixes:t!=null?t:["*"],allowedLinkPrefixes:r!=null?r:["*"],components:{...R,...i},content:b,defaultOrigin:n,rehypePlugins:[g,...d!=null?d:[]],remarkPlugins:[Le,[Ae,{singleDollarTextMath:!1}],...c!=null?c:[]],shouldParseIncompleteMarkdown:s},`${h}-block_${y}`))})})},(e,t)=>e.children===t.children&&e.shikiTheme===t.shikiTheme);De.displayName="Streamdown";export{T as ShikiThemeContext,De as Streamdown};
5
+ `)||(e.endsWith("```\n")||e.endsWith("```"))&&r%2===0?e:e.match(pe)&&!n&&$e(e)%2===1?`${e}\``:e},Pe=e=>e.match(fe)&&(e.match(/~~/g)||[]).length%2===1?`${e}~~`:e;var Ne=e=>{if((e.match(/\$\$/g)||[]).length%2===0)return e;let r=e.indexOf("$$");return r!==-1&&e.indexOf(`
6
+ `,r)!==-1&&!e.endsWith(`
7
+ `)?`${e}
8
+ $$`:`${e}$$`},Se=e=>{let t=0,r=e.match(/\*+/g)||[];for(let n of r){let o=n.length;o>=3&&(t+=Math.floor(o/3))}return t},He=e=>M(e)||/^\*{4,}$/.test(e)?e:e.match(ue)&&Se(e)%2===1?`${e}***`:e,O=e=>{if(!e||typeof e!="string")return e;let t=e,r=ke(t);return r.endsWith("](streamdown:incomplete-link)")?r:(t=r,t=He(t),t=be(t),t=ye(t),t=ve(t),t=Te(t),t=Ie(t),t=Pe(t),t=Ne(t),t)};import{jsx as C}from"react/jsx-runtime";var We=U.default||U,ze=We(_e),P=Le(["github-light","github-dark"]),G=q(({content:e,shouldParseIncompleteMarkdown:t,...r})=>{let n=N(()=>typeof e=="string"&&t?O(e.trim()):e,[e,t]);return C(ze,{...r,children:n})},(e,t)=>e.content===t.content);G.displayName="Block";var Oe=q(({children:e,allowedImagePrefixes:t,allowedLinkPrefixes:r,defaultOrigin:n,parseIncompleteMarkdown:o=!0,components:s,rehypePlugins:a,remarkPlugins:c,className:l,shikiTheme:m=["github-light","github-dark"],...u})=>{let f=Ae(),h=N(()=>z(typeof e=="string"?e:""),[e]),g=N(()=>()=>Re({errorColor:"var(--color-muted-foreground)"}),[]);return C(P.Provider,{value:m,children:C("div",{className:i("space-y-4",l),...u,children:h.map((k,y)=>C(G,{allowedImagePrefixes:t!=null?t:["*"],allowedLinkPrefixes:r!=null?r:["*"],components:{...W,...s},content:k,defaultOrigin:n,rehypePlugins:[g,...a!=null?a:[]],remarkPlugins:[Ee,[De,{singleDollarTextMath:!1}],...c!=null?c:[]],shouldParseIncompleteMarkdown:o},`${f}-block_${y}`))})})},(e,t)=>e.children===t.children&&e.shikiTheme===t.shikiTheme);Oe.displayName="Streamdown";export{P as ShikiThemeContext,Oe as Streamdown};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "streamdown",
3
- "version": "1.1.6",
3
+ "version": "1.1.8",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",