@particle-academy/react-fancy 5.71.3 → 6.0.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.
- package/CHANGELOG.md +116 -0
- package/dist/button.cjs +3 -3
- package/dist/button.js +1 -1
- package/dist/chat-thread.cjs +5 -5
- package/dist/chat-thread.js +3 -3
- package/dist/{chunk-R2MFCR7H.js → chunk-3RIBZZLT.js} +3 -3
- package/dist/{chunk-R2MFCR7H.js.map → chunk-3RIBZZLT.js.map} +1 -1
- package/dist/{chunk-MPUR2ZLF.cjs → chunk-BGRVHPGP.cjs} +7 -6
- package/dist/chunk-BGRVHPGP.cjs.map +1 -0
- package/dist/{chunk-2KQVBD7K.cjs → chunk-BX6ZVWTO.cjs} +29 -4
- package/dist/chunk-BX6ZVWTO.cjs.map +1 -0
- package/dist/{chunk-HTPMFADD.js → chunk-CWWMT57K.js} +4 -4
- package/dist/{chunk-HTPMFADD.js.map → chunk-CWWMT57K.js.map} +1 -1
- package/dist/{chunk-FJJ3GMXI.js → chunk-GBR4Q6CP.js} +3 -3
- package/dist/{chunk-FJJ3GMXI.js.map → chunk-GBR4Q6CP.js.map} +1 -1
- package/dist/{chunk-7PUTP2N7.cjs → chunk-IA6JKI4P.cjs} +10 -10
- package/dist/chunk-IA6JKI4P.cjs.map +1 -0
- package/dist/{chunk-JGEFIWDA.cjs → chunk-JKH5ODNG.cjs} +9 -9
- package/dist/{chunk-JGEFIWDA.cjs.map → chunk-JKH5ODNG.cjs.map} +1 -1
- package/dist/{chunk-FUMX6TYZ.js → chunk-KOECVLC4.js} +3 -3
- package/dist/{chunk-FUMX6TYZ.js.map → chunk-KOECVLC4.js.map} +1 -1
- package/dist/{chunk-7T7L5IK5.js → chunk-LWOA2ET6.js} +4 -3
- package/dist/chunk-LWOA2ET6.js.map +1 -0
- package/dist/{chunk-AWIUXZTG.cjs → chunk-ND5SBHGH.cjs} +4 -4
- package/dist/{chunk-AWIUXZTG.cjs.map → chunk-ND5SBHGH.cjs.map} +1 -1
- package/dist/{chunk-WFEX7DAR.js → chunk-PACFMPSX.js} +5 -5
- package/dist/chunk-PACFMPSX.js.map +1 -0
- package/dist/{chunk-7OKF6M32.cjs → chunk-VNOUXFZ2.cjs} +15 -15
- package/dist/{chunk-7OKF6M32.cjs.map → chunk-VNOUXFZ2.cjs.map} +1 -1
- package/dist/{chunk-CINWSRA2.js → chunk-VZ7IDHUY.js} +3 -3
- package/dist/{chunk-CINWSRA2.js.map → chunk-VZ7IDHUY.js.map} +1 -1
- package/dist/{chunk-VV5435PS.js → chunk-WLDDGIGC.js} +29 -5
- package/dist/chunk-WLDDGIGC.js.map +1 -0
- package/dist/{chunk-BL6HCIP4.cjs → chunk-X354OVSC.cjs} +12 -12
- package/dist/{chunk-BL6HCIP4.cjs.map → chunk-X354OVSC.cjs.map} +1 -1
- package/dist/{chunk-EEKIVROJ.cjs → chunk-ZXGX5RI5.cjs} +4 -4
- package/dist/{chunk-EEKIVROJ.cjs.map → chunk-ZXGX5RI5.cjs.map} +1 -1
- package/dist/content-renderer.cjs +5 -5
- package/dist/content-renderer.js +2 -2
- package/dist/editor.cjs +5 -5
- package/dist/editor.js +3 -3
- package/dist/index.cjs +40 -40
- package/dist/index.d.cts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +8 -8
- package/dist/json-editor.cjs +13 -13
- package/dist/json-editor.js +2 -2
- package/dist/magic-wand.cjs +3 -3
- package/dist/magic-wand.js +2 -2
- package/dist/prompt-input.cjs +5 -5
- package/dist/prompt-input.js +2 -2
- package/dist/reason-tag.cjs +3 -3
- package/dist/reason-tag.js +2 -2
- package/docs/Button.md +13 -0
- package/package.json +1 -1
- package/dist/chunk-2KQVBD7K.cjs.map +0 -1
- package/dist/chunk-7PUTP2N7.cjs.map +0 -1
- package/dist/chunk-7T7L5IK5.js.map +0 -1
- package/dist/chunk-MPUR2ZLF.cjs.map +0 -1
- package/dist/chunk-VV5435PS.js.map +0 -1
- package/dist/chunk-WFEX7DAR.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkJKH5ODNG_cjs = require('./chunk-JKH5ODNG.cjs');
|
|
4
4
|
var chunkBJL3VDRK_cjs = require('./chunk-BJL3VDRK.cjs');
|
|
5
5
|
var chunkMOU6O324_cjs = require('./chunk-MOU6O324.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunkBX6ZVWTO_cjs = require('./chunk-BX6ZVWTO.cjs');
|
|
7
7
|
var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
|
|
8
8
|
var react = require('react');
|
|
9
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -135,7 +135,7 @@ function AttachmentItem({
|
|
|
135
135
|
if (renderAttachment) {
|
|
136
136
|
body = renderAttachment(attachment, message);
|
|
137
137
|
} else {
|
|
138
|
-
const href =
|
|
138
|
+
const href = chunkBX6ZVWTO_cjs.sanitizeComponentHref("ChatMessage", attachment.url);
|
|
139
139
|
const size = typeof attachment.size === "number" ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: chunkZU5Q77OT_cjs.cn("ml-1", TEXT_MUTED), children: [
|
|
140
140
|
"(",
|
|
141
141
|
formatBytes(attachment.size),
|
|
@@ -168,7 +168,7 @@ function ProposalFooter({
|
|
|
168
168
|
if (!onAccept && !onReject) return null;
|
|
169
169
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-2", children: [
|
|
170
170
|
onAccept && /* @__PURE__ */ jsxRuntime.jsx(
|
|
171
|
-
|
|
171
|
+
chunkBX6ZVWTO_cjs.Button,
|
|
172
172
|
{
|
|
173
173
|
type: "button",
|
|
174
174
|
size: "sm",
|
|
@@ -181,7 +181,7 @@ function ProposalFooter({
|
|
|
181
181
|
}
|
|
182
182
|
),
|
|
183
183
|
onReject && /* @__PURE__ */ jsxRuntime.jsx(
|
|
184
|
-
|
|
184
|
+
chunkBX6ZVWTO_cjs.Button,
|
|
185
185
|
{
|
|
186
186
|
type: "button",
|
|
187
187
|
size: "sm",
|
|
@@ -237,7 +237,7 @@ function ChatMessage({
|
|
|
237
237
|
}, ctx);
|
|
238
238
|
};
|
|
239
239
|
const body = message.format === "text" ? /* @__PURE__ */ jsxRuntime.jsx("div", { "data-chat-content": "", className: "whitespace-pre-wrap break-words", children: message.content }) : /* @__PURE__ */ jsxRuntime.jsx("div", { "data-chat-content": "", className: "min-w-0 break-words", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
240
|
-
|
|
240
|
+
chunkJKH5ODNG_cjs.ContentRenderer,
|
|
241
241
|
{
|
|
242
242
|
...contentOptions,
|
|
243
243
|
value: message.content,
|
|
@@ -576,7 +576,7 @@ function ChatThread({
|
|
|
576
576
|
),
|
|
577
577
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: contentRef, className: "flex flex-col pb-3", children: [
|
|
578
578
|
showLoadEarlier && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center pt-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
579
|
-
|
|
579
|
+
chunkBX6ZVWTO_cjs.Button,
|
|
580
580
|
{
|
|
581
581
|
type: "button",
|
|
582
582
|
size: "sm",
|
|
@@ -597,7 +597,7 @@ function ChatThread({
|
|
|
597
597
|
}
|
|
598
598
|
),
|
|
599
599
|
showJump && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-3 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
600
|
-
|
|
600
|
+
chunkBX6ZVWTO_cjs.Button,
|
|
601
601
|
{
|
|
602
602
|
type: "button",
|
|
603
603
|
size: "sm",
|
|
@@ -619,5 +619,5 @@ ChatThread.displayName = "ChatThread";
|
|
|
619
619
|
|
|
620
620
|
exports.ChatMessage = ChatMessage;
|
|
621
621
|
exports.ChatThread = ChatThread;
|
|
622
|
-
//# sourceMappingURL=chunk-
|
|
623
|
-
//# sourceMappingURL=chunk-
|
|
622
|
+
//# sourceMappingURL=chunk-IA6JKI4P.cjs.map
|
|
623
|
+
//# sourceMappingURL=chunk-IA6JKI4P.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ChatThread/chat-utils.ts","../src/components/ChatThread/ChatMessage.tsx","../src/components/ChatThread/ChatThread.tsx"],"names":["useState","useRef","useEffect","useCallback","sanitizeComponentHref","jsxs","cn","jsx","Badge","Button","ContentRenderer","Fragment","Avatar","TEXT_MUTED","BORDER","useLayoutEffect","useId","useImperativeHandle"],"mappings":"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","file":"chunk-IA6JKI4P.cjs","sourcesContent":["import type { ChatMessageData, ChatThreadLabels } from \"./ChatThread.types\";\n\nexport const DEFAULT_LABELS: ChatThreadLabels = {\n log: \"Conversation\",\n loadEarlier: \"Load earlier messages\",\n loadingEarlier: \"Loading earlier messages...\",\n newMessages: (n) => (n === 1 ? \"1 new message\" : `${n} new messages`),\n internal: \"Internal note\",\n pending: \"Sending...\",\n failed: \"Not sent\",\n proposal: \"Proposed\",\n accept: \"Accept\",\n reject: \"Reject\",\n accepted: \"Accepted\",\n rejected: \"Rejected\",\n withdrawn: \"Withdrawn\",\n attachments: \"Attachments\",\n roles: {\n user: \"You\",\n assistant: \"Assistant\",\n system: \"System\",\n agent: \"Agent\",\n staff: \"Staff\",\n customer: \"Customer\",\n },\n};\n\nexport function mergeLabels(labels?: Partial<ChatThreadLabels>): ChatThreadLabels {\n if (!labels) return DEFAULT_LABELS;\n return {\n ...DEFAULT_LABELS,\n ...labels,\n roles: { ...DEFAULT_LABELS.roles, ...labels.roles },\n };\n}\n\n/** `null` for a missing or unparseable time: no time renders rather than \"Invalid Date\". */\nexport function toDate(value: string | number | undefined): Date | null {\n if (value === undefined || value === null || value === \"\") return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/** Local calendar day, `YYYY-MM-DD`. */\nexport function dayKey(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\nexport function defaultFormatTime(d: Date): string {\n return d.toLocaleTimeString(undefined, { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\nexport function defaultFormatDay(d: Date): string {\n return d.toLocaleDateString(undefined, { dateStyle: \"medium\" });\n}\n\nexport function roleLabel(role: string, labels: ChatThreadLabels): string {\n const known = labels.roles[role];\n if (known) return known;\n return role ? role.charAt(0).toUpperCase() + role.slice(1) : \"\";\n}\n\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n const first = parts[0][0] ?? \"\";\n const last = parts.length > 1 ? (parts[parts.length - 1][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n}\n\nexport function isOwn(message: ChatMessageData, ownRoles: string[]): boolean {\n return message.own ?? ownRoles.includes(message.role);\n}\n\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Does `curr` continue `prev`'s group? Same role, same author, same visibility, within the window. */\nexport function continuesGroup(\n prev: ChatMessageData | undefined,\n curr: ChatMessageData,\n windowMs: number,\n): boolean {\n if (!prev) return false;\n if (prev.role !== curr.role) return false;\n if ((prev.author?.name ?? \"\") !== (curr.author?.name ?? \"\")) return false;\n if ((prev.visibility ?? \"public\") !== (curr.visibility ?? \"public\")) return false;\n if (prev.proposal || curr.proposal) return false;\n if (curr.role === \"system\") return false;\n const a = toDate(prev.createdAt);\n const b = toDate(curr.createdAt);\n if (!a || !b) return false;\n const gap = b.getTime() - a.getTime();\n return gap >= 0 && gap <= windowMs;\n}\n\nexport function formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeComponentHref } from \"../../utils/sanitize\";\nimport { Avatar } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\nimport { Button } from \"../Button\";\nimport { ContentRenderer } from \"../ContentRenderer\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatMessageData,\n ChatMessageProps,\n ChatThreadActionContext,\n ChatThreadLabels,\n} from \"./ChatThread.types\";\nimport {\n defaultFormatTime,\n formatBytes,\n initials,\n isOwn,\n mergeLabels,\n roleLabel,\n toDate,\n} from \"./chat-utils\";\n\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\nconst SURFACE =\n \"bg-[color:var(--fancy-surface,var(--color-white))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\nconst SURFACE_MUTED =\n \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\";\nconst TEXT =\n \"text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\";\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\n\n/**\n * Run a host callback that may return a Promise. While it is pending the\n * control is busy and a second run is refused. A rejection goes to\n * `onActionError`, or is left unhandled so it still reaches the console.\n *\n * @internal shared by ChatMessage (proposal decisions) and ChatThread (load earlier)\n */\nexport function useAcknowledgedAction(\n onActionError?: (error: unknown, action: ChatThreadActionContext) => void,\n): [busy: boolean, run: (fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => void] {\n const [busy, setBusy] = useState(false);\n const busyRef = useRef(false);\n const mounted = useRef(true);\n const onErrorRef = useRef(onActionError);\n onErrorRef.current = onActionError;\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const run = useCallback((fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => {\n if (busyRef.current) return;\n const result = fn();\n if (!result || typeof (result as Promise<unknown>).then !== \"function\") return;\n\n busyRef.current = true;\n setBusy(true);\n const settle = () => {\n busyRef.current = false;\n if (mounted.current) setBusy(false);\n };\n void Promise.resolve(result).then(settle, (error: unknown) => {\n settle();\n const onError = onErrorRef.current;\n if (onError) onError(error, ctx);\n else throw error;\n });\n }, []);\n\n return [busy, run];\n}\n\nfunction AttachmentItem({\n attachment,\n message,\n renderAttachment,\n}: {\n attachment: ChatAttachment;\n message: ChatMessageData;\n renderAttachment?: ChatMessageProps[\"renderAttachment\"];\n}) {\n let body: ReactNode;\n if (renderAttachment) {\n body = renderAttachment(attachment, message);\n } else {\n const href = sanitizeComponentHref(\"ChatMessage\", attachment.url);\n const size = typeof attachment.size === \"number\" ? (\n <span className={cn(\"ml-1\", TEXT_MUTED)}>({formatBytes(attachment.size)})</span>\n ) : null;\n body = href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2 break-all\">\n {attachment.name}\n {size}\n </a>\n ) : (\n <span className=\"break-all\">\n {attachment.name}\n {size}\n </span>\n );\n }\n\n return (\n <li data-chat-attachment={attachment.id} className=\"text-sm\">\n {body}\n </li>\n );\n}\n\nfunction ProposalFooter({\n message,\n labels,\n busy,\n onAccept,\n onReject,\n}: {\n message: ChatMessageData;\n labels: ChatThreadLabels;\n busy: boolean;\n onAccept?: () => void;\n onReject?: () => void;\n}) {\n const proposal = message.proposal!;\n const state = proposal.state ?? \"pending\";\n\n if (state !== \"pending\") {\n const text = state === \"accepted\" ? labels.accepted : state === \"rejected\" ? labels.rejected : labels.withdrawn;\n const color = state === \"accepted\" ? \"emerald\" : state === \"rejected\" ? \"red\" : \"zinc\";\n return (\n <div className=\"mt-2\">\n <Badge color={color} variant=\"soft\" size=\"sm\" data-chat-proposal-status={state}>\n {text}\n </Badge>\n </div>\n );\n }\n\n if (!onAccept && !onReject) return null;\n\n return (\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {onAccept && (\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"emerald\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"accept\"\n onClick={onAccept}\n >\n {proposal.acceptLabel ?? labels.accept}\n </Button>\n )}\n {onReject && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"reject\"\n onClick={onReject}\n >\n {proposal.rejectLabel ?? labels.reject}\n </Button>\n )}\n </div>\n );\n}\n\n/**\n * ChatMessage — one message of a `ChatThread`, usable on its own.\n *\n * Content is markdown through `ContentRenderer`, always sanitised (there is no\n * `unsafe` here on purpose: message bodies are text the host did not author).\n * `format: \"text\"` renders it literally. A message with a `proposal` is an\n * approval card: the host owns its state and decides it through\n * `onProposalAccept` / `onProposalReject`; the card never acts on its own.\n */\nexport function ChatMessage({\n message,\n actions,\n grouped = false,\n className,\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime = defaultFormatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n classNames,\n}: ChatMessageProps) {\n const labels = mergeLabels(labelsProp);\n const [busy, run] = useAcknowledgedAction(onActionError);\n\n const status = message.status ?? \"sent\";\n const visibility = message.visibility ?? \"public\";\n const internal = visibility === \"internal\";\n const own = isOwn(message, ownRoles);\n const system = message.role === \"system\";\n const proposal = message.proposal;\n const date = toDate(message.createdAt);\n // Always a name: the author's, else the role's (\"Assistant\", or the host's own role capitalised).\n const name = message.author?.name || roleLabel(message.role, labels);\n\n const decide = (kind: \"accept\" | \"reject\") => {\n if (!proposal) return;\n const cb = kind === \"accept\" ? onProposalAccept : onProposalReject;\n if (!cb) return;\n const ctx: ChatThreadActionContext = {\n type: kind === \"accept\" ? \"proposal-accept\" : \"proposal-reject\",\n messageId: message.id,\n proposalId: proposal.id,\n };\n run(() => {\n onActivity?.(ctx);\n return cb(message);\n }, ctx);\n };\n\n const body =\n message.format === \"text\" ? (\n <div data-chat-content=\"\" className=\"whitespace-pre-wrap break-words\">\n {message.content}\n </div>\n ) : (\n <div data-chat-content=\"\" className=\"min-w-0 break-words\">\n <ContentRenderer\n {...contentOptions}\n value={message.content}\n format=\"markdown\"\n streaming={status === \"streaming\" ? streaming : false}\n />\n </div>\n );\n\n const attachments =\n message.attachments && message.attachments.length > 0 ? (\n <ul data-chat-attachments=\"\" aria-label={labels.attachments} className=\"mt-2 flex flex-col gap-1\">\n {message.attachments.map((a) => (\n <AttachmentItem key={a.id} attachment={a} message={message} renderAttachment={renderAttachment} />\n ))}\n </ul>\n ) : null;\n\n const statusText =\n status === \"pending\" ? (\n <div data-chat-status-text=\"pending\" className={cn(\"mt-1 text-xs\", TEXT_MUTED)}>\n {labels.pending}\n </div>\n ) : status === \"failed\" ? (\n <div data-chat-status-text=\"failed\" className=\"mt-1 text-xs text-red-600 dark:text-red-400\">\n {labels.failed}\n </div>\n ) : null;\n\n const actionsSlot =\n actions !== undefined && actions !== null && actions !== false ? (\n <div data-chat-message-actions=\"\" className={cn(\"mt-1 flex flex-wrap items-center gap-1\", classNames?.actions)}>\n {actions}\n </div>\n ) : null;\n\n const rootAttrs = {\n \"data-chat-message\": message.id,\n \"data-chat-role\": message.role,\n \"data-chat-status\": status,\n \"data-chat-visibility\": visibility,\n \"data-chat-own\": own ? \"\" : undefined,\n \"data-chat-grouped\": grouped ? \"\" : undefined,\n \"aria-busy\": status === \"streaming\" ? true : undefined,\n };\n\n if (system && !proposal) {\n return (\n <article\n {...rootAttrs}\n className={cn(\"flex flex-col items-center px-4 py-1 text-center text-xs\", TEXT_MUTED, className, classNames?.message)}\n >\n {internal && (\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n )}\n <div className={cn(\"max-w-prose\", classNames?.bubble)}>{body}</div>\n {attachments}\n {actionsSlot}\n </article>\n );\n }\n\n const bubbleClass = cn(\n \"rounded-2xl px-3.5 py-2.5 text-sm\",\n TEXT,\n internal\n ? \"border border-dashed border-amber-400 bg-amber-50 dark:border-amber-500/60 dark:bg-amber-950/30\"\n : proposal\n ? cn(\"border-2 border-violet-300 dark:border-violet-500/60\", SURFACE)\n : own\n ? cn(\"border\", BORDER, SURFACE)\n : SURFACE_MUTED,\n status === \"failed\" && \"ring-1 ring-red-400/70\",\n classNames?.bubble,\n proposal && classNames?.proposal,\n );\n\n const bubbleInner = (\n <>\n {internal && (\n <div className=\"mb-1.5\">\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n </div>\n )}\n {proposal && (\n <div data-chat-proposal-header=\"\" className=\"mb-1.5 flex flex-wrap items-center gap-2\">\n <Badge color=\"violet\" variant=\"soft\" size=\"sm\">\n {labels.proposal}\n </Badge>\n {proposal.title && <span className=\"font-medium\">{proposal.title}</span>}\n </div>\n )}\n {body}\n {attachments}\n {proposal && (\n <ProposalFooter\n message={message}\n labels={labels}\n busy={busy}\n onAccept={onProposalAccept ? () => decide(\"accept\") : undefined}\n onReject={onProposalReject ? () => decide(\"reject\") : undefined}\n />\n )}\n </>\n );\n\n return (\n <article\n {...rootAttrs}\n className={cn(\n \"flex gap-2.5 px-3\",\n grouped ? \"pt-0.5\" : \"pt-3\",\n own && \"flex-row-reverse\",\n className,\n classNames?.message,\n )}\n >\n <div className=\"w-8 shrink-0\" aria-hidden={grouped || undefined}>\n {!grouped && (\n <Avatar size=\"sm\" src={message.author?.avatar} alt=\"\" fallback={initials(name)} />\n )}\n </div>\n <div className={cn(\"flex min-w-0 max-w-[85%] flex-col\", own ? \"items-end\" : \"items-start\")}>\n {!grouped && (\n <div\n data-chat-header=\"\"\n className={cn(\"mb-1 flex items-baseline gap-2 text-xs\", own && \"flex-row-reverse\", classNames?.header)}\n >\n <span data-chat-author=\"\" className={cn(\"font-medium\", TEXT)}>\n {name}\n </span>\n {date && (\n <time dateTime={date.toISOString()} className={TEXT_MUTED}>\n {formatTime(date)}\n </time>\n )}\n </div>\n )}\n {proposal ? (\n <div\n data-chat-proposal={proposal.id}\n data-chat-proposal-state={proposal.state ?? \"pending\"}\n aria-busy={busy || undefined}\n className={cn(\"min-w-0 max-w-full\", bubbleClass)}\n >\n {bubbleInner}\n </div>\n ) : (\n <div data-chat-bubble=\"\" className={cn(\"min-w-0 max-w-full\", bubbleClass)}>\n {bubbleInner}\n </div>\n )}\n {statusText}\n {actionsSlot}\n </div>\n </article>\n );\n}\n\nChatMessage.displayName = \"ChatMessage\";\n","import {\n Fragment,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type UIEvent,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button\";\nimport { ChatMessage, useAcknowledgedAction } from \"./ChatMessage\";\nimport type { ChatMessageData, ChatThreadProps } from \"./ChatThread.types\";\nimport {\n DEFAULT_GROUP_WINDOW_MS,\n continuesGroup,\n dayKey,\n defaultFormatDay,\n isOwn,\n mergeLabels,\n toDate,\n} from \"./chat-utils\";\n\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\n\n// The isomorphic layout effect: scroll work must happen before paint in the\n// browser, and must not warn during SSR.\nconst useIsoLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\ninterface Seen {\n ids: Set<string>;\n first?: string;\n last?: string;\n scrollHeight: number;\n /** The reader's position as of the last render or scroll event, before any browser adjustment. */\n scrollTop: number;\n}\n\n/**\n * ChatThread — a controlled message list for agent and support conversations.\n *\n * - **Controlled.** It renders exactly `messages`, oldest first. Loading\n * earlier history and deciding a proposal go through callbacks; nothing is\n * held internally that an agent would need to read or write.\n * - **Stick to the bottom without yanking.** New messages are followed only\n * while the reader is at the bottom. A reader who scrolled up stays put and\n * gets an \"N new messages\" jump control. Prepended history keeps the\n * reader's place. Only the log's own `scrollTop` is ever set, and focus moves\n * with `preventScroll`, so no ancestor (or the page) scrolls (the 5.69 rule).\n * - **Visibility is the host's.** `visibility: \"internal\"` is labelled and\n * styled, never filtered: pass only what the viewer may see.\n * - **Handles:** `data-react-fancy-chat-thread`, `data-chat-message=\"<id>\"`,\n * `data-chat-role`, `data-chat-status`, `data-chat-visibility`,\n * `data-chat-proposal=\"<id>\"`, `data-chat-proposal-action`.\n * - **Observable:** `onActivity` reports every interaction as one stream.\n *\n * Pair it with `Composer` or `PromptInput` in the `composer` slot (both have\n * acknowledged send). It does not ship an input of its own.\n */\nexport function ChatThread({\n ref,\n messages,\n heading,\n headingLevel = 2,\n onLoadEarlier,\n hasEarlier,\n loadingEarlier = false,\n stickToBottom = true,\n bottomThreshold = 48,\n onAtBottomChange,\n separators = \"none\",\n formatDay = defaultFormatDay,\n groupConsecutive = false,\n renderActions,\n composer,\n empty,\n classNames,\n className,\n // message display\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n onScroll: onScrollProp,\n ...rest\n}: ChatThreadProps) {\n const labels = mergeLabels(labelsProp);\n const headingId = useId();\n const logRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const atBottomRef = useRef(true);\n const seenRef = useRef<Seen | null>(null);\n const [atBottom, setAtBottom] = useState(true);\n const [unseen, setUnseen] = useState(0);\n const [loadBusy, runLoad] = useAcknowledgedAction(onActionError);\n\n const onAtBottomChangeRef = useRef(onAtBottomChange);\n onAtBottomChangeRef.current = onAtBottomChange;\n\n const measure = useCallback(\n (el: HTMLElement) => el.scrollHeight - el.scrollTop - el.clientHeight <= bottomThreshold,\n [bottomThreshold],\n );\n\n const commitAtBottom = useCallback((value: boolean) => {\n const changed = atBottomRef.current !== value;\n atBottomRef.current = value;\n setAtBottom(value);\n if (value) setUnseen(0);\n if (changed) onAtBottomChangeRef.current?.(value);\n }, []);\n\n const scrollLogToBottom = useCallback(() => {\n const el = logRef.current;\n if (!el) return;\n // The log's own scrollTop only. Never scrollIntoView: that scrolls every\n // scrollable ancestor too, up to the page.\n el.scrollTop = el.scrollHeight;\n }, []);\n\n // Follow, hold, or keep place, every time the messages change.\n useIsoLayoutEffect(() => {\n const el = logRef.current;\n if (!el) return;\n\n const ids = messages.map((m) => m.id);\n const first = ids[0];\n const last = ids[ids.length - 1];\n const prev = seenRef.current;\n\n if (!prev) {\n if (stickToBottom) scrollLogToBottom();\n } else {\n const prepended =\n prev.last !== undefined &&\n prev.last === last &&\n prev.first !== undefined &&\n prev.first !== first &&\n ids.includes(prev.first);\n\n if (prepended) {\n if (stickToBottom && atBottomRef.current) scrollLogToBottom();\n // From the position BEFORE the change, never the current one: the\n // browser's scroll anchoring (overflow-anchor) may already have moved\n // scrollTop by the inserted height, and adding it again overshoots.\n else el.scrollTop = prev.scrollTop + (el.scrollHeight - prev.scrollHeight);\n } else {\n const lastIndex = prev.last === undefined ? -1 : ids.indexOf(prev.last);\n const appended: ChatMessageData[] = [];\n for (let i = lastIndex + 1; i < messages.length; i++) {\n if (!prev.ids.has(messages[i].id)) appended.push(messages[i]);\n }\n\n if (stickToBottom && atBottomRef.current) {\n scrollLogToBottom();\n } else if (stickToBottom && appended.some((m) => isOwn(m, ownRoles))) {\n // The viewer's own send: show it, wherever they were reading.\n scrollLogToBottom();\n } else if (appended.length > 0) {\n setUnseen((n) => n + appended.length);\n }\n }\n }\n\n seenRef.current = { ids: new Set(ids), first, last, scrollHeight: el.scrollHeight, scrollTop: el.scrollTop };\n const nowAtBottom = measure(el);\n if (nowAtBottom !== atBottomRef.current || nowAtBottom) commitAtBottom(nowAtBottom);\n // ownRoles is compared by content inside; a new array each render must not re-run this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages, stickToBottom, measure, commitAtBottom, scrollLogToBottom]);\n\n // Content that grows without a messages change (images, fonts, a\n // ContentRenderer extension resolving) keeps a reader at the bottom there.\n useEffect(() => {\n const content = contentRef.current;\n if (!content || !stickToBottom || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n if (atBottomRef.current) scrollLogToBottom();\n });\n ro.observe(content);\n return () => ro.disconnect();\n }, [stickToBottom, scrollLogToBottom]);\n\n const onScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n onScrollProp?.(e);\n if (seenRef.current) seenRef.current.scrollTop = e.currentTarget.scrollTop;\n const now = measure(e.currentTarget);\n if (now !== atBottomRef.current || now) commitAtBottom(now);\n },\n [measure, commitAtBottom, onScrollProp],\n );\n\n const jumpToLatest = useCallback(() => {\n onActivity?.({ type: \"jump-to-latest\", unseen });\n scrollLogToBottom();\n commitAtBottom(true);\n // The jump control is about to unmount; keep focus in the conversation\n // without scrolling anything (genie#1290).\n logRef.current?.focus({ preventScroll: true });\n }, [onActivity, unseen, scrollLogToBottom, commitAtBottom]);\n\n useImperativeHandle(\n ref,\n () => ({\n scrollToLatest() {\n scrollLogToBottom();\n const el = logRef.current;\n if (el) commitAtBottom(measure(el));\n },\n scrollToMessage(id: string) {\n const el = logRef.current;\n if (!el) return false;\n const target = [...el.querySelectorAll<HTMLElement>(\"[data-chat-message]\")].find(\n (n) => n.getAttribute(\"data-chat-message\") === id,\n );\n if (!target) return false;\n el.scrollTop = target.offsetTop;\n commitAtBottom(measure(el));\n return true;\n },\n get element() {\n return logRef.current;\n },\n }),\n [scrollLogToBottom, commitAtBottom, measure],\n );\n\n const showLoadEarlier = Boolean(onLoadEarlier) && (hasEarlier ?? true);\n const earlierBusy = loadingEarlier || loadBusy;\n const showJump = unseen > 0 && !atBottom;\n const groupWindow =\n groupConsecutive === true ? DEFAULT_GROUP_WINDOW_MS : typeof groupConsecutive === \"number\" ? groupConsecutive : 0;\n\n const items: ReactNode[] = [];\n let prevDay: string | undefined;\n messages.forEach((m, i) => {\n const date = toDate(m.createdAt);\n let separator: ReactNode = null;\n if (separators === \"day\" && date) {\n const key = dayKey(date);\n if (key !== prevDay) {\n separator = (\n <div\n data-chat-day-separator={key}\n className={cn(\"flex items-center gap-3 px-4 pt-4 text-xs\", TEXT_MUTED, classNames?.separator)}\n >\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n <span>{formatDay(date)}</span>\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n </div>\n );\n prevDay = key;\n }\n }\n const grouped = groupWindow > 0 && !separator && continuesGroup(messages[i - 1], m, groupWindow);\n\n items.push(\n <Fragment key={m.id}>\n {separator}\n <ChatMessage\n message={m}\n grouped={grouped}\n actions={renderActions?.(m)}\n ownRoles={ownRoles}\n streaming={streaming}\n contentOptions={contentOptions}\n labels={labelsProp}\n formatTime={formatTime}\n renderAttachment={renderAttachment}\n onProposalAccept={onProposalAccept}\n onProposalReject={onProposalReject}\n onActivity={onActivity}\n onActionError={onActionError}\n classNames={classNames}\n />\n </Fragment>,\n );\n });\n\n const H = `h${headingLevel}` as \"h2\";\n\n return (\n <div\n data-react-fancy-chat-thread=\"\"\n {...rest}\n className={cn(\"flex min-h-0 flex-col\", className, classNames?.root)}\n >\n {heading !== undefined && heading !== null && (\n <H\n id={headingId}\n data-react-fancy-chat-thread-heading=\"\"\n className={cn(\"shrink-0 px-4 py-3 text-sm font-semibold\", classNames?.heading)}\n >\n {heading}\n </H>\n )}\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={logRef}\n data-react-fancy-chat-thread-log=\"\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n aria-label={heading ? undefined : labels.log}\n aria-labelledby={heading ? headingId : undefined}\n tabIndex={0}\n onScroll={onScroll}\n className={cn(\n \"relative min-h-0 flex-1 overflow-y-auto overscroll-contain focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]\",\n classNames?.log,\n )}\n >\n <div ref={contentRef} className=\"flex flex-col pb-3\">\n {showLoadEarlier && (\n <div className=\"flex justify-center pt-3\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n data-react-fancy-chat-thread-load-earlier=\"\"\n disabled={earlierBusy}\n aria-busy={earlierBusy || undefined}\n onClick={() =>\n runLoad(() => {\n onActivity?.({ type: \"load-earlier\" });\n return onLoadEarlier!();\n }, { type: \"load-earlier\" })\n }\n >\n {earlierBusy ? labels.loadingEarlier : labels.loadEarlier}\n </Button>\n </div>\n )}\n {messages.length === 0 && empty !== undefined && (\n <div data-react-fancy-chat-thread-empty=\"\" className={cn(\"px-4 py-8 text-center text-sm\", TEXT_MUTED)}>\n {empty}\n </div>\n )}\n {items}\n </div>\n </div>\n {showJump && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-3 flex justify-center\">\n <Button\n type=\"button\"\n size=\"sm\"\n data-react-fancy-chat-thread-jump=\"\"\n data-unseen={unseen}\n iconTrailing=\"chevron-down\"\n className={cn(\"pointer-events-auto shadow-md\", classNames?.jump)}\n onClick={jumpToLatest}\n >\n {labels.newMessages(unseen)}\n </Button>\n </div>\n )}\n </div>\n {composer !== undefined && composer !== null && (\n <div data-react-fancy-chat-thread-composer=\"\" className={cn(\"shrink-0\", classNames?.composer)}>\n {composer}\n </div>\n )}\n </div>\n );\n}\n\nChatThread.displayName = \"ChatThread\";\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunk2C64OVOZ_cjs = require('./chunk-2C64OVOZ.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkBX6ZVWTO_cjs = require('./chunk-BX6ZVWTO.cjs');
|
|
5
5
|
var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
|
|
6
6
|
var marked = require('marked');
|
|
7
7
|
var react = require('react');
|
|
@@ -16,7 +16,7 @@ function safeAttributes(attrs) {
|
|
|
16
16
|
const lower = name.toLowerCase();
|
|
17
17
|
if (lower.startsWith("on") || lower === "srcdoc") continue;
|
|
18
18
|
if (URL_ATTRS.has(lower)) {
|
|
19
|
-
const safe =
|
|
19
|
+
const safe = chunkBX6ZVWTO_cjs.sanitizeHref(value);
|
|
20
20
|
if (safe === void 0) continue;
|
|
21
21
|
out[name] = safe;
|
|
22
22
|
continue;
|
|
@@ -110,7 +110,7 @@ function markdownToRawHtml(markdown) {
|
|
|
110
110
|
return marked.marked.parse(markdown ?? "", { async: false });
|
|
111
111
|
}
|
|
112
112
|
function renderMarkdown(markdown, sanitize) {
|
|
113
|
-
return
|
|
113
|
+
return chunkBX6ZVWTO_cjs.sanitizeHtml(markdownToRawHtml(markdown), sanitize);
|
|
114
114
|
}
|
|
115
115
|
var proseClasses = [
|
|
116
116
|
"[&_h1]:text-2xl [&_h1]:font-bold [&_h1]:mt-4 [&_h1]:mb-2",
|
|
@@ -1178,7 +1178,7 @@ function CopyButton({
|
|
|
1178
1178
|
const idleLabel = kind === "code" ? "Copy code" : "Copy table";
|
|
1179
1179
|
const label = state === "copied" ? "Copied" : state === "failed" ? "Copy failed" : idleLabel;
|
|
1180
1180
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1181
|
-
|
|
1181
|
+
chunkBX6ZVWTO_cjs.Button,
|
|
1182
1182
|
{
|
|
1183
1183
|
ref: btn,
|
|
1184
1184
|
type: "button",
|
|
@@ -1227,7 +1227,7 @@ function ContentBody({ source, format, extensions, unsafe, depth = 0, tail = fal
|
|
|
1227
1227
|
return splitMarkdownBlocks(source, mdTags);
|
|
1228
1228
|
}, [source, format, active]);
|
|
1229
1229
|
if (!blocks) {
|
|
1230
|
-
const html = unsafe ? source :
|
|
1230
|
+
const html = unsafe ? source : chunkBX6ZVWTO_cjs.sanitizeHtml(source);
|
|
1231
1231
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1232
1232
|
RenderedContent,
|
|
1233
1233
|
{
|
|
@@ -1244,7 +1244,7 @@ function ContentBody({ source, format, extensions, unsafe, depth = 0, tail = fal
|
|
|
1244
1244
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: blocks.map((block, i) => {
|
|
1245
1245
|
if (block.type === "markdown") {
|
|
1246
1246
|
const raw = markdownToRawHtml(block.source);
|
|
1247
|
-
const html = unsafe ? raw :
|
|
1247
|
+
const html = unsafe ? raw : chunkBX6ZVWTO_cjs.sanitizeHtml(raw);
|
|
1248
1248
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1249
1249
|
RenderedContent,
|
|
1250
1250
|
{
|
|
@@ -1284,7 +1284,7 @@ function RenderedContent({
|
|
|
1284
1284
|
tail = false
|
|
1285
1285
|
}) {
|
|
1286
1286
|
const segments = react.useMemo(() => parseSegments(html, extensions), [html, extensions]);
|
|
1287
|
-
const renderHtml = (content) => unsafe ? content :
|
|
1287
|
+
const renderHtml = (content) => unsafe ? content : chunkBX6ZVWTO_cjs.sanitizeHtml(content);
|
|
1288
1288
|
if (segments.length === 0) return null;
|
|
1289
1289
|
if (segments.length === 1 && segments[0].type === "html") {
|
|
1290
1290
|
return /* @__PURE__ */ jsxRuntime.jsx(HtmlChunk, { html: renderHtml(segments[0].content), fromMarkdown, tail });
|
|
@@ -1411,5 +1411,5 @@ exports.proseClasses = proseClasses;
|
|
|
1411
1411
|
exports.registerExtension = registerExtension;
|
|
1412
1412
|
exports.registerExtensions = registerExtensions;
|
|
1413
1413
|
exports.renderMarkdown = renderMarkdown;
|
|
1414
|
-
//# sourceMappingURL=chunk-
|
|
1415
|
-
//# sourceMappingURL=chunk-
|
|
1414
|
+
//# sourceMappingURL=chunk-JKH5ODNG.cjs.map
|
|
1415
|
+
//# sourceMappingURL=chunk-JKH5ODNG.cjs.map
|