@copilotkit/markdown 2.0.0-rc.20 → 2.0.0-rc.22

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Fragment"],"sources":["../../src/react/use-streaming-markdown-parser.tsx","../../src/react/streaming-markdown-renderer.tsx"],"sourcesContent":["import {\n createStreamingMarkdownParserState,\n finalizeStreamingMarkdown,\n parseStreamingMarkdownChunk,\n} from \"@copilotkit/markdown\";\nimport type {\n StreamingMarkdownParserOptions,\n StreamingMarkdownParserState,\n} from \"@copilotkit/markdown\";\nimport { useMemo, useRef } from \"react\";\n\ninterface StreamingMarkdownParserSession {\n parserState: StreamingMarkdownParserState;\n text: string;\n optionsKey: string;\n isCompleteInput: boolean;\n}\n\nconst DEFAULT_OPTIONS: StreamingMarkdownParserOptions = {\n segmenter: true,\n enableTables: true,\n enableAutolinks: true,\n};\n\nfunction normalizeOptions(\n options?: Partial<StreamingMarkdownParserOptions>,\n): StreamingMarkdownParserOptions {\n return {\n segmenter: options?.segmenter ?? DEFAULT_OPTIONS.segmenter,\n enableTables: options?.enableTables ?? DEFAULT_OPTIONS.enableTables,\n enableAutolinks:\n options?.enableAutolinks ?? DEFAULT_OPTIONS.enableAutolinks,\n };\n}\n\nfunction getSegmenterKey(\n segmenter: StreamingMarkdownParserOptions[\"segmenter\"],\n): string {\n if (segmenter === true || segmenter === false) {\n return String(segmenter);\n }\n\n const locale = segmenter.locale ?? \"\";\n const granularity = segmenter.granularity ?? \"word\";\n return `object:${locale}:${granularity}`;\n}\n\nfunction getOptionsKey(options: StreamingMarkdownParserOptions): string {\n return `${getSegmenterKey(options.segmenter)}|tables:${String(options.enableTables)}|autolinks:${String(options.enableAutolinks)}`;\n}\n\nfunction parseFullText(\n text: string,\n options: StreamingMarkdownParserOptions,\n isCompleteInput: boolean,\n): StreamingMarkdownParserState {\n const initialState = createStreamingMarkdownParserState(options);\n const parsedState =\n text.length > 0\n ? parseStreamingMarkdownChunk(initialState, text)\n : initialState;\n\n return isCompleteInput ? finalizeStreamingMarkdown(parsedState) : parsedState;\n}\n\nfunction createSession(\n text: string,\n options: StreamingMarkdownParserOptions,\n optionsKey: string,\n isCompleteInput: boolean,\n): StreamingMarkdownParserSession {\n return {\n parserState: parseFullText(text, options, isCompleteInput),\n text,\n optionsKey,\n isCompleteInput,\n };\n}\n\nfunction resolveNextSession(\n previous: StreamingMarkdownParserSession,\n text: string,\n options: StreamingMarkdownParserOptions,\n optionsKey: string,\n isCompleteInput: boolean,\n): StreamingMarkdownParserSession {\n const optionsChanged = previous.optionsKey !== optionsKey;\n const completionChanged = previous.isCompleteInput !== isCompleteInput;\n\n if (optionsChanged) {\n return createSession(text, options, optionsKey, isCompleteInput);\n }\n\n const textChanged = text !== previous.text;\n if (!textChanged && !completionChanged) {\n return previous;\n }\n\n if (!textChanged && completionChanged) {\n const parserState = isCompleteInput\n ? finalizeStreamingMarkdown(previous.parserState)\n : parseStreamingMarkdownChunk(previous.parserState, \"\");\n\n return {\n ...previous,\n parserState,\n isCompleteInput,\n };\n }\n\n let nextParserState: StreamingMarkdownParserState;\n\n if (text.startsWith(previous.text)) {\n const suffix = text.slice(previous.text.length);\n nextParserState =\n suffix.length > 0\n ? parseStreamingMarkdownChunk(previous.parserState, suffix)\n : previous.parserState;\n } else {\n nextParserState = parseFullText(text, options, false);\n }\n\n if (isCompleteInput) {\n nextParserState = finalizeStreamingMarkdown(nextParserState);\n }\n\n return {\n parserState: nextParserState,\n text,\n optionsKey,\n isCompleteInput,\n };\n}\n\n/**\n * Internal prop-driven hook for streaming markdown parsing in React.\n *\n * @param text - Full markdown text that typically grows over time.\n * @param options - Optional parser option overrides.\n * @param isCompleteInput - When true, finalizes the parse state for the current text.\n * @returns The current immutable streaming markdown parser state.\n */\nexport function useStreamingMarkdownParser(\n text: string,\n options?: Partial<StreamingMarkdownParserOptions>,\n isCompleteInput = false,\n): StreamingMarkdownParserState {\n const sessionRef = useRef<StreamingMarkdownParserSession | null>(null);\n const segmenter = options?.segmenter;\n const segmenterKind =\n typeof segmenter === \"object\" && segmenter !== null\n ? \"object\"\n : String(segmenter ?? true);\n const segmenterLocale =\n typeof segmenter === \"object\" && segmenter !== null\n ? (segmenter.locale ?? \"\")\n : \"\";\n const segmenterGranularity =\n typeof segmenter === \"object\" && segmenter !== null\n ? (segmenter.granularity ?? \"word\")\n : \"\";\n const normalizedOptions = useMemo(\n () => normalizeOptions(options),\n [\n options?.enableAutolinks,\n options?.enableTables,\n segmenterKind,\n segmenterLocale,\n segmenterGranularity,\n ],\n );\n const optionsKey = getOptionsKey(normalizedOptions);\n\n const session = useMemo(() => {\n const previous =\n sessionRef.current ??\n createSession(text, normalizedOptions, optionsKey, isCompleteInput);\n\n const next = resolveNextSession(\n previous,\n text,\n normalizedOptions,\n optionsKey,\n isCompleteInput,\n );\n\n sessionRef.current = next;\n return next;\n }, [text, normalizedOptions, optionsKey, isCompleteInput]);\n\n return session.parserState;\n}\n","import type {\n CitationDefinition,\n CitationState,\n StreamingMarkdownAstNode,\n StreamingMarkdownNodeType,\n StreamingMarkdownParserOptions,\n TextSegment,\n} from \"@copilotkit/markdown\";\nimport { Fragment, useMemo, useRef } from \"react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport { useStreamingMarkdownParser } from \"./use-streaming-markdown-parser\";\n\n// URL allowlists for link/image rendering — mirrors the Vue renderer so both\n// frameworks honor the documented XSS guarantee (only http(s), mailto, tel,\n// relative, anchor, and non-SVG data:image/* URLs are allowed). Anything else\n// (javascript:, data:text/html, data:image/svg+xml, vbscript:, …) is dropped.\nconst SAFE_HREF = /^(https?:|mailto:|tel:|#|\\/|\\.\\/|\\.\\.\\/)/i;\nconst SAFE_IMG_SRC = /^(https?:|data:image\\/(?!svg)|\\/|\\.\\/|\\.\\.\\/)/i;\n\nfunction sanitizeHref(href: string | undefined): string | undefined {\n if (!href) return undefined;\n return SAFE_HREF.test(href.trim()) ? href : undefined;\n}\n\nfunction sanitizeImgSrc(src: string | undefined): string | undefined {\n if (!src) return undefined;\n return SAFE_IMG_SRC.test(src.trim()) ? src : undefined;\n}\n\n/**\n * Metadata available when a citation node is rendered.\n *\n * @public\n */\nexport interface StreamingMarkdownCitationRenderData {\n id: string;\n number: number | string;\n definition?: CitationDefinition;\n}\n\n/**\n * Props for the `StreamingMarkdownRenderer` component.\n *\n * @public\n */\nexport interface StreamingMarkdownRendererProps {\n /**\n * Full markdown source that grows over time.\n */\n children: string;\n\n /**\n * Optional parser option overrides.\n */\n options?: Partial<StreamingMarkdownParserOptions>;\n\n /**\n * When `true`, finalizes the parser state after applying the latest text.\n */\n isComplete?: boolean;\n\n /**\n * Caret rendering behavior for streaming output.\n *\n * - `false`/`undefined`: no caret\n * - `true`: render the default caret\n * - `ReactNode`: render a custom caret node\n * - function: render a custom caret node from parser state\n */\n caret?: StreamingMarkdownCaret;\n\n /**\n * Optional class applied to the root element.\n */\n className?: string;\n\n /**\n * Called when a link or autolink is clicked.\n */\n onLinkClick?: (\n event: MouseEvent<HTMLAnchorElement>,\n url: string,\n node: StreamingMarkdownAstNode,\n ) => void;\n\n /**\n * Called when a citation reference is clicked.\n */\n onCitationClick?: (\n event: MouseEvent<HTMLAnchorElement>,\n citation: StreamingMarkdownCitationRenderData,\n node: StreamingMarkdownAstNode,\n ) => void;\n\n /**\n * Optional custom renderers keyed by streaming markdown node type.\n */\n nodeRenderers?: StreamingMarkdownNodeRenderers;\n}\n\n/**\n * Props supplied to a custom node renderer.\n *\n * @public\n */\nexport interface StreamingMarkdownNodeRendererProps<\n TNode extends StreamingMarkdownAstNode = StreamingMarkdownAstNode,\n> {\n /**\n * The immutable AST node being rendered.\n */\n node: TNode;\n\n /**\n * Already-rendered child content for container nodes.\n */\n children: ReactNode;\n\n /**\n * Default element tree produced by `StreamingMarkdownRenderer` for this node.\n */\n defaultNode: ReactNode;\n\n /**\n * Citation metadata when rendering a citation node.\n */\n citation?: StreamingMarkdownCitationRenderData;\n}\n\n/**\n * Custom renderer callback for a specific streaming markdown node.\n *\n * @public\n */\nexport type StreamingMarkdownNodeRenderer<\n TNode extends StreamingMarkdownAstNode = StreamingMarkdownAstNode,\n> = (props: StreamingMarkdownNodeRendererProps<TNode>) => ReactNode;\n\n/**\n * Render context supplied to caret renderer callbacks.\n *\n * @public\n */\nexport interface StreamingMarkdownCaretRenderProps {\n /**\n * Whether the parser state is complete for the current source text.\n */\n isComplete: boolean;\n\n /**\n * The deepest currently open AST node, if any.\n */\n openNode: StreamingMarkdownAstNode | null;\n}\n\n/**\n * Callback type for custom caret renderers.\n *\n * @public\n */\nexport type StreamingMarkdownCaretRenderer = (\n props: StreamingMarkdownCaretRenderProps,\n) => ReactNode;\n\n/**\n * Supported caret prop values.\n *\n * @public\n */\nexport type StreamingMarkdownCaret =\n | boolean\n | ReactNode\n | StreamingMarkdownCaretRenderer;\n\ntype StreamingMarkdownNodeOfType<TNodeType extends StreamingMarkdownNodeType> =\n Extract<StreamingMarkdownAstNode, { type: TNodeType }>;\n\n/**\n * Supported key names for `nodeRenderers`.\n *\n * @public\n */\nexport type StreamingMarkdownNodeRendererKey =\n | \"node\"\n | \"document\"\n | \"paragraph\"\n | \"heading\"\n | \"blockquote\"\n | \"list\"\n | \"listItem\"\n | \"codeBlock\"\n | \"table\"\n | \"tableRow\"\n | \"tableCell\"\n | \"thematicBreak\"\n | \"text\"\n | \"em\"\n | \"strong\"\n | \"strikethrough\"\n | \"inlineCode\"\n | \"softBreak\"\n | \"hardBreak\"\n | \"image\"\n | \"link\"\n | \"autolink\"\n | \"citation\";\n\ntype StreamingMarkdownNodeByRendererKey = {\n node: StreamingMarkdownAstNode;\n document: StreamingMarkdownNodeOfType<\"document\">;\n paragraph: StreamingMarkdownNodeOfType<\"paragraph\">;\n heading: StreamingMarkdownNodeOfType<\"heading\">;\n blockquote: StreamingMarkdownNodeOfType<\"blockquote\">;\n list: StreamingMarkdownNodeOfType<\"list\">;\n listItem: StreamingMarkdownNodeOfType<\"list-item\">;\n codeBlock: StreamingMarkdownNodeOfType<\"code-block\">;\n table: StreamingMarkdownNodeOfType<\"table\">;\n tableRow: StreamingMarkdownNodeOfType<\"table-row\">;\n tableCell: StreamingMarkdownNodeOfType<\"table-cell\">;\n thematicBreak: StreamingMarkdownNodeOfType<\"thematic-break\">;\n text: StreamingMarkdownNodeOfType<\"text\">;\n em: StreamingMarkdownNodeOfType<\"em\">;\n strong: StreamingMarkdownNodeOfType<\"strong\">;\n strikethrough: StreamingMarkdownNodeOfType<\"strikethrough\">;\n inlineCode: StreamingMarkdownNodeOfType<\"inline-code\">;\n softBreak: StreamingMarkdownNodeOfType<\"soft-break\">;\n hardBreak: StreamingMarkdownNodeOfType<\"hard-break\">;\n image: StreamingMarkdownNodeOfType<\"image\">;\n link: StreamingMarkdownNodeOfType<\"link\">;\n autolink: StreamingMarkdownNodeOfType<\"autolink\">;\n citation: StreamingMarkdownNodeOfType<\"citation\">;\n};\n\n/**\n * Custom renderers keyed by camelCase node names.\n *\n * @public\n */\nexport type StreamingMarkdownNodeRenderers = Partial<{\n [TKey in StreamingMarkdownNodeRendererKey]: StreamingMarkdownNodeRenderer<\n StreamingMarkdownNodeByRendererKey[TKey]\n >;\n}>;\n\n/**\n * Helper for creating typed streaming markdown node renderer maps.\n *\n * @public\n */\nexport function createStreamingMarkdownNodeRenderers<\n T extends StreamingMarkdownNodeRenderers,\n>(renderers: T): T {\n return renderers;\n}\n\ntype RenderContext = {\n nodeById: Map<number, StreamingMarkdownAstNode>;\n citations: CitationState;\n onLinkClickRef: { current: StreamingMarkdownRendererProps[\"onLinkClick\"] };\n onCitationClickRef: {\n current: StreamingMarkdownRendererProps[\"onCitationClick\"];\n };\n nodeRenderers?: StreamingMarkdownNodeRenderers;\n caretTargetNodeId: number | null;\n caretNode: ReactNode;\n};\n\ntype StreamingMarkdownTextNode = Extract<\n StreamingMarkdownAstNode,\n { type: \"text\" }\n>;\ntype StreamingMarkdownCitationNode = Extract<\n StreamingMarkdownAstNode,\n { type: \"citation\" }\n>;\n\nconst WORD_JOINER = \"\\u2060\";\nconst DEFAULT_ROOT_CLASS = \"cpk-streaming-markdown-root\";\nconst DEFAULT_CITATION_CLASS = \"cpk-streaming-markdown-citation\";\nconst DEFAULT_CITATION_LABEL_CLASS = \"cpk-streaming-markdown-citation-label\";\nconst DEFAULT_STYLES = `\n .${DEFAULT_ROOT_CLASS} .cpk-streaming-markdown-segment {\n opacity: 1;\n transition: opacity 400ms ease-out;\n @starting-style {\n opacity: 0;\n }\n }\n\n .${DEFAULT_ROOT_CLASS} .${DEFAULT_CITATION_CLASS} {\n vertical-align: baseline;\n }\n\n .${DEFAULT_ROOT_CLASS} .${DEFAULT_CITATION_LABEL_CLASS} {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 1.4em;\n block-size: 1.4em;\n border-radius: 999px;\n border: 1px solid hsl(0 0% 50% / 0.35);\n background-color: hsl(0 0% 50% / 0.16);\n color: inherit;\n font-size: 0.7em;\n line-height: 1;\n font-variant-numeric: tabular-nums;\n text-decoration: none;\n transform: translateY(-0.15em);\n }\n`;\n\nconst DEFAULT_STYLES_FALLBACK = `\n .${DEFAULT_ROOT_CLASS} .cpk-streaming-markdown-segment {\n opacity: 1;\n transition: opacity 400ms ease-out;\n }\n\n .${DEFAULT_ROOT_CLASS} .${DEFAULT_CITATION_CLASS} {\n vertical-align: baseline;\n }\n\n .${DEFAULT_ROOT_CLASS} .${DEFAULT_CITATION_LABEL_CLASS} {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 1.4em;\n block-size: 1.4em;\n border-radius: 999px;\n border: 1px solid hsl(0 0% 50% / 0.35);\n background-color: hsl(0 0% 50% / 0.16);\n color: inherit;\n font-size: 0.7em;\n line-height: 1;\n font-variant-numeric: tabular-nums;\n text-decoration: none;\n transform: translateY(-0.15em);\n }\n`;\n\ntype ContainerNodeType = Extract<\n StreamingMarkdownNodeType,\n | \"document\"\n | \"paragraph\"\n | \"heading\"\n | \"blockquote\"\n | \"list\"\n | \"list-item\"\n | \"table\"\n | \"table-row\"\n | \"table-cell\"\n | \"em\"\n | \"strong\"\n | \"strikethrough\"\n | \"link\"\n>;\n\nconst NODE_TYPE_TO_RENDERER_KEY: Record<\n StreamingMarkdownNodeType,\n StreamingMarkdownNodeRendererKey\n> = {\n document: \"document\",\n paragraph: \"paragraph\",\n heading: \"heading\",\n blockquote: \"blockquote\",\n list: \"list\",\n \"list-item\": \"listItem\",\n \"code-block\": \"codeBlock\",\n table: \"table\",\n \"table-row\": \"tableRow\",\n \"table-cell\": \"tableCell\",\n \"thematic-break\": \"thematicBreak\",\n text: \"text\",\n em: \"em\",\n strong: \"strong\",\n strikethrough: \"strikethrough\",\n \"inline-code\": \"inlineCode\",\n \"soft-break\": \"softBreak\",\n \"hard-break\": \"hardBreak\",\n image: \"image\",\n link: \"link\",\n autolink: \"autolink\",\n citation: \"citation\",\n};\n\nfunction renderWithOverride<TNode extends StreamingMarkdownAstNode>(\n node: TNode,\n context: RenderContext,\n defaultNode: ReactNode,\n children: ReactNode = null,\n citation?: StreamingMarkdownCitationRenderData,\n): ReactNode {\n const rendererKey = NODE_TYPE_TO_RENDERER_KEY[node.type];\n const renderer = (context.nodeRenderers?.[rendererKey] ??\n context.nodeRenderers?.node) as\n | StreamingMarkdownNodeRenderer<TNode>\n | undefined;\n\n if (!renderer) {\n return defaultNode;\n }\n\n return renderer({\n node,\n children,\n defaultNode,\n citation,\n });\n}\n\nfunction renderChildren(\n node: { children: number[] },\n context: RenderContext,\n): ReactNode {\n return node.children.map((childId) => {\n const childNode = context.nodeById.get(childId);\n\n if (!childNode) {\n return null;\n }\n\n return <Fragment key={childId}>{renderNode(childNode, context)}</Fragment>;\n });\n}\n\nfunction renderCaret(nodeId: number, context: RenderContext): ReactNode {\n if (context.caretTargetNodeId !== nodeId) {\n return null;\n }\n\n return <Fragment key={`caret-${nodeId}`}>{context.caretNode}</Fragment>;\n}\n\nfunction renderDefaultCaret(): ReactNode {\n return (\n <span\n aria-hidden\n className=\"cpk-streaming-markdown-caret\"\n data-streaming-markdown-caret\n style={{\n display: \"inline-block\",\n width: \"0.48em\",\n height: \"0.48em\",\n marginInlineStart: \"0.08em\",\n verticalAlign: \"-0.08em\",\n borderRadius: \"999px\",\n backgroundColor: \"currentColor\",\n opacity: 0.55,\n }}\n />\n );\n}\n\nfunction resolveCaretNode(\n caret: StreamingMarkdownCaret | undefined,\n props: StreamingMarkdownCaretRenderProps,\n): ReactNode {\n if (caret === undefined || caret === false || caret === null) {\n return null;\n }\n\n if (caret === true) {\n return renderDefaultCaret();\n }\n\n if (typeof caret === \"function\") {\n return caret(props);\n }\n\n return caret;\n}\n\nfunction renderTextSegments(node: StreamingMarkdownTextNode): ReactNode {\n if (node.text.length === 0) {\n return null;\n }\n\n if (node.segments.length === 0) {\n return (\n <span\n key={`segment-${node.id}-full`}\n className=\"cpk-streaming-markdown-segment\"\n data-streaming-markdown-segment-kind=\"full\"\n data-streaming-markdown-whitespace=\"false\"\n >\n {node.text}\n </span>\n );\n }\n\n return node.segments.map((segment: TextSegment) => (\n <span\n key={`segment-${node.id}-${segment.start}-${segment.kind}`}\n className=\"cpk-streaming-markdown-segment\"\n data-streaming-markdown-segment-kind={segment.kind}\n data-streaming-markdown-whitespace={String(segment.isWhitespace)}\n >\n {segment.noBreakBefore ? `${WORD_JOINER}${segment.text}` : segment.text}\n </span>\n ));\n}\n\nfunction handleLinkClick(\n context: RenderContext,\n node: StreamingMarkdownAstNode,\n url: string,\n) {\n return (event: MouseEvent<HTMLAnchorElement>) => {\n context.onLinkClickRef.current?.(event, url, node);\n };\n}\n\nfunction getCitationRenderData(\n node: StreamingMarkdownCitationNode,\n context: RenderContext,\n): StreamingMarkdownCitationRenderData {\n const number =\n node.number ?? context.citations.numbers[node.idRef] ?? node.idRef;\n const definition = context.citations.definitions[node.idRef];\n return {\n id: node.idRef,\n number,\n definition,\n } satisfies StreamingMarkdownCitationRenderData;\n}\n\nfunction renderDefaultCitation(\n node: StreamingMarkdownCitationNode,\n context: RenderContext,\n citation: StreamingMarkdownCitationRenderData,\n): ReactNode {\n const label = String(citation.number);\n const href = sanitizeHref(citation.definition?.url);\n\n if (!href) {\n return (\n <sup\n key={node.id}\n className={DEFAULT_CITATION_CLASS}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n <span role=\"doc-noteref\" className={DEFAULT_CITATION_LABEL_CLASS}>\n {label}\n </span>\n </sup>\n );\n }\n\n return (\n <sup\n key={node.id}\n className={DEFAULT_CITATION_CLASS}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n role=\"doc-noteref\"\n className={DEFAULT_CITATION_LABEL_CLASS}\n onClick={(event) => {\n context.onCitationClickRef.current?.(event, citation, node);\n }}\n >\n {label}\n </a>\n </sup>\n );\n}\n\nfunction renderContainerNode(\n node: Extract<StreamingMarkdownAstNode, { type: ContainerNodeType }>,\n context: RenderContext,\n): ReactNode {\n const children = (\n <>\n {renderChildren(node, context)}\n {renderCaret(node.id, context)}\n </>\n );\n\n if (node.type === \"document\") {\n return renderWithOverride(\n node,\n context,\n <Fragment key={node.id}>{children}</Fragment>,\n children,\n );\n }\n\n if (node.type === \"paragraph\") {\n const defaultNode = (\n <p\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </p>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"heading\") {\n const headingTag = `h${node.level}` as const;\n const defaultNode =\n headingTag === \"h1\" ? (\n <h1\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </h1>\n ) : headingTag === \"h2\" ? (\n <h2\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </h2>\n ) : headingTag === \"h3\" ? (\n <h3\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </h3>\n ) : headingTag === \"h4\" ? (\n <h4\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </h4>\n ) : headingTag === \"h5\" ? (\n <h5\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </h5>\n ) : (\n <h6\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </h6>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"blockquote\") {\n const defaultNode = (\n <blockquote\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </blockquote>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"list\") {\n if (node.ordered) {\n const defaultNode = (\n <ol\n key={node.id}\n start={node.start ?? undefined}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n data-list-tight={String(node.tight)}\n >\n {children}\n </ol>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n const defaultNode = (\n <ul\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n data-list-tight={String(node.tight)}\n >\n {children}\n </ul>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"list-item\") {\n const defaultNode = (\n <li\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </li>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"table\") {\n const defaultNode = (\n <table\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n <tbody>{children}</tbody>\n </table>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"table-row\") {\n const defaultNode = (\n <tr\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </tr>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"table-cell\") {\n const parent =\n node.parentId == null ? undefined : context.nodeById.get(node.parentId);\n const isHeaderRow = parent?.type === \"table-row\" && parent.isHeader;\n if (isHeaderRow) {\n const defaultNode = (\n <th\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </th>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n const defaultNode = (\n <td\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </td>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"em\") {\n const defaultNode = (\n <em\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </em>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"strong\") {\n const defaultNode = (\n <strong\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </strong>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"strikethrough\") {\n const defaultNode = (\n <s\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </s>\n );\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n const href = sanitizeHref(node.url);\n const defaultNode = (\n <a\n key={node.id}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={node.title}\n onClick={href ? handleLinkClick(context, node, href) : undefined}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {children}\n </a>\n );\n return renderWithOverride(node, context, defaultNode, children);\n}\n\nfunction renderNode(\n node: StreamingMarkdownAstNode,\n context: RenderContext,\n): ReactNode {\n if (\n node.type === \"document\" ||\n node.type === \"paragraph\" ||\n node.type === \"heading\" ||\n node.type === \"blockquote\" ||\n node.type === \"list\" ||\n node.type === \"list-item\" ||\n node.type === \"table\" ||\n node.type === \"table-row\" ||\n node.type === \"table-cell\" ||\n node.type === \"em\" ||\n node.type === \"strong\" ||\n node.type === \"strikethrough\" ||\n node.type === \"link\"\n ) {\n return renderContainerNode(node, context);\n }\n\n if (node.type === \"code-block\") {\n const defaultNode = (\n <pre\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n <code data-code-info={node.info ?? undefined}>\n {node.text}\n {renderCaret(node.id, context)}\n </code>\n </pre>\n );\n return renderWithOverride(node, context, defaultNode);\n }\n\n if (node.type === \"thematic-break\") {\n const defaultNode = (\n <hr\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n />\n );\n return renderWithOverride(node, context, defaultNode);\n }\n\n if (node.type === \"text\") {\n const children = renderTextSegments(node);\n const defaultNode = <Fragment key={node.id}>{children}</Fragment>;\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"inline-code\") {\n const defaultNode = (\n <code\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {node.text}\n </code>\n );\n return renderWithOverride(node, context, defaultNode, node.text);\n }\n\n if (node.type === \"soft-break\") {\n const children = \"\\n\";\n const defaultNode = <Fragment key={node.id}>{children}</Fragment>;\n return renderWithOverride(node, context, defaultNode, children);\n }\n\n if (node.type === \"hard-break\") {\n const defaultNode = (\n <br\n key={node.id}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n />\n );\n return renderWithOverride(node, context, defaultNode);\n }\n\n if (node.type === \"image\") {\n const defaultNode = (\n <img\n key={node.id}\n src={sanitizeImgSrc(node.url)}\n alt={node.alt}\n title={node.title}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n />\n );\n return renderWithOverride(node, context, defaultNode);\n }\n\n if (node.type === \"autolink\") {\n const href = sanitizeHref(node.url);\n const defaultNode = (\n <a\n key={node.id}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={href ? handleLinkClick(context, node, href) : undefined}\n data-streaming-markdown-node={node.type}\n data-node-open={String(!node.closed)}\n >\n {node.text}\n </a>\n );\n return renderWithOverride(node, context, defaultNode, node.text);\n }\n\n const citation = getCitationRenderData(node, context);\n const defaultNode = renderDefaultCitation(node, context, citation);\n return renderWithOverride(node, context, defaultNode, null, citation);\n}\n\n/**\n * React renderer for streaming markdown parser output.\n *\n * @public\n */\nexport function StreamingMarkdownRenderer({\n children,\n options,\n isComplete = false,\n caret,\n className,\n onLinkClick,\n onCitationClick,\n nodeRenderers,\n}: StreamingMarkdownRendererProps) {\n const text = children ?? \"\";\n const parserState = useStreamingMarkdownParser(text, options, isComplete);\n const onLinkClickRef =\n useRef<StreamingMarkdownRendererProps[\"onLinkClick\"]>(onLinkClick);\n const onCitationClickRef =\n useRef<StreamingMarkdownRendererProps[\"onCitationClick\"]>(onCitationClick);\n onLinkClickRef.current = onLinkClick;\n onCitationClickRef.current = onCitationClick;\n\n const nodeById = useMemo(() => {\n const map = new Map<number, StreamingMarkdownAstNode>();\n\n for (const node of parserState.nodes) {\n map.set(node.id, node);\n }\n\n return map;\n }, [parserState.nodes]);\n\n const context = useMemo(() => {\n const openNode = findDeepestOpenRenderableNode(parserState.stack, nodeById);\n const caretNode = resolveCaretNode(caret, {\n isComplete: parserState.isComplete,\n openNode,\n });\n const caretTargetNodeId =\n !parserState.isComplete && openNode != null && caretNode != null\n ? openNode.id\n : null;\n\n return {\n nodeById,\n citations: parserState.citations,\n onLinkClickRef,\n onCitationClickRef,\n nodeRenderers,\n caretTargetNodeId,\n caretNode,\n };\n }, [\n nodeById,\n parserState.citations,\n parserState.isComplete,\n parserState.stack,\n nodeRenderers,\n caret,\n ]);\n\n const rootNode =\n parserState.rootId == null ? undefined : nodeById.get(parserState.rootId);\n const rootClassName = className\n ? `${DEFAULT_ROOT_CLASS} ${className}`\n : DEFAULT_ROOT_CLASS;\n const styleText =\n typeof navigator !== \"undefined\" && /jsdom/i.test(navigator.userAgent)\n ? DEFAULT_STYLES_FALLBACK\n : DEFAULT_STYLES;\n\n if (!rootNode) {\n return (\n <>\n <style>{styleText}</style>\n <div className={rootClassName} data-streaming-markdown-root />\n </>\n );\n }\n\n return (\n <>\n <style>{styleText}</style>\n <div className={rootClassName} data-streaming-markdown-root>\n {renderNode(rootNode, context)}\n </div>\n </>\n );\n}\n\nfunction findDeepestOpenRenderableNode(\n stack: number[],\n nodeById: Map<number, StreamingMarkdownAstNode>,\n): StreamingMarkdownAstNode | null {\n for (let index = stack.length - 1; index >= 0; index -= 1) {\n const candidate = nodeById.get(stack[index]) ?? null;\n if (candidate && candidate.type !== \"document\") {\n return candidate;\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["STREAMING_MARKDOWN_CARET_ATTRS","STREAMING_MARKDOWN_CARET_STYLE","Fragment","STREAMING_MARKDOWN_ROOT_CLASS"],"sources":["../../src/react/use-streaming-markdown-parser.tsx","../../src/react/streaming-markdown-renderer.tsx"],"sourcesContent":["import { updateStreamingMarkdownParserSession } from \"@copilotkit/markdown\";\nimport type {\n StreamingMarkdownParserOptions,\n StreamingMarkdownParserSession,\n} from \"@copilotkit/markdown\";\nimport { useMemo, useRef } from \"react\";\n\n/**\n * Internal prop-driven hook for streaming markdown parsing in React.\n *\n * @param text - Full markdown text that typically grows over time.\n * @param options - Optional parser option overrides.\n * @param isCompleteInput - When true, finalizes the parse state for the current text.\n * @returns The current immutable streaming markdown parser state.\n */\nexport function useStreamingMarkdownParser(\n text: string,\n options?: Partial<StreamingMarkdownParserOptions>,\n isCompleteInput = false,\n) {\n const sessionRef = useRef<StreamingMarkdownParserSession | null>(null);\n // The session compares options by value, so a new options object with the\n // same values keeps the parsed state (and node identity).\n const session = useMemo(() => {\n const next = updateStreamingMarkdownParserSession(\n sessionRef.current,\n text,\n options,\n isCompleteInput,\n );\n sessionRef.current = next;\n return next;\n }, [text, options, isCompleteInput]);\n\n return session.parserState;\n}\n","import {\n STREAMING_MARKDOWN_CARET_ATTRS,\n STREAMING_MARKDOWN_CARET_STYLE,\n STREAMING_MARKDOWN_ROOT_CLASS,\n buildStreamingMarkdownRenderTree,\n findStreamingMarkdownOpenNode,\n getStreamingMarkdownStyles,\n} from \"@copilotkit/markdown\";\nimport type {\n StreamingMarkdownAstNode,\n StreamingMarkdownCitationRenderData,\n StreamingMarkdownNodeClassNames,\n StreamingMarkdownNodeRendererKey,\n StreamingMarkdownNodeType,\n StreamingMarkdownParserOptions,\n StreamingMarkdownRenderChild,\n StreamingMarkdownRenderElement,\n StreamingMarkdownRenderNode,\n} from \"@copilotkit/markdown\";\nimport { Fragment, createElement, useMemo, useRef } from \"react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport { useStreamingMarkdownParser } from \"./use-streaming-markdown-parser\";\n\nexport type {\n StreamingMarkdownCitationRenderData,\n StreamingMarkdownNodeRendererKey,\n} from \"@copilotkit/markdown\";\n\n/**\n * Props for the `StreamingMarkdownRenderer` component.\n *\n * @public\n */\nexport interface StreamingMarkdownRendererProps {\n /**\n * Full markdown source that grows over time.\n */\n children: string;\n\n /**\n * Optional parser option overrides.\n */\n options?: Partial<StreamingMarkdownParserOptions>;\n\n /**\n * When `true`, finalizes the parser state after applying the latest text.\n */\n isComplete?: boolean;\n\n /**\n * Caret rendering behavior for streaming output.\n *\n * - `false`/`undefined`: no caret\n * - `true`: render the default caret\n * - `ReactNode`: render a custom caret node\n * - function: render a custom caret node from parser state\n */\n caret?: StreamingMarkdownCaret;\n\n /**\n * Optional class applied to the root element.\n */\n className?: string;\n\n /**\n * Called when a link or autolink is clicked.\n */\n onLinkClick?: (\n event: MouseEvent<HTMLAnchorElement>,\n url: string,\n node: StreamingMarkdownAstNode,\n ) => void;\n\n /**\n * Called when a citation reference is clicked.\n */\n onCitationClick?: (\n event: MouseEvent<HTMLAnchorElement>,\n citation: StreamingMarkdownCitationRenderData,\n node: StreamingMarkdownAstNode,\n ) => void;\n\n /**\n * Optional custom renderers keyed by streaming markdown node type.\n */\n nodeRenderers?: StreamingMarkdownNodeRenderers;\n\n /**\n * Extra classes for the default element of a node type, for example\n * `{ codeBlock: \"my-code-block\" }`.\n */\n nodeClassNames?: StreamingMarkdownNodeClassNames;\n}\n\n/**\n * Props supplied to a custom node renderer.\n *\n * @public\n */\nexport interface StreamingMarkdownNodeRendererProps<\n TNode extends StreamingMarkdownAstNode = StreamingMarkdownAstNode,\n> {\n /**\n * The immutable AST node being rendered.\n */\n node: TNode;\n\n /**\n * Already-rendered child content for container nodes.\n */\n children: ReactNode;\n\n /**\n * Default element tree produced by `StreamingMarkdownRenderer` for this node.\n */\n defaultNode: ReactNode;\n\n /**\n * Citation metadata when rendering a citation node.\n */\n citation?: StreamingMarkdownCitationRenderData;\n}\n\n/**\n * Custom renderer callback for a specific streaming markdown node.\n *\n * @public\n */\nexport type StreamingMarkdownNodeRenderer<\n TNode extends StreamingMarkdownAstNode = StreamingMarkdownAstNode,\n> = (props: StreamingMarkdownNodeRendererProps<TNode>) => ReactNode;\n\n/**\n * Render context supplied to caret renderer callbacks.\n *\n * @public\n */\nexport interface StreamingMarkdownCaretRenderProps {\n /**\n * Whether the parser state is complete for the current source text.\n */\n isComplete: boolean;\n\n /**\n * The deepest currently open AST node, if any.\n */\n openNode: StreamingMarkdownAstNode | null;\n}\n\n/**\n * Callback type for custom caret renderers.\n *\n * @public\n */\nexport type StreamingMarkdownCaretRenderer = (\n props: StreamingMarkdownCaretRenderProps,\n) => ReactNode;\n\n/**\n * Supported caret prop values.\n *\n * @public\n */\nexport type StreamingMarkdownCaret =\n | boolean\n | ReactNode\n | StreamingMarkdownCaretRenderer;\n\ntype StreamingMarkdownNodeOfType<TNodeType extends StreamingMarkdownNodeType> =\n Extract<StreamingMarkdownAstNode, { type: TNodeType }>;\n\ntype StreamingMarkdownNodeByRendererKey = {\n node: StreamingMarkdownAstNode;\n document: StreamingMarkdownNodeOfType<\"document\">;\n paragraph: StreamingMarkdownNodeOfType<\"paragraph\">;\n heading: StreamingMarkdownNodeOfType<\"heading\">;\n blockquote: StreamingMarkdownNodeOfType<\"blockquote\">;\n list: StreamingMarkdownNodeOfType<\"list\">;\n listItem: StreamingMarkdownNodeOfType<\"list-item\">;\n codeBlock: StreamingMarkdownNodeOfType<\"code-block\">;\n table: StreamingMarkdownNodeOfType<\"table\">;\n tableRow: StreamingMarkdownNodeOfType<\"table-row\">;\n tableCell: StreamingMarkdownNodeOfType<\"table-cell\">;\n thematicBreak: StreamingMarkdownNodeOfType<\"thematic-break\">;\n text: StreamingMarkdownNodeOfType<\"text\">;\n em: StreamingMarkdownNodeOfType<\"em\">;\n strong: StreamingMarkdownNodeOfType<\"strong\">;\n strikethrough: StreamingMarkdownNodeOfType<\"strikethrough\">;\n inlineCode: StreamingMarkdownNodeOfType<\"inline-code\">;\n softBreak: StreamingMarkdownNodeOfType<\"soft-break\">;\n hardBreak: StreamingMarkdownNodeOfType<\"hard-break\">;\n image: StreamingMarkdownNodeOfType<\"image\">;\n link: StreamingMarkdownNodeOfType<\"link\">;\n autolink: StreamingMarkdownNodeOfType<\"autolink\">;\n citation: StreamingMarkdownNodeOfType<\"citation\">;\n math: StreamingMarkdownNodeOfType<\"math\">;\n};\n\n/**\n * Custom renderers keyed by camelCase node names.\n *\n * @public\n */\nexport type StreamingMarkdownNodeRenderers = Partial<{\n [TKey in StreamingMarkdownNodeRendererKey]: StreamingMarkdownNodeRenderer<\n StreamingMarkdownNodeByRendererKey[TKey]\n >;\n}>;\n\n/**\n * Helper for creating typed streaming markdown node renderer maps.\n *\n * @public\n */\nexport function createStreamingMarkdownNodeRenderers<\n T extends StreamingMarkdownNodeRenderers,\n>(renderers: T): T {\n return renderers;\n}\n\ntype RenderContext = {\n onLinkClickRef: { current: StreamingMarkdownRendererProps[\"onLinkClick\"] };\n onCitationClickRef: {\n current: StreamingMarkdownRendererProps[\"onCitationClick\"];\n };\n nodeRenderers?: StreamingMarkdownNodeRenderers;\n caretNode: ReactNode;\n};\n\nfunction renderDefaultCaret() {\n return (\n <span\n {...STREAMING_MARKDOWN_CARET_ATTRS}\n style={STREAMING_MARKDOWN_CARET_STYLE}\n />\n );\n}\n\nfunction resolveCaretNode(\n caret: StreamingMarkdownCaret | undefined,\n props: StreamingMarkdownCaretRenderProps,\n): ReactNode {\n if (caret === undefined || caret === false || caret === null) {\n return null;\n }\n\n if (caret === true) {\n return renderDefaultCaret();\n }\n\n if (typeof caret === \"function\") {\n return caret(props);\n }\n\n return caret;\n}\n\nfunction toReactProps(\n element: StreamingMarkdownRenderElement,\n context: RenderContext,\n) {\n const props: Record<string, unknown> = { key: element.key };\n const entries = Object.entries(element.attrs);\n for (const [name, value] of entries) {\n props[name === \"class\" ? \"className\" : name] = value;\n }\n // A task-list checkbox is display-only; readOnly tells React it is\n // intentionally uncontrolled by user input.\n if (element.tag === \"input\") props.readOnly = true;\n\n const action = element.action;\n if (action?.type === \"link\") {\n props.onClick = (event: MouseEvent<HTMLAnchorElement>) => {\n context.onLinkClickRef.current?.(event, action.url, action.node);\n };\n }\n if (action?.type === \"citation\") {\n props.onClick = (event: MouseEvent<HTMLAnchorElement>) => {\n context.onCitationClickRef.current?.(event, action.citation, action.node);\n };\n }\n return props;\n}\n\nconst VOID_TAGS = new Set([\"br\", \"hr\", \"img\", \"input\"]);\n\nfunction renderList(\n children: StreamingMarkdownRenderChild[],\n context: RenderContext,\n slot: ReactNode,\n): ReactNode[] {\n return children.map((child) => renderChild(child, context, slot));\n}\n\n/** Unwraps single-entry lists so overrides see `\"text\"` rather than `[\"text\"]`. */\nfunction collapse(nodes: ReactNode[]): ReactNode {\n return nodes.length === 1 ? nodes[0] : nodes;\n}\n\nfunction renderChild(\n child: StreamingMarkdownRenderChild,\n context: RenderContext,\n slot: ReactNode,\n): ReactNode {\n switch (child.kind) {\n case \"node\":\n return renderRenderNode(child, context);\n case \"element\": {\n const props = toReactProps(child, context);\n return VOID_TAGS.has(child.tag)\n ? createElement(child.tag, props)\n : createElement(\n child.tag,\n props,\n ...renderList(child.children, context, slot),\n );\n }\n case \"text\":\n return child.text;\n case \"caret\":\n return <Fragment key={child.key}>{context.caretNode}</Fragment>;\n case \"slot\":\n return <Fragment key={child.key}>{slot}</Fragment>;\n default: {\n const unreachable: never = child;\n return unreachable;\n }\n }\n}\n\nfunction renderRenderNode(\n renderNode: StreamingMarkdownRenderNode,\n context: RenderContext,\n): ReactNode {\n const children =\n renderNode.children === null\n ? null\n : collapse(renderList(renderNode.children, context, null));\n const defaultNode = collapse(\n renderList(renderNode.output, context, children),\n );\n const renderer = (context.nodeRenderers?.[renderNode.rendererKey] ??\n context.nodeRenderers?.node) as StreamingMarkdownNodeRenderer | undefined;\n\n const rendered = renderer\n ? renderer({\n node: renderNode.node,\n children,\n defaultNode,\n citation: renderNode.citation,\n })\n : defaultNode;\n return <Fragment key={renderNode.key}>{rendered}</Fragment>;\n}\n\n/**\n * React renderer for streaming markdown parser output.\n *\n * @public\n */\nexport function StreamingMarkdownRenderer({\n children,\n options,\n isComplete = false,\n caret,\n className,\n onLinkClick,\n onCitationClick,\n nodeRenderers,\n nodeClassNames,\n}: StreamingMarkdownRendererProps) {\n const text = children ?? \"\";\n const parserState = useStreamingMarkdownParser(text, options, isComplete);\n const onLinkClickRef =\n useRef<StreamingMarkdownRendererProps[\"onLinkClick\"]>(onLinkClick);\n const onCitationClickRef =\n useRef<StreamingMarkdownRendererProps[\"onCitationClick\"]>(onCitationClick);\n onLinkClickRef.current = onLinkClick;\n onCitationClickRef.current = onCitationClick;\n\n const content = useMemo(() => {\n const caretNode = resolveCaretNode(caret, {\n isComplete: parserState.isComplete,\n openNode: findStreamingMarkdownOpenNode(parserState),\n });\n const tree = buildStreamingMarkdownRenderTree(parserState, {\n caret: caretNode != null,\n nodeClassNames,\n });\n if (!tree.root) return null;\n return renderRenderNode(tree.root, {\n onLinkClickRef,\n onCitationClickRef,\n nodeRenderers,\n caretNode,\n });\n }, [parserState, nodeRenderers, nodeClassNames, caret]);\n\n const rootClassName = className\n ? `${STREAMING_MARKDOWN_ROOT_CLASS} ${className}`\n : STREAMING_MARKDOWN_ROOT_CLASS;\n\n return (\n <>\n <style>{getStreamingMarkdownStyles()}</style>\n <div className={rootClassName} data-streaming-markdown-root>\n {content}\n </div>\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,18 +1,8 @@
1
1
  import * as react_jsx_runtime0 from "react/jsx-runtime";
2
- import { CitationDefinition, StreamingMarkdownAstNode, StreamingMarkdownNodeType, StreamingMarkdownParserOptions, StreamingMarkdownParserState } from "@copilotkit/markdown";
2
+ import { StreamingMarkdownAstNode, StreamingMarkdownCitationRenderData, StreamingMarkdownCitationRenderData as StreamingMarkdownCitationRenderData$1, StreamingMarkdownNodeClassNames, StreamingMarkdownNodeRendererKey, StreamingMarkdownNodeRendererKey as StreamingMarkdownNodeRendererKey$1, StreamingMarkdownNodeType, StreamingMarkdownParserOptions } from "@copilotkit/markdown";
3
3
  import { MouseEvent, ReactNode } from "react";
4
4
 
5
5
  //#region src/react/streaming-markdown-renderer.d.ts
6
- /**
7
- * Metadata available when a citation node is rendered.
8
- *
9
- * @public
10
- */
11
- interface StreamingMarkdownCitationRenderData {
12
- id: string;
13
- number: number | string;
14
- definition?: CitationDefinition;
15
- }
16
6
  /**
17
7
  * Props for the `StreamingMarkdownRenderer` component.
18
8
  *
@@ -51,11 +41,16 @@ interface StreamingMarkdownRendererProps {
51
41
  /**
52
42
  * Called when a citation reference is clicked.
53
43
  */
54
- onCitationClick?: (event: MouseEvent<HTMLAnchorElement>, citation: StreamingMarkdownCitationRenderData, node: StreamingMarkdownAstNode) => void;
44
+ onCitationClick?: (event: MouseEvent<HTMLAnchorElement>, citation: StreamingMarkdownCitationRenderData$1, node: StreamingMarkdownAstNode) => void;
55
45
  /**
56
46
  * Optional custom renderers keyed by streaming markdown node type.
57
47
  */
58
48
  nodeRenderers?: StreamingMarkdownNodeRenderers;
49
+ /**
50
+ * Extra classes for the default element of a node type, for example
51
+ * `{ codeBlock: "my-code-block" }`.
52
+ */
53
+ nodeClassNames?: StreamingMarkdownNodeClassNames;
59
54
  }
60
55
  /**
61
56
  * Props supplied to a custom node renderer.
@@ -78,7 +73,7 @@ interface StreamingMarkdownNodeRendererProps<TNode extends StreamingMarkdownAstN
78
73
  /**
79
74
  * Citation metadata when rendering a citation node.
80
75
  */
81
- citation?: StreamingMarkdownCitationRenderData;
76
+ citation?: StreamingMarkdownCitationRenderData$1;
82
77
  }
83
78
  /**
84
79
  * Custom renderer callback for a specific streaming markdown node.
@@ -116,12 +111,6 @@ type StreamingMarkdownCaret = boolean | ReactNode | StreamingMarkdownCaretRender
116
111
  type StreamingMarkdownNodeOfType<TNodeType extends StreamingMarkdownNodeType> = Extract<StreamingMarkdownAstNode, {
117
112
  type: TNodeType;
118
113
  }>;
119
- /**
120
- * Supported key names for `nodeRenderers`.
121
- *
122
- * @public
123
- */
124
- type StreamingMarkdownNodeRendererKey = "node" | "document" | "paragraph" | "heading" | "blockquote" | "list" | "listItem" | "codeBlock" | "table" | "tableRow" | "tableCell" | "thematicBreak" | "text" | "em" | "strong" | "strikethrough" | "inlineCode" | "softBreak" | "hardBreak" | "image" | "link" | "autolink" | "citation";
125
114
  type StreamingMarkdownNodeByRendererKey = {
126
115
  node: StreamingMarkdownAstNode;
127
116
  document: StreamingMarkdownNodeOfType<"document">;
@@ -146,13 +135,14 @@ type StreamingMarkdownNodeByRendererKey = {
146
135
  link: StreamingMarkdownNodeOfType<"link">;
147
136
  autolink: StreamingMarkdownNodeOfType<"autolink">;
148
137
  citation: StreamingMarkdownNodeOfType<"citation">;
138
+ math: StreamingMarkdownNodeOfType<"math">;
149
139
  };
150
140
  /**
151
141
  * Custom renderers keyed by camelCase node names.
152
142
  *
153
143
  * @public
154
144
  */
155
- type StreamingMarkdownNodeRenderers = Partial<{ [TKey in StreamingMarkdownNodeRendererKey]: StreamingMarkdownNodeRenderer<StreamingMarkdownNodeByRendererKey[TKey]> }>;
145
+ type StreamingMarkdownNodeRenderers = Partial<{ [TKey in StreamingMarkdownNodeRendererKey$1]: StreamingMarkdownNodeRenderer<StreamingMarkdownNodeByRendererKey[TKey]> }>;
156
146
  /**
157
147
  * Helper for creating typed streaming markdown node renderer maps.
158
148
  *
@@ -172,7 +162,8 @@ declare function StreamingMarkdownRenderer({
172
162
  className,
173
163
  onLinkClick,
174
164
  onCitationClick,
175
- nodeRenderers
165
+ nodeRenderers,
166
+ nodeClassNames
176
167
  }: StreamingMarkdownRendererProps): react_jsx_runtime0.JSX.Element;
177
168
  //#endregion
178
169
  //#region src/react/use-streaming-markdown-parser.d.ts
@@ -184,7 +175,7 @@ declare function StreamingMarkdownRenderer({
184
175
  * @param isCompleteInput - When true, finalizes the parse state for the current text.
185
176
  * @returns The current immutable streaming markdown parser state.
186
177
  */
187
- declare function useStreamingMarkdownParser(text: string, options?: Partial<StreamingMarkdownParserOptions>, isCompleteInput?: boolean): StreamingMarkdownParserState;
178
+ declare function useStreamingMarkdownParser(text: string, options?: Partial<StreamingMarkdownParserOptions>, isCompleteInput?: boolean): any;
188
179
  //#endregion
189
180
  export { type StreamingMarkdownCaret, type StreamingMarkdownCaretRenderProps, type StreamingMarkdownCaretRenderer, type StreamingMarkdownCitationRenderData, type StreamingMarkdownNodeRenderer, type StreamingMarkdownNodeRendererKey, type StreamingMarkdownNodeRendererProps, type StreamingMarkdownNodeRenderers, StreamingMarkdownRenderer, type StreamingMarkdownRendererProps, createStreamingMarkdownNodeRenderers, useStreamingMarkdownParser };
190
181
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/react/streaming-markdown-renderer.tsx","../../src/react/use-streaming-markdown-parser.tsx"],"mappings":";;;;;;;;AAkCA;;UAAiB,mCAAA;EACf,EAAA;EACA,MAAA;EACA,UAAA,GAAa,kBAAA;AAAA;;;;AAQf;;UAAiB,8BAAA;EASG;;;EALlB,QAAA;EA+BS;;;EA1BT,OAAA,GAAU,OAAA,CAAQ,8BAAA;EAoCN;;;EA/BZ,UAAA;EAsC8C;;;;;;;;EA5B9C,KAAA,GAAQ,sBAAA;EAUR;;;EALA,SAAA;EAOE;;;EAFF,WAAA,IACE,KAAA,EAAO,UAAA,CAAW,iBAAA,GAClB,GAAA,UACA,IAAA,EAAM,wBAAA;EAOC;;;EADT,eAAA,IACE,KAAA,EAAO,UAAA,CAAW,iBAAA,GAClB,QAAA,EAAU,mCAAA,EACV,IAAA,EAAM,wBAAA;EADN;;;EAOF,aAAA,GAAgB,8BAAA;AAAA;;;AAQlB;;;UAAiB,kCAAA,eACD,wBAAA,GAA2B,wBAAA;EAAA;;;EAKzC,IAAA,EAAM,KAAA;EAeK;;;EAVX,QAAA,EAAU,SAAA;EAVI;;;EAed,WAAA,EAAa,SAAA;EALb;;;EAUA,QAAA,GAAW,mCAAA;AAAA;;;;AAQb;;KAAY,6BAAA,eACI,wBAAA,GAA2B,wBAAA,KACtC,KAAA,EAAO,kCAAA,CAAmC,KAAA,MAAW,SAAA;;;;;;UAOzC,iCAAA;EAPkD;;;EAWjE,UAAA;EAXU;;;EAgBV,QAAA,EAAU,wBAAA;AAAA;;AATZ;;;;KAiBY,8BAAA,IACV,KAAA,EAAO,iCAAA,KACJ,SAAA;;;;;AAFL;KASY,sBAAA,aAER,SAAA,GACA,8BAAA;AAAA,KAEC,2BAAA,mBAA8C,yBAAA,IACjD,OAAA,CAAQ,wBAAA;EAA4B,IAAA,EAAM,SAAA;AAAA;;;;;AAN5C;KAaY,gCAAA;AAAA,KAyBP,kCAAA;EACH,IAAA,EAAM,wBAAA;EACN,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,OAAA,EAAS,2BAAA;EACT,UAAA,EAAY,2BAAA;EACZ,IAAA,EAAM,2BAAA;EACN,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,KAAA,EAAO,2BAAA;EACP,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,aAAA,EAAe,2BAAA;EACf,IAAA,EAAM,2BAAA;EACN,EAAA,EAAI,2BAAA;EACJ,MAAA,EAAQ,2BAAA;EACR,aAAA,EAAe,2BAAA;EACf,UAAA,EAAY,2BAAA;EACZ,SAAA,EAAW,2BAAA;EACX,SAAA,EAAW,2BAAA;EACX,KAAA,EAAO,2BAAA;EACP,IAAA,EAAM,2BAAA;EACN,QAAA,EAAU,2BAAA;EACV,QAAA,EAAU,2BAAA;AAAA;AAzBG;;;;;AAAA,KAiCH,8BAAA,GAAiC,OAAA,YAClC,gCAAA,GAAmC,6BAAA,CAC1C,kCAAA,CAAmC,IAAA;;;;;;iBASvB,oCAAA,WACJ,8BAAA,CAAA,CACV,SAAA,EAAW,CAAA,GAAI,CAAA;;;;;;iBA8rBD,yBAAA,CAAA;EACd,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA;AAAA,GACC,8BAAA,GAA8B,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;;;;AAh6BjC;;;;iBC4GgB,0BAAA,CACd,IAAA,UACA,OAAA,GAAU,OAAA,CAAQ,8BAAA,GAClB,eAAA,aACC,4BAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/react/streaming-markdown-renderer.tsx","../../src/react/use-streaming-markdown-parser.tsx"],"mappings":";;;;;;;AAiCA;;;UAAiB,8BAAA;EASL;;;EALV,QAAA;EAiCQ;;;EA5BR,OAAA,GAAU,OAAA,CAAQ,8BAAA;EAqCV;;;EAhCR,UAAA;EA4CgD;;;;;;;;EAlChD,KAAA,GAAQ,sBAAA;EAUR;;;EALA,SAAA;EAOE;;;EAFF,WAAA,IACE,KAAA,EAAO,UAAA,CAAW,iBAAA,GAClB,GAAA,UACA,IAAA,EAAM,wBAAA;EAOC;;;EADT,eAAA,IACE,KAAA,EAAO,UAAA,CAAW,iBAAA,GAClB,QAAA,EAAU,qCAAA,EACV,IAAA,EAAM,wBAAA;EADN;;;EAOF,aAAA,GAAgB,8BAAA;EAAA;;;;EAMhB,cAAA,GAAiB,+BAAA;AAAA;;;;;;UAQF,kCAAA,eACD,wBAAA,GAA2B,wBAAA;EAe5B;;;EAVb,IAAA,EAAM,KAAA;EALN;;;EAUA,QAAA,EAAU,SAAA;EALJ;;;EAUN,WAAA,EAAa,SAAA;EAAA;;;EAKb,QAAA,GAAW,qCAAA;AAAA;AAQb;;;;;AAAA,KAAY,6BAAA,eACI,wBAAA,GAA2B,wBAAA,KACtC,KAAA,EAAO,kCAAA,CAAmC,KAAA,MAAW,SAAA;;;;;;UAOzC,iCAAA;EAR0B;;;EAYzC,UAAA;EAXwD;;;EAgBxD,QAAA,EAAU,wBAAA;AAAA;;;;;;KAQA,8BAAA,IACV,KAAA,EAAO,iCAAA,KACJ,SAAA;;AAFL;;;;KASY,sBAAA,aAER,SAAA,GACA,8BAAA;AAAA,KAEC,2BAAA,mBAA8C,yBAAA,IACjD,OAAA,CAAQ,wBAAA;EAA4B,IAAA,EAAM,SAAA;AAAA;AAAA,KAEvC,kCAAA;EACH,IAAA,EAAM,wBAAA;EACN,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,OAAA,EAAS,2BAAA;EACT,UAAA,EAAY,2BAAA;EACZ,IAAA,EAAM,2BAAA;EACN,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,KAAA,EAAO,2BAAA;EACP,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,aAAA,EAAe,2BAAA;EACf,IAAA,EAAM,2BAAA;EACN,EAAA,EAAI,2BAAA;EACJ,MAAA,EAAQ,2BAAA;EACR,aAAA,EAAe,2BAAA;EACf,UAAA,EAAY,2BAAA;EACZ,SAAA,EAAW,2BAAA;EACX,SAAA,EAAW,2BAAA;EACX,KAAA,EAAO,2BAAA;EACP,IAAA,EAAM,2BAAA;EACN,QAAA,EAAU,2BAAA;EACV,QAAA,EAAU,2BAAA;EACV,IAAA,EAAM,2BAAA;AAAA;;;;;;KAQI,8BAAA,GAAiC,OAAA,YAClC,kCAAA,GAAmC,6BAAA,CAC1C,kCAAA,CAAmC,IAAA;;;;;;iBASvB,oCAAA,WACJ,8BAAA,CAAA,CACV,SAAA,EAAW,CAAA,GAAI,CAAA;;;;;;iBAgJD,yBAAA,CAAA;EACd,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,aAAA;EACA;AAAA,GACC,8BAAA,GAA8B,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;;;;AAjVjC;;;;iBClBgB,0BAAA,CACd,IAAA,UACA,OAAA,GAAU,OAAA,CAAQ,8BAAA,GAClB,eAAA"}
@@ -1,18 +1,8 @@
1
+ import { StreamingMarkdownAstNode, StreamingMarkdownCitationRenderData, StreamingMarkdownCitationRenderData as StreamingMarkdownCitationRenderData$1, StreamingMarkdownNodeClassNames, StreamingMarkdownNodeRendererKey, StreamingMarkdownNodeRendererKey as StreamingMarkdownNodeRendererKey$1, StreamingMarkdownNodeType, StreamingMarkdownParserOptions } from "@copilotkit/markdown";
1
2
  import { MouseEvent, ReactNode } from "react";
2
- import { CitationDefinition, StreamingMarkdownAstNode, StreamingMarkdownNodeType, StreamingMarkdownParserOptions, StreamingMarkdownParserState } from "@copilotkit/markdown";
3
3
  import * as react_jsx_runtime0 from "react/jsx-runtime";
4
4
 
5
5
  //#region src/react/streaming-markdown-renderer.d.ts
6
- /**
7
- * Metadata available when a citation node is rendered.
8
- *
9
- * @public
10
- */
11
- interface StreamingMarkdownCitationRenderData {
12
- id: string;
13
- number: number | string;
14
- definition?: CitationDefinition;
15
- }
16
6
  /**
17
7
  * Props for the `StreamingMarkdownRenderer` component.
18
8
  *
@@ -51,11 +41,16 @@ interface StreamingMarkdownRendererProps {
51
41
  /**
52
42
  * Called when a citation reference is clicked.
53
43
  */
54
- onCitationClick?: (event: MouseEvent<HTMLAnchorElement>, citation: StreamingMarkdownCitationRenderData, node: StreamingMarkdownAstNode) => void;
44
+ onCitationClick?: (event: MouseEvent<HTMLAnchorElement>, citation: StreamingMarkdownCitationRenderData$1, node: StreamingMarkdownAstNode) => void;
55
45
  /**
56
46
  * Optional custom renderers keyed by streaming markdown node type.
57
47
  */
58
48
  nodeRenderers?: StreamingMarkdownNodeRenderers;
49
+ /**
50
+ * Extra classes for the default element of a node type, for example
51
+ * `{ codeBlock: "my-code-block" }`.
52
+ */
53
+ nodeClassNames?: StreamingMarkdownNodeClassNames;
59
54
  }
60
55
  /**
61
56
  * Props supplied to a custom node renderer.
@@ -78,7 +73,7 @@ interface StreamingMarkdownNodeRendererProps<TNode extends StreamingMarkdownAstN
78
73
  /**
79
74
  * Citation metadata when rendering a citation node.
80
75
  */
81
- citation?: StreamingMarkdownCitationRenderData;
76
+ citation?: StreamingMarkdownCitationRenderData$1;
82
77
  }
83
78
  /**
84
79
  * Custom renderer callback for a specific streaming markdown node.
@@ -116,12 +111,6 @@ type StreamingMarkdownCaret = boolean | ReactNode | StreamingMarkdownCaretRender
116
111
  type StreamingMarkdownNodeOfType<TNodeType extends StreamingMarkdownNodeType> = Extract<StreamingMarkdownAstNode, {
117
112
  type: TNodeType;
118
113
  }>;
119
- /**
120
- * Supported key names for `nodeRenderers`.
121
- *
122
- * @public
123
- */
124
- type StreamingMarkdownNodeRendererKey = "node" | "document" | "paragraph" | "heading" | "blockquote" | "list" | "listItem" | "codeBlock" | "table" | "tableRow" | "tableCell" | "thematicBreak" | "text" | "em" | "strong" | "strikethrough" | "inlineCode" | "softBreak" | "hardBreak" | "image" | "link" | "autolink" | "citation";
125
114
  type StreamingMarkdownNodeByRendererKey = {
126
115
  node: StreamingMarkdownAstNode;
127
116
  document: StreamingMarkdownNodeOfType<"document">;
@@ -146,13 +135,14 @@ type StreamingMarkdownNodeByRendererKey = {
146
135
  link: StreamingMarkdownNodeOfType<"link">;
147
136
  autolink: StreamingMarkdownNodeOfType<"autolink">;
148
137
  citation: StreamingMarkdownNodeOfType<"citation">;
138
+ math: StreamingMarkdownNodeOfType<"math">;
149
139
  };
150
140
  /**
151
141
  * Custom renderers keyed by camelCase node names.
152
142
  *
153
143
  * @public
154
144
  */
155
- type StreamingMarkdownNodeRenderers = Partial<{ [TKey in StreamingMarkdownNodeRendererKey]: StreamingMarkdownNodeRenderer<StreamingMarkdownNodeByRendererKey[TKey]> }>;
145
+ type StreamingMarkdownNodeRenderers = Partial<{ [TKey in StreamingMarkdownNodeRendererKey$1]: StreamingMarkdownNodeRenderer<StreamingMarkdownNodeByRendererKey[TKey]> }>;
156
146
  /**
157
147
  * Helper for creating typed streaming markdown node renderer maps.
158
148
  *
@@ -172,7 +162,8 @@ declare function StreamingMarkdownRenderer({
172
162
  className,
173
163
  onLinkClick,
174
164
  onCitationClick,
175
- nodeRenderers
165
+ nodeRenderers,
166
+ nodeClassNames
176
167
  }: StreamingMarkdownRendererProps): react_jsx_runtime0.JSX.Element;
177
168
  //#endregion
178
169
  //#region src/react/use-streaming-markdown-parser.d.ts
@@ -184,7 +175,7 @@ declare function StreamingMarkdownRenderer({
184
175
  * @param isCompleteInput - When true, finalizes the parse state for the current text.
185
176
  * @returns The current immutable streaming markdown parser state.
186
177
  */
187
- declare function useStreamingMarkdownParser(text: string, options?: Partial<StreamingMarkdownParserOptions>, isCompleteInput?: boolean): StreamingMarkdownParserState;
178
+ declare function useStreamingMarkdownParser(text: string, options?: Partial<StreamingMarkdownParserOptions>, isCompleteInput?: boolean): any;
188
179
  //#endregion
189
180
  export { type StreamingMarkdownCaret, type StreamingMarkdownCaretRenderProps, type StreamingMarkdownCaretRenderer, type StreamingMarkdownCitationRenderData, type StreamingMarkdownNodeRenderer, type StreamingMarkdownNodeRendererKey, type StreamingMarkdownNodeRendererProps, type StreamingMarkdownNodeRenderers, StreamingMarkdownRenderer, type StreamingMarkdownRendererProps, createStreamingMarkdownNodeRenderers, useStreamingMarkdownParser };
190
181
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/react/streaming-markdown-renderer.tsx","../../src/react/use-streaming-markdown-parser.tsx"],"mappings":";;;;;;;;AAkCA;;UAAiB,mCAAA;EACf,EAAA;EACA,MAAA;EACA,UAAA,GAAa,kBAAA;AAAA;;;;AAQf;;UAAiB,8BAAA;EASG;;;EALlB,QAAA;EA+BS;;;EA1BT,OAAA,GAAU,OAAA,CAAQ,8BAAA;EAoCN;;;EA/BZ,UAAA;EAsC8C;;;;;;;;EA5B9C,KAAA,GAAQ,sBAAA;EAUR;;;EALA,SAAA;EAOE;;;EAFF,WAAA,IACE,KAAA,EAAO,UAAA,CAAW,iBAAA,GAClB,GAAA,UACA,IAAA,EAAM,wBAAA;EAOC;;;EADT,eAAA,IACE,KAAA,EAAO,UAAA,CAAW,iBAAA,GAClB,QAAA,EAAU,mCAAA,EACV,IAAA,EAAM,wBAAA;EADN;;;EAOF,aAAA,GAAgB,8BAAA;AAAA;;;AAQlB;;;UAAiB,kCAAA,eACD,wBAAA,GAA2B,wBAAA;EAAA;;;EAKzC,IAAA,EAAM,KAAA;EAeK;;;EAVX,QAAA,EAAU,SAAA;EAVI;;;EAed,WAAA,EAAa,SAAA;EALb;;;EAUA,QAAA,GAAW,mCAAA;AAAA;;;;AAQb;;KAAY,6BAAA,eACI,wBAAA,GAA2B,wBAAA,KACtC,KAAA,EAAO,kCAAA,CAAmC,KAAA,MAAW,SAAA;;;;;;UAOzC,iCAAA;EAPkD;;;EAWjE,UAAA;EAXU;;;EAgBV,QAAA,EAAU,wBAAA;AAAA;;AATZ;;;;KAiBY,8BAAA,IACV,KAAA,EAAO,iCAAA,KACJ,SAAA;;;;;AAFL;KASY,sBAAA,aAER,SAAA,GACA,8BAAA;AAAA,KAEC,2BAAA,mBAA8C,yBAAA,IACjD,OAAA,CAAQ,wBAAA;EAA4B,IAAA,EAAM,SAAA;AAAA;;;;;AAN5C;KAaY,gCAAA;AAAA,KAyBP,kCAAA;EACH,IAAA,EAAM,wBAAA;EACN,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,OAAA,EAAS,2BAAA;EACT,UAAA,EAAY,2BAAA;EACZ,IAAA,EAAM,2BAAA;EACN,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,KAAA,EAAO,2BAAA;EACP,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,aAAA,EAAe,2BAAA;EACf,IAAA,EAAM,2BAAA;EACN,EAAA,EAAI,2BAAA;EACJ,MAAA,EAAQ,2BAAA;EACR,aAAA,EAAe,2BAAA;EACf,UAAA,EAAY,2BAAA;EACZ,SAAA,EAAW,2BAAA;EACX,SAAA,EAAW,2BAAA;EACX,KAAA,EAAO,2BAAA;EACP,IAAA,EAAM,2BAAA;EACN,QAAA,EAAU,2BAAA;EACV,QAAA,EAAU,2BAAA;AAAA;AAzBG;;;;;AAAA,KAiCH,8BAAA,GAAiC,OAAA,YAClC,gCAAA,GAAmC,6BAAA,CAC1C,kCAAA,CAAmC,IAAA;;;;;;iBASvB,oCAAA,WACJ,8BAAA,CAAA,CACV,SAAA,EAAW,CAAA,GAAI,CAAA;;;;;;iBA8rBD,yBAAA,CAAA;EACd,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA;AAAA,GACC,8BAAA,GAA8B,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;;;;AAh6BjC;;;;iBC4GgB,0BAAA,CACd,IAAA,UACA,OAAA,GAAU,OAAA,CAAQ,8BAAA,GAClB,eAAA,aACC,4BAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/react/streaming-markdown-renderer.tsx","../../src/react/use-streaming-markdown-parser.tsx"],"mappings":";;;;;;;AAiCA;;;UAAiB,8BAAA;EASL;;;EALV,QAAA;EAiCQ;;;EA5BR,OAAA,GAAU,OAAA,CAAQ,8BAAA;EAqCV;;;EAhCR,UAAA;EA4CgD;;;;;;;;EAlChD,KAAA,GAAQ,sBAAA;EAUR;;;EALA,SAAA;EAOE;;;EAFF,WAAA,IACE,KAAA,EAAO,UAAA,CAAW,iBAAA,GAClB,GAAA,UACA,IAAA,EAAM,wBAAA;EAOC;;;EADT,eAAA,IACE,KAAA,EAAO,UAAA,CAAW,iBAAA,GAClB,QAAA,EAAU,qCAAA,EACV,IAAA,EAAM,wBAAA;EADN;;;EAOF,aAAA,GAAgB,8BAAA;EAAA;;;;EAMhB,cAAA,GAAiB,+BAAA;AAAA;;;;;;UAQF,kCAAA,eACD,wBAAA,GAA2B,wBAAA;EAe5B;;;EAVb,IAAA,EAAM,KAAA;EALN;;;EAUA,QAAA,EAAU,SAAA;EALJ;;;EAUN,WAAA,EAAa,SAAA;EAAA;;;EAKb,QAAA,GAAW,qCAAA;AAAA;AAQb;;;;;AAAA,KAAY,6BAAA,eACI,wBAAA,GAA2B,wBAAA,KACtC,KAAA,EAAO,kCAAA,CAAmC,KAAA,MAAW,SAAA;;;;;;UAOzC,iCAAA;EAR0B;;;EAYzC,UAAA;EAXwD;;;EAgBxD,QAAA,EAAU,wBAAA;AAAA;;;;;;KAQA,8BAAA,IACV,KAAA,EAAO,iCAAA,KACJ,SAAA;;AAFL;;;;KASY,sBAAA,aAER,SAAA,GACA,8BAAA;AAAA,KAEC,2BAAA,mBAA8C,yBAAA,IACjD,OAAA,CAAQ,wBAAA;EAA4B,IAAA,EAAM,SAAA;AAAA;AAAA,KAEvC,kCAAA;EACH,IAAA,EAAM,wBAAA;EACN,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,OAAA,EAAS,2BAAA;EACT,UAAA,EAAY,2BAAA;EACZ,IAAA,EAAM,2BAAA;EACN,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,KAAA,EAAO,2BAAA;EACP,QAAA,EAAU,2BAAA;EACV,SAAA,EAAW,2BAAA;EACX,aAAA,EAAe,2BAAA;EACf,IAAA,EAAM,2BAAA;EACN,EAAA,EAAI,2BAAA;EACJ,MAAA,EAAQ,2BAAA;EACR,aAAA,EAAe,2BAAA;EACf,UAAA,EAAY,2BAAA;EACZ,SAAA,EAAW,2BAAA;EACX,SAAA,EAAW,2BAAA;EACX,KAAA,EAAO,2BAAA;EACP,IAAA,EAAM,2BAAA;EACN,QAAA,EAAU,2BAAA;EACV,QAAA,EAAU,2BAAA;EACV,IAAA,EAAM,2BAAA;AAAA;;;;;;KAQI,8BAAA,GAAiC,OAAA,YAClC,kCAAA,GAAmC,6BAAA,CAC1C,kCAAA,CAAmC,IAAA;;;;;;iBASvB,oCAAA,WACJ,8BAAA,CAAA,CACV,SAAA,EAAW,CAAA,GAAI,CAAA;;;;;;iBAgJD,yBAAA,CAAA;EACd,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,aAAA;EACA;AAAA,GACC,8BAAA,GAA8B,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;;;;AAjVjC;;;;iBClBgB,0BAAA,CACd,IAAA,UACA,OAAA,GAAU,OAAA,CAAQ,8BAAA,GAClB,eAAA"}