@mieweb/ui 0.6.1-dev.149 → 0.6.1-dev.150

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.
Files changed (82) hide show
  1. package/dist/brands/index.cjs +22 -22
  2. package/dist/brands/index.js +5 -5
  3. package/dist/chunk-2T4JU5RH.cjs +1156 -0
  4. package/dist/chunk-2T4JU5RH.cjs.map +1 -0
  5. package/dist/chunk-3SSXDWD7.js +363 -0
  6. package/dist/chunk-3SSXDWD7.js.map +1 -0
  7. package/dist/{chunk-MARLXJQO.cjs → chunk-6R2ZPDN7.cjs} +7 -7
  8. package/dist/{chunk-MARLXJQO.cjs.map → chunk-6R2ZPDN7.cjs.map} +1 -1
  9. package/dist/{chunk-WHUD3XHR.cjs → chunk-7PA26KBF.cjs} +15 -3
  10. package/dist/chunk-7PA26KBF.cjs.map +1 -0
  11. package/dist/chunk-ASLZUFH4.js +1967 -0
  12. package/dist/chunk-ASLZUFH4.js.map +1 -0
  13. package/dist/chunk-FADQVM4M.cjs +2017 -0
  14. package/dist/chunk-FADQVM4M.cjs.map +1 -0
  15. package/dist/{chunk-DFT7TYKL.cjs → chunk-H4T5T65N.cjs} +6 -3
  16. package/dist/chunk-H4T5T65N.cjs.map +1 -0
  17. package/dist/chunk-I6CY5C6A.js +12 -0
  18. package/dist/chunk-I6CY5C6A.js.map +1 -0
  19. package/dist/chunk-JFLC7SHM.cjs +35 -0
  20. package/dist/chunk-JFLC7SHM.cjs.map +1 -0
  21. package/dist/chunk-LZPPH5BW.cjs +368 -0
  22. package/dist/chunk-LZPPH5BW.cjs.map +1 -0
  23. package/dist/{chunk-3OHVUXDG.js → chunk-M7BLVBL4.js} +6 -3
  24. package/dist/chunk-M7BLVBL4.js.map +1 -0
  25. package/dist/chunk-PM2I3QKM.cjs +1419 -0
  26. package/dist/chunk-PM2I3QKM.cjs.map +1 -0
  27. package/dist/{chunk-TW6DXMSD.js → chunk-R6PBBPU3.js} +2 -2
  28. package/dist/{chunk-TW6DXMSD.js.map → chunk-R6PBBPU3.js.map} +1 -1
  29. package/dist/{chunk-33PO3J4O.js → chunk-RXY5SD3O.js} +15 -3
  30. package/dist/chunk-RXY5SD3O.js.map +1 -0
  31. package/dist/{chunk-AEGYWRSL.js → chunk-TXYTMU3K.js} +3 -3
  32. package/dist/{chunk-AEGYWRSL.js.map → chunk-TXYTMU3K.js.map} +1 -1
  33. package/dist/chunk-UHPQYBXQ.js +1124 -0
  34. package/dist/chunk-UHPQYBXQ.js.map +1 -0
  35. package/dist/chunk-XQE26F3G.js +1383 -0
  36. package/dist/chunk-XQE26F3G.js.map +1 -0
  37. package/dist/{chunk-26YNFCOC.cjs → chunk-Z6NRP4Z5.cjs} +2 -2
  38. package/dist/{chunk-26YNFCOC.cjs.map → chunk-Z6NRP4Z5.cjs.map} +1 -1
  39. package/dist/components/Dropdown/index.cjs +7 -7
  40. package/dist/components/Dropdown/index.d.cts +1 -1
  41. package/dist/components/Dropdown/index.d.ts +1 -1
  42. package/dist/components/Dropdown/index.js +1 -1
  43. package/dist/components/RichTextEditor/index.cjs +5 -5
  44. package/dist/components/RichTextEditor/index.js +2 -2
  45. package/dist/components/SuperChat/index.cjs +1319 -0
  46. package/dist/components/SuperChat/index.cjs.map +1 -0
  47. package/dist/components/SuperChat/index.d.cts +189 -0
  48. package/dist/components/SuperChat/index.d.ts +189 -0
  49. package/dist/components/SuperChat/index.js +1282 -0
  50. package/dist/components/SuperChat/index.js.map +1 -0
  51. package/dist/components/SuperChat/plugins/index.cjs +1221 -0
  52. package/dist/components/SuperChat/plugins/index.cjs.map +1 -0
  53. package/dist/components/SuperChat/plugins/index.d.cts +253 -0
  54. package/dist/components/SuperChat/plugins/index.d.ts +253 -0
  55. package/dist/components/SuperChat/plugins/index.js +1181 -0
  56. package/dist/components/SuperChat/plugins/index.js.map +1 -0
  57. package/dist/datavis.cjs +18 -362
  58. package/dist/datavis.cjs.map +1 -1
  59. package/dist/datavis.js +1 -361
  60. package/dist/datavis.js.map +1 -1
  61. package/dist/index.cjs +1297 -5412
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +44 -240
  64. package/dist/index.d.ts +44 -240
  65. package/dist/index.js +759 -5037
  66. package/dist/index.js.map +1 -1
  67. package/dist/nitroTableGrid-FWRCDE4N.js +22 -0
  68. package/dist/nitroTableGrid-FWRCDE4N.js.map +1 -0
  69. package/dist/nitroTableGrid-IY75TQJ2.cjs +44 -0
  70. package/dist/nitroTableGrid-IY75TQJ2.cjs.map +1 -0
  71. package/dist/styles.css +1 -1
  72. package/dist/tailwind-preset.cjs +4 -4
  73. package/dist/tailwind-preset.js +1 -1
  74. package/dist/types-BFFgW6qy.d.ts +240 -0
  75. package/dist/types-BzeY_kYO.d.cts +242 -0
  76. package/dist/types-BzeY_kYO.d.ts +242 -0
  77. package/dist/types-CRt5IPNL.d.cts +240 -0
  78. package/package.json +41 -4
  79. package/dist/chunk-33PO3J4O.js.map +0 -1
  80. package/dist/chunk-3OHVUXDG.js.map +0 -1
  81. package/dist/chunk-DFT7TYKL.cjs.map +0 -1
  82. package/dist/chunk-WHUD3XHR.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/SuperChat/plugins/code.tsx","../../../../src/components/SuperChat/plugins/math.tsx","../../../../src/components/SuperChat/plugins/genui.tsx","../../../../src/components/SuperChat/plugins/mermaid.tsx","../../../../src/components/SuperChat/plugins/image.tsx","../../../../src/components/SuperChat/plugins/nitroTable.tsx","../../../../src/components/SuperChat/render/attachmentCache.ts","../../../../src/components/SuperChat/plugins/attachment.tsx"],"names":["React","jsxs","jsx","textOf","PendingCard","InertFallback","React3","React4","React5","React6","Fragment","parsePayload"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SuperChat code plugin (opt-in).\n *\n * Syntax-highlights fenced code blocks with `rehype-highlight` (emits `.hljs-*`\n * classes that map to `--mieweb-*` theme tokens for light/dark), and adds a copy\n * button. `shiki` is reserved as an upgrade path if highlight fidelity disappoints.\n */\n\nimport * as React from 'react';\nimport rehypeHighlight from 'rehype-highlight';\nimport { cn } from '../../../utils/cn';\nimport type { SuperChatRenderPlugin } from '../types';\n\nfunction CopyablePre({\n node: _node,\n ...props\n}: React.ComponentProps<'pre'> & { node?: unknown }) {\n const ref = React.useRef<React.ComponentRef<'pre'>>(null);\n const [copied, setCopied] = React.useState(false);\n\n const onCopy = React.useCallback(() => {\n const text = ref.current?.innerText ?? '';\n if (!text) return;\n // `navigator.clipboard` is undefined in non-secure contexts; guard the\n // optional-chained call (which would be `undefined`, not a promise) and\n // swallow rejection so copy stays best-effort and never breaks render.\n const copy = navigator.clipboard?.writeText(text);\n if (!copy) return;\n void copy.then(\n () => {\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1500);\n },\n () => {\n /* clipboard write rejected (permissions / non-secure context) */\n }\n );\n }, []);\n\n return (\n <div data-slot=\"superchat-code\" className=\"group relative my-2\">\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? 'Copied' : 'Copy code'}\n className=\"absolute top-2 right-2 rounded-md bg-neutral-700/80 px-2 py-1 text-xs text-neutral-100 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-neutral-600 focus-visible:opacity-100\"\n >\n {copied ? 'Copied' : 'Copy'}\n </button>\n <pre\n {...props}\n ref={ref}\n className={cn(\n 'overflow-x-auto rounded-lg bg-neutral-900 p-3 text-sm text-neutral-100 dark:bg-neutral-950',\n props.className\n )}\n />\n </div>\n );\n}\n\n/** Create the syntax-highlighting + copy-button render plugin. */\nexport function createCodePlugin(): SuperChatRenderPlugin {\n return {\n name: 'code',\n // `detect: false` + ignoreMissing keeps it predictable for streamed output.\n rehypePlugins: [[rehypeHighlight, { detect: false, ignoreMissing: true }]],\n components: {\n pre: CopyablePre as React.ComponentType<Record<string, unknown>>,\n },\n // `.hljs-*` token classes are already permitted by the base schema's\n // broadened `className` allow-list on code/pre/span.\n sanitizeSchema: {\n attributes: {\n code: ['className'],\n span: ['className'],\n },\n },\n };\n}\n","/**\n * SuperChat math plugin (opt-in).\n *\n * Renders `$…$` (inline) and `$$…$$` (block) math with `remark-math` +\n * `rehype-katex` (KaTeX). Consumers must also load KaTeX's stylesheet:\n *\n * ```ts\n * import 'katex/dist/katex.min.css';\n * ```\n *\n * The sanitize allow-list is extended so KaTeX's HTML + MathML output survives\n * the untrusted-content sanitizer.\n */\n\nimport rehypeKatex from 'rehype-katex';\nimport remarkMath from 'remark-math';\nimport type { SuperChatRenderPlugin } from '../types';\n\n/** Elements KaTeX emits (HTML + MathML) that must survive sanitization. */\nconst KATEX_TAGS = [\n 'span',\n 'svg',\n 'path',\n 'line',\n 'math',\n 'semantics',\n 'annotation',\n 'mrow',\n 'mi',\n 'mo',\n 'mn',\n 'ms',\n 'mtext',\n 'msup',\n 'msub',\n 'msubsup',\n 'mfrac',\n 'msqrt',\n 'mroot',\n 'mover',\n 'munder',\n 'munderover',\n 'mtable',\n 'mtr',\n 'mtd',\n 'mspace',\n 'mpadded',\n 'mphantom',\n 'menclose',\n 'mstyle',\n];\n\n/** Create the math (KaTeX) render plugin. */\nexport function createMathPlugin(): SuperChatRenderPlugin {\n return {\n name: 'math',\n remarkPlugins: [remarkMath],\n // `output: 'htmlAndMathml'` (KaTeX default) gives accessible MathML too.\n rehypePlugins: [[rehypeKatex, { throwOnError: false }]],\n sanitizeSchema: {\n tagNames: KATEX_TAGS,\n attributes: {\n '*': ['className'],\n span: ['className', 'style', 'ariaHidden'],\n svg: [\n 'xmlns',\n 'width',\n 'height',\n 'viewBox',\n 'preserveAspectRatio',\n 'style',\n ],\n path: ['d'],\n line: ['x1', 'y1', 'x2', 'y2', 'stroke', 'strokeWidth'],\n math: ['xmlns', 'display'],\n annotation: ['encoding'],\n },\n },\n };\n}\n","/**\n * SuperChat GenUI plugin (opt-in).\n *\n * Interactive widgets expressed as fenced ```genui JSON blocks:\n *\n * ````md\n * ```genui\n * { \"widget\": \"math_block\", \"version\": 2, \"prefetch\": \"eager\", \"props\": { \"content\": \"a^2+b^2=c^2\" } }\n * ```\n * ````\n *\n * Widgets are **host-registered, lazy, and schema-validated**. Unknown widgets\n * degrade to an inert code block. Prefetch is split into component (code) vs.\n * data, with `eager` / `visible` / `idle` policies; the **registry policy\n * overrides the wire hint**. Mount + data fetch are gated on `streaming` and a\n * complete/valid payload (a `MCPToolCall`-style pending card shows until then).\n */\n\nimport * as React from 'react';\nimport { useTextRenderContext } from '../render/renderContext';\nimport type {\n GenUIBlockPayload,\n GenUIPrefetchPolicy,\n GenUIRegistry,\n GenUIWidgetEntry,\n GenUIWidgetProps,\n StandardSchemaV1,\n SuperChatRenderPlugin,\n} from '../types';\n\nconst GENUI_TAG = 'genui-widget';\n\n// ---------------------------------------------------------------------------\n// rehype transformer: <pre><code class=\"language-genui\">…</code></pre>\n// → <genui-widget>{json text}</genui-widget>\n// Running this before sanitize (and allow-listing the tag) keeps the pipeline\n// free of `pre`/`code` component override conflicts with the code plugin. The\n// payload rides as a text child (not a data-* attribute) to avoid hast property\n// name conversion surprises through sanitize + react-markdown.\n// ---------------------------------------------------------------------------\n\ninterface HastNode {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: HastNode[];\n}\n\nfunction textOf(node: HastNode): string {\n if (node.type === 'text') return node.value ?? '';\n return (node.children ?? []).map(textOf).join('');\n}\n\nfunction isGenuiPre(node: HastNode): boolean {\n if (node.tagName !== 'pre') return false;\n const code = node.children?.find((c) => c.tagName === 'code');\n const className = code?.properties?.className;\n const classes = Array.isArray(className) ? className : [className];\n return classes.some(\n (c) => typeof c === 'string' && (c === 'language-genui' || c === 'genui')\n );\n}\n\nfunction rehypeGenui() {\n return (tree: HastNode) => {\n const walk = (node: HastNode) => {\n if (!node.children) return;\n node.children = node.children.map((child) => {\n if (isGenuiPre(child)) {\n const code = child.children?.find((c) => c.tagName === 'code');\n const raw = code ? textOf(code) : '';\n return {\n type: 'element',\n tagName: GENUI_TAG,\n properties: {},\n children: [{ type: 'text', value: raw }],\n } satisfies HastNode;\n }\n walk(child);\n return child;\n });\n };\n walk(tree);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pending / fallback chrome\n// ---------------------------------------------------------------------------\n\nfunction PendingCard({ label }: { label: string }) {\n return (\n <div\n data-slot=\"superchat-genui-pending\"\n className=\"my-2 flex items-center gap-2 rounded-lg border border-neutral-200 bg-neutral-50 px-3 py-2 text-sm text-neutral-600 dark:border-neutral-700 dark:bg-neutral-800/50 dark:text-neutral-300\"\n >\n <span\n className=\"h-3 w-3 animate-spin rounded-full border-2 border-neutral-400 border-t-transparent\"\n aria-hidden=\"true\"\n />\n {label}\n </div>\n );\n}\n\nfunction InertFallback({ raw }: { raw: string }) {\n return (\n <pre\n data-slot=\"superchat-genui-fallback\"\n className=\"my-2 overflow-x-auto rounded-lg bg-neutral-900 p-3 text-sm text-neutral-100 dark:bg-neutral-950\"\n >\n <code>{raw}</code>\n </pre>\n );\n}\n\nfunction ErrorCard({ message }: { message: string }) {\n return (\n <div\n data-slot=\"superchat-genui-error\"\n role=\"alert\"\n className=\"my-2 rounded-lg border border-red-300 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-700 dark:bg-red-900/30 dark:text-red-300\"\n >\n {message}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Payload parsing + schema validation\n// ---------------------------------------------------------------------------\n\nfunction parsePayload(\n raw: string\n): { ok: true; value: GenUIBlockPayload } | { ok: false } {\n const trimmed = raw.trim();\n if (!trimmed) return { ok: false };\n try {\n const value = JSON.parse(trimmed) as GenUIBlockPayload;\n if (!value || typeof value.widget !== 'string') return { ok: false };\n return { ok: true, value };\n } catch {\n // Incomplete JSON (still streaming) or malformed.\n return { ok: false };\n }\n}\n\nasync function validate<T>(\n schema: StandardSchemaV1<T> | undefined,\n data: unknown\n): Promise<{ ok: true; value: T } | { ok: false; message: string }> {\n if (!schema) return { ok: true, value: data as T };\n const result = await schema['~standard'].validate(data);\n if ('issues' in result && result.issues) {\n return {\n ok: false,\n message:\n result.issues.map((i) => i.message).join('; ') ||\n 'Invalid widget payload',\n };\n }\n return { ok: true, value: (result as { value: T }).value };\n}\n\n// ---------------------------------------------------------------------------\n// Widget loader (code prefetch policy)\n// ---------------------------------------------------------------------------\n\nfunction usePrefetchTrigger(\n policy: GenUIPrefetchPolicy,\n ref: React.RefObject<HTMLElement | null>\n): boolean {\n const [ready, setReady] = React.useState(policy === 'eager');\n\n React.useEffect(() => {\n if (ready) return;\n if (policy === 'idle') {\n const requestIdle = (\n window as unknown as {\n requestIdleCallback?: (cb: () => void) => number;\n cancelIdleCallback?: (id: number) => void;\n }\n ).requestIdleCallback;\n const cancelIdle = (\n window as unknown as {\n requestIdleCallback?: (cb: () => void) => number;\n cancelIdleCallback?: (id: number) => void;\n }\n ).cancelIdleCallback;\n let idleId: number | null = null;\n let timeoutId: number | null = null;\n if (requestIdle) {\n idleId = requestIdle(() => setReady(true));\n } else {\n timeoutId = window.setTimeout(() => setReady(true), 200);\n }\n return () => {\n if (idleId !== null && cancelIdle) cancelIdle(idleId);\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n };\n }\n // 'visible'\n const el = ref.current;\n if (!el || typeof IntersectionObserver === 'undefined') {\n setReady(true);\n return;\n }\n const obs = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n setReady(true);\n obs.disconnect();\n }\n });\n obs.observe(el);\n return () => obs.disconnect();\n }, [policy, ready, ref]);\n\n return ready;\n}\n\ninterface GenUIBlockProps {\n raw: string;\n registry: GenUIRegistry;\n}\n\nfunction GenUIBlock({ raw, registry }: GenUIBlockProps) {\n const { messageId, streaming } = useTextRenderContext();\n const placeholderRef = React.useRef<HTMLDivElement>(null);\n\n const parsed = React.useMemo(() => parsePayload(raw), [raw]);\n const entry: GenUIWidgetEntry | undefined = parsed.ok\n ? registry[parsed.value.widget]\n : undefined;\n\n // Registry policy overrides the wire hint; default to 'visible'.\n const policy: GenUIPrefetchPolicy =\n entry?.prefetch ??\n (parsed.ok ? parsed.value.prefetch : undefined) ??\n 'visible';\n\n const codeReady = usePrefetchTrigger(policy, placeholderRef);\n\n const [Loaded, setLoaded] =\n React.useState<React.ComponentType<GenUIWidgetProps> | null>(null);\n const [validated, setValidated] = React.useState<\n { ok: true; value: unknown } | { ok: false; message: string } | null\n >(null);\n\n // Component (code) prefetch — may run while streaming.\n React.useEffect(() => {\n if (!entry || !codeReady) return;\n let active = true;\n void entry\n .component()\n .then((m) => {\n if (active) setLoaded(() => m.default);\n })\n .catch(() => {\n if (active)\n setValidated({ ok: false, message: 'Failed to load widget' });\n });\n return () => {\n active = false;\n };\n }, [entry, codeReady]);\n\n // Data validation/prefetch — only once payload is complete AND not streaming.\n React.useEffect(() => {\n if (!entry || !parsed.ok || streaming) return;\n let active = true;\n const props = parsed.value.props;\n void (async () => {\n const result = await validate(entry.schema, props);\n if (!active) return;\n if (result.ok && entry.prefetchData) {\n try {\n await entry.prefetchData(result.value);\n } catch {\n /* non-fatal: data prefetch is best-effort */\n }\n }\n if (active) setValidated(result);\n })();\n return () => {\n active = false;\n };\n }, [entry, parsed, streaming]);\n\n // Unknown widget or unparseable-yet-complete payload → inert fallback.\n if (!parsed.ok) {\n if (streaming) {\n return (\n <div ref={placeholderRef}>\n <PendingCard label=\"Preparing widget…\" />\n </div>\n );\n }\n return <InertFallback raw={raw} />;\n }\n\n if (parsed.ok && !entry) return <InertFallback raw={raw} />;\n\n // Still streaming or payload incomplete → pending card (keep ref mounted so\n // the visible/idle prefetch trigger can fire).\n if (streaming || !Loaded || !validated) {\n return (\n <div ref={placeholderRef}>\n <PendingCard label=\"Preparing widget…\" />\n </div>\n );\n }\n\n if (!validated.ok) return <ErrorCard message={validated.message} />;\n\n const meta = {\n name: parsed.value.widget,\n version: parsed.value.version,\n messageId,\n streaming,\n };\n\n return <Loaded data={validated.value} meta={meta} />;\n}\n\n// ---------------------------------------------------------------------------\n// Plugin factory\n// ---------------------------------------------------------------------------\n\n/** Create the GenUI render plugin from a host widget registry. */\nexport function createGenUIPlugin(\n registry: GenUIRegistry\n): SuperChatRenderPlugin {\n const GenUIWidgetComponent = (props: Record<string, unknown>) => {\n const raw = React.Children.toArray(props.children as React.ReactNode)\n .filter((c): c is string => typeof c === 'string')\n .join('');\n return <GenUIBlock raw={raw} registry={registry} />;\n };\n\n return {\n name: 'genui',\n rehypePlugins: [rehypeGenui],\n components: {\n [GENUI_TAG]: GenUIWidgetComponent,\n },\n sanitizeSchema: {\n tagNames: [GENUI_TAG],\n },\n };\n}\n\nexport { GENUI_TAG };\nexport type { GenUIRegistry, GenUIWidgetEntry, GenUIWidgetProps };\n","/**\n * SuperChat Mermaid plugin (opt-in).\n *\n * Renders fenced ```mermaid blocks as diagrams via the lazily-loaded `mermaid`\n * library:\n *\n * ````md\n * ```mermaid\n * graph TD; A-->B; A-->C;\n * ```\n * ````\n *\n * `mermaid` is heavy, so it loads on first render (never in the SuperChat base\n * bundle). Rendering is gated on `streaming` — partial diagram source mid-stream\n * shows a pending card and only renders once the message settles. Diagrams are\n * rendered with mermaid's `securityLevel: 'strict'`, which sanitizes labels and\n * strips scripts; the resulting SVG is inserted directly (it bypasses\n * `rehype-sanitize`, so strict mode is the trust boundary here).\n */\n\nimport * as React from 'react';\nimport { useTextRenderContext } from '../render/renderContext';\nimport type { SuperChatRenderPlugin } from '../types';\n\nconst MERMAID_TAG = 'mermaid-diagram';\n\n// ---------------------------------------------------------------------------\n// rehype transformer: <pre><code class=\"language-mermaid\">…</code></pre>\n// → <mermaid-diagram>{source text}</mermaid-diagram>\n// The source rides as a text child (not a data-* attribute) to avoid hast\n// property-name conversion surprises through sanitize + react-markdown.\n// ---------------------------------------------------------------------------\n\ninterface HastNode {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: HastNode[];\n}\n\nfunction textOf(node: HastNode): string {\n if (node.type === 'text') return node.value ?? '';\n return (node.children ?? []).map(textOf).join('');\n}\n\nfunction isMermaidPre(node: HastNode): boolean {\n if (node.tagName !== 'pre') return false;\n const code = node.children?.find((c) => c.tagName === 'code');\n const className = code?.properties?.className;\n const classes = Array.isArray(className) ? className : [className];\n return classes.some(\n (c) =>\n typeof c === 'string' && (c === 'language-mermaid' || c === 'mermaid')\n );\n}\n\nfunction rehypeMermaid() {\n return (tree: HastNode) => {\n const walk = (node: HastNode) => {\n if (!node.children) return;\n node.children = node.children.map((child) => {\n if (isMermaidPre(child)) {\n const code = child.children?.find((c) => c.tagName === 'code');\n const raw = code ? textOf(code) : '';\n return {\n type: 'element',\n tagName: MERMAID_TAG,\n properties: {},\n children: [{ type: 'text', value: raw }],\n } satisfies HastNode;\n }\n walk(child);\n return child;\n });\n };\n walk(tree);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pending / fallback chrome\n// ---------------------------------------------------------------------------\n\nfunction PendingCard({ label }: { label: string }) {\n return (\n <div\n data-slot=\"superchat-mermaid-pending\"\n className=\"my-2 flex items-center gap-2 rounded-lg border border-neutral-200 bg-neutral-50 px-3 py-2 text-sm text-neutral-600 dark:border-neutral-700 dark:bg-neutral-800/50 dark:text-neutral-300\"\n >\n <span\n className=\"h-3 w-3 animate-spin rounded-full border-2 border-neutral-400 border-t-transparent\"\n aria-hidden=\"true\"\n />\n {label}\n </div>\n );\n}\n\nfunction InertFallback({ raw }: { raw: string }) {\n return (\n <pre\n data-slot=\"superchat-mermaid-fallback\"\n className=\"my-2 overflow-x-auto rounded-lg bg-neutral-900 p-3 text-sm text-neutral-100 dark:bg-neutral-950\"\n >\n <code>{raw}</code>\n </pre>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Diagram renderer\n// ---------------------------------------------------------------------------\n\nlet mermaidReady: Promise<typeof import('mermaid').default> | null = null;\nlet mermaidTheme: 'dark' | 'default' | null = null;\n\n/** Load + initialize mermaid once, shared across all diagrams. */\nfunction loadMermaid(dark: boolean) {\n const theme: 'dark' | 'default' = dark ? 'dark' : 'default';\n if (!mermaidReady || mermaidTheme !== theme) {\n mermaidReady = (\n mermaidReady ?? import('mermaid').then(({ default: mermaid }) => mermaid)\n ).then((mermaid) => {\n mermaidTheme = theme;\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: 'strict',\n theme,\n });\n return mermaid;\n });\n }\n return mermaidReady;\n}\n\nlet mermaidSeq = 0;\n\nfunction MermaidDiagram({ code }: { code: string }) {\n const { streaming } = useTextRenderContext();\n const [svg, setSvg] = React.useState<string | null>(null);\n const [failed, setFailed] = React.useState(false);\n const idRef = React.useRef(`superchat-mermaid-${(mermaidSeq += 1)}`);\n\n const source = code.trim();\n\n React.useEffect(() => {\n // Don't try to render an incomplete diagram while the message streams.\n if (streaming || !source) return;\n let active = true;\n setSvg(null);\n setFailed(false);\n const dark =\n typeof document !== 'undefined' &&\n document.documentElement.classList.contains('dark');\n void loadMermaid(dark)\n .then((mermaid) => mermaid.render(idRef.current, source))\n .then(({ svg: rendered }) => {\n if (active) setSvg(rendered);\n })\n .catch(() => {\n if (active) setFailed(true);\n });\n return () => {\n active = false;\n };\n }, [source, streaming]);\n\n if (!source && !streaming) return <InertFallback raw={code} />;\n\n if (failed) return <InertFallback raw={code} />;\n\n if (streaming || svg === null) {\n return <PendingCard label=\"Rendering diagram…\" />;\n }\n\n return (\n <div\n data-slot=\"superchat-mermaid\"\n className=\"my-2 overflow-x-auto\"\n // mermaid renders with securityLevel: 'strict' (labels sanitized, scripts\n // stripped), so the SVG is safe to inject directly.\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n\n/** Create the Mermaid diagram render plugin. */\nexport function createMermaidPlugin(): SuperChatRenderPlugin {\n const MermaidComponent = (props: Record<string, unknown>) => {\n const raw = React.Children.toArray(props.children as React.ReactNode)\n .filter((c): c is string => typeof c === 'string')\n .join('');\n return <MermaidDiagram code={raw} />;\n };\n\n return {\n name: 'mermaid',\n rehypePlugins: [rehypeMermaid],\n components: {\n [MERMAID_TAG]: MermaidComponent,\n },\n sanitizeSchema: {\n tagNames: [MERMAID_TAG],\n },\n };\n}\nexport { MERMAID_TAG };\n","/**\n * SuperChat image plugin (opt-in).\n *\n * Makes inline Markdown images (`![alt](url)`) click-to-zoom, reusing the\n * Messaging module's full-screen {@link LightboxModal}. The image `src`/`alt`\n * come from (untrusted) Markdown and are already protocol-restricted by\n * `rehype-sanitize`; this plugin only adds the zoom affordance.\n */\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { LightboxModal, type MessageAttachment } from '../../Messaging';\nimport { cn } from '../../../utils/cn';\nimport type { SuperChatRenderPlugin } from '../types';\n\nfunction filenameFromUrl(url: string, alt?: string): string {\n if (alt && alt.trim()) return alt.trim();\n try {\n const path = new URL(url, 'http://localhost').pathname;\n const last = path.split('/').filter(Boolean).pop();\n return last || 'image';\n } catch {\n return 'image';\n }\n}\n\nfunction ZoomableImage({\n node: _node,\n ...props\n}: React.ComponentProps<'img'> & { node?: unknown }) {\n const [open, setOpen] = React.useState(false);\n const src = typeof props.src === 'string' ? props.src : '';\n const alt = typeof props.alt === 'string' ? props.alt : '';\n\n const attachment: MessageAttachment | null = React.useMemo(() => {\n if (!src) return null;\n return {\n id: src,\n type: 'image',\n url: src,\n filename: filenameFromUrl(src, alt),\n size: 0,\n mimeType: 'image/*',\n state: 'uploaded',\n alt,\n };\n }, [src, alt]);\n\n if (!src) return null;\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n aria-label={alt ? `View image: ${alt}` : 'View image'}\n className=\"focus-visible:ring-primary-500 my-2 inline-block cursor-zoom-in rounded-lg focus-visible:ring-2 focus-visible:outline-none\"\n >\n <img\n {...props}\n alt={alt}\n className={cn(\n 'max-h-80 max-w-full rounded-lg object-contain',\n props.className\n )}\n />\n </button>\n {open &&\n typeof document !== 'undefined' &&\n createPortal(\n <LightboxModal\n attachment={attachment}\n onClose={() => setOpen(false)}\n />,\n document.body\n )}\n </>\n );\n}\n\n/** Create the image (click-to-zoom lightbox) render plugin. */\nexport function createImagePlugin(): SuperChatRenderPlugin {\n return {\n name: 'image',\n components: {\n img: ZoomableImage as React.ComponentType<Record<string, unknown>>,\n },\n // Allow inline (`data:`) and object-URL (`blob:`) image sources in addition\n // to the default http/https, so pasted/attached images render. These are\n // safe for `<img>` (scripts in SVG loaded via `src` do not execute).\n sanitizeSchema: {\n protocols: { src: ['data', 'blob'] },\n },\n };\n}\n","/**\n * SuperChat NITRO table plugin (opt-in).\n *\n * Renders GFM tables through **NITRO DataVis** (sortable / filterable /\n * resizable) instead of a static `<table>`. The heavy grid is `React.lazy`-loaded\n * only when a table appears, and if the `datavis` engine can't load (e.g. the\n * submodule isn't installed) it **degrades gracefully** to the themed HTML table.\n *\n * @example\n * import { createNitroTablePlugin } from '@mieweb/ui/components/SuperChat/plugins';\n * const render = createMarkdownRenderer({ plugins: [createNitroTablePlugin()] });\n */\n\nimport * as React from 'react';\nimport { cn } from '../../../utils/cn';\nimport type { SuperChatRenderPlugin } from '../types';\n\nconst NitroTableGrid = React.lazy(() => import('./nitroTableGrid'));\n\n// ---------------------------------------------------------------------------\n// GFM table extraction from the hast node\n// ---------------------------------------------------------------------------\n\ninterface HastNode {\n type: string;\n tagName?: string;\n value?: string;\n children?: HastNode[];\n}\n\nfunction textOf(node: HastNode): string {\n if (node.type === 'text') return node.value ?? '';\n return (node.children ?? []).map(textOf).join('');\n}\n\nfunction rowsOf(parent: HastNode | undefined): HastNode[] {\n return (parent?.children ?? []).filter((c) => c.tagName === 'tr');\n}\n\nfunction cellsOf(row: HastNode, tag: 'th' | 'td'): HastNode[] {\n return (row.children ?? []).filter((c) => c.tagName === tag);\n}\n\ninterface ParsedTable {\n headers: string[];\n rows: Array<Record<string, string>>;\n}\n\nfunction parseTable(node: HastNode | undefined): ParsedTable | null {\n if (!node || node.tagName !== 'table') return null;\n\n const thead = node.children?.find((c) => c.tagName === 'thead');\n const tbody = node.children?.find((c) => c.tagName === 'tbody');\n\n const headerRow = rowsOf(thead)[0];\n if (!headerRow) return null;\n\n const headers = cellsOf(headerRow, 'th').map((c) => textOf(c).trim());\n if (headers.length === 0) return null;\n\n // De-duplicate header keys so row objects don't collide.\n const seen = new Map<string, number>();\n const keys = headers.map((h) => {\n const base = h || 'column';\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n return count === 0 ? base : `${base} (${count + 1})`;\n });\n\n const rows = rowsOf(tbody).map((tr) => {\n const cells = cellsOf(tr, 'td');\n const row: Record<string, string> = {};\n keys.forEach((key, i) => {\n row[key] = cells[i] ? textOf(cells[i]).trim() : '';\n });\n return row;\n });\n\n return { headers: keys, rows };\n}\n\n// ---------------------------------------------------------------------------\n// Fallback HTML table (also the graceful-degradation target)\n// ---------------------------------------------------------------------------\n\nfunction HtmlTable({\n node: _node,\n ...props\n}: React.ComponentProps<'table'> & { node?: unknown }) {\n return (\n <div className=\"my-2 overflow-x-auto\">\n <table\n {...props}\n className={cn(\n 'w-full border-collapse text-sm [&_td]:border [&_td]:border-neutral-200 [&_td]:px-2 [&_td]:py-1 dark:[&_td]:border-neutral-700 [&_th]:border [&_th]:border-neutral-200 [&_th]:px-2 [&_th]:py-1 [&_th]:text-left dark:[&_th]:border-neutral-700',\n props.className\n )}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Error boundary → degrade to HTML table if the grid fails to load/render\n// ---------------------------------------------------------------------------\n\nclass GridErrorBoundary extends React.Component<\n { fallback: React.ReactNode; children: React.ReactNode },\n { failed: boolean }\n> {\n state = { failed: false };\n\n static getDerivedStateFromError() {\n return { failed: true };\n }\n\n render() {\n if (this.state.failed) return this.props.fallback;\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Plugin factory\n// ---------------------------------------------------------------------------\n\n/** Create the NITRO DataVis table render plugin. */\nexport function createNitroTablePlugin(): SuperChatRenderPlugin {\n const NitroTable = (props: Record<string, unknown>) => {\n const node = props.node as HastNode | undefined;\n const fallback = (\n <HtmlTable\n {...(props as React.ComponentProps<'table'> & { node?: unknown })}\n />\n );\n\n const parsed = React.useMemo(() => parseTable(node), [node]);\n if (!parsed) return fallback;\n\n return (\n <GridErrorBoundary fallback={fallback}>\n <React.Suspense fallback={fallback}>\n <NitroTableGrid headers={parsed.headers} rows={parsed.rows} />\n </React.Suspense>\n </GridErrorBoundary>\n );\n };\n\n return {\n name: 'nitro-table',\n components: {\n table: NitroTable,\n },\n };\n}\n","/**\n * SuperChat attachment cache (opt-in, offline-first).\n *\n * A tiny IndexedDB-backed blob store keyed by **attachment id**. Hosts persist\n * a composer attachment's bytes here once (e.g. on send), embed only the id in\n * the message, and the attachment render plugin resolves a fresh `blob:` URL\n * from the cache at render time — so previously sent media keeps rendering\n * while offline without bloating the stored conversation with base64.\n *\n * Everything degrades gracefully: when IndexedDB is unavailable (SSR, private\n * mode, older browsers) the methods resolve to safe no-op values and callers\n * fall back to any inline `src` they were given.\n */\n\nconst DB_NAME = 'mieweb-superchat';\nconst STORE = 'attachments';\n/** Lightweight {id,size,lastAccessed} mirror, read during eviction sweeps. */\nconst META_STORE = 'attachments_meta';\nconst DB_VERSION = 2;\n\n/** Default cache budget: evict least-recently-used entries beyond this. */\nconst DEFAULT_MAX_BYTES = 100 * 1024 * 1024; // 100 MB\nlet maxBytes = DEFAULT_MAX_BYTES;\n\n/** A blob persisted in the cache, plus its descriptive metadata. */\nexport interface CachedAttachment {\n /** Stable attachment id (the object-store key). */\n id: string;\n /** Original file name. */\n name: string;\n /** MIME type, e.g. `video/mp4`. */\n type: string;\n /** The raw file bytes. */\n blob: Blob;\n /** Byte length of {@link blob}. */\n size: number;\n /** Epoch ms the entry was written. */\n cachedAt: number;\n /** Epoch ms of the last read (drives LRU eviction). */\n lastAccessed: number;\n}\n\n/** Small metadata mirror used to size the cache without loading blobs. */\ninterface MetaEntry {\n id: string;\n size: number;\n lastAccessed: number;\n}\n\n/** Input accepted by {@link AttachmentCache.put}. Provide `blob` or `dataUrl`. */\nexport interface PutAttachmentInput {\n id: string;\n name: string;\n type: string;\n blob?: Blob;\n /** Base64 (or URL-encoded) `data:` URL; converted to a Blob before storage. */\n dataUrl?: string;\n}\n\nfunction hasIndexedDB(): boolean {\n return typeof window !== 'undefined' && !!window.indexedDB;\n}\n\nfunction openDB(): Promise<IDBDatabase | null> {\n if (!hasIndexedDB()) return Promise.resolve(null);\n return new Promise((resolve) => {\n let req: IDBOpenDBRequest;\n try {\n req = window.indexedDB.open(DB_NAME, DB_VERSION);\n } catch {\n resolve(null);\n return;\n }\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE)) {\n db.createObjectStore(STORE, { keyPath: 'id' });\n }\n if (!db.objectStoreNames.contains(META_STORE)) {\n db.createObjectStore(META_STORE, { keyPath: 'id' });\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n}\n\nfunction tx(db: IDBDatabase, mode: IDBTransactionMode): IDBObjectStore {\n return db.transaction(STORE, mode).objectStore(STORE);\n}\n\n/** Read the (small) metadata mirror for every cached entry. */\nfunction readAllMeta(db: IDBDatabase): Promise<MetaEntry[]> {\n return new Promise((resolve) => {\n try {\n const req = db\n .transaction(META_STORE, 'readonly')\n .objectStore(META_STORE)\n .getAll();\n req.onsuccess = () => resolve((req.result as MetaEntry[]) ?? []);\n req.onerror = () => resolve([]);\n } catch {\n resolve([]);\n }\n });\n}\n\n/** Bump an entry's `lastAccessed` time (best-effort, for LRU ordering). */\nasync function touch(id: string): Promise<void> {\n const db = await openDB();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const store = db\n .transaction(META_STORE, 'readwrite')\n .objectStore(META_STORE);\n const getReq = store.get(id);\n getReq.onsuccess = () => {\n const meta = getReq.result as MetaEntry | undefined;\n if (meta) {\n meta.lastAccessed = Date.now();\n store.put(meta);\n }\n resolve();\n };\n getReq.onerror = () => resolve();\n } catch {\n resolve();\n } finally {\n db.close();\n }\n });\n}\n\n/** Evict least-recently-used entries until total bytes fit within `maxBytes`. */\nasync function prune(): Promise<void> {\n const db = await openDB();\n if (!db) return;\n try {\n const metas = await readAllMeta(db);\n let total = metas.reduce((sum, m) => sum + (m.size || 0), 0);\n if (total <= maxBytes) return;\n\n // Oldest first; always keep at least the single newest entry.\n const byAge = metas\n .slice()\n .sort((a, b) => (a.lastAccessed || 0) - (b.lastAccessed || 0));\n const victims: string[] = [];\n for (const meta of byAge) {\n if (total <= maxBytes) break;\n if (metas.length - victims.length <= 1) break;\n victims.push(meta.id);\n total -= meta.size || 0;\n }\n if (!victims.length) return;\n\n await new Promise<void>((resolve) => {\n try {\n const t = db.transaction([STORE, META_STORE], 'readwrite');\n const blobs = t.objectStore(STORE);\n const meta = t.objectStore(META_STORE);\n for (const id of victims) {\n blobs.delete(id);\n meta.delete(id);\n }\n t.oncomplete = () => resolve();\n t.onerror = () => resolve();\n } catch {\n resolve();\n }\n });\n } finally {\n db.close();\n }\n}\n\n/** Convert a `data:` URL into a Blob, or `null` if it can't be parsed. */\nfunction dataUrlToBlob(dataUrl: string): Blob | null {\n const match = /^data:([^;,]*)(;base64)?,([\\s\\S]*)$/.exec(dataUrl);\n if (!match) return null;\n const mime = match[1] || 'application/octet-stream';\n const isBase64 = Boolean(match[2]);\n const data = match[3];\n try {\n if (isBase64) {\n const binary = window.atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new window.Blob([bytes], { type: mime });\n }\n return new window.Blob([decodeURIComponent(data)], { type: mime });\n } catch {\n return null;\n }\n}\n\n/**\n * Offline blob store for SuperChat attachments. All methods are safe to call in\n * any environment; without IndexedDB they resolve to no-ops / `undefined`.\n */\nexport const attachmentCache = {\n /** Whether a persistent IndexedDB store is available in this environment. */\n isAvailable: hasIndexedDB,\n\n /**\n * Tune the cache. `maxBytes` is the eviction budget (default 100 MB); when a\n * `put` pushes the total past it, least-recently-used entries are dropped\n * until it fits. Set `Infinity` to disable eviction.\n */\n configure(options: { maxBytes?: number }): void {\n if (typeof options.maxBytes === 'number' && options.maxBytes >= 0) {\n maxBytes = options.maxBytes;\n }\n },\n\n /** Total bytes currently held by the cache (0 when unavailable). */\n async usage(): Promise<number> {\n const db = await openDB();\n if (!db) return 0;\n try {\n const metas = await readAllMeta(db);\n return metas.reduce((sum, m) => sum + (m.size || 0), 0);\n } finally {\n db.close();\n }\n },\n\n /**\n * Persist an attachment's bytes by id. Pass a `blob` or a `dataUrl`. Resolves\n * to `true` when stored, `false` if unavailable or the input was unusable.\n * Writing past the configured `maxBytes` evicts least-recently-used entries.\n */\n async put(input: PutAttachmentInput): Promise<boolean> {\n // Open the store first so SSR / non-browser callers bail out before we\n // touch `window` (dataUrlToBlob uses window.atob / window.Blob).\n const db = await openDB();\n if (!db) return false;\n const blob =\n input.blob ?? (input.dataUrl ? dataUrlToBlob(input.dataUrl) : null);\n if (!blob) {\n db.close();\n return false;\n }\n const now = Date.now();\n const entry: CachedAttachment = {\n id: input.id,\n name: input.name,\n type: input.type || blob.type || 'application/octet-stream',\n blob,\n size: blob.size,\n cachedAt: now,\n lastAccessed: now,\n };\n const stored = await new Promise<boolean>((resolve) => {\n try {\n const t = db.transaction([STORE, META_STORE], 'readwrite');\n t.objectStore(STORE).put(entry);\n t.objectStore(META_STORE).put({\n id: entry.id,\n size: entry.size,\n lastAccessed: now,\n } satisfies MetaEntry);\n t.oncomplete = () => resolve(true);\n t.onerror = () => resolve(false);\n } catch {\n resolve(false);\n } finally {\n db.close();\n }\n });\n if (stored) await prune();\n return stored;\n },\n\n /** Read a cached attachment (blob + metadata) by id, or `undefined`. */\n async get(id: string): Promise<CachedAttachment | undefined> {\n const db = await openDB();\n if (!db) return undefined;\n const entry = await new Promise<CachedAttachment | undefined>((resolve) => {\n try {\n const req = tx(db, 'readonly').get(id);\n req.onsuccess = () =>\n resolve((req.result as CachedAttachment | undefined) ?? undefined);\n req.onerror = () => resolve(undefined);\n } catch {\n resolve(undefined);\n } finally {\n db.close();\n }\n });\n if (entry) void touch(id);\n return entry;\n },\n\n /**\n * Resolve a fresh `blob:` object URL for a cached attachment, or `undefined`\n * if it isn't cached. **The caller owns the URL** and must\n * `URL.revokeObjectURL` it when done (the {@link useAttachmentUrl} hook does\n * this automatically).\n */\n async getObjectURL(id: string): Promise<string | undefined> {\n const entry = await attachmentCache.get(id);\n if (!entry) return undefined;\n try {\n return window.URL.createObjectURL(entry.blob);\n } catch {\n return undefined;\n }\n },\n\n /** Remove a cached attachment by id. */\n async delete(id: string): Promise<void> {\n const db = await openDB();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const t = db.transaction([STORE, META_STORE], 'readwrite');\n t.objectStore(STORE).delete(id);\n t.objectStore(META_STORE).delete(id);\n t.oncomplete = () => resolve();\n t.onerror = () => resolve();\n } catch {\n resolve();\n } finally {\n db.close();\n }\n });\n },\n\n /** Drop every cached attachment. */\n async clear(): Promise<void> {\n const db = await openDB();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const t = db.transaction([STORE, META_STORE], 'readwrite');\n t.objectStore(STORE).clear();\n t.objectStore(META_STORE).clear();\n t.oncomplete = () => resolve();\n t.onerror = () => resolve();\n } catch {\n resolve();\n } finally {\n db.close();\n }\n });\n },\n};\n\nexport type AttachmentCache = typeof attachmentCache;\n","/**\n * SuperChat attachment plugin (opt-in, offline-first).\n *\n * Renders file attachments (image / video / audio / pdf / generic) inline in a\n * message via a fenced ` ```superchat-attachment ` block whose body is a small\n * JSON descriptor:\n *\n * ````md\n * ```superchat-attachment\n * { \"id\": \"att-1\", \"type\": \"video/mp4\", \"name\": \"clip.mp4\" }\n * ```\n * ````\n *\n * Use {@link attachmentMarkdown} to build the block. The descriptor carries an\n * attachment **id**; the player resolves a `blob:` URL from the\n * {@link attachmentCache} (IndexedDB) at render time, so previously sent media\n * keeps rendering offline without storing base64 in the conversation. An\n * optional inline `src` (`data:` URL) is used as a fallback when the cache is\n * empty or unavailable, and is opportunistically persisted for next time.\n *\n * Mirrors the GenUI plugin's fence→custom-element rehype transform so the\n * payload never travels through `urlTransform` / raw-HTML, keeping the pipeline\n * robust under `rehype-sanitize`.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../../utils/cn';\nimport { attachmentCache } from '../render/attachmentCache';\nimport type { SuperChatRenderPlugin } from '../types';\n\n/** Custom element the fenced block is rewritten to before sanitization. */\nexport const ATTACHMENT_TAG = 'superchat-attachment';\n/** Fenced-code language that marks an attachment block. */\nexport const ATTACHMENT_FENCE = 'superchat-attachment';\n\n/** JSON payload carried by a ` ```superchat-attachment ` block. */\nexport interface AttachmentBlockPayload {\n /** Attachment id used as the {@link attachmentCache} key. */\n id?: string;\n /** MIME type, e.g. `video/mp4`. */\n type: string;\n /** File name (shown as a label / download name). */\n name: string;\n /** Optional inline `data:` URL fallback when the cache has no entry. */\n src?: string;\n}\n\n/**\n * Build the Markdown for an attachment block. Embed the result in a message so\n * the attachment plugin renders it.\n *\n * @example\n * const md = attachmentMarkdown({ id: att.id, type: att.type, name: att.name });\n */\nexport function attachmentMarkdown(payload: AttachmentBlockPayload): string {\n return ['```superchat-attachment', JSON.stringify(payload), '```'].join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Offline URL resolution\n// ---------------------------------------------------------------------------\n\ntype AttachmentUrlStatus = 'idle' | 'loading' | 'ready' | 'missing';\n\n/**\n * Resolve a displayable URL for an attachment. Prefers a cached `blob:` URL\n * (offline), falling back to the inline `data:` URL when the cache is empty or\n * unavailable. The returned object URL is revoked automatically on unmount /\n * id change.\n */\nexport function useAttachmentUrl(\n id?: string,\n fallbackSrc?: string\n): { url?: string; status: AttachmentUrlStatus } {\n const [url, setUrl] = React.useState<string | undefined>(undefined);\n const [status, setStatus] = React.useState<AttachmentUrlStatus>('idle');\n\n React.useEffect(() => {\n let active = true;\n let created: string | undefined;\n\n if (!id && !fallbackSrc) {\n setUrl(undefined);\n setStatus('idle');\n return;\n }\n\n setStatus('loading');\n void (async () => {\n if (id) {\n const cached = await attachmentCache.getObjectURL(id);\n if (!active) {\n if (cached) window.URL.revokeObjectURL(cached);\n return;\n }\n if (cached) {\n created = cached;\n setUrl(cached);\n setStatus('ready');\n return;\n }\n }\n if (!active) return;\n setUrl(fallbackSrc);\n setStatus(fallbackSrc ? 'ready' : 'missing');\n })();\n\n return () => {\n active = false;\n if (created) window.URL.revokeObjectURL(created);\n };\n }, [id, fallbackSrc]);\n\n return { url, status };\n}\n\n// ---------------------------------------------------------------------------\n// Icons\n// ---------------------------------------------------------------------------\n\nconst ICON_PROPS = {\n width: 20,\n height: 20,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.75,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n 'aria-hidden': true,\n};\n\nfunction FileGlyph() {\n return (\n <svg {...ICON_PROPS}>\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\" />\n <path d=\"M17 21H7a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2Z\" />\n </svg>\n );\n}\n\nfunction DownloadGlyph() {\n return (\n <svg {...ICON_PROPS} width={16} height={16}>\n <path d=\"M12 3v12\" />\n <path d=\"m7 12 5 5 5-5\" />\n <path d=\"M5 21h14\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Presentation\n// ---------------------------------------------------------------------------\n\ntype AttachmentRenderKind = 'image' | 'video' | 'audio' | 'pdf' | 'file';\n\nfunction kindOf(type: string): AttachmentRenderKind {\n if (type.startsWith('image/')) return 'image';\n if (type.startsWith('video/')) return 'video';\n if (type.startsWith('audio/')) return 'audio';\n if (type === 'application/pdf') return 'pdf';\n return 'file';\n}\n\nfunction FileChip({\n name,\n url,\n unavailable,\n}: {\n name: string;\n url?: string;\n unavailable?: boolean;\n}) {\n const content = (\n <>\n <span className=\"text-neutral-500 dark:text-neutral-400\">\n <FileGlyph />\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm\">{name}</span>\n {url && !unavailable ? (\n <span className=\"text-neutral-400\">\n <DownloadGlyph />\n </span>\n ) : null}\n </>\n );\n\n const className = cn(\n 'my-2 flex max-w-sm items-center gap-2 rounded-lg border border-neutral-200 bg-neutral-50 px-3 py-2 dark:border-neutral-700 dark:bg-neutral-800',\n unavailable && 'opacity-60'\n );\n\n if (url && !unavailable) {\n return (\n <a\n href={url}\n download={name}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={name}\n className={cn(\n className,\n 'hover:border-neutral-300 hover:bg-neutral-100 dark:hover:border-neutral-600 dark:hover:bg-neutral-700'\n )}\n >\n {content}\n </a>\n );\n }\n\n return (\n <div className={className} title={name}>\n {content}\n {unavailable ? (\n <span className=\"text-xs whitespace-nowrap text-neutral-400\">\n unavailable offline\n </span>\n ) : null}\n </div>\n );\n}\n\nfunction AttachmentBlock({ payload }: { payload: AttachmentBlockPayload }) {\n const { id, type, name, src } = payload;\n const { url, status } = useAttachmentUrl(id || undefined, src);\n const kind = kindOf(type);\n\n // Opportunistically persist an inline data: URL so it renders offline next\n // time, without re-storing what's already cached.\n React.useEffect(() => {\n if (!id || !src || !attachmentCache.isAvailable()) return;\n let active = true;\n void attachmentCache.get(id).then((existing) => {\n if (active && !existing) {\n void attachmentCache.put({ id, name, type, dataUrl: src });\n }\n });\n return () => {\n active = false;\n };\n }, [id, src, name, type]);\n\n if (status === 'loading') {\n return (\n <div\n data-slot=\"superchat-attachment\"\n className=\"my-2 h-10 max-w-sm animate-pulse rounded-lg bg-neutral-100 dark:bg-neutral-800\"\n aria-label={`Loading ${name}`}\n />\n );\n }\n\n if (!url) {\n return (\n <div data-slot=\"superchat-attachment\">\n <FileChip name={name} unavailable />\n </div>\n );\n }\n\n let body: React.ReactNode;\n switch (kind) {\n case 'image':\n body = (\n <img\n src={url}\n alt={name}\n className=\"max-h-80 max-w-full rounded-lg object-contain\"\n />\n );\n break;\n case 'video':\n body = (\n <video\n src={url}\n controls\n className=\"max-h-80 max-w-full rounded-lg bg-black\"\n >\n <track kind=\"captions\" />\n </video>\n );\n break;\n case 'audio':\n body = (\n <div className=\"max-w-sm\">\n <div className=\"mb-1 truncate text-xs text-neutral-500 dark:text-neutral-400\">\n {name}\n </div>\n <audio src={url} controls className=\"w-full\">\n <track kind=\"captions\" />\n </audio>\n </div>\n );\n break;\n case 'pdf':\n body = (\n <div className=\"max-w-2xl overflow-hidden rounded-lg border border-neutral-200 dark:border-neutral-700\">\n <div className=\"flex items-center justify-between gap-2 border-b border-neutral-200 bg-neutral-50 px-3 py-1.5 dark:border-neutral-700 dark:bg-neutral-800\">\n <span className=\"truncate text-sm\" title={name}>\n {name}\n </span>\n <a\n href={url}\n download={name}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-700 hover:text-primary-800 dark:text-primary-300 inline-flex items-center gap-1 text-xs whitespace-nowrap\"\n >\n <DownloadGlyph />\n Open\n </a>\n </div>\n <iframe src={url} title={name} className=\"h-96 w-full bg-white\" />\n </div>\n );\n break;\n default:\n body = <FileChip name={name} url={url} />;\n }\n\n return <div data-slot=\"superchat-attachment\">{body}</div>;\n}\n\n// ---------------------------------------------------------------------------\n// rehype: fenced block → <superchat-attachment>{json}</superchat-attachment>\n// ---------------------------------------------------------------------------\n\ninterface HastNode {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: HastNode[];\n}\n\nfunction textOf(node: HastNode): string {\n if (node.type === 'text') return node.value ?? '';\n return (node.children ?? []).map(textOf).join('');\n}\n\nfunction isAttachmentPre(node: HastNode): boolean {\n if (node.tagName !== 'pre') return false;\n const code = node.children?.find((c) => c.tagName === 'code');\n const className = code?.properties?.className;\n const classes = Array.isArray(className) ? className : [className];\n return classes.some(\n (c) =>\n typeof c === 'string' &&\n (c === `language-${ATTACHMENT_FENCE}` || c === ATTACHMENT_FENCE)\n );\n}\n\nfunction rehypeAttachment() {\n return (tree: HastNode) => {\n const walk = (node: HastNode) => {\n if (!node.children) return;\n node.children = node.children.map((child) => {\n if (isAttachmentPre(child)) {\n const code = child.children?.find((c) => c.tagName === 'code');\n const raw = code ? textOf(code) : '';\n return {\n type: 'element',\n tagName: ATTACHMENT_TAG,\n properties: {},\n children: [{ type: 'text', value: raw }],\n } satisfies HastNode;\n }\n walk(child);\n return child;\n });\n };\n walk(tree);\n };\n}\n\nfunction childText(children: React.ReactNode): string {\n return React.Children.toArray(children)\n .map((c) => (typeof c === 'string' ? c : ''))\n .join('');\n}\n\n/**\n * Allow-list the URL schemes that may back an attachment `src`.\n *\n * The payload rides as a Markdown text child, so it bypasses `rehype-sanitize`\n * and could otherwise smuggle a `javascript:` href or a `data:text/html` /\n * `image/svg+xml` source that executes script when rendered in the PDF iframe\n * or opened in a new tab (XSS / UI-redress). We trust only object URLs,\n * http(s), and `data:` URLs — and for `data:` we reject the MIME types that a\n * browser will execute as an active document. Anything else (including\n * `javascript:` / `vbscript:`) is treated as an absent `src`.\n */\nfunction sanitizeSrc(src: string | undefined): string | undefined {\n if (!src) return undefined;\n if (/^(?:blob:|https?:\\/\\/)/i.test(src)) return src;\n const dataMatch = /^data:([\\w.+-]+\\/[\\w.+-]+)?[;,]/i.exec(src);\n if (dataMatch) {\n const mime = (dataMatch[1] ?? 'text/plain').toLowerCase();\n const EXECUTABLE_MIME =\n /^(?:text\\/html|application\\/xhtml\\+xml|image\\/svg\\+xml|text\\/xml|application\\/xml)$/;\n return EXECUTABLE_MIME.test(mime) ? undefined : src;\n }\n return undefined;\n}\n\nfunction parsePayload(raw: string): AttachmentBlockPayload | null {\n try {\n const parsed = JSON.parse(raw) as Partial<AttachmentBlockPayload>;\n if (!parsed || typeof parsed.type !== 'string') return null;\n const src =\n typeof parsed.src === 'string' ? sanitizeSrc(parsed.src) : undefined;\n if (!parsed.id && !src) return null;\n return {\n id: typeof parsed.id === 'string' ? parsed.id : undefined,\n type: parsed.type,\n name: typeof parsed.name === 'string' ? parsed.name : 'attachment',\n src,\n };\n } catch {\n return null;\n }\n}\n\nfunction AttachmentElement({\n node: _node,\n children,\n}: {\n node?: unknown;\n children?: React.ReactNode;\n}) {\n const payload = parsePayload(childText(children));\n if (!payload) return null;\n return <AttachmentBlock payload={payload} />;\n}\n\n/**\n * Create the attachment render plugin: renders ` ```superchat-attachment `\n * blocks as inline image/video/audio/pdf players backed by the offline\n * {@link attachmentCache}.\n */\nexport function createAttachmentPlugin(): SuperChatRenderPlugin {\n return {\n name: 'attachment',\n rehypePlugins: [rehypeAttachment],\n components: {\n [ATTACHMENT_TAG]: AttachmentElement as React.ComponentType<\n Record<string, unknown>\n >,\n },\n // The payload rides as a text child; only the custom tag needs allow-listing.\n sanitizeSchema: {\n tagNames: [ATTACHMENT_TAG],\n },\n };\n}\n"]}
package/dist/datavis.cjs CHANGED
@@ -1,368 +1,24 @@
1
1
  'use strict';
2
2
 
3
- var react = require('react');
4
- var datavisAce = require('datavis-ace');
5
- var datavis = require('@mieweb/datavis');
6
- var jsxRuntime = require('react/jsx-runtime');
3
+ var chunkLZPPH5BW_cjs = require('./chunk-LZPPH5BW.cjs');
7
4
 
8
- // src/components/DataVisNITRO/DataVisNITRO.tsx
9
- var DataVisNitroContext = react.createContext(null);
10
- function isObject(value) {
11
- return typeof value === "object" && value !== null;
12
- }
13
- function normalizeTypeInfo(typeInfo) {
14
- if (Array.isArray(typeInfo)) {
15
- return Object.fromEntries(
16
- typeInfo.filter(isObject).map((entry) => [entry.field, entry])
17
- );
18
- }
19
- if (!isObject(typeInfo)) {
20
- return {};
21
- }
22
- const maybeOrdMap = typeInfo;
23
- if (typeof maybeOrdMap.keys === "function" && typeof maybeOrdMap.get === "function") {
24
- return Object.fromEntries(
25
- maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])
26
- );
27
- }
28
- return Object.fromEntries(
29
- Object.entries(typeInfo).filter(([, value]) => isObject(value))
30
- );
31
- }
32
- function normalizeFieldType(type) {
33
- if (!type) return void 0;
34
- if (type === "integer") return "number";
35
- if (type === "boolean") return "string";
36
- return type;
37
- }
38
- function buildColumnFromField(field, typeInfo) {
39
- const info = typeInfo[field];
40
- const normalizedType = normalizeFieldType(info?.type);
41
- return {
42
- field,
43
- header: info?.displayText ?? field,
44
- sortable: true,
45
- filterable: true,
46
- resizable: true,
47
- reorderable: true,
48
- ...normalizedType ? {
49
- typeInfo: {
50
- type: normalizedType,
51
- ...info?.format !== void 0 ? { format: info.format } : {},
52
- ...info?.internalType !== void 0 ? { internalType: info.internalType } : {}
53
- }
54
- } : {}
55
- };
56
- }
57
- function mergeColumnWithTypeInfo(column, typeInfo) {
58
- const fallbackColumn = buildColumnFromField(column.field, typeInfo);
59
- return {
60
- ...fallbackColumn,
61
- ...column,
62
- header: column.header ?? fallbackColumn.header,
63
- typeInfo: column.typeInfo ?? fallbackColumn.typeInfo
64
- };
65
- }
66
- function buildResolvedColumns(columns, fallbackFields, typeInfo) {
67
- if (columns && columns.length > 0) {
68
- return columns.map((column) => {
69
- if (typeof column === "string") {
70
- return buildColumnFromField(column, typeInfo);
71
- }
72
- return mergeColumnWithTypeInfo(column, typeInfo);
73
- });
74
- }
75
- return fallbackFields.map((field) => buildColumnFromField(field, typeInfo));
76
- }
77
- function buildFallbackFieldOrder(typeInfo, data) {
78
- const rows = Array.isArray(data) ? data.filter((row) => isObject(row)) : null;
79
- const normalizedEntries = Object.fromEntries(
80
- Object.entries(typeInfo).map(([field, info]) => [
81
- field,
82
- {
83
- type: normalizeFieldType(info.type) ?? "string",
84
- ...info.displayText !== void 0 ? { displayText: info.displayText } : {}
85
- }
86
- ])
87
- );
88
- return datavis.determineColumns(null, normalizedEntries, rows);
89
- }
90
- function buildControlFields(columns) {
91
- return columns.map((column) => ({
92
- field: column.field,
93
- displayName: column.header,
94
- type: column.typeInfo?.type
95
- }));
96
- }
97
- function buildAggregateFields(columns) {
98
- return columns.map((column) => ({
99
- field: column.field,
100
- displayName: column.header
101
- }));
102
- }
103
- function mergeTableDef(tableDef, features) {
104
- if (!tableDef && !features) {
105
- return void 0;
106
- }
107
- const { rowMode, ...featureFlags } = features ?? {};
108
- return {
109
- ...tableDef,
110
- ...rowMode !== void 0 ? { rowMode } : {},
111
- ...Object.keys(featureFlags).length > 0 ? {
112
- features: {
113
- ...tableDef?.features ?? {},
114
- ...featureFlags
115
- }
116
- } : {}
117
- };
118
- }
119
- function DataVisNitroSource(props) {
120
- const { type, children } = props;
121
- const url = props.type === "http" ? props.url : void 0;
122
- const viewRef = react.useRef(null);
123
- if (viewRef.current === null || viewRef.current._dvType !== type || viewRef.current._dvUrl !== url) {
124
- const source = props.type === "http" ? new datavisAce.Source({ type, url: props.url }) : new datavisAce.Source({ type });
125
- viewRef.current = Object.assign(
126
- new datavisAce.ComputedView(source),
127
- { _dvType: type, _dvUrl: url }
128
- );
129
- }
130
- return /* @__PURE__ */ jsxRuntime.jsx(DataVisNitroContext.Provider, { value: viewRef.current, children });
131
- }
132
- function DataVisNitroGridInner({
133
- computedView,
134
- columns,
135
- allColumns,
136
- features,
137
- filterColumns,
138
- controlFields,
139
- aggregateFields,
140
- aggregateFunctions,
141
- groupFunctionDefs,
142
- tableDef,
143
- formatCell,
144
- onColumnReorder,
145
- onColumnResize,
146
- onHeaderContextMenu,
147
- onRowClick,
148
- onRowDoubleClick,
149
- onSelectionChange,
150
- style,
151
- trans,
152
- ...dataGridProps
153
- }) {
154
- const viewState = datavis.useView(computedView, false);
155
- const normalizedTypeInfo = react.useMemo(
156
- () => normalizeTypeInfo(viewState.typeInfo ?? computedView?.typeInfo ?? null),
157
- [computedView, viewState.typeInfo]
158
- );
159
- const fallbackFields = react.useMemo(
160
- () => buildFallbackFieldOrder(normalizedTypeInfo, viewState.data?.data ?? null),
161
- [normalizedTypeInfo, viewState.data?.data]
162
- );
163
- const resolvedAllColumns = react.useMemo(() => {
164
- if (allColumns && allColumns.length > 0) {
165
- return allColumns.map(
166
- (column) => mergeColumnWithTypeInfo(column, normalizedTypeInfo)
167
- );
168
- }
169
- return buildResolvedColumns(columns, fallbackFields, normalizedTypeInfo);
170
- }, [allColumns, columns, fallbackFields, normalizedTypeInfo]);
171
- const resolvedColumns = react.useMemo(() => {
172
- if (columns && columns.length > 0) {
173
- return buildResolvedColumns(
174
- columns,
175
- fallbackFields,
176
- normalizedTypeInfo
177
- ).filter((column) => column.visible !== false);
178
- }
179
- return resolvedAllColumns.filter((column) => column.visible !== false);
180
- }, [columns, fallbackFields, normalizedTypeInfo, resolvedAllColumns]);
181
- const effectiveAggregateFunctions = react.useMemo(
182
- () => aggregateFunctions ?? datavis.buildAggregateFunctions(),
183
- [aggregateFunctions]
184
- );
185
- const effectiveGroupFunctionDefs = react.useMemo(
186
- () => groupFunctionDefs ?? datavis.getBuiltinGroupFunctions(trans),
187
- [groupFunctionDefs, trans]
188
- );
189
- const effectiveTableDef = react.useMemo(
190
- () => mergeTableDef(tableDef, features),
191
- [tableDef, features]
192
- );
193
- const aggFnLabels = react.useMemo(
194
- () => Object.fromEntries(
195
- effectiveAggregateFunctions.map((fn) => [fn.name, fn.label])
196
- ),
197
- [effectiveAggregateFunctions]
198
- );
199
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style, children: /* @__PURE__ */ jsxRuntime.jsx(
200
- datavis.DataGrid,
201
- {
202
- ...dataGridProps,
203
- view: computedView,
204
- tableDef: effectiveTableDef,
205
- allColumns: resolvedAllColumns,
206
- filterColumns: filterColumns ?? [],
207
- controlFields: controlFields ?? buildControlFields(resolvedAllColumns),
208
- aggregateFields: aggregateFields ?? buildAggregateFields(resolvedAllColumns),
209
- aggregateFunctions: effectiveAggregateFunctions,
210
- groupFunctionDefs: effectiveGroupFunctionDefs,
211
- children: /* @__PURE__ */ jsxRuntime.jsx(
212
- datavis.TableRenderer,
213
- {
214
- viewData: viewState.data,
215
- columns: resolvedColumns,
216
- features: effectiveTableDef?.features ?? features,
217
- totalRows: viewState.totalRowCount ?? viewState.rowCount,
218
- loading: viewState.loading || !viewState.ready,
219
- formatCell,
220
- aggFnLabels,
221
- onColumnReorder,
222
- onColumnResize,
223
- onHeaderContextMenu,
224
- onRowClick,
225
- onRowDoubleClick,
226
- onSelectionChange
227
- }
228
- )
229
- }
230
- ) });
231
- }
232
- function DataVisNitroGrid(props) {
233
- const computedView = react.useContext(DataVisNitroContext);
234
- if (computedView === null) {
235
- return null;
236
- }
237
- return /* @__PURE__ */ jsxRuntime.jsx(DataVisNitroGridInner, { ...props, computedView });
238
- }
239
- DataVisNitroSource.displayName = "DataVisNitroSource";
240
- DataVisNitroGrid.displayName = "DataVisNitroGrid";
241
- function isObject2(value) {
242
- return typeof value === "object" && value !== null;
243
- }
244
- function normalizeTypeInfo2(typeInfo) {
245
- if (Array.isArray(typeInfo)) {
246
- return Object.fromEntries(
247
- typeInfo.filter(isObject2).map((entry) => [entry.field, entry])
248
- );
249
- }
250
- if (!isObject2(typeInfo)) {
251
- return {};
252
- }
253
- const maybeOrdMap = typeInfo;
254
- if (typeof maybeOrdMap.keys === "function" && typeof maybeOrdMap.get === "function") {
255
- return Object.fromEntries(
256
- maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])
257
- );
258
- }
259
- return Object.fromEntries(
260
- Object.entries(typeInfo).filter(([, value]) => isObject2(value))
261
- );
262
- }
263
- function normalizeFieldType2(type) {
264
- if (!type) return void 0;
265
- if (type === "integer") return "number";
266
- if (type === "boolean") return "string";
267
- return type;
268
- }
269
- function buildColumnFromField2(field, typeInfo) {
270
- const info = typeInfo[field];
271
- const normalizedType = normalizeFieldType2(info?.type);
272
- return {
273
- field,
274
- header: info?.displayText ?? field,
275
- sortable: true,
276
- filterable: true,
277
- resizable: true,
278
- reorderable: true,
279
- ...normalizedType ? {
280
- typeInfo: {
281
- type: normalizedType,
282
- ...info?.format !== void 0 ? { format: info.format } : {},
283
- ...info?.internalType !== void 0 ? { internalType: info.internalType } : {}
284
- }
285
- } : {}
286
- };
287
- }
288
- function buildResolvedColumns2(columns, fallbackFields, typeInfo) {
289
- if (columns && columns.length > 0) {
290
- return columns.map((column) => {
291
- if (typeof column === "string") {
292
- return buildColumnFromField2(column, typeInfo);
293
- }
294
- return column;
295
- });
296
- }
297
- return fallbackFields.map((field) => buildColumnFromField2(field, typeInfo));
298
- }
299
- function buildFallbackFieldOrder2(typeInfo, data) {
300
- const rows = Array.isArray(data) ? data.filter((row) => isObject2(row)) : null;
301
- const normalizedEntries = Object.fromEntries(
302
- Object.entries(typeInfo).map(([field, info]) => [
303
- field,
304
- {
305
- type: normalizeFieldType2(info.type) ?? "string",
306
- ...info.displayText !== void 0 ? { displayText: info.displayText } : {}
307
- }
308
- ])
309
- );
310
- return datavis.determineColumns(null, normalizedEntries, rows);
311
- }
312
- function DataVisNitroGraphInner({
313
- computedView,
314
- columns,
315
- config: initialConfig,
316
- locale,
317
- className,
318
- height,
319
- onConfigChange
320
- }) {
321
- const viewState = datavis.useView(computedView);
322
- const [liveConfig, setLiveConfig] = react.useState(initialConfig);
323
- const handleConfigChange = react.useCallback(
324
- (newConfig) => {
325
- setLiveConfig(newConfig);
326
- onConfigChange?.(newConfig);
327
- },
328
- [onConfigChange]
329
- );
330
- const normalizedTypeInfo = react.useMemo(
331
- () => normalizeTypeInfo2(viewState.typeInfo ?? computedView?.typeInfo ?? null),
332
- [computedView, viewState.typeInfo]
333
- );
334
- const fallbackFields = react.useMemo(
335
- () => buildFallbackFieldOrder2(normalizedTypeInfo, viewState.data?.data ?? null),
336
- [normalizedTypeInfo, viewState.data?.data]
337
- );
338
- const resolvedColumns = react.useMemo(
339
- () => buildResolvedColumns2(columns, fallbackFields, normalizedTypeInfo),
340
- [columns, fallbackFields, normalizedTypeInfo]
341
- );
342
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: height ? { height } : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(
343
- datavis.GraphView,
344
- {
345
- viewData: viewState.data,
346
- columns: resolvedColumns,
347
- config: liveConfig,
348
- locale,
349
- className,
350
- onConfigChange: handleConfigChange
351
- }
352
- ) });
353
- }
354
- function DataVisNitroGraph(props) {
355
- const computedView = react.useContext(DataVisNitroContext);
356
- if (computedView === null) {
357
- return null;
358
- }
359
- return /* @__PURE__ */ jsxRuntime.jsx(DataVisNitroGraphInner, { ...props, computedView });
360
- }
361
- DataVisNitroGraph.displayName = "DataVisNitroGraph";
362
5
 
363
- exports.DataVisNitroContext = DataVisNitroContext;
364
- exports.DataVisNitroGraph = DataVisNitroGraph;
365
- exports.DataVisNitroGrid = DataVisNitroGrid;
366
- exports.DataVisNitroSource = DataVisNitroSource;
6
+
7
+ Object.defineProperty(exports, "DataVisNitroContext", {
8
+ enumerable: true,
9
+ get: function () { return chunkLZPPH5BW_cjs.DataVisNitroContext; }
10
+ });
11
+ Object.defineProperty(exports, "DataVisNitroGraph", {
12
+ enumerable: true,
13
+ get: function () { return chunkLZPPH5BW_cjs.DataVisNitroGraph; }
14
+ });
15
+ Object.defineProperty(exports, "DataVisNitroGrid", {
16
+ enumerable: true,
17
+ get: function () { return chunkLZPPH5BW_cjs.DataVisNitroGrid; }
18
+ });
19
+ Object.defineProperty(exports, "DataVisNitroSource", {
20
+ enumerable: true,
21
+ get: function () { return chunkLZPPH5BW_cjs.DataVisNitroSource; }
22
+ });
367
23
  //# sourceMappingURL=datavis.cjs.map
368
24
  //# sourceMappingURL=datavis.cjs.map