@anvia/react-ui 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/attachment/index.d.ts +3 -21
  2. package/dist/attachment/index.js +3 -12
  3. package/dist/attachment-By2pged3.js +91 -0
  4. package/dist/attachment-By2pged3.js.map +1 -0
  5. package/dist/chat/index.d.ts +3 -152
  6. package/dist/chat/index.js +3 -25
  7. package/dist/chat-Dgz8hsVT.js +1210 -0
  8. package/dist/chat-Dgz8hsVT.js.map +1 -0
  9. package/dist/completion/index.d.ts +3 -29
  10. package/dist/completion/index.js +3 -16
  11. package/dist/completion-DDTKoZRJ.js +124 -0
  12. package/dist/completion-DDTKoZRJ.js.map +1 -0
  13. package/dist/connection-DeNq8wHS.js +203 -0
  14. package/dist/connection-DeNq8wHS.js.map +1 -0
  15. package/dist/contexts-B4ijG24z.js +212 -0
  16. package/dist/contexts-B4ijG24z.js.map +1 -0
  17. package/dist/elements-D4vmkkF8.js +19 -0
  18. package/dist/elements-D4vmkkF8.js.map +1 -0
  19. package/dist/graph-explorer/index.d.ts +54 -73
  20. package/dist/graph-explorer/index.d.ts.map +1 -0
  21. package/dist/graph-explorer/index.js +181 -248
  22. package/dist/graph-explorer/index.js.map +1 -1
  23. package/dist/human-input/index.d.ts +3 -78
  24. package/dist/human-input/index.js +3 -21
  25. package/dist/human-input-CsCbZomZ.js +314 -0
  26. package/dist/human-input-CsCbZomZ.js.map +1 -0
  27. package/dist/image/index.d.ts +3 -40
  28. package/dist/image/index.js +3 -12
  29. package/dist/image-aCWm6hFe.js +303 -0
  30. package/dist/image-aCWm6hFe.js.map +1 -0
  31. package/dist/index-B1Qs2Cjv.d.ts +145 -0
  32. package/dist/index-B1Qs2Cjv.d.ts.map +1 -0
  33. package/dist/index-BCBVcl0D.d.ts +277 -0
  34. package/dist/index-BCBVcl0D.d.ts.map +1 -0
  35. package/dist/index-CE22tsua.d.ts +20 -0
  36. package/dist/index-CE22tsua.d.ts.map +1 -0
  37. package/dist/index-CGqtpc6b.d.ts +25 -0
  38. package/dist/index-CGqtpc6b.d.ts.map +1 -0
  39. package/dist/index-DqdyM0Jm.d.ts +7 -0
  40. package/dist/index-DqdyM0Jm.d.ts.map +1 -0
  41. package/dist/index-Mw3ltwSG.d.ts +318 -0
  42. package/dist/index-Mw3ltwSG.d.ts.map +1 -0
  43. package/dist/index.d.ts +7 -40
  44. package/dist/index.js +34 -118
  45. package/dist/index.js.map +1 -1
  46. package/dist/message/index.d.ts +3 -105
  47. package/dist/message/index.js +3 -20
  48. package/dist/message-CElFEKgL.js +783 -0
  49. package/dist/message-CElFEKgL.js.map +1 -0
  50. package/dist/primitives-xfE7zfwJ.js +15 -0
  51. package/dist/primitives-xfE7zfwJ.js.map +1 -0
  52. package/dist/refs-Djj9rSvB.js +10 -0
  53. package/dist/refs-Djj9rSvB.js.map +1 -0
  54. package/dist/sandbox-desktop/index.d.ts +100 -104
  55. package/dist/sandbox-desktop/index.d.ts.map +1 -0
  56. package/dist/sandbox-desktop/index.js +344 -342
  57. package/dist/sandbox-desktop/index.js.map +1 -1
  58. package/dist/sandbox-terminal/index.d.ts +52 -56
  59. package/dist/sandbox-terminal/index.d.ts.map +1 -0
  60. package/dist/sandbox-terminal/index.js +217 -208
  61. package/dist/sandbox-terminal/index.js.map +1 -1
  62. package/dist/selection-toolbar/index.d.ts +3 -21
  63. package/dist/selection-toolbar/index.js +3 -13
  64. package/dist/selection-toolbar-CIkOoM-7.js +171 -0
  65. package/dist/selection-toolbar-CIkOoM-7.js.map +1 -0
  66. package/dist/shared-BSYElFU2.d.ts +2 -0
  67. package/dist/shared.d.ts +4 -14
  68. package/dist/shared.js +1 -43
  69. package/dist/stream/index.d.ts +2 -22
  70. package/dist/stream/index.js +1 -8
  71. package/dist/stream-CAO0x8_1.js +298 -0
  72. package/dist/stream-CAO0x8_1.js.map +1 -0
  73. package/dist/thread-list/index.d.ts +3 -47
  74. package/dist/thread-list/index.js +3 -18
  75. package/dist/thread-list-xJbGXFrE.js +228 -0
  76. package/dist/thread-list-xJbGXFrE.js.map +1 -0
  77. package/dist/ticket-CoJHBpdF.d.ts +32 -0
  78. package/dist/ticket-CoJHBpdF.d.ts.map +1 -0
  79. package/dist/url-CiYZkDks.js +52 -0
  80. package/dist/url-CiYZkDks.js.map +1 -0
  81. package/dist/value-BGGrx72L.js +13 -0
  82. package/dist/value-BGGrx72L.js.map +1 -0
  83. package/package.json +22 -22
  84. package/dist/attachment/index.js.map +0 -1
  85. package/dist/attachment-mbjsroli.d.ts +0 -9
  86. package/dist/chat/index.js.map +0 -1
  87. package/dist/chat-PSj1Fo4W.d.ts +0 -88
  88. package/dist/chunk-22EZJUPM.js +0 -120
  89. package/dist/chunk-22EZJUPM.js.map +0 -1
  90. package/dist/chunk-5FZKTDZR.js +0 -201
  91. package/dist/chunk-5FZKTDZR.js.map +0 -1
  92. package/dist/chunk-6XOJFLX4.js +0 -22
  93. package/dist/chunk-6XOJFLX4.js.map +0 -1
  94. package/dist/chunk-CKA4CE26.js +0 -25
  95. package/dist/chunk-CKA4CE26.js.map +0 -1
  96. package/dist/chunk-DLBNFBXQ.js +0 -425
  97. package/dist/chunk-DLBNFBXQ.js.map +0 -1
  98. package/dist/chunk-E73S3SOF.js +0 -404
  99. package/dist/chunk-E73S3SOF.js.map +0 -1
  100. package/dist/chunk-F6AKBUO3.js +0 -380
  101. package/dist/chunk-F6AKBUO3.js.map +0 -1
  102. package/dist/chunk-HGOPGZNQ.js +0 -195
  103. package/dist/chunk-HGOPGZNQ.js.map +0 -1
  104. package/dist/chunk-KHB5CHAU.js +0 -220
  105. package/dist/chunk-KHB5CHAU.js.map +0 -1
  106. package/dist/chunk-LHABOAOP.js +0 -316
  107. package/dist/chunk-LHABOAOP.js.map +0 -1
  108. package/dist/chunk-N5XQU36W.js +0 -410
  109. package/dist/chunk-N5XQU36W.js.map +0 -1
  110. package/dist/chunk-T3ZFZ3NP.js +0 -30
  111. package/dist/chunk-T3ZFZ3NP.js.map +0 -1
  112. package/dist/chunk-T4IYUEPH.js +0 -1612
  113. package/dist/chunk-T4IYUEPH.js.map +0 -1
  114. package/dist/chunk-W2AHKMRS.js +0 -1092
  115. package/dist/chunk-W2AHKMRS.js.map +0 -1
  116. package/dist/completion/index.js.map +0 -1
  117. package/dist/completion-input-DHlwrhxB.d.ts +0 -24
  118. package/dist/composer-6iCSIq6L.d.ts +0 -111
  119. package/dist/human-input/index.js.map +0 -1
  120. package/dist/human-input-CkLrZ8IC.d.ts +0 -27
  121. package/dist/image/index.js.map +0 -1
  122. package/dist/image-VZv6Ddsn.d.ts +0 -14
  123. package/dist/message/index.js.map +0 -1
  124. package/dist/message-CNRnZQwU.d.ts +0 -14
  125. package/dist/render-CRKWam2v.d.ts +0 -8
  126. package/dist/selection-toolbar/index.js.map +0 -1
  127. package/dist/selection-toolbar-Cwjbuv5S.d.ts +0 -14
  128. package/dist/shared.js.map +0 -1
  129. package/dist/stream/index.js.map +0 -1
  130. package/dist/thread-Bz6-1zaJ.d.ts +0 -12
  131. package/dist/thread-list/index.js.map +0 -1
  132. package/dist/thread-list-On8db4XL.d.ts +0 -34
  133. package/dist/ticket-pexI1zIa.d.ts +0 -33
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-CAO0x8_1.js","names":[],"sources":["../src/stream/markdown-blocks.ts","../src/stream/markdown-reveal.ts","../src/stream/markdown.tsx"],"sourcesContent":["import { lexer } from \"marked\";\n\nexport type StreamMarkdownBlock = {\n content: string;\n startOffset: number;\n};\n\nexport function splitStreamMarkdownBlocks(\n content: string,\n options: { singleDocument?: boolean } = {},\n): StreamMarkdownBlock[] {\n if (content.length === 0) {\n return [];\n }\n if (options.singleDocument === true) {\n return [{ content, startOffset: 0 }];\n }\n\n try {\n const tokens = lexer(content, { gfm: false });\n if (tokens.some((token) => token.type === \"def\") || Object.keys(tokens.links).length > 0) {\n return [{ content, startOffset: 0 }];\n }\n\n const rawBlocks: string[] = [];\n for (const token of tokens) {\n if (token.type === \"space\" && rawBlocks.length > 0) {\n const lastIndex = rawBlocks.length - 1;\n rawBlocks[lastIndex] = `${rawBlocks[lastIndex] ?? \"\"}${token.raw}`;\n } else {\n rawBlocks.push(token.raw);\n }\n }\n\n if (rawBlocks.length === 0 || rawBlocks.join(\"\") !== content) {\n return [{ content, startOffset: 0 }];\n }\n\n let startOffset = 0;\n return rawBlocks.map((block) => {\n const result = { content: block, startOffset };\n startOffset += block.length;\n return result;\n });\n } catch {\n return [{ content, startOffset: 0 }];\n }\n}\n","export const streamRevealConfig = {\n bandGraphemes: 2,\n durationMs: 180,\n minimumOpacity: 0.12,\n tailGraphemes: 24,\n} as const;\n\nexport type StreamRevealLifecycle = {\n activeScope: string | null;\n settledRevealIds: Set<string>;\n startedAtByRevealId: Map<string, number>;\n};\n\ntype MarkdownNode = {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: MarkdownNode[];\n};\n\ntype TextTarget = {\n endOffset: number;\n index: number;\n node: MarkdownNode;\n parent: MarkdownNode;\n startOffset: number;\n};\n\ntype RevealGrapheme = {\n endOffset: number;\n opacity: number;\n startOffset: number;\n};\n\nexport function createStreamGradientRevealPlugin(\n lifecycleScope: string,\n lifecycle: StreamRevealLifecycle,\n) {\n return function streamGradientRevealPlugin() {\n return (tree: MarkdownNode) => {\n if (lifecycle.activeScope !== lifecycleScope) {\n lifecycle.activeScope = lifecycleScope;\n lifecycle.settledRevealIds.clear();\n lifecycle.startedAtByRevealId.clear();\n }\n const targets = collectTextTargets(tree);\n const renderedText = targets.map((target) => target.node.value ?? \"\").join(\"\");\n const graphemes = createRevealGraphemes(renderedText);\n wrapStreamRevealGraphemes(targets, graphemes, lifecycleScope, lifecycle);\n };\n };\n}\n\nfunction collectTextTargets(tree: MarkdownNode): TextTarget[] {\n const targets: TextTarget[] = [];\n let offset = 0;\n\n function visit(node: MarkdownNode, parent: MarkdownNode | undefined, index: number): void {\n if (node.type === \"element\" && node.tagName === \"pre\") {\n return;\n }\n if (node.type === \"text\" && node.value !== undefined && parent !== undefined) {\n if (!/\\S/u.test(node.value)) {\n return;\n }\n const startOffset = offset;\n offset += node.value.length;\n targets.push({\n endOffset: offset,\n index,\n node,\n parent,\n startOffset,\n });\n return;\n }\n for (const [childIndex, child] of (node.children ?? []).entries()) {\n visit(child, node, childIndex);\n }\n }\n\n visit(tree, undefined, 0);\n return targets;\n}\n\nfunction createRevealGraphemes(content: string): RevealGrapheme[] {\n const tail = segmentTailGraphemeRanges(content, streamRevealConfig.tailGraphemes);\n const graphemes: RevealGrapheme[] = [];\n\n for (let index = 0; index < tail.length; index += 1) {\n const grapheme = tail[index];\n const bandStartIndex =\n Math.floor(index / streamRevealConfig.bandGraphemes) * streamRevealConfig.bandGraphemes;\n const bandEndIndex =\n Math.min(bandStartIndex + streamRevealConfig.bandGraphemes, tail.length) - 1;\n if (grapheme === undefined) {\n continue;\n }\n const progress = tail.length === 1 ? 1 : bandEndIndex / (tail.length - 1);\n graphemes.push({\n startOffset: grapheme.startOffset,\n endOffset: grapheme.endOffset,\n opacity: Math.max(\n streamRevealConfig.minimumOpacity,\n 1 - progress * (1 - streamRevealConfig.minimumOpacity),\n ),\n });\n }\n return graphemes;\n}\n\nfunction wrapStreamRevealGraphemes(\n targets: readonly TextTarget[],\n graphemes: readonly RevealGrapheme[],\n lifecycleScope: string,\n lifecycle: StreamRevealLifecycle,\n): void {\n const activeRevealIds = new Set<string>();\n const nowMs = Date.now();\n for (const target of [...targets].reverse()) {\n const value = target.node.value ?? \"\";\n const intersectingGraphemes = graphemes.filter(\n (grapheme) =>\n grapheme.endOffset > target.startOffset && grapheme.startOffset < target.endOffset,\n );\n if (intersectingGraphemes.length === 0) {\n continue;\n }\n\n const replacement: MarkdownNode[] = [];\n let cursor = 0;\n for (const grapheme of intersectingGraphemes) {\n const start = Math.max(0, grapheme.startOffset - target.startOffset);\n const end = Math.min(value.length, grapheme.endOffset - target.startOffset);\n if (start > cursor) {\n replacement.push({ type: \"text\", value: value.slice(cursor, start) });\n }\n if (end > start) {\n const text = value.slice(start, end);\n const absoluteStart = target.startOffset + start;\n const absoluteEnd = target.startOffset + end;\n const revealId = `${lifecycleScope}:${absoluteStart}:${absoluteEnd}:${hashText(text)}`;\n activeRevealIds.add(revealId);\n const startedAt = lifecycle.startedAtByRevealId.get(revealId) ?? nowMs;\n lifecycle.startedAtByRevealId.set(revealId, startedAt);\n const elapsedMs = Math.max(0, nowMs - startedAt);\n if (elapsedMs >= streamRevealConfig.durationMs) {\n lifecycle.settledRevealIds.add(revealId);\n }\n if (lifecycle.settledRevealIds.has(revealId)) {\n replacement.push({ type: \"text\", value: text });\n } else {\n const progress = Math.min(elapsedMs / streamRevealConfig.durationMs, 1);\n const opacity = grapheme.opacity + (1 - grapheme.opacity) * progress;\n const remainingMs = Math.max(1, streamRevealConfig.durationMs - elapsedMs);\n replacement.push({\n type: \"element\",\n tagName: \"span\",\n properties: {\n \"data-reveal-duration-ms\": String(remainingMs),\n \"data-reveal-opacity\": String(opacity),\n \"data-reveal-id\": revealId,\n \"data-state\": \"revealing\",\n },\n children: [{ type: \"text\", value: text }],\n });\n }\n }\n cursor = Math.max(cursor, end);\n }\n if (cursor < value.length) {\n replacement.push({ type: \"text\", value: value.slice(cursor) });\n }\n target.parent.children?.splice(target.index, 1, ...replacement);\n }\n\n pruneRevealLifecycle(lifecycle, activeRevealIds);\n}\n\nfunction pruneRevealLifecycle(\n lifecycle: StreamRevealLifecycle,\n activeRevealIds: ReadonlySet<string>,\n): void {\n for (const revealId of lifecycle.startedAtByRevealId.keys()) {\n if (!activeRevealIds.has(revealId)) lifecycle.startedAtByRevealId.delete(revealId);\n }\n for (const revealId of lifecycle.settledRevealIds) {\n if (!activeRevealIds.has(revealId)) lifecycle.settledRevealIds.delete(revealId);\n }\n}\n\nfunction hashText(text: string): string {\n let hash = 2_166_136_261;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 16_777_619);\n }\n return (hash >>> 0).toString(36);\n}\n\nfunction segmentTailGraphemeRanges(\n content: string,\n limit: number,\n): Array<{\n endOffset: number;\n startOffset: number;\n}> {\n if (typeof Intl !== \"undefined\" && typeof Intl.Segmenter === \"function\") {\n const segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n const segments = segmenter.segment(content);\n const ranges: Array<{ endOffset: number; startOffset: number }> = [];\n let cursor = content.length;\n while (cursor > 0 && ranges.length < limit) {\n const segment = segments.containing(cursor - 1);\n if (segment === undefined) {\n break;\n }\n ranges.unshift({\n startOffset: segment.index,\n endOffset: segment.index + segment.segment.length,\n });\n cursor = segment.index;\n }\n return ranges;\n }\n\n const ranges: Array<{ endOffset: number; startOffset: number }> = [];\n let cursor = content.length;\n while (cursor > 0 && ranges.length < limit) {\n let startOffset = cursor - 1;\n const code = content.charCodeAt(startOffset);\n if (code >= 0xdc00 && code <= 0xdfff && startOffset > 0) {\n const previousCode = content.charCodeAt(startOffset - 1);\n if (previousCode >= 0xd800 && previousCode <= 0xdbff) {\n startOffset -= 1;\n }\n }\n ranges.unshift({ startOffset, endOffset: cursor });\n cursor = startOffset;\n }\n return ranges;\n}\n","import {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n createElement,\n forwardRef,\n memo,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport ReactMarkdown, {\n type Components,\n type Options as ReactMarkdownOptions,\n} from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { splitStreamMarkdownBlocks } from \"./markdown-blocks\";\nimport { createStreamGradientRevealPlugin, type StreamRevealLifecycle } from \"./markdown-reveal\";\n\nexport type StreamMarkdownProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n \"data-state\"?: string | undefined;\n components?: Components;\n content: string;\n live?: boolean;\n remarkPlugins?: ReactMarkdownOptions[\"remarkPlugins\"];\n remarkRehypeOptions?: ReactMarkdownOptions[\"remarkRehypeOptions\"];\n};\n\nconst defaultRemarkPlugins: NonNullable<ReactMarkdownOptions[\"remarkPlugins\"]> = [remarkGfm];\n\nexport const StreamMarkdown = forwardRef<HTMLDivElement, StreamMarkdownProps>(\n function StreamMarkdown(\n { components, content, live = false, remarkPlugins, remarkRehypeOptions, ...props },\n ref,\n ) {\n const revealLifecycleRef = useRef({\n activeScope: null,\n content,\n id: 0,\n settledRevealIds: new Set<string>(),\n startedAtByRevealId: new Map<string, number>(),\n } satisfies StreamRevealLifecycle & { content: string; id: number });\n const revealLifecycle = revealLifecycleRef.current;\n if (revealLifecycle.content !== content) {\n if (!content.startsWith(revealLifecycle.content)) {\n revealLifecycle.id += 1;\n revealLifecycle.activeScope = null;\n revealLifecycle.settledRevealIds.clear();\n revealLifecycle.startedAtByRevealId.clear();\n }\n revealLifecycle.content = content;\n }\n if (!live && revealLifecycle.activeScope !== null) {\n for (const revealId of revealLifecycle.startedAtByRevealId.keys()) {\n revealLifecycle.settledRevealIds.add(revealId);\n }\n }\n const settleReveal = useCallback((revealId: string) => {\n revealLifecycleRef.current.settledRevealIds.add(revealId);\n }, []);\n\n const blocks = useMemo(\n () =>\n splitStreamMarkdownBlocks(content, {\n singleDocument: remarkPlugins !== undefined,\n }),\n [content, remarkPlugins],\n );\n const streamingComponents = useMemo(\n () => withStreamRevealComponent(components, settleReveal),\n [components, settleReveal],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: blocks.map((block, index) => (\n <StreamMarkdownBlock\n components={streamingComponents}\n content={block.content}\n live={live && index === blocks.length - 1}\n revealLifecycle={revealLifecycle}\n revealScope={`${revealLifecycle.id}:${block.startOffset}`}\n remarkPlugins={remarkPlugins ?? defaultRemarkPlugins}\n remarkRehypeOptions={remarkRehypeOptions}\n key={block.startOffset}\n />\n )),\n \"data-role\": \"markdown\",\n \"data-state\": props[\"data-state\"] ?? (live ? \"streaming\" : \"idle\"),\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst StreamMarkdownBlock = memo(function StreamMarkdownBlock(props: {\n components: Components;\n content: string;\n live: boolean;\n revealLifecycle: StreamRevealLifecycle;\n revealScope: string;\n remarkPlugins: ReactMarkdownOptions[\"remarkPlugins\"];\n remarkRehypeOptions: ReactMarkdownOptions[\"remarkRehypeOptions\"];\n}) {\n const revealPlugin = useMemo(\n () => createStreamGradientRevealPlugin(props.revealScope, props.revealLifecycle),\n [props.revealScope, props.revealLifecycle],\n );\n return (\n <ReactMarkdown\n components={props.components}\n rehypePlugins={props.live ? [revealPlugin] : undefined}\n remarkPlugins={props.remarkPlugins}\n remarkRehypeOptions={props.remarkRehypeOptions}\n >\n {props.content}\n </ReactMarkdown>\n );\n});\n\nfunction withStreamRevealComponent(\n components: Components | undefined,\n onRevealSettled: (revealId: string) => void,\n): Components {\n const consumerSpan = components?.span;\n return {\n ...components,\n span(spanProps) {\n const safeProps = componentPropsWithoutKey(spanProps);\n const internalProps = safeProps as typeof safeProps & {\n \"data-reveal-duration-ms\"?: string | undefined;\n \"data-reveal-opacity\"?: string | undefined;\n \"data-reveal-id\"?: string | undefined;\n \"data-state\"?: string | undefined;\n };\n if (internalProps[\"data-state\"] === \"revealing\") {\n return streamRevealSpan(internalProps, onRevealSettled);\n }\n if (consumerSpan !== undefined) {\n return createElement(consumerSpan, safeProps);\n }\n const { node: _node, ...elementProps } = safeProps;\n return <span {...elementProps} />;\n },\n };\n}\n\nfunction componentPropsWithoutKey<T extends object>(props: T): T {\n const result: Record<string, unknown> = {};\n for (const name of Object.keys(props)) {\n if (name !== \"key\") {\n result[name] = (props as Record<string, unknown>)[name];\n }\n }\n return result as T;\n}\n\nfunction streamRevealSpan(\n props: ComponentPropsWithoutRef<\"span\"> & {\n node?: unknown;\n \"data-reveal-duration-ms\"?: string | undefined;\n \"data-reveal-opacity\"?: string | undefined;\n \"data-reveal-id\"?: string | undefined;\n },\n onRevealSettled: (revealId: string) => void,\n): ReactNode {\n const {\n children,\n node: _node,\n \"data-reveal-duration-ms\": durationMs,\n \"data-reveal-opacity\": opacity,\n \"data-reveal-id\": revealId,\n onAnimationEnd,\n ...elementProps\n } = props;\n const parsedOpacity = Number(opacity);\n const parsedDurationMs = Number(durationMs);\n return (\n <span\n {...elementProps}\n data-state=\"revealing\"\n key={revealId ?? \"stream-reveal\"}\n onAnimationEnd={(event) => {\n onAnimationEnd?.(event);\n if (revealId !== undefined) onRevealSettled(revealId);\n }}\n style={\n {\n \"--anvia-stream-reveal-opacity\": Number.isFinite(parsedOpacity) ? parsedOpacity : 1,\n \"--anvia-stream-reveal-duration\": `${Number.isFinite(parsedDurationMs) ? parsedDurationMs : 180}ms`,\n } as CSSProperties\n }\n >\n {children}\n </span>\n );\n}\n"],"mappings":"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"}
@@ -1,47 +1,3 @@
1
- import * as react from 'react';
2
- import { d as ThreadListRecord } from '../thread-list-On8db4XL.js';
3
- export { T as ThreadListController, a as ThreadListItemContextValue, b as ThreadListProvider, c as ThreadListProviderProps, u as useThreadList, e as useThreadListItem } from '../thread-list-On8db4XL.js';
4
- import { P as PrimitiveProps } from '../render-CRKWam2v.js';
5
-
6
- declare const ThreadListPrimitive: {
7
- readonly Root: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
8
- asChild?: boolean;
9
- } & react.RefAttributes<HTMLDivElement>>;
10
- readonly New: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
11
- asChild?: boolean;
12
- } & react.RefAttributes<HTMLButtonElement>>;
13
- readonly Items: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
14
- archived?: boolean;
15
- children?: react.ReactNode | ((thread: ThreadListRecord) => react.ReactNode);
16
- keepMounted?: boolean;
17
- } & react.RefAttributes<HTMLDivElement>>;
18
- readonly Empty: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
19
- asChild?: boolean;
20
- } & {
21
- archived?: boolean;
22
- } & react.RefAttributes<HTMLDivElement>>;
23
- };
24
- declare const ThreadListItemPrimitive: {
25
- readonly Root: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
26
- asChild?: boolean;
27
- } & react.RefAttributes<HTMLDivElement>>;
28
- readonly Trigger: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
29
- asChild?: boolean;
30
- } & react.RefAttributes<HTMLButtonElement>>;
31
- readonly Title: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref">, "asChild"> & {
32
- asChild?: boolean;
33
- } & {
34
- fallback?: react.ReactNode;
35
- } & react.RefAttributes<HTMLSpanElement>>;
36
- readonly Archive: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
37
- asChild?: boolean;
38
- } & react.RefAttributes<HTMLButtonElement>>;
39
- readonly Unarchive: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
40
- asChild?: boolean;
41
- } & react.RefAttributes<HTMLButtonElement>>;
42
- readonly Delete: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
43
- asChild?: boolean;
44
- } & react.RefAttributes<HTMLButtonElement>>;
45
- };
46
-
47
- export { ThreadListItemPrimitive, ThreadListPrimitive, ThreadListRecord };
1
+ import { a as ThreadListRecord, i as ThreadListProviderProps, n as ThreadListItemContextValue, o as useThreadList, r as ThreadListProvider, s as useThreadListItem, t as ThreadListController } from "../index-Mw3ltwSG.js";
2
+ import { n as ThreadListItemPrimitive, r as ThreadListPrimitive } from "../index-BCBVcl0D.js";
3
+ export { type ThreadListController, type ThreadListItemContextValue, ThreadListItemPrimitive, ThreadListPrimitive, ThreadListProvider, type ThreadListProviderProps, type ThreadListRecord, useThreadList, useThreadListItem };
@@ -1,18 +1,3 @@
1
- import {
2
- ThreadListItemPrimitive,
3
- ThreadListPrimitive
4
- } from "../chunk-LHABOAOP.js";
5
- import "../chunk-T3ZFZ3NP.js";
6
- import {
7
- ThreadListProvider,
8
- useThreadList,
9
- useThreadListItem
10
- } from "../chunk-E73S3SOF.js";
11
- export {
12
- ThreadListItemPrimitive,
13
- ThreadListPrimitive,
14
- ThreadListProvider,
15
- useThreadList,
16
- useThreadListItem
17
- };
18
- //# sourceMappingURL=index.js.map
1
+ import { a as useThreadList, o as useThreadListItem, r as ThreadListProvider } from "../contexts-B4ijG24z.js";
2
+ import { n as ThreadListPrimitive, t as ThreadListItemPrimitive } from "../thread-list-xJbGXFrE.js";
3
+ export { ThreadListItemPrimitive, ThreadListPrimitive, ThreadListProvider, useThreadList, useThreadListItem };
@@ -0,0 +1,228 @@
1
+ import { a as useThreadList, i as useInternalThreadListRoot, n as InternalThreadListRootProvider, o as useThreadListItem, t as InternalThreadListItemProvider } from "./contexts-B4ijG24z.js";
2
+ import { t as composeRefs } from "./refs-Djj9rSvB.js";
3
+ import { t as renderPrimitive } from "./primitives-xfE7zfwJ.js";
4
+ import { forwardRef, useCallback, useMemo, useRef } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ // src/thread-list/parts.tsx
7
+ const ThreadListRoot = forwardRef(function ThreadListRoot({ onKeyDown, ...props }, ref) {
8
+ const threadList = useThreadList();
9
+ const rootRef = useRef(null);
10
+ const newButtonRef = useRef(null);
11
+ const itemElements = useRef(/* @__PURE__ */ new Map());
12
+ const triggerElements = useRef(/* @__PURE__ */ new Map());
13
+ const registerItem = useCallback((threadId, element) => {
14
+ if (element === null) itemElements.current.delete(threadId);
15
+ else itemElements.current.set(threadId, element);
16
+ }, []);
17
+ const registerTrigger = useCallback((threadId, element) => {
18
+ if (element === null) triggerElements.current.delete(threadId);
19
+ else triggerElements.current.set(threadId, element);
20
+ }, []);
21
+ const rootContext = useMemo(() => ({
22
+ rootRef,
23
+ newButtonRef,
24
+ itemElements,
25
+ triggerElements,
26
+ registerItem,
27
+ registerTrigger
28
+ }), [registerItem, registerTrigger]);
29
+ const composedRef = useMemo(() => composeRefs(ref, (node) => {
30
+ rootRef.current = node;
31
+ }), [ref]);
32
+ const handleKeyDown = useCallback((event) => {
33
+ onKeyDown?.(event);
34
+ if (event.defaultPrevented || ![
35
+ "ArrowDown",
36
+ "ArrowUp",
37
+ "Home",
38
+ "End"
39
+ ].includes(event.key)) return;
40
+ const triggers = orderedEnabledTriggers(rootContext);
41
+ if (triggers.length === 0) return;
42
+ event.preventDefault();
43
+ const activeElement = document.activeElement;
44
+ const currentIndex = activeElement instanceof HTMLButtonElement ? triggers.indexOf(activeElement) : -1;
45
+ triggers[nextTriggerIndex(event.key, currentIndex, triggers.length)]?.focus();
46
+ }, [onKeyDown, rootContext]);
47
+ return /* @__PURE__ */ jsx(InternalThreadListRootProvider, {
48
+ value: rootContext,
49
+ children: renderPrimitive("div", {
50
+ ...props,
51
+ onKeyDown: handleKeyDown,
52
+ "data-state": threadList.status ?? "idle"
53
+ }, composedRef)
54
+ });
55
+ });
56
+ const ThreadListNew = forwardRef(function ThreadListNew({ onClick, ...props }, ref) {
57
+ const threadList = useThreadList();
58
+ const root = useInternalThreadListRoot();
59
+ const composedRef = useMemo(() => composeRefs(ref, (node) => {
60
+ root.newButtonRef.current = node;
61
+ }), [ref, root.newButtonRef]);
62
+ const handleClick = useCallback((event) => {
63
+ onClick?.(event);
64
+ if (event.defaultPrevented || props.disabled) return;
65
+ threadList.createThread();
66
+ }, [
67
+ onClick,
68
+ props.disabled,
69
+ threadList
70
+ ]);
71
+ return renderPrimitive("button", {
72
+ ...props,
73
+ children: props.children ?? "New chat",
74
+ onClick: handleClick,
75
+ type: props.type ?? "button",
76
+ "data-state": props.disabled ? "disabled" : "enabled"
77
+ }, composedRef);
78
+ });
79
+ const ThreadListItems = forwardRef(function ThreadListItems({ archived = false, children, keepMounted = false, ...props }, ref) {
80
+ const threadList = useThreadList();
81
+ const threads = threadList.threads.filter((thread) => Boolean(thread.archived) === archived);
82
+ const empty = threads.length === 0;
83
+ if (empty && !keepMounted) return null;
84
+ return renderPrimitive("div", {
85
+ ...props,
86
+ children: threads.map((thread) => /* @__PURE__ */ jsx(InternalThreadListItemProvider, {
87
+ value: {
88
+ thread,
89
+ active: thread.id === threadList.activeThreadId
90
+ },
91
+ children: typeof children === "function" ? children(thread) : children ?? /* @__PURE__ */ jsx(DefaultThreadItem, {})
92
+ }, thread.id)),
93
+ "data-state": empty ? "empty" : "populated"
94
+ }, ref);
95
+ });
96
+ const ThreadListEmpty = forwardRef(function ThreadListEmpty({ archived = false, ...props }, ref) {
97
+ if (useThreadList().threads.some((thread) => Boolean(thread.archived) === archived)) return null;
98
+ return renderPrimitive("div", {
99
+ ...props,
100
+ children: props.children ?? "No conversations."
101
+ }, ref);
102
+ });
103
+ const ThreadListItemRoot = forwardRef(function ThreadListItemRoot(props, ref) {
104
+ const item = useThreadListItem();
105
+ const root = useInternalThreadListRoot();
106
+ const composedRef = useMemo(() => composeRefs(ref, (node) => root.registerItem(item.thread.id, node)), [
107
+ item.thread.id,
108
+ ref,
109
+ root
110
+ ]);
111
+ return renderPrimitive("div", {
112
+ ...props,
113
+ "data-state": item.active ? "active" : "inactive"
114
+ }, composedRef);
115
+ });
116
+ const ThreadListItemTrigger = forwardRef(function ThreadListItemTrigger({ onClick, ...props }, ref) {
117
+ const threadList = useThreadList();
118
+ const item = useThreadListItem();
119
+ const root = useInternalThreadListRoot();
120
+ const disabled = props.disabled ?? false;
121
+ const composedRef = useMemo(() => composeRefs(ref, (node) => root.registerTrigger(item.thread.id, node)), [
122
+ item.thread.id,
123
+ ref,
124
+ root
125
+ ]);
126
+ const handleClick = useCallback((event) => {
127
+ onClick?.(event);
128
+ if (event.defaultPrevented || disabled) return;
129
+ threadList.switchThread(item.thread.id);
130
+ }, [
131
+ disabled,
132
+ item.thread.id,
133
+ onClick,
134
+ threadList
135
+ ]);
136
+ return renderPrimitive("button", {
137
+ ...props,
138
+ children: props.children ?? /* @__PURE__ */ jsx(ThreadListItemTitle, {}),
139
+ disabled,
140
+ onClick: handleClick,
141
+ type: props.type ?? "button",
142
+ "aria-current": item.active ? "true" : void 0,
143
+ "data-state": disabled ? "disabled" : "enabled"
144
+ }, composedRef);
145
+ });
146
+ const ThreadListItemTitle = forwardRef(function ThreadListItemTitle({ fallback = "New chat", ...props }, ref) {
147
+ const { thread } = useThreadListItem();
148
+ return renderPrimitive("span", {
149
+ ...props,
150
+ children: props.children ?? thread.title ?? fallback
151
+ }, ref);
152
+ });
153
+ function createThreadListItemAction(action, defaultLabel) {
154
+ return forwardRef(function ThreadListItemAction({ onClick, ...props }, ref) {
155
+ const threadList = useThreadList();
156
+ const { thread } = useThreadListItem();
157
+ const root = useInternalThreadListRoot();
158
+ const actionHandler = threadList[action];
159
+ const disabled = props.disabled ?? actionHandler === void 0;
160
+ const handleClick = useCallback((event) => {
161
+ onClick?.(event);
162
+ if (event.defaultPrevented || disabled) return;
163
+ focusAfterThreadItemRemoval(thread.id, root);
164
+ actionHandler?.(thread.id);
165
+ }, [
166
+ actionHandler,
167
+ disabled,
168
+ onClick,
169
+ root,
170
+ thread.id
171
+ ]);
172
+ return renderPrimitive("button", {
173
+ ...props,
174
+ children: props.children ?? defaultLabel,
175
+ disabled,
176
+ onClick: handleClick,
177
+ type: props.type ?? "button",
178
+ "data-state": disabled ? "disabled" : "enabled"
179
+ }, ref);
180
+ });
181
+ }
182
+ const ThreadListItemArchive = createThreadListItemAction("archiveThread", "Archive");
183
+ const ThreadListItemUnarchive = createThreadListItemAction("unarchiveThread", "Unarchive");
184
+ const ThreadListItemDelete = createThreadListItemAction("deleteThread", "Delete");
185
+ function DefaultThreadItem() {
186
+ return /* @__PURE__ */ jsx(ThreadListItemRoot, { children: /* @__PURE__ */ jsx(ThreadListItemTrigger, {}) });
187
+ }
188
+ function nextTriggerIndex(key, currentIndex, triggerCount) {
189
+ if (key === "Home") return 0;
190
+ if (key === "End") return triggerCount - 1;
191
+ if (currentIndex === -1) return key === "ArrowUp" ? triggerCount - 1 : 0;
192
+ if (key === "ArrowUp") return (currentIndex - 1 + triggerCount) % triggerCount;
193
+ return (currentIndex + 1) % triggerCount;
194
+ }
195
+ function focusAfterThreadItemRemoval(threadId, rootContext) {
196
+ const root = rootContext.rootRef.current;
197
+ const currentItem = rootContext.itemElements.current.get(threadId);
198
+ if (root === null || currentItem === void 0 || !currentItem.contains(root.ownerDocument.activeElement)) return;
199
+ const triggers = orderedEnabledTriggers(rootContext);
200
+ const currentTrigger = rootContext.triggerElements.current.get(threadId);
201
+ const currentIndex = currentTrigger === void 0 ? -1 : triggers.indexOf(currentTrigger);
202
+ const remainingTriggers = triggers.filter((trigger) => !currentItem.contains(trigger));
203
+ const fallback = rootContext.newButtonRef.current;
204
+ const focusTarget = remainingTriggers[Math.min(Math.max(currentIndex, 0), remainingTriggers.length - 1)] ?? fallback ?? root;
205
+ if (focusTarget === root && !root.hasAttribute("tabindex")) root.tabIndex = -1;
206
+ focusTarget.focus();
207
+ }
208
+ function orderedEnabledTriggers(rootContext) {
209
+ return [...rootContext.triggerElements.current.values()].filter((trigger) => trigger.isConnected && !trigger.disabled).sort((left, right) => left.compareDocumentPosition(right) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1);
210
+ }
211
+ // src/thread-list/index.ts
212
+ const ThreadListPrimitive = {
213
+ Root: ThreadListRoot,
214
+ New: ThreadListNew,
215
+ Items: ThreadListItems,
216
+ Empty: ThreadListEmpty
217
+ };
218
+ const ThreadListItemPrimitive = {
219
+ Root: ThreadListItemRoot,
220
+ Trigger: ThreadListItemTrigger,
221
+ Title: ThreadListItemTitle,
222
+ Archive: ThreadListItemArchive,
223
+ Unarchive: ThreadListItemUnarchive,
224
+ Delete: ThreadListItemDelete
225
+ };
226
+ export { ThreadListPrimitive as n, ThreadListItemPrimitive as t };
227
+
228
+ //# sourceMappingURL=thread-list-xJbGXFrE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-list-xJbGXFrE.js","names":[],"sources":["../src/thread-list/parts.tsx","../src/thread-list/index.ts"],"sourcesContent":["import {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\n\nimport {\n InternalThreadListItemProvider,\n InternalThreadListRootProvider,\n type ThreadListRecord,\n useInternalThreadListRoot,\n useThreadList,\n useThreadListItem,\n} from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ThreadListRootProps = PrimitiveProps<\"div\">;\n\nconst ThreadListRoot = forwardRef<HTMLDivElement, ThreadListRootProps>(function ThreadListRoot(\n { onKeyDown, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const rootRef = useRef<HTMLDivElement | null>(null);\n const newButtonRef = useRef<HTMLButtonElement | null>(null);\n const itemElements = useRef(new Map<string, HTMLDivElement>());\n const triggerElements = useRef(new Map<string, HTMLButtonElement>());\n const registerItem = useCallback((threadId: string, element: HTMLDivElement | null) => {\n if (element === null) itemElements.current.delete(threadId);\n else itemElements.current.set(threadId, element);\n }, []);\n const registerTrigger = useCallback((threadId: string, element: HTMLButtonElement | null) => {\n if (element === null) triggerElements.current.delete(threadId);\n else triggerElements.current.set(threadId, element);\n }, []);\n const rootContext = useMemo(\n () => ({\n rootRef,\n newButtonRef,\n itemElements,\n triggerElements,\n registerItem,\n registerTrigger,\n }),\n [registerItem, registerTrigger],\n );\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n rootRef.current = node;\n }),\n [ref],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || ![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) {\n return;\n }\n const triggers = orderedEnabledTriggers(rootContext);\n if (triggers.length === 0) {\n return;\n }\n event.preventDefault();\n const activeElement = document.activeElement;\n const currentIndex =\n activeElement instanceof HTMLButtonElement ? triggers.indexOf(activeElement) : -1;\n const nextIndex = nextTriggerIndex(event.key, currentIndex, triggers.length);\n triggers[nextIndex]?.focus();\n },\n [onKeyDown, rootContext],\n );\n\n return (\n <InternalThreadListRootProvider value={rootContext}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n onKeyDown: handleKeyDown,\n \"data-state\": threadList.status ?? \"idle\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n )}\n </InternalThreadListRootProvider>\n );\n});\n\nconst ThreadListNew = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadListNew({ onClick, ...props }, ref) {\n const threadList = useThreadList();\n const root = useInternalThreadListRoot();\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLButtonElement>(ref, (node) => {\n root.newButtonRef.current = node;\n }),\n [ref, root.newButtonRef],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || props.disabled) {\n return;\n }\n void threadList.createThread();\n },\n [onClick, props.disabled, threadList],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"New chat\",\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": props.disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n composedRef,\n );\n },\n);\n\ntype ThreadListItemsChildren = ReactNode | ((thread: ThreadListRecord) => ReactNode);\n\ntype ThreadListItemsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n archived?: boolean;\n children?: ThreadListItemsChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadListItems = forwardRef<HTMLDivElement, ThreadListItemsProps>(function ThreadListItems(\n { archived = false, children, keepMounted = false, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const threads = threadList.threads.filter((thread) => Boolean(thread.archived) === archived);\n const empty = threads.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: threads.map((thread) => (\n <InternalThreadListItemProvider\n key={thread.id}\n value={{ thread, active: thread.id === threadList.activeThreadId }}\n >\n {typeof children === \"function\" ? children(thread) : (children ?? <DefaultThreadItem />)}\n </InternalThreadListItemProvider>\n )),\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ThreadListEmptyProps = PrimitiveProps<\"div\"> & {\n archived?: boolean;\n};\n\nconst ThreadListEmpty = forwardRef<HTMLDivElement, ThreadListEmptyProps>(function ThreadListEmpty(\n { archived = false, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const hasVisibleThreads = threadList.threads.some(\n (thread) => Boolean(thread.archived) === archived,\n );\n if (hasVisibleThreads) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"No conversations.\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ThreadListItemRoot = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadListItemRoot(props, ref) {\n const item = useThreadListItem();\n const root = useInternalThreadListRoot();\n const composedRef = useMemo(\n () => composeRefs<HTMLDivElement>(ref, (node) => root.registerItem(item.thread.id, node)),\n [item.thread.id, ref, root],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-state\": item.active ? \"active\" : \"inactive\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n },\n);\n\nconst ThreadListItemTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadListItemTrigger({ onClick, ...props }, ref) {\n const threadList = useThreadList();\n const item = useThreadListItem();\n const root = useInternalThreadListRoot();\n const disabled = props.disabled ?? false;\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLButtonElement>(ref, (node) => root.registerTrigger(item.thread.id, node)),\n [item.thread.id, ref, root],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void threadList.switchThread(item.thread.id);\n },\n [disabled, item.thread.id, onClick, threadList],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? <ThreadListItemTitle />,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"aria-current\": item.active ? \"true\" : undefined,\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n composedRef,\n );\n },\n);\n\ntype ThreadListItemTitleProps = PrimitiveProps<\"span\"> & {\n fallback?: ReactNode;\n};\n\nconst ThreadListItemTitle = forwardRef<HTMLSpanElement, ThreadListItemTitleProps>(\n function ThreadListItemTitle({ fallback = \"New chat\", ...props }, ref) {\n const { thread } = useThreadListItem();\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? thread.title ?? fallback,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype ThreadListItemActionKey = \"archiveThread\" | \"unarchiveThread\" | \"deleteThread\";\nfunction createThreadListItemAction(action: ThreadListItemActionKey, defaultLabel: string) {\n return forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ThreadListItemAction(\n { onClick, ...props },\n ref,\n ) {\n const threadList = useThreadList();\n const { thread } = useThreadListItem();\n const root = useInternalThreadListRoot();\n const actionHandler = threadList[action];\n const disabled = props.disabled ?? actionHandler === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n focusAfterThreadItemRemoval(thread.id, root);\n void actionHandler?.(thread.id);\n },\n [actionHandler, disabled, onClick, root, thread.id],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? defaultLabel,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n });\n}\n\nconst ThreadListItemArchive = createThreadListItemAction(\"archiveThread\", \"Archive\");\nconst ThreadListItemUnarchive = createThreadListItemAction(\"unarchiveThread\", \"Unarchive\");\nconst ThreadListItemDelete = createThreadListItemAction(\"deleteThread\", \"Delete\");\n\nfunction DefaultThreadItem(): ReactNode {\n return (\n <ThreadListItemRoot>\n <ThreadListItemTrigger />\n </ThreadListItemRoot>\n );\n}\n\nfunction nextTriggerIndex(key: string, currentIndex: number, triggerCount: number): number {\n if (key === \"Home\") {\n return 0;\n }\n if (key === \"End\") {\n return triggerCount - 1;\n }\n if (currentIndex === -1) {\n return key === \"ArrowUp\" ? triggerCount - 1 : 0;\n }\n if (key === \"ArrowUp\") {\n return (currentIndex - 1 + triggerCount) % triggerCount;\n }\n return (currentIndex + 1) % triggerCount;\n}\n\nfunction focusAfterThreadItemRemoval(\n threadId: string,\n rootContext: ReturnType<typeof useInternalThreadListRoot>,\n): void {\n const root = rootContext.rootRef.current;\n const currentItem = rootContext.itemElements.current.get(threadId);\n if (\n root === null ||\n currentItem === undefined ||\n !currentItem.contains(root.ownerDocument.activeElement)\n ) {\n return;\n }\n\n const triggers = orderedEnabledTriggers(rootContext);\n const currentTrigger = rootContext.triggerElements.current.get(threadId);\n const currentIndex = currentTrigger === undefined ? -1 : triggers.indexOf(currentTrigger);\n const remainingTriggers = triggers.filter((trigger) => !currentItem.contains(trigger));\n const fallback = rootContext.newButtonRef.current;\n const focusTarget =\n remainingTriggers[Math.min(Math.max(currentIndex, 0), remainingTriggers.length - 1)] ??\n fallback ??\n root;\n\n if (focusTarget === root && !root.hasAttribute(\"tabindex\")) {\n root.tabIndex = -1;\n }\n focusTarget.focus();\n}\n\nfunction orderedEnabledTriggers(\n rootContext: ReturnType<typeof useInternalThreadListRoot>,\n): HTMLButtonElement[] {\n return [...rootContext.triggerElements.current.values()]\n .filter((trigger) => trigger.isConnected && !trigger.disabled)\n .sort((left, right) =>\n left.compareDocumentPosition(right) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1,\n );\n}\n\nexport {\n ThreadListEmpty,\n ThreadListItemArchive,\n ThreadListItemDelete,\n ThreadListItemRoot,\n ThreadListItems,\n ThreadListItemTitle,\n ThreadListItemTrigger,\n ThreadListItemUnarchive,\n ThreadListNew,\n ThreadListRoot,\n};\n","import {\n ThreadListEmpty,\n ThreadListItemArchive,\n ThreadListItemDelete,\n ThreadListItemRoot,\n ThreadListItems,\n ThreadListItemTitle,\n ThreadListItemTrigger,\n ThreadListItemUnarchive,\n ThreadListNew,\n ThreadListRoot,\n} from \"./parts\";\n\nexport const ThreadListPrimitive = {\n Root: ThreadListRoot,\n New: ThreadListNew,\n Items: ThreadListItems,\n Empty: ThreadListEmpty,\n} as const;\n\nexport const ThreadListItemPrimitive = {\n Root: ThreadListItemRoot,\n Trigger: ThreadListItemTrigger,\n Title: ThreadListItemTitle,\n Archive: ThreadListItemArchive,\n Unarchive: ThreadListItemUnarchive,\n Delete: ThreadListItemDelete,\n} as const;\n\nexport type {\n ThreadListController,\n ThreadListItemContextValue,\n ThreadListProviderProps,\n ThreadListRecord,\n} from \"../contexts\";\nexport { ThreadListProvider, useThreadList, useThreadListItem } from \"../contexts\";\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** The prefix a ticket travels under in `Sec-WebSocket-Protocol`. */
2
+ declare const ticketSubprotocolPrefix = "anvia.ticket.";
3
+ type RelayState =
4
+ /** The viewer library is still loading. */
5
+ "loading" | "connecting" | "open" |
6
+ /** The link dropped and another attempt is scheduled. */
7
+ "reconnecting" |
8
+ /** The session itself ended; reconnecting would not help. */
9
+ "ended" |
10
+ /** Gave up: a fatal error, or reconnect attempts ran out. */
11
+ "failed";
12
+ interface RelayStatus {
13
+ state: RelayState;
14
+ /** Reconnect attempt number while `reconnecting`. */
15
+ attempt?: number;
16
+ /** Delay before the next attempt while `reconnecting`. */
17
+ retryInMs?: number;
18
+ /** Exit code when the session ended with one. */
19
+ exitCode?: number;
20
+ /** Human-readable cause for `ended` and `failed`. */
21
+ message?: string;
22
+ }
23
+ interface RelayReconnectOptions {
24
+ initialDelayMs?: number;
25
+ maxDelayMs?: number;
26
+ /** Consecutive failed attempts before giving up. Default 10. */
27
+ maxAttempts?: number;
28
+ }
29
+ /** What a viewer's `ticket` prop can be: a ticket, or a function returning one per connection. */
30
+ type TicketSource = string | (() => string | Promise<string>);
31
+ export { ticketSubprotocolPrefix as a, RelayStatus as i, RelayReconnectOptions as n, RelayState as r, TicketSource as t };
32
+ //# sourceMappingURL=ticket-CoJHBpdF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-CoJHBpdF.d.ts","names":[],"sources":["../src/relay/connection.ts","../src/relay/ticket.ts"],"mappings":";cACa;KAED;;;;;;;;;UAYK;EACf,OAAO;;EAEP;;EAEA;;EAEA;;EAEA;;UAGe;EACf;EACA;;EAEA;;;KC9BU,wCAAwC"}
@@ -0,0 +1,52 @@
1
+ // src/url.ts
2
+ const linkProtocols = /* @__PURE__ */ new Set([
3
+ "http:",
4
+ "https:",
5
+ "mailto:",
6
+ "tel:"
7
+ ]);
8
+ const imageProtocols = /* @__PURE__ */ new Set([
9
+ "http:",
10
+ "https:",
11
+ "blob:"
12
+ ]);
13
+ /**
14
+ * Reads the URL scheme the browser would use. ASCII whitespace and control
15
+ * characters are legal inside a scheme, so `java\nscript:` still resolves to
16
+ * `javascript:`. Strip them before matching so a smuggled scheme is caught.
17
+ */
18
+ function schemeOf(value) {
19
+ let normalized = "";
20
+ for (const character of value) {
21
+ const code = character.charCodeAt(0);
22
+ if (code > 32 && code !== 127) normalized += character;
23
+ }
24
+ const match = /^([a-z][a-z0-9+.-]*):/i.exec(normalized);
25
+ return match === null ? void 0 : `${match[1].toLowerCase()}:`;
26
+ }
27
+ /**
28
+ * Returns the value when it is safe to use as a link target, or `undefined`
29
+ * when it uses an active scheme such as `javascript:`. Relative URLs are kept
30
+ * because they resolve against the host application's own origin.
31
+ */
32
+ function safeLinkHref(value) {
33
+ if (value === void 0) return;
34
+ const scheme = schemeOf(value);
35
+ if (scheme === void 0) return value;
36
+ return linkProtocols.has(scheme) ? value : void 0;
37
+ }
38
+ /**
39
+ * Returns the value when it is safe to use as an image source. Inline `data:`
40
+ * URLs are allowed only for image media types, and `blob:` stays valid because
41
+ * it references bytes the application already holds.
42
+ */
43
+ function safeImageSrc(value) {
44
+ if (value === void 0) return;
45
+ const scheme = schemeOf(value);
46
+ if (scheme === void 0) return value;
47
+ if (scheme === "data:") return /^data:image\//i.test(value) ? value : void 0;
48
+ return imageProtocols.has(scheme) ? value : void 0;
49
+ }
50
+ export { safeLinkHref as n, safeImageSrc as t };
51
+
52
+ //# sourceMappingURL=url-CiYZkDks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-CiYZkDks.js","names":[],"sources":["../src/url.ts"],"sourcesContent":["const linkProtocols = new Set([\"http:\", \"https:\", \"mailto:\", \"tel:\"]);\nconst imageProtocols = new Set([\"http:\", \"https:\", \"blob:\"]);\n\n/**\n * Reads the URL scheme the browser would use. ASCII whitespace and control\n * characters are legal inside a scheme, so `java\\nscript:` still resolves to\n * `javascript:`. Strip them before matching so a smuggled scheme is caught.\n */\nfunction schemeOf(value: string): string | undefined {\n let normalized = \"\";\n for (const character of value) {\n const code = character.charCodeAt(0);\n if (code > 0x20 && code !== 0x7f) normalized += character;\n }\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(normalized);\n return match === null ? undefined : `${match[1]!.toLowerCase()}:`;\n}\n\n/**\n * Returns the value when it is safe to use as a link target, or `undefined`\n * when it uses an active scheme such as `javascript:`. Relative URLs are kept\n * because they resolve against the host application's own origin.\n */\nexport function safeLinkHref(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const scheme = schemeOf(value);\n if (scheme === undefined) {\n return value;\n }\n return linkProtocols.has(scheme) ? value : undefined;\n}\n\n/**\n * Returns the value when it is safe to use as an image source. Inline `data:`\n * URLs are allowed only for image media types, and `blob:` stays valid because\n * it references bytes the application already holds.\n */\nexport function safeImageSrc(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const scheme = schemeOf(value);\n if (scheme === undefined) {\n return value;\n }\n if (scheme === \"data:\") {\n return /^data:image\\//i.test(value) ? value : undefined;\n }\n return imageProtocols.has(scheme) ? value : undefined;\n}\n"],"mappings":";AAAA,MAAM,gCAAgB,IAAI,IAAI;CAAC;CAAS;CAAU;CAAW;AAAM,CAAC;AACpE,MAAM,iCAAiB,IAAI,IAAI;CAAC;CAAS;CAAU;AAAO,CAAC;;;;;;AAO3D,SAAS,SAAS,OAAmC;CACnD,IAAI,aAAa;CACjB,KAAK,MAAM,aAAa,OAAO;EAC7B,MAAM,OAAO,UAAU,WAAW,CAAC;EACnC,IAAI,OAAO,MAAQ,SAAS,KAAM,cAAc;CAClD;CACA,MAAM,QAAQ,yBAAyB,KAAK,UAAU;CACtD,OAAO,UAAU,OAAO,KAAA,IAAY,GAAG,MAAM,EAAE,CAAE,YAAY,EAAE;AACjE;;;;;;AAOA,SAAgB,aAAa,OAA+C;CAC1E,IAAI,UAAU,KAAA,GACZ;CAEF,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,WAAW,KAAA,GACb,OAAO;CAET,OAAO,cAAc,IAAI,MAAM,IAAI,QAAQ,KAAA;AAC7C;;;;;;AAOA,SAAgB,aAAa,OAA+C;CAC1E,IAAI,UAAU,KAAA,GACZ;CAEF,MAAM,SAAS,SAAS,KAAK;CAC7B,IAAI,WAAW,KAAA,GACb,OAAO;CAET,IAAI,WAAW,SACb,OAAO,iBAAiB,KAAK,KAAK,IAAI,QAAQ,KAAA;CAEhD,OAAO,eAAe,IAAI,MAAM,IAAI,QAAQ,KAAA;AAC9C"}
@@ -0,0 +1,13 @@
1
+ // src/format/value.ts
2
+ function stringifyValue(value) {
3
+ if (value === void 0) return "";
4
+ if (typeof value === "string") return value;
5
+ try {
6
+ return JSON.stringify(value, null, 2);
7
+ } catch {
8
+ return String(value);
9
+ }
10
+ }
11
+ export { stringifyValue as t };
12
+
13
+ //# sourceMappingURL=value-BGGrx72L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-BGGrx72L.js","names":[],"sources":["../src/format/value.ts"],"sourcesContent":["export function stringifyValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n"],"mappings":";AAAA,SAAgB,eAAe,OAAwB;CACrD,IAAI,UAAU,KAAA,GACZ,OAAO;CAET,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,IAAI;EACF,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;CACtC,QAAQ;EACN,OAAO,OAAO,KAAK;CACrB;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/react-ui",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "description": "Composable, headless React UI primitives for Anvia applications.",
5
5
  "author": "anvia",
6
6
  "license": "MIT",
@@ -78,29 +78,29 @@
78
78
  },
79
79
  "dependencies": {
80
80
  "@radix-ui/react-slot": "^1.5.0",
81
- "@tiptap/core": "^3.32.0",
82
- "@tiptap/extension-document": "^3.32.0",
83
- "@tiptap/extension-hard-break": "^3.32.0",
84
- "@tiptap/extension-mention": "^3.32.0",
85
- "@tiptap/extension-paragraph": "^3.32.0",
86
- "@tiptap/extension-placeholder": "^3.32.0",
87
- "@tiptap/extension-text": "^3.32.0",
88
- "@tiptap/pm": "^3.32.0",
89
- "@tiptap/react": "^3.32.0",
90
- "@tiptap/suggestion": "^3.32.0",
91
- "marked": "^18.1.2",
81
+ "@tiptap/core": "^3.33.0",
82
+ "@tiptap/extension-document": "^3.33.0",
83
+ "@tiptap/extension-hard-break": "^3.33.0",
84
+ "@tiptap/extension-mention": "^3.33.0",
85
+ "@tiptap/extension-paragraph": "^3.33.0",
86
+ "@tiptap/extension-placeholder": "^3.33.0",
87
+ "@tiptap/extension-text": "^3.33.0",
88
+ "@tiptap/pm": "^3.33.0",
89
+ "@tiptap/react": "^3.33.0",
90
+ "@tiptap/suggestion": "^3.33.0",
91
+ "marked": "^18.1.3",
92
92
  "react-markdown": "^10.1.0",
93
93
  "remark-gfm": "^4.0.1"
94
94
  },
95
95
  "peerDependencies": {
96
+ "@novnc/novnc": ">=1.5.0",
97
+ "@xterm/addon-fit": ">=0.10.0",
98
+ "@xterm/xterm": ">=5.5.0",
96
99
  "react": ">=18",
97
100
  "react-dom": ">=18",
98
- "@xterm/xterm": ">=5.5.0",
99
- "@xterm/addon-fit": ">=0.10.0",
100
- "@novnc/novnc": ">=1.5.0",
101
- "@anvia/client": "^1.6.0",
101
+ "@anvia/client": "^1.8.1",
102
102
  "@anvia/react": "^1.1.5",
103
- "@anvia/graph": "^1.1.6"
103
+ "@anvia/graph": "^1.2.0"
104
104
  },
105
105
  "peerDependenciesMeta": {
106
106
  "@anvia/graph": {
@@ -125,18 +125,18 @@
125
125
  "@vitest/coverage-v8": "4.1.11",
126
126
  "@xterm/addon-fit": "^0.11.0",
127
127
  "@xterm/xterm": "^6.0.0",
128
- "happy-dom": "20.9.0",
128
+ "happy-dom": "21.0.4",
129
129
  "react": "19.3.1",
130
130
  "react-dom": "19.3.1",
131
- "tsup": "^8.5.0",
131
+ "tsdown": "^0.23.4",
132
132
  "typescript": "^5.9.3",
133
133
  "vitest": "^4.1.11",
134
- "@anvia/client": "1.6.0",
134
+ "@anvia/client": "1.8.1",
135
135
  "@anvia/react": "1.1.5",
136
- "@anvia/graph": "1.1.6"
136
+ "@anvia/graph": "1.2.0"
137
137
  },
138
138
  "scripts": {
139
- "build": "tsup src/index.ts src/attachment/index.ts src/chat/index.ts src/completion/index.ts src/graph-explorer/index.ts src/human-input/index.ts src/image/index.ts src/message/index.ts src/sandbox-desktop/index.ts src/sandbox-terminal/index.ts src/selection-toolbar/index.ts src/shared.ts src/stream/index.ts src/thread-list/index.ts --format esm --dts --sourcemap --clean --external react --external react-dom --external @xterm/xterm --external @xterm/addon-fit --external @novnc/novnc",
139
+ "build": "tsdown src/index.ts src/attachment/index.ts src/chat/index.ts src/completion/index.ts src/graph-explorer/index.ts src/human-input/index.ts src/image/index.ts src/message/index.ts src/sandbox-desktop/index.ts src/sandbox-terminal/index.ts src/selection-toolbar/index.ts src/shared.ts src/stream/index.ts src/thread-list/index.ts --format esm --dts --sourcemap --clean --external react --external react-dom --external @xterm/xterm --external @xterm/addon-fit --external @novnc/novnc --no-fixed-extension",
140
140
  "coverage": "vitest run --coverage",
141
141
  "test": "vitest run",
142
142
  "typecheck": "tsc --noEmit"
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,9 +0,0 @@
1
- import { UIAttachment } from '@anvia/client';
2
-
3
- type AttachmentContextValue = {
4
- attachment: UIAttachment;
5
- remove?(): void;
6
- };
7
- declare function useAttachment(): AttachmentContextValue;
8
-
9
- export { type AttachmentContextValue as A, useAttachment as u };
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}