@arbidocs/react 0.4.7 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts/index.cjs +6 -6
- package/dist/artifacts/index.js +2 -2
- package/dist/{chunk-CBJ3WOGD.cjs → chunk-E7UO2JSR.cjs} +15 -3
- package/dist/chunk-E7UO2JSR.cjs.map +1 -0
- package/dist/{chunk-KWCHIAQ5.js → chunk-R5SR7R6W.js} +16 -4
- package/dist/chunk-R5SR7R6W.js.map +1 -0
- package/dist/{chunk-2ACHNDO6.js → chunk-RTULVZOS.js} +3 -3
- package/dist/{chunk-2ACHNDO6.js.map → chunk-RTULVZOS.js.map} +1 -1
- package/dist/{chunk-Z5YCRJY3.cjs → chunk-TA3IZP7I.cjs} +4 -4
- package/dist/{chunk-Z5YCRJY3.cjs.map → chunk-TA3IZP7I.cjs.map} +1 -1
- package/dist/{chunk-RIHMIEXM.js → chunk-TGGQGFS3.js} +82 -8
- package/dist/chunk-TGGQGFS3.js.map +1 -0
- package/dist/{chunk-OI55JRKT.cjs → chunk-WBWXP2DN.cjs} +81 -6
- package/dist/chunk-WBWXP2DN.cjs.map +1 -0
- package/dist/{index-CC6CvXEs.d.ts → index-4WLy-KDK.d.cts} +10 -1
- package/dist/{index-CC6CvXEs.d.cts → index-4WLy-KDK.d.ts} +10 -1
- package/dist/index.cjs +349 -340
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/dist/ui/index.cjs +132 -128
- package/dist/ui/index.d.cts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +2 -2
- package/package.json +3 -3
- package/dist/chunk-CBJ3WOGD.cjs.map +0 -1
- package/dist/chunk-KWCHIAQ5.js.map +0 -1
- package/dist/chunk-OI55JRKT.cjs.map +0 -1
- package/dist/chunk-RIHMIEXM.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { cn } from './chunk-SN5YV6FF.js';
|
|
2
2
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
3
|
-
import React, { createContext, useMemo, useState } from 'react';
|
|
3
|
+
import React, { createContext, useMemo, useRef, useState, useCallback, useEffect } from 'react';
|
|
4
4
|
import Markdown from 'react-markdown';
|
|
5
5
|
import remarkGfm from 'remark-gfm';
|
|
6
6
|
import rehypeRaw from 'rehype-raw';
|
|
@@ -167,6 +167,66 @@ var OPEN_CITATION_TAIL = /\[[^\]\n]*(?:\](?:\((?:#(?:c(?:i(?:t(?:e(?:-[\w-]*)?)?
|
|
|
167
167
|
function trimOpenCitation(markdown) {
|
|
168
168
|
return markdown.replace(OPEN_CITATION_TAIL, "");
|
|
169
169
|
}
|
|
170
|
+
function boldMarks(line) {
|
|
171
|
+
return (line.replace(/`[^`]*`/g, "").match(/\*\*/g) ?? []).length;
|
|
172
|
+
}
|
|
173
|
+
function closeOpenEmphasis(markdown) {
|
|
174
|
+
const cut = markdown.lastIndexOf("\n") + 1;
|
|
175
|
+
const head = markdown.slice(0, cut);
|
|
176
|
+
const fences = head.split("\n").filter((l) => /^\s*(```|~~~)/.test(l)).length;
|
|
177
|
+
let line = markdown.slice(cut);
|
|
178
|
+
if (fences % 2 === 1 || /^\s*(```|~~~)/.test(line)) return markdown;
|
|
179
|
+
line = line.replace(/(^|[\s|])\*$/, "$1");
|
|
180
|
+
if (boldMarks(line) % 2 === 0) return head + line;
|
|
181
|
+
line = line.replace(/([^*\s])\*$/, "$1");
|
|
182
|
+
if (boldMarks(line) % 2 === 0) return head + line;
|
|
183
|
+
if (/\*\*\s*$/.test(line)) return head + line.replace(/\s*\*\*\s*$/, " ");
|
|
184
|
+
return head + line + "**";
|
|
185
|
+
}
|
|
186
|
+
var EDGE_FADE = "1.5rem";
|
|
187
|
+
function MarkdownTable({ children, ...props }) {
|
|
188
|
+
const ref = useRef(null);
|
|
189
|
+
const [edges, setEdges] = useState({ start: false, end: false });
|
|
190
|
+
const measure = useCallback(() => {
|
|
191
|
+
const el = ref.current;
|
|
192
|
+
if (!el) return;
|
|
193
|
+
const start = el.scrollLeft > 1;
|
|
194
|
+
const end = el.scrollLeft + el.clientWidth < el.scrollWidth - 1;
|
|
195
|
+
setEdges((prev) => prev.start === start && prev.end === end ? prev : { start, end });
|
|
196
|
+
}, []);
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
const el = ref.current;
|
|
199
|
+
if (!el) return;
|
|
200
|
+
measure();
|
|
201
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
202
|
+
const observer = new ResizeObserver(measure);
|
|
203
|
+
observer.observe(el);
|
|
204
|
+
if (el.firstElementChild) observer.observe(el.firstElementChild);
|
|
205
|
+
return () => observer.disconnect();
|
|
206
|
+
}, [measure]);
|
|
207
|
+
const mask = edges.start || edges.end ? `linear-gradient(to right, ${edges.start ? "transparent" : "#000"}, #000 ${EDGE_FADE}, #000 calc(100% - ${EDGE_FADE}), ${edges.end ? "transparent" : "#000"})` : void 0;
|
|
208
|
+
return /* @__PURE__ */ jsx(
|
|
209
|
+
"div",
|
|
210
|
+
{
|
|
211
|
+
ref,
|
|
212
|
+
onScroll: measure,
|
|
213
|
+
"data-testid": "markdown-table-scroller",
|
|
214
|
+
"data-scroll-start": edges.start || void 0,
|
|
215
|
+
"data-scroll-end": edges.end || void 0,
|
|
216
|
+
className: "my-3 overflow-x-auto rounded-lg border border-border",
|
|
217
|
+
style: mask ? { maskImage: mask, WebkitMaskImage: mask } : void 0,
|
|
218
|
+
children: /* @__PURE__ */ jsx(
|
|
219
|
+
"table",
|
|
220
|
+
{
|
|
221
|
+
"data-testid": "markdown-table",
|
|
222
|
+
className: "w-full border-collapse text-sm [overflow-wrap:normal] [word-break:normal]",
|
|
223
|
+
...props,
|
|
224
|
+
children
|
|
225
|
+
}
|
|
226
|
+
)
|
|
227
|
+
}
|
|
228
|
+
);
|
|
229
|
+
}
|
|
170
230
|
function CodeBlock({ language, code }) {
|
|
171
231
|
const [copied, setCopied] = useState(false);
|
|
172
232
|
const handleCopy = async () => {
|
|
@@ -254,10 +314,17 @@ var defaultComponents = {
|
|
|
254
314
|
// don't nest <pre><pre>.
|
|
255
315
|
pre: ({ children }) => /* @__PURE__ */ jsx(Fragment, { children }),
|
|
256
316
|
blockquote: ({ children, ...props }) => /* @__PURE__ */ jsx("blockquote", { className: "border-l-2 border-border pl-4 italic text-muted-foreground", ...props, children }),
|
|
257
|
-
table:
|
|
317
|
+
table: MarkdownTable,
|
|
258
318
|
thead: ({ children, ...props }) => /* @__PURE__ */ jsx("thead", { className: "bg-current/10", ...props, children }),
|
|
259
|
-
th: ({ children, ...props }) => /* @__PURE__ */ jsx(
|
|
260
|
-
|
|
319
|
+
th: ({ children, ...props }) => /* @__PURE__ */ jsx(
|
|
320
|
+
"th",
|
|
321
|
+
{
|
|
322
|
+
className: "min-w-[7rem] border-b border-border px-3 py-2 text-left font-semibold",
|
|
323
|
+
...props,
|
|
324
|
+
children
|
|
325
|
+
}
|
|
326
|
+
),
|
|
327
|
+
td: ({ children, ...props }) => /* @__PURE__ */ jsx("td", { className: "min-w-[7rem] border-b border-border px-3 py-2 align-top", ...props, children }),
|
|
261
328
|
// General emphasis marks (GFM `~~strikethrough~~` → <del>, raw <ins>/<mark>).
|
|
262
329
|
del: ({ children, ...props }) => /* @__PURE__ */ jsx("del", { className: "text-muted-foreground line-through", ...props, children }),
|
|
263
330
|
ins: ({ children, ...props }) => /* @__PURE__ */ jsx("ins", { className: "underline decoration-primary/60", ...props, children }),
|
|
@@ -297,7 +364,14 @@ function MarkdownRendererComponent({
|
|
|
297
364
|
a: (props) => props.href?.startsWith("#cite-") ? renderCitation({ num: props.href.slice(6), children: props.children }) : React.createElement(Link, props)
|
|
298
365
|
};
|
|
299
366
|
}, [customComponents, renderCitation]);
|
|
300
|
-
const blocks = useMemo(
|
|
367
|
+
const blocks = useMemo(
|
|
368
|
+
() => splitMarkdownBlocks(
|
|
369
|
+
normalizeCitationMarkup(
|
|
370
|
+
isStreaming ? closeOpenEmphasis(trimOpenCitation(children)) : children
|
|
371
|
+
)
|
|
372
|
+
),
|
|
373
|
+
[children, isStreaming]
|
|
374
|
+
);
|
|
301
375
|
return /* @__PURE__ */ jsx(
|
|
302
376
|
MarkdownErrorBoundary,
|
|
303
377
|
{
|
|
@@ -315,6 +389,6 @@ function MarkdownRendererComponent({
|
|
|
315
389
|
}
|
|
316
390
|
var MarkdownRenderer = React.memo(MarkdownRendererComponent);
|
|
317
391
|
|
|
318
|
-
export { MarkdownRenderer, MarkdownStreamingContext, markdownBaseComponents, normalizeCitationMarkup, splitMarkdownBlocks, trimOpenCitation };
|
|
319
|
-
//# sourceMappingURL=chunk-
|
|
320
|
-
//# sourceMappingURL=chunk-
|
|
392
|
+
export { MarkdownRenderer, MarkdownStreamingContext, closeOpenEmphasis, markdownBaseComponents, normalizeCitationMarkup, splitMarkdownBlocks, trimOpenCitation };
|
|
393
|
+
//# sourceMappingURL=chunk-TGGQGFS3.js.map
|
|
394
|
+
//# sourceMappingURL=chunk-TGGQGFS3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ai/markdown-base-components.tsx","../src/ai/markdown-streaming-context.ts","../src/ai/split-markdown-blocks.ts","../src/ai/normalize-citations.ts","../src/ai/MarkdownRenderer.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-TGGQGFS3.js","sourcesContent":["import React from 'react'\nimport type { Components } from 'react-markdown'\n\n/**\n * Brand-neutral presentational component overrides for react-markdown, shared by\n * every markdown surface in the workspace (the monolith's `MarkdownRenderer` and\n * the AI kit's `AiMarkdown`). One house style for headings, lists, tables and the\n * inline text elements — token-based, so it themes per app.\n *\n * Deliberately excluded (kept per-consumer): `a` (external-link confirm vs\n * plain), `code`/`pre` (rich CodeBlock + Mermaid vs inline), `span` (doc-entity\n * pills), and `del`/`ins`/`mark` (general emphasis vs redline tracked-changes) —\n * these differ by intent or carry heavy/coupled behaviour, so each renderer owns\n * them and spreads this base underneath.\n */\nexport const markdownBaseComponents: Partial<Components> = {\n h1: ({ children, ...props }: React.ComponentPropsWithoutRef<'h1'>) => (\n <h1 className=\"text-lg font-semibold\" data-testid=\"markdown-heading-1\" {...props}>\n {children}\n </h1>\n ),\n h2: ({ children, ...props }: React.ComponentPropsWithoutRef<'h2'>) => (\n <h2 className=\"font-semibold text-base\" data-testid=\"markdown-heading-2\" {...props}>\n {children}\n </h2>\n ),\n h3: ({ children, ...props }: React.ComponentPropsWithoutRef<'h3'>) => (\n <h3 className=\"font-semibold text-base\" data-testid=\"markdown-heading-3\" {...props}>\n {children}\n </h3>\n ),\n h4: ({ children, ...props }: React.ComponentPropsWithoutRef<'h4'>) => (\n <h4 className=\"font-semibold text-base\" {...props}>\n {children}\n </h4>\n ),\n h5: ({ children, ...props }: React.ComponentPropsWithoutRef<'h5'>) => (\n <h5 className=\"font-medium\" {...props}>\n {children}\n </h5>\n ),\n strong: ({ children, ...props }: React.ComponentPropsWithoutRef<'strong'>) => (\n <strong className=\"font-semibold\" {...props}>\n {children}\n </strong>\n ),\n blockquote: ({ children, ...props }: React.ComponentPropsWithoutRef<'blockquote'>) => (\n <blockquote className=\"border-l-2 border-primary pl-4\" {...props}>\n {children}\n </blockquote>\n ),\n ol: ({ children, ...props }: React.ComponentPropsWithoutRef<'ol'>) => (\n <ol className=\"list-decimal space-y-2 pl-6\" data-testid=\"markdown-ordered-list\" {...props}>\n {children}\n </ol>\n ),\n ul: ({ children, ...props }: React.ComponentPropsWithoutRef<'ul'>) => (\n <ul className=\"list-none space-y-2 pl-6\" data-testid=\"markdown-unordered-list\" {...props}>\n {children}\n </ul>\n ),\n li: ({ children, ...props }: React.ComponentPropsWithoutRef<'li'>) => (\n <li className=\"my-1.5\" {...props}>\n {children}\n </li>\n ),\n table: ({ children, ...props }: React.ComponentPropsWithoutRef<'table'>) => (\n <table data-testid=\"markdown-table\" {...props}>\n {children}\n </table>\n ),\n th: ({ children, ...props }: React.ComponentPropsWithoutRef<'th'>) => (\n <th {...props}>{children}</th>\n ),\n td: ({ children, ...props }: React.ComponentPropsWithoutRef<'td'>) => (\n <td {...props}>{children}</td>\n ),\n tr: ({ children, ...props }: React.ComponentPropsWithoutRef<'tr'>) => (\n <tr {...props}>{children}</tr>\n ),\n p: ({ children, ...props }: React.ComponentPropsWithoutRef<'p'>) => (\n <p className=\"whitespace-pre-wrap\" {...props}>\n {children}\n </p>\n ),\n hr: (props: React.ComponentPropsWithoutRef<'hr'>) => (\n <hr className=\"border-foreground/20\" {...props} />\n ),\n sup: ({ children, ...props }: React.ComponentPropsWithoutRef<'sup'>) => (\n <sup className=\"text-xs\" {...props}>\n {children}\n </sup>\n ),\n sub: ({ children, ...props }: React.ComponentPropsWithoutRef<'sub'>) => (\n <sub className=\"text-xs\" {...props}>\n {children}\n </sub>\n ),\n div: ({ children, className, ...props }: React.ComponentPropsWithoutRef<'div'>) => (\n <div className={className} {...props}>\n {children}\n </div>\n ),\n br: (props: React.ComponentPropsWithoutRef<'br'>) => <br {...props} />,\n kbd: ({ children, ...props }: React.ComponentPropsWithoutRef<'kbd'>) => (\n <kbd\n className=\"px-1.5 py-0.5 text-xs font-mono bg-muted border border-border rounded\"\n {...props}\n >\n {children}\n </kbd>\n ),\n abbr: ({ children, title, ...props }: React.ComponentPropsWithoutRef<'abbr'>) => (\n <abbr title={title} className=\"underline decoration-dotted cursor-help\" {...props}>\n {children}\n </abbr>\n ),\n cite: ({ children, ...props }: React.ComponentPropsWithoutRef<'cite'>) => (\n <cite className=\"italic\" {...props}>\n {children}\n </cite>\n ),\n}\n","import { createContext } from 'react'\n\n/**\n * Signals to `MarkdownRenderer`'s component overrides that the surrounding\n * message is still streaming tokens. Heavy renderers can defer their work while\n * this is true to avoid burning CPU on partially complete fences and to keep the\n * UI responsive during long generations.\n *\n * Default `false` means non-streaming usages (parsed documents, static answers,\n * DM bubbles) get the full rendering with no behaviour change.\n */\nexport const MarkdownStreamingContext = createContext(false)\n","/**\n * Splits a markdown string into top-level blocks at `\\n\\n` boundaries.\n *\n * Streaming AI responses arrive token-by-token; passing the full string to\n * react-markdown re-parses the entire AST on every flush. By splitting into\n * blocks and memoizing each, only the trailing (still-growing) block re-parses\n * — completed blocks stay frozen in the DOM.\n *\n * The split avoids three correctness pitfalls:\n * - never splits inside an open ``` code fence (would corrupt the language)\n * - never splits between two adjacent list items (would render as two lists)\n * - never splits between two blockquote lines (would render as two quotes)\n */\nconst LIST_ITEM_RE = /^\\s*([-*+]|\\d+[.)])\\s/\nconst BLOCKQUOTE_RE = /^\\s*>/\n\nexport function splitMarkdownBlocks(content: string): string[] {\n if (!content) return []\n const blocks: string[] = []\n let start = 0\n let inFence = false\n let i = 0\n while (i < content.length) {\n if (content.startsWith('```', i)) {\n inFence = !inFence\n i += 3\n continue\n }\n if (!inFence && content[i] === '\\n' && content[i + 1] === '\\n') {\n const before = content.slice(start, i)\n const lastLine = before.slice(before.lastIndexOf('\\n') + 1)\n const afterStart = i + 2\n const nextNewline = content.indexOf('\\n', afterStart)\n const nextLine = content.slice(afterStart, nextNewline === -1 ? undefined : nextNewline)\n const bothListItems = LIST_ITEM_RE.test(lastLine) && LIST_ITEM_RE.test(nextLine)\n const bothBlockquotes = BLOCKQUOTE_RE.test(lastLine) && BLOCKQUOTE_RE.test(nextLine)\n if (bothListItems || bothBlockquotes) {\n i += 2\n continue\n }\n blocks.push(content.slice(start, afterStart))\n start = afterStart\n i = afterStart\n continue\n }\n i++\n }\n if (start < content.length) blocks.push(content.slice(start))\n return blocks\n}\n","/**\n * Citation markup normaliser.\n *\n * The backend marks a cited statement as a markdown link, `[statement](#cite-N)`, and the\n * statement can include the markdown that surrounds it: a list marker, a heading marker or the\n * opener of a bold/italic span whose closer sits after the link. Inside link text those tokens\n * are not parsed as block or inline syntax, so they show literally and break lists and bold:\n *\n * [- **Claimed quantum (by Claimant)](#cite-1):** **USD 47 million**\n *\n * `normalizeCitationMarkup` hoists the leading tokens out of the link text (and a trailing\n * emphasis closer after it), so the link only wraps the words:\n *\n * - **[Claimed quantum (by Claimant)](#cite-1):** **USD 47 million**\n *\n * It is conservative: emphasis that opens and closes inside the link text is valid markdown and\n * is left alone, an opener is only hoisted when its closer follows on the same line, and fenced\n * code blocks are never touched. The result is idempotent.\n *\n * It also tidies the residue the model leaves when it cites in prose as well: a literal\n * `(*Source: Award.pdf, p. 12*)` shows its asterisks, because `(*` does not open emphasis. It\n * becomes the italic note `*(Source: Award.pdf, p. 12)*`.\n */\n\nconst SOURCE_RESIDUE = /\\(\\*+\\s*(Sources?\\s*:[^\\n]*?)\\s*\\*+\\)/g\n\nconst CITE_LINK = /\\[([^\\]\\n]+)\\]\\((#cite-[\\w-]+)\\)/g\nconst BLOCK_MARKER = /^(?:[-*+]|\\d{1,9}[.)]|#{1,6})[ \\t]+/\nconst LEADING_EMPHASIS = /^(?:\\*\\*|__|\\*|_)+/\nconst TRAILING_EMPHASIS = /(\\*\\*|__|\\*|_)(:?)$/\n\n/** Occurrences of `token` in `text`; a single `*` is counted outside any `**` pair. */\nfunction countToken(text: string, token: string): number {\n const double = token + token\n if (token.length === 2) return text.split(token).length - 1\n const withoutDouble = text.split(double).join('')\n return withoutDouble.split(token).length - 1\n}\n\n/** Split a run of emphasis characters (`***`, `**`, `*`...) into its parser-level tokens. */\nfunction emphasisTokens(run: string): string[] {\n const char = run[0]\n const tokens: string[] = []\n let rest = run\n while (rest.length > 0) {\n const size = rest.length >= 2 ? 2 : 1\n tokens.push(char.repeat(size))\n rest = rest.slice(size)\n }\n return tokens\n}\n\nfunction hoistFromLink(text: string, before: string, after: string): [string, string, string] {\n let body = text\n let prefix = ''\n let suffix = ''\n\n if (before.trim() === '') {\n const marker = BLOCK_MARKER.exec(body)\n if (marker) {\n prefix += marker[0]\n body = body.slice(marker[0].length)\n }\n }\n\n const leading = LEADING_EMPHASIS.exec(body)\n if (leading) {\n let kept = ''\n let rest = body.slice(leading[0].length)\n for (const token of emphasisTokens(leading[0]).reverse()) {\n // Balanced inside the link text: valid as written.\n if (countToken(rest, token) % 2 === 1) {\n kept = token + kept\n continue\n }\n // Unmatched here: hoist only if the line closes it after the link.\n if (countToken(after, token) % 2 === 1) prefix += token\n else kept = token + kept\n }\n body = kept + rest\n rest = ''\n }\n\n const trailing = TRAILING_EMPHASIS.exec(body)\n if (trailing) {\n const token = trailing[1]\n const inner = body.slice(0, body.length - trailing[0].length)\n const openedBefore = countToken(before + prefix, token) % 2 === 1\n if (countToken(inner, token) % 2 === 0 && openedBefore) {\n body = inner\n suffix = trailing[0]\n }\n }\n\n return [prefix, body, suffix]\n}\n\nfunction normalizeLine(line: string): string {\n if (!line.includes('](#cite-')) return line\n return line.replace(CITE_LINK, (match, text: string, href: string, offset: number) => {\n const before = line.slice(0, offset)\n const after = line.slice(offset + match.length)\n const [prefix, body, suffix] = hoistFromLink(text, before, after)\n if (!prefix && !suffix && body === text) return match\n return `${prefix}[${body}](${href})${suffix}`\n })\n}\n\nfunction normalizeSourceResidue(line: string): string {\n return line.includes('(*') ? line.replace(SOURCE_RESIDUE, '*($1)*') : line\n}\n\nexport function normalizeCitationMarkup(markdown: string): string {\n if (!markdown.includes('](#cite-') && !markdown.includes('(*')) return markdown\n let inFence = false\n return markdown\n .split('\\n')\n .map((line) => {\n if (/^\\s*(```|~~~)/.test(line)) {\n inFence = !inFence\n return line\n }\n return inFence ? line : normalizeSourceResidue(normalizeLine(line))\n })\n .join('\\n')\n}\n\n/** A trailing, still-open `[words](#cite-N` marker (or an unclosed `[words`) on the last line. */\nconst OPEN_CITATION_TAIL = /\\[[^\\]\\n]*(?:\\](?:\\((?:#(?:c(?:i(?:t(?:e(?:-[\\w-]*)?)?)?)?)?)?)?)?$/\n\n/**\n * Drops an unfinished citation marker from the end of text that is still streaming (or was\n * stopped mid-marker), so `[Change of control](#cite-` never shows as raw markup: the words appear\n * once the marker is complete. Complete markers and everything else are left alone.\n */\nexport function trimOpenCitation(markdown: string): string {\n return markdown.replace(OPEN_CITATION_TAIL, '')\n}\n\n/** `**` pairs outside inline code in a line. */\nfunction boldMarks(line: string): number {\n return (line.replace(/`[^`]*`/g, '').match(/\\*\\*/g) ?? []).length\n}\n\n/**\n * Makes the tail of text that is still streaming (or was stopped) render cleanly: a `**` opened\n * in the last line and not yet closed (`| Valuation | **[USD 6.2 million](#cite-2)`) would show as\n * literal asterisks until its closer arrives, because an unclosed emphasis is not emphasis. The\n * open bold is closed at the end of the line, or removed when it has no text yet (`| **`, or a\n * half-typed closer `**USD 6*`). Text with balanced emphasis, and every line but the last, is\n * left alone. Apply after `trimOpenCitation`.\n */\nexport function closeOpenEmphasis(markdown: string): string {\n const cut = markdown.lastIndexOf('\\n') + 1\n const head = markdown.slice(0, cut)\n const fences = head.split('\\n').filter((l) => /^\\s*(```|~~~)/.test(l)).length\n let line = markdown.slice(cut)\n if (fences % 2 === 1 || /^\\s*(```|~~~)/.test(line)) return markdown\n // A half-typed opener: the first `*` of `**` after a space or a cell border.\n line = line.replace(/(^|[\\s|])\\*$/, '$1')\n if (boldMarks(line) % 2 === 0) return head + line\n // A half-typed closer: `**USD 6*` -> the second asterisk has not arrived.\n line = line.replace(/([^*\\s])\\*$/, '$1')\n if (boldMarks(line) % 2 === 0) return head + line\n if (/\\*\\*\\s*$/.test(line)) return head + line.replace(/\\s*\\*\\*\\s*$/, ' ')\n return head + line + '**'\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport Markdown, { type Components } from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport rehypeRaw from 'rehype-raw'\nimport { Copy, Check } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { markdownBaseComponents } from './markdown-base-components'\nimport { MarkdownStreamingContext } from './markdown-streaming-context'\nimport { splitMarkdownBlocks } from './split-markdown-blocks'\nimport { closeOpenEmphasis, normalizeCitationMarkup, trimOpenCitation } from './normalize-citations'\n\n/**\n * MarkdownRenderer — the single, full-featured markdown surface for the kit.\n *\n * Renders AI answers, chat/DM messages and parsed-document panes with one house\n * style: headings, paragraphs, bold/italic, ordered/unordered lists, GFM tables,\n * fenced code blocks (monospace + copy button), inline code, blockquotes, safe\n * links (`rel=\"noopener\"`, new tab) and horizontal rules.\n *\n * Styling is 100% semantic Tailwind tokens (`text-foreground`,\n * `text-muted-foreground`, `border-border`, `bg-muted`, `text-primary`) so it\n * themes per firm — no hardcoded brand colours. It sizes to its container, so it\n * looks right in a compact chat bubble and in a full-width document pane alike.\n *\n * Streaming: the content is split into block-level chunks (see\n * `splitMarkdownBlocks`) and each chunk is memoised, so streaming token updates\n * only re-parse the trailing block instead of the whole message. Pass\n * `isStreaming` to let heavy custom components defer via `MarkdownStreamingContext`.\n *\n * Extending: pass `components` to override any element (the kit's `AiMarkdown`\n * and `CitationRenderer` layer their accent links / citation popovers on top).\n */\n\nconst EDGE_FADE = '1.5rem'\n\n/**\n * A GFM table in its own horizontal scroller. The table keeps a minimum width per column\n * (`min-w-[7rem]` cells, words never broken mid-word), so on a narrow screen it scrolls sideways\n * inside this wrapper instead of squeezing cells to a letter per line. The edge(s) with more\n * content to scroll to fade out, which is the scroll hint. Wide containers are unchanged: the\n * table is `w-full` and nothing overflows.\n */\nfunction MarkdownTable({ children, ...props }: React.ComponentPropsWithoutRef<'table'>) {\n const ref = useRef<HTMLDivElement>(null)\n const [edges, setEdges] = useState({ start: false, end: false })\n const measure = useCallback(() => {\n const el = ref.current\n if (!el) return\n const start = el.scrollLeft > 1\n const end = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n setEdges((prev) => (prev.start === start && prev.end === end ? prev : { start, end }))\n }, [])\n useEffect(() => {\n const el = ref.current\n if (!el) return\n measure()\n if (typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(measure)\n observer.observe(el)\n if (el.firstElementChild) observer.observe(el.firstElementChild)\n return () => observer.disconnect()\n }, [measure])\n const mask =\n edges.start || edges.end\n ? `linear-gradient(to right, ${edges.start ? 'transparent' : '#000'}, #000 ${EDGE_FADE}, #000 calc(100% - ${EDGE_FADE}), ${edges.end ? 'transparent' : '#000'})`\n : undefined\n return (\n <div\n ref={ref}\n onScroll={measure}\n data-testid=\"markdown-table-scroller\"\n data-scroll-start={edges.start || undefined}\n data-scroll-end={edges.end || undefined}\n className=\"my-3 overflow-x-auto rounded-lg border border-border\"\n style={mask ? { maskImage: mask, WebkitMaskImage: mask } : undefined}\n >\n <table\n data-testid=\"markdown-table\"\n className=\"w-full border-collapse text-sm [overflow-wrap:normal] [word-break:normal]\"\n {...props}\n >\n {children}\n </table>\n </div>\n )\n}\n\n/** Fenced code block with a language label and copy-to-clipboard button. */\nfunction CodeBlock({ language, code }: { language: string; code: string }) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Clipboard unavailable (insecure context / permissions) — no-op.\n }\n }\n\n return (\n <div\n className=\"code-block relative my-3 overflow-hidden rounded-md border border-current/20 bg-current/5\"\n data-testid=\"markdown-code-block\"\n >\n <div className=\"flex items-center justify-between border-b border-current/20 px-3 py-1.5\">\n <span className=\"font-mono text-xs text-muted-foreground\">{language || 'code'}</span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground\"\n title={copied ? 'Copied!' : 'Copy code'}\n >\n {copied ? <Check size={12} /> : <Copy size={12} />}\n <span>{copied ? 'Copied' : 'Copy'}</span>\n </button>\n </div>\n <pre className=\"overflow-x-auto p-3 text-sm leading-relaxed\">\n <code className={cn('font-mono', language && `language-${language}`)}>{code}</code>\n </pre>\n </div>\n )\n}\n\n/**\n * Links. Internal hash/anchor links stay in-page; everything else opens safely in a new tab\n * (`rel=\"noopener noreferrer\"` prevents reverse-tabnabbing). A backend citation marker\n * (`#cite-N`) has no popover here: the cited words stay in the surface's own colour with a quiet\n * superscript number after them (no underline, so a cited sentence does not read as a link).\n * Pass `renderCitation` to `MarkdownRenderer` to swap in a real source popover.\n */\nfunction MarkdownLink({ href, children, ...props }: React.ComponentPropsWithoutRef<'a'>) {\n if (href?.startsWith('#cite-')) {\n return (\n <span\n className=\"cited-text after:ml-px after:align-super after:text-[0.7em] after:font-medium after:text-muted-foreground after:content-[attr(data-cite)]\"\n data-cite={href.slice(6)}\n >\n {children}\n </span>\n )\n }\n const isInternal = !href || href.startsWith('#') || href.startsWith('cite:')\n return (\n <a\n className=\"text-primary underline underline-offset-2\"\n href={href}\n {...(isInternal ? {} : { target: '_blank', rel: 'noopener noreferrer' })}\n {...props}\n >\n {children}\n </a>\n )\n}\n\n/**\n * Default component overrides. Spreads the shared brand-neutral base\n * (`markdownBaseComponents`: headings, lists, paragraphs, emphasis, hr…) and adds\n * the elements that carry behaviour or need self-contained styling: safe links,\n * code (inline + fenced), bordered tables and blockquotes. Module-scoped so the\n * reference is stable across renders and react-markdown can skip re-parsing.\n */\nconst defaultComponents: Partial<Components> = {\n ...markdownBaseComponents,\n a: MarkdownLink,\n em: ({ children, ...props }: React.ComponentPropsWithoutRef<'em'>) => (\n <em className=\"italic\" {...props}>\n {children}\n </em>\n ),\n code: function MarkdownCode({\n className,\n children,\n ...props\n }: React.ComponentPropsWithoutRef<'code'>) {\n const match = /language-(\\w+)/.exec(className || '')\n if (!match) {\n return (\n <code\n className=\"rounded bg-current/10 px-1 py-0.5 font-mono text-[0.9em]\"\n data-testid=\"markdown-inline-code\"\n {...props}\n >\n {children}\n </code>\n )\n }\n return <CodeBlock language={match[1]} code={String(children).replace(/\\n$/, '')} />\n },\n // The CodeBlock renders its own <pre>; unwrap react-markdown's wrapper so we\n // don't nest <pre><pre>.\n pre: ({ children }: React.ComponentPropsWithoutRef<'pre'>) => <>{children}</>,\n blockquote: ({ children, ...props }: React.ComponentPropsWithoutRef<'blockquote'>) => (\n <blockquote className=\"border-l-2 border-border pl-4 italic text-muted-foreground\" {...props}>\n {children}\n </blockquote>\n ),\n table: MarkdownTable,\n thead: ({ children, ...props }: React.ComponentPropsWithoutRef<'thead'>) => (\n <thead className=\"bg-current/10\" {...props}>\n {children}\n </thead>\n ),\n th: ({ children, ...props }: React.ComponentPropsWithoutRef<'th'>) => (\n <th\n className=\"min-w-[7rem] border-b border-border px-3 py-2 text-left font-semibold\"\n {...props}\n >\n {children}\n </th>\n ),\n td: ({ children, ...props }: React.ComponentPropsWithoutRef<'td'>) => (\n <td className=\"min-w-[7rem] border-b border-border px-3 py-2 align-top\" {...props}>\n {children}\n </td>\n ),\n // General emphasis marks (GFM `~~strikethrough~~` → <del>, raw <ins>/<mark>).\n del: ({ children, ...props }: React.ComponentPropsWithoutRef<'del'>) => (\n <del className=\"text-muted-foreground line-through\" {...props}>\n {children}\n </del>\n ),\n ins: ({ children, ...props }: React.ComponentPropsWithoutRef<'ins'>) => (\n <ins className=\"underline decoration-primary/60\" {...props}>\n {children}\n </ins>\n ),\n mark: ({ children, ...props }: React.ComponentPropsWithoutRef<'mark'>) => (\n <mark className=\"rounded bg-primary/15 px-0.5 text-inherit\" {...props}>\n {children}\n </mark>\n ),\n}\n\n// Stable module-scope plugin arrays so react-markdown compares them by reference\n// and skips re-running the remark/rehype pipeline when nothing else changed.\n// `rehype-raw` enables inline HTML (e.g. redline <del>/<ins>); no math/mermaid\n// plugins are bundled to keep the kit light.\nconst remarkPlugins = [remarkGfm]\nconst rehypePlugins = [rehypeRaw]\n\n/**\n * One parsed markdown block, memoised on (content, components) so already-rendered\n * blocks don't re-parse when a later block streams new tokens. This is the core\n * of the streaming-rendering optimisation.\n */\nconst MemoizedBlock = React.memo(function MarkdownBlock({\n content,\n components,\n}: {\n content: string\n components: Partial<Components>\n}) {\n return (\n <Markdown remarkPlugins={remarkPlugins} rehypePlugins={rehypePlugins} components={components}>\n {content}\n </Markdown>\n )\n})\n\n/** Prevents a malformed-markdown render error from crashing the whole surface. */\nclass MarkdownErrorBoundary extends React.Component<\n { fallback: React.ReactNode; children: React.ReactNode },\n { hasError: boolean }\n> {\n state = { hasError: false }\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n render() {\n return this.state.hasError ? this.props.fallback : this.props.children\n }\n}\n\nexport interface MarkdownRendererProps {\n /** Markdown content to render. */\n children: string\n /** Custom component overrides merged on top of the defaults. */\n components?: Partial<Components>\n /**\n * When true, signals heavy custom components (via `MarkdownStreamingContext`)\n * to defer their work while tokens are still arriving. Defaults to false.\n */\n isStreaming?: boolean\n /**\n * Renders a citation marker `[words](#cite-N)`: `children` are the cited words, `num` the N.\n * Keep it referentially stable (`useCallback`/`useMemo`), or every block re-parses.\n */\n renderCitation?: (citation: { num: string; children: React.ReactNode }) => React.ReactNode\n /** Extra classes on the wrapper (font-size, prose width, etc.). */\n className?: string\n /** Overrides the `data-testid` on the wrapper (default `markdown-renderer`). */\n testId?: string\n}\n\nfunction MarkdownRendererComponent({\n children,\n components: customComponents,\n renderCitation,\n isStreaming = false,\n className,\n testId = 'markdown-renderer',\n}: MarkdownRendererProps) {\n const components = useMemo(() => {\n const base = customComponents\n ? { ...defaultComponents, ...customComponents }\n : defaultComponents\n if (!renderCitation) return base\n const Link = base.a ?? MarkdownLink\n return {\n ...base,\n a: (props: React.ComponentPropsWithoutRef<'a'>) =>\n props.href?.startsWith('#cite-')\n ? renderCitation({ num: props.href.slice(6), children: props.children })\n : React.createElement(Link as React.ElementType, props),\n }\n }, [customComponents, renderCitation])\n\n const blocks = useMemo(\n () =>\n splitMarkdownBlocks(\n normalizeCitationMarkup(\n isStreaming ? closeOpenEmphasis(trimOpenCitation(children)) : children\n )\n ),\n [children, isStreaming]\n )\n\n return (\n <MarkdownErrorBoundary\n fallback={<div className={cn('whitespace-pre-wrap break-words', className)}>{children}</div>}\n >\n <MarkdownStreamingContext.Provider value={isStreaming}>\n <div\n className={cn('markdown-content space-y-3 break-words leading-relaxed', className)}\n data-testid={testId}\n >\n {blocks.map((block, index) => (\n <MemoizedBlock key={index} content={block} components={components} />\n ))}\n </div>\n </MarkdownStreamingContext.Provider>\n </MarkdownErrorBoundary>\n )\n}\n\n/**\n * Memoised so a stable message in a long thread doesn't re-parse when unrelated\n * tokens arrive elsewhere; a streaming message gets a fresh `children` each flush\n * and re-renders (only its trailing block re-parses, thanks to `MemoizedBlock`).\n */\nexport const MarkdownRenderer = React.memo(MarkdownRendererComponent)\n"]}
|
|
@@ -176,6 +176,66 @@ var OPEN_CITATION_TAIL = /\[[^\]\n]*(?:\](?:\((?:#(?:c(?:i(?:t(?:e(?:-[\w-]*)?)?
|
|
|
176
176
|
function trimOpenCitation(markdown) {
|
|
177
177
|
return markdown.replace(OPEN_CITATION_TAIL, "");
|
|
178
178
|
}
|
|
179
|
+
function boldMarks(line) {
|
|
180
|
+
return (line.replace(/`[^`]*`/g, "").match(/\*\*/g) ?? []).length;
|
|
181
|
+
}
|
|
182
|
+
function closeOpenEmphasis(markdown) {
|
|
183
|
+
const cut = markdown.lastIndexOf("\n") + 1;
|
|
184
|
+
const head = markdown.slice(0, cut);
|
|
185
|
+
const fences = head.split("\n").filter((l) => /^\s*(```|~~~)/.test(l)).length;
|
|
186
|
+
let line = markdown.slice(cut);
|
|
187
|
+
if (fences % 2 === 1 || /^\s*(```|~~~)/.test(line)) return markdown;
|
|
188
|
+
line = line.replace(/(^|[\s|])\*$/, "$1");
|
|
189
|
+
if (boldMarks(line) % 2 === 0) return head + line;
|
|
190
|
+
line = line.replace(/([^*\s])\*$/, "$1");
|
|
191
|
+
if (boldMarks(line) % 2 === 0) return head + line;
|
|
192
|
+
if (/\*\*\s*$/.test(line)) return head + line.replace(/\s*\*\*\s*$/, " ");
|
|
193
|
+
return head + line + "**";
|
|
194
|
+
}
|
|
195
|
+
var EDGE_FADE = "1.5rem";
|
|
196
|
+
function MarkdownTable({ children, ...props }) {
|
|
197
|
+
const ref = React.useRef(null);
|
|
198
|
+
const [edges, setEdges] = React.useState({ start: false, end: false });
|
|
199
|
+
const measure = React.useCallback(() => {
|
|
200
|
+
const el = ref.current;
|
|
201
|
+
if (!el) return;
|
|
202
|
+
const start = el.scrollLeft > 1;
|
|
203
|
+
const end = el.scrollLeft + el.clientWidth < el.scrollWidth - 1;
|
|
204
|
+
setEdges((prev) => prev.start === start && prev.end === end ? prev : { start, end });
|
|
205
|
+
}, []);
|
|
206
|
+
React.useEffect(() => {
|
|
207
|
+
const el = ref.current;
|
|
208
|
+
if (!el) return;
|
|
209
|
+
measure();
|
|
210
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
211
|
+
const observer = new ResizeObserver(measure);
|
|
212
|
+
observer.observe(el);
|
|
213
|
+
if (el.firstElementChild) observer.observe(el.firstElementChild);
|
|
214
|
+
return () => observer.disconnect();
|
|
215
|
+
}, [measure]);
|
|
216
|
+
const mask = edges.start || edges.end ? `linear-gradient(to right, ${edges.start ? "transparent" : "#000"}, #000 ${EDGE_FADE}, #000 calc(100% - ${EDGE_FADE}), ${edges.end ? "transparent" : "#000"})` : void 0;
|
|
217
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
218
|
+
"div",
|
|
219
|
+
{
|
|
220
|
+
ref,
|
|
221
|
+
onScroll: measure,
|
|
222
|
+
"data-testid": "markdown-table-scroller",
|
|
223
|
+
"data-scroll-start": edges.start || void 0,
|
|
224
|
+
"data-scroll-end": edges.end || void 0,
|
|
225
|
+
className: "my-3 overflow-x-auto rounded-lg border border-border",
|
|
226
|
+
style: mask ? { maskImage: mask, WebkitMaskImage: mask } : void 0,
|
|
227
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
228
|
+
"table",
|
|
229
|
+
{
|
|
230
|
+
"data-testid": "markdown-table",
|
|
231
|
+
className: "w-full border-collapse text-sm [overflow-wrap:normal] [word-break:normal]",
|
|
232
|
+
...props,
|
|
233
|
+
children
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
);
|
|
238
|
+
}
|
|
179
239
|
function CodeBlock({ language, code }) {
|
|
180
240
|
const [copied, setCopied] = React.useState(false);
|
|
181
241
|
const handleCopy = async () => {
|
|
@@ -263,10 +323,17 @@ var defaultComponents = {
|
|
|
263
323
|
// don't nest <pre><pre>.
|
|
264
324
|
pre: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children }),
|
|
265
325
|
blockquote: ({ children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("blockquote", { className: "border-l-2 border-border pl-4 italic text-muted-foreground", ...props, children }),
|
|
266
|
-
table:
|
|
326
|
+
table: MarkdownTable,
|
|
267
327
|
thead: ({ children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-current/10", ...props, children }),
|
|
268
|
-
th: ({ children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
269
|
-
|
|
328
|
+
th: ({ children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
329
|
+
"th",
|
|
330
|
+
{
|
|
331
|
+
className: "min-w-[7rem] border-b border-border px-3 py-2 text-left font-semibold",
|
|
332
|
+
...props,
|
|
333
|
+
children
|
|
334
|
+
}
|
|
335
|
+
),
|
|
336
|
+
td: ({ children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: "min-w-[7rem] border-b border-border px-3 py-2 align-top", ...props, children }),
|
|
270
337
|
// General emphasis marks (GFM `~~strikethrough~~` → <del>, raw <ins>/<mark>).
|
|
271
338
|
del: ({ children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("del", { className: "text-muted-foreground line-through", ...props, children }),
|
|
272
339
|
ins: ({ children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("ins", { className: "underline decoration-primary/60", ...props, children }),
|
|
@@ -306,7 +373,14 @@ function MarkdownRendererComponent({
|
|
|
306
373
|
a: (props) => props.href?.startsWith("#cite-") ? renderCitation({ num: props.href.slice(6), children: props.children }) : React__default.default.createElement(Link, props)
|
|
307
374
|
};
|
|
308
375
|
}, [customComponents, renderCitation]);
|
|
309
|
-
const blocks = React.useMemo(
|
|
376
|
+
const blocks = React.useMemo(
|
|
377
|
+
() => splitMarkdownBlocks(
|
|
378
|
+
normalizeCitationMarkup(
|
|
379
|
+
isStreaming ? closeOpenEmphasis(trimOpenCitation(children)) : children
|
|
380
|
+
)
|
|
381
|
+
),
|
|
382
|
+
[children, isStreaming]
|
|
383
|
+
);
|
|
310
384
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
311
385
|
MarkdownErrorBoundary,
|
|
312
386
|
{
|
|
@@ -326,9 +400,10 @@ var MarkdownRenderer = React__default.default.memo(MarkdownRendererComponent);
|
|
|
326
400
|
|
|
327
401
|
exports.MarkdownRenderer = MarkdownRenderer;
|
|
328
402
|
exports.MarkdownStreamingContext = MarkdownStreamingContext;
|
|
403
|
+
exports.closeOpenEmphasis = closeOpenEmphasis;
|
|
329
404
|
exports.markdownBaseComponents = markdownBaseComponents;
|
|
330
405
|
exports.normalizeCitationMarkup = normalizeCitationMarkup;
|
|
331
406
|
exports.splitMarkdownBlocks = splitMarkdownBlocks;
|
|
332
407
|
exports.trimOpenCitation = trimOpenCitation;
|
|
333
|
-
//# sourceMappingURL=chunk-
|
|
334
|
-
//# sourceMappingURL=chunk-
|
|
408
|
+
//# sourceMappingURL=chunk-WBWXP2DN.cjs.map
|
|
409
|
+
//# sourceMappingURL=chunk-WBWXP2DN.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ai/markdown-base-components.tsx","../src/ai/markdown-streaming-context.ts","../src/ai/split-markdown-blocks.ts","../src/ai/normalize-citations.ts","../src/ai/MarkdownRenderer.tsx"],"names":["jsx","createContext","useRef","useState","useCallback","useEffect","jsxs","Check","Copy","cn","Fragment","remarkGfm","rehypeRaw","React","Markdown","useMemo"],"mappings":"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","file":"chunk-WBWXP2DN.cjs","sourcesContent":["import React from 'react'\nimport type { Components } from 'react-markdown'\n\n/**\n * Brand-neutral presentational component overrides for react-markdown, shared by\n * every markdown surface in the workspace (the monolith's `MarkdownRenderer` and\n * the AI kit's `AiMarkdown`). One house style for headings, lists, tables and the\n * inline text elements — token-based, so it themes per app.\n *\n * Deliberately excluded (kept per-consumer): `a` (external-link confirm vs\n * plain), `code`/`pre` (rich CodeBlock + Mermaid vs inline), `span` (doc-entity\n * pills), and `del`/`ins`/`mark` (general emphasis vs redline tracked-changes) —\n * these differ by intent or carry heavy/coupled behaviour, so each renderer owns\n * them and spreads this base underneath.\n */\nexport const markdownBaseComponents: Partial<Components> = {\n h1: ({ children, ...props }: React.ComponentPropsWithoutRef<'h1'>) => (\n <h1 className=\"text-lg font-semibold\" data-testid=\"markdown-heading-1\" {...props}>\n {children}\n </h1>\n ),\n h2: ({ children, ...props }: React.ComponentPropsWithoutRef<'h2'>) => (\n <h2 className=\"font-semibold text-base\" data-testid=\"markdown-heading-2\" {...props}>\n {children}\n </h2>\n ),\n h3: ({ children, ...props }: React.ComponentPropsWithoutRef<'h3'>) => (\n <h3 className=\"font-semibold text-base\" data-testid=\"markdown-heading-3\" {...props}>\n {children}\n </h3>\n ),\n h4: ({ children, ...props }: React.ComponentPropsWithoutRef<'h4'>) => (\n <h4 className=\"font-semibold text-base\" {...props}>\n {children}\n </h4>\n ),\n h5: ({ children, ...props }: React.ComponentPropsWithoutRef<'h5'>) => (\n <h5 className=\"font-medium\" {...props}>\n {children}\n </h5>\n ),\n strong: ({ children, ...props }: React.ComponentPropsWithoutRef<'strong'>) => (\n <strong className=\"font-semibold\" {...props}>\n {children}\n </strong>\n ),\n blockquote: ({ children, ...props }: React.ComponentPropsWithoutRef<'blockquote'>) => (\n <blockquote className=\"border-l-2 border-primary pl-4\" {...props}>\n {children}\n </blockquote>\n ),\n ol: ({ children, ...props }: React.ComponentPropsWithoutRef<'ol'>) => (\n <ol className=\"list-decimal space-y-2 pl-6\" data-testid=\"markdown-ordered-list\" {...props}>\n {children}\n </ol>\n ),\n ul: ({ children, ...props }: React.ComponentPropsWithoutRef<'ul'>) => (\n <ul className=\"list-none space-y-2 pl-6\" data-testid=\"markdown-unordered-list\" {...props}>\n {children}\n </ul>\n ),\n li: ({ children, ...props }: React.ComponentPropsWithoutRef<'li'>) => (\n <li className=\"my-1.5\" {...props}>\n {children}\n </li>\n ),\n table: ({ children, ...props }: React.ComponentPropsWithoutRef<'table'>) => (\n <table data-testid=\"markdown-table\" {...props}>\n {children}\n </table>\n ),\n th: ({ children, ...props }: React.ComponentPropsWithoutRef<'th'>) => (\n <th {...props}>{children}</th>\n ),\n td: ({ children, ...props }: React.ComponentPropsWithoutRef<'td'>) => (\n <td {...props}>{children}</td>\n ),\n tr: ({ children, ...props }: React.ComponentPropsWithoutRef<'tr'>) => (\n <tr {...props}>{children}</tr>\n ),\n p: ({ children, ...props }: React.ComponentPropsWithoutRef<'p'>) => (\n <p className=\"whitespace-pre-wrap\" {...props}>\n {children}\n </p>\n ),\n hr: (props: React.ComponentPropsWithoutRef<'hr'>) => (\n <hr className=\"border-foreground/20\" {...props} />\n ),\n sup: ({ children, ...props }: React.ComponentPropsWithoutRef<'sup'>) => (\n <sup className=\"text-xs\" {...props}>\n {children}\n </sup>\n ),\n sub: ({ children, ...props }: React.ComponentPropsWithoutRef<'sub'>) => (\n <sub className=\"text-xs\" {...props}>\n {children}\n </sub>\n ),\n div: ({ children, className, ...props }: React.ComponentPropsWithoutRef<'div'>) => (\n <div className={className} {...props}>\n {children}\n </div>\n ),\n br: (props: React.ComponentPropsWithoutRef<'br'>) => <br {...props} />,\n kbd: ({ children, ...props }: React.ComponentPropsWithoutRef<'kbd'>) => (\n <kbd\n className=\"px-1.5 py-0.5 text-xs font-mono bg-muted border border-border rounded\"\n {...props}\n >\n {children}\n </kbd>\n ),\n abbr: ({ children, title, ...props }: React.ComponentPropsWithoutRef<'abbr'>) => (\n <abbr title={title} className=\"underline decoration-dotted cursor-help\" {...props}>\n {children}\n </abbr>\n ),\n cite: ({ children, ...props }: React.ComponentPropsWithoutRef<'cite'>) => (\n <cite className=\"italic\" {...props}>\n {children}\n </cite>\n ),\n}\n","import { createContext } from 'react'\n\n/**\n * Signals to `MarkdownRenderer`'s component overrides that the surrounding\n * message is still streaming tokens. Heavy renderers can defer their work while\n * this is true to avoid burning CPU on partially complete fences and to keep the\n * UI responsive during long generations.\n *\n * Default `false` means non-streaming usages (parsed documents, static answers,\n * DM bubbles) get the full rendering with no behaviour change.\n */\nexport const MarkdownStreamingContext = createContext(false)\n","/**\n * Splits a markdown string into top-level blocks at `\\n\\n` boundaries.\n *\n * Streaming AI responses arrive token-by-token; passing the full string to\n * react-markdown re-parses the entire AST on every flush. By splitting into\n * blocks and memoizing each, only the trailing (still-growing) block re-parses\n * — completed blocks stay frozen in the DOM.\n *\n * The split avoids three correctness pitfalls:\n * - never splits inside an open ``` code fence (would corrupt the language)\n * - never splits between two adjacent list items (would render as two lists)\n * - never splits between two blockquote lines (would render as two quotes)\n */\nconst LIST_ITEM_RE = /^\\s*([-*+]|\\d+[.)])\\s/\nconst BLOCKQUOTE_RE = /^\\s*>/\n\nexport function splitMarkdownBlocks(content: string): string[] {\n if (!content) return []\n const blocks: string[] = []\n let start = 0\n let inFence = false\n let i = 0\n while (i < content.length) {\n if (content.startsWith('```', i)) {\n inFence = !inFence\n i += 3\n continue\n }\n if (!inFence && content[i] === '\\n' && content[i + 1] === '\\n') {\n const before = content.slice(start, i)\n const lastLine = before.slice(before.lastIndexOf('\\n') + 1)\n const afterStart = i + 2\n const nextNewline = content.indexOf('\\n', afterStart)\n const nextLine = content.slice(afterStart, nextNewline === -1 ? undefined : nextNewline)\n const bothListItems = LIST_ITEM_RE.test(lastLine) && LIST_ITEM_RE.test(nextLine)\n const bothBlockquotes = BLOCKQUOTE_RE.test(lastLine) && BLOCKQUOTE_RE.test(nextLine)\n if (bothListItems || bothBlockquotes) {\n i += 2\n continue\n }\n blocks.push(content.slice(start, afterStart))\n start = afterStart\n i = afterStart\n continue\n }\n i++\n }\n if (start < content.length) blocks.push(content.slice(start))\n return blocks\n}\n","/**\n * Citation markup normaliser.\n *\n * The backend marks a cited statement as a markdown link, `[statement](#cite-N)`, and the\n * statement can include the markdown that surrounds it: a list marker, a heading marker or the\n * opener of a bold/italic span whose closer sits after the link. Inside link text those tokens\n * are not parsed as block or inline syntax, so they show literally and break lists and bold:\n *\n * [- **Claimed quantum (by Claimant)](#cite-1):** **USD 47 million**\n *\n * `normalizeCitationMarkup` hoists the leading tokens out of the link text (and a trailing\n * emphasis closer after it), so the link only wraps the words:\n *\n * - **[Claimed quantum (by Claimant)](#cite-1):** **USD 47 million**\n *\n * It is conservative: emphasis that opens and closes inside the link text is valid markdown and\n * is left alone, an opener is only hoisted when its closer follows on the same line, and fenced\n * code blocks are never touched. The result is idempotent.\n *\n * It also tidies the residue the model leaves when it cites in prose as well: a literal\n * `(*Source: Award.pdf, p. 12*)` shows its asterisks, because `(*` does not open emphasis. It\n * becomes the italic note `*(Source: Award.pdf, p. 12)*`.\n */\n\nconst SOURCE_RESIDUE = /\\(\\*+\\s*(Sources?\\s*:[^\\n]*?)\\s*\\*+\\)/g\n\nconst CITE_LINK = /\\[([^\\]\\n]+)\\]\\((#cite-[\\w-]+)\\)/g\nconst BLOCK_MARKER = /^(?:[-*+]|\\d{1,9}[.)]|#{1,6})[ \\t]+/\nconst LEADING_EMPHASIS = /^(?:\\*\\*|__|\\*|_)+/\nconst TRAILING_EMPHASIS = /(\\*\\*|__|\\*|_)(:?)$/\n\n/** Occurrences of `token` in `text`; a single `*` is counted outside any `**` pair. */\nfunction countToken(text: string, token: string): number {\n const double = token + token\n if (token.length === 2) return text.split(token).length - 1\n const withoutDouble = text.split(double).join('')\n return withoutDouble.split(token).length - 1\n}\n\n/** Split a run of emphasis characters (`***`, `**`, `*`...) into its parser-level tokens. */\nfunction emphasisTokens(run: string): string[] {\n const char = run[0]\n const tokens: string[] = []\n let rest = run\n while (rest.length > 0) {\n const size = rest.length >= 2 ? 2 : 1\n tokens.push(char.repeat(size))\n rest = rest.slice(size)\n }\n return tokens\n}\n\nfunction hoistFromLink(text: string, before: string, after: string): [string, string, string] {\n let body = text\n let prefix = ''\n let suffix = ''\n\n if (before.trim() === '') {\n const marker = BLOCK_MARKER.exec(body)\n if (marker) {\n prefix += marker[0]\n body = body.slice(marker[0].length)\n }\n }\n\n const leading = LEADING_EMPHASIS.exec(body)\n if (leading) {\n let kept = ''\n let rest = body.slice(leading[0].length)\n for (const token of emphasisTokens(leading[0]).reverse()) {\n // Balanced inside the link text: valid as written.\n if (countToken(rest, token) % 2 === 1) {\n kept = token + kept\n continue\n }\n // Unmatched here: hoist only if the line closes it after the link.\n if (countToken(after, token) % 2 === 1) prefix += token\n else kept = token + kept\n }\n body = kept + rest\n rest = ''\n }\n\n const trailing = TRAILING_EMPHASIS.exec(body)\n if (trailing) {\n const token = trailing[1]\n const inner = body.slice(0, body.length - trailing[0].length)\n const openedBefore = countToken(before + prefix, token) % 2 === 1\n if (countToken(inner, token) % 2 === 0 && openedBefore) {\n body = inner\n suffix = trailing[0]\n }\n }\n\n return [prefix, body, suffix]\n}\n\nfunction normalizeLine(line: string): string {\n if (!line.includes('](#cite-')) return line\n return line.replace(CITE_LINK, (match, text: string, href: string, offset: number) => {\n const before = line.slice(0, offset)\n const after = line.slice(offset + match.length)\n const [prefix, body, suffix] = hoistFromLink(text, before, after)\n if (!prefix && !suffix && body === text) return match\n return `${prefix}[${body}](${href})${suffix}`\n })\n}\n\nfunction normalizeSourceResidue(line: string): string {\n return line.includes('(*') ? line.replace(SOURCE_RESIDUE, '*($1)*') : line\n}\n\nexport function normalizeCitationMarkup(markdown: string): string {\n if (!markdown.includes('](#cite-') && !markdown.includes('(*')) return markdown\n let inFence = false\n return markdown\n .split('\\n')\n .map((line) => {\n if (/^\\s*(```|~~~)/.test(line)) {\n inFence = !inFence\n return line\n }\n return inFence ? line : normalizeSourceResidue(normalizeLine(line))\n })\n .join('\\n')\n}\n\n/** A trailing, still-open `[words](#cite-N` marker (or an unclosed `[words`) on the last line. */\nconst OPEN_CITATION_TAIL = /\\[[^\\]\\n]*(?:\\](?:\\((?:#(?:c(?:i(?:t(?:e(?:-[\\w-]*)?)?)?)?)?)?)?)?$/\n\n/**\n * Drops an unfinished citation marker from the end of text that is still streaming (or was\n * stopped mid-marker), so `[Change of control](#cite-` never shows as raw markup: the words appear\n * once the marker is complete. Complete markers and everything else are left alone.\n */\nexport function trimOpenCitation(markdown: string): string {\n return markdown.replace(OPEN_CITATION_TAIL, '')\n}\n\n/** `**` pairs outside inline code in a line. */\nfunction boldMarks(line: string): number {\n return (line.replace(/`[^`]*`/g, '').match(/\\*\\*/g) ?? []).length\n}\n\n/**\n * Makes the tail of text that is still streaming (or was stopped) render cleanly: a `**` opened\n * in the last line and not yet closed (`| Valuation | **[USD 6.2 million](#cite-2)`) would show as\n * literal asterisks until its closer arrives, because an unclosed emphasis is not emphasis. The\n * open bold is closed at the end of the line, or removed when it has no text yet (`| **`, or a\n * half-typed closer `**USD 6*`). Text with balanced emphasis, and every line but the last, is\n * left alone. Apply after `trimOpenCitation`.\n */\nexport function closeOpenEmphasis(markdown: string): string {\n const cut = markdown.lastIndexOf('\\n') + 1\n const head = markdown.slice(0, cut)\n const fences = head.split('\\n').filter((l) => /^\\s*(```|~~~)/.test(l)).length\n let line = markdown.slice(cut)\n if (fences % 2 === 1 || /^\\s*(```|~~~)/.test(line)) return markdown\n // A half-typed opener: the first `*` of `**` after a space or a cell border.\n line = line.replace(/(^|[\\s|])\\*$/, '$1')\n if (boldMarks(line) % 2 === 0) return head + line\n // A half-typed closer: `**USD 6*` -> the second asterisk has not arrived.\n line = line.replace(/([^*\\s])\\*$/, '$1')\n if (boldMarks(line) % 2 === 0) return head + line\n if (/\\*\\*\\s*$/.test(line)) return head + line.replace(/\\s*\\*\\*\\s*$/, ' ')\n return head + line + '**'\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport Markdown, { type Components } from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport rehypeRaw from 'rehype-raw'\nimport { Copy, Check } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { markdownBaseComponents } from './markdown-base-components'\nimport { MarkdownStreamingContext } from './markdown-streaming-context'\nimport { splitMarkdownBlocks } from './split-markdown-blocks'\nimport { closeOpenEmphasis, normalizeCitationMarkup, trimOpenCitation } from './normalize-citations'\n\n/**\n * MarkdownRenderer — the single, full-featured markdown surface for the kit.\n *\n * Renders AI answers, chat/DM messages and parsed-document panes with one house\n * style: headings, paragraphs, bold/italic, ordered/unordered lists, GFM tables,\n * fenced code blocks (monospace + copy button), inline code, blockquotes, safe\n * links (`rel=\"noopener\"`, new tab) and horizontal rules.\n *\n * Styling is 100% semantic Tailwind tokens (`text-foreground`,\n * `text-muted-foreground`, `border-border`, `bg-muted`, `text-primary`) so it\n * themes per firm — no hardcoded brand colours. It sizes to its container, so it\n * looks right in a compact chat bubble and in a full-width document pane alike.\n *\n * Streaming: the content is split into block-level chunks (see\n * `splitMarkdownBlocks`) and each chunk is memoised, so streaming token updates\n * only re-parse the trailing block instead of the whole message. Pass\n * `isStreaming` to let heavy custom components defer via `MarkdownStreamingContext`.\n *\n * Extending: pass `components` to override any element (the kit's `AiMarkdown`\n * and `CitationRenderer` layer their accent links / citation popovers on top).\n */\n\nconst EDGE_FADE = '1.5rem'\n\n/**\n * A GFM table in its own horizontal scroller. The table keeps a minimum width per column\n * (`min-w-[7rem]` cells, words never broken mid-word), so on a narrow screen it scrolls sideways\n * inside this wrapper instead of squeezing cells to a letter per line. The edge(s) with more\n * content to scroll to fade out, which is the scroll hint. Wide containers are unchanged: the\n * table is `w-full` and nothing overflows.\n */\nfunction MarkdownTable({ children, ...props }: React.ComponentPropsWithoutRef<'table'>) {\n const ref = useRef<HTMLDivElement>(null)\n const [edges, setEdges] = useState({ start: false, end: false })\n const measure = useCallback(() => {\n const el = ref.current\n if (!el) return\n const start = el.scrollLeft > 1\n const end = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n setEdges((prev) => (prev.start === start && prev.end === end ? prev : { start, end }))\n }, [])\n useEffect(() => {\n const el = ref.current\n if (!el) return\n measure()\n if (typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(measure)\n observer.observe(el)\n if (el.firstElementChild) observer.observe(el.firstElementChild)\n return () => observer.disconnect()\n }, [measure])\n const mask =\n edges.start || edges.end\n ? `linear-gradient(to right, ${edges.start ? 'transparent' : '#000'}, #000 ${EDGE_FADE}, #000 calc(100% - ${EDGE_FADE}), ${edges.end ? 'transparent' : '#000'})`\n : undefined\n return (\n <div\n ref={ref}\n onScroll={measure}\n data-testid=\"markdown-table-scroller\"\n data-scroll-start={edges.start || undefined}\n data-scroll-end={edges.end || undefined}\n className=\"my-3 overflow-x-auto rounded-lg border border-border\"\n style={mask ? { maskImage: mask, WebkitMaskImage: mask } : undefined}\n >\n <table\n data-testid=\"markdown-table\"\n className=\"w-full border-collapse text-sm [overflow-wrap:normal] [word-break:normal]\"\n {...props}\n >\n {children}\n </table>\n </div>\n )\n}\n\n/** Fenced code block with a language label and copy-to-clipboard button. */\nfunction CodeBlock({ language, code }: { language: string; code: string }) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Clipboard unavailable (insecure context / permissions) — no-op.\n }\n }\n\n return (\n <div\n className=\"code-block relative my-3 overflow-hidden rounded-md border border-current/20 bg-current/5\"\n data-testid=\"markdown-code-block\"\n >\n <div className=\"flex items-center justify-between border-b border-current/20 px-3 py-1.5\">\n <span className=\"font-mono text-xs text-muted-foreground\">{language || 'code'}</span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground\"\n title={copied ? 'Copied!' : 'Copy code'}\n >\n {copied ? <Check size={12} /> : <Copy size={12} />}\n <span>{copied ? 'Copied' : 'Copy'}</span>\n </button>\n </div>\n <pre className=\"overflow-x-auto p-3 text-sm leading-relaxed\">\n <code className={cn('font-mono', language && `language-${language}`)}>{code}</code>\n </pre>\n </div>\n )\n}\n\n/**\n * Links. Internal hash/anchor links stay in-page; everything else opens safely in a new tab\n * (`rel=\"noopener noreferrer\"` prevents reverse-tabnabbing). A backend citation marker\n * (`#cite-N`) has no popover here: the cited words stay in the surface's own colour with a quiet\n * superscript number after them (no underline, so a cited sentence does not read as a link).\n * Pass `renderCitation` to `MarkdownRenderer` to swap in a real source popover.\n */\nfunction MarkdownLink({ href, children, ...props }: React.ComponentPropsWithoutRef<'a'>) {\n if (href?.startsWith('#cite-')) {\n return (\n <span\n className=\"cited-text after:ml-px after:align-super after:text-[0.7em] after:font-medium after:text-muted-foreground after:content-[attr(data-cite)]\"\n data-cite={href.slice(6)}\n >\n {children}\n </span>\n )\n }\n const isInternal = !href || href.startsWith('#') || href.startsWith('cite:')\n return (\n <a\n className=\"text-primary underline underline-offset-2\"\n href={href}\n {...(isInternal ? {} : { target: '_blank', rel: 'noopener noreferrer' })}\n {...props}\n >\n {children}\n </a>\n )\n}\n\n/**\n * Default component overrides. Spreads the shared brand-neutral base\n * (`markdownBaseComponents`: headings, lists, paragraphs, emphasis, hr…) and adds\n * the elements that carry behaviour or need self-contained styling: safe links,\n * code (inline + fenced), bordered tables and blockquotes. Module-scoped so the\n * reference is stable across renders and react-markdown can skip re-parsing.\n */\nconst defaultComponents: Partial<Components> = {\n ...markdownBaseComponents,\n a: MarkdownLink,\n em: ({ children, ...props }: React.ComponentPropsWithoutRef<'em'>) => (\n <em className=\"italic\" {...props}>\n {children}\n </em>\n ),\n code: function MarkdownCode({\n className,\n children,\n ...props\n }: React.ComponentPropsWithoutRef<'code'>) {\n const match = /language-(\\w+)/.exec(className || '')\n if (!match) {\n return (\n <code\n className=\"rounded bg-current/10 px-1 py-0.5 font-mono text-[0.9em]\"\n data-testid=\"markdown-inline-code\"\n {...props}\n >\n {children}\n </code>\n )\n }\n return <CodeBlock language={match[1]} code={String(children).replace(/\\n$/, '')} />\n },\n // The CodeBlock renders its own <pre>; unwrap react-markdown's wrapper so we\n // don't nest <pre><pre>.\n pre: ({ children }: React.ComponentPropsWithoutRef<'pre'>) => <>{children}</>,\n blockquote: ({ children, ...props }: React.ComponentPropsWithoutRef<'blockquote'>) => (\n <blockquote className=\"border-l-2 border-border pl-4 italic text-muted-foreground\" {...props}>\n {children}\n </blockquote>\n ),\n table: MarkdownTable,\n thead: ({ children, ...props }: React.ComponentPropsWithoutRef<'thead'>) => (\n <thead className=\"bg-current/10\" {...props}>\n {children}\n </thead>\n ),\n th: ({ children, ...props }: React.ComponentPropsWithoutRef<'th'>) => (\n <th\n className=\"min-w-[7rem] border-b border-border px-3 py-2 text-left font-semibold\"\n {...props}\n >\n {children}\n </th>\n ),\n td: ({ children, ...props }: React.ComponentPropsWithoutRef<'td'>) => (\n <td className=\"min-w-[7rem] border-b border-border px-3 py-2 align-top\" {...props}>\n {children}\n </td>\n ),\n // General emphasis marks (GFM `~~strikethrough~~` → <del>, raw <ins>/<mark>).\n del: ({ children, ...props }: React.ComponentPropsWithoutRef<'del'>) => (\n <del className=\"text-muted-foreground line-through\" {...props}>\n {children}\n </del>\n ),\n ins: ({ children, ...props }: React.ComponentPropsWithoutRef<'ins'>) => (\n <ins className=\"underline decoration-primary/60\" {...props}>\n {children}\n </ins>\n ),\n mark: ({ children, ...props }: React.ComponentPropsWithoutRef<'mark'>) => (\n <mark className=\"rounded bg-primary/15 px-0.5 text-inherit\" {...props}>\n {children}\n </mark>\n ),\n}\n\n// Stable module-scope plugin arrays so react-markdown compares them by reference\n// and skips re-running the remark/rehype pipeline when nothing else changed.\n// `rehype-raw` enables inline HTML (e.g. redline <del>/<ins>); no math/mermaid\n// plugins are bundled to keep the kit light.\nconst remarkPlugins = [remarkGfm]\nconst rehypePlugins = [rehypeRaw]\n\n/**\n * One parsed markdown block, memoised on (content, components) so already-rendered\n * blocks don't re-parse when a later block streams new tokens. This is the core\n * of the streaming-rendering optimisation.\n */\nconst MemoizedBlock = React.memo(function MarkdownBlock({\n content,\n components,\n}: {\n content: string\n components: Partial<Components>\n}) {\n return (\n <Markdown remarkPlugins={remarkPlugins} rehypePlugins={rehypePlugins} components={components}>\n {content}\n </Markdown>\n )\n})\n\n/** Prevents a malformed-markdown render error from crashing the whole surface. */\nclass MarkdownErrorBoundary extends React.Component<\n { fallback: React.ReactNode; children: React.ReactNode },\n { hasError: boolean }\n> {\n state = { hasError: false }\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n render() {\n return this.state.hasError ? this.props.fallback : this.props.children\n }\n}\n\nexport interface MarkdownRendererProps {\n /** Markdown content to render. */\n children: string\n /** Custom component overrides merged on top of the defaults. */\n components?: Partial<Components>\n /**\n * When true, signals heavy custom components (via `MarkdownStreamingContext`)\n * to defer their work while tokens are still arriving. Defaults to false.\n */\n isStreaming?: boolean\n /**\n * Renders a citation marker `[words](#cite-N)`: `children` are the cited words, `num` the N.\n * Keep it referentially stable (`useCallback`/`useMemo`), or every block re-parses.\n */\n renderCitation?: (citation: { num: string; children: React.ReactNode }) => React.ReactNode\n /** Extra classes on the wrapper (font-size, prose width, etc.). */\n className?: string\n /** Overrides the `data-testid` on the wrapper (default `markdown-renderer`). */\n testId?: string\n}\n\nfunction MarkdownRendererComponent({\n children,\n components: customComponents,\n renderCitation,\n isStreaming = false,\n className,\n testId = 'markdown-renderer',\n}: MarkdownRendererProps) {\n const components = useMemo(() => {\n const base = customComponents\n ? { ...defaultComponents, ...customComponents }\n : defaultComponents\n if (!renderCitation) return base\n const Link = base.a ?? MarkdownLink\n return {\n ...base,\n a: (props: React.ComponentPropsWithoutRef<'a'>) =>\n props.href?.startsWith('#cite-')\n ? renderCitation({ num: props.href.slice(6), children: props.children })\n : React.createElement(Link as React.ElementType, props),\n }\n }, [customComponents, renderCitation])\n\n const blocks = useMemo(\n () =>\n splitMarkdownBlocks(\n normalizeCitationMarkup(\n isStreaming ? closeOpenEmphasis(trimOpenCitation(children)) : children\n )\n ),\n [children, isStreaming]\n )\n\n return (\n <MarkdownErrorBoundary\n fallback={<div className={cn('whitespace-pre-wrap break-words', className)}>{children}</div>}\n >\n <MarkdownStreamingContext.Provider value={isStreaming}>\n <div\n className={cn('markdown-content space-y-3 break-words leading-relaxed', className)}\n data-testid={testId}\n >\n {blocks.map((block, index) => (\n <MemoizedBlock key={index} content={block} components={components} />\n ))}\n </div>\n </MarkdownStreamingContext.Provider>\n </MarkdownErrorBoundary>\n )\n}\n\n/**\n * Memoised so a stable message in a long thread doesn't re-parse when unrelated\n * tokens arrive elsewhere; a streaming message gets a fresh `children` each flush\n * and re-renders (only its trailing block re-parses, thanks to `MemoizedBlock`).\n */\nexport const MarkdownRenderer = React.memo(MarkdownRendererComponent)\n"]}
|
|
@@ -516,6 +516,15 @@ declare function normalizeCitationMarkup(markdown: string): string;
|
|
|
516
516
|
* once the marker is complete. Complete markers and everything else are left alone.
|
|
517
517
|
*/
|
|
518
518
|
declare function trimOpenCitation(markdown: string): string;
|
|
519
|
+
/**
|
|
520
|
+
* Makes the tail of text that is still streaming (or was stopped) render cleanly: a `**` opened
|
|
521
|
+
* in the last line and not yet closed (`| Valuation | **[USD 6.2 million](#cite-2)`) would show as
|
|
522
|
+
* literal asterisks until its closer arrives, because an unclosed emphasis is not emphasis. The
|
|
523
|
+
* open bold is closed at the end of the line, or removed when it has no text yet (`| **`, or a
|
|
524
|
+
* half-typed closer `**USD 6*`). Text with balanced emphasis, and every line but the last, is
|
|
525
|
+
* left alone. Apply after `trimOpenCitation`.
|
|
526
|
+
*/
|
|
527
|
+
declare function closeOpenEmphasis(markdown: string): string;
|
|
519
528
|
|
|
520
529
|
declare function AiMarkdown({ children, className, isStreaming, }: {
|
|
521
530
|
children: string;
|
|
@@ -1363,4 +1372,4 @@ declare function DocumentCard({ doc, thumbnailUrl, status, selected, onToggleSel
|
|
|
1363
1372
|
|
|
1364
1373
|
declare function cn(...inputs: ClassValue[]): string;
|
|
1365
1374
|
|
|
1366
|
-
export { DropdownMenuLabel as $, AgentBadge as A, BASE_COLORS as B, Card as C, CommandShortcut as D, Dialog as E, DialogClose as F, DialogContent as G, DialogDescription as H, DialogFooter as I, DialogHeader as J, DialogOverlay as K, DialogPortal as L, type DialogPresentation as M, DialogTitle as N, DialogTrigger as O, type DictateContextValue as P, DictateProvider as Q, DocumentCard as R, type DocumentCardProps as S, DocumentEntity as T, type DocumentEntityProps as U, type DocumentLike as V, DropdownMenu as W, DropdownMenuCheckboxItem as X, DropdownMenuContent as Y, DropdownMenuGroup as Z, DropdownMenuItem as _, AiMarkdown as a, type StatusBadgeProps as a$, DropdownMenuPortal as a0, DropdownMenuRadioGroup as a1, DropdownMenuRadioItem as a2, DropdownMenuSeparator as a3, DropdownMenuShortcut as a4, DropdownMenuSub as a5, DropdownMenuSubContent as a6, DropdownMenuSubTrigger as a7, DropdownMenuTrigger as a8, ENTITY_MAPPINGS as a9, PopoverTrigger as aA, type PresenceDisplayStatus as aB, PresenceLabel as aC, Progress as aD, ProjectEntity as aE, type ProjectEntityProps as aF, type ProjectRelation as aG, RadioGroup as aH, RadioGroupItem as aI, type Rag as aJ, RagDot as aK, RelevanceDot as aL, ScrollArea as aM, ScrollBar as aN, Select as aO, SelectContent as aP, SelectGroup as aQ, SelectItem as aR, SelectLabel as aS, SelectScrollDownButton as aT, SelectScrollUpButton as aU, SelectSeparator as aV, SelectTrigger as aW, SelectValue as aX, Separator as aY, Slider as aZ, type StatusBadgeComponent as a_, EntityIcon as aa, type EntityIconComponent as ab, EntityPill as ac, type EntityRegistryOverride as ad, type EntityType as ae, HoverCard as af, HoverCardContent as ag, HoverCardTrigger as ah, IconToggle as ai, type IconToggleProps as aj, Input as ak, type InputProps as al, Label as am, MarkMenu as an, type MarkMenuItem as ao, type MarkMenuProps as ap, MarkdownRenderer as aq, type MarkdownRendererProps as ar, MarkdownStreamingContext as as, NEUTRAL_GRAY as at, PLACEHOLDER_COLOR as au, PassageCard as av, type PassageCardProps as aw, Popover as ax, PopoverAnchor as ay, PopoverContent as az, Avatar as b, StatusPill as b0, type StatusPillProps as b1, type StatusVariant as b2, Switch as b3, TAG_TYPE_ICONS as b4, TAG_TYPE_LABELS as b5, Table as b6, TableBody as b7, TableCaption as b8, TableCell as b9, VISIBILITY_ICONS as bA, VisibilityIcon as bB, badgeVariants as bC, buttonVariants as bD, cardVariants as bE,
|
|
1375
|
+
export { DropdownMenuLabel as $, AgentBadge as A, BASE_COLORS as B, Card as C, CommandShortcut as D, Dialog as E, DialogClose as F, DialogContent as G, DialogDescription as H, DialogFooter as I, DialogHeader as J, DialogOverlay as K, DialogPortal as L, type DialogPresentation as M, DialogTitle as N, DialogTrigger as O, type DictateContextValue as P, DictateProvider as Q, DocumentCard as R, type DocumentCardProps as S, DocumentEntity as T, type DocumentEntityProps as U, type DocumentLike as V, DropdownMenu as W, DropdownMenuCheckboxItem as X, DropdownMenuContent as Y, DropdownMenuGroup as Z, DropdownMenuItem as _, AiMarkdown as a, type StatusBadgeProps as a$, DropdownMenuPortal as a0, DropdownMenuRadioGroup as a1, DropdownMenuRadioItem as a2, DropdownMenuSeparator as a3, DropdownMenuShortcut as a4, DropdownMenuSub as a5, DropdownMenuSubContent as a6, DropdownMenuSubTrigger as a7, DropdownMenuTrigger as a8, ENTITY_MAPPINGS as a9, PopoverTrigger as aA, type PresenceDisplayStatus as aB, PresenceLabel as aC, Progress as aD, ProjectEntity as aE, type ProjectEntityProps as aF, type ProjectRelation as aG, RadioGroup as aH, RadioGroupItem as aI, type Rag as aJ, RagDot as aK, RelevanceDot as aL, ScrollArea as aM, ScrollBar as aN, Select as aO, SelectContent as aP, SelectGroup as aQ, SelectItem as aR, SelectLabel as aS, SelectScrollDownButton as aT, SelectScrollUpButton as aU, SelectSeparator as aV, SelectTrigger as aW, SelectValue as aX, Separator as aY, Slider as aZ, type StatusBadgeComponent as a_, EntityIcon as aa, type EntityIconComponent as ab, EntityPill as ac, type EntityRegistryOverride as ad, type EntityType as ae, HoverCard as af, HoverCardContent as ag, HoverCardTrigger as ah, IconToggle as ai, type IconToggleProps as aj, Input as ak, type InputProps as al, Label as am, MarkMenu as an, type MarkMenuItem as ao, type MarkMenuProps as ap, MarkdownRenderer as aq, type MarkdownRendererProps as ar, MarkdownStreamingContext as as, NEUTRAL_GRAY as at, PLACEHOLDER_COLOR as au, PassageCard as av, type PassageCardProps as aw, Popover as ax, PopoverAnchor as ay, PopoverContent as az, Avatar as b, StatusPill as b0, type StatusPillProps as b1, type StatusVariant as b2, Switch as b3, TAG_TYPE_ICONS as b4, TAG_TYPE_LABELS as b5, Table as b6, TableBody as b7, TableCaption as b8, TableCell as b9, VISIBILITY_ICONS as bA, VisibilityIcon as bB, badgeVariants as bC, buttonVariants as bD, cardVariants as bE, closeOpenEmphasis as bF, cn as bG, configureEntityRegistry as bH, configureRagLabels as bI, configureStatusRegistry as bJ, getDocIcon as bK, getEntityColor as bL, getEntityColorStyles as bM, getEntityIcon as bN, getEntityLabel as bO, getStatusVariant as bP, getTagTypeIcon as bQ, getTagTypeLabel as bR, getWorkspaceColor as bS, markdownBaseComponents as bT, normalizeCitationMarkup as bU, splitMarkdownBlocks as bV, toggleVariants as bW, trimOpenCitation as bX, TableFooter as ba, TableHead as bb, TableHeader as bc, TableRow as bd, Tabs as be, TabsContent as bf, TabsList as bg, TabsTrigger as bh, TagEntity as bi, type TagEntityProps as bj, type TagLike as bk, Textarea as bl, type TextareaProps as bm, Toggle as bn, ToggleGroup as bo, ToggleGroupItem as bp, Tooltip as bq, TooltipContent as br, TooltipProvider as bs, TooltipTrigger as bt, UserEntity as bu, type UserEntityProps as bv, UserMenu as bw, type UserMenuItem as bx, type UserMenuProps as by, type UserMenuStatus as bz, AvatarFallback as c, AvatarImage as d, Badge as e, type BadgeProps as f, Button as g, type ButtonProps as h, CardContent as i, CardDescription as j, CardFooter as k, CardHeader as l, type CardProps as m, CardTitle as n, Checkbox as o, Collapsible as p, CollapsibleContent as q, CollapsibleTrigger as r, Command as s, CommandDialog as t, CommandEmpty as u, CommandGroup as v, CommandInput as w, CommandItem as x, CommandList as y, CommandSeparator as z };
|
|
@@ -516,6 +516,15 @@ declare function normalizeCitationMarkup(markdown: string): string;
|
|
|
516
516
|
* once the marker is complete. Complete markers and everything else are left alone.
|
|
517
517
|
*/
|
|
518
518
|
declare function trimOpenCitation(markdown: string): string;
|
|
519
|
+
/**
|
|
520
|
+
* Makes the tail of text that is still streaming (or was stopped) render cleanly: a `**` opened
|
|
521
|
+
* in the last line and not yet closed (`| Valuation | **[USD 6.2 million](#cite-2)`) would show as
|
|
522
|
+
* literal asterisks until its closer arrives, because an unclosed emphasis is not emphasis. The
|
|
523
|
+
* open bold is closed at the end of the line, or removed when it has no text yet (`| **`, or a
|
|
524
|
+
* half-typed closer `**USD 6*`). Text with balanced emphasis, and every line but the last, is
|
|
525
|
+
* left alone. Apply after `trimOpenCitation`.
|
|
526
|
+
*/
|
|
527
|
+
declare function closeOpenEmphasis(markdown: string): string;
|
|
519
528
|
|
|
520
529
|
declare function AiMarkdown({ children, className, isStreaming, }: {
|
|
521
530
|
children: string;
|
|
@@ -1363,4 +1372,4 @@ declare function DocumentCard({ doc, thumbnailUrl, status, selected, onToggleSel
|
|
|
1363
1372
|
|
|
1364
1373
|
declare function cn(...inputs: ClassValue[]): string;
|
|
1365
1374
|
|
|
1366
|
-
export { DropdownMenuLabel as $, AgentBadge as A, BASE_COLORS as B, Card as C, CommandShortcut as D, Dialog as E, DialogClose as F, DialogContent as G, DialogDescription as H, DialogFooter as I, DialogHeader as J, DialogOverlay as K, DialogPortal as L, type DialogPresentation as M, DialogTitle as N, DialogTrigger as O, type DictateContextValue as P, DictateProvider as Q, DocumentCard as R, type DocumentCardProps as S, DocumentEntity as T, type DocumentEntityProps as U, type DocumentLike as V, DropdownMenu as W, DropdownMenuCheckboxItem as X, DropdownMenuContent as Y, DropdownMenuGroup as Z, DropdownMenuItem as _, AiMarkdown as a, type StatusBadgeProps as a$, DropdownMenuPortal as a0, DropdownMenuRadioGroup as a1, DropdownMenuRadioItem as a2, DropdownMenuSeparator as a3, DropdownMenuShortcut as a4, DropdownMenuSub as a5, DropdownMenuSubContent as a6, DropdownMenuSubTrigger as a7, DropdownMenuTrigger as a8, ENTITY_MAPPINGS as a9, PopoverTrigger as aA, type PresenceDisplayStatus as aB, PresenceLabel as aC, Progress as aD, ProjectEntity as aE, type ProjectEntityProps as aF, type ProjectRelation as aG, RadioGroup as aH, RadioGroupItem as aI, type Rag as aJ, RagDot as aK, RelevanceDot as aL, ScrollArea as aM, ScrollBar as aN, Select as aO, SelectContent as aP, SelectGroup as aQ, SelectItem as aR, SelectLabel as aS, SelectScrollDownButton as aT, SelectScrollUpButton as aU, SelectSeparator as aV, SelectTrigger as aW, SelectValue as aX, Separator as aY, Slider as aZ, type StatusBadgeComponent as a_, EntityIcon as aa, type EntityIconComponent as ab, EntityPill as ac, type EntityRegistryOverride as ad, type EntityType as ae, HoverCard as af, HoverCardContent as ag, HoverCardTrigger as ah, IconToggle as ai, type IconToggleProps as aj, Input as ak, type InputProps as al, Label as am, MarkMenu as an, type MarkMenuItem as ao, type MarkMenuProps as ap, MarkdownRenderer as aq, type MarkdownRendererProps as ar, MarkdownStreamingContext as as, NEUTRAL_GRAY as at, PLACEHOLDER_COLOR as au, PassageCard as av, type PassageCardProps as aw, Popover as ax, PopoverAnchor as ay, PopoverContent as az, Avatar as b, StatusPill as b0, type StatusPillProps as b1, type StatusVariant as b2, Switch as b3, TAG_TYPE_ICONS as b4, TAG_TYPE_LABELS as b5, Table as b6, TableBody as b7, TableCaption as b8, TableCell as b9, VISIBILITY_ICONS as bA, VisibilityIcon as bB, badgeVariants as bC, buttonVariants as bD, cardVariants as bE,
|
|
1375
|
+
export { DropdownMenuLabel as $, AgentBadge as A, BASE_COLORS as B, Card as C, CommandShortcut as D, Dialog as E, DialogClose as F, DialogContent as G, DialogDescription as H, DialogFooter as I, DialogHeader as J, DialogOverlay as K, DialogPortal as L, type DialogPresentation as M, DialogTitle as N, DialogTrigger as O, type DictateContextValue as P, DictateProvider as Q, DocumentCard as R, type DocumentCardProps as S, DocumentEntity as T, type DocumentEntityProps as U, type DocumentLike as V, DropdownMenu as W, DropdownMenuCheckboxItem as X, DropdownMenuContent as Y, DropdownMenuGroup as Z, DropdownMenuItem as _, AiMarkdown as a, type StatusBadgeProps as a$, DropdownMenuPortal as a0, DropdownMenuRadioGroup as a1, DropdownMenuRadioItem as a2, DropdownMenuSeparator as a3, DropdownMenuShortcut as a4, DropdownMenuSub as a5, DropdownMenuSubContent as a6, DropdownMenuSubTrigger as a7, DropdownMenuTrigger as a8, ENTITY_MAPPINGS as a9, PopoverTrigger as aA, type PresenceDisplayStatus as aB, PresenceLabel as aC, Progress as aD, ProjectEntity as aE, type ProjectEntityProps as aF, type ProjectRelation as aG, RadioGroup as aH, RadioGroupItem as aI, type Rag as aJ, RagDot as aK, RelevanceDot as aL, ScrollArea as aM, ScrollBar as aN, Select as aO, SelectContent as aP, SelectGroup as aQ, SelectItem as aR, SelectLabel as aS, SelectScrollDownButton as aT, SelectScrollUpButton as aU, SelectSeparator as aV, SelectTrigger as aW, SelectValue as aX, Separator as aY, Slider as aZ, type StatusBadgeComponent as a_, EntityIcon as aa, type EntityIconComponent as ab, EntityPill as ac, type EntityRegistryOverride as ad, type EntityType as ae, HoverCard as af, HoverCardContent as ag, HoverCardTrigger as ah, IconToggle as ai, type IconToggleProps as aj, Input as ak, type InputProps as al, Label as am, MarkMenu as an, type MarkMenuItem as ao, type MarkMenuProps as ap, MarkdownRenderer as aq, type MarkdownRendererProps as ar, MarkdownStreamingContext as as, NEUTRAL_GRAY as at, PLACEHOLDER_COLOR as au, PassageCard as av, type PassageCardProps as aw, Popover as ax, PopoverAnchor as ay, PopoverContent as az, Avatar as b, StatusPill as b0, type StatusPillProps as b1, type StatusVariant as b2, Switch as b3, TAG_TYPE_ICONS as b4, TAG_TYPE_LABELS as b5, Table as b6, TableBody as b7, TableCaption as b8, TableCell as b9, VISIBILITY_ICONS as bA, VisibilityIcon as bB, badgeVariants as bC, buttonVariants as bD, cardVariants as bE, closeOpenEmphasis as bF, cn as bG, configureEntityRegistry as bH, configureRagLabels as bI, configureStatusRegistry as bJ, getDocIcon as bK, getEntityColor as bL, getEntityColorStyles as bM, getEntityIcon as bN, getEntityLabel as bO, getStatusVariant as bP, getTagTypeIcon as bQ, getTagTypeLabel as bR, getWorkspaceColor as bS, markdownBaseComponents as bT, normalizeCitationMarkup as bU, splitMarkdownBlocks as bV, toggleVariants as bW, trimOpenCitation as bX, TableFooter as ba, TableHead as bb, TableHeader as bc, TableRow as bd, Tabs as be, TabsContent as bf, TabsList as bg, TabsTrigger as bh, TagEntity as bi, type TagEntityProps as bj, type TagLike as bk, Textarea as bl, type TextareaProps as bm, Toggle as bn, ToggleGroup as bo, ToggleGroupItem as bp, Tooltip as bq, TooltipContent as br, TooltipProvider as bs, TooltipTrigger as bt, UserEntity as bu, type UserEntityProps as bv, UserMenu as bw, type UserMenuItem as bx, type UserMenuProps as by, type UserMenuStatus as bz, AvatarFallback as c, AvatarImage as d, Badge as e, type BadgeProps as f, Button as g, type ButtonProps as h, CardContent as i, CardDescription as j, CardFooter as k, CardHeader as l, type CardProps as m, CardTitle as n, Checkbox as o, Collapsible as p, CollapsibleContent as q, CollapsibleTrigger as r, Command as s, CommandDialog as t, CommandEmpty as u, CommandGroup as v, CommandInput as w, CommandItem as x, CommandList as y, CommandSeparator as z };
|