streamdown 1.3.0 → 1.5.0

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
@@ -19,7 +19,7 @@ Streamdown powers the [AI Elements Response](https://ai-sdk.dev/elements/compone
19
19
  - 🔢 **Math rendering** - LaTeX equations via KaTeX
20
20
  - 📈 **Mermaid diagrams** - Render Mermaid diagrams as code blocks with a button to render them
21
21
  - 🎯 **Code syntax highlighting** - Beautiful code blocks with Shiki
22
- - 🛡️ **Security-first** - Built on harden-react-markdown for safe rendering
22
+ - 🛡️ **Security-first** - Built with rehype-harden for safe rendering
23
23
  - ⚡ **Performance optimized** - Memoized rendering for efficient updates
24
24
 
25
25
  ## Installation
@@ -38,7 +38,7 @@ Make sure the path matches the location of the `node_modules` folder in your pro
38
38
 
39
39
  ## Usage
40
40
 
41
- ### Basic Example
41
+ You can use Streamdown in your React application like this:
42
42
 
43
43
  ```tsx
44
44
  import { Streamdown } from 'streamdown';
@@ -50,155 +50,4 @@ export default function Page() {
50
50
  }
51
51
  ```
52
52
 
53
- ### Mermaid Diagrams
54
-
55
- Streamdown supports Mermaid diagrams using the `mermaid` language identifier:
56
-
57
- ```tsx
58
- import { Streamdown } from 'streamdown';
59
- import type { MermaidConfig } from 'mermaid';
60
-
61
- export default function Page() {
62
- const markdown = `
63
- # Flowchart Example
64
-
65
- \`\`\`mermaid
66
- graph TD
67
- A[Start] --> B{Is it working?}
68
- B -->|Yes| C[Great!]
69
- B -->|No| D[Debug]
70
- D --> B
71
- \`\`\`
72
-
73
- # Sequence Diagram
74
-
75
- \`\`\`mermaid
76
- sequenceDiagram
77
- participant User
78
- participant API
79
- participant Database
80
-
81
- User->>API: Request data
82
- API->>Database: Query
83
- Database-->>API: Results
84
- API-->>User: Response
85
- \`\`\`
86
- `;
87
-
88
- // Optional: Customize Mermaid theme and colors
89
- const mermaidConfig: MermaidConfig = {
90
- theme: 'dark',
91
- themeVariables: {
92
- primaryColor: '#ff0000',
93
- primaryTextColor: '#fff'
94
- }
95
- };
96
-
97
- return (
98
- <Streamdown mermaidConfig={mermaidConfig}>
99
- {markdown}
100
- </Streamdown>
101
- );
102
- }
103
- ```
104
-
105
- ### With AI SDK
106
-
107
- ```tsx
108
- 'use client';
109
-
110
- import { useChat } from '@ai-sdk/react';
111
- import { useState } from 'react';
112
- import { Streamdown } from 'streamdown';
113
-
114
- export default function Page() {
115
- const { messages, sendMessage, status } = useChat();
116
- const [input, setInput] = useState('');
117
-
118
- return (
119
- <>
120
- {messages.map(message => (
121
- <div key={message.id}>
122
- {message.parts.filter(part => part.type === 'text').map((part, index) => (
123
- <Streamdown key={index}>{part.text}</Streamdown>
124
- ))}
125
- </div>
126
- ))}
127
-
128
- <form
129
- onSubmit={e => {
130
- e.preventDefault();
131
- if (input.trim()) {
132
- sendMessage({ text: input });
133
- setInput('');
134
- }
135
- }}
136
- >
137
- <input
138
- value={input}
139
- onChange={e => setInput(e.target.value)}
140
- disabled={status !== 'ready'}
141
- placeholder="Say something..."
142
- />
143
- <button type="submit" disabled={status !== 'ready'}>
144
- Submit
145
- </button>
146
- </form>
147
- </>
148
- );
149
- }
150
- ```
151
-
152
- ## Props
153
-
154
- Streamdown accepts all the same props as react-markdown, plus additional streaming-specific options:
155
-
156
- | Prop | Type | Default | Description |
157
- |------|------|---------|-------------|
158
- | `children` | `string` | - | The Markdown content to render |
159
- | `parseIncompleteMarkdown` | `boolean` | `true` | Parse and style unterminated Markdown blocks |
160
- | `className` | `string` | - | CSS class for the container |
161
- | `components` | `object` | - | Custom component overrides |
162
- | `remarkPlugins` | `array` | `[remarkGfm, remarkMath]` | Remark plugins to use |
163
- | `rehypePlugins` | `array` | `[rehypeKatex]` | Rehype plugins to use |
164
- | `allowedImagePrefixes` | `array` | `['*']` | Allowed image URL prefixes |
165
- | `allowedLinkPrefixes` | `array` | `['*']` | Allowed link URL prefixes |
166
- | `defaultOrigin` | `string` | - | Default origin to use for relative URLs in links and images |
167
- | `shikiTheme` | `[BundledTheme, BundledTheme]` | `['github-light', 'github-dark']` | The light and dark themes to use for code blocks |
168
- | `mermaidConfig` | `MermaidConfig` | - | Custom configuration for Mermaid diagrams (theme, colors, etc.) |
169
- | `controls` | `boolean \| { table?: boolean, code?: boolean, mermaid?: boolean }` | `true` | Control visibility of copy/download buttons |
170
-
171
- ## Architecture
172
-
173
- Streamdown is built as a monorepo with:
174
-
175
- - **`packages/streamdown`** - The core React component library
176
- - **`apps/website`** - Documentation and demo site
177
-
178
- ## Development
179
-
180
- ```bash
181
- # Install dependencies
182
- pnpm install
183
-
184
- # Build the streamdown package
185
- pnpm --filter streamdown build
186
-
187
- # Run development server
188
- pnpm dev
189
-
190
- # Run tests
191
- pnpm test
192
-
193
- # Build packages
194
- pnpm build
195
- ```
196
-
197
- ## Requirements
198
-
199
- - Node.js >= 18
200
- - React >= 19.1.1
201
-
202
- ## Contributing
203
-
204
- Contributions are welcome! Please feel free to submit a Pull Request.
53
+ For more info, see the [documentation](https://streamdown.ai/docs).
package/dist/index.cjs CHANGED
@@ -1,15 +1,18 @@
1
- "use strict";"use client";var Xe=Object.create;var q=Object.defineProperty;var Je=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var Ge=Object.getPrototypeOf,Ve=Object.prototype.hasOwnProperty;var Ke=(e,t)=>{for(var o in t)q(e,o,{get:t[o],enumerable:!0})},G=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Fe(t))!Ve.call(e,r)&&r!==o&&q(e,r,{get:()=>t[r],enumerable:!(s=Je(t,r))||s.enumerable});return e};var I=(e,t,o)=>(o=e!=null?Xe(Ge(e)):{},G(t||!e||!e.__esModule?q(o,"default",{value:e,enumerable:!0}):o,e)),Qe=e=>G(q({},"__esModule",{value:!0}),e);var Lt={};Ke(Lt,{ControlsContext:()=>A,MermaidConfigContext:()=>_,ShikiThemeContext:()=>D,Streamdown:()=>Ue});module.exports=Qe(Lt);var v=require("react"),qe=I(require("react-markdown"),1),De=I(require("rehype-katex"),1),Ee=I(require("rehype-raw"),1),_e=I(require("remark-gfm"),1),Oe=I(require("remark-math"),1),Kt=require("katex/dist/katex.min.css"),F=I(require("harden-react-markdown"),1);var g=require("react");var x=require("lucide-react"),w=require("react"),R=require("shiki"),Z=require("shiki/engine/javascript");var V=require("clsx"),K=require("tailwind-merge"),d=(...e)=>(0,K.twMerge)((0,V.clsx)(e)),H=(e,t,o)=>{let s=typeof t=="string"?new Blob([t],{type:o}):t,r=URL.createObjectURL(s),n=document.createElement("a");n.href=r,n.download=e,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(r)};var y=require("react/jsx-runtime"),Ye=/<pre(\s|>)/,U=(0,w.createContext)({code:""}),W=class{constructor(){this.lightHighlighter=null;this.darkHighlighter=null;this.lightTheme=null;this.darkTheme=null;this.loadedLanguages=new Set;this.initializationPromise=null}isLanguageSupported(t){return Object.hasOwn(R.bundledLanguages,t)}getFallbackLanguage(){return"text"}async ensureHighlightersInitialized(t,o){var p,f;let[s,r]=t,n=(0,Z.createJavaScriptRegexEngine)({forgiving:!0}),a=!this.lightHighlighter||this.lightTheme!==s,l=!this.darkHighlighter||this.darkTheme!==r;(a||l)&&this.loadedLanguages.clear();let i=this.isLanguageSupported(o),m=!this.loadedLanguages.has(o)&&i;if(a?(this.lightHighlighter=await(0,R.createHighlighter)({themes:[s],langs:i?[o]:[],engine:n}),this.lightTheme=s,i&&this.loadedLanguages.add(o)):m&&await((p=this.lightHighlighter)==null?void 0:p.loadLanguage(o)),l){let h=m?[...this.loadedLanguages].concat(i?[o]:[]):Array.from(this.loadedLanguages);this.darkHighlighter=await(0,R.createHighlighter)({themes:[r],langs:h.length>0?h:i?[o]:[],engine:n}),this.darkTheme=r}else m&&await((f=this.darkHighlighter)==null?void 0:f.loadLanguage(o));m&&this.loadedLanguages.add(o)}async highlightCode(t,o,s,r){var f,h;this.initializationPromise&&await this.initializationPromise,this.initializationPromise=this.ensureHighlightersInitialized(s,o),await this.initializationPromise,this.initializationPromise=null;let[n,a]=s,l=this.isLanguageSupported(o)?o:this.getFallbackLanguage(),i=(f=this.lightHighlighter)==null?void 0:f.codeToHtml(t,{lang:l,theme:n}),m=(h=this.darkHighlighter)==null?void 0:h.codeToHtml(t,{lang:l,theme:a}),p=u=>r?u.replace(Ye,`<pre class="${r}"$1`):u;return[Q(p(i)),Q(p(m))]}},Ze=new W,Q=e=>e.replace(/(<pre[^>]*)(style="[^"]*background[^";]*;?[^"]*")([^>]*>)/g,"$1$3"),ee=({code:e,language:t,className:o,children:s,preClassName:r,...n})=>{let[a,l]=(0,w.useState)(""),[i,m]=(0,w.useState)(""),p=(0,w.useRef)(!1),[f,h]=(0,w.useContext)(D);return(0,w.useEffect)(()=>(p.current=!0,Ze.highlightCode(e,t,[f,h],r).then(([u,b])=>{p.current&&(l(u),m(b))}),()=>{p.current=!1}),[e,t,f,h,r]),(0,y.jsx)(U.Provider,{value:{code:e},children:(0,y.jsxs)("div",{className:"my-4 w-full overflow-hidden rounded-xl border","data-code-block-container":!0,"data-language":t,children:[(0,y.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,y.jsx)("span",{className:"ml-1 font-mono lowercase",children:t}),(0,y.jsx)("div",{className:"flex items-center gap-2",children:s})]}),(0,y.jsx)("div",{className:"w-full",children:(0,y.jsxs)("div",{className:"min-w-full",children:[(0,y.jsx)("div",{className:d("overflow-x-auto dark:hidden",o),dangerouslySetInnerHTML:{__html:a},"data-code-block":!0,"data-language":t,...n}),(0,y.jsx)("div",{className:d("hidden overflow-x-auto dark:block",o),dangerouslySetInnerHTML:{__html:i},"data-code-block":!0,"data-language":t,...n})]})})]})})},Y={"1c":"1c","1c-query":"1cq",abap:"abap","actionscript-3":"as",ada:"ada",adoc:"adoc","angular-html":"html","angular-ts":"ts",apache:"conf",apex:"cls",apl:"apl",applescript:"applescript",ara:"ara",asciidoc:"adoc",asm:"asm",astro:"astro",awk:"awk",ballerina:"bal",bash:"sh",bat:"bat",batch:"bat",be:"be",beancount:"beancount",berry:"berry",bibtex:"bib",bicep:"bicep",blade:"blade.php",bsl:"bsl",c:"c","c#":"cs","c++":"cpp",cadence:"cdc",cairo:"cairo",cdc:"cdc",clarity:"clar",clj:"clj",clojure:"clj","closure-templates":"soy",cmake:"cmake",cmd:"cmd",cobol:"cob",codeowners:"CODEOWNERS",codeql:"ql",coffee:"coffee",coffeescript:"coffee","common-lisp":"lisp",console:"sh",coq:"v",cpp:"cpp",cql:"cql",crystal:"cr",cs:"cs",csharp:"cs",css:"css",csv:"csv",cue:"cue",cypher:"cql",d:"d",dart:"dart",dax:"dax",desktop:"desktop",diff:"diff",docker:"dockerfile",dockerfile:"dockerfile",dotenv:"env","dream-maker":"dm",edge:"edge",elisp:"el",elixir:"ex",elm:"elm","emacs-lisp":"el",erb:"erb",erl:"erl",erlang:"erl",f:"f","f#":"fs",f03:"f03",f08:"f08",f18:"f18",f77:"f77",f90:"f90",f95:"f95",fennel:"fnl",fish:"fish",fluent:"ftl",for:"for","fortran-fixed-form":"f","fortran-free-form":"f90",fs:"fs",fsharp:"fs",fsl:"fsl",ftl:"ftl",gdresource:"tres",gdscript:"gd",gdshader:"gdshader",genie:"gs",gherkin:"feature","git-commit":"gitcommit","git-rebase":"gitrebase",gjs:"js",gleam:"gleam","glimmer-js":"js","glimmer-ts":"ts",glsl:"glsl",gnuplot:"plt",go:"go",gql:"gql",graphql:"graphql",groovy:"groovy",gts:"gts",hack:"hack",haml:"haml",handlebars:"hbs",haskell:"hs",haxe:"hx",hbs:"hbs",hcl:"hcl",hjson:"hjson",hlsl:"hlsl",hs:"hs",html:"html","html-derivative":"html",http:"http",hxml:"hxml",hy:"hy",imba:"imba",ini:"ini",jade:"jade",java:"java",javascript:"js",jinja:"jinja",jison:"jison",jl:"jl",js:"js",json:"json",json5:"json5",jsonc:"jsonc",jsonl:"jsonl",jsonnet:"jsonnet",jssm:"jssm",jsx:"jsx",julia:"jl",kotlin:"kt",kql:"kql",kt:"kt",kts:"kts",kusto:"kql",latex:"tex",lean:"lean",lean4:"lean",less:"less",liquid:"liquid",lisp:"lisp",lit:"lit",llvm:"ll",log:"log",logo:"logo",lua:"lua",luau:"luau",make:"mak",makefile:"mak",markdown:"md",marko:"marko",matlab:"m",md:"md",mdc:"mdc",mdx:"mdx",mediawiki:"wiki",mermaid:"mmd",mips:"s",mipsasm:"s",mmd:"mmd",mojo:"mojo",move:"move",nar:"nar",narrat:"narrat",nextflow:"nf",nf:"nf",nginx:"conf",nim:"nim",nix:"nix",nu:"nu",nushell:"nu",objc:"m","objective-c":"m","objective-cpp":"mm",ocaml:"ml",pascal:"pas",perl:"pl",perl6:"p6",php:"php",plsql:"pls",po:"po",polar:"polar",postcss:"pcss",pot:"pot",potx:"potx",powerquery:"pq",powershell:"ps1",prisma:"prisma",prolog:"pl",properties:"properties",proto:"proto",protobuf:"proto",ps:"ps",ps1:"ps1",pug:"pug",puppet:"pp",purescript:"purs",py:"py",python:"py",ql:"ql",qml:"qml",qmldir:"qmldir",qss:"qss",r:"r",racket:"rkt",raku:"raku",razor:"cshtml",rb:"rb",reg:"reg",regex:"regex",regexp:"regexp",rel:"rel",riscv:"s",rs:"rs",rst:"rst",ruby:"rb",rust:"rs",sas:"sas",sass:"sass",scala:"scala",scheme:"scm",scss:"scss",sdbl:"sdbl",sh:"sh",shader:"shader",shaderlab:"shader",shell:"sh",shellscript:"sh",shellsession:"sh",smalltalk:"st",solidity:"sol",soy:"soy",sparql:"rq",spl:"spl",splunk:"spl",sql:"sql","ssh-config":"config",stata:"do",styl:"styl",stylus:"styl",svelte:"svelte",swift:"swift","system-verilog":"sv",systemd:"service",talon:"talon",talonscript:"talon",tasl:"tasl",tcl:"tcl",templ:"templ",terraform:"tf",tex:"tex",tf:"tf",tfvars:"tfvars",toml:"toml",ts:"ts","ts-tags":"ts",tsp:"tsp",tsv:"tsv",tsx:"tsx",turtle:"ttl",twig:"twig",typ:"typ",typescript:"ts",typespec:"tsp",typst:"typ",v:"v",vala:"vala",vb:"vb",verilog:"v",vhdl:"vhdl",vim:"vim",viml:"vim",vimscript:"vim",vue:"vue","vue-html":"html","vue-vine":"vine",vy:"vy",vyper:"vy",wasm:"wasm",wenyan:"wy",wgsl:"wgsl",wiki:"wiki",wikitext:"wiki",wit:"wit",wl:"wl",wolfram:"wl",xml:"xml",xsl:"xsl",yaml:"yaml",yml:"yml",zenscript:"zs",zig:"zig",zsh:"zsh",\u6587\u8A00:"wy"},z=({onDownload:e,onError:t,language:o,children:s,className:r,code:n,...a})=>{let l=(0,w.useContext)(U).code,i=n!=null?n:l,p=`file.${o&&o in Y?Y[o]:"txt"}`,f="text/plain",h=()=>{try{H(p,i,f),e==null||e()}catch(u){t==null||t(u)}};return(0,y.jsx)("button",{className:d("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground",r),onClick:h,title:"Download file",type:"button",...a,children:s!=null?s:(0,y.jsx)(x.DownloadIcon,{size:14})})},X=({onCopy:e,onError:t,timeout:o=2e3,children:s,className:r,code:n,...a})=>{let[l,i]=(0,w.useState)(!1),m=(0,w.useRef)(0),p=(0,w.useContext)(U).code,f=n!=null?n:p,h=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{l||(await navigator.clipboard.writeText(f),i(!0),e==null||e(),m.current=window.setTimeout(()=>i(!1),o))}catch(T){t==null||t(T)}};(0,w.useEffect)(()=>()=>{window.clearTimeout(m.current)},[]);let u=l?x.CheckIcon:x.CopyIcon;return(0,y.jsx)("button",{className:d("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground",r),onClick:h,type:"button",...a,children:s!=null?s:(0,y.jsx)(u,{size:14})})};var te=require("lucide-react");var B=require("react/jsx-runtime"),oe=({node:e,className:t,src:o,alt:s,...r})=>{let n=async()=>{var a;if(o)try{let i=await(await fetch(o)).blob(),p=new URL(o,window.location.origin).pathname.split("/").pop()||"",f=p.includes(".")&&((a=p.split(".").pop())==null?void 0:a.length)<=4,h="";if(f)h=p;else{let u=i.type,b="png";u.includes("jpeg")||u.includes("jpg")?b="jpg":u.includes("png")?b="png":u.includes("svg")?b="svg":u.includes("gif")?b="gif":u.includes("webp")&&(b="webp"),h=`${(s||p||"image").replace(/\.[^/.]+$/,"")}.${b}`}H(h,i,i.type)}catch(l){console.error("Failed to download image:",l)}};return o?(0,B.jsxs)("div",{className:"group relative my-4 inline-block","data-streamdown":"image-wrapper",children:[(0,B.jsx)("img",{alt:s,className:d("max-w-full rounded-lg",t),"data-streamdown":"image",src:o,...r}),(0,B.jsx)("div",{className:"pointer-events-none absolute inset-0 hidden rounded-lg bg-black/10 group-hover:block"}),(0,B.jsx)("button",{className:d("absolute right-2 bottom-2 flex h-8 w-8 cursor-pointer items-center justify-center rounded-md border border-border bg-background/90 shadow-sm backdrop-blur-sm transition-all duration-200 hover:bg-background","opacity-0 group-hover:opacity-100"),onClick:n,title:"Download image",type:"button",children:(0,B.jsx)(te.DownloadIcon,{size:14})})]}):null};var L=require("react");var M=require("react/jsx-runtime"),et=async e=>{let o={...{startOnLoad:!1,theme:"default",securityLevel:"strict",fontFamily:"monospace",suppressErrorRendering:!0},...e},r=(await import("mermaid")).default;return r.initialize(o),r},se=({chart:e,className:t,config:o})=>{let[s,r]=(0,L.useState)(null),[n,a]=(0,L.useState)(!0),[l,i]=(0,L.useState)(""),[m,p]=(0,L.useState)("");if((0,L.useEffect)(()=>{(async()=>{try{r(null),a(!0);let u=await et(o),b=e.split("").reduce(($,ze)=>($<<5)-$+ze.charCodeAt(0)|0,0),T=`mermaid-${Math.abs(b)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:P}=await u.render(T,e);i(P),p(P)}catch(u){if(!(m||l)){let b=u instanceof Error?u.message:"Failed to render Mermaid chart";r(b)}}finally{a(!1)}})()},[e,o]),n&&!l&&!m)return(0,M.jsx)("div",{className:d("my-4 flex justify-center p-4",t),children:(0,M.jsxs)("div",{className:"flex items-center space-x-2 text-muted-foreground",children:[(0,M.jsx)("div",{className:"h-4 w-4 animate-spin rounded-full border-current border-b-2"}),(0,M.jsx)("span",{className:"text-sm",children:"Loading diagram..."})]})});if(s&&!l&&!m)return(0,M.jsxs)("div",{className:d("rounded-lg border border-red-200 bg-red-50 p-4",t),children:[(0,M.jsxs)("p",{className:"font-mono text-red-700 text-sm",children:["Mermaid Error: ",s]}),(0,M.jsxs)("details",{className:"mt-2",children:[(0,M.jsx)("summary",{className:"cursor-pointer text-red-600 text-xs",children:"Show Code"}),(0,M.jsx)("pre",{className:"mt-2 overflow-x-auto rounded bg-red-100 p-2 text-red-800 text-xs",children:e})]})]});let f=l||m;return(0,M.jsx)("div",{"aria-label":"Mermaid chart",className:d("my-4 flex justify-center",t),dangerouslySetInnerHTML:{__html:f},role:"img"})};var j=require("lucide-react"),N=require("react");var C=require("react/jsx-runtime");function ne(e){var n,a;let t=[],o=[],s=e.querySelectorAll("thead th");for(let l of s)t.push(((n=l.textContent)==null?void 0:n.trim())||"");let r=e.querySelectorAll("tbody tr");for(let l of r){let i=[],m=l.querySelectorAll("td");for(let p of m)i.push(((a=p.textContent)==null?void 0:a.trim())||"");o.push(i)}return{headers:t,rows:o}}function re(e){let{headers:t,rows:o}=e,s=n=>n.includes(",")||n.includes('"')||n.includes(`
2
- `)?`"${n.replace(/"/g,'""')}"`:n,r=[];t.length>0&&r.push(t.map(s).join(","));for(let n of o)r.push(n.map(s).join(","));return r.join(`
3
- `)}function ae(e){let{headers:t,rows:o}=e;if(t.length===0)return"";let s=[],r=t.map(n=>n.replace(/\|/g,"\\|"));s.push(`| ${r.join(" | ")} |`),s.push(`| ${t.map(()=>"---").join(" | ")} |`);for(let n of o){let a=[...n];for(;a.length<t.length;)a.push("");let l=a.map(i=>i.replace(/\|/g,"\\|"));s.push(`| ${l.join(" | ")} |`)}return s.join(`
4
- `)}var ie=({children:e,className:t,onCopy:o,onError:s,timeout:r=2e3,format:n="markdown"})=>{let[a,l]=(0,N.useState)(!1),i=(0,N.useRef)(0),m=async f=>{var h;if(typeof window=="undefined"||!((h=navigator==null?void 0:navigator.clipboard)!=null&&h.write)){s==null||s(new Error("Clipboard API not available"));return}try{if(!a){let b=f.currentTarget.closest('[data-streamdown="table-wrapper"]'),T=b==null?void 0:b.querySelector("table");if(!T){s==null||s(new Error("Table not found"));return}let P=ne(T),$=new ClipboardItem({"text/plain":n==="markdown"?ae(P):re(P),"text/html":new Blob([T.outerHTML],{type:"text/html"})});await navigator.clipboard.write([$]),l(!0),o==null||o(),i.current=window.setTimeout(()=>l(!1),r)}}catch(u){s==null||s(u)}};(0,N.useEffect)(()=>()=>{window.clearTimeout(i.current)},[]);let p=a?j.CheckIcon:j.CopyIcon;return(0,C.jsx)("button",{className:d("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground",t),onClick:m,title:`Copy table as ${n}`,type:"button",children:e!=null?e:(0,C.jsx)(p,{size:14})})};var le=({children:e,className:t,onDownload:o,onError:s})=>{let[r,n]=(0,N.useState)(!1),a=(0,N.useRef)(null),l=i=>{var m;try{let p=(m=a.current)==null?void 0:m.closest('[data-streamdown="table-wrapper"]'),f=p==null?void 0:p.querySelector("table");if(!f){s==null||s(new Error("Table not found"));return}let h=ne(f),u=i==="csv"?re(h):ae(h);H(`table.${i==="csv"?"csv":"md"}`,u,i==="csv"?"text/csv":"text/markdown"),n(!1),o==null||o(i)}catch(p){s==null||s(p)}};return(0,N.useEffect)(()=>{let i=m=>{a.current&&!a.current.contains(m.target)&&n(!1)};return document.addEventListener("mousedown",i),()=>{document.removeEventListener("mousedown",i)}},[]),(0,C.jsxs)("div",{className:"relative",ref:a,children:[(0,C.jsx)("button",{className:d("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground",t),onClick:()=>n(!r),title:"Download table",type:"button",children:e!=null?e:(0,C.jsx)(j.DownloadIcon,{size:14})}),r&&(0,C.jsxs)("div",{className:"absolute top-full right-0 z-10 mt-1 min-w-[120px] rounded-md border border-border bg-background shadow-lg",children:[(0,C.jsx)("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>l("csv"),type:"button",children:"CSV"}),(0,C.jsx)("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>l("markdown"),type:"button",children:"Markdown"})]})]})};var c=require("react/jsx-runtime"),tt=/language-([^\s]+)/;function E(e,t){if(!(e!=null&&e.position||t!=null&&t.position))return!0;if(!(e!=null&&e.position&&(t!=null&&t.position)))return!1;let o=e.position.start,s=t.position.start,r=e.position.end,n=t.position.end;return(o==null?void 0:o.line)===(s==null?void 0:s.line)&&(o==null?void 0:o.column)===(s==null?void 0:s.column)&&(r==null?void 0:r.line)===(n==null?void 0:n.line)&&(r==null?void 0:r.column)===(n==null?void 0:n.column)}function k(e,t){return e.className===t.className&&E(e.node,t.node)}var J=(e,t)=>typeof e=="boolean"?e:e[t]!==!1,de=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("ol",{className:d("ml-4 list-outside list-decimal whitespace-normal",t),"data-streamdown":"ordered-list",...o,children:e}),(e,t)=>k(e,t));de.displayName="MarkdownOl";var ce=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("li",{className:d("py-1",t),"data-streamdown":"list-item",...o,children:e}),(e,t)=>e.className===t.className&&E(e.node,t.node));ce.displayName="MarkdownLi";var me=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("ul",{className:d("ml-4 list-outside list-disc whitespace-normal",t),"data-streamdown":"unordered-list",...o,children:e}),(e,t)=>k(e,t));me.displayName="MarkdownUl";var pe=(0,g.memo)(({className:e,...t})=>(0,c.jsx)("hr",{className:d("my-6 border-border",e),"data-streamdown":"horizontal-rule",...t}),(e,t)=>k(e,t));pe.displayName="MarkdownHr";var ue=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("span",{className:d("font-semibold",t),"data-streamdown":"strong",...o,children:e}),(e,t)=>k(e,t));ue.displayName="MarkdownStrong";var ge=(0,g.memo)(({children:e,className:t,href:o,...s})=>{let r=o==="streamdown:incomplete-link";return(0,c.jsx)("a",{className:d("wrap-anywhere font-medium text-primary underline",t),"data-incomplete":r,"data-streamdown":"link",href:o,rel:"noreferrer",target:"_blank",...s,children:e})},(e,t)=>k(e,t)&&e.href===t.href);ge.displayName="MarkdownA";var he=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("h1",{className:d("mt-6 mb-2 font-semibold text-3xl",t),"data-streamdown":"heading-1",...o,children:e}),(e,t)=>k(e,t));he.displayName="MarkdownH1";var fe=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("h2",{className:d("mt-6 mb-2 font-semibold text-2xl",t),"data-streamdown":"heading-2",...o,children:e}),(e,t)=>k(e,t));fe.displayName="MarkdownH2";var be=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("h3",{className:d("mt-6 mb-2 font-semibold text-xl",t),"data-streamdown":"heading-3",...o,children:e}),(e,t)=>k(e,t));be.displayName="MarkdownH3";var ke=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("h4",{className:d("mt-6 mb-2 font-semibold text-lg",t),"data-streamdown":"heading-4",...o,children:e}),(e,t)=>k(e,t));ke.displayName="MarkdownH4";var we=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("h5",{className:d("mt-6 mb-2 font-semibold text-base",t),"data-streamdown":"heading-5",...o,children:e}),(e,t)=>k(e,t));we.displayName="MarkdownH5";var ye=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("h6",{className:d("mt-6 mb-2 font-semibold text-sm",t),"data-streamdown":"heading-6",...o,children:e}),(e,t)=>k(e,t));ye.displayName="MarkdownH6";var ve=(0,g.memo)(({children:e,className:t,...o})=>{let s=(0,g.useContext)(A),r=J(s,"table");return(0,c.jsxs)("div",{className:"my-4 flex flex-col space-y-2","data-streamdown":"table-wrapper",children:[r&&(0,c.jsxs)("div",{className:"flex items-center justify-end gap-1",children:[(0,c.jsx)(ie,{}),(0,c.jsx)(le,{})]}),(0,c.jsx)("div",{className:"overflow-x-auto",children:(0,c.jsx)("table",{className:d("w-full border-collapse border border-border",t),"data-streamdown":"table",...o,children:e})})]})},(e,t)=>k(e,t));ve.displayName="MarkdownTable";var Me=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("thead",{className:d("bg-muted/80",t),"data-streamdown":"table-header",...o,children:e}),(e,t)=>k(e,t));Me.displayName="MarkdownThead";var Te=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("tbody",{className:d("divide-y divide-border bg-muted/40",t),"data-streamdown":"table-body",...o,children:e}),(e,t)=>k(e,t));Te.displayName="MarkdownTbody";var Ce=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("tr",{className:d("border-border border-b",t),"data-streamdown":"table-row",...o,children:e}),(e,t)=>k(e,t));Ce.displayName="MarkdownTr";var Ne=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("th",{className:d("whitespace-nowrap px-4 py-2 text-left font-semibold text-sm",t),"data-streamdown":"table-header-cell",...o,children:e}),(e,t)=>k(e,t));Ne.displayName="MarkdownTh";var Pe=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("td",{className:d("px-4 py-2 text-sm",t),"data-streamdown":"table-cell",...o,children:e}),(e,t)=>k(e,t));Pe.displayName="MarkdownTd";var Ie=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("blockquote",{className:d("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",t),"data-streamdown":"blockquote",...o,children:e}),(e,t)=>k(e,t));Ie.displayName="MarkdownBlockquote";var Be=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("sup",{className:d("text-sm",t),"data-streamdown":"superscript",...o,children:e}),(e,t)=>k(e,t));Be.displayName="MarkdownSup";var Le=(0,g.memo)(({children:e,className:t,...o})=>(0,c.jsx)("sub",{className:d("text-sm",t),"data-streamdown":"subscript",...o,children:e}),(e,t)=>k(e,t));Le.displayName="MarkdownSub";var ot=({node:e,className:t,children:o,...s})=>{var f,h,u;let r=((f=e==null?void 0:e.position)==null?void 0:f.start.line)===((h=e==null?void 0:e.position)==null?void 0:h.end.line),n=(0,g.useContext)(_),a=(0,g.useContext)(A);if(r)return(0,c.jsx)("code",{className:d("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...s,children:o});let l=t==null?void 0:t.match(tt),i=(u=l==null?void 0:l.at(1))!=null?u:"",m="";if((0,g.isValidElement)(o)&&o.props&&typeof o.props=="object"&&"children"in o.props&&typeof o.props.children=="string"?m=o.props.children:typeof o=="string"&&(m=o),i==="mermaid"){let b=J(a,"mermaid");return(0,c.jsxs)("div",{className:d("group relative my-4 h-auto rounded-xl border p-4",t),"data-streamdown":"mermaid-block",children:[b&&(0,c.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[(0,c.jsx)(z,{code:m,language:i}),(0,c.jsx)(X,{code:m})]}),(0,c.jsx)(se,{chart:m,config:n})]})}let p=J(a,"code");return(0,c.jsx)(ee,{className:d("overflow-x-auto border-t",t),code:m,"data-language":i,"data-streamdown":"code-block",language:i,preClassName:"overflow-x-auto font-mono text-xs p-4 bg-muted/40",children:p&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(z,{code:m,language:i}),(0,c.jsx)(X,{})]})})},Se=(0,g.memo)(ot,(e,t)=>e.className===t.className&&E(e.node,t.node));Se.displayName="MarkdownCode";var $e=(0,g.memo)(oe,(e,t)=>e.className===t.className&&E(e.node,t.node));$e.displayName="MarkdownImg";var He={ol:de,li:ce,ul:me,hr:pe,strong:ue,a:ge,h1:he,h2:fe,h3:be,h4:ke,h5:we,h6:ye,table:ve,thead:Me,tbody:Te,tr:Ce,th:Ne,td:Pe,blockquote:Ie,code:Se,img:$e,pre:({children:e})=>e,sup:Be,sub:Le};var xe=require("marked"),je=e=>{let o=xe.Lexer.lex(e,{gfm:!0}).map(r=>r.raw),s=[];for(let r of o){if(r.trim()==="$$"&&s.length>0){let n=s.at(-1);if(!n)continue;let a=n.trimStart().startsWith("$$"),l=(n.match(/\$\$/g)||[]).length;if(a&&l%2===1){s[s.length-1]=n+r;continue}}if(s.length>0&&r.trimEnd().endsWith("$$")){let n=s.at(-1);if(!n)continue;let a=n.trimStart().startsWith("$$"),l=(n.match(/\$\$/g)||[]).length,i=(r.match(/\$\$/g)||[]).length;if(a&&l%2===1&&!r.trimStart().startsWith("$$")&&i===1){s[s.length-1]=n+r;continue}}s.push(r)}return s};var st=/(!?\[)([^\]]*?)$/,nt=/(\*\*)([^*]*?)$/,rt=/(__)([^_]*?)$/,at=/(\*\*\*)([^*]*?)$/,it=/(\*)([^*]*?)$/,lt=/(_)([^_]*?)$/,dt=/(`)([^`]*?)$/,ct=/(~~)([^~]*?)$/,O=e=>{let t=(e.match(/```/g)||[]).length;return t>0&&t%2===0&&e.includes(`
5
- `)},mt=e=>{let t=e.match(st);if(t){if(t[1].startsWith("!")){let s=e.lastIndexOf(t[1]);return e.substring(0,s)}return`${e}](streamdown:incomplete-link)`}return e},pt=e=>{if(O(e))return e;let t=e.match(nt);if(t){let o=t[2];if(!o||/^[\s_~*`]*$/.test(o))return e;let s=e.lastIndexOf(t[1]),n=e.substring(0,s).lastIndexOf(`
6
- `),a=n===-1?0:n+1,l=e.substring(a,s);if(/^[\s]*[-*+][\s]+$/.test(l)&&o.includes(`
7
- `))return e;if((e.match(/\*\*/g)||[]).length%2===1)return`${e}**`}return e},ut=e=>{let t=e.match(rt);if(t){let o=t[2];if(!o||/^[\s_~*`]*$/.test(o))return e;let s=e.lastIndexOf(t[1]),n=e.substring(0,s).lastIndexOf(`
8
- `),a=n===-1?0:n+1,l=e.substring(a,s);if(/^[\s]*[-*+][\s]+$/.test(l)&&o.includes(`
9
- `))return e;if((e.match(/__/g)||[]).length%2===1)return`${e}__`}return e},gt=e=>e.split("").reduce((t,o,s)=>{if(o==="*"){let r=e[s-1],n=e[s+1];if(r==="\\")return t;let a=s;for(let i=s-1;i>=0;i--){if(e[i]===`
10
- `){a=i+1;break}if(i===0){a=0;break}}if(e.substring(a,s).trim()===""&&(n===" "||n===" "))return t;if(r!=="*"&&n!=="*")return t+1}return t},0),ht=e=>{if(O(e))return e;if(e.match(it)){let o=-1;for(let n=0;n<e.length;n++)if(e[n]==="*"&&e[n-1]!=="*"&&e[n+1]!=="*"){o=n;break}if(o===-1)return e;let s=e.substring(o+1);if(!s||/^[\s_~*`]*$/.test(s))return e;if(gt(e)%2===1)return`${e}*`}return e},Re=(e,t)=>{let o=!1,s=!1;for(let r=0;r<e.length&&r<t;r++){if(e[r]==="\\"&&e[r+1]==="$"){r++;continue}e[r]==="$"&&(e[r+1]==="$"?(s=!s,r++,o=!1):s||(o=!o))}return o||s},ft=e=>e.split("").reduce((t,o,s)=>{if(o==="_"){let r=e[s-1],n=e[s+1];if(r==="\\"||Re(e,s)||r&&n&&/[\p{L}\p{N}_]/u.test(r)&&/[\p{L}\p{N}_]/u.test(n))return t;if(r!=="_"&&n!=="_")return t+1}return t},0),bt=e=>{if(O(e))return e;if(e.match(lt)){let o=-1;for(let n=0;n<e.length;n++)if(e[n]==="_"&&e[n-1]!=="_"&&e[n+1]!=="_"&&e[n-1]!=="\\"&&!Re(e,n)){let a=n>0?e[n-1]:"",l=n<e.length-1?e[n+1]:"";if(a&&l&&/[\p{L}\p{N}_]/u.test(a)&&/[\p{L}\p{N}_]/u.test(l))continue;o=n;break}if(o===-1)return e;let s=e.substring(o+1);if(!s||/^[\s_~*`]*$/.test(s))return e;if(ft(e)%2===1){let n=e.match(/\n+$/);return n?`${e.slice(0,-n[0].length)}_${n[0]}`:`${e}_`}}return e},kt=(e,t)=>{let o=e.substring(t,t+3)==="```",s=t>0&&e.substring(t-1,t+2)==="```",r=t>1&&e.substring(t-2,t+1)==="```";return o||s||r},wt=e=>{let t=0;for(let o=0;o<e.length;o++)e[o]==="`"&&!kt(e,o)&&t++;return t},yt=e=>{if(e.match(/^```[^`\n]*```?$/)&&!e.includes(`
11
- `))return e.endsWith("``")&&!e.endsWith("```")?`${e}\``:e;let o=(e.match(/```/g)||[]).length,s=o%2===1;if(o>0&&o%2===0&&e.includes(`
12
- `)||(e.endsWith("```\n")||e.endsWith("```"))&&o%2===0)return e;let r=e.match(dt);if(r&&!s){let n=r[2];if(!n||/^[\s_~*`]*$/.test(n))return e;if(wt(e)%2===1)return`${e}\``}return e},vt=e=>{let t=e.match(ct);if(t){let o=t[2];if(!o||/^[\s_~*`]*$/.test(o))return e;if((e.match(/~~/g)||[]).length%2===1)return`${e}~~`}return e};var Mt=e=>{if((e.match(/\$\$/g)||[]).length%2===0)return e;let o=e.indexOf("$$");return o!==-1&&e.indexOf(`
1
+ "use strict";"use client";var wt=Object.create;var G=Object.defineProperty;var yt=Object.getOwnPropertyDescriptor;var kt=Object.getOwnPropertyNames;var vt=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var Ct=(e,t)=>{for(var o in t)G(e,o,{get:t[o],enumerable:!0})},fe=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of kt(t))!Tt.call(e,s)&&s!==o&&G(e,s,{get:()=>t[s],enumerable:!(n=yt(t,s))||n.enumerable});return e};var B=(e,t,o)=>(o=e!=null?wt(vt(e)):{},fe(t||!e||!e.__esModule?G(o,"default",{value:e,enumerable:!0}):o,e)),Mt=e=>fe(G({},"__esModule",{value:!0}),e);var fo={};Ct(fo,{Block:()=>ge,ControlsContext:()=>X,MermaidConfigContext:()=>ee,ShikiThemeContext:()=>Q,Streamdown:()=>ut,StreamdownRuntimeContext:()=>H,defaultRehypePlugins:()=>dt,defaultRemarkPlugins:()=>mt,defaultUrlTransform:()=>pt.defaultUrlTransform,parseIncompleteMarkdown:()=>ne,parseMarkdownIntoBlocks:()=>te});module.exports=Mt(fo);var M=require("react"),nt=B(require("react-markdown"),1),rt=require("rehype-harden"),re=B(require("rehype-katex"),1),st=B(require("rehype-raw"),1),it=B(require("remark-cjk-friendly"),1),at=B(require("remark-cjk-friendly-gfm-strikethrough"),1),lt=B(require("remark-gfm"),1),ct=B(require("remark-math"),1);var g=require("react");var q=require("lucide-react"),b=require("react"),W=require("shiki"),ke=require("shiki/engine/javascript");var be=require("clsx"),we=require("tailwind-merge"),p=(...e)=>(0,we.twMerge)((0,be.clsx)(e)),E=(e,t,o)=>{let n=typeof t=="string"?new Blob([t],{type:o}):t,s=URL.createObjectURL(n),r=document.createElement("a");r.href=s,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(s)};var P=require("react/jsx-runtime"),ae=(0,b.createContext)({code:""});function Pt(e,t=200,o=50){let[n,s]=(0,b.useState)(e),r=(0,b.useRef)(0),i=(0,b.useRef)(null);return(0,b.useEffect)(()=>{let a=Date.now(),l=a-r.current;return i.current&&window.clearTimeout(i.current),l>=t?(s(e),r.current=a):i.current=window.setTimeout(()=>{s(e),r.current=Date.now()},o),()=>{i.current&&window.clearTimeout(i.current)}},[e,t,o]),n}var Nt=e=>e<50?{minHighlightInterval:100,debounceMs:500}:e<150?{minHighlightInterval:500,debounceMs:800}:e<300?{minHighlightInterval:1500,debounceMs:1200}:{minHighlightInterval:Number.POSITIVE_INFINITY,debounceMs:1500},It=e=>e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"),St=e=>{let t=e.lastIndexOf(`
2
+ `),o=t>=0?e.slice(0,t+1):"",n=t>=0?e.slice(t+1):e;return[o,n]},Lt=e=>e?[{pre(o){return this.addClassToHast(o,e),o}}]:[],ie=class{constructor(){this.lightHighlighter=null;this.darkHighlighter=null;this.lightTheme=null;this.darkTheme=null;this.loadedLanguages=new Set;this.initializationPromise=null;this.loadLanguagePromise=null;this.cache=new Map;this.cacheKeys=[];this.MAX_CACHE_SIZE=50;this.highlightQueue=new Map}isLanguageSupported(t){return Object.hasOwn(W.bundledLanguages,t)}getFallbackLanguage(){return"text"}getCacheKey(t,o,n){return`${o}::${n||""}::${t}`}addToCache(t,o){if(this.cache.size>=this.MAX_CACHE_SIZE){let n=this.cacheKeys.shift();n&&this.cache.delete(n)}this.cache.set(t,o),this.cacheKeys.push(t)}needsHighlightersInitialization(t){let[o,n]=t,s=!this.lightHighlighter||this.lightTheme!==o,r=!this.darkHighlighter||this.darkTheme!==n;return[s,r]}async ensureHighlightersInitialized(t,o){let[n,s]=o,[r,i]=t,a=(0,ke.createJavaScriptRegexEngine)({forgiving:!0});this.loadedLanguages.clear(),this.cache.clear(),this.cacheKeys=[],this.highlightQueue.clear(),n&&(this.lightHighlighter=await(0,W.createHighlighter)({themes:[r],langs:[],engine:a}),this.lightTheme=r),s&&(this.darkHighlighter=await(0,W.createHighlighter)({themes:[i],langs:[],engine:a}),this.darkTheme=i)}async loadLanguage(t){var o,n;await((o=this.darkHighlighter)==null?void 0:o.loadLanguage(t)),await((n=this.lightHighlighter)==null?void 0:n.loadLanguage(t)),this.loadedLanguages.add(t)}async initializeHighlighters(t){this.initializationPromise&&await this.initializationPromise;let o=this.needsHighlightersInitialization(t),[n,s]=o;(n||s)&&(this.initializationPromise=this.ensureHighlightersInitialized(t,o),await this.initializationPromise,this.initializationPromise=null)}performHighlights(t,o,n){let s=this.isLanguageSupported(o)?o:this.getFallbackLanguage();if(this.lightHighlighter===null||this.darkHighlighter===null||this.lightTheme===null||this.darkTheme===null)throw new Error("highlightCode must be called after initializeHighlighters.");let r=Lt(n),i=this.lightHighlighter.codeToHtml(t,{lang:s,theme:this.lightTheme,transformers:r}),a=this.darkHighlighter.codeToHtml(t,{lang:s,theme:this.darkTheme,transformers:r});return[i,a]}async highlightCode(t,o,n,s){let r=this.getCacheKey(t,o,n),i=this.cache.get(r);if(i)return this.cacheKeys=this.cacheKeys.filter(d=>d!==r),this.cacheKeys.push(r),i;let a=this.highlightQueue.get(r);if(a)return a;let l=()=>{if(s!=null&&s.aborted)throw new DOMException("Aborted","AbortError")},c=(async()=>{try{await new Promise(w=>setTimeout(w,0)),l(),this.initializationPromise&&await this.initializationPromise,l(),this.loadLanguagePromise&&await this.loadLanguagePromise,l(),!this.loadedLanguages.has(o)&&this.isLanguageSupported(o)&&(this.loadLanguagePromise=this.loadLanguage(o),await this.loadLanguagePromise,this.loadLanguagePromise=null),l();let h=this.performHighlights(t,o,n);return this.addToCache(r,h),h}finally{this.highlightQueue.delete(r)}})();return this.highlightQueue.set(r,c),c}},se=new ie,ve=({code:e,language:t,className:o,children:n,preClassName:s,...r})=>{let[i,a]=(0,b.useState)(""),[l,c]=(0,b.useState)(""),[d,h]=(0,b.useState)(""),[w,f]=(0,b.useState)(""),u=Pt(e),T=(0,b.useRef)(0),k=(0,b.useRef)(!1),y=(0,b.useRef)(null),L=(0,b.useRef)(0),[z,J]=(0,b.useContext)(Q);(0,b.useEffect)(()=>{se.initializeHighlighters([z,J])},[z,J]),(0,b.useEffect)(()=>{k.current=!0,y.current&&y.current.abort(),y.current=new AbortController;let _=y.current.signal;T.current&&clearTimeout(T.current);let[K,U]=St(u),gt=u.split(`
3
+ `).length,{minHighlightInterval:ht,debounceMs:ft}=Nt(gt);if(K&&K!==d){let x=Date.now();x-L.current>ht||!U?(L.current=x,se.highlightCode(K,t,s,_).then(([V,bt])=>{k.current&&!_.aborted&&(0,b.startTransition)(()=>{a(V),c(bt),h(K),f(U)})}).catch(V=>{if(V.name!=="AbortError")throw V})):f(U)}else f(U);return T.current=window.setTimeout(()=>{U&&u!==d&&!_.aborted&&se.highlightCode(u,t,s,_).then(([x,he])=>{k.current&&!_.aborted&&(0,b.startTransition)(()=>{a(x),c(he),h(u),f("")})}).catch(x=>{if(x.name!=="AbortError")throw x})},ft),()=>{var x;k.current=!1,(x=y.current)==null||x.abort()}},[u,t,s]);let D=w?`<span class="line"><span>${It(w)}</span></span>`:"";return(0,P.jsx)(ae.Provider,{value:{code:e},children:(0,P.jsxs)("div",{className:"my-4 w-full overflow-hidden rounded-xl border border-border","data-code-block-container":!0,"data-language":t,children:[(0,P.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,P.jsx)("span",{className:"ml-1 font-mono lowercase",children:t}),(0,P.jsx)("div",{className:"flex items-center gap-2",children:n})]}),(0,P.jsx)("div",{className:"w-full",children:(0,P.jsxs)("div",{className:"min-w-full",children:[(0,P.jsx)("div",{className:p("overflow-x-auto dark:hidden",o),dangerouslySetInnerHTML:{__html:D?i+D:i},"data-code-block":!0,"data-language":t,...r}),(0,P.jsx)("div",{className:p("hidden overflow-x-auto dark:block",o),dangerouslySetInnerHTML:{__html:D?l+D:l},"data-code-block":!0,"data-language":t,...r})]})})]})})},ye={"1c":"1c","1c-query":"1cq",abap:"abap","actionscript-3":"as",ada:"ada",adoc:"adoc","angular-html":"html","angular-ts":"ts",apache:"conf",apex:"cls",apl:"apl",applescript:"applescript",ara:"ara",asciidoc:"adoc",asm:"asm",astro:"astro",awk:"awk",ballerina:"bal",bash:"sh",bat:"bat",batch:"bat",be:"be",beancount:"beancount",berry:"berry",bibtex:"bib",bicep:"bicep",blade:"blade.php",bsl:"bsl",c:"c","c#":"cs","c++":"cpp",cadence:"cdc",cairo:"cairo",cdc:"cdc",clarity:"clar",clj:"clj",clojure:"clj","closure-templates":"soy",cmake:"cmake",cmd:"cmd",cobol:"cob",codeowners:"CODEOWNERS",codeql:"ql",coffee:"coffee",coffeescript:"coffee","common-lisp":"lisp",console:"sh",coq:"v",cpp:"cpp",cql:"cql",crystal:"cr",cs:"cs",csharp:"cs",css:"css",csv:"csv",cue:"cue",cypher:"cql",d:"d",dart:"dart",dax:"dax",desktop:"desktop",diff:"diff",docker:"dockerfile",dockerfile:"dockerfile",dotenv:"env","dream-maker":"dm",edge:"edge",elisp:"el",elixir:"ex",elm:"elm","emacs-lisp":"el",erb:"erb",erl:"erl",erlang:"erl",f:"f","f#":"fs",f03:"f03",f08:"f08",f18:"f18",f77:"f77",f90:"f90",f95:"f95",fennel:"fnl",fish:"fish",fluent:"ftl",for:"for","fortran-fixed-form":"f","fortran-free-form":"f90",fs:"fs",fsharp:"fs",fsl:"fsl",ftl:"ftl",gdresource:"tres",gdscript:"gd",gdshader:"gdshader",genie:"gs",gherkin:"feature","git-commit":"gitcommit","git-rebase":"gitrebase",gjs:"js",gleam:"gleam","glimmer-js":"js","glimmer-ts":"ts",glsl:"glsl",gnuplot:"plt",go:"go",gql:"gql",graphql:"graphql",groovy:"groovy",gts:"gts",hack:"hack",haml:"haml",handlebars:"hbs",haskell:"hs",haxe:"hx",hbs:"hbs",hcl:"hcl",hjson:"hjson",hlsl:"hlsl",hs:"hs",html:"html","html-derivative":"html",http:"http",hxml:"hxml",hy:"hy",imba:"imba",ini:"ini",jade:"jade",java:"java",javascript:"js",jinja:"jinja",jison:"jison",jl:"jl",js:"js",json:"json",json5:"json5",jsonc:"jsonc",jsonl:"jsonl",jsonnet:"jsonnet",jssm:"jssm",jsx:"jsx",julia:"jl",kotlin:"kt",kql:"kql",kt:"kt",kts:"kts",kusto:"kql",latex:"tex",lean:"lean",lean4:"lean",less:"less",liquid:"liquid",lisp:"lisp",lit:"lit",llvm:"ll",log:"log",logo:"logo",lua:"lua",luau:"luau",make:"mak",makefile:"mak",markdown:"md",marko:"marko",matlab:"m",md:"md",mdc:"mdc",mdx:"mdx",mediawiki:"wiki",mermaid:"mmd",mips:"s",mipsasm:"s",mmd:"mmd",mojo:"mojo",move:"move",nar:"nar",narrat:"narrat",nextflow:"nf",nf:"nf",nginx:"conf",nim:"nim",nix:"nix",nu:"nu",nushell:"nu",objc:"m","objective-c":"m","objective-cpp":"mm",ocaml:"ml",pascal:"pas",perl:"pl",perl6:"p6",php:"php",plsql:"pls",po:"po",polar:"polar",postcss:"pcss",pot:"pot",potx:"potx",powerquery:"pq",powershell:"ps1",prisma:"prisma",prolog:"pl",properties:"properties",proto:"proto",protobuf:"proto",ps:"ps",ps1:"ps1",pug:"pug",puppet:"pp",purescript:"purs",py:"py",python:"py",ql:"ql",qml:"qml",qmldir:"qmldir",qss:"qss",r:"r",racket:"rkt",raku:"raku",razor:"cshtml",rb:"rb",reg:"reg",regex:"regex",regexp:"regexp",rel:"rel",riscv:"s",rs:"rs",rst:"rst",ruby:"rb",rust:"rs",sas:"sas",sass:"sass",scala:"scala",scheme:"scm",scss:"scss",sdbl:"sdbl",sh:"sh",shader:"shader",shaderlab:"shader",shell:"sh",shellscript:"sh",shellsession:"sh",smalltalk:"st",solidity:"sol",soy:"soy",sparql:"rq",spl:"spl",splunk:"spl",sql:"sql","ssh-config":"config",stata:"do",styl:"styl",stylus:"styl",svelte:"svelte",swift:"swift","system-verilog":"sv",systemd:"service",talon:"talon",talonscript:"talon",tasl:"tasl",tcl:"tcl",templ:"templ",terraform:"tf",tex:"tex",tf:"tf",tfvars:"tfvars",toml:"toml",ts:"ts","ts-tags":"ts",tsp:"tsp",tsv:"tsv",tsx:"tsx",turtle:"ttl",twig:"twig",typ:"typ",typescript:"ts",typespec:"tsp",typst:"typ",v:"v",vala:"vala",vb:"vb",verilog:"v",vhdl:"vhdl",vim:"vim",viml:"vim",vimscript:"vim",vue:"vue","vue-html":"html","vue-vine":"vine",vy:"vy",vyper:"vy",wasm:"wasm",wenyan:"wy",wgsl:"wgsl",wiki:"wiki",wikitext:"wiki",wit:"wit",wl:"wl",wolfram:"wl",xml:"xml",xsl:"xsl",yaml:"yaml",yml:"yml",zenscript:"zs",zig:"zig",zsh:"zsh",\u6587\u8A00:"wy"},le=({onDownload:e,onError:t,language:o,children:n,className:s,code:r,...i})=>{let{code:a}=(0,b.useContext)(ae),{isAnimating:l}=(0,b.useContext)(H),c=r!=null?r:a,h=`file.${o&&o in ye?ye[o]:"txt"}`,w="text/plain",f=()=>{try{E(h,c,w),e==null||e()}catch(u){t==null||t(u)}};return(0,P.jsx)("button",{className:p("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",s),disabled:l,onClick:f,title:"Download file",type:"button",...i,children:n!=null?n:(0,P.jsx)(q.DownloadIcon,{size:14})})},ce=({onCopy:e,onError:t,timeout:o=2e3,children:n,className:s,code:r,...i})=>{let[a,l]=(0,b.useState)(!1),c=(0,b.useRef)(0),{code:d}=(0,b.useContext)(ae),{isAnimating:h}=(0,b.useContext)(H),w=r!=null?r:d,f=async()=>{var T;if(typeof window=="undefined"||!((T=navigator==null?void 0:navigator.clipboard)!=null&&T.writeText)){t==null||t(new Error("Clipboard API not available"));return}try{a||(await navigator.clipboard.writeText(w),l(!0),e==null||e(),c.current=window.setTimeout(()=>l(!1),o))}catch(k){t==null||t(k)}};(0,b.useEffect)(()=>()=>{window.clearTimeout(c.current)},[]);let u=a?q.CheckIcon:q.CopyIcon;return(0,P.jsx)("button",{className:p("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",s),disabled:h,onClick:f,type:"button",...i,children:n!=null?n:(0,P.jsx)(u,{size:14})})};var Te=require("lucide-react");var j=require("react/jsx-runtime"),xt=/\.[^/.]+$/,Ce=({node:e,className:t,src:o,alt:n,...s})=>{let r=async()=>{if(o)try{let a=await(await fetch(o)).blob(),c=new URL(o,window.location.origin).pathname.split("/").pop()||"",d=c.split(".").pop(),h=c.includes(".")&&d!==void 0&&d.length<=4,w="";if(h)w=c;else{let f=a.type,u="png";f.includes("jpeg")||f.includes("jpg")?u="jpg":f.includes("png")?u="png":f.includes("svg")?u="svg":f.includes("gif")?u="gif":f.includes("webp")&&(u="webp"),w=`${(n||c||"image").replace(xt,"")}.${u}`}E(w,a,a.type)}catch(i){console.error("Failed to download image:",i)}};return o?(0,j.jsxs)("div",{className:"group relative my-4 inline-block","data-streamdown":"image-wrapper",children:[(0,j.jsx)("img",{alt:n,className:p("max-w-full rounded-lg",t),"data-streamdown":"image",src:o,...s}),(0,j.jsx)("div",{className:"pointer-events-none absolute inset-0 hidden rounded-lg bg-black/10 group-hover:block"}),(0,j.jsx)("button",{className:p("absolute right-2 bottom-2 flex h-8 w-8 cursor-pointer items-center justify-center rounded-md border border-border bg-background/90 shadow-sm backdrop-blur-sm transition-all duration-200 hover:bg-background","opacity-0 group-hover:opacity-100"),onClick:r,title:"Download image",type:"button",children:(0,j.jsx)(Te.DownloadIcon,{size:14})})]}):null};var Z=require("lucide-react"),S=require("react");var v=require("react/jsx-runtime"),F=0,Ht=()=>{F+=1,F===1&&(document.body.style.overflow="hidden")},Bt=()=>{F=Math.max(0,F-1),F===0&&(document.body.style.overflow="")},At=async e=>{let o={...{startOnLoad:!1,theme:"default",securityLevel:"strict",fontFamily:"monospace",suppressErrorRendering:!0},...e},s=(await import("mermaid")).default;return s.initialize(o),s},Me=({chart:e,config:t,onFullscreen:o,onExit:n,className:s,...r})=>{let[i,a]=(0,S.useState)(!1),{isAnimating:l}=(0,S.useContext)(H),c=()=>{a(!i)};return(0,S.useEffect)(()=>{if(i){Ht();let d=h=>{h.key==="Escape"&&a(!1)};return document.addEventListener("keydown",d),()=>{document.removeEventListener("keydown",d),Bt()}}},[i]),(0,S.useEffect)(()=>{i?o==null||o():n&&n()},[i,o,n]),(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)("button",{className:p("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",s),disabled:l,onClick:c,title:"View fullscreen",type:"button",...r,children:(0,v.jsx)(Z.Maximize2Icon,{size:14})}),i&&(0,v.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-background/95 backdrop-blur-sm",onClick:c,onKeyDown:d=>{d.key==="Escape"&&c()},role:"button",tabIndex:0,children:[(0,v.jsx)("button",{className:"absolute top-4 right-4 z-10 rounded-md p-2 text-muted-foreground transition-all hover:bg-muted hover:text-foreground",onClick:c,title:"Exit fullscreen",type:"button",children:(0,v.jsx)(Z.XIcon,{size:20})}),(0,v.jsx)("div",{className:"flex h-full w-full items-center justify-center p-12",onClick:d=>d.stopPropagation(),onKeyDown:d=>d.stopPropagation(),role:"presentation",children:(0,v.jsx)("div",{className:"max-h-full max-w-full",children:(0,v.jsx)(de,{chart:e,className:"[&>div]:my-0 [&_svg]:h-auto [&_svg]:min-h-[60vh] [&_svg]:w-auto [&_svg]:min-w-[60vw]",config:t})})})]})]})},de=({chart:e,className:t,config:o})=>{let[n,s]=(0,S.useState)(null),[r,i]=(0,S.useState)(!0),[a,l]=(0,S.useState)(""),[c,d]=(0,S.useState)("");if((0,S.useEffect)(()=>{(async()=>{try{s(null),i(!0);let f=await At(o),u=e.split("").reduce((y,L)=>(y<<5)-y+L.charCodeAt(0)|0,0),T=`mermaid-${Math.abs(u)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:k}=await f.render(T,e);l(k),d(k)}catch(f){if(!(c||a)){let u=f instanceof Error?f.message:"Failed to render Mermaid chart";s(u)}}finally{i(!1)}})()},[e,o]),r&&!a&&!c)return(0,v.jsx)("div",{className:p("my-4 flex justify-center p-4",t),children:(0,v.jsxs)("div",{className:"flex items-center space-x-2 text-muted-foreground",children:[(0,v.jsx)("div",{className:"h-4 w-4 animate-spin rounded-full border-current border-b-2"}),(0,v.jsx)("span",{className:"text-sm",children:"Loading diagram..."})]})});if(n&&!a&&!c)return(0,v.jsxs)("div",{className:p("rounded-lg border border-red-200 bg-red-50 p-4",t),children:[(0,v.jsxs)("p",{className:"font-mono text-red-700 text-sm",children:["Mermaid Error: ",n]}),(0,v.jsxs)("details",{className:"mt-2",children:[(0,v.jsx)("summary",{className:"cursor-pointer text-red-600 text-xs",children:"Show Code"}),(0,v.jsx)("pre",{className:"mt-2 overflow-x-auto rounded bg-red-100 p-2 text-red-800 text-xs",children:e})]})]});let h=a||c;return(0,v.jsx)("div",{"aria-label":"Mermaid chart",className:p("my-4 flex justify-center",t),dangerouslySetInnerHTML:{__html:h},role:"img"})};var O=require("lucide-react"),I=require("react");var N=require("react/jsx-runtime");function Pe(e){var r,i;let t=[],o=[],n=e.querySelectorAll("thead th");for(let a of n)t.push(((r=a.textContent)==null?void 0:r.trim())||"");let s=e.querySelectorAll("tbody tr");for(let a of s){let l=[],c=a.querySelectorAll("td");for(let d of c)l.push(((i=d.textContent)==null?void 0:i.trim())||"");o.push(l)}return{headers:t,rows:o}}function Ne(e){let{headers:t,rows:o}=e,n=r=>r.includes(",")||r.includes('"')||r.includes(`
4
+ `)?`"${r.replace(/"/g,'""')}"`:r,s=[];t.length>0&&s.push(t.map(n).join(","));for(let r of o)s.push(r.map(n).join(","));return s.join(`
5
+ `)}function $t(e){let{headers:t,rows:o}=e,n=r=>r.replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r"),s=[];t.length>0&&s.push(t.map(n).join(" "));for(let r of o)s.push(r.map(n).join(" "));return s.join(`
6
+ `)}function jt(e){let{headers:t,rows:o}=e;if(t.length===0)return"";let n=[],s=t.map(r=>r.replace(/\|/g,"\\|"));n.push(`| ${s.join(" | ")} |`),n.push(`| ${t.map(()=>"---").join(" | ")} |`);for(let r of o){let i=[...r];for(;i.length<t.length;)i.push("");let a=i.map(l=>l.replace(/\|/g,"\\|"));n.push(`| ${a.join(" | ")} |`)}return n.join(`
7
+ `)}var Ie=({children:e,className:t,onCopy:o,onError:n,timeout:s=2e3})=>{let[r,i]=(0,I.useState)(!1),[a,l]=(0,I.useState)(!1),c=(0,I.useRef)(null),d=(0,I.useRef)(0),{isAnimating:h}=(0,I.useContext)(H),w=async u=>{var T,k;if(typeof window=="undefined"||!((T=navigator==null?void 0:navigator.clipboard)!=null&&T.write)){n==null||n(new Error("Clipboard API not available"));return}try{let y=(k=c.current)==null?void 0:k.closest('[data-streamdown="table-wrapper"]'),L=y==null?void 0:y.querySelector("table");if(!L){n==null||n(new Error("Table not found"));return}let z=Pe(L),J=u==="csv"?Ne(z):$t(z),D=new ClipboardItem({"text/plain":new Blob([J],{type:"text/plain"}),"text/html":new Blob([L.outerHTML],{type:"text/html"})});await navigator.clipboard.write([D]),l(!0),i(!1),o==null||o(u),d.current=window.setTimeout(()=>l(!1),s)}catch(y){n==null||n(y)}};(0,I.useEffect)(()=>{let u=T=>{c.current&&!c.current.contains(T.target)&&i(!1)};return document.addEventListener("mousedown",u),()=>{document.removeEventListener("mousedown",u),window.clearTimeout(d.current)}},[]);let f=a?O.CheckIcon:O.CopyIcon;return(0,N.jsxs)("div",{className:"relative",ref:c,children:[(0,N.jsx)("button",{className:p("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:h,onClick:()=>i(!r),title:"Copy table",type:"button",children:e!=null?e:(0,N.jsx)(f,{size:14})}),r&&(0,N.jsxs)("div",{className:"absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg",children:[(0,N.jsx)("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>w("csv"),type:"button",children:"CSV"}),(0,N.jsx)("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>w("tsv"),type:"button",children:"TSV"})]})]})};var Se=({children:e,className:t,onDownload:o,onError:n})=>{let[s,r]=(0,I.useState)(!1),i=(0,I.useRef)(null),{isAnimating:a}=(0,I.useContext)(H),l=c=>{var d;try{let h=(d=i.current)==null?void 0:d.closest('[data-streamdown="table-wrapper"]'),w=h==null?void 0:h.querySelector("table");if(!w){n==null||n(new Error("Table not found"));return}let f=Pe(w),u=c==="csv"?Ne(f):jt(f);E(`table.${c==="csv"?"csv":"md"}`,u,c==="csv"?"text/csv":"text/markdown"),r(!1),o==null||o(c)}catch(h){n==null||n(h)}};return(0,I.useEffect)(()=>{let c=d=>{i.current&&!i.current.contains(d.target)&&r(!1)};return document.addEventListener("mousedown",c),()=>{document.removeEventListener("mousedown",c)}},[]),(0,N.jsxs)("div",{className:"relative",ref:i,children:[(0,N.jsx)("button",{className:p("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:a,onClick:()=>r(!s),title:"Download table",type:"button",children:e!=null?e:(0,N.jsx)(O.DownloadIcon,{size:14})}),s&&(0,N.jsxs)("div",{className:"absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg",children:[(0,N.jsx)("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>l("csv"),type:"button",children:"CSV"}),(0,N.jsx)("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>l("markdown"),type:"button",children:"Markdown"})]})]})};var m=require("react/jsx-runtime"),Rt=/language-([^\s]+)/;function Y(e,t){if(!(e!=null&&e.position||t!=null&&t.position))return!0;if(!(e!=null&&e.position&&(t!=null&&t.position)))return!1;let o=e.position.start,n=t.position.start,s=e.position.end,r=t.position.end;return(o==null?void 0:o.line)===(n==null?void 0:n.line)&&(o==null?void 0:o.column)===(n==null?void 0:n.column)&&(s==null?void 0:s.line)===(r==null?void 0:r.line)&&(s==null?void 0:s.column)===(r==null?void 0:r.column)}function C(e,t){return e.className===t.className&&Y(e.node,t.node)}var ue=(e,t)=>typeof e=="boolean"?e:e[t]!==!1,me=(e,t)=>{if(typeof e=="boolean")return e;let o=e.mermaid;return o===!1?!1:o===!0||o===void 0?!0:o[t]!==!1},pe=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("ol",{className:p("ml-4 list-outside list-decimal whitespace-normal",t),"data-streamdown":"ordered-list",...n,children:e}),(e,t)=>C(e,t));pe.displayName="MarkdownOl";var Le=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("li",{className:p("py-1",t),"data-streamdown":"list-item",...n,children:e}),(e,t)=>e.className===t.className&&Y(e.node,t.node));Le.displayName="MarkdownLi";var xe=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("ul",{className:p("ml-4 list-outside list-disc whitespace-normal",t),"data-streamdown":"unordered-list",...n,children:e}),(e,t)=>C(e,t));xe.displayName="MarkdownUl";var He=(0,g.memo)(({className:e,node:t,...o})=>(0,m.jsx)("hr",{className:p("my-6 border-border",e),"data-streamdown":"horizontal-rule",...o}),(e,t)=>C(e,t));He.displayName="MarkdownHr";var Be=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("span",{className:p("font-semibold",t),"data-streamdown":"strong",...n,children:e}),(e,t)=>C(e,t));Be.displayName="MarkdownStrong";var Ae=(0,g.memo)(({children:e,className:t,href:o,node:n,...s})=>{let r=o==="streamdown:incomplete-link";return(0,m.jsx)("a",{className:p("wrap-anywhere font-medium text-primary underline",t),"data-incomplete":r,"data-streamdown":"link",href:o,rel:"noreferrer",target:"_blank",...s,children:e})},(e,t)=>C(e,t)&&e.href===t.href);Ae.displayName="MarkdownA";var $e=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("h1",{className:p("mt-6 mb-2 font-semibold text-3xl",t),"data-streamdown":"heading-1",...n,children:e}),(e,t)=>C(e,t));$e.displayName="MarkdownH1";var je=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("h2",{className:p("mt-6 mb-2 font-semibold text-2xl",t),"data-streamdown":"heading-2",...n,children:e}),(e,t)=>C(e,t));je.displayName="MarkdownH2";var Re=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("h3",{className:p("mt-6 mb-2 font-semibold text-xl",t),"data-streamdown":"heading-3",...n,children:e}),(e,t)=>C(e,t));Re.displayName="MarkdownH3";var De=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("h4",{className:p("mt-6 mb-2 font-semibold text-lg",t),"data-streamdown":"heading-4",...n,children:e}),(e,t)=>C(e,t));De.displayName="MarkdownH4";var Ee=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("h5",{className:p("mt-6 mb-2 font-semibold text-base",t),"data-streamdown":"heading-5",...n,children:e}),(e,t)=>C(e,t));Ee.displayName="MarkdownH5";var qe=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("h6",{className:p("mt-6 mb-2 font-semibold text-sm",t),"data-streamdown":"heading-6",...n,children:e}),(e,t)=>C(e,t));qe.displayName="MarkdownH6";var Oe=(0,g.memo)(({children:e,className:t,node:o,...n})=>{let s=(0,g.useContext)(X),r=ue(s,"table");return(0,m.jsxs)("div",{className:"my-4 flex flex-col space-y-2","data-streamdown":"table-wrapper",children:[r&&(0,m.jsxs)("div",{className:"flex items-center justify-end gap-1",children:[(0,m.jsx)(Ie,{}),(0,m.jsx)(Se,{})]}),(0,m.jsx)("div",{className:"overflow-x-auto",children:(0,m.jsx)("table",{className:p("w-full border-collapse border border-border",t),"data-streamdown":"table",...n,children:e})})]})},(e,t)=>C(e,t));Oe.displayName="MarkdownTable";var ze=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("thead",{className:p("bg-muted/80",t),"data-streamdown":"table-header",...n,children:e}),(e,t)=>C(e,t));ze.displayName="MarkdownThead";var _e=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("tbody",{className:p("divide-y divide-border bg-muted/40",t),"data-streamdown":"table-body",...n,children:e}),(e,t)=>C(e,t));_e.displayName="MarkdownTbody";var Ue=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("tr",{className:p("border-border border-b",t),"data-streamdown":"table-row",...n,children:e}),(e,t)=>C(e,t));Ue.displayName="MarkdownTr";var We=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("th",{className:p("whitespace-nowrap px-4 py-2 text-left font-semibold text-sm",t),"data-streamdown":"table-header-cell",...n,children:e}),(e,t)=>C(e,t));We.displayName="MarkdownTh";var Fe=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("td",{className:p("px-4 py-2 text-sm",t),"data-streamdown":"table-cell",...n,children:e}),(e,t)=>C(e,t));Fe.displayName="MarkdownTd";var Xe=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("blockquote",{className:p("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",t),"data-streamdown":"blockquote",...n,children:e}),(e,t)=>C(e,t));Xe.displayName="MarkdownBlockquote";var Je=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("sup",{className:p("text-sm",t),"data-streamdown":"superscript",...n,children:e}),(e,t)=>C(e,t));Je.displayName="MarkdownSup";var Ke=(0,g.memo)(({children:e,className:t,node:o,...n})=>(0,m.jsx)("sub",{className:p("text-sm",t),"data-streamdown":"subscript",...n,children:e}),(e,t)=>C(e,t));Ke.displayName="MarkdownSub";var Ve=(0,g.memo)(({children:e,className:t,node:o,...n})=>{if("data-footnotes"in n){let r=l=>{var w,f;if(!(0,g.isValidElement)(l))return!1;let c=Array.isArray(l.props.children)?l.props.children:[l.props.children],d=!1,h=!1;for(let u of c)if(u){if(typeof u=="string")u.trim()!==""&&(d=!0);else if((0,g.isValidElement)(u))if(((w=u.props)==null?void 0:w["data-footnote-backref"])!==void 0)h=!0;else{let T=Array.isArray(u.props.children)?u.props.children:[u.props.children];for(let k of T){if(typeof k=="string"&&k.trim()!==""){d=!0;break}if((0,g.isValidElement)(k)&&((f=k.props)==null?void 0:f["data-footnote-backref"])===void 0){d=!0;break}}}}return h&&!d},i=Array.isArray(e)?e.map(l=>{if(!(0,g.isValidElement)(l))return l;if(l.type===pe){let d=(Array.isArray(l.props.children)?l.props.children:[l.props.children]).filter(h=>!r(h));return d.length===0?null:{...l,props:{...l.props,children:d}}}return l}):e;return(Array.isArray(i)?i.some(l=>l!==null):i!==null)?(0,m.jsx)("section",{className:t,...n,children:i}):null}return(0,m.jsx)("section",{className:t,...n,children:e})},(e,t)=>C(e,t));Ve.displayName="MarkdownSection";var Dt=({node:e,className:t,children:o,...n})=>{var h,w,f;let s=((h=e==null?void 0:e.position)==null?void 0:h.start.line)===((w=e==null?void 0:e.position)==null?void 0:w.end.line),r=(0,g.useContext)(ee),i=(0,g.useContext)(X);if(s)return(0,m.jsx)("code",{className:p("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...n,children:o});let a=t==null?void 0:t.match(Rt),l=(f=a==null?void 0:a.at(1))!=null?f:"",c="";if((0,g.isValidElement)(o)&&o.props&&typeof o.props=="object"&&"children"in o.props&&typeof o.props.children=="string"?c=o.props.children:typeof o=="string"&&(c=o),l==="mermaid"){let u=ue(i,"mermaid"),T=me(i,"download"),k=me(i,"copy"),y=me(i,"fullscreen");return(0,m.jsxs)("div",{className:p("group relative my-4 h-auto rounded-xl border p-4",t),"data-streamdown":"mermaid-block",children:[u&&(T||k||y)&&(0,m.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[T&&(0,m.jsx)(le,{code:c,language:l}),k&&(0,m.jsx)(ce,{code:c}),y&&(0,m.jsx)(Me,{chart:c,config:r})]}),(0,m.jsx)(de,{chart:c,config:r})]})}let d=ue(i,"code");return(0,m.jsx)(ve,{className:p("overflow-x-auto border-border border-t",t),code:c,"data-language":l,"data-streamdown":"code-block",language:l,preClassName:"overflow-x-auto font-mono text-xs p-4 bg-muted/40",children:d&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(le,{code:c,language:l}),(0,m.jsx)(ce,{})]})})},Ge=(0,g.memo)(Dt,(e,t)=>e.className===t.className&&Y(e.node,t.node));Ge.displayName="MarkdownCode";var Qe=(0,g.memo)(Ce,(e,t)=>e.className===t.className&&Y(e.node,t.node));Qe.displayName="MarkdownImg";var Ze=(0,g.memo)(({children:e,className:t,node:o,...n})=>{var i;let r=(Array.isArray(e)?e:[e]).filter(a=>a!=null&&a!=="");return r.length===1&&(0,g.isValidElement)(r[0])&&((i=r[0].props.node)==null?void 0:i.tagName)==="img"?(0,m.jsx)(m.Fragment,{children:e}):(0,m.jsx)("p",{className:t,...n,children:e})},(e,t)=>C(e,t));Ze.displayName="MarkdownParagraph";var Ye={ol:pe,li:Le,ul:xe,hr:He,strong:Be,a:Ae,h1:$e,h2:je,h3:Re,h4:De,h5:Ee,h6:qe,table:Oe,thead:ze,tbody:_e,tr:Ue,th:We,td:Fe,blockquote:Xe,code:Ge,img:Qe,pre:({children:e})=>e,sup:Je,sub:Ke,p:Ze,section:Ve};var et=require("marked"),Et=/\[\^[^\]\s]{1,200}\](?!:)/,qt=/\[\^[^\]\s]{1,200}\]:/,Ot=/<\/(\w+)>/,zt=/<(\w+)[\s>]/,te=e=>{let t=Et.test(e),o=qt.test(e);if(t||o)return[e];let n=et.Lexer.lex(e,{gfm:!0}),s=[],r=[];for(let i of n){let a=i.raw;if(r.length>0){if(s[s.length-1]+=a,i.type==="html"){let l=a.match(Ot);if(l){let c=l[1];r.at(-1)===c&&r.pop()}}continue}if(i.type==="html"&&i.block){let l=a.match(zt);if(l){let c=l[1];a.includes(`</${c}>`)||r.push(c)}}if(a.trim()==="$$"&&s.length>0){let l=s.at(-1);if(!l){s.push(a);continue}let c=l.trimStart().startsWith("$$"),d=(l.match(/\$\$/g)||[]).length;if(c&&d%2===1){s[s.length-1]=l+a;continue}}if(s.length>0&&a.trimEnd().endsWith("$$")){let l=s.at(-1);if(!l){s.push(a);continue}let c=l.trimStart().startsWith("$$"),d=(l.match(/\$\$/g)||[]).length,h=(a.match(/\$\$/g)||[]).length;if(c&&d%2===1&&!a.trimStart().startsWith("$$")&&h===1){s[s.length-1]=l+a;continue}}s.push(a)}return s};var _t=/(!?\[)([^\]]*?)$/,Ut=/(\*\*)([^*]*?)$/,Wt=/(__)([^_]*?)$/,Ft=/(\*\*\*)([^*]*?)$/,Xt=/(\*)([^*]*?)$/,Jt=/(_)([^_]*?)$/,Kt=/(`)([^`]*?)$/,Vt=/(~~)([^~]*?)$/,Gt=/(!?)\[([^\]]+)\]\(([^)]+)$/,R=/^[\s_~*`]*$/,tt=/^[\s]*[-*+][\s]+$/,A=/[\p{L}\p{N}_]/u,Qt=/\n+$/,Zt=/^```[^`\n]*```?$/,Yt=/^\*{4,}$/,oe=e=>{let t=(e.match(/```/g)||[]).length;return t>0&&t%2===0&&e.includes(`
8
+ `)},eo=e=>{let t=e.match(Gt);if(t){let n=t[1]==="!",s=t[2],r=t[3],i=e.lastIndexOf(`${n?"!":""}[${s}](${r}`),a=e.substring(0,i);return n?a:`${a}[${s}](streamdown:incomplete-link)`}let o=e.match(_t);if(o){if(o[1].startsWith("!")){let s=e.lastIndexOf(o[1]);return e.substring(0,s)}return`${e}](streamdown:incomplete-link)`}return e},to=e=>{if(oe(e))return e;let t=e.match(Ut);if(t){let o=t[2];if(!o||R.test(o))return e;let n=e.lastIndexOf(t[1]),r=e.substring(0,n).lastIndexOf(`
9
+ `),i=r===-1?0:r+1,a=e.substring(i,n);if(tt.test(a)&&o.includes(`
10
+ `))return e;if((e.match(/\*\*/g)||[]).length%2===1)return`${e}**`}return e},oo=e=>{let t=e.match(Wt);if(t){let o=t[2];if(!o||R.test(o))return e;let n=e.lastIndexOf(t[1]),r=e.substring(0,n).lastIndexOf(`
11
+ `),i=r===-1?0:r+1,a=e.substring(i,n);if(tt.test(a)&&o.includes(`
12
+ `))return e;if((e.match(/__/g)||[]).length%2===1)return`${e}__`}return e},no=e=>e.split("").reduce((t,o,n)=>{if(o==="*"){let s=e[n-1],r=e[n+1];if(s==="\\"||s&&r&&A.test(s)&&A.test(r))return t;let i=n;for(let l=n-1;l>=0;l--){if(e[l]===`
13
+ `){i=l+1;break}if(l===0){i=0;break}}if(e.substring(i,n).trim()===""&&(r===" "||r===" "))return t;if(s!=="*"&&r!=="*")return t+1}return t},0),ro=e=>{if(oe(e))return e;if(e.match(Xt)){let o=-1;for(let r=0;r<e.length;r++)if(e[r]==="*"&&e[r-1]!=="*"&&e[r+1]!=="*"&&e[r-1]!=="\\"){let i=r>0?e[r-1]:"",a=r<e.length-1?e[r+1]:"";if(i&&a&&A.test(i)&&A.test(a))continue;o=r;break}if(o===-1)return e;let n=e.substring(o+1);if(!n||R.test(n))return e;if(no(e)%2===1)return`${e}*`}return e},ot=(e,t)=>{let o=!1,n=!1;for(let s=0;s<e.length&&s<t;s+=1){if(e[s]==="\\"&&e[s+1]==="$"){s+=1;continue}e[s]==="$"&&(e[s+1]==="$"?(n=!n,s+=1,o=!1):n||(o=!o))}return o||n},so=e=>e.split("").reduce((t,o,n)=>{if(o==="_"){let s=e[n-1],r=e[n+1];if(s==="\\"||ot(e,n)||s&&r&&A.test(s)&&A.test(r))return t;if(s!=="_"&&r!=="_")return t+1}return t},0),io=e=>{if(oe(e))return e;if(e.match(Jt)){let o=-1;for(let r=0;r<e.length;r++)if(e[r]==="_"&&e[r-1]!=="_"&&e[r+1]!=="_"&&e[r-1]!=="\\"&&!ot(e,r)){let i=r>0?e[r-1]:"",a=r<e.length-1?e[r+1]:"";if(i&&a&&A.test(i)&&A.test(a))continue;o=r;break}if(o===-1)return e;let n=e.substring(o+1);if(!n||R.test(n))return e;if(so(e)%2===1){let r=e.match(Qt);return r?`${e.slice(0,-r[0].length)}_${r[0]}`:`${e}_`}}return e},ao=(e,t)=>{let o=e.substring(t,t+3)==="```",n=t>0&&e.substring(t-1,t+2)==="```",s=t>1&&e.substring(t-2,t+1)==="```";return o||n||s},lo=e=>{let t=0;for(let o=0;o<e.length;o+=1)e[o]==="`"&&!ao(e,o)&&(t+=1);return t},co=e=>{if(e.match(Zt)&&!e.includes(`
14
+ `))return e.endsWith("``")&&!e.endsWith("```")?`${e}\``:e;let o=(e.match(/```/g)||[]).length,n=o%2===1;if(o>0&&o%2===0&&e.includes(`
15
+ `)||(e.endsWith("```\n")||e.endsWith("```"))&&o%2===0)return e;let s=e.match(Kt);if(s&&!n){let r=s[2];if(!r||R.test(r))return e;if(lo(e)%2===1)return`${e}\``}return e},mo=e=>{let t=e.match(Vt);if(t){let o=t[2];if(!o||R.test(o))return e;if((e.match(/~~/g)||[]).length%2===1)return`${e}~~`}return e};var uo=e=>{if((e.match(/\$\$/g)||[]).length%2===0)return e;let o=e.indexOf("$$");return o!==-1&&e.indexOf(`
13
16
  `,o)!==-1&&!e.endsWith(`
14
17
  `)?`${e}
15
- $$`:`${e}$$`},Tt=e=>{let t=0,o=e.match(/\*+/g)||[];for(let s of o){let r=s.length;r>=3&&(t+=Math.floor(r/3))}return t},Ct=e=>{if(O(e)||/^\*{4,}$/.test(e))return e;let t=e.match(at);if(t){let o=t[2];if(!o||/^[\s_~*`]*$/.test(o))return e;if(Tt(e)%2===1)return`${e}***`}return e},Ae=e=>{if(!e||typeof e!="string")return e;let t=e,o=mt(t);return o.endsWith("](streamdown:incomplete-link)")?o:(t=o,t=Ct(t),t=pt(t),t=ut(t),t=ht(t),t=bt(t),t=yt(t),t=vt(t),t=Mt(t),t)};var S=require("react/jsx-runtime"),Nt=F.default.default||F.default,Pt=Nt(qe.default),D=(0,v.createContext)(["github-light","github-dark"]),_=(0,v.createContext)(void 0),A=(0,v.createContext)(!0),It={singleDollarTextMath:!1},Bt={},We=(0,v.memo)(({content:e,shouldParseIncompleteMarkdown:t,...o})=>{let s=(0,v.useMemo)(()=>typeof e=="string"&&t?Ae(e.trim()):e,[e,t]);return(0,S.jsx)(Pt,{...o,children:s})},(e,t)=>e.content===t.content);We.displayName="Block";var Ue=(0,v.memo)(({children:e,allowedImagePrefixes:t=["*"],allowedLinkPrefixes:o=["*"],defaultOrigin:s,parseIncompleteMarkdown:r=!0,components:n,rehypePlugins:a,remarkPlugins:l,className:i,shikiTheme:m=["github-light","github-dark"],mermaidConfig:p,controls:f=!0,...h})=>{let u=(0,v.useId)(),b=(0,v.useMemo)(()=>je(typeof e=="string"?e:""),[e]),T=(0,v.useMemo)(()=>()=>(0,De.default)({errorColor:"var(--color-muted-foreground)"}),[]);return(0,S.jsx)(D.Provider,{value:m,children:(0,S.jsx)(_.Provider,{value:p,children:(0,S.jsx)(A.Provider,{value:f,children:(0,S.jsx)("div",{className:d("space-y-4",i),...h,children:b.map((P,$)=>(0,S.jsx)(We,{allowedImagePrefixes:t,allowedLinkPrefixes:o,components:{...He,...n},content:P,defaultOrigin:s,rehypePlugins:[Ee.default,T,...a!=null?a:[]],remarkPlugins:[[_e.default,Bt],[Oe.default,It],...l!=null?l:[]],shouldParseIncompleteMarkdown:r},`${u}-block_${$}`))})})})})},(e,t)=>e.children===t.children&&e.shikiTheme===t.shikiTheme);Ue.displayName="Streamdown";0&&(module.exports={ControlsContext,MermaidConfigContext,ShikiThemeContext,Streamdown});
18
+ $$`:`${e}$$`},po=e=>{let t=0,o=e.match(/\*+/g)||[];for(let n of o){let s=n.length;s>=3&&(t+=Math.floor(s/3))}return t},go=e=>{if(oe(e)||Yt.test(e))return e;let t=e.match(Ft);if(t){let o=t[2];if(!o||R.test(o))return e;if(po(e)%2===1)return`${e}***`}return e},ne=e=>{if(!e||typeof e!="string")return e;let t=e,o=eo(t);return o.endsWith("](streamdown:incomplete-link)")?o:(t=o,t=go(t),t=to(t),t=oo(t),t=ro(t),t=io(t),t=co(t),t=mo(t),t=uo(t),t)};var pt=require("react-markdown"),$=require("react/jsx-runtime"),dt={harden:[rt.harden,{allowedImagePrefixes:["*"],allowedLinkPrefixes:["*"],defaultOrigin:void 0,allowDataImages:!0}],raw:st.default,katex:[re.default,{errorColor:"var(--color-muted-foreground)"}]},mt={gfm:[lt.default,{}],math:[ct.default,{singleDollarTextMath:!1}],cjkFriendly:[it.default,{}],cjkFriendlyGfmStrikethrough:[at.default,{}]},Q=(0,M.createContext)(["github-light","github-dark"]),ee=(0,M.createContext)(void 0),X=(0,M.createContext)(!0),H=(0,M.createContext)({isAnimating:!1}),ge=(0,M.memo)(({content:e,shouldParseIncompleteMarkdown:t,...o})=>{let n=(0,M.useMemo)(()=>typeof e=="string"&&t?ne(e.trim()):e,[e,t]);return(0,$.jsx)(nt.default,{...o,children:n})},(e,t)=>e.content===t.content);ge.displayName="Block";var ho=["github-light","github-dark"],ut=(0,M.memo)(({children:e,parseIncompleteMarkdown:t=!0,components:o,rehypePlugins:n=Object.values(dt),remarkPlugins:s=Object.values(mt),className:r,shikiTheme:i=ho,mermaidConfig:a,controls:l=!0,isAnimating:c=!1,urlTransform:d=u=>u,BlockComponent:h=ge,parseMarkdownIntoBlocksFn:w=te,...f})=>{let u=(0,M.useId)(),T=(0,M.useMemo)(()=>w(typeof e=="string"?e:""),[e,w]);(0,M.useEffect)(()=>{Array.isArray(n)&&n.some(y=>Array.isArray(y)?y[0]===re.default:y===re.default)&&import("katex/dist/katex.min.css")},[n]);let k=(0,M.useMemo)(()=>({isAnimating:c}),[c]);return(0,$.jsx)(Q.Provider,{value:i,children:(0,$.jsx)(ee.Provider,{value:a,children:(0,$.jsx)(X.Provider,{value:l,children:(0,$.jsx)(H.Provider,{value:k,children:(0,$.jsx)("div",{className:p("space-y-4",r),children:T.map((y,L)=>(0,$.jsx)(h,{components:{...Ye,...o},content:y,index:L,rehypePlugins:n,remarkPlugins:s,shouldParseIncompleteMarkdown:t,urlTransform:d,...f},`${u}-block-${L}`))})})})})})},(e,t)=>e.children===t.children&&e.shikiTheme===t.shikiTheme&&e.isAnimating===t.isAnimating);ut.displayName="Streamdown";0&&(module.exports={Block,ControlsContext,MermaidConfigContext,ShikiThemeContext,Streamdown,StreamdownRuntimeContext,defaultRehypePlugins,defaultRemarkPlugins,defaultUrlTransform,parseIncompleteMarkdown,parseMarkdownIntoBlocks});
package/dist/index.d.cts CHANGED
@@ -1,30 +1,50 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { Options } from 'react-markdown';
4
- import { BundledTheme } from 'shiki';
5
3
  import { MermaidConfig } from 'mermaid';
6
4
  export { MermaidConfig } from 'mermaid';
5
+ import { Options } from 'react-markdown';
6
+ export { defaultUrlTransform } from 'react-markdown';
7
+ import { BundledTheme } from 'shiki';
8
+ import { Pluggable } from 'unified';
9
+
10
+ declare const parseMarkdownIntoBlocks: (markdown: string) => string[];
11
+
12
+ declare const parseIncompleteMarkdown: (text: string) => string;
7
13
 
8
- type HardenReactMarkdownProps = Options & {
9
- defaultOrigin?: string;
10
- allowedLinkPrefixes?: string[];
11
- allowedImagePrefixes?: string[];
12
- };
13
14
  type ControlsConfig = boolean | {
14
15
  table?: boolean;
15
16
  code?: boolean;
16
- mermaid?: boolean;
17
+ mermaid?: boolean | {
18
+ download?: boolean;
19
+ copy?: boolean;
20
+ fullscreen?: boolean;
21
+ };
17
22
  };
18
- type StreamdownProps = HardenReactMarkdownProps & {
23
+ type StreamdownProps = Options & {
24
+ BlockComponent?: React.ComponentType<BlockProps>;
25
+ parseMarkdownIntoBlocksFn?: (markdown: string) => string[];
19
26
  parseIncompleteMarkdown?: boolean;
20
27
  className?: string;
21
28
  shikiTheme?: [BundledTheme, BundledTheme];
22
29
  mermaidConfig?: MermaidConfig;
23
30
  controls?: ControlsConfig;
31
+ isAnimating?: boolean;
24
32
  };
33
+ declare const defaultRehypePlugins: Record<string, Pluggable>;
34
+ declare const defaultRemarkPlugins: Record<string, Pluggable>;
25
35
  declare const ShikiThemeContext: react.Context<[BundledTheme, BundledTheme]>;
26
36
  declare const MermaidConfigContext: react.Context<MermaidConfig | undefined>;
27
37
  declare const ControlsContext: react.Context<ControlsConfig>;
28
- declare const Streamdown: react.MemoExoticComponent<({ children, allowedImagePrefixes, allowedLinkPrefixes, defaultOrigin, parseIncompleteMarkdown: shouldParseIncompleteMarkdown, components, rehypePlugins, remarkPlugins, className, shikiTheme, mermaidConfig, controls, ...props }: StreamdownProps) => react_jsx_runtime.JSX.Element>;
38
+ type StreamdownRuntimeContextType = {
39
+ isAnimating: boolean;
40
+ };
41
+ declare const StreamdownRuntimeContext: react.Context<StreamdownRuntimeContextType>;
42
+ type BlockProps = Options & {
43
+ content: string;
44
+ shouldParseIncompleteMarkdown: boolean;
45
+ index: number;
46
+ };
47
+ declare const Block: react.MemoExoticComponent<({ content, shouldParseIncompleteMarkdown, ...props }: BlockProps) => react_jsx_runtime.JSX.Element>;
48
+ declare const Streamdown: react.MemoExoticComponent<({ children, parseIncompleteMarkdown: shouldParseIncompleteMarkdown, components, rehypePlugins, remarkPlugins, className, shikiTheme, mermaidConfig, controls, isAnimating, urlTransform, BlockComponent, parseMarkdownIntoBlocksFn, ...props }: StreamdownProps) => react_jsx_runtime.JSX.Element>;
29
49
 
30
- export { type ControlsConfig, ControlsContext, MermaidConfigContext, ShikiThemeContext, Streamdown, type StreamdownProps };
50
+ export { Block, type ControlsConfig, ControlsContext, MermaidConfigContext, ShikiThemeContext, Streamdown, type StreamdownProps, StreamdownRuntimeContext, type StreamdownRuntimeContextType, defaultRehypePlugins, defaultRemarkPlugins, parseIncompleteMarkdown, parseMarkdownIntoBlocks };
package/dist/index.d.ts CHANGED
@@ -1,30 +1,50 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { Options } from 'react-markdown';
4
- import { BundledTheme } from 'shiki';
5
3
  import { MermaidConfig } from 'mermaid';
6
4
  export { MermaidConfig } from 'mermaid';
5
+ import { Options } from 'react-markdown';
6
+ export { defaultUrlTransform } from 'react-markdown';
7
+ import { BundledTheme } from 'shiki';
8
+ import { Pluggable } from 'unified';
9
+
10
+ declare const parseMarkdownIntoBlocks: (markdown: string) => string[];
11
+
12
+ declare const parseIncompleteMarkdown: (text: string) => string;
7
13
 
8
- type HardenReactMarkdownProps = Options & {
9
- defaultOrigin?: string;
10
- allowedLinkPrefixes?: string[];
11
- allowedImagePrefixes?: string[];
12
- };
13
14
  type ControlsConfig = boolean | {
14
15
  table?: boolean;
15
16
  code?: boolean;
16
- mermaid?: boolean;
17
+ mermaid?: boolean | {
18
+ download?: boolean;
19
+ copy?: boolean;
20
+ fullscreen?: boolean;
21
+ };
17
22
  };
18
- type StreamdownProps = HardenReactMarkdownProps & {
23
+ type StreamdownProps = Options & {
24
+ BlockComponent?: React.ComponentType<BlockProps>;
25
+ parseMarkdownIntoBlocksFn?: (markdown: string) => string[];
19
26
  parseIncompleteMarkdown?: boolean;
20
27
  className?: string;
21
28
  shikiTheme?: [BundledTheme, BundledTheme];
22
29
  mermaidConfig?: MermaidConfig;
23
30
  controls?: ControlsConfig;
31
+ isAnimating?: boolean;
24
32
  };
33
+ declare const defaultRehypePlugins: Record<string, Pluggable>;
34
+ declare const defaultRemarkPlugins: Record<string, Pluggable>;
25
35
  declare const ShikiThemeContext: react.Context<[BundledTheme, BundledTheme]>;
26
36
  declare const MermaidConfigContext: react.Context<MermaidConfig | undefined>;
27
37
  declare const ControlsContext: react.Context<ControlsConfig>;
28
- declare const Streamdown: react.MemoExoticComponent<({ children, allowedImagePrefixes, allowedLinkPrefixes, defaultOrigin, parseIncompleteMarkdown: shouldParseIncompleteMarkdown, components, rehypePlugins, remarkPlugins, className, shikiTheme, mermaidConfig, controls, ...props }: StreamdownProps) => react_jsx_runtime.JSX.Element>;
38
+ type StreamdownRuntimeContextType = {
39
+ isAnimating: boolean;
40
+ };
41
+ declare const StreamdownRuntimeContext: react.Context<StreamdownRuntimeContextType>;
42
+ type BlockProps = Options & {
43
+ content: string;
44
+ shouldParseIncompleteMarkdown: boolean;
45
+ index: number;
46
+ };
47
+ declare const Block: react.MemoExoticComponent<({ content, shouldParseIncompleteMarkdown, ...props }: BlockProps) => react_jsx_runtime.JSX.Element>;
48
+ declare const Streamdown: react.MemoExoticComponent<({ children, parseIncompleteMarkdown: shouldParseIncompleteMarkdown, components, rehypePlugins, remarkPlugins, className, shikiTheme, mermaidConfig, controls, isAnimating, urlTransform, BlockComponent, parseMarkdownIntoBlocksFn, ...props }: StreamdownProps) => react_jsx_runtime.JSX.Element>;
29
49
 
30
- export { type ControlsConfig, ControlsContext, MermaidConfigContext, ShikiThemeContext, Streamdown, type StreamdownProps };
50
+ export { Block, type ControlsConfig, ControlsContext, MermaidConfigContext, ShikiThemeContext, Streamdown, type StreamdownProps, StreamdownRuntimeContext, type StreamdownRuntimeContextType, defaultRehypePlugins, defaultRemarkPlugins, parseIncompleteMarkdown, parseMarkdownIntoBlocks };
package/dist/index.js CHANGED
@@ -1,15 +1,18 @@
1
- "use client";import{createContext as J,memo as De,useId as $t,useMemo as X}from"react";import Ht from"react-markdown";import xt from"rehype-katex";import jt from"rehype-raw";import Rt from"remark-gfm";import At from"remark-math";import"katex/dist/katex.min.css";import qe from"harden-react-markdown";import{isValidElement as nt,memo as b,useContext as W}from"react";import{CheckIcon as Ue,CopyIcon as ze,DownloadIcon as Xe}from"lucide-react";import{createContext as Je,useContext as q,useEffect as K,useRef as Q,useState as R}from"react";import{bundledLanguages as Fe,createHighlighter as F}from"shiki";import{createJavaScriptRegexEngine as Ge}from"shiki/engine/javascript";import{clsx as Oe}from"clsx";import{twMerge as We}from"tailwind-merge";var d=(...e)=>We(Oe(e)),T=(e,t,o)=>{let s=typeof t=="string"?new Blob([t],{type:o}):t,r=URL.createObjectURL(s),n=document.createElement("a");n.href=r,n.download=e,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(r)};import{jsx as y,jsxs as j}from"react/jsx-runtime";var Ve=/<pre(\s|>)/,D=Je({code:""}),A=class{constructor(){this.lightHighlighter=null;this.darkHighlighter=null;this.lightTheme=null;this.darkTheme=null;this.loadedLanguages=new Set;this.initializationPromise=null}isLanguageSupported(t){return Object.hasOwn(Fe,t)}getFallbackLanguage(){return"text"}async ensureHighlightersInitialized(t,o){var m,h;let[s,r]=t,n=Ge({forgiving:!0}),a=!this.lightHighlighter||this.lightTheme!==s,l=!this.darkHighlighter||this.darkTheme!==r;(a||l)&&this.loadedLanguages.clear();let i=this.isLanguageSupported(o),c=!this.loadedLanguages.has(o)&&i;if(a?(this.lightHighlighter=await F({themes:[s],langs:i?[o]:[],engine:n}),this.lightTheme=s,i&&this.loadedLanguages.add(o)):c&&await((m=this.lightHighlighter)==null?void 0:m.loadLanguage(o)),l){let g=c?[...this.loadedLanguages].concat(i?[o]:[]):Array.from(this.loadedLanguages);this.darkHighlighter=await F({themes:[r],langs:g.length>0?g:i?[o]:[],engine:n}),this.darkTheme=r}else c&&await((h=this.darkHighlighter)==null?void 0:h.loadLanguage(o));c&&this.loadedLanguages.add(o)}async highlightCode(t,o,s,r){var h,g;this.initializationPromise&&await this.initializationPromise,this.initializationPromise=this.ensureHighlightersInitialized(s,o),await this.initializationPromise,this.initializationPromise=null;let[n,a]=s,l=this.isLanguageSupported(o)?o:this.getFallbackLanguage(),i=(h=this.lightHighlighter)==null?void 0:h.codeToHtml(t,{lang:l,theme:n}),c=(g=this.darkHighlighter)==null?void 0:g.codeToHtml(t,{lang:l,theme:a}),m=u=>r?u.replace(Ve,`<pre class="${r}"$1`):u;return[G(m(i)),G(m(c))]}},Ke=new A,G=e=>e.replace(/(<pre[^>]*)(style="[^"]*background[^";]*;?[^"]*")([^>]*>)/g,"$1$3"),Y=({code:e,language:t,className:o,children:s,preClassName:r,...n})=>{let[a,l]=R(""),[i,c]=R(""),m=Q(!1),[h,g]=q(O);return K(()=>(m.current=!0,Ke.highlightCode(e,t,[h,g],r).then(([u,f])=>{m.current&&(l(u),c(f))}),()=>{m.current=!1}),[e,t,h,g,r]),y(D.Provider,{value:{code:e},children:j("div",{className:"my-4 w-full overflow-hidden rounded-xl border","data-code-block-container":!0,"data-language":t,children:[j("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:[y("span",{className:"ml-1 font-mono lowercase",children:t}),y("div",{className:"flex items-center gap-2",children:s})]}),y("div",{className:"w-full",children:j("div",{className:"min-w-full",children:[y("div",{className:d("overflow-x-auto dark:hidden",o),dangerouslySetInnerHTML:{__html:a},"data-code-block":!0,"data-language":t,...n}),y("div",{className:d("hidden overflow-x-auto dark:block",o),dangerouslySetInnerHTML:{__html:i},"data-code-block":!0,"data-language":t,...n})]})})]})})},V={"1c":"1c","1c-query":"1cq",abap:"abap","actionscript-3":"as",ada:"ada",adoc:"adoc","angular-html":"html","angular-ts":"ts",apache:"conf",apex:"cls",apl:"apl",applescript:"applescript",ara:"ara",asciidoc:"adoc",asm:"asm",astro:"astro",awk:"awk",ballerina:"bal",bash:"sh",bat:"bat",batch:"bat",be:"be",beancount:"beancount",berry:"berry",bibtex:"bib",bicep:"bicep",blade:"blade.php",bsl:"bsl",c:"c","c#":"cs","c++":"cpp",cadence:"cdc",cairo:"cairo",cdc:"cdc",clarity:"clar",clj:"clj",clojure:"clj","closure-templates":"soy",cmake:"cmake",cmd:"cmd",cobol:"cob",codeowners:"CODEOWNERS",codeql:"ql",coffee:"coffee",coffeescript:"coffee","common-lisp":"lisp",console:"sh",coq:"v",cpp:"cpp",cql:"cql",crystal:"cr",cs:"cs",csharp:"cs",css:"css",csv:"csv",cue:"cue",cypher:"cql",d:"d",dart:"dart",dax:"dax",desktop:"desktop",diff:"diff",docker:"dockerfile",dockerfile:"dockerfile",dotenv:"env","dream-maker":"dm",edge:"edge",elisp:"el",elixir:"ex",elm:"elm","emacs-lisp":"el",erb:"erb",erl:"erl",erlang:"erl",f:"f","f#":"fs",f03:"f03",f08:"f08",f18:"f18",f77:"f77",f90:"f90",f95:"f95",fennel:"fnl",fish:"fish",fluent:"ftl",for:"for","fortran-fixed-form":"f","fortran-free-form":"f90",fs:"fs",fsharp:"fs",fsl:"fsl",ftl:"ftl",gdresource:"tres",gdscript:"gd",gdshader:"gdshader",genie:"gs",gherkin:"feature","git-commit":"gitcommit","git-rebase":"gitrebase",gjs:"js",gleam:"gleam","glimmer-js":"js","glimmer-ts":"ts",glsl:"glsl",gnuplot:"plt",go:"go",gql:"gql",graphql:"graphql",groovy:"groovy",gts:"gts",hack:"hack",haml:"haml",handlebars:"hbs",haskell:"hs",haxe:"hx",hbs:"hbs",hcl:"hcl",hjson:"hjson",hlsl:"hlsl",hs:"hs",html:"html","html-derivative":"html",http:"http",hxml:"hxml",hy:"hy",imba:"imba",ini:"ini",jade:"jade",java:"java",javascript:"js",jinja:"jinja",jison:"jison",jl:"jl",js:"js",json:"json",json5:"json5",jsonc:"jsonc",jsonl:"jsonl",jsonnet:"jsonnet",jssm:"jssm",jsx:"jsx",julia:"jl",kotlin:"kt",kql:"kql",kt:"kt",kts:"kts",kusto:"kql",latex:"tex",lean:"lean",lean4:"lean",less:"less",liquid:"liquid",lisp:"lisp",lit:"lit",llvm:"ll",log:"log",logo:"logo",lua:"lua",luau:"luau",make:"mak",makefile:"mak",markdown:"md",marko:"marko",matlab:"m",md:"md",mdc:"mdc",mdx:"mdx",mediawiki:"wiki",mermaid:"mmd",mips:"s",mipsasm:"s",mmd:"mmd",mojo:"mojo",move:"move",nar:"nar",narrat:"narrat",nextflow:"nf",nf:"nf",nginx:"conf",nim:"nim",nix:"nix",nu:"nu",nushell:"nu",objc:"m","objective-c":"m","objective-cpp":"mm",ocaml:"ml",pascal:"pas",perl:"pl",perl6:"p6",php:"php",plsql:"pls",po:"po",polar:"polar",postcss:"pcss",pot:"pot",potx:"potx",powerquery:"pq",powershell:"ps1",prisma:"prisma",prolog:"pl",properties:"properties",proto:"proto",protobuf:"proto",ps:"ps",ps1:"ps1",pug:"pug",puppet:"pp",purescript:"purs",py:"py",python:"py",ql:"ql",qml:"qml",qmldir:"qmldir",qss:"qss",r:"r",racket:"rkt",raku:"raku",razor:"cshtml",rb:"rb",reg:"reg",regex:"regex",regexp:"regexp",rel:"rel",riscv:"s",rs:"rs",rst:"rst",ruby:"rb",rust:"rs",sas:"sas",sass:"sass",scala:"scala",scheme:"scm",scss:"scss",sdbl:"sdbl",sh:"sh",shader:"shader",shaderlab:"shader",shell:"sh",shellscript:"sh",shellsession:"sh",smalltalk:"st",solidity:"sol",soy:"soy",sparql:"rq",spl:"spl",splunk:"spl",sql:"sql","ssh-config":"config",stata:"do",styl:"styl",stylus:"styl",svelte:"svelte",swift:"swift","system-verilog":"sv",systemd:"service",talon:"talon",talonscript:"talon",tasl:"tasl",tcl:"tcl",templ:"templ",terraform:"tf",tex:"tex",tf:"tf",tfvars:"tfvars",toml:"toml",ts:"ts","ts-tags":"ts",tsp:"tsp",tsv:"tsv",tsx:"tsx",turtle:"ttl",twig:"twig",typ:"typ",typescript:"ts",typespec:"tsp",typst:"typ",v:"v",vala:"vala",vb:"vb",verilog:"v",vhdl:"vhdl",vim:"vim",viml:"vim",vimscript:"vim",vue:"vue","vue-html":"html","vue-vine":"vine",vy:"vy",vyper:"vy",wasm:"wasm",wenyan:"wy",wgsl:"wgsl",wiki:"wiki",wikitext:"wiki",wit:"wit",wl:"wl",wolfram:"wl",xml:"xml",xsl:"xsl",yaml:"yaml",yml:"yml",zenscript:"zs",zig:"zig",zsh:"zsh",\u6587\u8A00:"wy"},E=({onDownload:e,onError:t,language:o,children:s,className:r,code:n,...a})=>{let l=q(D).code,i=n!=null?n:l,m=`file.${o&&o in V?V[o]:"txt"}`,h="text/plain",g=()=>{try{T(m,i,h),e==null||e()}catch(u){t==null||t(u)}};return y("button",{className:d("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground",r),onClick:g,title:"Download file",type:"button",...a,children:s!=null?s:y(Xe,{size:14})})},_=({onCopy:e,onError:t,timeout:o=2e3,children:s,className:r,code:n,...a})=>{let[l,i]=R(!1),c=Q(0),m=q(D).code,h=n!=null?n:m,g=async()=>{var f;if(typeof window=="undefined"||!((f=navigator==null?void 0:navigator.clipboard)!=null&&f.writeText)){t==null||t(new Error("Clipboard API not available"));return}try{l||(await navigator.clipboard.writeText(h),i(!0),e==null||e(),c.current=window.setTimeout(()=>i(!1),o))}catch(w){t==null||t(w)}};K(()=>()=>{window.clearTimeout(c.current)},[]);let u=l?Ue:ze;return y("button",{className:d("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground",r),onClick:g,type:"button",...a,children:s!=null?s:y(u,{size:14})})};import{DownloadIcon as Qe}from"lucide-react";import{jsx as B,jsxs as Ye}from"react/jsx-runtime";var Z=({node:e,className:t,src:o,alt:s,...r})=>{let n=async()=>{var a;if(o)try{let i=await(await fetch(o)).blob(),m=new URL(o,window.location.origin).pathname.split("/").pop()||"",h=m.includes(".")&&((a=m.split(".").pop())==null?void 0:a.length)<=4,g="";if(h)g=m;else{let u=i.type,f="png";u.includes("jpeg")||u.includes("jpg")?f="jpg":u.includes("png")?f="png":u.includes("svg")?f="svg":u.includes("gif")?f="gif":u.includes("webp")&&(f="webp"),g=`${(s||m||"image").replace(/\.[^/.]+$/,"")}.${f}`}T(g,i,i.type)}catch(l){console.error("Failed to download image:",l)}};return o?Ye("div",{className:"group relative my-4 inline-block","data-streamdown":"image-wrapper",children:[B("img",{alt:s,className:d("max-w-full rounded-lg",t),"data-streamdown":"image",src:o,...r}),B("div",{className:"pointer-events-none absolute inset-0 hidden rounded-lg bg-black/10 group-hover:block"}),B("button",{className:d("absolute right-2 bottom-2 flex h-8 w-8 cursor-pointer items-center justify-center rounded-md border border-border bg-background/90 shadow-sm backdrop-blur-sm transition-all duration-200 hover:bg-background","opacity-0 group-hover:opacity-100"),onClick:n,title:"Download image",type:"button",children:B(Qe,{size:14})})]}):null};import{useEffect as Ze,useState as L}from"react";import{jsx as C,jsxs as S}from"react/jsx-runtime";var et=async e=>{let o={...{startOnLoad:!1,theme:"default",securityLevel:"strict",fontFamily:"monospace",suppressErrorRendering:!0},...e},r=(await import("mermaid")).default;return r.initialize(o),r},ee=({chart:e,className:t,config:o})=>{let[s,r]=L(null),[n,a]=L(!0),[l,i]=L(""),[c,m]=L("");if(Ze(()=>{(async()=>{try{r(null),a(!0);let u=await et(o),f=e.split("").reduce((M,_e)=>(M<<5)-M+_e.charCodeAt(0)|0,0),w=`mermaid-${Math.abs(f)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:v}=await u.render(w,e);i(v),m(v)}catch(u){if(!(c||l)){let f=u instanceof Error?u.message:"Failed to render Mermaid chart";r(f)}}finally{a(!1)}})()},[e,o]),n&&!l&&!c)return C("div",{className:d("my-4 flex justify-center p-4",t),children:S("div",{className:"flex items-center space-x-2 text-muted-foreground",children:[C("div",{className:"h-4 w-4 animate-spin rounded-full border-current border-b-2"}),C("span",{className:"text-sm",children:"Loading diagram..."})]})});if(s&&!l&&!c)return S("div",{className:d("rounded-lg border border-red-200 bg-red-50 p-4",t),children:[S("p",{className:"font-mono text-red-700 text-sm",children:["Mermaid Error: ",s]}),S("details",{className:"mt-2",children:[C("summary",{className:"cursor-pointer text-red-600 text-xs",children:"Show Code"}),C("pre",{className:"mt-2 overflow-x-auto rounded bg-red-100 p-2 text-red-800 text-xs",children:e})]})]});let h=l||c;return C("div",{"aria-label":"Mermaid chart",className:d("my-4 flex justify-center",t),dangerouslySetInnerHTML:{__html:h},role:"img"})};import{CheckIcon as tt,CopyIcon as ot,DownloadIcon as st}from"lucide-react";import{useEffect as oe,useRef as se,useState as ne}from"react";import{jsx as N,jsxs as te}from"react/jsx-runtime";function re(e){var n,a;let t=[],o=[],s=e.querySelectorAll("thead th");for(let l of s)t.push(((n=l.textContent)==null?void 0:n.trim())||"");let r=e.querySelectorAll("tbody tr");for(let l of r){let i=[],c=l.querySelectorAll("td");for(let m of c)i.push(((a=m.textContent)==null?void 0:a.trim())||"");o.push(i)}return{headers:t,rows:o}}function ae(e){let{headers:t,rows:o}=e,s=n=>n.includes(",")||n.includes('"')||n.includes(`
2
- `)?`"${n.replace(/"/g,'""')}"`:n,r=[];t.length>0&&r.push(t.map(s).join(","));for(let n of o)r.push(n.map(s).join(","));return r.join(`
3
- `)}function ie(e){let{headers:t,rows:o}=e;if(t.length===0)return"";let s=[],r=t.map(n=>n.replace(/\|/g,"\\|"));s.push(`| ${r.join(" | ")} |`),s.push(`| ${t.map(()=>"---").join(" | ")} |`);for(let n of o){let a=[...n];for(;a.length<t.length;)a.push("");let l=a.map(i=>i.replace(/\|/g,"\\|"));s.push(`| ${l.join(" | ")} |`)}return s.join(`
4
- `)}var le=({children:e,className:t,onCopy:o,onError:s,timeout:r=2e3,format:n="markdown"})=>{let[a,l]=ne(!1),i=se(0),c=async h=>{var g;if(typeof window=="undefined"||!((g=navigator==null?void 0:navigator.clipboard)!=null&&g.write)){s==null||s(new Error("Clipboard API not available"));return}try{if(!a){let f=h.currentTarget.closest('[data-streamdown="table-wrapper"]'),w=f==null?void 0:f.querySelector("table");if(!w){s==null||s(new Error("Table not found"));return}let v=re(w),M=new ClipboardItem({"text/plain":n==="markdown"?ie(v):ae(v),"text/html":new Blob([w.outerHTML],{type:"text/html"})});await navigator.clipboard.write([M]),l(!0),o==null||o(),i.current=window.setTimeout(()=>l(!1),r)}}catch(u){s==null||s(u)}};oe(()=>()=>{window.clearTimeout(i.current)},[]);let m=a?tt:ot;return N("button",{className:d("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground",t),onClick:c,title:`Copy table as ${n}`,type:"button",children:e!=null?e:N(m,{size:14})})};var de=({children:e,className:t,onDownload:o,onError:s})=>{let[r,n]=ne(!1),a=se(null),l=i=>{var c;try{let m=(c=a.current)==null?void 0:c.closest('[data-streamdown="table-wrapper"]'),h=m==null?void 0:m.querySelector("table");if(!h){s==null||s(new Error("Table not found"));return}let g=re(h),u=i==="csv"?ae(g):ie(g);T(`table.${i==="csv"?"csv":"md"}`,u,i==="csv"?"text/csv":"text/markdown"),n(!1),o==null||o(i)}catch(m){s==null||s(m)}};return oe(()=>{let i=c=>{a.current&&!a.current.contains(c.target)&&n(!1)};return document.addEventListener("mousedown",i),()=>{document.removeEventListener("mousedown",i)}},[]),te("div",{className:"relative",ref:a,children:[N("button",{className:d("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground",t),onClick:()=>n(!r),title:"Download table",type:"button",children:e!=null?e:N(st,{size:14})}),r&&te("div",{className:"absolute top-full right-0 z-10 mt-1 min-w-[120px] rounded-md border border-border bg-background shadow-lg",children:[N("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>l("csv"),type:"button",children:"CSV"}),N("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>l("markdown"),type:"button",children:"Markdown"})]})]})};import{Fragment as it,jsx as p,jsxs as I}from"react/jsx-runtime";var rt=/language-([^\s]+)/;function $(e,t){if(!(e!=null&&e.position||t!=null&&t.position))return!0;if(!(e!=null&&e.position&&(t!=null&&t.position)))return!1;let o=e.position.start,s=t.position.start,r=e.position.end,n=t.position.end;return(o==null?void 0:o.line)===(s==null?void 0:s.line)&&(o==null?void 0:o.column)===(s==null?void 0:s.column)&&(r==null?void 0:r.line)===(n==null?void 0:n.line)&&(r==null?void 0:r.column)===(n==null?void 0:n.column)}function k(e,t){return e.className===t.className&&$(e.node,t.node)}var U=(e,t)=>typeof e=="boolean"?e:e[t]!==!1,ce=b(({children:e,className:t,...o})=>p("ol",{className:d("ml-4 list-outside list-decimal whitespace-normal",t),"data-streamdown":"ordered-list",...o,children:e}),(e,t)=>k(e,t));ce.displayName="MarkdownOl";var me=b(({children:e,className:t,...o})=>p("li",{className:d("py-1",t),"data-streamdown":"list-item",...o,children:e}),(e,t)=>e.className===t.className&&$(e.node,t.node));me.displayName="MarkdownLi";var pe=b(({children:e,className:t,...o})=>p("ul",{className:d("ml-4 list-outside list-disc whitespace-normal",t),"data-streamdown":"unordered-list",...o,children:e}),(e,t)=>k(e,t));pe.displayName="MarkdownUl";var ue=b(({className:e,...t})=>p("hr",{className:d("my-6 border-border",e),"data-streamdown":"horizontal-rule",...t}),(e,t)=>k(e,t));ue.displayName="MarkdownHr";var ge=b(({children:e,className:t,...o})=>p("span",{className:d("font-semibold",t),"data-streamdown":"strong",...o,children:e}),(e,t)=>k(e,t));ge.displayName="MarkdownStrong";var he=b(({children:e,className:t,href:o,...s})=>{let r=o==="streamdown:incomplete-link";return p("a",{className:d("wrap-anywhere font-medium text-primary underline",t),"data-incomplete":r,"data-streamdown":"link",href:o,rel:"noreferrer",target:"_blank",...s,children:e})},(e,t)=>k(e,t)&&e.href===t.href);he.displayName="MarkdownA";var fe=b(({children:e,className:t,...o})=>p("h1",{className:d("mt-6 mb-2 font-semibold text-3xl",t),"data-streamdown":"heading-1",...o,children:e}),(e,t)=>k(e,t));fe.displayName="MarkdownH1";var be=b(({children:e,className:t,...o})=>p("h2",{className:d("mt-6 mb-2 font-semibold text-2xl",t),"data-streamdown":"heading-2",...o,children:e}),(e,t)=>k(e,t));be.displayName="MarkdownH2";var ke=b(({children:e,className:t,...o})=>p("h3",{className:d("mt-6 mb-2 font-semibold text-xl",t),"data-streamdown":"heading-3",...o,children:e}),(e,t)=>k(e,t));ke.displayName="MarkdownH3";var we=b(({children:e,className:t,...o})=>p("h4",{className:d("mt-6 mb-2 font-semibold text-lg",t),"data-streamdown":"heading-4",...o,children:e}),(e,t)=>k(e,t));we.displayName="MarkdownH4";var ye=b(({children:e,className:t,...o})=>p("h5",{className:d("mt-6 mb-2 font-semibold text-base",t),"data-streamdown":"heading-5",...o,children:e}),(e,t)=>k(e,t));ye.displayName="MarkdownH5";var ve=b(({children:e,className:t,...o})=>p("h6",{className:d("mt-6 mb-2 font-semibold text-sm",t),"data-streamdown":"heading-6",...o,children:e}),(e,t)=>k(e,t));ve.displayName="MarkdownH6";var Me=b(({children:e,className:t,...o})=>{let s=W(H),r=U(s,"table");return I("div",{className:"my-4 flex flex-col space-y-2","data-streamdown":"table-wrapper",children:[r&&I("div",{className:"flex items-center justify-end gap-1",children:[p(le,{}),p(de,{})]}),p("div",{className:"overflow-x-auto",children:p("table",{className:d("w-full border-collapse border border-border",t),"data-streamdown":"table",...o,children:e})})]})},(e,t)=>k(e,t));Me.displayName="MarkdownTable";var Te=b(({children:e,className:t,...o})=>p("thead",{className:d("bg-muted/80",t),"data-streamdown":"table-header",...o,children:e}),(e,t)=>k(e,t));Te.displayName="MarkdownThead";var Ce=b(({children:e,className:t,...o})=>p("tbody",{className:d("divide-y divide-border bg-muted/40",t),"data-streamdown":"table-body",...o,children:e}),(e,t)=>k(e,t));Ce.displayName="MarkdownTbody";var Ne=b(({children:e,className:t,...o})=>p("tr",{className:d("border-border border-b",t),"data-streamdown":"table-row",...o,children:e}),(e,t)=>k(e,t));Ne.displayName="MarkdownTr";var Pe=b(({children:e,className:t,...o})=>p("th",{className:d("whitespace-nowrap px-4 py-2 text-left font-semibold text-sm",t),"data-streamdown":"table-header-cell",...o,children:e}),(e,t)=>k(e,t));Pe.displayName="MarkdownTh";var Ie=b(({children:e,className:t,...o})=>p("td",{className:d("px-4 py-2 text-sm",t),"data-streamdown":"table-cell",...o,children:e}),(e,t)=>k(e,t));Ie.displayName="MarkdownTd";var Be=b(({children:e,className:t,...o})=>p("blockquote",{className:d("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",t),"data-streamdown":"blockquote",...o,children:e}),(e,t)=>k(e,t));Be.displayName="MarkdownBlockquote";var Le=b(({children:e,className:t,...o})=>p("sup",{className:d("text-sm",t),"data-streamdown":"superscript",...o,children:e}),(e,t)=>k(e,t));Le.displayName="MarkdownSup";var Se=b(({children:e,className:t,...o})=>p("sub",{className:d("text-sm",t),"data-streamdown":"subscript",...o,children:e}),(e,t)=>k(e,t));Se.displayName="MarkdownSub";var at=({node:e,className:t,children:o,...s})=>{var h,g,u;let r=((h=e==null?void 0:e.position)==null?void 0:h.start.line)===((g=e==null?void 0:e.position)==null?void 0:g.end.line),n=W(z),a=W(H);if(r)return p("code",{className:d("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...s,children:o});let l=t==null?void 0:t.match(rt),i=(u=l==null?void 0:l.at(1))!=null?u:"",c="";if(nt(o)&&o.props&&typeof o.props=="object"&&"children"in o.props&&typeof o.props.children=="string"?c=o.props.children:typeof o=="string"&&(c=o),i==="mermaid"){let f=U(a,"mermaid");return I("div",{className:d("group relative my-4 h-auto rounded-xl border p-4",t),"data-streamdown":"mermaid-block",children:[f&&I("div",{className:"flex items-center justify-end gap-2",children:[p(E,{code:c,language:i}),p(_,{code:c})]}),p(ee,{chart:c,config:n})]})}let m=U(a,"code");return p(Y,{className:d("overflow-x-auto border-t",t),code:c,"data-language":i,"data-streamdown":"code-block",language:i,preClassName:"overflow-x-auto font-mono text-xs p-4 bg-muted/40",children:m&&I(it,{children:[p(E,{code:c,language:i}),p(_,{})]})})},$e=b(at,(e,t)=>e.className===t.className&&$(e.node,t.node));$e.displayName="MarkdownCode";var He=b(Z,(e,t)=>e.className===t.className&&$(e.node,t.node));He.displayName="MarkdownImg";var xe={ol:ce,li:me,ul:pe,hr:ue,strong:ge,a:he,h1:fe,h2:be,h3:ke,h4:we,h5:ye,h6:ve,table:Me,thead:Te,tbody:Ce,tr:Ne,th:Pe,td:Ie,blockquote:Be,code:$e,img:He,pre:({children:e})=>e,sup:Le,sub:Se};import{Lexer as lt}from"marked";var je=e=>{let o=lt.lex(e,{gfm:!0}).map(r=>r.raw),s=[];for(let r of o){if(r.trim()==="$$"&&s.length>0){let n=s.at(-1);if(!n)continue;let a=n.trimStart().startsWith("$$"),l=(n.match(/\$\$/g)||[]).length;if(a&&l%2===1){s[s.length-1]=n+r;continue}}if(s.length>0&&r.trimEnd().endsWith("$$")){let n=s.at(-1);if(!n)continue;let a=n.trimStart().startsWith("$$"),l=(n.match(/\$\$/g)||[]).length,i=(r.match(/\$\$/g)||[]).length;if(a&&l%2===1&&!r.trimStart().startsWith("$$")&&i===1){s[s.length-1]=n+r;continue}}s.push(r)}return s};var dt=/(!?\[)([^\]]*?)$/,ct=/(\*\*)([^*]*?)$/,mt=/(__)([^_]*?)$/,pt=/(\*\*\*)([^*]*?)$/,ut=/(\*)([^*]*?)$/,gt=/(_)([^_]*?)$/,ht=/(`)([^`]*?)$/,ft=/(~~)([^~]*?)$/,x=e=>{let t=(e.match(/```/g)||[]).length;return t>0&&t%2===0&&e.includes(`
5
- `)},bt=e=>{let t=e.match(dt);if(t){if(t[1].startsWith("!")){let s=e.lastIndexOf(t[1]);return e.substring(0,s)}return`${e}](streamdown:incomplete-link)`}return e},kt=e=>{if(x(e))return e;let t=e.match(ct);if(t){let o=t[2];if(!o||/^[\s_~*`]*$/.test(o))return e;let s=e.lastIndexOf(t[1]),n=e.substring(0,s).lastIndexOf(`
6
- `),a=n===-1?0:n+1,l=e.substring(a,s);if(/^[\s]*[-*+][\s]+$/.test(l)&&o.includes(`
7
- `))return e;if((e.match(/\*\*/g)||[]).length%2===1)return`${e}**`}return e},wt=e=>{let t=e.match(mt);if(t){let o=t[2];if(!o||/^[\s_~*`]*$/.test(o))return e;let s=e.lastIndexOf(t[1]),n=e.substring(0,s).lastIndexOf(`
8
- `),a=n===-1?0:n+1,l=e.substring(a,s);if(/^[\s]*[-*+][\s]+$/.test(l)&&o.includes(`
9
- `))return e;if((e.match(/__/g)||[]).length%2===1)return`${e}__`}return e},yt=e=>e.split("").reduce((t,o,s)=>{if(o==="*"){let r=e[s-1],n=e[s+1];if(r==="\\")return t;let a=s;for(let i=s-1;i>=0;i--){if(e[i]===`
10
- `){a=i+1;break}if(i===0){a=0;break}}if(e.substring(a,s).trim()===""&&(n===" "||n===" "))return t;if(r!=="*"&&n!=="*")return t+1}return t},0),vt=e=>{if(x(e))return e;if(e.match(ut)){let o=-1;for(let n=0;n<e.length;n++)if(e[n]==="*"&&e[n-1]!=="*"&&e[n+1]!=="*"){o=n;break}if(o===-1)return e;let s=e.substring(o+1);if(!s||/^[\s_~*`]*$/.test(s))return e;if(yt(e)%2===1)return`${e}*`}return e},Re=(e,t)=>{let o=!1,s=!1;for(let r=0;r<e.length&&r<t;r++){if(e[r]==="\\"&&e[r+1]==="$"){r++;continue}e[r]==="$"&&(e[r+1]==="$"?(s=!s,r++,o=!1):s||(o=!o))}return o||s},Mt=e=>e.split("").reduce((t,o,s)=>{if(o==="_"){let r=e[s-1],n=e[s+1];if(r==="\\"||Re(e,s)||r&&n&&/[\p{L}\p{N}_]/u.test(r)&&/[\p{L}\p{N}_]/u.test(n))return t;if(r!=="_"&&n!=="_")return t+1}return t},0),Tt=e=>{if(x(e))return e;if(e.match(gt)){let o=-1;for(let n=0;n<e.length;n++)if(e[n]==="_"&&e[n-1]!=="_"&&e[n+1]!=="_"&&e[n-1]!=="\\"&&!Re(e,n)){let a=n>0?e[n-1]:"",l=n<e.length-1?e[n+1]:"";if(a&&l&&/[\p{L}\p{N}_]/u.test(a)&&/[\p{L}\p{N}_]/u.test(l))continue;o=n;break}if(o===-1)return e;let s=e.substring(o+1);if(!s||/^[\s_~*`]*$/.test(s))return e;if(Mt(e)%2===1){let n=e.match(/\n+$/);return n?`${e.slice(0,-n[0].length)}_${n[0]}`:`${e}_`}}return e},Ct=(e,t)=>{let o=e.substring(t,t+3)==="```",s=t>0&&e.substring(t-1,t+2)==="```",r=t>1&&e.substring(t-2,t+1)==="```";return o||s||r},Nt=e=>{let t=0;for(let o=0;o<e.length;o++)e[o]==="`"&&!Ct(e,o)&&t++;return t},Pt=e=>{if(e.match(/^```[^`\n]*```?$/)&&!e.includes(`
11
- `))return e.endsWith("``")&&!e.endsWith("```")?`${e}\``:e;let o=(e.match(/```/g)||[]).length,s=o%2===1;if(o>0&&o%2===0&&e.includes(`
12
- `)||(e.endsWith("```\n")||e.endsWith("```"))&&o%2===0)return e;let r=e.match(ht);if(r&&!s){let n=r[2];if(!n||/^[\s_~*`]*$/.test(n))return e;if(Nt(e)%2===1)return`${e}\``}return e},It=e=>{let t=e.match(ft);if(t){let o=t[2];if(!o||/^[\s_~*`]*$/.test(o))return e;if((e.match(/~~/g)||[]).length%2===1)return`${e}~~`}return e};var Bt=e=>{if((e.match(/\$\$/g)||[]).length%2===0)return e;let o=e.indexOf("$$");return o!==-1&&e.indexOf(`
1
+ "use client";import{createContext as Y,memo as at,useEffect as vo,useId as To,useMemo as we}from"react";import Co from"react-markdown";import{harden as Mo}from"rehype-harden";import ye from"rehype-katex";import Po from"rehype-raw";import No from"remark-cjk-friendly";import Io from"remark-cjk-friendly-gfm-strikethrough";import So from"remark-gfm";import Lo from"remark-math";import{isValidElement as R,memo as b,useContext as ue}from"react";import{CheckIcon as ht,CopyIcon as ft,DownloadIcon as bt}from"lucide-react";import{createContext as wt,startTransition as ve,useContext as O,useEffect as J,useRef as L,useState as $}from"react";import{bundledLanguages as yt,createHighlighter as Te}from"shiki";import{createJavaScriptRegexEngine as kt}from"shiki/engine/javascript";import{clsx as pt}from"clsx";import{twMerge as gt}from"tailwind-merge";var u=(...e)=>gt(pt(e)),A=(e,t,o)=>{let n=typeof t=="string"?new Blob([t],{type:o}):t,s=URL.createObjectURL(n),r=document.createElement("a");r.href=s,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(s)};import{jsx as P,jsxs as te}from"react/jsx-runtime";var ne=wt({code:""});function vt(e,t=200,o=50){let[n,s]=$(e),r=L(0),i=L(null);return J(()=>{let a=Date.now(),l=a-r.current;return i.current&&window.clearTimeout(i.current),l>=t?(s(e),r.current=a):i.current=window.setTimeout(()=>{s(e),r.current=Date.now()},o),()=>{i.current&&window.clearTimeout(i.current)}},[e,t,o]),n}var Tt=e=>e<50?{minHighlightInterval:100,debounceMs:500}:e<150?{minHighlightInterval:500,debounceMs:800}:e<300?{minHighlightInterval:1500,debounceMs:1200}:{minHighlightInterval:Number.POSITIVE_INFINITY,debounceMs:1500},Ct=e=>e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"),Mt=e=>{let t=e.lastIndexOf(`
2
+ `),o=t>=0?e.slice(0,t+1):"",n=t>=0?e.slice(t+1):e;return[o,n]},Pt=e=>e?[{pre(o){return this.addClassToHast(o,e),o}}]:[],oe=class{constructor(){this.lightHighlighter=null;this.darkHighlighter=null;this.lightTheme=null;this.darkTheme=null;this.loadedLanguages=new Set;this.initializationPromise=null;this.loadLanguagePromise=null;this.cache=new Map;this.cacheKeys=[];this.MAX_CACHE_SIZE=50;this.highlightQueue=new Map}isLanguageSupported(t){return Object.hasOwn(yt,t)}getFallbackLanguage(){return"text"}getCacheKey(t,o,n){return`${o}::${n||""}::${t}`}addToCache(t,o){if(this.cache.size>=this.MAX_CACHE_SIZE){let n=this.cacheKeys.shift();n&&this.cache.delete(n)}this.cache.set(t,o),this.cacheKeys.push(t)}needsHighlightersInitialization(t){let[o,n]=t,s=!this.lightHighlighter||this.lightTheme!==o,r=!this.darkHighlighter||this.darkTheme!==n;return[s,r]}async ensureHighlightersInitialized(t,o){let[n,s]=o,[r,i]=t,a=kt({forgiving:!0});this.loadedLanguages.clear(),this.cache.clear(),this.cacheKeys=[],this.highlightQueue.clear(),n&&(this.lightHighlighter=await Te({themes:[r],langs:[],engine:a}),this.lightTheme=r),s&&(this.darkHighlighter=await Te({themes:[i],langs:[],engine:a}),this.darkTheme=i)}async loadLanguage(t){var o,n;await((o=this.darkHighlighter)==null?void 0:o.loadLanguage(t)),await((n=this.lightHighlighter)==null?void 0:n.loadLanguage(t)),this.loadedLanguages.add(t)}async initializeHighlighters(t){this.initializationPromise&&await this.initializationPromise;let o=this.needsHighlightersInitialization(t),[n,s]=o;(n||s)&&(this.initializationPromise=this.ensureHighlightersInitialized(t,o),await this.initializationPromise,this.initializationPromise=null)}performHighlights(t,o,n){let s=this.isLanguageSupported(o)?o:this.getFallbackLanguage();if(this.lightHighlighter===null||this.darkHighlighter===null||this.lightTheme===null||this.darkTheme===null)throw new Error("highlightCode must be called after initializeHighlighters.");let r=Pt(n),i=this.lightHighlighter.codeToHtml(t,{lang:s,theme:this.lightTheme,transformers:r}),a=this.darkHighlighter.codeToHtml(t,{lang:s,theme:this.darkTheme,transformers:r});return[i,a]}async highlightCode(t,o,n,s){let r=this.getCacheKey(t,o,n),i=this.cache.get(r);if(i)return this.cacheKeys=this.cacheKeys.filter(d=>d!==r),this.cacheKeys.push(r),i;let a=this.highlightQueue.get(r);if(a)return a;let l=()=>{if(s!=null&&s.aborted)throw new DOMException("Aborted","AbortError")},c=(async()=>{try{await new Promise(f=>setTimeout(f,0)),l(),this.initializationPromise&&await this.initializationPromise,l(),this.loadLanguagePromise&&await this.loadLanguagePromise,l(),!this.loadedLanguages.has(o)&&this.isLanguageSupported(o)&&(this.loadLanguagePromise=this.loadLanguage(o),await this.loadLanguagePromise,this.loadLanguagePromise=null),l();let g=this.performHighlights(t,o,n);return this.addToCache(r,g),g}finally{this.highlightQueue.delete(r)}})();return this.highlightQueue.set(r,c),c}},ee=new oe,Me=({code:e,language:t,className:o,children:n,preClassName:s,...r})=>{let[i,a]=$(""),[l,c]=$(""),[d,g]=$(""),[f,h]=$(""),m=vt(e),k=L(0),y=L(!1),w=L(null),C=L(0),[D,W]=O(ie);J(()=>{ee.initializeHighlighters([D,W])},[D,W]),J(()=>{y.current=!0,w.current&&w.current.abort(),w.current=new AbortController;let E=w.current.signal;k.current&&clearTimeout(k.current);let[F,q]=Mt(m),ct=m.split(`
3
+ `).length,{minHighlightInterval:dt,debounceMs:mt}=Tt(ct);if(F&&F!==d){let M=Date.now();M-C.current>dt||!q?(C.current=M,ee.highlightCode(F,t,s,E).then(([X,ut])=>{y.current&&!E.aborted&&ve(()=>{a(X),c(ut),g(F),h(q)})}).catch(X=>{if(X.name!=="AbortError")throw X})):h(q)}else h(q);return k.current=window.setTimeout(()=>{q&&m!==d&&!E.aborted&&ee.highlightCode(m,t,s,E).then(([M,ke])=>{y.current&&!E.aborted&&ve(()=>{a(M),c(ke),g(m),h("")})}).catch(M=>{if(M.name!=="AbortError")throw M})},mt),()=>{var M;y.current=!1,(M=w.current)==null||M.abort()}},[m,t,s]);let B=f?`<span class="line"><span>${Ct(f)}</span></span>`:"";return P(ne.Provider,{value:{code:e},children:te("div",{className:"my-4 w-full overflow-hidden rounded-xl border border-border","data-code-block-container":!0,"data-language":t,children:[te("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",{className:"flex items-center gap-2",children:n})]}),P("div",{className:"w-full",children:te("div",{className:"min-w-full",children:[P("div",{className:u("overflow-x-auto dark:hidden",o),dangerouslySetInnerHTML:{__html:B?i+B:i},"data-code-block":!0,"data-language":t,...r}),P("div",{className:u("hidden overflow-x-auto dark:block",o),dangerouslySetInnerHTML:{__html:B?l+B:l},"data-code-block":!0,"data-language":t,...r})]})})]})})},Ce={"1c":"1c","1c-query":"1cq",abap:"abap","actionscript-3":"as",ada:"ada",adoc:"adoc","angular-html":"html","angular-ts":"ts",apache:"conf",apex:"cls",apl:"apl",applescript:"applescript",ara:"ara",asciidoc:"adoc",asm:"asm",astro:"astro",awk:"awk",ballerina:"bal",bash:"sh",bat:"bat",batch:"bat",be:"be",beancount:"beancount",berry:"berry",bibtex:"bib",bicep:"bicep",blade:"blade.php",bsl:"bsl",c:"c","c#":"cs","c++":"cpp",cadence:"cdc",cairo:"cairo",cdc:"cdc",clarity:"clar",clj:"clj",clojure:"clj","closure-templates":"soy",cmake:"cmake",cmd:"cmd",cobol:"cob",codeowners:"CODEOWNERS",codeql:"ql",coffee:"coffee",coffeescript:"coffee","common-lisp":"lisp",console:"sh",coq:"v",cpp:"cpp",cql:"cql",crystal:"cr",cs:"cs",csharp:"cs",css:"css",csv:"csv",cue:"cue",cypher:"cql",d:"d",dart:"dart",dax:"dax",desktop:"desktop",diff:"diff",docker:"dockerfile",dockerfile:"dockerfile",dotenv:"env","dream-maker":"dm",edge:"edge",elisp:"el",elixir:"ex",elm:"elm","emacs-lisp":"el",erb:"erb",erl:"erl",erlang:"erl",f:"f","f#":"fs",f03:"f03",f08:"f08",f18:"f18",f77:"f77",f90:"f90",f95:"f95",fennel:"fnl",fish:"fish",fluent:"ftl",for:"for","fortran-fixed-form":"f","fortran-free-form":"f90",fs:"fs",fsharp:"fs",fsl:"fsl",ftl:"ftl",gdresource:"tres",gdscript:"gd",gdshader:"gdshader",genie:"gs",gherkin:"feature","git-commit":"gitcommit","git-rebase":"gitrebase",gjs:"js",gleam:"gleam","glimmer-js":"js","glimmer-ts":"ts",glsl:"glsl",gnuplot:"plt",go:"go",gql:"gql",graphql:"graphql",groovy:"groovy",gts:"gts",hack:"hack",haml:"haml",handlebars:"hbs",haskell:"hs",haxe:"hx",hbs:"hbs",hcl:"hcl",hjson:"hjson",hlsl:"hlsl",hs:"hs",html:"html","html-derivative":"html",http:"http",hxml:"hxml",hy:"hy",imba:"imba",ini:"ini",jade:"jade",java:"java",javascript:"js",jinja:"jinja",jison:"jison",jl:"jl",js:"js",json:"json",json5:"json5",jsonc:"jsonc",jsonl:"jsonl",jsonnet:"jsonnet",jssm:"jssm",jsx:"jsx",julia:"jl",kotlin:"kt",kql:"kql",kt:"kt",kts:"kts",kusto:"kql",latex:"tex",lean:"lean",lean4:"lean",less:"less",liquid:"liquid",lisp:"lisp",lit:"lit",llvm:"ll",log:"log",logo:"logo",lua:"lua",luau:"luau",make:"mak",makefile:"mak",markdown:"md",marko:"marko",matlab:"m",md:"md",mdc:"mdc",mdx:"mdx",mediawiki:"wiki",mermaid:"mmd",mips:"s",mipsasm:"s",mmd:"mmd",mojo:"mojo",move:"move",nar:"nar",narrat:"narrat",nextflow:"nf",nf:"nf",nginx:"conf",nim:"nim",nix:"nix",nu:"nu",nushell:"nu",objc:"m","objective-c":"m","objective-cpp":"mm",ocaml:"ml",pascal:"pas",perl:"pl",perl6:"p6",php:"php",plsql:"pls",po:"po",polar:"polar",postcss:"pcss",pot:"pot",potx:"potx",powerquery:"pq",powershell:"ps1",prisma:"prisma",prolog:"pl",properties:"properties",proto:"proto",protobuf:"proto",ps:"ps",ps1:"ps1",pug:"pug",puppet:"pp",purescript:"purs",py:"py",python:"py",ql:"ql",qml:"qml",qmldir:"qmldir",qss:"qss",r:"r",racket:"rkt",raku:"raku",razor:"cshtml",rb:"rb",reg:"reg",regex:"regex",regexp:"regexp",rel:"rel",riscv:"s",rs:"rs",rst:"rst",ruby:"rb",rust:"rs",sas:"sas",sass:"sass",scala:"scala",scheme:"scm",scss:"scss",sdbl:"sdbl",sh:"sh",shader:"shader",shaderlab:"shader",shell:"sh",shellscript:"sh",shellsession:"sh",smalltalk:"st",solidity:"sol",soy:"soy",sparql:"rq",spl:"spl",splunk:"spl",sql:"sql","ssh-config":"config",stata:"do",styl:"styl",stylus:"styl",svelte:"svelte",swift:"swift","system-verilog":"sv",systemd:"service",talon:"talon",talonscript:"talon",tasl:"tasl",tcl:"tcl",templ:"templ",terraform:"tf",tex:"tex",tf:"tf",tfvars:"tfvars",toml:"toml",ts:"ts","ts-tags":"ts",tsp:"tsp",tsv:"tsv",tsx:"tsx",turtle:"ttl",twig:"twig",typ:"typ",typescript:"ts",typespec:"tsp",typst:"typ",v:"v",vala:"vala",vb:"vb",verilog:"v",vhdl:"vhdl",vim:"vim",viml:"vim",vimscript:"vim",vue:"vue","vue-html":"html","vue-vine":"vine",vy:"vy",vyper:"vy",wasm:"wasm",wenyan:"wy",wgsl:"wgsl",wiki:"wiki",wikitext:"wiki",wit:"wit",wl:"wl",wolfram:"wl",xml:"xml",xsl:"xsl",yaml:"yaml",yml:"yml",zenscript:"zs",zig:"zig",zsh:"zsh",\u6587\u8A00:"wy"},re=({onDownload:e,onError:t,language:o,children:n,className:s,code:r,...i})=>{let{code:a}=O(ne),{isAnimating:l}=O(N),c=r!=null?r:a,g=`file.${o&&o in Ce?Ce[o]:"txt"}`,f="text/plain",h=()=>{try{A(g,c,f),e==null||e()}catch(m){t==null||t(m)}};return P("button",{className:u("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",s),disabled:l,onClick:h,title:"Download file",type:"button",...i,children:n!=null?n:P(bt,{size:14})})},se=({onCopy:e,onError:t,timeout:o=2e3,children:n,className:s,code:r,...i})=>{let[a,l]=$(!1),c=L(0),{code:d}=O(ne),{isAnimating:g}=O(N),f=r!=null?r:d,h=async()=>{var k;if(typeof window=="undefined"||!((k=navigator==null?void 0:navigator.clipboard)!=null&&k.writeText)){t==null||t(new Error("Clipboard API not available"));return}try{a||(await navigator.clipboard.writeText(f),l(!0),e==null||e(),c.current=window.setTimeout(()=>l(!1),o))}catch(y){t==null||t(y)}};J(()=>()=>{window.clearTimeout(c.current)},[]);let m=a?ht:ft;return P("button",{className:u("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",s),disabled:g,onClick:h,type:"button",...i,children:n!=null?n:P(m,{size:14})})};import{DownloadIcon as Nt}from"lucide-react";import{jsx as K,jsxs as St}from"react/jsx-runtime";var It=/\.[^/.]+$/,Pe=({node:e,className:t,src:o,alt:n,...s})=>{let r=async()=>{if(o)try{let a=await(await fetch(o)).blob(),c=new URL(o,window.location.origin).pathname.split("/").pop()||"",d=c.split(".").pop(),g=c.includes(".")&&d!==void 0&&d.length<=4,f="";if(g)f=c;else{let h=a.type,m="png";h.includes("jpeg")||h.includes("jpg")?m="jpg":h.includes("png")?m="png":h.includes("svg")?m="svg":h.includes("gif")?m="gif":h.includes("webp")&&(m="webp"),f=`${(n||c||"image").replace(It,"")}.${m}`}A(f,a,a.type)}catch(i){console.error("Failed to download image:",i)}};return o?St("div",{className:"group relative my-4 inline-block","data-streamdown":"image-wrapper",children:[K("img",{alt:n,className:u("max-w-full rounded-lg",t),"data-streamdown":"image",src:o,...s}),K("div",{className:"pointer-events-none absolute inset-0 hidden rounded-lg bg-black/10 group-hover:block"}),K("button",{className:u("absolute right-2 bottom-2 flex h-8 w-8 cursor-pointer items-center justify-center rounded-md border border-border bg-background/90 shadow-sm backdrop-blur-sm transition-all duration-200 hover:bg-background","opacity-0 group-hover:opacity-100"),onClick:r,title:"Download image",type:"button",children:K(Nt,{size:14})})]}):null};import{Maximize2Icon as Lt,XIcon as xt}from"lucide-react";import{useContext as Ht,useEffect as ae,useState as z}from"react";import{Fragment as jt,jsx as T,jsxs as j}from"react/jsx-runtime";var _=0,Bt=()=>{_+=1,_===1&&(document.body.style.overflow="hidden")},At=()=>{_=Math.max(0,_-1),_===0&&(document.body.style.overflow="")},$t=async e=>{let o={...{startOnLoad:!1,theme:"default",securityLevel:"strict",fontFamily:"monospace",suppressErrorRendering:!0},...e},s=(await import("mermaid")).default;return s.initialize(o),s},Ne=({chart:e,config:t,onFullscreen:o,onExit:n,className:s,...r})=>{let[i,a]=z(!1),{isAnimating:l}=Ht(N),c=()=>{a(!i)};return ae(()=>{if(i){Bt();let d=g=>{g.key==="Escape"&&a(!1)};return document.addEventListener("keydown",d),()=>{document.removeEventListener("keydown",d),At()}}},[i]),ae(()=>{i?o==null||o():n&&n()},[i,o,n]),j(jt,{children:[T("button",{className:u("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",s),disabled:l,onClick:c,title:"View fullscreen",type:"button",...r,children:T(Lt,{size:14})}),i&&j("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-background/95 backdrop-blur-sm",onClick:c,onKeyDown:d=>{d.key==="Escape"&&c()},role:"button",tabIndex:0,children:[T("button",{className:"absolute top-4 right-4 z-10 rounded-md p-2 text-muted-foreground transition-all hover:bg-muted hover:text-foreground",onClick:c,title:"Exit fullscreen",type:"button",children:T(xt,{size:20})}),T("div",{className:"flex h-full w-full items-center justify-center p-12",onClick:d=>d.stopPropagation(),onKeyDown:d=>d.stopPropagation(),role:"presentation",children:T("div",{className:"max-h-full max-w-full",children:T(le,{chart:e,className:"[&>div]:my-0 [&_svg]:h-auto [&_svg]:min-h-[60vh] [&_svg]:w-auto [&_svg]:min-w-[60vw]",config:t})})})]})]})},le=({chart:e,className:t,config:o})=>{let[n,s]=z(null),[r,i]=z(!0),[a,l]=z(""),[c,d]=z("");if(ae(()=>{(async()=>{try{s(null),i(!0);let h=await $t(o),m=e.split("").reduce((w,C)=>(w<<5)-w+C.charCodeAt(0)|0,0),k=`mermaid-${Math.abs(m)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:y}=await h.render(k,e);l(y),d(y)}catch(h){if(!(c||a)){let m=h instanceof Error?h.message:"Failed to render Mermaid chart";s(m)}}finally{i(!1)}})()},[e,o]),r&&!a&&!c)return T("div",{className:u("my-4 flex justify-center p-4",t),children:j("div",{className:"flex items-center space-x-2 text-muted-foreground",children:[T("div",{className:"h-4 w-4 animate-spin rounded-full border-current border-b-2"}),T("span",{className:"text-sm",children:"Loading diagram..."})]})});if(n&&!a&&!c)return j("div",{className:u("rounded-lg border border-red-200 bg-red-50 p-4",t),children:[j("p",{className:"font-mono text-red-700 text-sm",children:["Mermaid Error: ",n]}),j("details",{className:"mt-2",children:[T("summary",{className:"cursor-pointer text-red-600 text-xs",children:"Show Code"}),T("pre",{className:"mt-2 overflow-x-auto rounded bg-red-100 p-2 text-red-800 text-xs",children:e})]})]});let g=a||c;return T("div",{"aria-label":"Mermaid chart",className:u("my-4 flex justify-center",t),dangerouslySetInnerHTML:{__html:g},role:"img"})};import{CheckIcon as Rt,CopyIcon as Dt,DownloadIcon as Et}from"lucide-react";import{useContext as Ie,useEffect as Se,useRef as ce,useState as de}from"react";import{jsx as I,jsxs as V}from"react/jsx-runtime";function Le(e){var r,i;let t=[],o=[],n=e.querySelectorAll("thead th");for(let a of n)t.push(((r=a.textContent)==null?void 0:r.trim())||"");let s=e.querySelectorAll("tbody tr");for(let a of s){let l=[],c=a.querySelectorAll("td");for(let d of c)l.push(((i=d.textContent)==null?void 0:i.trim())||"");o.push(l)}return{headers:t,rows:o}}function xe(e){let{headers:t,rows:o}=e,n=r=>r.includes(",")||r.includes('"')||r.includes(`
4
+ `)?`"${r.replace(/"/g,'""')}"`:r,s=[];t.length>0&&s.push(t.map(n).join(","));for(let r of o)s.push(r.map(n).join(","));return s.join(`
5
+ `)}function qt(e){let{headers:t,rows:o}=e,n=r=>r.replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r"),s=[];t.length>0&&s.push(t.map(n).join(" "));for(let r of o)s.push(r.map(n).join(" "));return s.join(`
6
+ `)}function Ot(e){let{headers:t,rows:o}=e;if(t.length===0)return"";let n=[],s=t.map(r=>r.replace(/\|/g,"\\|"));n.push(`| ${s.join(" | ")} |`),n.push(`| ${t.map(()=>"---").join(" | ")} |`);for(let r of o){let i=[...r];for(;i.length<t.length;)i.push("");let a=i.map(l=>l.replace(/\|/g,"\\|"));n.push(`| ${a.join(" | ")} |`)}return n.join(`
7
+ `)}var He=({children:e,className:t,onCopy:o,onError:n,timeout:s=2e3})=>{let[r,i]=de(!1),[a,l]=de(!1),c=ce(null),d=ce(0),{isAnimating:g}=Ie(N),f=async m=>{var k,y;if(typeof window=="undefined"||!((k=navigator==null?void 0:navigator.clipboard)!=null&&k.write)){n==null||n(new Error("Clipboard API not available"));return}try{let w=(y=c.current)==null?void 0:y.closest('[data-streamdown="table-wrapper"]'),C=w==null?void 0:w.querySelector("table");if(!C){n==null||n(new Error("Table not found"));return}let D=Le(C),W=m==="csv"?xe(D):qt(D),B=new ClipboardItem({"text/plain":new Blob([W],{type:"text/plain"}),"text/html":new Blob([C.outerHTML],{type:"text/html"})});await navigator.clipboard.write([B]),l(!0),i(!1),o==null||o(m),d.current=window.setTimeout(()=>l(!1),s)}catch(w){n==null||n(w)}};Se(()=>{let m=k=>{c.current&&!c.current.contains(k.target)&&i(!1)};return document.addEventListener("mousedown",m),()=>{document.removeEventListener("mousedown",m),window.clearTimeout(d.current)}},[]);let h=a?Rt:Dt;return V("div",{className:"relative",ref:c,children:[I("button",{className:u("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:g,onClick:()=>i(!r),title:"Copy table",type:"button",children:e!=null?e:I(h,{size:14})}),r&&V("div",{className:"absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg",children:[I("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>f("csv"),type:"button",children:"CSV"}),I("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>f("tsv"),type:"button",children:"TSV"})]})]})};var Be=({children:e,className:t,onDownload:o,onError:n})=>{let[s,r]=de(!1),i=ce(null),{isAnimating:a}=Ie(N),l=c=>{var d;try{let g=(d=i.current)==null?void 0:d.closest('[data-streamdown="table-wrapper"]'),f=g==null?void 0:g.querySelector("table");if(!f){n==null||n(new Error("Table not found"));return}let h=Le(f),m=c==="csv"?xe(h):Ot(h);A(`table.${c==="csv"?"csv":"md"}`,m,c==="csv"?"text/csv":"text/markdown"),r(!1),o==null||o(c)}catch(g){n==null||n(g)}};return Se(()=>{let c=d=>{i.current&&!i.current.contains(d.target)&&r(!1)};return document.addEventListener("mousedown",c),()=>{document.removeEventListener("mousedown",c)}},[]),V("div",{className:"relative",ref:i,children:[I("button",{className:u("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:a,onClick:()=>r(!s),title:"Download table",type:"button",children:e!=null?e:I(Et,{size:14})}),s&&V("div",{className:"absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg",children:[I("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>l("csv"),type:"button",children:"CSV"}),I("button",{className:"w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40",onClick:()=>l("markdown"),type:"button",children:"Markdown"})]})]})};import{Fragment as rt,jsx as p,jsxs as U}from"react/jsx-runtime";var zt=/language-([^\s]+)/;function G(e,t){if(!(e!=null&&e.position||t!=null&&t.position))return!0;if(!(e!=null&&e.position&&(t!=null&&t.position)))return!1;let o=e.position.start,n=t.position.start,s=e.position.end,r=t.position.end;return(o==null?void 0:o.line)===(n==null?void 0:n.line)&&(o==null?void 0:o.column)===(n==null?void 0:n.column)&&(s==null?void 0:s.line)===(r==null?void 0:r.line)&&(s==null?void 0:s.column)===(r==null?void 0:r.column)}function v(e,t){return e.className===t.className&&G(e.node,t.node)}var pe=(e,t)=>typeof e=="boolean"?e:e[t]!==!1,me=(e,t)=>{if(typeof e=="boolean")return e;let o=e.mermaid;return o===!1?!1:o===!0||o===void 0?!0:o[t]!==!1},ge=b(({children:e,className:t,node:o,...n})=>p("ol",{className:u("ml-4 list-outside list-decimal whitespace-normal",t),"data-streamdown":"ordered-list",...n,children:e}),(e,t)=>v(e,t));ge.displayName="MarkdownOl";var Ae=b(({children:e,className:t,node:o,...n})=>p("li",{className:u("py-1",t),"data-streamdown":"list-item",...n,children:e}),(e,t)=>e.className===t.className&&G(e.node,t.node));Ae.displayName="MarkdownLi";var $e=b(({children:e,className:t,node:o,...n})=>p("ul",{className:u("ml-4 list-outside list-disc whitespace-normal",t),"data-streamdown":"unordered-list",...n,children:e}),(e,t)=>v(e,t));$e.displayName="MarkdownUl";var je=b(({className:e,node:t,...o})=>p("hr",{className:u("my-6 border-border",e),"data-streamdown":"horizontal-rule",...o}),(e,t)=>v(e,t));je.displayName="MarkdownHr";var Re=b(({children:e,className:t,node:o,...n})=>p("span",{className:u("font-semibold",t),"data-streamdown":"strong",...n,children:e}),(e,t)=>v(e,t));Re.displayName="MarkdownStrong";var De=b(({children:e,className:t,href:o,node:n,...s})=>{let r=o==="streamdown:incomplete-link";return p("a",{className:u("wrap-anywhere font-medium text-primary underline",t),"data-incomplete":r,"data-streamdown":"link",href:o,rel:"noreferrer",target:"_blank",...s,children:e})},(e,t)=>v(e,t)&&e.href===t.href);De.displayName="MarkdownA";var Ee=b(({children:e,className:t,node:o,...n})=>p("h1",{className:u("mt-6 mb-2 font-semibold text-3xl",t),"data-streamdown":"heading-1",...n,children:e}),(e,t)=>v(e,t));Ee.displayName="MarkdownH1";var qe=b(({children:e,className:t,node:o,...n})=>p("h2",{className:u("mt-6 mb-2 font-semibold text-2xl",t),"data-streamdown":"heading-2",...n,children:e}),(e,t)=>v(e,t));qe.displayName="MarkdownH2";var Oe=b(({children:e,className:t,node:o,...n})=>p("h3",{className:u("mt-6 mb-2 font-semibold text-xl",t),"data-streamdown":"heading-3",...n,children:e}),(e,t)=>v(e,t));Oe.displayName="MarkdownH3";var ze=b(({children:e,className:t,node:o,...n})=>p("h4",{className:u("mt-6 mb-2 font-semibold text-lg",t),"data-streamdown":"heading-4",...n,children:e}),(e,t)=>v(e,t));ze.displayName="MarkdownH4";var _e=b(({children:e,className:t,node:o,...n})=>p("h5",{className:u("mt-6 mb-2 font-semibold text-base",t),"data-streamdown":"heading-5",...n,children:e}),(e,t)=>v(e,t));_e.displayName="MarkdownH5";var Ue=b(({children:e,className:t,node:o,...n})=>p("h6",{className:u("mt-6 mb-2 font-semibold text-sm",t),"data-streamdown":"heading-6",...n,children:e}),(e,t)=>v(e,t));Ue.displayName="MarkdownH6";var We=b(({children:e,className:t,node:o,...n})=>{let s=ue(Q),r=pe(s,"table");return U("div",{className:"my-4 flex flex-col space-y-2","data-streamdown":"table-wrapper",children:[r&&U("div",{className:"flex items-center justify-end gap-1",children:[p(He,{}),p(Be,{})]}),p("div",{className:"overflow-x-auto",children:p("table",{className:u("w-full border-collapse border border-border",t),"data-streamdown":"table",...n,children:e})})]})},(e,t)=>v(e,t));We.displayName="MarkdownTable";var Fe=b(({children:e,className:t,node:o,...n})=>p("thead",{className:u("bg-muted/80",t),"data-streamdown":"table-header",...n,children:e}),(e,t)=>v(e,t));Fe.displayName="MarkdownThead";var Xe=b(({children:e,className:t,node:o,...n})=>p("tbody",{className:u("divide-y divide-border bg-muted/40",t),"data-streamdown":"table-body",...n,children:e}),(e,t)=>v(e,t));Xe.displayName="MarkdownTbody";var Je=b(({children:e,className:t,node:o,...n})=>p("tr",{className:u("border-border border-b",t),"data-streamdown":"table-row",...n,children:e}),(e,t)=>v(e,t));Je.displayName="MarkdownTr";var Ke=b(({children:e,className:t,node:o,...n})=>p("th",{className:u("whitespace-nowrap px-4 py-2 text-left font-semibold text-sm",t),"data-streamdown":"table-header-cell",...n,children:e}),(e,t)=>v(e,t));Ke.displayName="MarkdownTh";var Ve=b(({children:e,className:t,node:o,...n})=>p("td",{className:u("px-4 py-2 text-sm",t),"data-streamdown":"table-cell",...n,children:e}),(e,t)=>v(e,t));Ve.displayName="MarkdownTd";var Ge=b(({children:e,className:t,node:o,...n})=>p("blockquote",{className:u("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",t),"data-streamdown":"blockquote",...n,children:e}),(e,t)=>v(e,t));Ge.displayName="MarkdownBlockquote";var Qe=b(({children:e,className:t,node:o,...n})=>p("sup",{className:u("text-sm",t),"data-streamdown":"superscript",...n,children:e}),(e,t)=>v(e,t));Qe.displayName="MarkdownSup";var Ze=b(({children:e,className:t,node:o,...n})=>p("sub",{className:u("text-sm",t),"data-streamdown":"subscript",...n,children:e}),(e,t)=>v(e,t));Ze.displayName="MarkdownSub";var Ye=b(({children:e,className:t,node:o,...n})=>{if("data-footnotes"in n){let r=l=>{var f,h;if(!R(l))return!1;let c=Array.isArray(l.props.children)?l.props.children:[l.props.children],d=!1,g=!1;for(let m of c)if(m){if(typeof m=="string")m.trim()!==""&&(d=!0);else if(R(m))if(((f=m.props)==null?void 0:f["data-footnote-backref"])!==void 0)g=!0;else{let k=Array.isArray(m.props.children)?m.props.children:[m.props.children];for(let y of k){if(typeof y=="string"&&y.trim()!==""){d=!0;break}if(R(y)&&((h=y.props)==null?void 0:h["data-footnote-backref"])===void 0){d=!0;break}}}}return g&&!d},i=Array.isArray(e)?e.map(l=>{if(!R(l))return l;if(l.type===ge){let d=(Array.isArray(l.props.children)?l.props.children:[l.props.children]).filter(g=>!r(g));return d.length===0?null:{...l,props:{...l.props,children:d}}}return l}):e;return(Array.isArray(i)?i.some(l=>l!==null):i!==null)?p("section",{className:t,...n,children:i}):null}return p("section",{className:t,...n,children:e})},(e,t)=>v(e,t));Ye.displayName="MarkdownSection";var _t=({node:e,className:t,children:o,...n})=>{var g,f,h;let s=((g=e==null?void 0:e.position)==null?void 0:g.start.line)===((f=e==null?void 0:e.position)==null?void 0:f.end.line),r=ue(he),i=ue(Q);if(s)return p("code",{className:u("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...n,children:o});let a=t==null?void 0:t.match(zt),l=(h=a==null?void 0:a.at(1))!=null?h:"",c="";if(R(o)&&o.props&&typeof o.props=="object"&&"children"in o.props&&typeof o.props.children=="string"?c=o.props.children:typeof o=="string"&&(c=o),l==="mermaid"){let m=pe(i,"mermaid"),k=me(i,"download"),y=me(i,"copy"),w=me(i,"fullscreen");return U("div",{className:u("group relative my-4 h-auto rounded-xl border p-4",t),"data-streamdown":"mermaid-block",children:[m&&(k||y||w)&&U("div",{className:"flex items-center justify-end gap-2",children:[k&&p(re,{code:c,language:l}),y&&p(se,{code:c}),w&&p(Ne,{chart:c,config:r})]}),p(le,{chart:c,config:r})]})}let d=pe(i,"code");return p(Me,{className:u("overflow-x-auto border-border border-t",t),code:c,"data-language":l,"data-streamdown":"code-block",language:l,preClassName:"overflow-x-auto font-mono text-xs p-4 bg-muted/40",children:d&&U(rt,{children:[p(re,{code:c,language:l}),p(se,{})]})})},et=b(_t,(e,t)=>e.className===t.className&&G(e.node,t.node));et.displayName="MarkdownCode";var tt=b(Pe,(e,t)=>e.className===t.className&&G(e.node,t.node));tt.displayName="MarkdownImg";var ot=b(({children:e,className:t,node:o,...n})=>{var i;let r=(Array.isArray(e)?e:[e]).filter(a=>a!=null&&a!=="");return r.length===1&&R(r[0])&&((i=r[0].props.node)==null?void 0:i.tagName)==="img"?p(rt,{children:e}):p("p",{className:t,...n,children:e})},(e,t)=>v(e,t));ot.displayName="MarkdownParagraph";var nt={ol:ge,li:Ae,ul:$e,hr:je,strong:Re,a:De,h1:Ee,h2:qe,h3:Oe,h4:ze,h5:_e,h6:Ue,table:We,thead:Fe,tbody:Xe,tr:Je,th:Ke,td:Ve,blockquote:Ge,code:et,img:tt,pre:({children:e})=>e,sup:Qe,sub:Ze,p:ot,section:Ye};import{Lexer as Ut}from"marked";var Wt=/\[\^[^\]\s]{1,200}\](?!:)/,Ft=/\[\^[^\]\s]{1,200}\]:/,Xt=/<\/(\w+)>/,Jt=/<(\w+)[\s>]/,fe=e=>{let t=Wt.test(e),o=Ft.test(e);if(t||o)return[e];let n=Ut.lex(e,{gfm:!0}),s=[],r=[];for(let i of n){let a=i.raw;if(r.length>0){if(s[s.length-1]+=a,i.type==="html"){let l=a.match(Xt);if(l){let c=l[1];r.at(-1)===c&&r.pop()}}continue}if(i.type==="html"&&i.block){let l=a.match(Jt);if(l){let c=l[1];a.includes(`</${c}>`)||r.push(c)}}if(a.trim()==="$$"&&s.length>0){let l=s.at(-1);if(!l){s.push(a);continue}let c=l.trimStart().startsWith("$$"),d=(l.match(/\$\$/g)||[]).length;if(c&&d%2===1){s[s.length-1]=l+a;continue}}if(s.length>0&&a.trimEnd().endsWith("$$")){let l=s.at(-1);if(!l){s.push(a);continue}let c=l.trimStart().startsWith("$$"),d=(l.match(/\$\$/g)||[]).length,g=(a.match(/\$\$/g)||[]).length;if(c&&d%2===1&&!a.trimStart().startsWith("$$")&&g===1){s[s.length-1]=l+a;continue}}s.push(a)}return s};var Kt=/(!?\[)([^\]]*?)$/,Vt=/(\*\*)([^*]*?)$/,Gt=/(__)([^_]*?)$/,Qt=/(\*\*\*)([^*]*?)$/,Zt=/(\*)([^*]*?)$/,Yt=/(_)([^_]*?)$/,eo=/(`)([^`]*?)$/,to=/(~~)([^~]*?)$/,oo=/(!?)\[([^\]]+)\]\(([^)]+)$/,x=/^[\s_~*`]*$/,st=/^[\s]*[-*+][\s]+$/,S=/[\p{L}\p{N}_]/u,no=/\n+$/,ro=/^```[^`\n]*```?$/,so=/^\*{4,}$/,Z=e=>{let t=(e.match(/```/g)||[]).length;return t>0&&t%2===0&&e.includes(`
8
+ `)},io=e=>{let t=e.match(oo);if(t){let n=t[1]==="!",s=t[2],r=t[3],i=e.lastIndexOf(`${n?"!":""}[${s}](${r}`),a=e.substring(0,i);return n?a:`${a}[${s}](streamdown:incomplete-link)`}let o=e.match(Kt);if(o){if(o[1].startsWith("!")){let s=e.lastIndexOf(o[1]);return e.substring(0,s)}return`${e}](streamdown:incomplete-link)`}return e},ao=e=>{if(Z(e))return e;let t=e.match(Vt);if(t){let o=t[2];if(!o||x.test(o))return e;let n=e.lastIndexOf(t[1]),r=e.substring(0,n).lastIndexOf(`
9
+ `),i=r===-1?0:r+1,a=e.substring(i,n);if(st.test(a)&&o.includes(`
10
+ `))return e;if((e.match(/\*\*/g)||[]).length%2===1)return`${e}**`}return e},lo=e=>{let t=e.match(Gt);if(t){let o=t[2];if(!o||x.test(o))return e;let n=e.lastIndexOf(t[1]),r=e.substring(0,n).lastIndexOf(`
11
+ `),i=r===-1?0:r+1,a=e.substring(i,n);if(st.test(a)&&o.includes(`
12
+ `))return e;if((e.match(/__/g)||[]).length%2===1)return`${e}__`}return e},co=e=>e.split("").reduce((t,o,n)=>{if(o==="*"){let s=e[n-1],r=e[n+1];if(s==="\\"||s&&r&&S.test(s)&&S.test(r))return t;let i=n;for(let l=n-1;l>=0;l--){if(e[l]===`
13
+ `){i=l+1;break}if(l===0){i=0;break}}if(e.substring(i,n).trim()===""&&(r===" "||r===" "))return t;if(s!=="*"&&r!=="*")return t+1}return t},0),mo=e=>{if(Z(e))return e;if(e.match(Zt)){let o=-1;for(let r=0;r<e.length;r++)if(e[r]==="*"&&e[r-1]!=="*"&&e[r+1]!=="*"&&e[r-1]!=="\\"){let i=r>0?e[r-1]:"",a=r<e.length-1?e[r+1]:"";if(i&&a&&S.test(i)&&S.test(a))continue;o=r;break}if(o===-1)return e;let n=e.substring(o+1);if(!n||x.test(n))return e;if(co(e)%2===1)return`${e}*`}return e},it=(e,t)=>{let o=!1,n=!1;for(let s=0;s<e.length&&s<t;s+=1){if(e[s]==="\\"&&e[s+1]==="$"){s+=1;continue}e[s]==="$"&&(e[s+1]==="$"?(n=!n,s+=1,o=!1):n||(o=!o))}return o||n},uo=e=>e.split("").reduce((t,o,n)=>{if(o==="_"){let s=e[n-1],r=e[n+1];if(s==="\\"||it(e,n)||s&&r&&S.test(s)&&S.test(r))return t;if(s!=="_"&&r!=="_")return t+1}return t},0),po=e=>{if(Z(e))return e;if(e.match(Yt)){let o=-1;for(let r=0;r<e.length;r++)if(e[r]==="_"&&e[r-1]!=="_"&&e[r+1]!=="_"&&e[r-1]!=="\\"&&!it(e,r)){let i=r>0?e[r-1]:"",a=r<e.length-1?e[r+1]:"";if(i&&a&&S.test(i)&&S.test(a))continue;o=r;break}if(o===-1)return e;let n=e.substring(o+1);if(!n||x.test(n))return e;if(uo(e)%2===1){let r=e.match(no);return r?`${e.slice(0,-r[0].length)}_${r[0]}`:`${e}_`}}return e},go=(e,t)=>{let o=e.substring(t,t+3)==="```",n=t>0&&e.substring(t-1,t+2)==="```",s=t>1&&e.substring(t-2,t+1)==="```";return o||n||s},ho=e=>{let t=0;for(let o=0;o<e.length;o+=1)e[o]==="`"&&!go(e,o)&&(t+=1);return t},fo=e=>{if(e.match(ro)&&!e.includes(`
14
+ `))return e.endsWith("``")&&!e.endsWith("```")?`${e}\``:e;let o=(e.match(/```/g)||[]).length,n=o%2===1;if(o>0&&o%2===0&&e.includes(`
15
+ `)||(e.endsWith("```\n")||e.endsWith("```"))&&o%2===0)return e;let s=e.match(eo);if(s&&!n){let r=s[2];if(!r||x.test(r))return e;if(ho(e)%2===1)return`${e}\``}return e},bo=e=>{let t=e.match(to);if(t){let o=t[2];if(!o||x.test(o))return e;if((e.match(/~~/g)||[]).length%2===1)return`${e}~~`}return e};var wo=e=>{if((e.match(/\$\$/g)||[]).length%2===0)return e;let o=e.indexOf("$$");return o!==-1&&e.indexOf(`
13
16
  `,o)!==-1&&!e.endsWith(`
14
17
  `)?`${e}
15
- $$`:`${e}$$`},Lt=e=>{let t=0,o=e.match(/\*+/g)||[];for(let s of o){let r=s.length;r>=3&&(t+=Math.floor(r/3))}return t},St=e=>{if(x(e)||/^\*{4,}$/.test(e))return e;let t=e.match(pt);if(t){let o=t[2];if(!o||/^[\s_~*`]*$/.test(o))return e;if(Lt(e)%2===1)return`${e}***`}return e},Ae=e=>{if(!e||typeof e!="string")return e;let t=e,o=bt(t);return o.endsWith("](streamdown:incomplete-link)")?o:(t=o,t=St(t),t=kt(t),t=wt(t),t=vt(t),t=Tt(t),t=Pt(t),t=It(t),t=Bt(t),t)};import{jsx as P}from"react/jsx-runtime";var qt=qe.default||qe,Dt=qt(Ht),O=J(["github-light","github-dark"]),z=J(void 0),H=J(!0),Et={singleDollarTextMath:!1},_t={},Ee=De(({content:e,shouldParseIncompleteMarkdown:t,...o})=>{let s=X(()=>typeof e=="string"&&t?Ae(e.trim()):e,[e,t]);return P(Dt,{...o,children:s})},(e,t)=>e.content===t.content);Ee.displayName="Block";var Ot=De(({children:e,allowedImagePrefixes:t=["*"],allowedLinkPrefixes:o=["*"],defaultOrigin:s,parseIncompleteMarkdown:r=!0,components:n,rehypePlugins:a,remarkPlugins:l,className:i,shikiTheme:c=["github-light","github-dark"],mermaidConfig:m,controls:h=!0,...g})=>{let u=$t(),f=X(()=>je(typeof e=="string"?e:""),[e]),w=X(()=>()=>xt({errorColor:"var(--color-muted-foreground)"}),[]);return P(O.Provider,{value:c,children:P(z.Provider,{value:m,children:P(H.Provider,{value:h,children:P("div",{className:d("space-y-4",i),...g,children:f.map((v,M)=>P(Ee,{allowedImagePrefixes:t,allowedLinkPrefixes:o,components:{...xe,...n},content:v,defaultOrigin:s,rehypePlugins:[jt,w,...a!=null?a:[]],remarkPlugins:[[Rt,_t],[At,Et],...l!=null?l:[]],shouldParseIncompleteMarkdown:r},`${u}-block_${M}`))})})})})},(e,t)=>e.children===t.children&&e.shikiTheme===t.shikiTheme);Ot.displayName="Streamdown";export{H as ControlsContext,z as MermaidConfigContext,O as ShikiThemeContext,Ot as Streamdown};
18
+ $$`:`${e}$$`},yo=e=>{let t=0,o=e.match(/\*+/g)||[];for(let n of o){let s=n.length;s>=3&&(t+=Math.floor(s/3))}return t},ko=e=>{if(Z(e)||so.test(e))return e;let t=e.match(Qt);if(t){let o=t[2];if(!o||x.test(o))return e;if(yo(e)%2===1)return`${e}***`}return e},be=e=>{if(!e||typeof e!="string")return e;let t=e,o=io(t);return o.endsWith("](streamdown:incomplete-link)")?o:(t=o,t=ko(t),t=ao(t),t=lo(t),t=mo(t),t=po(t),t=fo(t),t=bo(t),t=wo(t),t)};import{defaultUrlTransform as jn}from"react-markdown";import{jsx as H}from"react/jsx-runtime";var xo={harden:[Mo,{allowedImagePrefixes:["*"],allowedLinkPrefixes:["*"],defaultOrigin:void 0,allowDataImages:!0}],raw:Po,katex:[ye,{errorColor:"var(--color-muted-foreground)"}]},Ho={gfm:[So,{}],math:[Lo,{singleDollarTextMath:!1}],cjkFriendly:[No,{}],cjkFriendlyGfmStrikethrough:[Io,{}]},ie=Y(["github-light","github-dark"]),he=Y(void 0),Q=Y(!0),N=Y({isAnimating:!1}),lt=at(({content:e,shouldParseIncompleteMarkdown:t,...o})=>{let n=we(()=>typeof e=="string"&&t?be(e.trim()):e,[e,t]);return H(Co,{...o,children:n})},(e,t)=>e.content===t.content);lt.displayName="Block";var Bo=["github-light","github-dark"],Ao=at(({children:e,parseIncompleteMarkdown:t=!0,components:o,rehypePlugins:n=Object.values(xo),remarkPlugins:s=Object.values(Ho),className:r,shikiTheme:i=Bo,mermaidConfig:a,controls:l=!0,isAnimating:c=!1,urlTransform:d=m=>m,BlockComponent:g=lt,parseMarkdownIntoBlocksFn:f=fe,...h})=>{let m=To(),k=we(()=>f(typeof e=="string"?e:""),[e,f]);vo(()=>{Array.isArray(n)&&n.some(w=>Array.isArray(w)?w[0]===ye:w===ye)&&import("katex/dist/katex.min.css")},[n]);let y=we(()=>({isAnimating:c}),[c]);return H(ie.Provider,{value:i,children:H(he.Provider,{value:a,children:H(Q.Provider,{value:l,children:H(N.Provider,{value:y,children:H("div",{className:u("space-y-4",r),children:k.map((w,C)=>H(g,{components:{...nt,...o},content:w,index:C,rehypePlugins:n,remarkPlugins:s,shouldParseIncompleteMarkdown:t,urlTransform:d,...h},`${m}-block-${C}`))})})})})})},(e,t)=>e.children===t.children&&e.shikiTheme===t.shikiTheme&&e.isAnimating===t.isAnimating);Ao.displayName="Streamdown";export{lt as Block,Q as ControlsContext,he as MermaidConfigContext,ie as ShikiThemeContext,Ao as Streamdown,N as StreamdownRuntimeContext,xo as defaultRehypePlugins,Ho as defaultRemarkPlugins,jn as defaultUrlTransform,be as parseIncompleteMarkdown,fe as parseMarkdownIntoBlocks};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "streamdown",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -36,6 +36,7 @@
36
36
  "react": "^19.1.1",
37
37
  "react-dom": "^19.1.1",
38
38
  "tsup": "^8.5.0",
39
+ "unified": "^11.0.5",
39
40
  "vitest": "^3.2.4"
40
41
  },
41
42
  "peerDependencies": {
@@ -43,14 +44,16 @@
43
44
  },
44
45
  "dependencies": {
45
46
  "clsx": "^2.1.1",
46
- "harden-react-markdown": "^1.0.5",
47
47
  "katex": "^0.16.22",
48
48
  "lucide-react": "^0.542.0",
49
49
  "marked": "^16.2.1",
50
50
  "mermaid": "^11.11.0",
51
51
  "react-markdown": "^10.1.0",
52
+ "rehype-harden": "^1.1.5",
52
53
  "rehype-katex": "^7.0.1",
53
54
  "rehype-raw": "^7.0.0",
55
+ "remark-cjk-friendly": "^1.2.3",
56
+ "remark-cjk-friendly-gfm-strikethrough": "^1.2.3",
54
57
  "remark-gfm": "^4.0.1",
55
58
  "remark-math": "^6.0.0",
56
59
  "shiki": "^3.12.2",