@k2b/ui 0.15.0 → 0.16.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.
@@ -482,20 +482,20 @@ export function ChatActivity(props) {
482
482
  _el$50 = _el$49.firstChild;
483
483
  _$insert(_el$50, _$createComponent(ActivityContent, props));
484
484
  _$effect(_p$ => {
485
- var _v$23 = `k2b-chat-activity ${props.class ?? ""}`,
486
- _v$24 = tone(),
487
- _v$25 = props.accent ? "true" : undefined,
488
- _v$26 = props.busy ? "true" : undefined,
489
- _v$27 = props.anchorId !== undefined ? String(props.anchorId) : undefined,
490
- _v$28 = style(),
491
- _v$29 = props.busy ? "true" : undefined;
492
- _v$23 !== _p$.e && _$className(_el$49, _p$.e = _v$23);
493
- _v$24 !== _p$.t && _$setAttribute(_el$49, "data-tone", _p$.t = _v$24);
494
- _v$25 !== _p$.a && _$setAttribute(_el$49, "data-accent", _p$.a = _v$25);
495
- _v$26 !== _p$.o && _$setAttribute(_el$49, "data-busy", _p$.o = _v$26);
496
- _v$27 !== _p$.i && _$setAttribute(_el$49, "data-chat-anchor", _p$.i = _v$27);
497
- _p$.n = _$style(_el$49, _v$28, _p$.n);
498
- _v$29 !== _p$.s && _$setAttribute(_el$49, "aria-busy", _p$.s = _v$29);
485
+ var _v$24 = `k2b-chat-activity ${props.class ?? ""}`,
486
+ _v$25 = tone(),
487
+ _v$26 = props.accent ? "true" : undefined,
488
+ _v$27 = props.busy ? "true" : undefined,
489
+ _v$28 = props.anchorId !== undefined ? String(props.anchorId) : undefined,
490
+ _v$29 = style(),
491
+ _v$30 = props.busy ? "true" : undefined;
492
+ _v$24 !== _p$.e && _$className(_el$49, _p$.e = _v$24);
493
+ _v$25 !== _p$.t && _$setAttribute(_el$49, "data-tone", _p$.t = _v$25);
494
+ _v$26 !== _p$.a && _$setAttribute(_el$49, "data-accent", _p$.a = _v$26);
495
+ _v$27 !== _p$.o && _$setAttribute(_el$49, "data-busy", _p$.o = _v$27);
496
+ _v$28 !== _p$.i && _$setAttribute(_el$49, "data-chat-anchor", _p$.i = _v$28);
497
+ _p$.n = _$style(_el$49, _v$29, _p$.n);
498
+ _v$30 !== _p$.s && _$setAttribute(_el$49, "aria-busy", _p$.s = _v$30);
499
499
  return _p$;
500
500
  }, {
501
501
  e: undefined,
@@ -538,7 +538,8 @@ export function ChatActivity(props) {
538
538
  _v$19 = props.anchorId !== undefined ? String(props.anchorId) : undefined,
539
539
  _v$20 = style(),
540
540
  _v$21 = open(),
541
- _v$22 = props.busy ? "true" : undefined;
541
+ _v$22 = props.busy ? "true" : undefined,
542
+ _v$23 = props.ariaLabel;
542
543
  _v$14 !== _p$.e && _$className(_el$46, _p$.e = _v$14);
543
544
  _v$15 !== _p$.t && _$setAttribute(_el$46, "data-tone", _p$.t = _v$15);
544
545
  _v$16 !== _p$.a && _$setAttribute(_el$46, "data-accent", _p$.a = _v$16);
@@ -548,6 +549,7 @@ export function ChatActivity(props) {
548
549
  _p$.s = _$style(_el$46, _v$20, _p$.s);
549
550
  _v$21 !== _p$.h && _$setProperty(_el$46, "open", _p$.h = _v$21);
550
551
  _v$22 !== _p$.r && _$setAttribute(_el$46, "aria-busy", _p$.r = _v$22);
552
+ _v$23 !== _p$.d && _$setAttribute(_el$47, "aria-label", _p$.d = _v$23);
551
553
  return _p$;
552
554
  }, {
553
555
  e: undefined,
@@ -558,7 +560,8 @@ export function ChatActivity(props) {
558
560
  n: undefined,
559
561
  s: undefined,
560
562
  h: undefined,
561
- r: undefined
563
+ r: undefined,
564
+ d: undefined
562
565
  });
563
566
  return _el$46;
564
567
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/ChatPrimitives.tsx"],"sourcesContent":["import { createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { type UiMessages, useUiMessages } from \"../intl/messages\";\nimport { ProgressBar } from \"../surfaces/ProgressBar\";\nimport { ChatContextPanel, ChatContextPopup } from \"./ChatContextPopup\";\nimport { executeChatAction } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatContextUsageData, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageProps = {\n role: ChatRole;\n children?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n onActionError?: (error: unknown) => void;\n class?: string;\n};\n\nexport type ChatActivityProps = {\n label: string;\n description?: string;\n icon?: string;\n /** Optional host-owned leading visual rendered instead of the icon. */\n leading?: JSX.Element;\n /** Optional identity accent for the leading visual. Semantic tones still take precedence. */\n accent?: string;\n tone?: ChatActivityTone;\n /** Marks the activity as running with the shared accent sweep. */\n busy?: boolean;\n trailing?: JSX.Element;\n /** Controlled disclosure state. Omit to keep native details behavior. */\n open?: boolean;\n /** Reports disclosure changes when `open` is controlled by the host. */\n onOpenChange?: (open: boolean) => void;\n defaultOpen?: boolean;\n /** Set to false when the body is a peer list that should align with the activity row. */\n bodyInset?: boolean;\n anchorId?: string | number;\n children?: JSX.Element;\n /** Mount expensive details only while expanded. */\n renderBody?: () => JSX.Element;\n class?: string;\n};\n\nexport type ChatContextUsageProps = ChatContextUsageData & {\n action?: ChatAction;\n onActionError?: (error: unknown) => void;\n /** Host-owned number formatting. The default is locale-independent and SSR-stable. */\n formatNumber?: (value: number) => string;\n class?: string;\n};\n\nconst roleLabel = (role: ChatRole, messages: UiMessages): string => {\n if (role === \"assistant\") return messages.assistant;\n if (role === \"user\") return messages.user;\n if (role === \"tool\") return messages.tool;\n return messages.system;\n};\n\nconst statusLabel = (status: ChatMessageStatus | undefined, messages: UiMessages): string | null => {\n if (status === \"pending\") return messages.waiting;\n if (status === \"streaming\") return messages.generating;\n if (status === \"error\") return messages.failed;\n return null;\n};\n\nconst statusIcon = (status: ChatMessageStatus | undefined): string => {\n if (status === \"pending\") return \"ti ti-clock\";\n return \"ti ti-alert-circle\";\n};\n\nconst ChatProgressDots = () => (\n <span class=\"k2b-chat-progress-dots\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n);\n\nconst attachmentIcon = (attachment: ChatAttachment): string =>\n attachment.icon ?? (attachment.kind === \"image\" ? \"ti ti-photo\" : attachment.kind === \"resource\" ? \"ti ti-link\" : \"ti ti-file\");\n\nconst finiteNonNegative = (value: number | undefined): number =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : 0;\n\nconst finiteUsageValue = (value: number | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : null;\n\nconst normalizedUsage = (usage: ChatContextUsageData[\"usage\"]) => {\n const input = finiteUsageValue(usage?.input);\n const output = finiteUsageValue(usage?.output);\n const explicitTotal = finiteUsageValue(usage?.total);\n const total = explicitTotal ?? (input !== null || output !== null ? (input ?? 0) + (output ?? 0) : null);\n return { input, output, total, reported: total !== null };\n};\n\nconst formatStableInteger = (value: number): string => {\n const digits = String(Math.round(finiteNonNegative(value)));\n return digits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n};\n\nexport const formatChatTokens = (tokens: number): string => {\n const value = finiteNonNegative(tokens);\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n return String(Math.round(value));\n};\n\nconst dateTime = (value: string | Date | undefined): string | null => {\n if (!value) return null;\n const date = value instanceof Date ? value : new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : null;\n};\n\nexport function ChatMessage(props: ChatMessageProps): JSX.Element {\n const messages = useUiMessages();\n const [busyActionId, setBusyActionId] = createSignal<string | null>(null);\n const [completedActionId, setCompletedActionId] = createSignal<string | null>(null);\n let completedTimer: ReturnType<typeof setTimeout> | undefined;\n const status = () => statusLabel(props.status, messages());\n const timestamp = () => dateTime(props.createdAt);\n // Locale and timezone are application policy. Requiring an explicit visible\n // label keeps SSR and hydration byte-stable while `createdAt` still supplies\n // the semantic machine-readable timestamp.\n const time = () => props.timeLabel ?? null;\n const actions = () => props.actions ?? [];\n const actionDisplay = () =>\n props.actionDisplay === \"auto\" || !props.actionDisplay ? (props.role === \"user\" ? \"menu\" : \"inline\") : props.actionDisplay;\n const hasMeta = () => props.status === \"streaming\" || status() !== null || Boolean(time()) || actions().length > 0;\n\n const runAction = async (action: ChatAction) => {\n if (action.disabled || busyActionId()) return;\n setBusyActionId(action.id);\n try {\n await executeChatAction(action);\n setCompletedActionId(action.id);\n if (completedTimer) clearTimeout(completedTimer);\n completedTimer = setTimeout(() => setCompletedActionId(null), 1400);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusyActionId(null);\n }\n };\n\n const actionIcon = (action: ChatAction) =>\n busyActionId() === action.id\n ? \"ti ti-loader-2 k2b-spin\"\n : completedActionId() === action.id\n ? \"ti ti-check\"\n : (action.icon ?? \"ti ti-dots\");\n\n onCleanup(() => {\n if (completedTimer) clearTimeout(completedTimer);\n });\n\n const menuItems = (): readonly DropdownItem[] =>\n actions().map((action) => ({\n icon: actionIcon(action),\n label: action.label,\n variant: action.variant,\n disabled: action.disabled || Boolean(busyActionId()),\n action: () => void runAction(action),\n }));\n\n return (\n <article\n class={`k2b-chat-message ${props.class ?? \"\"}`}\n data-role={props.role}\n data-status={props.status ?? \"complete\"}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n aria-busy={props.status === \"pending\" || props.status === \"streaming\" ? \"true\" : undefined}\n >\n <span class=\"k2b-sr-only\">{props.label ?? roleLabel(props.role, messages())}: </span>\n <Show when={(props.attachments?.length ?? 0) > 0}>\n <div class=\"k2b-chat-message__attachments\" role=\"list\" aria-label={messages().attachments}>\n <For each={props.attachments}>\n {(attachment) => {\n // A preview that no longer loads, such as a deleted file, falls back to the attachment icon; a new URL tries again.\n const [failedPreviewUrl, setFailedPreviewUrl] = createSignal<string>();\n const content = () => (\n <>\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl && attachment.previewUrl !== failedPreviewUrl()}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img\n src={attachment.previewUrl}\n alt={attachment.alt ?? attachment.name}\n onError={() => setFailedPreviewUrl(attachment.previewUrl)}\n />\n </Show>\n <Show when={attachment.kind !== \"image\"}>\n <span>{attachment.name}</span>\n </Show>\n </>\n );\n return (\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-message__attachment\" data-kind={attachment.kind} role=\"listitem\" title={attachment.name}>\n {content()}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-message__attachment\"\n data-kind={attachment.kind}\n role=\"listitem\"\n title={attachment.name}\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={messages().openInNewTab({ name: attachment.name })}\n >\n {content()}\n </a>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n </Show>\n\n <Show when={props.children !== undefined && props.children !== null && props.children !== \"\"}>\n <div class=\"k2b-chat-message__bubble\">\n <div class=\"k2b-chat-message__content\">{props.children}</div>\n </div>\n </Show>\n\n <Show when={hasMeta()}>\n <footer class=\"k2b-chat-message__meta\">\n <Show\n when={props.status === \"streaming\"}\n fallback={\n <Show when={status()}>\n {(label) => (\n <span class=\"k2b-chat-message__status\" role={props.status === \"error\" ? \"alert\" : \"status\"}>\n <i class={statusIcon(props.status)} aria-hidden=\"true\" />\n {label()}\n </span>\n )}\n </Show>\n }\n >\n <span class=\"k2b-chat-message__status k2b-chat-message__status--streaming\" role=\"status\" aria-label={messages().generating}>\n <ChatProgressDots />\n </span>\n </Show>\n <Show when={time()}>{(label) => <time dateTime={timestamp() ?? undefined}>{label()}</time>}</Show>\n <Show when={actions().length > 0 && actionDisplay() === \"inline\"}>\n <span class=\"k2b-chat-message__actions\" role=\"group\" aria-label={messages().messageActions}>\n <For each={actions()}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n aria-label={action.label}\n aria-pressed={action.pressed}\n data-pressed-tone={action.pressedTone}\n content={action.label}\n data-danger={action.variant === \"danger\" ? \"true\" : undefined}\n disabled={action.disabled || Boolean(busyActionId())}\n onClick={() => void runAction(action)}\n >\n <i class={actionIcon(action)} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </span>\n </Show>\n <Show when={actions().length > 0 && actionDisplay() === \"menu\"}>\n <Dropdown.Root position=\"bottom-left\" label={messages().messageActions} items={menuItems()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-message__menu\"\n label={messages().messageActions}\n title={messages().messageActions}\n >\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </footer>\n </Show>\n </article>\n );\n}\n\nconst ActivityContent = (props: ChatActivityProps & { disclosure?: boolean }) => (\n <>\n <span class=\"k2b-chat-activity__leading\" aria-hidden=\"true\">\n <Show when={props.leading} fallback={<i class={props.icon ?? \"ti ti-sparkles\"} />}>\n {props.leading}\n </Show>\n </span>\n <span class=\"k2b-chat-activity__copy\">\n <strong>{props.label}</strong>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n <Show when={props.trailing}>\n <span class=\"k2b-chat-activity__trailing\">{props.trailing}</span>\n </Show>\n <Show when={props.disclosure}>\n <i class=\"ti ti-chevron-right k2b-chat-activity__chevron\" aria-hidden=\"true\" />\n </Show>\n </>\n);\n\nexport function ChatActivity(props: ChatActivityProps): JSX.Element {\n const [expanded, setExpanded] = createSignal(props.defaultOpen ?? false);\n const open = () => props.open ?? expanded();\n const tone = () => props.tone ?? \"neutral\";\n const style = () => (props.accent ? { \"--k2b-chat-activity-accent\": props.accent } : undefined);\n return (\n <Show\n when={props.renderBody || props.children}\n fallback={\n <div\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <div class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} />\n </div>\n </div>\n }\n >\n <details\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-body-inset={props.bodyInset === false ? \"false\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n open={open()}\n onToggle={(event) => {\n setExpanded(event.currentTarget.open);\n props.onOpenChange?.(event.currentTarget.open);\n }}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <summary class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} disclosure />\n </summary>\n <div class=\"k2b-chat-activity__body\">\n {props.renderBody ? <Show when={open() ? props.renderBody : undefined}>{(render) => render()()}</Show> : props.children}\n </div>\n </details>\n </Show>\n );\n}\n\nexport function ChatContextUsage(props: ChatContextUsageProps): JSX.Element {\n const [busy, setBusy] = createSignal(false);\n const run = async () => {\n const action = props.action;\n if (!action || action.disabled || busy()) return;\n setBusy(true);\n try {\n await executeChatAction(action);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusy(false);\n }\n };\n const messages = useUiMessages();\n const formatNumber = (value: number) => (props.formatNumber ?? formatStableInteger)(value);\n const formattedUsageValue = (value: number | null): string => (value === null ? messages().unknown : formatNumber(value));\n const usage = () => normalizedUsage(props.usage);\n const loopUsage = () => normalizedUsage(props.loopUsage);\n const total = () => usage().total ?? 0;\n const windowSize = () => finiteNonNegative(props.contextWindow);\n const reported = () => usage().reported;\n const percent = () => (reported() && windowSize() > 0 ? Math.min(100, Math.round((total() / windowSize()) * 100)) : null);\n const remaining = () => (reported() && windowSize() > 0 ? Math.max(0, windowSize() - total()) : null);\n const accessibleLabel = () => {\n if (!reported()) {\n return windowSize() > 0\n ? messages().contextUsageUnavailableWithWindow({ window: formatNumber(windowSize()) })\n : messages().contextUsageUnavailable;\n }\n return percent() === null\n ? messages().tokensUsed({ total: formatNumber(total()) })\n : messages().tokensUsedPercent({ total: formatNumber(total()), percent: percent()! });\n };\n\n return (\n <ChatContextPopup\n content={\n <ChatContextPanel title={messages().lastRequestContext}>\n <Show when={percent() !== null}>\n <ProgressBar\n value={percent() ?? 0}\n size=\"xs\"\n tone={(percent() ?? 0) >= 85 ? \"danger\" : \"info\"}\n label={messages().contextWindowUsed}\n />\n </Show>\n <dl>\n <Show when={props.modelLabel}>\n {(model) => (\n <div>\n <dt>{messages().model}</dt>\n <dd>{model()}</dd>\n </div>\n )}\n </Show>\n <div>\n <dt>{messages().input}</dt>\n <dd>{formattedUsageValue(usage().input)}</dd>\n </div>\n <div>\n <dt>{messages().output}</dt>\n <dd>{formattedUsageValue(usage().output)}</dd>\n </div>\n <Show when={loopUsage().reported}>\n <div>\n <dt>{messages().loopTotal}</dt>\n <dd>{formattedUsageValue(loopUsage().total)}</dd>\n </div>\n </Show>\n <div>\n <dt>{messages().window}</dt>\n <dd>{windowSize() > 0 ? formatNumber(windowSize()) : messages().notConfigured}</dd>\n </div>\n <Show when={remaining() !== null}>\n <div>\n <dt>{messages().remaining}</dt>\n <dd>{remaining() === null ? messages().unknown : formatNumber(remaining()!)}</dd>\n </div>\n </Show>\n </dl>\n <Show when={props.action}>\n {(action) => (\n <Button size=\"xs\" variant=\"subtle\" disabled={action().disabled || busy()} onClick={() => void run()} aria-busy={busy()}>\n <i class={busy() ? \"ti ti-loader-2 k2b-spin\" : action().icon} aria-hidden=\"true\" />\n {action().label}\n </Button>\n )}\n </Show>\n </ChatContextPanel>\n }\n type=\"button\"\n class={`k2b-chat-context ${props.class ?? \"\"}`}\n data-warning={reported() && (percent() ?? 0) >= 85 ? \"true\" : undefined}\n aria-label={accessibleLabel()}\n >\n <i class=\"ti ti-brain\" aria-hidden=\"true\" />\n <span>{percent() === null ? \"–\" : `${percent()}%`}</span>\n </ChatContextPopup>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/ChatPrimitives.tsx"],"sourcesContent":["import { createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { type UiMessages, useUiMessages } from \"../intl/messages\";\nimport { ProgressBar } from \"../surfaces/ProgressBar\";\nimport { ChatContextPanel, ChatContextPopup } from \"./ChatContextPopup\";\nimport { executeChatAction } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatContextUsageData, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageProps = {\n role: ChatRole;\n children?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n onActionError?: (error: unknown) => void;\n class?: string;\n};\n\nexport type ChatActivityProps = {\n label: string;\n /** Spelled-out name for an expandable row whose visible text abbreviates, such as durations. */\n ariaLabel?: string;\n description?: string;\n icon?: string;\n /** Optional host-owned leading visual rendered instead of the icon. */\n leading?: JSX.Element;\n /** Optional identity accent for the leading visual. Semantic tones still take precedence. */\n accent?: string;\n tone?: ChatActivityTone;\n /** Marks the activity as running with the shared accent sweep. */\n busy?: boolean;\n trailing?: JSX.Element;\n /** Controlled disclosure state. Omit to keep native details behavior. */\n open?: boolean;\n /** Reports disclosure changes when `open` is controlled by the host. */\n onOpenChange?: (open: boolean) => void;\n defaultOpen?: boolean;\n /** Set to false when the body is a peer list that should align with the activity row. */\n bodyInset?: boolean;\n anchorId?: string | number;\n children?: JSX.Element;\n /** Mount expensive details only while expanded. */\n renderBody?: () => JSX.Element;\n class?: string;\n};\n\nexport type ChatContextUsageProps = ChatContextUsageData & {\n action?: ChatAction;\n onActionError?: (error: unknown) => void;\n /** Host-owned number formatting. The default is locale-independent and SSR-stable. */\n formatNumber?: (value: number) => string;\n class?: string;\n};\n\nconst roleLabel = (role: ChatRole, messages: UiMessages): string => {\n if (role === \"assistant\") return messages.assistant;\n if (role === \"user\") return messages.user;\n if (role === \"tool\") return messages.tool;\n return messages.system;\n};\n\nconst statusLabel = (status: ChatMessageStatus | undefined, messages: UiMessages): string | null => {\n if (status === \"pending\") return messages.waiting;\n if (status === \"streaming\") return messages.generating;\n if (status === \"error\") return messages.failed;\n return null;\n};\n\nconst statusIcon = (status: ChatMessageStatus | undefined): string => {\n if (status === \"pending\") return \"ti ti-clock\";\n return \"ti ti-alert-circle\";\n};\n\nconst ChatProgressDots = () => (\n <span class=\"k2b-chat-progress-dots\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n);\n\nconst attachmentIcon = (attachment: ChatAttachment): string =>\n attachment.icon ?? (attachment.kind === \"image\" ? \"ti ti-photo\" : attachment.kind === \"resource\" ? \"ti ti-link\" : \"ti ti-file\");\n\nconst finiteNonNegative = (value: number | undefined): number =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : 0;\n\nconst finiteUsageValue = (value: number | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : null;\n\nconst normalizedUsage = (usage: ChatContextUsageData[\"usage\"]) => {\n const input = finiteUsageValue(usage?.input);\n const output = finiteUsageValue(usage?.output);\n const explicitTotal = finiteUsageValue(usage?.total);\n const total = explicitTotal ?? (input !== null || output !== null ? (input ?? 0) + (output ?? 0) : null);\n return { input, output, total, reported: total !== null };\n};\n\nconst formatStableInteger = (value: number): string => {\n const digits = String(Math.round(finiteNonNegative(value)));\n return digits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n};\n\nexport const formatChatTokens = (tokens: number): string => {\n const value = finiteNonNegative(tokens);\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n return String(Math.round(value));\n};\n\nconst dateTime = (value: string | Date | undefined): string | null => {\n if (!value) return null;\n const date = value instanceof Date ? value : new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : null;\n};\n\nexport function ChatMessage(props: ChatMessageProps): JSX.Element {\n const messages = useUiMessages();\n const [busyActionId, setBusyActionId] = createSignal<string | null>(null);\n const [completedActionId, setCompletedActionId] = createSignal<string | null>(null);\n let completedTimer: ReturnType<typeof setTimeout> | undefined;\n const status = () => statusLabel(props.status, messages());\n const timestamp = () => dateTime(props.createdAt);\n // Locale and timezone are application policy. Requiring an explicit visible\n // label keeps SSR and hydration byte-stable while `createdAt` still supplies\n // the semantic machine-readable timestamp.\n const time = () => props.timeLabel ?? null;\n const actions = () => props.actions ?? [];\n const actionDisplay = () =>\n props.actionDisplay === \"auto\" || !props.actionDisplay ? (props.role === \"user\" ? \"menu\" : \"inline\") : props.actionDisplay;\n const hasMeta = () => props.status === \"streaming\" || status() !== null || Boolean(time()) || actions().length > 0;\n\n const runAction = async (action: ChatAction) => {\n if (action.disabled || busyActionId()) return;\n setBusyActionId(action.id);\n try {\n await executeChatAction(action);\n setCompletedActionId(action.id);\n if (completedTimer) clearTimeout(completedTimer);\n completedTimer = setTimeout(() => setCompletedActionId(null), 1400);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusyActionId(null);\n }\n };\n\n const actionIcon = (action: ChatAction) =>\n busyActionId() === action.id\n ? \"ti ti-loader-2 k2b-spin\"\n : completedActionId() === action.id\n ? \"ti ti-check\"\n : (action.icon ?? \"ti ti-dots\");\n\n onCleanup(() => {\n if (completedTimer) clearTimeout(completedTimer);\n });\n\n const menuItems = (): readonly DropdownItem[] =>\n actions().map((action) => ({\n icon: actionIcon(action),\n label: action.label,\n variant: action.variant,\n disabled: action.disabled || Boolean(busyActionId()),\n action: () => void runAction(action),\n }));\n\n return (\n <article\n class={`k2b-chat-message ${props.class ?? \"\"}`}\n data-role={props.role}\n data-status={props.status ?? \"complete\"}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n aria-busy={props.status === \"pending\" || props.status === \"streaming\" ? \"true\" : undefined}\n >\n <span class=\"k2b-sr-only\">{props.label ?? roleLabel(props.role, messages())}: </span>\n <Show when={(props.attachments?.length ?? 0) > 0}>\n <div class=\"k2b-chat-message__attachments\" role=\"list\" aria-label={messages().attachments}>\n <For each={props.attachments}>\n {(attachment) => {\n // A preview that no longer loads, such as a deleted file, falls back to the attachment icon; a new URL tries again.\n const [failedPreviewUrl, setFailedPreviewUrl] = createSignal<string>();\n const content = () => (\n <>\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl && attachment.previewUrl !== failedPreviewUrl()}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img\n src={attachment.previewUrl}\n alt={attachment.alt ?? attachment.name}\n onError={() => setFailedPreviewUrl(attachment.previewUrl)}\n />\n </Show>\n <Show when={attachment.kind !== \"image\"}>\n <span>{attachment.name}</span>\n </Show>\n </>\n );\n return (\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-message__attachment\" data-kind={attachment.kind} role=\"listitem\" title={attachment.name}>\n {content()}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-message__attachment\"\n data-kind={attachment.kind}\n role=\"listitem\"\n title={attachment.name}\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={messages().openInNewTab({ name: attachment.name })}\n >\n {content()}\n </a>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n </Show>\n\n <Show when={props.children !== undefined && props.children !== null && props.children !== \"\"}>\n <div class=\"k2b-chat-message__bubble\">\n <div class=\"k2b-chat-message__content\">{props.children}</div>\n </div>\n </Show>\n\n <Show when={hasMeta()}>\n <footer class=\"k2b-chat-message__meta\">\n <Show\n when={props.status === \"streaming\"}\n fallback={\n <Show when={status()}>\n {(label) => (\n <span class=\"k2b-chat-message__status\" role={props.status === \"error\" ? \"alert\" : \"status\"}>\n <i class={statusIcon(props.status)} aria-hidden=\"true\" />\n {label()}\n </span>\n )}\n </Show>\n }\n >\n <span class=\"k2b-chat-message__status k2b-chat-message__status--streaming\" role=\"status\" aria-label={messages().generating}>\n <ChatProgressDots />\n </span>\n </Show>\n <Show when={time()}>{(label) => <time dateTime={timestamp() ?? undefined}>{label()}</time>}</Show>\n <Show when={actions().length > 0 && actionDisplay() === \"inline\"}>\n <span class=\"k2b-chat-message__actions\" role=\"group\" aria-label={messages().messageActions}>\n <For each={actions()}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n aria-label={action.label}\n aria-pressed={action.pressed}\n data-pressed-tone={action.pressedTone}\n content={action.label}\n data-danger={action.variant === \"danger\" ? \"true\" : undefined}\n disabled={action.disabled || Boolean(busyActionId())}\n onClick={() => void runAction(action)}\n >\n <i class={actionIcon(action)} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </span>\n </Show>\n <Show when={actions().length > 0 && actionDisplay() === \"menu\"}>\n <Dropdown.Root position=\"bottom-left\" label={messages().messageActions} items={menuItems()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-message__menu\"\n label={messages().messageActions}\n title={messages().messageActions}\n >\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </footer>\n </Show>\n </article>\n );\n}\n\nconst ActivityContent = (props: ChatActivityProps & { disclosure?: boolean }) => (\n <>\n <span class=\"k2b-chat-activity__leading\" aria-hidden=\"true\">\n <Show when={props.leading} fallback={<i class={props.icon ?? \"ti ti-sparkles\"} />}>\n {props.leading}\n </Show>\n </span>\n <span class=\"k2b-chat-activity__copy\">\n <strong>{props.label}</strong>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n <Show when={props.trailing}>\n <span class=\"k2b-chat-activity__trailing\">{props.trailing}</span>\n </Show>\n <Show when={props.disclosure}>\n <i class=\"ti ti-chevron-right k2b-chat-activity__chevron\" aria-hidden=\"true\" />\n </Show>\n </>\n);\n\nexport function ChatActivity(props: ChatActivityProps): JSX.Element {\n const [expanded, setExpanded] = createSignal(props.defaultOpen ?? false);\n const open = () => props.open ?? expanded();\n const tone = () => props.tone ?? \"neutral\";\n const style = () => (props.accent ? { \"--k2b-chat-activity-accent\": props.accent } : undefined);\n return (\n <Show\n when={props.renderBody || props.children}\n fallback={\n <div\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <div class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} />\n </div>\n </div>\n }\n >\n <details\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-body-inset={props.bodyInset === false ? \"false\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n open={open()}\n onToggle={(event) => {\n setExpanded(event.currentTarget.open);\n props.onOpenChange?.(event.currentTarget.open);\n }}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <summary class=\"k2b-chat-activity__row\" aria-label={props.ariaLabel}>\n <ActivityContent {...props} disclosure />\n </summary>\n <div class=\"k2b-chat-activity__body\">\n {props.renderBody ? <Show when={open() ? props.renderBody : undefined}>{(render) => render()()}</Show> : props.children}\n </div>\n </details>\n </Show>\n );\n}\n\nexport function ChatContextUsage(props: ChatContextUsageProps): JSX.Element {\n const [busy, setBusy] = createSignal(false);\n const run = async () => {\n const action = props.action;\n if (!action || action.disabled || busy()) return;\n setBusy(true);\n try {\n await executeChatAction(action);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusy(false);\n }\n };\n const messages = useUiMessages();\n const formatNumber = (value: number) => (props.formatNumber ?? formatStableInteger)(value);\n const formattedUsageValue = (value: number | null): string => (value === null ? messages().unknown : formatNumber(value));\n const usage = () => normalizedUsage(props.usage);\n const loopUsage = () => normalizedUsage(props.loopUsage);\n const total = () => usage().total ?? 0;\n const windowSize = () => finiteNonNegative(props.contextWindow);\n const reported = () => usage().reported;\n const percent = () => (reported() && windowSize() > 0 ? Math.min(100, Math.round((total() / windowSize()) * 100)) : null);\n const remaining = () => (reported() && windowSize() > 0 ? Math.max(0, windowSize() - total()) : null);\n const accessibleLabel = () => {\n if (!reported()) {\n return windowSize() > 0\n ? messages().contextUsageUnavailableWithWindow({ window: formatNumber(windowSize()) })\n : messages().contextUsageUnavailable;\n }\n return percent() === null\n ? messages().tokensUsed({ total: formatNumber(total()) })\n : messages().tokensUsedPercent({ total: formatNumber(total()), percent: percent()! });\n };\n\n return (\n <ChatContextPopup\n content={\n <ChatContextPanel title={messages().lastRequestContext}>\n <Show when={percent() !== null}>\n <ProgressBar\n value={percent() ?? 0}\n size=\"xs\"\n tone={(percent() ?? 0) >= 85 ? \"danger\" : \"info\"}\n label={messages().contextWindowUsed}\n />\n </Show>\n <dl>\n <Show when={props.modelLabel}>\n {(model) => (\n <div>\n <dt>{messages().model}</dt>\n <dd>{model()}</dd>\n </div>\n )}\n </Show>\n <div>\n <dt>{messages().input}</dt>\n <dd>{formattedUsageValue(usage().input)}</dd>\n </div>\n <div>\n <dt>{messages().output}</dt>\n <dd>{formattedUsageValue(usage().output)}</dd>\n </div>\n <Show when={loopUsage().reported}>\n <div>\n <dt>{messages().loopTotal}</dt>\n <dd>{formattedUsageValue(loopUsage().total)}</dd>\n </div>\n </Show>\n <div>\n <dt>{messages().window}</dt>\n <dd>{windowSize() > 0 ? formatNumber(windowSize()) : messages().notConfigured}</dd>\n </div>\n <Show when={remaining() !== null}>\n <div>\n <dt>{messages().remaining}</dt>\n <dd>{remaining() === null ? messages().unknown : formatNumber(remaining()!)}</dd>\n </div>\n </Show>\n </dl>\n <Show when={props.action}>\n {(action) => (\n <Button size=\"xs\" variant=\"subtle\" disabled={action().disabled || busy()} onClick={() => void run()} aria-busy={busy()}>\n <i class={busy() ? \"ti ti-loader-2 k2b-spin\" : action().icon} aria-hidden=\"true\" />\n {action().label}\n </Button>\n )}\n </Show>\n </ChatContextPanel>\n }\n type=\"button\"\n class={`k2b-chat-context ${props.class ?? \"\"}`}\n data-warning={reported() && (percent() ?? 0) >= 85 ? \"true\" : undefined}\n aria-label={accessibleLabel()}\n >\n <i class=\"ti ti-brain\" aria-hidden=\"true\" />\n <span>{percent() === null ? \"–\" : `${percent()}%`}</span>\n </ChatContextPopup>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -17,7 +17,7 @@ var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-chat-timeline__navigation a
17
17
  _tmpl$5 = /*#__PURE__*/_$template(`<section><div class=k2b-chat-timeline__viewport data-initializing role=region tabindex=0><!$><!/><div class=k2b-chat-timeline__content role=log aria-live=polite aria-relevant="additions text"><div class=k2b-chat-timeline__sentinel aria-hidden=true></div><!$><!/><!$><!/></div></div><!$><!/>`),
18
18
  _tmpl$6 = /*#__PURE__*/_$template(`<i class="ti ti-loader-2 k2b-spin"aria-hidden=true>`),
19
19
  _tmpl$7 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__retry><i class="ti ti-refresh"aria-hidden=true>`);
20
- import { createEffect, createSignal, For, onCleanup, onMount, Show, untrack } from "solid-js";
20
+ import { createEffect, createMemo, createSignal, For, onCleanup, onMount, Show, untrack } from "solid-js";
21
21
  import { useUiMessages } from "../intl/messages";
22
22
  import { createScrollFade } from "../layout/scroll-fade";
23
23
  import Placeholder from "../surfaces/Placeholder";
@@ -41,6 +41,10 @@ export function ChatTimeline(props) {
41
41
  const canLoadOlder = () => Boolean(props.onLoadOlder && props.hasMore && !loadingOlder());
42
42
  const hasHistoryControls = () => loadingOlder() || historyError() !== null || canLoadOlder();
43
43
  const hasContent = () => props.items.length > 0;
44
+ const itemIds = createMemo(() => props.items.map(item => item.id), undefined, {
45
+ equals: (previous, next) => previous.length === next.length && previous.every((id, index) => id === next[index])
46
+ });
47
+ const itemsById = createMemo(() => new Map(props.items.map(item => [item.id, item])));
44
48
  const threshold = () => Math.max(0, props.followThreshold ?? 96);
45
49
  const cancelFollow = () => {
46
50
  if (followFrame !== undefined) cancelAnimationFrame(followFrame);
@@ -289,93 +293,112 @@ export function ChatTimeline(props) {
289
293
  get children() {
290
294
  return _$createComponent(For, {
291
295
  get each() {
292
- return props.items;
296
+ return itemIds();
293
297
  },
294
- children: item => _$createComponent(Show, {
295
- get when() {
296
- return item.kind === "message";
297
- },
298
- get fallback() {
299
- return _$createComponent(ChatActivity, {
300
- get label() {
301
- return item.label;
302
- },
303
- get description() {
304
- return item.description;
305
- },
306
- get icon() {
307
- return item.icon;
308
- },
309
- get leading() {
310
- return item.leading;
311
- },
312
- get accent() {
313
- return item.accent;
314
- },
315
- get tone() {
316
- return item.tone;
317
- },
318
- get busy() {
319
- return item.busy;
320
- },
321
- get trailing() {
322
- return item.trailing;
323
- },
324
- get defaultOpen() {
325
- return item.defaultOpen;
326
- },
327
- get anchorId() {
328
- return item.anchorId;
329
- },
330
- get ["class"]() {
331
- return item.class;
332
- },
333
- get children() {
334
- return item.content;
335
- }
336
- });
337
- },
338
- get children() {
339
- return _$createComponent(ChatMessage, {
340
- get role() {
341
- return item.role;
342
- },
343
- get label() {
344
- return item.label;
345
- },
346
- get createdAt() {
347
- return item.createdAt;
348
- },
349
- get timeLabel() {
350
- return item.timeLabel;
351
- },
352
- get status() {
353
- return item.status;
354
- },
355
- get attachments() {
356
- return item.attachments;
357
- },
358
- get actions() {
359
- return item.actions;
360
- },
361
- get actionDisplay() {
362
- return item.actionDisplay;
363
- },
364
- get anchorId() {
365
- return item.anchorId;
366
- },
367
- get onActionError() {
368
- return props.onActionError;
369
- },
370
- get ["class"]() {
371
- return item.class;
372
- },
373
- get children() {
374
- return item.content;
375
- }
376
- });
377
- }
378
- })
298
+ children: id => {
299
+ // A row is keyed by its id, so an updated record with the same id keeps its DOM and component state.
300
+ const item = () => itemsById().get(id);
301
+ const message = () => {
302
+ const value = item();
303
+ return value?.kind === "message" ? value : undefined;
304
+ };
305
+ const activity = () => {
306
+ const value = item();
307
+ return value?.kind === "activity" ? value : undefined;
308
+ };
309
+ return _$createComponent(Show, {
310
+ get when() {
311
+ return message() !== undefined;
312
+ },
313
+ get fallback() {
314
+ return _$createComponent(Show, {
315
+ get when() {
316
+ return activity() !== undefined;
317
+ },
318
+ get children() {
319
+ return _$createComponent(ChatActivity, {
320
+ get label() {
321
+ return activity().label;
322
+ },
323
+ get description() {
324
+ return activity().description;
325
+ },
326
+ get icon() {
327
+ return activity().icon;
328
+ },
329
+ get leading() {
330
+ return activity().leading;
331
+ },
332
+ get accent() {
333
+ return activity().accent;
334
+ },
335
+ get tone() {
336
+ return activity().tone;
337
+ },
338
+ get busy() {
339
+ return activity().busy;
340
+ },
341
+ get trailing() {
342
+ return activity().trailing;
343
+ },
344
+ get defaultOpen() {
345
+ return activity().defaultOpen;
346
+ },
347
+ get anchorId() {
348
+ return activity().anchorId;
349
+ },
350
+ get ["class"]() {
351
+ return activity().class;
352
+ },
353
+ get children() {
354
+ return activity().content;
355
+ }
356
+ });
357
+ }
358
+ });
359
+ },
360
+ get children() {
361
+ return _$createComponent(ChatMessage, {
362
+ get role() {
363
+ return message().role;
364
+ },
365
+ get label() {
366
+ return message().label;
367
+ },
368
+ get createdAt() {
369
+ return message().createdAt;
370
+ },
371
+ get timeLabel() {
372
+ return message().timeLabel;
373
+ },
374
+ get status() {
375
+ return message().status;
376
+ },
377
+ get attachments() {
378
+ return message().attachments;
379
+ },
380
+ get actions() {
381
+ return message().actions;
382
+ },
383
+ get actionDisplay() {
384
+ return message().actionDisplay;
385
+ },
386
+ get anchorId() {
387
+ return message().anchorId;
388
+ },
389
+ get onActionError() {
390
+ return props.onActionError;
391
+ },
392
+ get ["class"]() {
393
+ return message().class;
394
+ },
395
+ get children() {
396
+ return message().content;
397
+ }
398
+ });
399
+ }
400
+ });
401
+ }
379
402
  });
380
403
  }
381
404
  }), _el$18, _co$6);
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { createScrollFade } from \"../layout/scroll-fade\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { ChatActivity, ChatMessage } from \"./ChatPrimitives\";\nimport { isChatNearBottom, restoredChatScrollTop } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageItem = {\n kind: \"message\";\n id: string;\n role: ChatRole;\n content?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n class?: string;\n};\n\nexport type ChatActivityItem = {\n kind: \"activity\";\n id: string;\n label: string;\n description?: string;\n icon?: string;\n leading?: JSX.Element;\n accent?: string;\n tone?: ChatActivityTone;\n busy?: boolean;\n trailing?: JSX.Element;\n defaultOpen?: boolean;\n anchorId?: string | number;\n content?: JSX.Element;\n class?: string;\n};\n\nexport type ChatTimelineItem = ChatMessageItem | ChatActivityItem;\n\nexport type ChatTimelineProps = {\n scrollFade?: boolean;\n items: readonly ChatTimelineItem[];\n conversationKey?: string | null;\n loading?: boolean;\n hasMore?: boolean;\n loadingOlder?: boolean;\n onLoadOlder?: () => boolean | void | Promise<boolean | void>;\n emptyTitle?: string;\n emptyDescription?: string;\n navigation?: JSX.Element;\n onActionError?: (error: unknown) => void;\n viewportRef?: (element: HTMLDivElement) => void;\n contentRef?: (element: HTMLDivElement) => void;\n scrollToAnchorRef?: (scrollToAnchor: (anchorId: string | number) => boolean) => void;\n label?: string;\n followThreshold?: number;\n class?: string;\n};\n\nexport function ChatTimeline(props: ChatTimelineProps): JSX.Element {\n const messages = useUiMessages();\n const [pinned, setPinned] = createSignal(true);\n const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);\n const [historyError, setHistoryError] = createSignal<string | null>(null);\n let viewportRef: HTMLDivElement | undefined;\n createScrollFade(\n () => viewportRef,\n () => props.scrollFade !== false,\n );\n let contentRef: HTMLDivElement | undefined;\n let topSentinelRef: HTMLDivElement | undefined;\n let followFrame: number | undefined;\n let userScrollFrame: number | undefined;\n let userScrollingAway = false;\n let touchY: number | undefined;\n let lastConversationKey: string | null | undefined;\n\n const loadingOlder = () => Boolean(props.loadingOlder || loadingOlderInternally());\n const canLoadOlder = () => Boolean(props.onLoadOlder && props.hasMore && !loadingOlder());\n const hasHistoryControls = () => loadingOlder() || historyError() !== null || canLoadOlder();\n const hasContent = () => props.items.length > 0;\n const threshold = () => Math.max(0, props.followThreshold ?? 96);\n\n const cancelFollow = () => {\n if (followFrame !== undefined) cancelAnimationFrame(followFrame);\n followFrame = undefined;\n };\n\n props.scrollToAnchorRef?.((anchorId) => {\n const anchor = Array.from(contentRef?.querySelectorAll<HTMLElement>(\"[data-chat-anchor]\") ?? []).find(\n (element) => element.dataset.chatAnchor === String(anchorId),\n );\n if (!viewportRef || !anchor) return false;\n cancelFollow();\n setPinned(false);\n viewportRef.scrollTop = Math.max(\n 0,\n viewportRef.scrollTop + anchor.getBoundingClientRect().top - viewportRef.getBoundingClientRect().top - 16,\n );\n return true;\n });\n\n const noteUserScrollAway = () => {\n userScrollingAway = true;\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n userScrollFrame = requestAnimationFrame(() => {\n userScrollFrame = undefined;\n userScrollingAway = false;\n });\n };\n\n const scrollToLatest = () => {\n if (!viewportRef) return;\n setPinned(true);\n viewportRef.scrollTop = viewportRef.scrollHeight;\n };\n\n const scheduleFollow = () => {\n if (!pinned() || followFrame !== undefined) return;\n followFrame = requestAnimationFrame(() => {\n followFrame = undefined;\n if (pinned()) scrollToLatest();\n });\n };\n\n const loadOlder = async () => {\n if (!props.onLoadOlder || !props.hasMore || loadingOlder()) return;\n const viewport = viewportRef;\n if (!viewport) return;\n const previousScrollTop = viewport.scrollTop;\n const previousScrollHeight = viewport.scrollHeight;\n setHistoryError(null);\n setLoadingOlderInternally(true);\n let prepended = false;\n try {\n prepended = (await props.onLoadOlder()) !== false;\n } catch (error) {\n setHistoryError(error instanceof Error ? error.message : messages().couldNotLoadOlderMessages);\n } finally {\n setLoadingOlderInternally(false);\n }\n if (!prepended || viewportRef !== viewport) return;\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n if (viewportRef !== viewport) return;\n viewport.scrollTop = restoredChatScrollTop(previousScrollTop, previousScrollHeight, viewport.scrollHeight);\n });\n });\n };\n\n const updatePinned = () => {\n if (!viewportRef) return;\n const nearBottom = isChatNearBottom(viewportRef.scrollHeight, viewportRef.scrollTop, viewportRef.clientHeight, threshold());\n if (nearBottom) setPinned(true);\n else if (userScrollingAway || followFrame === undefined) {\n if (userScrollingAway) cancelFollow();\n setPinned(false);\n }\n if (viewportRef.scrollTop <= threshold()) void loadOlder();\n };\n\n onMount(() => {\n // Switch from CSS-only SSR anchoring to normal scroll coordinates before paint.\n viewportRef?.removeAttribute(\"data-initializing\");\n scrollToLatest();\n const resizeObserver = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(() => scheduleFollow());\n if (contentRef) resizeObserver?.observe(contentRef);\n if (viewportRef) resizeObserver?.observe(viewportRef);\n\n const historyObserver =\n typeof IntersectionObserver === \"undefined\" || !topSentinelRef\n ? null\n : new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) void loadOlder();\n },\n { root: viewportRef, rootMargin: \"160px 0px 0px\" },\n );\n if (topSentinelRef) historyObserver?.observe(topSentinelRef);\n\n onCleanup(() => {\n cancelFollow();\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n resizeObserver?.disconnect();\n historyObserver?.disconnect();\n });\n });\n\n createEffect(() => {\n const key = props.conversationKey;\n if (key === lastConversationKey) return;\n lastConversationKey = key;\n setHistoryError(null);\n setPinned(true);\n queueMicrotask(scrollToLatest);\n });\n\n createEffect(() => {\n props.items.length;\n props.items.at(-1)?.id;\n untrack(scheduleFollow);\n });\n\n return (\n <section class={`k2b-chat-timeline ${props.class ?? \"\"}`} aria-label={props.label ?? messages().conversation}>\n <div\n ref={(element) => {\n viewportRef = element;\n props.viewportRef?.(element);\n }}\n class=\"k2b-chat-timeline__viewport\"\n data-scroll-fade-mode={props.scrollFade !== false ? \"bottom\" : undefined}\n data-initializing=\"\"\n role=\"region\"\n aria-label={messages().conversationMessages({ label: props.label ?? messages().conversation })}\n tabIndex={0}\n onWheel={(event) => {\n if (event.deltaY < 0) noteUserScrollAway();\n }}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \"ArrowUp\" || event.key === \"PageUp\" || event.key === \"Home\" || (event.key === \" \" && event.shiftKey)) {\n noteUserScrollAway();\n }\n }}\n onTouchStart={(event) => {\n touchY = event.touches[0]?.clientY;\n }}\n onTouchMove={(event) => {\n const nextY = event.touches[0]?.clientY;\n if (nextY !== undefined && touchY !== undefined && nextY > touchY) noteUserScrollAway();\n touchY = nextY;\n }}\n onTouchEnd={() => {\n touchY = undefined;\n }}\n onScroll={updatePinned}\n >\n <Show when={props.navigation}>\n <div class=\"k2b-chat-timeline__navigation\" aria-live=\"off\">\n {props.navigation}\n </div>\n </Show>\n <div\n ref={(element) => {\n contentRef = element;\n props.contentRef?.(element);\n }}\n class=\"k2b-chat-timeline__content\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n aria-busy={props.loading ? \"true\" : undefined}\n >\n <div ref={topSentinelRef} class=\"k2b-chat-timeline__sentinel\" aria-hidden=\"true\" />\n <Show when={hasHistoryControls()}>\n <div class=\"k2b-chat-timeline__history\" aria-live=\"off\">\n <Show when={canLoadOlder()}>\n <button type=\"button\" class=\"k2b-chat-timeline__older\" onClick={() => void loadOlder()}>\n <i class=\"ti ti-history\" aria-hidden=\"true\" />\n {messages().loadOlderMessages}\n </button>\n </Show>\n <Show when={loadingOlder()}>\n <ChatActivity\n label={messages().loadingOlderMessages}\n icon=\"ti ti-history\"\n trailing={<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />}\n />\n </Show>\n <Show when={historyError()}>\n {(message) => (\n <ChatActivity\n label={messages().couldNotLoadOlderMessages}\n description={message()}\n icon=\"ti ti-alert-circle\"\n tone=\"danger\"\n trailing={\n <button\n type=\"button\"\n class=\"k2b-chat-timeline__retry\"\n aria-label={messages().retryOlderMessages}\n onClick={() => void loadOlder()}\n >\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n </button>\n }\n />\n )}\n </Show>\n </div>\n </Show>\n <Show\n when={!props.loading && hasContent()}\n fallback={\n <Placeholder\n class=\"k2b-chat-timeline__placeholder\"\n state={props.loading ? \"loading\" : \"empty\"}\n icon={props.loading ? undefined : \"ti ti-sparkles\"}\n title={props.loading ? messages().loadingConversation : (props.emptyTitle ?? messages().startConversation)}\n description={!props.loading ? props.emptyDescription : undefined}\n />\n }\n >\n <For each={props.items}>\n {(item) => (\n <Show\n when={item.kind === \"message\"}\n fallback={\n <ChatActivity\n label={(item as ChatActivityItem).label}\n description={(item as ChatActivityItem).description}\n icon={(item as ChatActivityItem).icon}\n leading={(item as ChatActivityItem).leading}\n accent={(item as ChatActivityItem).accent}\n tone={(item as ChatActivityItem).tone}\n busy={(item as ChatActivityItem).busy}\n trailing={(item as ChatActivityItem).trailing}\n defaultOpen={(item as ChatActivityItem).defaultOpen}\n anchorId={(item as ChatActivityItem).anchorId}\n class={(item as ChatActivityItem).class}\n >\n {(item as ChatActivityItem).content}\n </ChatActivity>\n }\n >\n <ChatMessage\n role={(item as ChatMessageItem).role}\n label={(item as ChatMessageItem).label}\n createdAt={(item as ChatMessageItem).createdAt}\n timeLabel={(item as ChatMessageItem).timeLabel}\n status={(item as ChatMessageItem).status}\n attachments={(item as ChatMessageItem).attachments}\n actions={(item as ChatMessageItem).actions}\n actionDisplay={(item as ChatMessageItem).actionDisplay}\n anchorId={(item as ChatMessageItem).anchorId}\n onActionError={props.onActionError}\n class={(item as ChatMessageItem).class}\n >\n {(item as ChatMessageItem).content}\n </ChatMessage>\n </Show>\n )}\n </For>\n </Show>\n </div>\n </div>\n <Show when={!pinned() && hasContent()}>\n <button type=\"button\" class=\"k2b-chat-timeline__latest\" onClick={scrollToLatest}>\n <i class=\"ti ti-arrow-down\" aria-hidden=\"true\" />\n {messages().jumpToLatest}\n </button>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { createScrollFade } from \"../layout/scroll-fade\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { ChatActivity, ChatMessage } from \"./ChatPrimitives\";\nimport { isChatNearBottom, restoredChatScrollTop } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageItem = {\n kind: \"message\";\n /** Unique within the timeline. A record with a known id updates its row in place instead of replacing it. */\n id: string;\n role: ChatRole;\n content?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n class?: string;\n};\n\nexport type ChatActivityItem = {\n kind: \"activity\";\n /** Unique within the timeline. A record with a known id updates its row in place instead of replacing it. */\n id: string;\n label: string;\n description?: string;\n icon?: string;\n leading?: JSX.Element;\n accent?: string;\n tone?: ChatActivityTone;\n busy?: boolean;\n trailing?: JSX.Element;\n defaultOpen?: boolean;\n anchorId?: string | number;\n content?: JSX.Element;\n class?: string;\n};\n\nexport type ChatTimelineItem = ChatMessageItem | ChatActivityItem;\n\nexport type ChatTimelineProps = {\n scrollFade?: boolean;\n items: readonly ChatTimelineItem[];\n conversationKey?: string | null;\n loading?: boolean;\n hasMore?: boolean;\n loadingOlder?: boolean;\n onLoadOlder?: () => boolean | void | Promise<boolean | void>;\n emptyTitle?: string;\n emptyDescription?: string;\n navigation?: JSX.Element;\n onActionError?: (error: unknown) => void;\n viewportRef?: (element: HTMLDivElement) => void;\n contentRef?: (element: HTMLDivElement) => void;\n scrollToAnchorRef?: (scrollToAnchor: (anchorId: string | number) => boolean) => void;\n label?: string;\n followThreshold?: number;\n class?: string;\n};\n\nexport function ChatTimeline(props: ChatTimelineProps): JSX.Element {\n const messages = useUiMessages();\n const [pinned, setPinned] = createSignal(true);\n const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);\n const [historyError, setHistoryError] = createSignal<string | null>(null);\n let viewportRef: HTMLDivElement | undefined;\n createScrollFade(\n () => viewportRef,\n () => props.scrollFade !== false,\n );\n let contentRef: HTMLDivElement | undefined;\n let topSentinelRef: HTMLDivElement | undefined;\n let followFrame: number | undefined;\n let userScrollFrame: number | undefined;\n let userScrollingAway = false;\n let touchY: number | undefined;\n let lastConversationKey: string | null | undefined;\n\n const loadingOlder = () => Boolean(props.loadingOlder || loadingOlderInternally());\n const canLoadOlder = () => Boolean(props.onLoadOlder && props.hasMore && !loadingOlder());\n const hasHistoryControls = () => loadingOlder() || historyError() !== null || canLoadOlder();\n const hasContent = () => props.items.length > 0;\n const itemIds = createMemo(() => props.items.map((item) => item.id), undefined, {\n equals: (previous, next) => previous.length === next.length && previous.every((id, index) => id === next[index]),\n });\n const itemsById = createMemo(() => new Map(props.items.map((item) => [item.id, item])));\n const threshold = () => Math.max(0, props.followThreshold ?? 96);\n\n const cancelFollow = () => {\n if (followFrame !== undefined) cancelAnimationFrame(followFrame);\n followFrame = undefined;\n };\n\n props.scrollToAnchorRef?.((anchorId) => {\n const anchor = Array.from(contentRef?.querySelectorAll<HTMLElement>(\"[data-chat-anchor]\") ?? []).find(\n (element) => element.dataset.chatAnchor === String(anchorId),\n );\n if (!viewportRef || !anchor) return false;\n cancelFollow();\n setPinned(false);\n viewportRef.scrollTop = Math.max(\n 0,\n viewportRef.scrollTop + anchor.getBoundingClientRect().top - viewportRef.getBoundingClientRect().top - 16,\n );\n return true;\n });\n\n const noteUserScrollAway = () => {\n userScrollingAway = true;\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n userScrollFrame = requestAnimationFrame(() => {\n userScrollFrame = undefined;\n userScrollingAway = false;\n });\n };\n\n const scrollToLatest = () => {\n if (!viewportRef) return;\n setPinned(true);\n viewportRef.scrollTop = viewportRef.scrollHeight;\n };\n\n const scheduleFollow = () => {\n if (!pinned() || followFrame !== undefined) return;\n followFrame = requestAnimationFrame(() => {\n followFrame = undefined;\n if (pinned()) scrollToLatest();\n });\n };\n\n const loadOlder = async () => {\n if (!props.onLoadOlder || !props.hasMore || loadingOlder()) return;\n const viewport = viewportRef;\n if (!viewport) return;\n const previousScrollTop = viewport.scrollTop;\n const previousScrollHeight = viewport.scrollHeight;\n setHistoryError(null);\n setLoadingOlderInternally(true);\n let prepended = false;\n try {\n prepended = (await props.onLoadOlder()) !== false;\n } catch (error) {\n setHistoryError(error instanceof Error ? error.message : messages().couldNotLoadOlderMessages);\n } finally {\n setLoadingOlderInternally(false);\n }\n if (!prepended || viewportRef !== viewport) return;\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n if (viewportRef !== viewport) return;\n viewport.scrollTop = restoredChatScrollTop(previousScrollTop, previousScrollHeight, viewport.scrollHeight);\n });\n });\n };\n\n const updatePinned = () => {\n if (!viewportRef) return;\n const nearBottom = isChatNearBottom(viewportRef.scrollHeight, viewportRef.scrollTop, viewportRef.clientHeight, threshold());\n if (nearBottom) setPinned(true);\n else if (userScrollingAway || followFrame === undefined) {\n if (userScrollingAway) cancelFollow();\n setPinned(false);\n }\n if (viewportRef.scrollTop <= threshold()) void loadOlder();\n };\n\n onMount(() => {\n // Switch from CSS-only SSR anchoring to normal scroll coordinates before paint.\n viewportRef?.removeAttribute(\"data-initializing\");\n scrollToLatest();\n const resizeObserver = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(() => scheduleFollow());\n if (contentRef) resizeObserver?.observe(contentRef);\n if (viewportRef) resizeObserver?.observe(viewportRef);\n\n const historyObserver =\n typeof IntersectionObserver === \"undefined\" || !topSentinelRef\n ? null\n : new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) void loadOlder();\n },\n { root: viewportRef, rootMargin: \"160px 0px 0px\" },\n );\n if (topSentinelRef) historyObserver?.observe(topSentinelRef);\n\n onCleanup(() => {\n cancelFollow();\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n resizeObserver?.disconnect();\n historyObserver?.disconnect();\n });\n });\n\n createEffect(() => {\n const key = props.conversationKey;\n if (key === lastConversationKey) return;\n lastConversationKey = key;\n setHistoryError(null);\n setPinned(true);\n queueMicrotask(scrollToLatest);\n });\n\n createEffect(() => {\n props.items.length;\n props.items.at(-1)?.id;\n untrack(scheduleFollow);\n });\n\n return (\n <section class={`k2b-chat-timeline ${props.class ?? \"\"}`} aria-label={props.label ?? messages().conversation}>\n <div\n ref={(element) => {\n viewportRef = element;\n props.viewportRef?.(element);\n }}\n class=\"k2b-chat-timeline__viewport\"\n data-scroll-fade-mode={props.scrollFade !== false ? \"bottom\" : undefined}\n data-initializing=\"\"\n role=\"region\"\n aria-label={messages().conversationMessages({ label: props.label ?? messages().conversation })}\n tabIndex={0}\n onWheel={(event) => {\n if (event.deltaY < 0) noteUserScrollAway();\n }}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \"ArrowUp\" || event.key === \"PageUp\" || event.key === \"Home\" || (event.key === \" \" && event.shiftKey)) {\n noteUserScrollAway();\n }\n }}\n onTouchStart={(event) => {\n touchY = event.touches[0]?.clientY;\n }}\n onTouchMove={(event) => {\n const nextY = event.touches[0]?.clientY;\n if (nextY !== undefined && touchY !== undefined && nextY > touchY) noteUserScrollAway();\n touchY = nextY;\n }}\n onTouchEnd={() => {\n touchY = undefined;\n }}\n onScroll={updatePinned}\n >\n <Show when={props.navigation}>\n <div class=\"k2b-chat-timeline__navigation\" aria-live=\"off\">\n {props.navigation}\n </div>\n </Show>\n <div\n ref={(element) => {\n contentRef = element;\n props.contentRef?.(element);\n }}\n class=\"k2b-chat-timeline__content\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n aria-busy={props.loading ? \"true\" : undefined}\n >\n <div ref={topSentinelRef} class=\"k2b-chat-timeline__sentinel\" aria-hidden=\"true\" />\n <Show when={hasHistoryControls()}>\n <div class=\"k2b-chat-timeline__history\" aria-live=\"off\">\n <Show when={canLoadOlder()}>\n <button type=\"button\" class=\"k2b-chat-timeline__older\" onClick={() => void loadOlder()}>\n <i class=\"ti ti-history\" aria-hidden=\"true\" />\n {messages().loadOlderMessages}\n </button>\n </Show>\n <Show when={loadingOlder()}>\n <ChatActivity\n label={messages().loadingOlderMessages}\n icon=\"ti ti-history\"\n trailing={<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />}\n />\n </Show>\n <Show when={historyError()}>\n {(message) => (\n <ChatActivity\n label={messages().couldNotLoadOlderMessages}\n description={message()}\n icon=\"ti ti-alert-circle\"\n tone=\"danger\"\n trailing={\n <button\n type=\"button\"\n class=\"k2b-chat-timeline__retry\"\n aria-label={messages().retryOlderMessages}\n onClick={() => void loadOlder()}\n >\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n </button>\n }\n />\n )}\n </Show>\n </div>\n </Show>\n <Show\n when={!props.loading && hasContent()}\n fallback={\n <Placeholder\n class=\"k2b-chat-timeline__placeholder\"\n state={props.loading ? \"loading\" : \"empty\"}\n icon={props.loading ? undefined : \"ti ti-sparkles\"}\n title={props.loading ? messages().loadingConversation : (props.emptyTitle ?? messages().startConversation)}\n description={!props.loading ? props.emptyDescription : undefined}\n />\n }\n >\n <For each={itemIds()}>\n {(id) => {\n // A row is keyed by its id, so an updated record with the same id keeps its DOM and component state.\n const item = () => itemsById().get(id);\n const message = () => {\n const value = item();\n return value?.kind === \"message\" ? value : undefined;\n };\n const activity = () => {\n const value = item();\n return value?.kind === \"activity\" ? value : undefined;\n };\n return (\n <Show\n when={message() !== undefined}\n fallback={\n <Show when={activity() !== undefined}>\n <ChatActivity\n label={activity()!.label}\n description={activity()!.description}\n icon={activity()!.icon}\n leading={activity()!.leading}\n accent={activity()!.accent}\n tone={activity()!.tone}\n busy={activity()!.busy}\n trailing={activity()!.trailing}\n defaultOpen={activity()!.defaultOpen}\n anchorId={activity()!.anchorId}\n class={activity()!.class}\n >\n {activity()!.content}\n </ChatActivity>\n </Show>\n }\n >\n <ChatMessage\n role={message()!.role}\n label={message()!.label}\n createdAt={message()!.createdAt}\n timeLabel={message()!.timeLabel}\n status={message()!.status}\n attachments={message()!.attachments}\n actions={message()!.actions}\n actionDisplay={message()!.actionDisplay}\n anchorId={message()!.anchorId}\n onActionError={props.onActionError}\n class={message()!.class}\n >\n {message()!.content}\n </ChatMessage>\n </Show>\n );\n }}\n </For>\n </Show>\n </div>\n </div>\n <Show when={!pinned() && hasContent()}>\n <button type=\"button\" class=\"k2b-chat-timeline__latest\" onClick={scrollToLatest}>\n <i class=\"ti ti-arrow-down\" aria-hidden=\"true\" />\n {messages().jumpToLatest}\n </button>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -181,7 +181,10 @@ export default function StructuredDataPreview(props) {
181
181
  get children() {
182
182
  var _el$10 = _$getNextElement(_tmpl$4);
183
183
  _el$10.$$click = () => setMode(showRaw() ? "formatted" : "raw");
184
- _$insert(_el$10, () => showRaw() ? "View formatted" : "View raw");
184
+ _$insert(_el$10, (() => {
185
+ var _c$ = _$memo(() => !!showRaw());
186
+ return () => _c$() ? messages().viewFormatted : messages().viewRaw;
187
+ })());
185
188
  _$runHydrationEvents();
186
189
  return _el$10;
187
190
  }