@blaaiz/docs-core 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/{chunk-ZKOOKLZ3.js → chunk-6H6OB7YP.js} +17 -2
  2. package/dist/chunk-6H6OB7YP.js.map +1 -0
  3. package/dist/{chunk-ZWDLAW5M.js → chunk-L4PFRXIK.js} +231 -28
  4. package/dist/chunk-L4PFRXIK.js.map +1 -0
  5. package/dist/generator.cjs +161 -18
  6. package/dist/generator.cjs.map +1 -1
  7. package/dist/generator.d.cts +24 -0
  8. package/dist/generator.d.ts +24 -0
  9. package/dist/generator.js +140 -13
  10. package/dist/generator.js.map +1 -1
  11. package/dist/index.cjs +233 -25
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +258 -7
  14. package/dist/index.d.ts +258 -7
  15. package/dist/index.js +1 -1
  16. package/dist/{navigation-CGqFIPlP.d.cts → navigation-DvgyWSZ4.d.cts} +22 -1
  17. package/dist/{navigation-CGqFIPlP.d.ts → navigation-DvgyWSZ4.d.ts} +22 -1
  18. package/dist/ui/api-try-it.cjs +19 -1
  19. package/dist/ui/api-try-it.cjs.map +1 -1
  20. package/dist/ui/api-try-it.d.cts +4 -2
  21. package/dist/ui/api-try-it.d.ts +4 -2
  22. package/dist/ui/api-try-it.js +5 -2
  23. package/dist/ui/api-try-it.js.map +1 -1
  24. package/dist/ui/ask-ai.cjs +26 -6
  25. package/dist/ui/ask-ai.cjs.map +1 -1
  26. package/dist/ui/ask-ai.d.cts +6 -1
  27. package/dist/ui/ask-ai.d.ts +6 -1
  28. package/dist/ui/ask-ai.js +26 -6
  29. package/dist/ui/ask-ai.js.map +1 -1
  30. package/dist/ui/copy-page.cjs +15 -0
  31. package/dist/ui/copy-page.cjs.map +1 -1
  32. package/dist/ui/copy-page.js +1 -1
  33. package/dist/ui.cjs +77 -6
  34. package/dist/ui.cjs.map +1 -1
  35. package/dist/ui.d.cts +99 -8
  36. package/dist/ui.d.ts +99 -8
  37. package/dist/ui.js +62 -8
  38. package/dist/ui.js.map +1 -1
  39. package/package.json +1 -1
  40. package/skills/SKILL.md +68 -27
  41. package/styles/api-reference.css +45 -2
  42. package/styles/ask-ai.css +28 -0
  43. package/styles/docs.css +96 -1
  44. package/styles/home.css +34 -1
  45. package/dist/chunk-ZKOOKLZ3.js.map +0 -1
  46. package/dist/chunk-ZWDLAW5M.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/ask-ai/conversation.ts","../../src/ui/ask-ai/markdown.ts","../../src/ui/ask-ai/stream.ts","../../src/ui/ask-ai.tsx"],"names":[],"mappings":"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","file":"ask-ai.js","sourcesContent":["/**\n * The Ask AI thread, and the request it turns into.\n *\n * The panel keeps the whole conversation so a reader can ask a follow-up, but\n * the route accepts at most 20 messages of at most 4000 characters each and\n * requires the last one to be the question. This module holds the thread's\n * shape and the one function that maps it onto the wire — capped, trimmed, and\n * with nothing the model cannot use.\n *\n * It is pure, so the capping rules are unit-tested without a browser.\n *\n * @packageDocumentation\n */\n\nimport type { AnswerSource } from './stream.js';\n\n/** How many trailing messages are sent as history. Well inside the route's 20. */\nexport const MAX_REQUEST_MESSAGES = 10;\n\n/** Per-message character cap, matching the route's limit. */\nexport const MAX_MESSAGE_CHARS = 4000;\n\n/** A question a reader asked. */\nexport interface AskAiQuestion {\n readonly id: string;\n readonly role: 'user';\n readonly text: string;\n}\n\n/** An answer, from the first streamed character to its final state. */\nexport interface AskAiAnswer {\n readonly id: string;\n readonly role: 'assistant';\n /** The answer so far. Grows while `state` is `streaming`. */\n readonly text: string;\n /** The route's citations for this answer. Empty until the `sources` frame. */\n readonly sources: readonly AnswerSource[];\n readonly state: 'streaming' | 'done' | 'error';\n /** The failure line, shown under any partial answer. */\n readonly error: string | undefined;\n}\n\n/** One entry in the thread. */\nexport type AskAiTurn = AskAiQuestion | AskAiAnswer;\n\n/** One message on the wire, in the route's request shape. */\nexport interface AskAiRequestMessage {\n readonly role: 'user' | 'assistant';\n readonly content: string;\n}\n\n/**\n * Map a thread onto the route's `messages` array.\n *\n * A failed or still-empty answer is left out: it has no content the model can\n * build on, and an error line is the framework's words, not the model's. What\n * remains is trimmed to the per-message cap and cut to the last\n * {@link MAX_REQUEST_MESSAGES} messages, so a long conversation stays inside the\n * route's limits without the panel having to forget the thread it shows.\n *\n * @param turns - the thread, oldest first, with the new question last\n * @returns the messages to send, oldest first\n */\nexport function toRequestMessages(turns: readonly AskAiTurn[]): readonly AskAiRequestMessage[] {\n const messages: AskAiRequestMessage[] = [];\n\n for (const turn of turns) {\n if (turn.role === 'assistant' && turn.state === 'error') {\n continue;\n }\n const content = turn.text.trim().slice(0, MAX_MESSAGE_CHARS);\n if (content === '') {\n continue;\n }\n messages.push({ role: turn.role, content });\n }\n\n return messages.slice(-MAX_REQUEST_MESSAGES);\n}\n","/**\n * The answer tokenizer — \"Markdown lite\".\n *\n * An Ask AI answer is model output, so it is never trusted as markup. This\n * module turns the streamed text into a small, closed set of nodes; the panel\n * renders those nodes as React elements. Nothing here produces HTML, and the\n * renderer has no HTML escape hatch, so an answer cannot inject markup however\n * it is written.\n *\n * The grammar is deliberately small — paragraphs, headings, lists, fenced code,\n * inline code, bold, and links — because that is what a documentation answer\n * uses. Two properties matter more than completeness:\n *\n * - **It parses a partial document.** The panel re-parses the answer on every\n * streamed frame, so an unterminated code fence or a half-typed link must\n * render sensibly rather than swallow the rest of the answer.\n * - **Links are allow-listed, not sanitised.** Only `http(s)` and site-relative\n * targets survive {@link safeAnswerHref}; anything else keeps its label and\n * loses its link.\n *\n * @packageDocumentation\n */\n\n/** A link target that passed the allow-list. */\nexport interface AnswerLinkTarget {\n readonly href: string;\n /** True for an absolute `http(s)` URL. The panel opens those in a new tab. */\n readonly external: boolean;\n}\n\n/**\n * One inline run inside a block. `strong` nests other inline runs; a link's\n * label is plain text, which is all a citation-style link needs.\n */\nexport type AnswerInline =\n | { readonly kind: 'text'; readonly text: string }\n | { readonly kind: 'code'; readonly text: string }\n | { readonly kind: 'strong'; readonly children: readonly AnswerInline[] }\n | {\n readonly kind: 'link';\n readonly text: string;\n readonly href: string;\n readonly external: boolean;\n };\n\n/**\n * One block of an answer. `code.closed` is false while the fence is still open,\n * which happens on every frame of a streaming code block.\n */\nexport type AnswerBlock =\n | { readonly kind: 'paragraph'; readonly children: readonly AnswerInline[] }\n | { readonly kind: 'heading'; readonly level: number; readonly children: readonly AnswerInline[] }\n | {\n readonly kind: 'list';\n readonly ordered: boolean;\n readonly items: readonly (readonly AnswerInline[])[];\n }\n | {\n readonly kind: 'code';\n readonly language: string | undefined;\n readonly text: string;\n readonly closed: boolean;\n }\n | {\n readonly kind: 'table';\n readonly header: readonly (readonly AnswerInline[])[];\n readonly rows: readonly (readonly (readonly AnswerInline[])[])[];\n };\n\nconst SCHEME = /^([a-z][a-z0-9+.-]*):/i;\n\nconst FENCE = /^ {0,3}(`{3,})\\s*([^\\s`]*)/;\nconst HEADING = /^ {0,3}(#{1,6})\\s+(.*)$/;\nconst BULLET_ITEM = /^ {0,3}[-*+][ \\t]+(.*)$/;\nconst ORDERED_ITEM = /^ {0,3}\\d{1,9}[.)][ \\t]+(.*)$/;\nconst TABLE_ROW = /^ {0,3}\\|(.*)$/;\n\n/** A GFM alignment row: cells of dashes with optional colons, e.g. `| --- | :-: |`. */\nfunction isTableSeparator(line: string): boolean {\n const row = TABLE_ROW.exec(line);\n if (row === null) {\n return false;\n }\n const cells = splitTableCells(row[1] ?? '');\n return cells.length > 0 && cells.every((cell) => /^:?-+:?$/.test(cell.trim()));\n}\n\n/** Split a table row's interior on unescaped pipes; `\\|` stays a literal pipe. */\nfunction splitTableCells(interior: string): string[] {\n const cells: string[] = [];\n let current = '';\n let escaped = false;\n for (const char of interior) {\n if (escaped) {\n current += char;\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '|') {\n cells.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n // A trailing `|` leaves one empty cell behind; interior text keeps its cell.\n if (current.trim() !== '') {\n cells.push(current);\n }\n return cells.map((cell) => cell.trim());\n}\n\n/**\n * True when the value carries a control character. A raw newline or a `\\u0000`\n * inside an href is the classic way to hide a scheme from a naive check, so the\n * value is rejected before its scheme is read.\n */\nfunction hasControlChars(value: string): boolean {\n for (const char of value) {\n const code = char.codePointAt(0) ?? 0;\n if (code < 0x20 || code === 0x7f) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Decide whether an answer's link may be rendered as a link.\n *\n * Only `http` and `https` absolute URLs and site-relative targets are allowed.\n * A scheme-relative `//host/path` is rejected because its scheme is decided by\n * the page, not by the answer, and every other scheme — `javascript:`,\n * `data:`, `vbscript:`, `file:` — is rejected outright. Control characters are\n * rejected before the scheme is read, since they are the classic way to hide\n * one.\n *\n * @param raw - the href exactly as the answer wrote it\n * @returns the target to render, or `null` when the link must be dropped\n */\nexport function safeAnswerHref(raw: string): AnswerLinkTarget | null {\n const href = raw.trim();\n if (href === '' || hasControlChars(href)) {\n return null;\n }\n\n const scheme = SCHEME.exec(href);\n if (scheme !== null) {\n const name = (scheme[1] ?? '').toLowerCase();\n return name === 'http' || name === 'https' ? { href, external: true } : null;\n }\n\n // `//host` inherits the page's scheme, so it is an absolute URL in disguise.\n // Anything else must be site-absolute: a model-written relative path such as\n // `../guides/refunds` resolves against whatever page happens to be open, so\n // it is dropped rather than rendered as a link that may point anywhere.\n if (href.startsWith('//') || !href.startsWith('/')) {\n return null;\n }\n return { href, external: false };\n}\n\n/** Append text to the last node when it is text, so runs do not fragment. */\nfunction pushText(nodes: AnswerInline[], text: string): void {\n if (text === '') {\n return;\n }\n const last = nodes.at(-1);\n if (last?.kind === 'text') {\n nodes[nodes.length - 1] = { kind: 'text', text: last.text + text };\n return;\n }\n nodes.push({ kind: 'text', text });\n}\n\n/** Read `[label](target)` at `start`, or `null` when it is not a whole link. */\nfunction readLink(\n source: string,\n start: number,\n): { readonly node: AnswerInline; readonly next: number } | null {\n const labelEnd = source.indexOf(']', start + 1);\n if (labelEnd === -1 || source[labelEnd + 1] !== '(') {\n return null;\n }\n const targetEnd = source.indexOf(')', labelEnd + 2);\n if (targetEnd === -1) {\n return null;\n }\n\n const label = source.slice(start + 1, labelEnd);\n const target = source.slice(labelEnd + 2, targetEnd);\n // `[label](/path \"Title\")` — the optional title is not rendered.\n const href = safeAnswerHref(target.split(/\\s+/)[0] ?? '');\n const next = targetEnd + 1;\n\n if (href === null) {\n // The label is still the answer's words; only the link is dropped.\n return { node: { kind: 'text', text: label }, next };\n }\n return {\n node: { kind: 'link', text: label, href: href.href, external: href.external },\n next,\n };\n}\n\n/**\n * Parse one line's inline markup.\n *\n * @param source - the block's text\n * @param allowStrong - false inside a `strong` run, which cannot nest itself\n * @returns the inline runs, in order\n */\nexport function parseAnswerInline(source: string, allowStrong = true): readonly AnswerInline[] {\n const nodes: AnswerInline[] = [];\n let plain = '';\n let index = 0;\n\n while (index < source.length) {\n const char = source[index];\n\n if (char === '`') {\n const end = source.indexOf('`', index + 1);\n if (end > index + 1) {\n pushText(nodes, plain);\n plain = '';\n nodes.push({ kind: 'code', text: source.slice(index + 1, end) });\n index = end + 1;\n continue;\n }\n } else if (allowStrong && char === '*' && source[index + 1] === '*') {\n const end = source.indexOf('**', index + 2);\n if (end > index + 2) {\n pushText(nodes, plain);\n plain = '';\n nodes.push({\n kind: 'strong',\n children: parseAnswerInline(source.slice(index + 2, end), false),\n });\n index = end + 2;\n continue;\n }\n } else if (char === '[') {\n const link = readLink(source, index);\n if (link !== null) {\n pushText(nodes, plain);\n plain = '';\n if (link.node.kind === 'text') {\n pushText(nodes, link.node.text);\n } else {\n nodes.push(link.node);\n }\n index = link.next;\n continue;\n }\n }\n\n // Not a token — or an unterminated one, which is literal text.\n plain += char ?? '';\n index += 1;\n }\n\n pushText(nodes, plain);\n return nodes;\n}\n\n/** Read a list item's text, or `null` when the line does not open one. */\nfunction readItem(line: string): { readonly text: string; readonly ordered: boolean } | null {\n const bullet = BULLET_ITEM.exec(line);\n if (bullet !== null) {\n return { text: bullet[1] ?? '', ordered: false };\n }\n const ordered = ORDERED_ITEM.exec(line);\n if (ordered !== null) {\n return { text: ordered[1] ?? '', ordered: true };\n }\n return null;\n}\n\n/** True when a line ends the paragraph or list being gathered. */\nfunction startsBlock(line: string): boolean {\n return (\n line.trim() === '' ||\n FENCE.test(line) ||\n HEADING.test(line) ||\n TABLE_ROW.test(line) ||\n readItem(line) !== null\n );\n}\n\n/**\n * Parse an answer into blocks.\n *\n * Unterminated constructs are kept rather than dropped: an open fence becomes a\n * code block marked `closed: false`, and a half-typed `[label](` stays as text.\n * That is what makes the same parser usable frame by frame while the answer\n * streams.\n *\n * @param source - the answer text so far\n * @returns the blocks, in order\n */\nexport function parseAnswerMarkdown(source: string): readonly AnswerBlock[] {\n const lines = source.split(/\\r\\n|\\r|\\n/);\n const blocks: AnswerBlock[] = [];\n let index = 0;\n\n while (index < lines.length) {\n const line = lines[index] ?? '';\n\n if (line.trim() === '') {\n index += 1;\n continue;\n }\n\n const fence = FENCE.exec(line);\n if (fence !== null) {\n const marker = fence[1] ?? '```';\n const language = fence[2] === undefined || fence[2] === '' ? undefined : fence[2];\n const body: string[] = [];\n let closed = false;\n index += 1;\n while (index < lines.length) {\n const inner = lines[index] ?? '';\n index += 1;\n if (inner.trimStart().startsWith(marker)) {\n closed = true;\n break;\n }\n body.push(inner);\n }\n blocks.push({ kind: 'code', language, text: body.join('\\n'), closed });\n continue;\n }\n\n const heading = HEADING.exec(line);\n if (heading !== null) {\n blocks.push({\n kind: 'heading',\n level: (heading[1] ?? '#').length,\n children: parseAnswerInline((heading[2] ?? '').trim()),\n });\n index += 1;\n continue;\n }\n\n // A table is a header row followed by a separator row. Until the separator\n // has streamed in, the header renders as a paragraph — the next frame\n // re-parses and upgrades it.\n const headerRow = TABLE_ROW.exec(line);\n if (headerRow !== null && isTableSeparator(lines[index + 1] ?? '')) {\n const header = splitTableCells(headerRow[1] ?? '').map((cell) => parseAnswerInline(cell));\n const rows: (readonly AnswerInline[])[][] = [];\n index += 2;\n while (index < lines.length) {\n const row = TABLE_ROW.exec(lines[index] ?? '');\n if (row === null) {\n break;\n }\n const cells = splitTableCells(row[1] ?? '')\n .slice(0, header.length)\n .map((cell) => parseAnswerInline(cell));\n while (cells.length < header.length) {\n cells.push([]);\n }\n rows.push(cells);\n index += 1;\n }\n blocks.push({ kind: 'table', header, rows });\n continue;\n }\n\n const first = readItem(line);\n if (first !== null) {\n const texts: string[] = [first.text];\n index += 1;\n while (index < lines.length) {\n const next = lines[index] ?? '';\n const item = readItem(next);\n if (item !== null) {\n texts.push(item.text);\n index += 1;\n continue;\n }\n if (startsBlock(next)) {\n break;\n }\n // A wrapped item continues on the following line.\n texts[texts.length - 1] = `${texts.at(-1) ?? ''} ${next.trim()}`;\n index += 1;\n }\n blocks.push({\n kind: 'list',\n ordered: first.ordered,\n items: texts.map((text) => parseAnswerInline(text)),\n });\n continue;\n }\n\n const paragraph: string[] = [line.trim()];\n index += 1;\n while (index < lines.length && !startsBlock(lines[index] ?? '')) {\n paragraph.push((lines[index] ?? '').trim());\n index += 1;\n }\n blocks.push({ kind: 'paragraph', children: parseAnswerInline(paragraph.join(' ')) });\n }\n\n return blocks;\n}\n","/**\n * The browser side of the Ask AI stream.\n *\n * The route answers with `text/event-stream`, and `fetch` hands the body over\n * in network chunks that respect no frame boundary: one chunk can split a line\n * in half, split a `\\r\\n` pair, or carry six frames at once. This module owns\n * that problem — a splitter that takes chunks and gives back whole frames — and\n * the small step after it: turning a frame into the one of four events the\n * panel understands.\n *\n * It mirrors the server reader in `core/ai/providers/sse.ts` on purpose. The\n * duplication is deliberate: the core layer must stay importable from a server\n * with no DOM, and the UI layer must not reach into the core's internals (the\n * architecture rule), so each side owns its own reader. Both follow the same\n * SSE line rules.\n *\n * Everything here is pure, so it is unit-tested without a browser.\n *\n * @packageDocumentation\n */\n\n/** One dispatched SSE frame. `event` is `undefined` when the frame omitted it. */\nexport interface AnswerFrame {\n readonly event: string | undefined;\n /** The joined `data:` lines, with no trailing newline. */\n readonly data: string;\n}\n\n/** A citation the route sends before the answer streams. */\nexport interface AnswerSource {\n readonly url: string;\n readonly title: string;\n}\n\n/**\n * What one frame means to the panel. `null` frames — keep-alive comments,\n * unknown event names, malformed payloads — are skipped rather than treated as\n * failures, so a future server event cannot break an old panel.\n */\nexport type AnswerEvent =\n | { readonly kind: 'sources'; readonly sources: readonly AnswerSource[] }\n | { readonly kind: 'text'; readonly text: string }\n | { readonly kind: 'done' }\n | { readonly kind: 'error'; readonly message: string };\n\n/** Accumulates chunks and gives back whole frames. */\nexport interface AnswerFrameSplitter {\n /** Add a decoded chunk. Returns the frames it completed, in order. */\n push(chunk: string): readonly AnswerFrame[];\n /** Flush at end of body: dispatches a frame whose final blank line was lost. */\n flush(): readonly AnswerFrame[];\n}\n\n/** Split off the first complete line, or `null` when none is complete yet. */\nfunction takeLine(buffer: string): { readonly line: string; readonly rest: string } | null {\n const match = /\\r\\n|\\n|\\r/.exec(buffer);\n if (match === null) {\n return null;\n }\n // A trailing lone `\\r` may be the first half of a `\\r\\n` still in flight.\n if (match[0] === '\\r' && match.index + 1 === buffer.length) {\n return null;\n }\n return {\n line: buffer.slice(0, match.index),\n rest: buffer.slice(match.index + match[0].length),\n };\n}\n\n/**\n * Create a frame splitter.\n *\n * It follows the SSE line rules: `\\r\\n`, `\\n`, or a lone `\\r` ends a line, a\n * blank line dispatches the frame, a leading `:` is a comment, one space after\n * the field colon is dropped, and repeated `data:` lines join with `\\n`.\n *\n * @returns a splitter, which owns the buffer between chunks\n */\nexport function createAnswerFrameSplitter(): AnswerFrameSplitter {\n let buffer = '';\n let event: string | undefined;\n let data: string[] = [];\n\n function addLine(line: string): void {\n if (line.startsWith(':')) {\n return; // Comment / keep-alive.\n }\n const colon = line.indexOf(':');\n const field = colon === -1 ? line : line.slice(0, colon);\n const raw = colon === -1 ? '' : line.slice(colon + 1);\n const value = raw.startsWith(' ') ? raw.slice(1) : raw;\n\n if (field === 'event') {\n event = value;\n } else if (field === 'data') {\n data.push(value);\n }\n // `id` and `retry` carry no meaning for a one-shot answer stream.\n }\n\n function take(): AnswerFrame | null {\n if (event === undefined && data.length === 0) {\n return null;\n }\n const frame: AnswerFrame = { event, data: data.join('\\n') };\n event = undefined;\n data = [];\n return frame;\n }\n\n return {\n push(chunk: string): readonly AnswerFrame[] {\n buffer += chunk;\n const frames: AnswerFrame[] = [];\n for (;;) {\n const taken = takeLine(buffer);\n if (taken === null) {\n break;\n }\n buffer = taken.rest;\n if (taken.line === '') {\n const frame = take();\n if (frame !== null) {\n frames.push(frame);\n }\n } else {\n addLine(taken.line);\n }\n }\n return frames;\n },\n\n flush(): readonly AnswerFrame[] {\n if (buffer !== '') {\n addLine(buffer);\n buffer = '';\n }\n const frame = take();\n return frame === null ? [] : [frame];\n },\n };\n}\n\n/** Parse a frame's payload, or `undefined` when it is not JSON. */\nfunction parsePayload(data: string): unknown {\n if (data === '') {\n return undefined;\n }\n try {\n return JSON.parse(data) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/** Read the `sources` payload, keeping only well-formed entries. */\nfunction readSources(payload: unknown): readonly AnswerSource[] {\n if (!Array.isArray(payload)) {\n return [];\n }\n const sources: AnswerSource[] = [];\n for (const entry of payload as readonly unknown[]) {\n if (typeof entry !== 'object' || entry === null) {\n continue;\n }\n const record = entry as Record<string, unknown>;\n const url: unknown = record['url'];\n const title: unknown = record['title'];\n if (typeof url === 'string' && url !== '' && typeof title === 'string' && title !== '') {\n sources.push({ url, title });\n }\n }\n return sources;\n}\n\n/** Read a string field from a frame payload. */\nfunction readString(payload: unknown, field: string): string | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n const value: unknown = (payload as Record<string, unknown>)[field];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Turn one frame into a panel event.\n *\n * @param frame - a frame from {@link createAnswerFrameSplitter}\n * @returns the event, or `null` when the frame carries nothing to render\n */\nexport function readAnswerEvent(frame: AnswerFrame): AnswerEvent | null {\n const payload = parsePayload(frame.data);\n\n switch (frame.event) {\n case 'sources':\n return { kind: 'sources', sources: readSources(payload) };\n case 'text': {\n const text = readString(payload, 'text');\n return text === undefined || text === '' ? null : { kind: 'text', text };\n }\n case 'done':\n return { kind: 'done' };\n case 'error':\n return {\n kind: 'error',\n message: readString(payload, 'message') ?? 'The answer stopped unexpectedly.',\n };\n default:\n return null;\n }\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n MAX_MESSAGE_CHARS,\n type AskAiAnswer,\n type AskAiTurn,\n toRequestMessages,\n} from './ask-ai/conversation.js';\nimport { type AnswerBlock, type AnswerInline, parseAnswerMarkdown } from './ask-ai/markdown.js';\nimport { createAnswerFrameSplitter, readAnswerEvent } from './ask-ai/stream.js';\n\n/**\n * The Ask AI panel: a floating trigger and a right-side rail that answers\n * questions about the site's own documentation.\n *\n * It is the browser half of {@link createAskAiRoute}. It streams the route's\n * `sources` / `text` / `done` events, renders the answer through the\n * framework's own tokenizer, and keeps the conversation so a reader can ask a\n * follow-up. Styled by `styles/ask-ai.css`.\n *\n * Two rules shape this module:\n *\n * - **An answer is never markup.** The streamed text is parsed into nodes and\n * rendered as React elements. There is no `dangerouslySetInnerHTML` here, and\n * a link survives only if its target passes the framework's allow-list.\n * - **A question is always cancellable.** Every question owns an\n * `AbortController`. Stop, Escape, a new chat, and closing the panel all abort\n * it, and the route aborts its provider call in turn.\n *\n * @packageDocumentation\n */\n\n/**\n * Props for {@link AskAi}.\n *\n * @public\n */\nexport interface AskAiProps {\n /** The Ask AI route's path. Default `/api/ai`. */\n readonly endpoint?: string;\n /** Starter questions shown in the empty state. Clicking one asks it. */\n readonly suggestions?: readonly string[];\n /** The trigger's label. Default `Ask AI`. */\n readonly label?: string;\n /** The composer's placeholder. Default `Ask a question…`. */\n readonly placeholder?: string;\n}\n\n/** Generic starters: the framework knows nothing about any site's subject. */\nconst DEFAULT_SUGGESTIONS: readonly string[] = [\n 'What is this documentation about?',\n 'How do I get started?',\n 'Show me an example request.',\n];\n\n/** The composer stops growing at five lines and scrolls instead. */\nconst MAX_COMPOSER_HEIGHT = 132;\n\n/* --- Icons --------------------------------------------------------------- */\n\nfunction sparkleIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" aria-hidden=\"true\">\n <path\n d=\"M12 3.5l1.6 4.4 4.4 1.6-4.4 1.6L12 15.5l-1.6-4.4L6 9.5l4.4-1.6L12 3.5ZM18.5 15l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8.8-2.2Z\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction closeIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6 6 18\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction newChatIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" aria-hidden=\"true\">\n <path d=\"M20 11.5A8 8 0 1 1 17.6 6M20 4v4h-4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction sendIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden=\"true\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction stopIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"2\" />\n </svg>\n );\n}\n\n/* --- Answer rendering ---------------------------------------------------- */\n\nfunction InlineRuns({ nodes }: { readonly nodes: readonly AnswerInline[] }) {\n return (\n <>\n {nodes.map((node, index) => {\n const key = `${String(index)}-${node.kind}`;\n if (node.kind === 'code') {\n return (\n <code key={key} className=\"askai-inline-code\">\n {node.text}\n </code>\n );\n }\n if (node.kind === 'strong') {\n return (\n <strong key={key} className=\"askai-strong\">\n <InlineRuns nodes={node.children} />\n </strong>\n );\n }\n if (node.kind === 'link') {\n // Only allow-listed targets reach here; an external one opens away\n // from the docs, so it never carries the referrer.\n return node.external ? (\n <a key={key} className=\"askai-link\" href={node.href} target=\"_blank\" rel=\"noreferrer\">\n {node.text}\n </a>\n ) : (\n <a key={key} className=\"askai-link\" href={node.href}>\n {node.text}\n </a>\n );\n }\n return <span key={key}>{node.text}</span>;\n })}\n </>\n );\n}\n\n/** The blinking end-of-answer caret, shown while text is still arriving. */\nfunction caret(): ReactNode {\n return <span className=\"askai-caret\" aria-hidden=\"true\" />;\n}\n\nfunction AnswerBlockView({\n block,\n withCaret,\n}: {\n readonly block: AnswerBlock;\n readonly withCaret: boolean;\n}) {\n if (block.kind === 'code') {\n return (\n <pre className=\"askai-codeblock\" data-language={block.language}>\n <code>{block.text}</code>\n </pre>\n );\n }\n if (block.kind === 'heading') {\n return (\n <p className=\"askai-answer-heading\">\n <InlineRuns nodes={block.children} />\n {withCaret ? caret() : null}\n </p>\n );\n }\n if (block.kind === 'table') {\n return (\n <div className=\"askai-table-wrap\">\n <table className=\"askai-table\">\n <thead>\n <tr>\n {block.header.map((cell, index) => (\n <th key={String(index)}>\n <InlineRuns nodes={cell} />\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {block.rows.map((row, rowIndex) => (\n <tr key={String(rowIndex)}>\n {row.map((cell, cellIndex) => (\n <td key={String(cellIndex)}>\n <InlineRuns nodes={cell} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {withCaret ? caret() : null}\n </div>\n );\n }\n if (block.kind === 'list') {\n const items = block.items.map((item, index) => (\n <li key={String(index)}>\n <InlineRuns nodes={item} />\n {withCaret && index === block.items.length - 1 ? caret() : null}\n </li>\n ));\n return block.ordered ? (\n <ol className=\"askai-list\">{items}</ol>\n ) : (\n <ul className=\"askai-list\">{items}</ul>\n );\n }\n return (\n <p className=\"askai-paragraph\">\n <InlineRuns nodes={block.children} />\n {withCaret ? caret() : null}\n </p>\n );\n}\n\n/** The answer body: the tokenized text, plus the caret while it streams. */\nfunction AnswerBody({ text, streaming }: { readonly text: string; readonly streaming: boolean }) {\n const blocks = parseAnswerMarkdown(text);\n if (blocks.length === 0) {\n return streaming ? <p className=\"askai-paragraph\">{caret()}</p> : null;\n }\n const last = blocks.length - 1;\n const tailTakesCaret = streaming && blocks[last]?.kind !== 'code';\n return (\n <>\n {blocks.map((block, index) => (\n <AnswerBlockView\n key={`${String(index)}-${block.kind}`}\n block={block}\n withCaret={tailTakesCaret && index === last}\n />\n ))}\n {streaming && !tailTakesCaret ? <p className=\"askai-paragraph\">{caret()}</p> : null}\n </>\n );\n}\n\n/* --- Route errors -------------------------------------------------------- */\n\n/**\n * Read a pre-stream failure. The route answers `400`, `429`, and `500` as JSON\n * with one readable `error` line — the exact violation, the seconds to wait, or\n * the environment variable to set — so it is shown verbatim.\n */\nasync function readRouteError(response: Response): Promise<string> {\n try {\n const payload: unknown = await response.json();\n if (typeof payload === 'object' && payload !== null) {\n const message: unknown = (payload as Record<string, unknown>)['error'];\n if (typeof message === 'string' && message.trim() !== '') {\n return message;\n }\n }\n } catch {\n // Not JSON — fall through to the status line.\n }\n return `Ask AI could not answer this question (HTTP ${String(response.status)}).`;\n}\n\n/* --- The panel ----------------------------------------------------------- */\n\n/**\n * The Ask AI trigger and panel. Mount it once, beside the layout's children.\n *\n * @example\n * ```tsx\n * // app/docs/layout.tsx\n * import { AskAi } from '@blaaiz/docs-core/ui/ask-ai';\n *\n * <DocsLayout …>\n * {children}\n * <AskAi />\n * </DocsLayout>\n * ```\n *\n * @param props - the endpoint, the starter questions, and the labels\n * @public\n */\nexport function AskAi({\n endpoint = '/api/ai',\n suggestions = DEFAULT_SUGGESTIONS,\n label = 'Ask AI',\n placeholder = 'Ask a question…',\n}: AskAiProps) {\n const [mounted, setMounted] = useState(false);\n const [open, setOpen] = useState(false);\n const [thread, setThread] = useState<readonly AskAiTurn[]>([]);\n const [draft, setDraft] = useState('');\n const [busy, setBusy] = useState(false);\n const [shortcutHint, setShortcutHint] = useState('⌘I');\n\n const abortRef = useRef<AbortController | null>(null);\n const threadRef = useRef<readonly AskAiTurn[]>([]);\n const openRef = useRef(false);\n const scrollRef = useRef<HTMLDivElement>(null);\n const composerRef = useRef<HTMLTextAreaElement>(null);\n const askCount = useRef(0);\n\n useEffect(() => {\n setMounted(true);\n // The panel renders only after mount, so reading the platform here cannot\n // cause a hydration mismatch.\n const mac = /mac|iphone|ipad/i.test(navigator.userAgent);\n setShortcutHint(mac ? '⌘I' : 'Ctrl I');\n }, []);\n\n useEffect(() => {\n threadRef.current = thread;\n }, [thread]);\n\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n /** Abort the question in flight, if there is one. */\n const stop = useCallback(() => {\n abortRef.current?.abort();\n }, []);\n\n const close = useCallback(() => {\n abortRef.current?.abort();\n setOpen(false);\n }, []);\n\n /** Ask a question, replacing the thread with `history` plus this exchange. */\n const ask = useCallback(\n (question: string, history: readonly AskAiTurn[]) => {\n const text = question.trim().slice(0, MAX_MESSAGE_CHARS);\n if (text === '' || abortRef.current !== null) {\n return;\n }\n\n askCount.current += 1;\n const turn = String(askCount.current);\n const userTurn: AskAiTurn = { id: `q${turn}`, role: 'user', text };\n const answerId = `a${turn}`;\n const answer: AskAiAnswer = {\n id: answerId,\n role: 'assistant',\n text: '',\n sources: [],\n state: 'streaming',\n error: undefined,\n };\n\n const messages = toRequestMessages([...history, userTurn]);\n const next: readonly AskAiTurn[] = [...history, userTurn, answer];\n threadRef.current = next;\n setThread(next);\n setBusy(true);\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n const update = (change: (previous: AskAiAnswer) => AskAiAnswer): void => {\n setThread((current) =>\n current.map((entry) =>\n entry.id === answerId && entry.role === 'assistant' ? change(entry) : entry,\n ),\n );\n };\n\n const run = async (): Promise<void> => {\n let answered = '';\n let terminal = false;\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ messages }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const message = await readRouteError(response);\n update((previous) => ({ ...previous, state: 'error', error: message }));\n return;\n }\n if (response.body === null) {\n update((previous) => ({\n ...previous,\n state: 'error',\n error: 'Ask AI sent an empty answer.',\n }));\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const splitter = createAnswerFrameSplitter();\n\n for (;;) {\n const result = await reader.read();\n const frames = result.done\n ? splitter.flush()\n : splitter.push(decoder.decode(result.value, { stream: true }));\n\n for (const frame of frames) {\n const event = readAnswerEvent(frame);\n if (event === null) {\n continue;\n }\n if (event.kind === 'text') {\n answered += event.text;\n const snapshot = answered;\n update((previous) => ({ ...previous, text: snapshot }));\n continue;\n }\n if (event.kind === 'sources') {\n const { sources } = event;\n update((previous) => ({ ...previous, sources }));\n continue;\n }\n if (event.kind === 'error') {\n const { message } = event;\n update((previous) => ({ ...previous, state: 'error', error: message }));\n } else {\n update((previous) => ({ ...previous, state: 'done' }));\n }\n terminal = true;\n }\n\n if (terminal || result.done) {\n break;\n }\n }\n\n if (!terminal) {\n // The body ended without `done` or `error` — a dropped connection.\n update((previous) =>\n previous.text === ''\n ? { ...previous, state: 'error', error: 'The answer stopped before it started.' }\n : { ...previous, state: 'done' },\n );\n }\n } catch {\n if (controller.signal.aborted) {\n // Stopped on purpose: keep whatever arrived.\n update((previous) =>\n previous.text === ''\n ? { ...previous, state: 'error', error: 'The question was stopped.' }\n : { ...previous, state: 'done' },\n );\n } else {\n update((previous) => ({\n ...previous,\n state: 'error',\n error: 'Ask AI could not be reached. Check your connection, then try again.',\n }));\n }\n } finally {\n if (abortRef.current === controller) {\n abortRef.current = null;\n setBusy(false);\n }\n }\n };\n\n void run();\n },\n [endpoint],\n );\n\n /** Re-send the question whose answer failed, from the same history. */\n const retry = useCallback(\n (answerId: string) => {\n const current = threadRef.current;\n const index = current.findIndex((entry) => entry.id === answerId);\n const question = index > 0 ? current[index - 1] : undefined;\n if (question?.role !== 'user') {\n return;\n }\n ask(question.text, current.slice(0, index - 1));\n },\n [ask],\n );\n\n const newChat = useCallback(() => {\n abortRef.current?.abort();\n threadRef.current = [];\n setThread([]);\n setDraft('');\n }, []);\n\n const submit = useCallback(() => {\n const text = draft.trim();\n if (text === '' || abortRef.current !== null) {\n return;\n }\n setDraft('');\n ask(text, threadRef.current);\n }, [ask, draft]);\n\n // ⌘I / Ctrl+I toggles the panel from anywhere on the page.\n useEffect(() => {\n const onKey = (event: globalThis.KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey) || event.altKey || event.key.toLowerCase() !== 'i') {\n return;\n }\n event.preventDefault();\n if (openRef.current) {\n close();\n } else {\n setOpen(true);\n }\n };\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('keydown', onKey);\n };\n }, [close]);\n\n // While open: Escape stops a stream, then closes; the page behind is locked.\n useEffect(() => {\n if (!open) {\n return;\n }\n const onKey = (event: globalThis.KeyboardEvent) => {\n if (event.key !== 'Escape') {\n return;\n }\n event.stopPropagation();\n if (abortRef.current !== null) {\n stop();\n return;\n }\n setOpen(false);\n };\n document.addEventListener('keydown', onKey, true);\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', onKey, true);\n document.body.style.overflow = '';\n };\n }, [open, stop]);\n\n useEffect(() => {\n if (open) {\n composerRef.current?.focus();\n }\n }, [open]);\n\n // Follow the answer as it grows.\n useEffect(() => {\n const el = scrollRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, [thread]);\n\n // Grow the composer with its content, up to five lines.\n useEffect(() => {\n const el = composerRef.current;\n if (!el) {\n return;\n }\n el.style.height = 'auto';\n el.style.height = `${String(Math.min(el.scrollHeight, MAX_COMPOSER_HEIGHT))}px`;\n }, [draft, open]);\n\n const onComposerKeyDown = (event: ReactKeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n };\n\n if (!mounted) {\n return null;\n }\n\n const trigger = (\n <button\n type=\"button\"\n className=\"askai-trigger\"\n aria-label={`${label} (${shortcutHint})`}\n onClick={() => {\n setOpen(true);\n }}\n >\n <span className=\"askai-trigger-icon\">{sparkleIcon()}</span>\n <span className=\"askai-trigger-label\">{label}</span>\n <kbd className=\"askai-kbd\">{shortcutHint}</kbd>\n </button>\n );\n\n const panel = (\n <aside className=\"askai-panel\" role=\"dialog\" aria-modal=\"false\" aria-label={label}>\n <header className=\"askai-head\">\n <span className=\"askai-head-icon\">{sparkleIcon()}</span>\n <h2 className=\"askai-head-title\">{label}</h2>\n <span className=\"askai-head-hint\">Esc</span>\n <button\n type=\"button\"\n className=\"askai-head-btn\"\n aria-label=\"New chat\"\n title=\"New chat\"\n disabled={thread.length === 0}\n onClick={newChat}\n >\n {newChatIcon()}\n </button>\n <button type=\"button\" className=\"askai-head-btn\" aria-label=\"Close\" onClick={close}>\n {closeIcon()}\n </button>\n </header>\n\n <div className=\"askai-thread\" ref={scrollRef}>\n {thread.length === 0 ? (\n <div className=\"askai-empty\">\n <p className=\"askai-empty-line\">\n Ask a question about this documentation. Answers cite the pages they come from.\n </p>\n <div className=\"askai-chips\">\n {suggestions.map((suggestion) => (\n <button\n type=\"button\"\n key={suggestion}\n className=\"askai-chip\"\n onClick={() => {\n ask(suggestion, threadRef.current);\n }}\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n ) : (\n thread.map((entry) =>\n entry.role === 'user' ? (\n <div className=\"askai-question\" key={entry.id}>\n <div className=\"askai-bubble\">{entry.text}</div>\n </div>\n ) : (\n <div className=\"askai-answer\" key={entry.id} data-state={entry.state}>\n <AnswerBody text={entry.text} streaming={entry.state === 'streaming'} />\n {entry.sources.length > 0 && entry.state !== 'error' ? (\n <div className=\"askai-sources\">\n <span className=\"askai-sources-label\">Sources</span>\n <div className=\"askai-sources-chips\">\n {entry.sources.map((source) => (\n <a className=\"askai-source\" key={source.url} href={source.url}>\n {source.title}\n </a>\n ))}\n </div>\n </div>\n ) : null}\n {entry.error === undefined ? null : (\n <div className=\"askai-error\" role=\"alert\">\n <span className=\"askai-error-text\">{entry.error}</span>\n <button\n type=\"button\"\n className=\"askai-retry\"\n disabled={busy}\n onClick={() => {\n retry(entry.id);\n }}\n >\n Try again\n </button>\n </div>\n )}\n </div>\n ),\n )\n )}\n </div>\n\n <div className=\"askai-composer\">\n <textarea\n ref={composerRef}\n className=\"askai-input\"\n rows={1}\n value={draft}\n placeholder={placeholder}\n aria-label={placeholder}\n maxLength={MAX_MESSAGE_CHARS}\n disabled={busy}\n onChange={(event) => {\n setDraft(event.target.value);\n }}\n onKeyDown={onComposerKeyDown}\n />\n {busy ? (\n <button type=\"button\" className=\"askai-send\" aria-label=\"Stop\" onClick={stop}>\n {stopIcon()}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"askai-send\"\n aria-label=\"Send\"\n disabled={draft.trim() === ''}\n onClick={submit}\n >\n {sendIcon()}\n </button>\n )}\n </div>\n </aside>\n );\n\n return createPortal(\n <div className=\"askai-root\" data-open={open ? '' : undefined}>\n {open ? panel : trigger}\n </div>,\n document.body,\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/ui/ask-ai/conversation.ts","../../src/ui/ask-ai/markdown.ts","../../src/ui/ask-ai/stream.ts","../../src/ui/ask-ai.tsx"],"names":[],"mappings":"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","file":"ask-ai.js","sourcesContent":["/**\n * The Ask AI thread, and the request it turns into.\n *\n * The panel keeps the whole conversation so a reader can ask a follow-up, but\n * the route accepts at most 20 messages of at most 4000 characters each and\n * requires the last one to be the question. This module holds the thread's\n * shape and the one function that maps it onto the wire — capped, trimmed, and\n * with nothing the model cannot use.\n *\n * It is pure, so the capping rules are unit-tested without a browser.\n *\n * @packageDocumentation\n */\n\nimport type { AnswerSource } from './stream.js';\n\n/** How many trailing messages are sent as history. Well inside the route's 20. */\nexport const MAX_REQUEST_MESSAGES = 10;\n\n/** Per-message character cap, matching the route's limit. */\nexport const MAX_MESSAGE_CHARS = 4000;\n\n/** A question a reader asked. */\nexport interface AskAiQuestion {\n readonly id: string;\n readonly role: 'user';\n readonly text: string;\n}\n\n/** An answer, from the first streamed character to its final state. */\nexport interface AskAiAnswer {\n readonly id: string;\n readonly role: 'assistant';\n /** The answer so far. Grows while `state` is `streaming`. */\n readonly text: string;\n /** The route's citations for this answer. Empty until the `sources` frame. */\n readonly sources: readonly AnswerSource[];\n readonly state: 'streaming' | 'done' | 'error';\n /** The failure line, shown under any partial answer. */\n readonly error: string | undefined;\n}\n\n/** One entry in the thread. */\nexport type AskAiTurn = AskAiQuestion | AskAiAnswer;\n\n/** One message on the wire, in the route's request shape. */\nexport interface AskAiRequestMessage {\n readonly role: 'user' | 'assistant';\n readonly content: string;\n}\n\n/**\n * Map a thread onto the route's `messages` array.\n *\n * A failed or still-empty answer is left out: it has no content the model can\n * build on, and an error line is the framework's words, not the model's. What\n * remains is trimmed to the per-message cap and cut to the last\n * {@link MAX_REQUEST_MESSAGES} messages, so a long conversation stays inside the\n * route's limits without the panel having to forget the thread it shows.\n *\n * @param turns - the thread, oldest first, with the new question last\n * @returns the messages to send, oldest first\n */\nexport function toRequestMessages(turns: readonly AskAiTurn[]): readonly AskAiRequestMessage[] {\n const messages: AskAiRequestMessage[] = [];\n\n for (const turn of turns) {\n if (turn.role === 'assistant' && turn.state === 'error') {\n continue;\n }\n const content = turn.text.trim().slice(0, MAX_MESSAGE_CHARS);\n if (content === '') {\n continue;\n }\n messages.push({ role: turn.role, content });\n }\n\n return messages.slice(-MAX_REQUEST_MESSAGES);\n}\n","/**\n * The answer tokenizer — \"Markdown lite\".\n *\n * An Ask AI answer is model output, so it is never trusted as markup. This\n * module turns the streamed text into a small, closed set of nodes; the panel\n * renders those nodes as React elements. Nothing here produces HTML, and the\n * renderer has no HTML escape hatch, so an answer cannot inject markup however\n * it is written.\n *\n * The grammar is deliberately small — paragraphs, headings, lists, fenced code,\n * inline code, bold, and links — because that is what a documentation answer\n * uses. Two properties matter more than completeness:\n *\n * - **It parses a partial document.** The panel re-parses the answer on every\n * streamed frame, so an unterminated code fence or a half-typed link must\n * render sensibly rather than swallow the rest of the answer.\n * - **Links are allow-listed, not sanitised.** Only `http(s)` and site-relative\n * targets survive {@link safeAnswerHref}; anything else keeps its label and\n * loses its link.\n *\n * @packageDocumentation\n */\n\n/** A link target that passed the allow-list. */\nexport interface AnswerLinkTarget {\n readonly href: string;\n /** True for an absolute `http(s)` URL. The panel opens those in a new tab. */\n readonly external: boolean;\n}\n\n/**\n * One inline run inside a block. `strong` nests other inline runs; a link's\n * label is plain text, which is all a citation-style link needs.\n */\nexport type AnswerInline =\n | { readonly kind: 'text'; readonly text: string }\n | { readonly kind: 'code'; readonly text: string }\n | { readonly kind: 'strong'; readonly children: readonly AnswerInline[] }\n | {\n readonly kind: 'link';\n readonly text: string;\n readonly href: string;\n readonly external: boolean;\n };\n\n/**\n * One block of an answer. `code.closed` is false while the fence is still open,\n * which happens on every frame of a streaming code block.\n */\nexport type AnswerBlock =\n | { readonly kind: 'paragraph'; readonly children: readonly AnswerInline[] }\n | { readonly kind: 'heading'; readonly level: number; readonly children: readonly AnswerInline[] }\n | {\n readonly kind: 'list';\n readonly ordered: boolean;\n readonly items: readonly (readonly AnswerInline[])[];\n }\n | {\n readonly kind: 'code';\n readonly language: string | undefined;\n readonly text: string;\n readonly closed: boolean;\n }\n | {\n readonly kind: 'table';\n readonly header: readonly (readonly AnswerInline[])[];\n readonly rows: readonly (readonly (readonly AnswerInline[])[])[];\n };\n\nconst SCHEME = /^([a-z][a-z0-9+.-]*):/i;\n\nconst FENCE = /^ {0,3}(`{3,})\\s*([^\\s`]*)/;\nconst HEADING = /^ {0,3}(#{1,6})\\s+(.*)$/;\nconst BULLET_ITEM = /^ {0,3}[-*+][ \\t]+(.*)$/;\nconst ORDERED_ITEM = /^ {0,3}\\d{1,9}[.)][ \\t]+(.*)$/;\nconst TABLE_ROW = /^ {0,3}\\|(.*)$/;\n\n/** A GFM alignment row: cells of dashes with optional colons, e.g. `| --- | :-: |`. */\nfunction isTableSeparator(line: string): boolean {\n const row = TABLE_ROW.exec(line);\n if (row === null) {\n return false;\n }\n const cells = splitTableCells(row[1] ?? '');\n return cells.length > 0 && cells.every((cell) => /^:?-+:?$/.test(cell.trim()));\n}\n\n/** Split a table row's interior on unescaped pipes; `\\|` stays a literal pipe. */\nfunction splitTableCells(interior: string): string[] {\n const cells: string[] = [];\n let current = '';\n let escaped = false;\n for (const char of interior) {\n if (escaped) {\n current += char;\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '|') {\n cells.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n // A trailing `|` leaves one empty cell behind; interior text keeps its cell.\n if (current.trim() !== '') {\n cells.push(current);\n }\n return cells.map((cell) => cell.trim());\n}\n\n/**\n * True when the value carries a control character. A raw newline or a `\\u0000`\n * inside an href is the classic way to hide a scheme from a naive check, so the\n * value is rejected before its scheme is read.\n */\nfunction hasControlChars(value: string): boolean {\n for (const char of value) {\n const code = char.codePointAt(0) ?? 0;\n if (code < 0x20 || code === 0x7f) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Decide whether an answer's link may be rendered as a link.\n *\n * Only `http` and `https` absolute URLs and site-relative targets are allowed.\n * A scheme-relative `//host/path` is rejected because its scheme is decided by\n * the page, not by the answer, and every other scheme — `javascript:`,\n * `data:`, `vbscript:`, `file:` — is rejected outright. Control characters are\n * rejected before the scheme is read, since they are the classic way to hide\n * one.\n *\n * @param raw - the href exactly as the answer wrote it\n * @returns the target to render, or `null` when the link must be dropped\n */\nexport function safeAnswerHref(raw: string): AnswerLinkTarget | null {\n const href = raw.trim();\n if (href === '' || hasControlChars(href)) {\n return null;\n }\n\n const scheme = SCHEME.exec(href);\n if (scheme !== null) {\n const name = (scheme[1] ?? '').toLowerCase();\n return name === 'http' || name === 'https' ? { href, external: true } : null;\n }\n\n // `//host` inherits the page's scheme, so it is an absolute URL in disguise.\n // Anything else must be site-absolute: a model-written relative path such as\n // `../guides/refunds` resolves against whatever page happens to be open, so\n // it is dropped rather than rendered as a link that may point anywhere.\n if (href.startsWith('//') || !href.startsWith('/')) {\n return null;\n }\n return { href, external: false };\n}\n\n/** Append text to the last node when it is text, so runs do not fragment. */\nfunction pushText(nodes: AnswerInline[], text: string): void {\n if (text === '') {\n return;\n }\n const last = nodes.at(-1);\n if (last?.kind === 'text') {\n nodes[nodes.length - 1] = { kind: 'text', text: last.text + text };\n return;\n }\n nodes.push({ kind: 'text', text });\n}\n\n/** Read `[label](target)` at `start`, or `null` when it is not a whole link. */\nfunction readLink(\n source: string,\n start: number,\n): { readonly node: AnswerInline; readonly next: number } | null {\n const labelEnd = source.indexOf(']', start + 1);\n if (labelEnd === -1 || source[labelEnd + 1] !== '(') {\n return null;\n }\n const targetEnd = source.indexOf(')', labelEnd + 2);\n if (targetEnd === -1) {\n return null;\n }\n\n const label = source.slice(start + 1, labelEnd);\n const target = source.slice(labelEnd + 2, targetEnd);\n // `[label](/path \"Title\")` — the optional title is not rendered.\n const href = safeAnswerHref(target.split(/\\s+/)[0] ?? '');\n const next = targetEnd + 1;\n\n if (href === null) {\n // The label is still the answer's words; only the link is dropped.\n return { node: { kind: 'text', text: label }, next };\n }\n return {\n node: { kind: 'link', text: label, href: href.href, external: href.external },\n next,\n };\n}\n\n/**\n * Parse one line's inline markup.\n *\n * @param source - the block's text\n * @param allowStrong - false inside a `strong` run, which cannot nest itself\n * @returns the inline runs, in order\n */\nexport function parseAnswerInline(source: string, allowStrong = true): readonly AnswerInline[] {\n const nodes: AnswerInline[] = [];\n let plain = '';\n let index = 0;\n\n while (index < source.length) {\n const char = source[index];\n\n if (char === '`') {\n const end = source.indexOf('`', index + 1);\n if (end > index + 1) {\n pushText(nodes, plain);\n plain = '';\n nodes.push({ kind: 'code', text: source.slice(index + 1, end) });\n index = end + 1;\n continue;\n }\n } else if (allowStrong && char === '*' && source[index + 1] === '*') {\n const end = source.indexOf('**', index + 2);\n if (end > index + 2) {\n pushText(nodes, plain);\n plain = '';\n nodes.push({\n kind: 'strong',\n children: parseAnswerInline(source.slice(index + 2, end), false),\n });\n index = end + 2;\n continue;\n }\n } else if (char === '[') {\n const link = readLink(source, index);\n if (link !== null) {\n pushText(nodes, plain);\n plain = '';\n if (link.node.kind === 'text') {\n pushText(nodes, link.node.text);\n } else {\n nodes.push(link.node);\n }\n index = link.next;\n continue;\n }\n }\n\n // Not a token — or an unterminated one, which is literal text.\n plain += char ?? '';\n index += 1;\n }\n\n pushText(nodes, plain);\n return nodes;\n}\n\n/** Read a list item's text, or `null` when the line does not open one. */\nfunction readItem(line: string): { readonly text: string; readonly ordered: boolean } | null {\n const bullet = BULLET_ITEM.exec(line);\n if (bullet !== null) {\n return { text: bullet[1] ?? '', ordered: false };\n }\n const ordered = ORDERED_ITEM.exec(line);\n if (ordered !== null) {\n return { text: ordered[1] ?? '', ordered: true };\n }\n return null;\n}\n\n/** True when a line ends the paragraph or list being gathered. */\nfunction startsBlock(line: string): boolean {\n return (\n line.trim() === '' ||\n FENCE.test(line) ||\n HEADING.test(line) ||\n TABLE_ROW.test(line) ||\n readItem(line) !== null\n );\n}\n\n/**\n * Parse an answer into blocks.\n *\n * Unterminated constructs are kept rather than dropped: an open fence becomes a\n * code block marked `closed: false`, and a half-typed `[label](` stays as text.\n * That is what makes the same parser usable frame by frame while the answer\n * streams.\n *\n * @param source - the answer text so far\n * @returns the blocks, in order\n */\nexport function parseAnswerMarkdown(source: string): readonly AnswerBlock[] {\n const lines = source.split(/\\r\\n|\\r|\\n/);\n const blocks: AnswerBlock[] = [];\n let index = 0;\n\n while (index < lines.length) {\n const line = lines[index] ?? '';\n\n if (line.trim() === '') {\n index += 1;\n continue;\n }\n\n const fence = FENCE.exec(line);\n if (fence !== null) {\n const marker = fence[1] ?? '```';\n const language = fence[2] === undefined || fence[2] === '' ? undefined : fence[2];\n const body: string[] = [];\n let closed = false;\n index += 1;\n while (index < lines.length) {\n const inner = lines[index] ?? '';\n index += 1;\n if (inner.trimStart().startsWith(marker)) {\n closed = true;\n break;\n }\n body.push(inner);\n }\n blocks.push({ kind: 'code', language, text: body.join('\\n'), closed });\n continue;\n }\n\n const heading = HEADING.exec(line);\n if (heading !== null) {\n blocks.push({\n kind: 'heading',\n level: (heading[1] ?? '#').length,\n children: parseAnswerInline((heading[2] ?? '').trim()),\n });\n index += 1;\n continue;\n }\n\n // A table is a header row followed by a separator row. Until the separator\n // has streamed in, the header renders as a paragraph — the next frame\n // re-parses and upgrades it.\n const headerRow = TABLE_ROW.exec(line);\n if (headerRow !== null && isTableSeparator(lines[index + 1] ?? '')) {\n const header = splitTableCells(headerRow[1] ?? '').map((cell) => parseAnswerInline(cell));\n const rows: (readonly AnswerInline[])[][] = [];\n index += 2;\n while (index < lines.length) {\n const row = TABLE_ROW.exec(lines[index] ?? '');\n if (row === null) {\n break;\n }\n const cells = splitTableCells(row[1] ?? '')\n .slice(0, header.length)\n .map((cell) => parseAnswerInline(cell));\n while (cells.length < header.length) {\n cells.push([]);\n }\n rows.push(cells);\n index += 1;\n }\n blocks.push({ kind: 'table', header, rows });\n continue;\n }\n\n const first = readItem(line);\n if (first !== null) {\n const texts: string[] = [first.text];\n index += 1;\n while (index < lines.length) {\n const next = lines[index] ?? '';\n const item = readItem(next);\n if (item !== null) {\n texts.push(item.text);\n index += 1;\n continue;\n }\n if (startsBlock(next)) {\n break;\n }\n // A wrapped item continues on the following line.\n texts[texts.length - 1] = `${texts.at(-1) ?? ''} ${next.trim()}`;\n index += 1;\n }\n blocks.push({\n kind: 'list',\n ordered: first.ordered,\n items: texts.map((text) => parseAnswerInline(text)),\n });\n continue;\n }\n\n const paragraph: string[] = [line.trim()];\n index += 1;\n while (index < lines.length && !startsBlock(lines[index] ?? '')) {\n paragraph.push((lines[index] ?? '').trim());\n index += 1;\n }\n blocks.push({ kind: 'paragraph', children: parseAnswerInline(paragraph.join(' ')) });\n }\n\n return blocks;\n}\n","/**\n * The browser side of the Ask AI stream.\n *\n * The route answers with `text/event-stream`, and `fetch` hands the body over\n * in network chunks that respect no frame boundary: one chunk can split a line\n * in half, split a `\\r\\n` pair, or carry six frames at once. This module owns\n * that problem — a splitter that takes chunks and gives back whole frames — and\n * the small step after it: turning a frame into the one of four events the\n * panel understands.\n *\n * It mirrors the server reader in `core/ai/providers/sse.ts` on purpose. The\n * duplication is deliberate: the core layer must stay importable from a server\n * with no DOM, and the UI layer must not reach into the core's internals (the\n * architecture rule), so each side owns its own reader. Both follow the same\n * SSE line rules.\n *\n * Everything here is pure, so it is unit-tested without a browser.\n *\n * @packageDocumentation\n */\n\n/** One dispatched SSE frame. `event` is `undefined` when the frame omitted it. */\nexport interface AnswerFrame {\n readonly event: string | undefined;\n /** The joined `data:` lines, with no trailing newline. */\n readonly data: string;\n}\n\n/** A citation the route sends before the answer streams. */\nexport interface AnswerSource {\n readonly url: string;\n readonly title: string;\n}\n\n/**\n * What one frame means to the panel. `null` frames — keep-alive comments,\n * unknown event names, malformed payloads — are skipped rather than treated as\n * failures, so a future server event cannot break an old panel.\n */\nexport type AnswerEvent =\n | { readonly kind: 'sources'; readonly sources: readonly AnswerSource[] }\n | { readonly kind: 'text'; readonly text: string }\n | { readonly kind: 'done' }\n | { readonly kind: 'error'; readonly message: string };\n\n/** Accumulates chunks and gives back whole frames. */\nexport interface AnswerFrameSplitter {\n /** Add a decoded chunk. Returns the frames it completed, in order. */\n push(chunk: string): readonly AnswerFrame[];\n /** Flush at end of body: dispatches a frame whose final blank line was lost. */\n flush(): readonly AnswerFrame[];\n}\n\n/** Split off the first complete line, or `null` when none is complete yet. */\nfunction takeLine(buffer: string): { readonly line: string; readonly rest: string } | null {\n const match = /\\r\\n|\\n|\\r/.exec(buffer);\n if (match === null) {\n return null;\n }\n // A trailing lone `\\r` may be the first half of a `\\r\\n` still in flight.\n if (match[0] === '\\r' && match.index + 1 === buffer.length) {\n return null;\n }\n return {\n line: buffer.slice(0, match.index),\n rest: buffer.slice(match.index + match[0].length),\n };\n}\n\n/**\n * Create a frame splitter.\n *\n * It follows the SSE line rules: `\\r\\n`, `\\n`, or a lone `\\r` ends a line, a\n * blank line dispatches the frame, a leading `:` is a comment, one space after\n * the field colon is dropped, and repeated `data:` lines join with `\\n`.\n *\n * @returns a splitter, which owns the buffer between chunks\n */\nexport function createAnswerFrameSplitter(): AnswerFrameSplitter {\n let buffer = '';\n let event: string | undefined;\n let data: string[] = [];\n\n function addLine(line: string): void {\n if (line.startsWith(':')) {\n return; // Comment / keep-alive.\n }\n const colon = line.indexOf(':');\n const field = colon === -1 ? line : line.slice(0, colon);\n const raw = colon === -1 ? '' : line.slice(colon + 1);\n const value = raw.startsWith(' ') ? raw.slice(1) : raw;\n\n if (field === 'event') {\n event = value;\n } else if (field === 'data') {\n data.push(value);\n }\n // `id` and `retry` carry no meaning for a one-shot answer stream.\n }\n\n function take(): AnswerFrame | null {\n if (event === undefined && data.length === 0) {\n return null;\n }\n const frame: AnswerFrame = { event, data: data.join('\\n') };\n event = undefined;\n data = [];\n return frame;\n }\n\n return {\n push(chunk: string): readonly AnswerFrame[] {\n buffer += chunk;\n const frames: AnswerFrame[] = [];\n for (;;) {\n const taken = takeLine(buffer);\n if (taken === null) {\n break;\n }\n buffer = taken.rest;\n if (taken.line === '') {\n const frame = take();\n if (frame !== null) {\n frames.push(frame);\n }\n } else {\n addLine(taken.line);\n }\n }\n return frames;\n },\n\n flush(): readonly AnswerFrame[] {\n if (buffer !== '') {\n addLine(buffer);\n buffer = '';\n }\n const frame = take();\n return frame === null ? [] : [frame];\n },\n };\n}\n\n/** Parse a frame's payload, or `undefined` when it is not JSON. */\nfunction parsePayload(data: string): unknown {\n if (data === '') {\n return undefined;\n }\n try {\n return JSON.parse(data) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/** Read the `sources` payload, keeping only well-formed entries. */\nfunction readSources(payload: unknown): readonly AnswerSource[] {\n if (!Array.isArray(payload)) {\n return [];\n }\n const sources: AnswerSource[] = [];\n for (const entry of payload as readonly unknown[]) {\n if (typeof entry !== 'object' || entry === null) {\n continue;\n }\n const record = entry as Record<string, unknown>;\n const url: unknown = record['url'];\n const title: unknown = record['title'];\n if (typeof url === 'string' && url !== '' && typeof title === 'string' && title !== '') {\n sources.push({ url, title });\n }\n }\n return sources;\n}\n\n/** Read a string field from a frame payload. */\nfunction readString(payload: unknown, field: string): string | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n const value: unknown = (payload as Record<string, unknown>)[field];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Turn one frame into a panel event.\n *\n * @param frame - a frame from {@link createAnswerFrameSplitter}\n * @returns the event, or `null` when the frame carries nothing to render\n */\nexport function readAnswerEvent(frame: AnswerFrame): AnswerEvent | null {\n const payload = parsePayload(frame.data);\n\n switch (frame.event) {\n case 'sources':\n return { kind: 'sources', sources: readSources(payload) };\n case 'text': {\n const text = readString(payload, 'text');\n return text === undefined || text === '' ? null : { kind: 'text', text };\n }\n case 'done':\n return { kind: 'done' };\n case 'error':\n return {\n kind: 'error',\n message: readString(payload, 'message') ?? 'The answer stopped unexpectedly.',\n };\n default:\n return null;\n }\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n MAX_MESSAGE_CHARS,\n type AskAiAnswer,\n type AskAiTurn,\n toRequestMessages,\n} from './ask-ai/conversation.js';\nimport { type AnswerBlock, type AnswerInline, parseAnswerMarkdown } from './ask-ai/markdown.js';\nimport { createAnswerFrameSplitter, readAnswerEvent } from './ask-ai/stream.js';\n\n/**\n * The Ask AI panel: a floating trigger and a right-side rail that answers\n * questions about the site's own documentation.\n *\n * It is the browser half of {@link createAskAiRoute}. It streams the route's\n * `sources` / `text` / `done` events, renders the answer through the\n * framework's own tokenizer, and keeps the conversation so a reader can ask a\n * follow-up. Styled by `styles/ask-ai.css`.\n *\n * Two rules shape this module:\n *\n * - **An answer is never markup.** The streamed text is parsed into nodes and\n * rendered as React elements. There is no `dangerouslySetInnerHTML` here, and\n * a link survives only if its target passes the framework's allow-list.\n * - **A question is always cancellable.** Every question owns an\n * `AbortController`. Stop, Escape, a new chat, and closing the panel all abort\n * it, and the route aborts its provider call in turn.\n *\n * @packageDocumentation\n */\n\n/**\n * Props for {@link AskAi}.\n *\n * @public\n */\nexport interface AskAiProps {\n /** The Ask AI route's path. Default `/api/ai`. */\n readonly endpoint?: string;\n /** Starter questions shown in the empty state. Clicking one asks it. */\n readonly suggestions?: readonly string[];\n /** The trigger's label. Default `Ask AI`. */\n readonly label?: string;\n /** The composer's placeholder. Default `Ask a question…`. */\n readonly placeholder?: string;\n /**\n * Where the trigger lives: the floating pill (default), or an inline button\n * for the site's top bar. The panel behaves identically.\n */\n readonly trigger?: 'pill' | 'nav';\n}\n\n/** Generic starters: the framework knows nothing about any site's subject. */\nconst DEFAULT_SUGGESTIONS: readonly string[] = [\n 'What is this documentation about?',\n 'How do I get started?',\n 'Show me an example request.',\n];\n\n/** The composer stops growing at five lines and scrolls instead. */\nconst MAX_COMPOSER_HEIGHT = 132;\n\n/* --- Icons --------------------------------------------------------------- */\n\nfunction sparkleIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" aria-hidden=\"true\">\n <path\n d=\"M12 3.5l1.6 4.4 4.4 1.6-4.4 1.6L12 15.5l-1.6-4.4L6 9.5l4.4-1.6L12 3.5ZM18.5 15l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8.8-2.2Z\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction closeIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6 6 18\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction newChatIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" aria-hidden=\"true\">\n <path d=\"M20 11.5A8 8 0 1 1 17.6 6M20 4v4h-4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction sendIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden=\"true\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction stopIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"2\" />\n </svg>\n );\n}\n\n/* --- Answer rendering ---------------------------------------------------- */\n\nfunction InlineRuns({ nodes }: { readonly nodes: readonly AnswerInline[] }) {\n return (\n <>\n {nodes.map((node, index) => {\n const key = `${String(index)}-${node.kind}`;\n if (node.kind === 'code') {\n return (\n <code key={key} className=\"askai-inline-code\">\n {node.text}\n </code>\n );\n }\n if (node.kind === 'strong') {\n return (\n <strong key={key} className=\"askai-strong\">\n <InlineRuns nodes={node.children} />\n </strong>\n );\n }\n if (node.kind === 'link') {\n // Only allow-listed targets reach here; an external one opens away\n // from the docs, so it never carries the referrer.\n return node.external ? (\n <a key={key} className=\"askai-link\" href={node.href} target=\"_blank\" rel=\"noreferrer\">\n {node.text}\n </a>\n ) : (\n <a key={key} className=\"askai-link\" href={node.href}>\n {node.text}\n </a>\n );\n }\n return <span key={key}>{node.text}</span>;\n })}\n </>\n );\n}\n\n/** The blinking end-of-answer caret, shown while text is still arriving. */\nfunction caret(): ReactNode {\n return <span className=\"askai-caret\" aria-hidden=\"true\" />;\n}\n\nfunction AnswerBlockView({\n block,\n withCaret,\n}: {\n readonly block: AnswerBlock;\n readonly withCaret: boolean;\n}) {\n if (block.kind === 'code') {\n return (\n <pre className=\"askai-codeblock\" data-language={block.language}>\n <code>{block.text}</code>\n </pre>\n );\n }\n if (block.kind === 'heading') {\n return (\n <p className=\"askai-answer-heading\">\n <InlineRuns nodes={block.children} />\n {withCaret ? caret() : null}\n </p>\n );\n }\n if (block.kind === 'table') {\n return (\n <div className=\"askai-table-wrap\">\n <table className=\"askai-table\">\n <thead>\n <tr>\n {block.header.map((cell, index) => (\n <th key={String(index)}>\n <InlineRuns nodes={cell} />\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {block.rows.map((row, rowIndex) => (\n <tr key={String(rowIndex)}>\n {row.map((cell, cellIndex) => (\n <td key={String(cellIndex)}>\n <InlineRuns nodes={cell} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {withCaret ? caret() : null}\n </div>\n );\n }\n if (block.kind === 'list') {\n const items = block.items.map((item, index) => (\n <li key={String(index)}>\n <InlineRuns nodes={item} />\n {withCaret && index === block.items.length - 1 ? caret() : null}\n </li>\n ));\n return block.ordered ? (\n <ol className=\"askai-list\">{items}</ol>\n ) : (\n <ul className=\"askai-list\">{items}</ul>\n );\n }\n return (\n <p className=\"askai-paragraph\">\n <InlineRuns nodes={block.children} />\n {withCaret ? caret() : null}\n </p>\n );\n}\n\n/** The answer body: the tokenized text, plus the caret while it streams. */\nfunction AnswerBody({ text, streaming }: { readonly text: string; readonly streaming: boolean }) {\n const blocks = parseAnswerMarkdown(text);\n if (blocks.length === 0) {\n return streaming ? <p className=\"askai-paragraph\">{caret()}</p> : null;\n }\n const last = blocks.length - 1;\n const tailTakesCaret = streaming && blocks[last]?.kind !== 'code';\n return (\n <>\n {blocks.map((block, index) => (\n <AnswerBlockView\n key={`${String(index)}-${block.kind}`}\n block={block}\n withCaret={tailTakesCaret && index === last}\n />\n ))}\n {streaming && !tailTakesCaret ? <p className=\"askai-paragraph\">{caret()}</p> : null}\n </>\n );\n}\n\n/* --- Route errors -------------------------------------------------------- */\n\n/**\n * Read a pre-stream failure. The route answers `400`, `429`, and `500` as JSON\n * with one readable `error` line — the exact violation, the seconds to wait, or\n * the environment variable to set — so it is shown verbatim.\n */\nasync function readRouteError(response: Response): Promise<string> {\n try {\n const payload: unknown = await response.json();\n if (typeof payload === 'object' && payload !== null) {\n const message: unknown = (payload as Record<string, unknown>)['error'];\n if (typeof message === 'string' && message.trim() !== '') {\n return message;\n }\n }\n } catch {\n // Not JSON — fall through to the status line.\n }\n return `Ask AI could not answer this question (HTTP ${String(response.status)}).`;\n}\n\n/* --- The panel ----------------------------------------------------------- */\n\n/**\n * The Ask AI trigger and panel. Mount it once, beside the layout's children.\n *\n * @example\n * ```tsx\n * // app/docs/layout.tsx\n * import { AskAi } from '@blaaiz/docs-core/ui/ask-ai';\n *\n * <DocsLayout …>\n * {children}\n * <AskAi />\n * </DocsLayout>\n * ```\n *\n * @param props - the endpoint, the starter questions, and the labels\n * @public\n */\nexport function AskAi({\n endpoint = '/api/ai',\n suggestions = DEFAULT_SUGGESTIONS,\n label = 'Ask AI',\n placeholder = 'Ask a question…',\n trigger: triggerVariant = 'pill',\n}: AskAiProps) {\n const [mounted, setMounted] = useState(false);\n const [open, setOpen] = useState(false);\n const [thread, setThread] = useState<readonly AskAiTurn[]>([]);\n const [draft, setDraft] = useState('');\n const [busy, setBusy] = useState(false);\n const [shortcutHint, setShortcutHint] = useState('⌘I');\n\n const abortRef = useRef<AbortController | null>(null);\n const threadRef = useRef<readonly AskAiTurn[]>([]);\n const openRef = useRef(false);\n const scrollRef = useRef<HTMLDivElement>(null);\n const composerRef = useRef<HTMLTextAreaElement>(null);\n const askCount = useRef(0);\n\n useEffect(() => {\n setMounted(true);\n // The panel renders only after mount, so reading the platform here cannot\n // cause a hydration mismatch.\n const mac = /mac|iphone|ipad/i.test(navigator.userAgent);\n setShortcutHint(mac ? '⌘I' : 'Ctrl I');\n }, []);\n\n useEffect(() => {\n threadRef.current = thread;\n }, [thread]);\n\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n /** Abort the question in flight, if there is one. */\n const stop = useCallback(() => {\n abortRef.current?.abort();\n }, []);\n\n const close = useCallback(() => {\n abortRef.current?.abort();\n setOpen(false);\n }, []);\n\n /** Ask a question, replacing the thread with `history` plus this exchange. */\n const ask = useCallback(\n (question: string, history: readonly AskAiTurn[]) => {\n const text = question.trim().slice(0, MAX_MESSAGE_CHARS);\n if (text === '' || abortRef.current !== null) {\n return;\n }\n\n askCount.current += 1;\n const turn = String(askCount.current);\n const userTurn: AskAiTurn = { id: `q${turn}`, role: 'user', text };\n const answerId = `a${turn}`;\n const answer: AskAiAnswer = {\n id: answerId,\n role: 'assistant',\n text: '',\n sources: [],\n state: 'streaming',\n error: undefined,\n };\n\n const messages = toRequestMessages([...history, userTurn]);\n const next: readonly AskAiTurn[] = [...history, userTurn, answer];\n threadRef.current = next;\n setThread(next);\n setBusy(true);\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n const update = (change: (previous: AskAiAnswer) => AskAiAnswer): void => {\n setThread((current) =>\n current.map((entry) =>\n entry.id === answerId && entry.role === 'assistant' ? change(entry) : entry,\n ),\n );\n };\n\n const run = async (): Promise<void> => {\n let answered = '';\n let terminal = false;\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ messages }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const message = await readRouteError(response);\n update((previous) => ({ ...previous, state: 'error', error: message }));\n return;\n }\n if (response.body === null) {\n update((previous) => ({\n ...previous,\n state: 'error',\n error: 'Ask AI sent an empty answer.',\n }));\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const splitter = createAnswerFrameSplitter();\n\n for (;;) {\n const result = await reader.read();\n const frames = result.done\n ? splitter.flush()\n : splitter.push(decoder.decode(result.value, { stream: true }));\n\n for (const frame of frames) {\n const event = readAnswerEvent(frame);\n if (event === null) {\n continue;\n }\n if (event.kind === 'text') {\n answered += event.text;\n const snapshot = answered;\n update((previous) => ({ ...previous, text: snapshot }));\n continue;\n }\n if (event.kind === 'sources') {\n const { sources } = event;\n update((previous) => ({ ...previous, sources }));\n continue;\n }\n if (event.kind === 'error') {\n const { message } = event;\n update((previous) => ({ ...previous, state: 'error', error: message }));\n } else {\n update((previous) => ({ ...previous, state: 'done' }));\n }\n terminal = true;\n }\n\n if (terminal || result.done) {\n break;\n }\n }\n\n if (!terminal) {\n // The body ended without `done` or `error` — a dropped connection.\n update((previous) =>\n previous.text === ''\n ? { ...previous, state: 'error', error: 'The answer stopped before it started.' }\n : { ...previous, state: 'done' },\n );\n }\n } catch {\n if (controller.signal.aborted) {\n // Stopped on purpose: keep whatever arrived.\n update((previous) =>\n previous.text === ''\n ? { ...previous, state: 'error', error: 'The question was stopped.' }\n : { ...previous, state: 'done' },\n );\n } else {\n update((previous) => ({\n ...previous,\n state: 'error',\n error: 'Ask AI could not be reached. Check your connection, then try again.',\n }));\n }\n } finally {\n if (abortRef.current === controller) {\n abortRef.current = null;\n setBusy(false);\n }\n }\n };\n\n void run();\n },\n [endpoint],\n );\n\n /** Re-send the question whose answer failed, from the same history. */\n const retry = useCallback(\n (answerId: string) => {\n const current = threadRef.current;\n const index = current.findIndex((entry) => entry.id === answerId);\n const question = index > 0 ? current[index - 1] : undefined;\n if (question?.role !== 'user') {\n return;\n }\n ask(question.text, current.slice(0, index - 1));\n },\n [ask],\n );\n\n const newChat = useCallback(() => {\n abortRef.current?.abort();\n threadRef.current = [];\n setThread([]);\n setDraft('');\n }, []);\n\n const submit = useCallback(() => {\n const text = draft.trim();\n if (text === '' || abortRef.current !== null) {\n return;\n }\n setDraft('');\n ask(text, threadRef.current);\n }, [ask, draft]);\n\n // ⌘I / Ctrl+I toggles the panel from anywhere on the page.\n useEffect(() => {\n const onKey = (event: globalThis.KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey) || event.altKey || event.key.toLowerCase() !== 'i') {\n return;\n }\n event.preventDefault();\n if (openRef.current) {\n close();\n } else {\n setOpen(true);\n }\n };\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('keydown', onKey);\n };\n }, [close]);\n\n // While open: Escape stops a stream, then closes; the page behind is locked.\n useEffect(() => {\n if (!open) {\n return;\n }\n const onKey = (event: globalThis.KeyboardEvent) => {\n if (event.key !== 'Escape') {\n return;\n }\n event.stopPropagation();\n if (abortRef.current !== null) {\n stop();\n return;\n }\n setOpen(false);\n };\n document.addEventListener('keydown', onKey, true);\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', onKey, true);\n document.body.style.overflow = '';\n };\n }, [open, stop]);\n\n useEffect(() => {\n if (open) {\n composerRef.current?.focus();\n }\n }, [open]);\n\n // Follow the answer as it grows.\n useEffect(() => {\n const el = scrollRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, [thread]);\n\n // Grow the composer with its content, up to five lines.\n useEffect(() => {\n const el = composerRef.current;\n if (!el) {\n return;\n }\n el.style.height = 'auto';\n el.style.height = `${String(Math.min(el.scrollHeight, MAX_COMPOSER_HEIGHT))}px`;\n }, [draft, open]);\n\n const onComposerKeyDown = (event: ReactKeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n };\n\n const navTrigger =\n triggerVariant === 'nav' ? (\n <button\n type=\"button\"\n className=\"askai-nav-trigger\"\n aria-label={`${label} (${shortcutHint})`}\n onClick={() => {\n setOpen(true);\n }}\n >\n <span className=\"askai-trigger-icon\">{sparkleIcon()}</span>\n <span className=\"askai-trigger-label\">{label}</span>\n <kbd className=\"askai-kbd\">{shortcutHint}</kbd>\n </button>\n ) : null;\n\n if (!mounted) {\n return navTrigger;\n }\n\n const trigger = (\n <button\n type=\"button\"\n className=\"askai-trigger\"\n aria-label={`${label} (${shortcutHint})`}\n onClick={() => {\n setOpen(true);\n }}\n >\n <span className=\"askai-trigger-icon\">{sparkleIcon()}</span>\n <span className=\"askai-trigger-label\">{label}</span>\n <kbd className=\"askai-kbd\">{shortcutHint}</kbd>\n </button>\n );\n\n const panel = (\n <aside className=\"askai-panel\" role=\"dialog\" aria-modal=\"false\" aria-label={label}>\n <header className=\"askai-head\">\n <span className=\"askai-head-icon\">{sparkleIcon()}</span>\n <h2 className=\"askai-head-title\">{label}</h2>\n <span className=\"askai-head-hint\">Esc</span>\n <button\n type=\"button\"\n className=\"askai-head-btn\"\n aria-label=\"New chat\"\n title=\"New chat\"\n disabled={thread.length === 0}\n onClick={newChat}\n >\n {newChatIcon()}\n </button>\n <button type=\"button\" className=\"askai-head-btn\" aria-label=\"Close\" onClick={close}>\n {closeIcon()}\n </button>\n </header>\n\n <div className=\"askai-thread\" ref={scrollRef}>\n {thread.length === 0 ? (\n <div className=\"askai-empty\">\n <p className=\"askai-empty-line\">\n Ask a question about this documentation. Answers cite the pages they come from.\n </p>\n <div className=\"askai-chips\">\n {suggestions.map((suggestion) => (\n <button\n type=\"button\"\n key={suggestion}\n className=\"askai-chip\"\n onClick={() => {\n ask(suggestion, threadRef.current);\n }}\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n ) : (\n thread.map((entry) =>\n entry.role === 'user' ? (\n <div className=\"askai-question\" key={entry.id}>\n <div className=\"askai-bubble\">{entry.text}</div>\n </div>\n ) : (\n <div className=\"askai-answer\" key={entry.id} data-state={entry.state}>\n <AnswerBody text={entry.text} streaming={entry.state === 'streaming'} />\n {entry.sources.length > 0 && entry.state !== 'error' ? (\n <div className=\"askai-sources\">\n <span className=\"askai-sources-label\">Sources</span>\n <div className=\"askai-sources-chips\">\n {entry.sources.map((source) => (\n <a className=\"askai-source\" key={source.url} href={source.url}>\n {source.title}\n </a>\n ))}\n </div>\n </div>\n ) : null}\n {entry.error === undefined ? null : (\n <div className=\"askai-error\" role=\"alert\">\n <span className=\"askai-error-text\">{entry.error}</span>\n <button\n type=\"button\"\n className=\"askai-retry\"\n disabled={busy}\n onClick={() => {\n retry(entry.id);\n }}\n >\n Try again\n </button>\n </div>\n )}\n </div>\n ),\n )\n )}\n </div>\n\n <div className=\"askai-composer\">\n <textarea\n ref={composerRef}\n className=\"askai-input\"\n rows={1}\n value={draft}\n placeholder={placeholder}\n aria-label={placeholder}\n maxLength={MAX_MESSAGE_CHARS}\n disabled={busy}\n onChange={(event) => {\n setDraft(event.target.value);\n }}\n onKeyDown={onComposerKeyDown}\n />\n {busy ? (\n <button type=\"button\" className=\"askai-send\" aria-label=\"Stop\" onClick={stop}>\n {stopIcon()}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"askai-send\"\n aria-label=\"Send\"\n disabled={draft.trim() === ''}\n onClick={submit}\n >\n {sendIcon()}\n </button>\n )}\n </div>\n </aside>\n );\n\n return (\n <>\n {navTrigger}\n {createPortal(\n <div className=\"askai-root\" data-open={open ? '' : undefined}>\n {open ? panel : triggerVariant === 'nav' ? null : trigger}\n </div>,\n document.body,\n )}\n </>\n );\n}\n"]}
@@ -82,6 +82,21 @@ var GLYPHS = {
82
82
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2" }),
83
83
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })
84
84
  ] }),
85
+ users: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
86
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "9", cy: "7", r: "4" }),
87
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2 21a7 7 0 0 1 14 0" }),
88
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 3.5a4 4 0 0 1 0 7" }),
89
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17.5 14.5a7 7 0 0 1 4.5 6.5" })
90
+ ] }),
91
+ building: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
92
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "4", y: "2", width: "16", height: "20", rx: "2" }),
93
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 22v-4h6v4" }),
94
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 6h.01M12 6h.01M16 6h.01M8 10h.01M12 10h.01M16 10h.01M8 14h.01M12 14h.01M16 14h.01" })
95
+ ] }),
96
+ clock: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
97
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "9" }),
98
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 7v5l3 2" })
99
+ ] }),
85
100
  /** A circled `i` — an informational note, and the generic error state. */
86
101
  info: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
87
102
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/clipboard.ts","../../src/ui/icons.tsx","../../src/ui/copy-page.tsx"],"names":["jsxs","Fragment","jsx","useState","useRef","useEffect"],"mappings":"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","file":"copy-page.cjs","sourcesContent":["/**\n * Clipboard copying for the framework's client components — internal.\n *\n * The Clipboard API is the right way to copy, and it is not always available:\n * an insecure origin, an embedded frame with no permission, or an older browser\n * leaves `navigator.clipboard` missing or its promise rejected. Every copy\n * control in the framework therefore needs the same two-step attempt, so the\n * attempt lives here once instead of in each control.\n *\n * @packageDocumentation\n */\n\n/**\n * Copy through a hidden textarea and `document.execCommand`. The fallback, for\n * the contexts the Clipboard API refuses.\n */\nfunction legacyCopy(text: string): boolean {\n try {\n const area = document.createElement('textarea');\n area.value = text;\n area.style.position = 'fixed';\n area.style.opacity = '0';\n document.body.appendChild(area);\n area.select();\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- clipboard fallback\n const ok = document.execCommand('copy');\n document.body.removeChild(area);\n return ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Copy text to the clipboard.\n *\n * Tries the Clipboard API, then the hidden-textarea fallback. It never throws:\n * a caller flashes \"Copied\" on `true` and leaves its label alone on `false`.\n *\n * @param text - the text to copy\n * @returns whether the text reached the clipboard\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n // TypeScript types `navigator.clipboard` as always present; a browser on an\n // insecure origin disagrees, so treat it as optional.\n const clip = navigator.clipboard as Clipboard | undefined;\n if (typeof clip?.writeText === 'function') {\n try {\n await clip.writeText(text);\n return true;\n } catch {\n // Denied or unavailable; fall through to the legacy path.\n }\n }\n return legacyCopy(text);\n}\n","import type { ReactNode } from 'react';\n\n/**\n * The framework's inline-SVG glyph set — internal.\n *\n * Five UI modules drew their own icons, and four glyphs were drawn twice: the\n * house on the error screen and in the sidebar icon map, the padlock on the\n * sign-in and the `403` screen, the info circle on both of those, the key in\n * both places again, and the check mark in the copy-page button and the\n * playground. One drawing per glyph now lives here.\n *\n * Nothing is exported from the package: the modules below compose these paths,\n * and `docsIcon` remains the only public icon surface. Zero dependencies — the\n * paths are Lucide-shaped, on the same 24×24 grid, so any glyph works at any\n * size.\n *\n * @packageDocumentation\n */\n\n/**\n * The glyph paths, keyed by name. Each value is the *inside* of an `<svg>`, so\n * a caller decides the size, the stroke, and the class.\n */\nconst GLYPHS = {\n house: (\n <>\n <path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n <path d=\"M9 22V12h6v10\" />\n </>\n ),\n book: <path d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20\" />,\n code: (\n <>\n <path d=\"m16 18 6-6-6-6\" />\n <path d=\"m8 6-6 6 6 6\" />\n </>\n ),\n rocket: (\n <>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91 0z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </>\n ),\n terminal: (\n <>\n <path d=\"m4 17 6-6-6-6\" />\n <path d=\"M12 19h8\" />\n </>\n ),\n wallet: (\n <>\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </>\n ),\n key: (\n <>\n <path d=\"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\" />\n <path d=\"m21 2-9.6 9.6\" />\n <circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\" />\n </>\n ),\n webhook: (\n <>\n <path d=\"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2\" />\n <path d=\"m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06\" />\n <path d=\"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\" />\n </>\n ),\n globe: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </>\n ),\n mail: (\n <>\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </>\n ),\n user: (\n <>\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M4 21a8 8 0 0 1 16 0\" />\n </>\n ),\n lock: (\n <>\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </>\n ),\n /** A circled `i` — an informational note, and the generic error state. */\n info: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16h.01\" strokeLinecap=\"round\" />\n </>\n ),\n /** A warning triangle — a caution, and the `500` screen. */\n alert: (\n <>\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <path d=\"M12 9v4M12 17h.01\" strokeLinecap=\"round\" />\n </>\n ),\n /** A light bulb — a tip. */\n bulb: (\n <path d=\"M9 18h6M10 22h4M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V17h6v-.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2Z\" />\n ),\n /** A circle with a cross — the `404` screen. */\n crossCircle: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m14.31 8-1.31 2.4M9.69 8l4.62 8M14.31 16 9.69 8\" strokeLinecap=\"round\" />\n </>\n ),\n /** Struck-through signal bars — the offline screen. */\n offline: (\n <>\n <path d=\"M5 12.55a11 11 0 0 1 14 0M8.5 16.11a6 6 0 0 1 7 0M12 20h.01\" strokeLinecap=\"round\" />\n <path d=\"m2 2 20 20\" strokeLinecap=\"round\" />\n </>\n ),\n copy: (\n <path d=\"M9 9h9a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2ZM5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n ),\n check: <path d=\"M20 6 9 17l-5-5\" />,\n chevronDown: <path d=\"m6 9 6 6 6-6\" />,\n /** Stacked chevrons — a value this control switches between. */\n chevronUpDown: <path d=\"m7 15 5 5 5-5M7 9l5-5 5 5\" />,\n /** An open arc — one turn of a loading spinner. */\n spinner: <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" strokeLinecap=\"round\" />,\n markdown: (\n <>\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M6 15V9l3 3 3-3v6M17 9v4m0 0 2-2m-2 2-2-2\" />\n </>\n ),\n} satisfies Record<string, ReactNode>;\n\n/** A glyph in {@link GLYPHS}. */\nexport type GlyphName = keyof typeof GLYPHS;\n\n/**\n * How one icon is drawn. Every field is optional, and the defaults match the\n * house style: 24×24 grid, current colour, hidden from assistive technology.\n */\nexport interface IconOptions {\n /**\n * React key for the `<svg>`. Set it when a host may place the icon in an\n * array of children — fumadocs renders a sidebar link as `[icon, text]`, and\n * an unkeyed element there raises React's \"unique key\" warning in the\n * consuming site's console.\n */\n readonly key?: string;\n /** Pixel size for `width` and `height`. Omit to let CSS size the icon. */\n readonly size?: number;\n /** Stroke width. Default 2. */\n readonly strokeWidth?: number;\n /** Round the stroke's ends and joins. Default `false`. */\n readonly rounded?: boolean;\n /** Class for the `<svg>`, e.g. a spin animation. */\n readonly className?: string;\n}\n\n/**\n * Draw a stroked glyph.\n *\n * @param name - the glyph\n * @param options - size, stroke, and class\n * @returns the `<svg>` element\n */\nexport function strokeIcon(name: GlyphName, options: IconOptions = {}): ReactNode {\n return (\n <svg\n key={options.key}\n {...(options.className === undefined ? {} : { className: options.className })}\n {...(options.size === undefined ? {} : { width: options.size, height: options.size })}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={options.strokeWidth ?? 2}\n {...(options.rounded ? { strokeLinecap: 'round', strokeLinejoin: 'round' } : {})}\n aria-hidden=\"true\"\n >\n {GLYPHS[name]}\n </svg>\n );\n}\n\n/**\n * Draw a filled glyph. Used by the solid play triangle, where a stroke would\n * read as an outline.\n *\n * @param path - the path data\n * @param options - size and class\n * @returns the `<svg>` element\n */\nexport function filledIcon(path: string, options: IconOptions = {}): ReactNode {\n return (\n <svg\n key={options.key}\n {...(options.className === undefined ? {} : { className: options.className })}\n {...(options.size === undefined ? {} : { width: options.size, height: options.size })}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d={path} />\n </svg>\n );\n}\n\n/** A solid right-pointing triangle: run this request. */\nexport const PLAY_PATH = 'M8 5v14l11-7z';\n","'use client';\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\n\nimport { copyToClipboard } from './clipboard.js';\nimport { strokeIcon } from './icons.js';\n\n/**\n * The \"Copy page\" control — a split button with a dropdown, matching Mintlify's\n * LLM-friendly page action. The primary button copies the page's Markdown to\n * the clipboard; the dropdown adds a \"View as Markdown\" link.\n *\n * Self-contained: it styles itself with inline styles keyed to the framework's\n * `--color-fd-*` theme variables, so it inherits the site's palette with no\n * extra stylesheet. This is the framework's one client component.\n *\n * @packageDocumentation\n */\n\n/**\n * Props for {@link CopyPageButton}.\n *\n * @public\n */\nexport interface CopyPageButtonProps {\n /** The page rendered as Markdown, copied to the clipboard on click. */\n readonly markdown: string;\n /** URL that serves the same page as plain Markdown (opened in a new tab). */\n readonly viewUrl: string;\n}\n\n/** The four glyphs this control draws, from the framework's shared set. */\ntype IconName = 'copy' | 'check' | 'chevronDown' | 'markdown';\n\nfunction Icon({ name, size = 15 }: { name: IconName; size?: number }) {\n // The check mark is drawn heavier so it reads at 15px.\n return strokeIcon(name, { size, strokeWidth: name === 'check' ? 2.5 : 1.9, rounded: true });\n}\n\nconst styles = {\n root: { position: 'relative', flexShrink: 0, fontSize: 13, lineHeight: 1.2 } as CSSProperties,\n split: {\n display: 'inline-flex',\n alignItems: 'stretch',\n border: '1px solid var(--color-fd-border)',\n borderRadius: 8,\n background: 'var(--color-fd-card)',\n overflow: 'hidden',\n } as CSSProperties,\n main: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 8,\n padding: '9px 15px',\n background: 'transparent',\n color: 'var(--color-fd-foreground)',\n font: 'inherit',\n fontWeight: 500,\n cursor: 'pointer',\n border: 'none',\n } as CSSProperties,\n caret: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '9px 11px',\n background: 'transparent',\n color: 'var(--color-fd-muted-foreground)',\n borderLeft: '1px solid var(--color-fd-border)',\n cursor: 'pointer',\n } as CSSProperties,\n menu: {\n position: 'absolute',\n top: 'calc(100% + 6px)',\n right: 0,\n zIndex: 40,\n width: 268,\n padding: 6,\n border: '1px solid var(--color-fd-border)',\n borderRadius: 12,\n background: 'var(--color-fd-popover, var(--color-fd-card))',\n boxShadow: '0 4px 6px -2px rgba(0,0,0,0.05), 0 12px 28px -6px rgba(0,0,0,0.18)',\n } as CSSProperties,\n item: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 10,\n width: '100%',\n padding: '9px 10px',\n borderRadius: 8,\n background: 'transparent',\n border: 'none',\n textAlign: 'left',\n textDecoration: 'none',\n color: 'var(--color-fd-foreground)',\n font: 'inherit',\n cursor: 'pointer',\n } as CSSProperties,\n muted: { color: 'var(--color-fd-muted-foreground)' } as CSSProperties,\n itemText: { display: 'flex', flexDirection: 'column', gap: 2, minWidth: 0 } as CSSProperties,\n itemSub: { fontSize: 12, color: 'var(--color-fd-muted-foreground)' } as CSSProperties,\n};\n\nconst HOVER_BG = 'color-mix(in oklab, var(--color-fd-primary) 9%, transparent)';\n\nfunction hoverProps(base: CSSProperties) {\n return {\n onMouseEnter: (event: { currentTarget: HTMLElement }) => {\n event.currentTarget.style.background = HOVER_BG;\n },\n onMouseLeave: (event: { currentTarget: HTMLElement }) => {\n event.currentTarget.style.background = (base.background as string) ?? 'transparent';\n },\n };\n}\n\n/**\n * The split \"Copy page\" button. Renders nothing structural of its own beyond a\n * relatively-positioned wrapper, so a site drops it beside the page title.\n *\n * @public\n */\nexport function CopyPageButton({ markdown, viewUrl }: CopyPageButtonProps) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const onPointerDown = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onPointerDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n };\n }, [open]);\n\n const copy = async () => {\n // A refused clipboard leaves the label unchanged: no error, no false claim.\n if (await copyToClipboard(markdown)) {\n setCopied(true);\n setTimeout(() => {\n setCopied(false);\n }, 1600);\n }\n setOpen(false);\n };\n\n return (\n <div ref={ref} style={styles.root}>\n <div style={styles.split}>\n <button\n type=\"button\"\n style={styles.main}\n onClick={() => void copy()}\n {...hoverProps(styles.main)}\n >\n <span style={styles.muted}>\n <Icon name={copied ? 'check' : 'copy'} />\n </span>\n {copied ? 'Copied' : 'Copy page'}\n </button>\n <button\n type=\"button\"\n style={styles.caret}\n aria-label=\"More options\"\n aria-expanded={open}\n onClick={() => {\n setOpen((value) => !value);\n }}\n {...hoverProps(styles.caret)}\n >\n <Icon name=\"chevronDown\" size={14} />\n </button>\n </div>\n {open ? (\n <div style={styles.menu} role=\"menu\">\n <button\n type=\"button\"\n style={styles.item}\n onClick={() => void copy()}\n {...hoverProps(styles.item)}\n >\n <span style={{ ...styles.muted, marginTop: 1 }}>\n <Icon name=\"copy\" size={16} />\n </span>\n <span style={styles.itemText}>\n <b style={{ fontWeight: 600 }}>Copy page</b>\n <small style={styles.itemSub}>Copy page as Markdown for LLMs</small>\n </span>\n </button>\n <a\n style={styles.item}\n href={viewUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={() => {\n setOpen(false);\n }}\n {...hoverProps(styles.item)}\n >\n <span style={{ ...styles.muted, marginTop: 1 }}>\n <Icon name=\"markdown\" size={16} />\n </span>\n <span style={styles.itemText}>\n <b style={{ fontWeight: 600 }}>View as Markdown ↗</b>\n <small style={styles.itemSub}>View this page as plain text</small>\n </span>\n </a>\n </div>\n ) : null}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/ui/clipboard.ts","../../src/ui/icons.tsx","../../src/ui/copy-page.tsx"],"names":["jsxs","Fragment","jsx","useState","useRef","useEffect"],"mappings":"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","file":"copy-page.cjs","sourcesContent":["/**\n * Clipboard copying for the framework's client components — internal.\n *\n * The Clipboard API is the right way to copy, and it is not always available:\n * an insecure origin, an embedded frame with no permission, or an older browser\n * leaves `navigator.clipboard` missing or its promise rejected. Every copy\n * control in the framework therefore needs the same two-step attempt, so the\n * attempt lives here once instead of in each control.\n *\n * @packageDocumentation\n */\n\n/**\n * Copy through a hidden textarea and `document.execCommand`. The fallback, for\n * the contexts the Clipboard API refuses.\n */\nfunction legacyCopy(text: string): boolean {\n try {\n const area = document.createElement('textarea');\n area.value = text;\n area.style.position = 'fixed';\n area.style.opacity = '0';\n document.body.appendChild(area);\n area.select();\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- clipboard fallback\n const ok = document.execCommand('copy');\n document.body.removeChild(area);\n return ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Copy text to the clipboard.\n *\n * Tries the Clipboard API, then the hidden-textarea fallback. It never throws:\n * a caller flashes \"Copied\" on `true` and leaves its label alone on `false`.\n *\n * @param text - the text to copy\n * @returns whether the text reached the clipboard\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n // TypeScript types `navigator.clipboard` as always present; a browser on an\n // insecure origin disagrees, so treat it as optional.\n const clip = navigator.clipboard as Clipboard | undefined;\n if (typeof clip?.writeText === 'function') {\n try {\n await clip.writeText(text);\n return true;\n } catch {\n // Denied or unavailable; fall through to the legacy path.\n }\n }\n return legacyCopy(text);\n}\n","import type { ReactNode } from 'react';\n\n/**\n * The framework's inline-SVG glyph set — internal.\n *\n * Five UI modules drew their own icons, and four glyphs were drawn twice: the\n * house on the error screen and in the sidebar icon map, the padlock on the\n * sign-in and the `403` screen, the info circle on both of those, the key in\n * both places again, and the check mark in the copy-page button and the\n * playground. One drawing per glyph now lives here.\n *\n * Nothing is exported from the package: the modules below compose these paths,\n * and `docsIcon` remains the only public icon surface. Zero dependencies — the\n * paths are Lucide-shaped, on the same 24×24 grid, so any glyph works at any\n * size.\n *\n * @packageDocumentation\n */\n\n/**\n * The glyph paths, keyed by name. Each value is the *inside* of an `<svg>`, so\n * a caller decides the size, the stroke, and the class.\n */\nconst GLYPHS = {\n house: (\n <>\n <path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n <path d=\"M9 22V12h6v10\" />\n </>\n ),\n book: <path d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20\" />,\n code: (\n <>\n <path d=\"m16 18 6-6-6-6\" />\n <path d=\"m8 6-6 6 6 6\" />\n </>\n ),\n rocket: (\n <>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91 0z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </>\n ),\n terminal: (\n <>\n <path d=\"m4 17 6-6-6-6\" />\n <path d=\"M12 19h8\" />\n </>\n ),\n wallet: (\n <>\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </>\n ),\n key: (\n <>\n <path d=\"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\" />\n <path d=\"m21 2-9.6 9.6\" />\n <circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\" />\n </>\n ),\n webhook: (\n <>\n <path d=\"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2\" />\n <path d=\"m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06\" />\n <path d=\"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\" />\n </>\n ),\n globe: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </>\n ),\n mail: (\n <>\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </>\n ),\n user: (\n <>\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M4 21a8 8 0 0 1 16 0\" />\n </>\n ),\n lock: (\n <>\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </>\n ),\n users: (\n <>\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M2 21a7 7 0 0 1 14 0\" />\n <path d=\"M16 3.5a4 4 0 0 1 0 7\" />\n <path d=\"M17.5 14.5a7 7 0 0 1 4.5 6.5\" />\n </>\n ),\n building: (\n <>\n <rect x=\"4\" y=\"2\" width=\"16\" height=\"20\" rx=\"2\" />\n <path d=\"M9 22v-4h6v4\" />\n <path d=\"M8 6h.01M12 6h.01M16 6h.01M8 10h.01M12 10h.01M16 10h.01M8 14h.01M12 14h.01M16 14h.01\" />\n </>\n ),\n clock: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7v5l3 2\" />\n </>\n ),\n /** A circled `i` — an informational note, and the generic error state. */\n info: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16h.01\" strokeLinecap=\"round\" />\n </>\n ),\n /** A warning triangle — a caution, and the `500` screen. */\n alert: (\n <>\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <path d=\"M12 9v4M12 17h.01\" strokeLinecap=\"round\" />\n </>\n ),\n /** A light bulb — a tip. */\n bulb: (\n <path d=\"M9 18h6M10 22h4M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V17h6v-.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2Z\" />\n ),\n /** A circle with a cross — the `404` screen. */\n crossCircle: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m14.31 8-1.31 2.4M9.69 8l4.62 8M14.31 16 9.69 8\" strokeLinecap=\"round\" />\n </>\n ),\n /** Struck-through signal bars — the offline screen. */\n offline: (\n <>\n <path d=\"M5 12.55a11 11 0 0 1 14 0M8.5 16.11a6 6 0 0 1 7 0M12 20h.01\" strokeLinecap=\"round\" />\n <path d=\"m2 2 20 20\" strokeLinecap=\"round\" />\n </>\n ),\n copy: (\n <path d=\"M9 9h9a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2ZM5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n ),\n check: <path d=\"M20 6 9 17l-5-5\" />,\n chevronDown: <path d=\"m6 9 6 6 6-6\" />,\n /** Stacked chevrons — a value this control switches between. */\n chevronUpDown: <path d=\"m7 15 5 5 5-5M7 9l5-5 5 5\" />,\n /** An open arc — one turn of a loading spinner. */\n spinner: <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" strokeLinecap=\"round\" />,\n markdown: (\n <>\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M6 15V9l3 3 3-3v6M17 9v4m0 0 2-2m-2 2-2-2\" />\n </>\n ),\n} satisfies Record<string, ReactNode>;\n\n/** A glyph in {@link GLYPHS}. */\nexport type GlyphName = keyof typeof GLYPHS;\n\n/**\n * How one icon is drawn. Every field is optional, and the defaults match the\n * house style: 24×24 grid, current colour, hidden from assistive technology.\n */\nexport interface IconOptions {\n /**\n * React key for the `<svg>`. Set it when a host may place the icon in an\n * array of children — fumadocs renders a sidebar link as `[icon, text]`, and\n * an unkeyed element there raises React's \"unique key\" warning in the\n * consuming site's console.\n */\n readonly key?: string;\n /** Pixel size for `width` and `height`. Omit to let CSS size the icon. */\n readonly size?: number;\n /** Stroke width. Default 2. */\n readonly strokeWidth?: number;\n /** Round the stroke's ends and joins. Default `false`. */\n readonly rounded?: boolean;\n /** Class for the `<svg>`, e.g. a spin animation. */\n readonly className?: string;\n}\n\n/**\n * Draw a stroked glyph.\n *\n * @param name - the glyph\n * @param options - size, stroke, and class\n * @returns the `<svg>` element\n */\nexport function strokeIcon(name: GlyphName, options: IconOptions = {}): ReactNode {\n return (\n <svg\n key={options.key}\n {...(options.className === undefined ? {} : { className: options.className })}\n {...(options.size === undefined ? {} : { width: options.size, height: options.size })}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={options.strokeWidth ?? 2}\n {...(options.rounded ? { strokeLinecap: 'round', strokeLinejoin: 'round' } : {})}\n aria-hidden=\"true\"\n >\n {GLYPHS[name]}\n </svg>\n );\n}\n\n/**\n * Draw a filled glyph. Used by the solid play triangle, where a stroke would\n * read as an outline.\n *\n * @param path - the path data\n * @param options - size and class\n * @returns the `<svg>` element\n */\nexport function filledIcon(path: string, options: IconOptions = {}): ReactNode {\n return (\n <svg\n key={options.key}\n {...(options.className === undefined ? {} : { className: options.className })}\n {...(options.size === undefined ? {} : { width: options.size, height: options.size })}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d={path} />\n </svg>\n );\n}\n\n/** A solid right-pointing triangle: run this request. */\nexport const PLAY_PATH = 'M8 5v14l11-7z';\n","'use client';\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\n\nimport { copyToClipboard } from './clipboard.js';\nimport { strokeIcon } from './icons.js';\n\n/**\n * The \"Copy page\" control — a split button with a dropdown, matching Mintlify's\n * LLM-friendly page action. The primary button copies the page's Markdown to\n * the clipboard; the dropdown adds a \"View as Markdown\" link.\n *\n * Self-contained: it styles itself with inline styles keyed to the framework's\n * `--color-fd-*` theme variables, so it inherits the site's palette with no\n * extra stylesheet. This is the framework's one client component.\n *\n * @packageDocumentation\n */\n\n/**\n * Props for {@link CopyPageButton}.\n *\n * @public\n */\nexport interface CopyPageButtonProps {\n /** The page rendered as Markdown, copied to the clipboard on click. */\n readonly markdown: string;\n /** URL that serves the same page as plain Markdown (opened in a new tab). */\n readonly viewUrl: string;\n}\n\n/** The four glyphs this control draws, from the framework's shared set. */\ntype IconName = 'copy' | 'check' | 'chevronDown' | 'markdown';\n\nfunction Icon({ name, size = 15 }: { name: IconName; size?: number }) {\n // The check mark is drawn heavier so it reads at 15px.\n return strokeIcon(name, { size, strokeWidth: name === 'check' ? 2.5 : 1.9, rounded: true });\n}\n\nconst styles = {\n root: { position: 'relative', flexShrink: 0, fontSize: 13, lineHeight: 1.2 } as CSSProperties,\n split: {\n display: 'inline-flex',\n alignItems: 'stretch',\n border: '1px solid var(--color-fd-border)',\n borderRadius: 8,\n background: 'var(--color-fd-card)',\n overflow: 'hidden',\n } as CSSProperties,\n main: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 8,\n padding: '9px 15px',\n background: 'transparent',\n color: 'var(--color-fd-foreground)',\n font: 'inherit',\n fontWeight: 500,\n cursor: 'pointer',\n border: 'none',\n } as CSSProperties,\n caret: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '9px 11px',\n background: 'transparent',\n color: 'var(--color-fd-muted-foreground)',\n borderLeft: '1px solid var(--color-fd-border)',\n cursor: 'pointer',\n } as CSSProperties,\n menu: {\n position: 'absolute',\n top: 'calc(100% + 6px)',\n right: 0,\n zIndex: 40,\n width: 268,\n padding: 6,\n border: '1px solid var(--color-fd-border)',\n borderRadius: 12,\n background: 'var(--color-fd-popover, var(--color-fd-card))',\n boxShadow: '0 4px 6px -2px rgba(0,0,0,0.05), 0 12px 28px -6px rgba(0,0,0,0.18)',\n } as CSSProperties,\n item: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 10,\n width: '100%',\n padding: '9px 10px',\n borderRadius: 8,\n background: 'transparent',\n border: 'none',\n textAlign: 'left',\n textDecoration: 'none',\n color: 'var(--color-fd-foreground)',\n font: 'inherit',\n cursor: 'pointer',\n } as CSSProperties,\n muted: { color: 'var(--color-fd-muted-foreground)' } as CSSProperties,\n itemText: { display: 'flex', flexDirection: 'column', gap: 2, minWidth: 0 } as CSSProperties,\n itemSub: { fontSize: 12, color: 'var(--color-fd-muted-foreground)' } as CSSProperties,\n};\n\nconst HOVER_BG = 'color-mix(in oklab, var(--color-fd-primary) 9%, transparent)';\n\nfunction hoverProps(base: CSSProperties) {\n return {\n onMouseEnter: (event: { currentTarget: HTMLElement }) => {\n event.currentTarget.style.background = HOVER_BG;\n },\n onMouseLeave: (event: { currentTarget: HTMLElement }) => {\n event.currentTarget.style.background = (base.background as string) ?? 'transparent';\n },\n };\n}\n\n/**\n * The split \"Copy page\" button. Renders nothing structural of its own beyond a\n * relatively-positioned wrapper, so a site drops it beside the page title.\n *\n * @public\n */\nexport function CopyPageButton({ markdown, viewUrl }: CopyPageButtonProps) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const onPointerDown = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onPointerDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n };\n }, [open]);\n\n const copy = async () => {\n // A refused clipboard leaves the label unchanged: no error, no false claim.\n if (await copyToClipboard(markdown)) {\n setCopied(true);\n setTimeout(() => {\n setCopied(false);\n }, 1600);\n }\n setOpen(false);\n };\n\n return (\n <div ref={ref} style={styles.root}>\n <div style={styles.split}>\n <button\n type=\"button\"\n style={styles.main}\n onClick={() => void copy()}\n {...hoverProps(styles.main)}\n >\n <span style={styles.muted}>\n <Icon name={copied ? 'check' : 'copy'} />\n </span>\n {copied ? 'Copied' : 'Copy page'}\n </button>\n <button\n type=\"button\"\n style={styles.caret}\n aria-label=\"More options\"\n aria-expanded={open}\n onClick={() => {\n setOpen((value) => !value);\n }}\n {...hoverProps(styles.caret)}\n >\n <Icon name=\"chevronDown\" size={14} />\n </button>\n </div>\n {open ? (\n <div style={styles.menu} role=\"menu\">\n <button\n type=\"button\"\n style={styles.item}\n onClick={() => void copy()}\n {...hoverProps(styles.item)}\n >\n <span style={{ ...styles.muted, marginTop: 1 }}>\n <Icon name=\"copy\" size={16} />\n </span>\n <span style={styles.itemText}>\n <b style={{ fontWeight: 600 }}>Copy page</b>\n <small style={styles.itemSub}>Copy page as Markdown for LLMs</small>\n </span>\n </button>\n <a\n style={styles.item}\n href={viewUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={() => {\n setOpen(false);\n }}\n {...hoverProps(styles.item)}\n >\n <span style={{ ...styles.muted, marginTop: 1 }}>\n <Icon name=\"markdown\" size={16} />\n </span>\n <span style={styles.itemText}>\n <b style={{ fontWeight: 600 }}>View as Markdown ↗</b>\n <small style={styles.itemSub}>View this page as plain text</small>\n </span>\n </a>\n </div>\n ) : null}\n </div>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { copyToClipboard } from '../chunk-JCYR6RPE.js';
3
- import { strokeIcon } from '../chunk-ZKOOKLZ3.js';
3
+ import { strokeIcon } from '../chunk-6H6OB7YP.js';
4
4
  import { useState, useRef, useEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6