{"version":3,"sources":["../src/katex/index.tsx"],"names":["jsx","React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAI,YAAA,GAAuD,IAAA;AAE3D,eAAe,QAAA,GAA4C;AACzD,EAAA,IAAI,CAAC,YAAA,EAAc,YAAA,GAAe,OAAO,OAAO,CAAA;AAChD,EAAA,OAAO,YAAA;AACT;AAGO,IAAM,iBAAA,GAAkC;AAAA,EAC7C,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,GAAA;AAAA,EACV,KAAA,CAAM,MAAM,GAAA,EAAK;AACf,IAAA,IAAI,IAAA,CAAK,GAAG,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AAE9B,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,KAAM,KAAK,OAAO,IAAA;AAElC,IAAA,IAAI,IAAI,GAAA,GAAM,CAAA;AACd,IAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,KAAK,CAAC,CAAA,KAAM,QAAQ,CAAA,GAAI,CAAA,GAAI,KAAK,MAAA,EAAQ;AAC3C,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,EAAM,OAAO,IAAA;AAC7B,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACnB,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,EAAE,IAAA,EAAK;AAC1C,QAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,IAAI,CAAA,GAAI,GAAA;AAAA,UAClB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,KAAA;AAAM,SACxC;AAAA,MACF;AACA,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,OAAO,KAAA,EAAO;AACZ,IAAA,uBAAOA,cAAA,CAAC,WAAA,EAAA,EAAY,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,EAC1C;AACF;AAGO,IAAM,gBAAA,GAAgC;AAAA,EAC3C,IAAA,EAAM,MAAA;AAAA,EACN,UAAU,IAAA,EAAM;AACd,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,IAAA,EAAM;AAExB,MAAA,OAAO,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,IAAI,IAAA,EAAM,EAAE,UAAA,EAAY,MAAA,EAAO,EAAE;AAAA,IACnE;AAEA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA;AACzC,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AAAA,QACpB,IAAA,EAAM,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,QAC3B,gBAAA,EAAkB;AAAA,OACpB;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,QAAQ,IAAA,EAAM;AACZ,IAAA,OAAO,IAAA,CAAK,MAAK,KAAM,IAAA;AAAA,EACzB,CAAA;AAAA,EACA,OAAO,KAAA,EAAO;AACZ,IAAA,uBAAOA,cAAA,CAAC,UAAA,EAAA,EAAW,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,EACzC;AACF;AAEA,SAAS,WAAA,CAAY,EAAE,GAAA,EAAI,EAAuC;AAChE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUC,0BAAwB,IAAI,CAAA;AAC1D,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,QAAA,EAAS,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AAC5B,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,cAAA,CAAe,GAAA,EAAK,EAAE,YAAA,EAAc,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,CAAA;AACvF,QAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,MACb,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACR,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,uBAAOD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAqC,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,EAClE;AACA,EAAA,uBAAOA,cAAA,CAAC,UAAK,SAAA,EAAU,0BAAA,EAA2B,yBAAyB,EAAE,MAAA,EAAQ,MAAK,EAAG,CAAA;AAC/F;AAEA,SAAS,UAAA,CAAW,EAAE,GAAA,EAAI,EAAuC;AAC/D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUC,0BAAwB,IAAI,CAAA;AAC1D,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,QAAA,EAAS,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AAC5B,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,cAAA,CAAe,GAAA,EAAK,EAAE,YAAA,EAAc,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,CAAA;AACtF,QAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,MACb,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACR,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,uBAAOD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,EACzD;AACA,EAAA,uBAAOA,cAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA0B,yBAAyB,EAAE,MAAA,EAAQ,MAAK,EAAG,CAAA;AAC7F","file":"katex.cjs","sourcesContent":["/**\n * stream-md/katex — math rendering via KaTeX (lazy).\n *\n * Provides:\n *  - `katexInlinePlugin`: detects `$...$` inline math\n *  - `katexBlockPlugin`:  detects `$$...$$` block math\n *\n * Both render using KaTeX once the inner content is closed (so streaming\n * partial LaTeX doesn't trigger broken renders).\n *\n * KaTeX is an *optional* peer dependency — install it to enable.\n *\n * @example\n * ```tsx\n * import 'katex/dist/katex.min.css';\n * import { StreamMD } from 'stream-md';\n * import { katexInlinePlugin, katexBlockPlugin } from 'stream-md/katex';\n *\n * <StreamMD\n *   text={text}\n *   inlinePlugins={[katexInlinePlugin]}\n *   blockPlugins={[katexBlockPlugin]}\n * />\n * ```\n */\n\nimport * as React from \"react\";\nimport type { BlockPlugin, InlinePlugin } from \"../parser/types\";\n\nlet katexPromise: Promise<typeof import(\"katex\")> | null = null;\n\nasync function getKatex(): Promise<typeof import(\"katex\")> {\n  if (!katexPromise) katexPromise = import(\"katex\");\n  return katexPromise;\n}\n\n/** Inline `$...$` math. */\nexport const katexInlinePlugin: InlinePlugin = {\n  name: \"math\",\n  triggers: \"$\",\n  match(text, pos) {\n    if (text[pos] !== \"$\") return null;\n    // Skip `$$` — that's a block, handled by katexBlockPlugin.\n    if (text[pos + 1] === \"$\") return null;\n    // Find a closing `$` that isn't escaped, on the same line.\n    let i = pos + 1;\n    while (i < text.length) {\n      if (text[i] === \"\\\\\" && i + 1 < text.length) {\n        i += 2;\n        continue;\n      }\n      if (text[i] === \"\\n\") return null;\n      if (text[i] === \"$\") {\n        const inner = text.slice(pos + 1, i).trim();\n        if (!inner) return null;\n        return {\n          consumed: i + 1 - pos,\n          token: { type: \"math\", content: inner },\n        };\n      }\n      i++;\n    }\n    return null;\n  },\n  render(token) {\n    return <KatexInline tex={token.content} />;\n  },\n};\n\n/** Block `$$...$$` math. */\nexport const katexBlockPlugin: BlockPlugin = {\n  name: \"math\",\n  openMatch(line) {\n    if (line.trim() === \"$$\") {\n      // Open a math block; closes on next `$$` line.\n      return { type: \"math\", content: \"\", meta: { pluginName: \"math\" } };\n    }\n    // Single-line `$$ ... $$`\n    const m = line.match(/^\\$\\$(.+?)\\$\\$\\s*$/);\n    if (m) {\n      return {\n        type: \"math\",\n        content: m[1]!.trim(),\n        meta: { pluginName: \"math\" },\n        closeImmediately: true,\n      };\n    }\n    return null;\n  },\n  isClose(line) {\n    return line.trim() === \"$$\";\n  },\n  render(block) {\n    return <KatexBlock tex={block.content} />;\n  },\n};\n\nfunction KatexInline({ tex }: { tex: string }): React.JSX.Element {\n  const [html, setHtml] = React.useState<string | null>(null);\n  React.useEffect(() => {\n    let cancelled = false;\n    void getKatex().then((mod) => {\n      if (cancelled) return;\n      try {\n        const out = mod.default.renderToString(tex, { throwOnError: false, displayMode: false });\n        setHtml(out);\n      } catch {\n        setHtml(null);\n      }\n    });\n    return () => {\n      cancelled = true;\n    };\n  }, [tex]);\n  if (html === null) {\n    return <code className=\"smd-inline-code smd-math-fallback\">{tex}</code>;\n  }\n  return <span className=\"smd-math smd-math-inline\" dangerouslySetInnerHTML={{ __html: html }} />;\n}\n\nfunction KatexBlock({ tex }: { tex: string }): React.JSX.Element {\n  const [html, setHtml] = React.useState<string | null>(null);\n  React.useEffect(() => {\n    let cancelled = false;\n    void getKatex().then((mod) => {\n      if (cancelled) return;\n      try {\n        const out = mod.default.renderToString(tex, { throwOnError: false, displayMode: true });\n        setHtml(out);\n      } catch {\n        setHtml(null);\n      }\n    });\n    return () => {\n      cancelled = true;\n    };\n  }, [tex]);\n  if (html === null) {\n    return <pre className=\"smd-pre smd-math-fallback\">{tex}</pre>;\n  }\n  return <div className=\"smd-math smd-math-block\" dangerouslySetInnerHTML={{ __html: html }} />;\n}\n"]}