@anvia/react-ui 1.3.0 → 1.3.1

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 (131) hide show
  1. package/dist/attachment/index.d.ts +3 -21
  2. package/dist/attachment/index.js +3 -12
  3. package/dist/attachment-DsKTPumt.js +89 -0
  4. package/dist/attachment-DsKTPumt.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-CAnvUEAv.js +1210 -0
  8. package/dist/chat-CAnvUEAv.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-D_7vaQCR.js +302 -0
  30. package/dist/image-D_7vaQCR.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-Dn3wW6yy.js +783 -0
  49. package/dist/message-Dn3wW6yy.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/value-BGGrx72L.js +13 -0
  80. package/dist/value-BGGrx72L.js.map +1 -0
  81. package/package.json +22 -22
  82. package/dist/attachment/index.js.map +0 -1
  83. package/dist/attachment-mbjsroli.d.ts +0 -9
  84. package/dist/chat/index.js.map +0 -1
  85. package/dist/chat-PSj1Fo4W.d.ts +0 -88
  86. package/dist/chunk-22EZJUPM.js +0 -120
  87. package/dist/chunk-22EZJUPM.js.map +0 -1
  88. package/dist/chunk-5FZKTDZR.js +0 -201
  89. package/dist/chunk-5FZKTDZR.js.map +0 -1
  90. package/dist/chunk-6XOJFLX4.js +0 -22
  91. package/dist/chunk-6XOJFLX4.js.map +0 -1
  92. package/dist/chunk-CKA4CE26.js +0 -25
  93. package/dist/chunk-CKA4CE26.js.map +0 -1
  94. package/dist/chunk-DLBNFBXQ.js +0 -425
  95. package/dist/chunk-DLBNFBXQ.js.map +0 -1
  96. package/dist/chunk-E73S3SOF.js +0 -404
  97. package/dist/chunk-E73S3SOF.js.map +0 -1
  98. package/dist/chunk-F6AKBUO3.js +0 -380
  99. package/dist/chunk-F6AKBUO3.js.map +0 -1
  100. package/dist/chunk-HGOPGZNQ.js +0 -195
  101. package/dist/chunk-HGOPGZNQ.js.map +0 -1
  102. package/dist/chunk-KHB5CHAU.js +0 -220
  103. package/dist/chunk-KHB5CHAU.js.map +0 -1
  104. package/dist/chunk-LHABOAOP.js +0 -316
  105. package/dist/chunk-LHABOAOP.js.map +0 -1
  106. package/dist/chunk-N5XQU36W.js +0 -410
  107. package/dist/chunk-N5XQU36W.js.map +0 -1
  108. package/dist/chunk-T3ZFZ3NP.js +0 -30
  109. package/dist/chunk-T3ZFZ3NP.js.map +0 -1
  110. package/dist/chunk-T4IYUEPH.js +0 -1612
  111. package/dist/chunk-T4IYUEPH.js.map +0 -1
  112. package/dist/chunk-W2AHKMRS.js +0 -1092
  113. package/dist/chunk-W2AHKMRS.js.map +0 -1
  114. package/dist/completion/index.js.map +0 -1
  115. package/dist/completion-input-DHlwrhxB.d.ts +0 -24
  116. package/dist/composer-6iCSIq6L.d.ts +0 -111
  117. package/dist/human-input/index.js.map +0 -1
  118. package/dist/human-input-CkLrZ8IC.d.ts +0 -27
  119. package/dist/image/index.js.map +0 -1
  120. package/dist/image-VZv6Ddsn.d.ts +0 -14
  121. package/dist/message/index.js.map +0 -1
  122. package/dist/message-CNRnZQwU.d.ts +0 -14
  123. package/dist/render-CRKWam2v.d.ts +0 -8
  124. package/dist/selection-toolbar/index.js.map +0 -1
  125. package/dist/selection-toolbar-Cwjbuv5S.d.ts +0 -14
  126. package/dist/shared.js.map +0 -1
  127. package/dist/stream/index.js.map +0 -1
  128. package/dist/thread-Bz6-1zaJ.d.ts +0 -12
  129. package/dist/thread-list/index.js.map +0 -1
  130. package/dist/thread-list-On8db4XL.d.ts +0 -34
  131. 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":";;;;;;;AAOA,SAAgB,0BACd,SACA,UAAwC,CAAC,GAClB;CACvB,IAAI,QAAQ,WAAW,GACrB,OAAO,CAAC;CAEV,IAAI,QAAQ,mBAAmB,MAC7B,OAAO,CAAC;EAAE;EAAS,aAAa;CAAE,CAAC;CAGrC,IAAI;EACF,MAAM,SAAS,MAAM,SAAS,EAAE,KAAK,MAAM,CAAC;EAC5C,IAAI,OAAO,MAAM,UAAU,MAAM,SAAS,KAAK,KAAK,OAAO,KAAK,OAAO,KAAK,CAAC,CAAC,SAAS,GACrF,OAAO,CAAC;GAAE;GAAS,aAAa;EAAE,CAAC;EAGrC,MAAM,YAAsB,CAAC;EAC7B,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,SAAS,WAAW,UAAU,SAAS,GAAG;GAClD,MAAM,YAAY,UAAU,SAAS;GACrC,UAAU,aAAa,GAAG,UAAU,cAAc,KAAK,MAAM;EAC/D,OACE,UAAU,KAAK,MAAM,GAAG;EAI5B,IAAI,UAAU,WAAW,KAAK,UAAU,KAAK,EAAE,MAAM,SACnD,OAAO,CAAC;GAAE;GAAS,aAAa;EAAE,CAAC;EAGrC,IAAI,cAAc;EAClB,OAAO,UAAU,KAAK,UAAU;GAC9B,MAAM,SAAS;IAAE,SAAS;IAAO;GAAY;GAC7C,eAAe,MAAM;GACrB,OAAO;EACT,CAAC;CACH,QAAQ;EACN,OAAO,CAAC;GAAE;GAAS,aAAa;EAAE,CAAC;CACrC;AACF;;AC/CA,MAAa,qBAAqB;CAChC,eAAe;CACf,YAAY;CACZ,gBAAgB;CAChB,eAAe;AACjB;AA8BA,SAAgB,iCACd,gBACA,WACA;CACA,OAAO,SAAS,6BAA6B;EAC3C,QAAQ,SAAuB;GAC7B,IAAI,UAAU,gBAAgB,gBAAgB;IAC5C,UAAU,cAAc;IACxB,UAAU,iBAAiB,MAAM;IACjC,UAAU,oBAAoB,MAAM;GACtC;GACA,MAAM,UAAU,mBAAmB,IAAI;GAGvC,0BAA0B,SADR,sBADG,QAAQ,KAAK,WAAW,OAAO,KAAK,SAAS,EAAE,CAAC,CAAC,KAAK,EACxB,CACR,GAAG,gBAAgB,SAAS;EACzE;CACF;AACF;AAEA,SAAS,mBAAmB,MAAkC;CAC5D,MAAM,UAAwB,CAAC;CAC/B,IAAI,SAAS;CAEb,SAAS,MAAM,MAAoB,QAAkC,OAAqB;EACxF,IAAI,KAAK,SAAS,aAAa,KAAK,YAAY,OAC9C;EAEF,IAAI,KAAK,SAAS,UAAU,KAAK,UAAU,KAAA,KAAa,WAAW,KAAA,GAAW;GAC5E,IAAI,CAAC,MAAM,KAAK,KAAK,KAAK,GACxB;GAEF,MAAM,cAAc;GACpB,UAAU,KAAK,MAAM;GACrB,QAAQ,KAAK;IACX,WAAW;IACX;IACA;IACA;IACA;GACF,CAAC;GACD;EACF;EACA,KAAK,MAAM,CAAC,YAAY,WAAW,KAAK,YAAY,CAAC,EAAA,CAAG,QAAQ,GAC9D,MAAM,OAAO,MAAM,UAAU;CAEjC;CAEA,MAAM,MAAM,KAAA,GAAW,CAAC;CACxB,OAAO;AACT;AAEA,SAAS,sBAAsB,SAAmC;CAChE,MAAM,OAAO,0BAA0B,SAAS,mBAAmB,aAAa;CAChF,MAAM,YAA8B,CAAC;CAErC,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,WAAW,KAAK;EACtB,MAAM,iBACJ,KAAK,MAAM,QAAQ,mBAAmB,aAAa,IAAI,mBAAmB;EAC5E,MAAM,eACJ,KAAK,IAAI,iBAAiB,mBAAmB,eAAe,KAAK,MAAM,IAAI;EAC7E,IAAI,aAAa,KAAA,GACf;EAEF,MAAM,WAAW,KAAK,WAAW,IAAI,IAAI,gBAAgB,KAAK,SAAS;EACvE,UAAU,KAAK;GACb,aAAa,SAAS;GACtB,WAAW,SAAS;GACpB,SAAS,KAAK,IACZ,mBAAmB,gBACnB,IAAI,YAAY,IAAI,mBAAmB,eACzC;EACF,CAAC;CACH;CACA,OAAO;AACT;AAEA,SAAS,0BACP,SACA,WACA,gBACA,WACM;CACN,MAAM,kCAAkB,IAAI,IAAY;CACxC,MAAM,QAAQ,KAAK,IAAI;CACvB,KAAK,MAAM,UAAU,CAAC,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;EAC3C,MAAM,QAAQ,OAAO,KAAK,SAAS;EACnC,MAAM,wBAAwB,UAAU,QACrC,aACC,SAAS,YAAY,OAAO,eAAe,SAAS,cAAc,OAAO,SAC7E;EACA,IAAI,sBAAsB,WAAW,GACnC;EAGF,MAAM,cAA8B,CAAC;EACrC,IAAI,SAAS;EACb,KAAK,MAAM,YAAY,uBAAuB;GAC5C,MAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,cAAc,OAAO,WAAW;GACnE,MAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,SAAS,YAAY,OAAO,WAAW;GAC1E,IAAI,QAAQ,QACV,YAAY,KAAK;IAAE,MAAM;IAAQ,OAAO,MAAM,MAAM,QAAQ,KAAK;GAAE,CAAC;GAEtE,IAAI,MAAM,OAAO;IACf,MAAM,OAAO,MAAM,MAAM,OAAO,GAAG;IAGnC,MAAM,WAAW,GAAG,eAAe,GAFb,OAAO,cAAc,MAES,GADhC,OAAO,cAAc,IAC0B,GAAG,SAAS,IAAI;IACnF,gBAAgB,IAAI,QAAQ;IAC5B,MAAM,YAAY,UAAU,oBAAoB,IAAI,QAAQ,KAAK;IACjE,UAAU,oBAAoB,IAAI,UAAU,SAAS;IACrD,MAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,SAAS;IAC/C,IAAI,aAAa,mBAAmB,YAClC,UAAU,iBAAiB,IAAI,QAAQ;IAEzC,IAAI,UAAU,iBAAiB,IAAI,QAAQ,GACzC,YAAY,KAAK;KAAE,MAAM;KAAQ,OAAO;IAAK,CAAC;SACzC;KACL,MAAM,WAAW,KAAK,IAAI,YAAY,mBAAmB,YAAY,CAAC;KACtE,MAAM,UAAU,SAAS,WAAW,IAAI,SAAS,WAAW;KAC5D,MAAM,cAAc,KAAK,IAAI,GAAG,mBAAmB,aAAa,SAAS;KACzE,YAAY,KAAK;MACf,MAAM;MACN,SAAS;MACT,YAAY;OACV,2BAA2B,OAAO,WAAW;OAC7C,uBAAuB,OAAO,OAAO;OACrC,kBAAkB;OAClB,cAAc;MAChB;MACA,UAAU,CAAC;OAAE,MAAM;OAAQ,OAAO;MAAK,CAAC;KAC1C,CAAC;IACH;GACF;GACA,SAAS,KAAK,IAAI,QAAQ,GAAG;EAC/B;EACA,IAAI,SAAS,MAAM,QACjB,YAAY,KAAK;GAAE,MAAM;GAAQ,OAAO,MAAM,MAAM,MAAM;EAAE,CAAC;EAE/D,OAAO,OAAO,UAAU,OAAO,OAAO,OAAO,GAAG,GAAG,WAAW;CAChE;CAEA,qBAAqB,WAAW,eAAe;AACjD;AAEA,SAAS,qBACP,WACA,iBACM;CACN,KAAK,MAAM,YAAY,UAAU,oBAAoB,KAAK,GACxD,IAAI,CAAC,gBAAgB,IAAI,QAAQ,GAAG,UAAU,oBAAoB,OAAO,QAAQ;CAEnF,KAAK,MAAM,YAAY,UAAU,kBAC/B,IAAI,CAAC,gBAAgB,IAAI,QAAQ,GAAG,UAAU,iBAAiB,OAAO,QAAQ;AAElF;AAEA,SAAS,SAAS,MAAsB;CACtC,IAAI,OAAO;CACX,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,QAAQ,KAAK,WAAW,KAAK;EAC7B,OAAO,KAAK,KAAK,MAAM,QAAU;CACnC;CACA,QAAQ,SAAS,EAAA,CAAG,SAAS,EAAE;AACjC;AAEA,SAAS,0BACP,SACA,OAIC;CACD,IAAI,OAAO,SAAS,eAAe,OAAO,KAAK,cAAc,YAAY;EAEvE,MAAM,WAAW,IADK,KAAK,UAAU,KAAA,GAAW,EAAE,aAAa,WAAW,CACjD,CAAC,CAAC,QAAQ,OAAO;EAC1C,MAAM,SAA4D,CAAC;EACnE,IAAI,SAAS,QAAQ;EACrB,OAAO,SAAS,KAAK,OAAO,SAAS,OAAO;GAC1C,MAAM,UAAU,SAAS,WAAW,SAAS,CAAC;GAC9C,IAAI,YAAY,KAAA,GACd;GAEF,OAAO,QAAQ;IACb,aAAa,QAAQ;IACrB,WAAW,QAAQ,QAAQ,QAAQ,QAAQ;GAC7C,CAAC;GACD,SAAS,QAAQ;EACnB;EACA,OAAO;CACT;CAEA,MAAM,SAA4D,CAAC;CACnE,IAAI,SAAS,QAAQ;CACrB,OAAO,SAAS,KAAK,OAAO,SAAS,OAAO;EAC1C,IAAI,cAAc,SAAS;EAC3B,MAAM,OAAO,QAAQ,WAAW,WAAW;EAC3C,IAAI,QAAQ,SAAU,QAAQ,SAAU,cAAc,GAAG;GACvD,MAAM,eAAe,QAAQ,WAAW,cAAc,CAAC;GACvD,IAAI,gBAAgB,SAAU,gBAAgB,OAC5C,eAAe;EAEnB;EACA,OAAO,QAAQ;GAAE;GAAa,WAAW;EAAO,CAAC;EACjD,SAAS;CACX;CACA,OAAO;AACT;;ACpNA,MAAM,uBAA2E,CAAC,SAAS;AAE3F,MAAa,iBAAiB,WAC5B,SAAS,eACP,EAAE,YAAY,SAAS,OAAO,OAAO,eAAe,qBAAqB,GAAG,SAC5E,KACA;CACA,MAAM,qBAAqB,OAAO;EAChC,aAAa;EACb;EACA,IAAI;EACJ,kCAAkB,IAAI,IAAY;EAClC,qCAAqB,IAAI,IAAoB;CAC/C,CAAmE;CACnE,MAAM,kBAAkB,mBAAmB;CAC3C,IAAI,gBAAgB,YAAY,SAAS;EACvC,IAAI,CAAC,QAAQ,WAAW,gBAAgB,OAAO,GAAG;GAChD,gBAAgB,MAAM;GACtB,gBAAgB,cAAc;GAC9B,gBAAgB,iBAAiB,MAAM;GACvC,gBAAgB,oBAAoB,MAAM;EAC5C;EACA,gBAAgB,UAAU;CAC5B;CACA,IAAI,CAAC,QAAQ,gBAAgB,gBAAgB,MAC3C,KAAK,MAAM,YAAY,gBAAgB,oBAAoB,KAAK,GAC9D,gBAAgB,iBAAiB,IAAI,QAAQ;CAGjD,MAAM,eAAe,aAAa,aAAqB;EACrD,mBAAmB,QAAQ,iBAAiB,IAAI,QAAQ;CAC1D,GAAG,CAAC,CAAC;CAEL,MAAM,SAAS,cAEX,0BAA0B,SAAS,EACjC,gBAAgB,kBAAkB,KAAA,EACpC,CAAC,GACH,CAAC,SAAS,aAAa,CACzB;CACA,MAAM,sBAAsB,cACpB,0BAA0B,YAAY,YAAY,GACxD,CAAC,YAAY,YAAY,CAC3B;CAEA,OAAO,gBACL,OACA;EACE,GAAG;EACH,UAAU,OAAO,KAAK,OAAO,UAC3B,oBAAC,qBAAD;GACE,YAAY;GACZ,SAAS,MAAM;GACf,MAAM,QAAQ,UAAU,OAAO,SAAS;GACvB;GACjB,aAAa,GAAG,gBAAgB,GAAG,GAAG,MAAM;GAC5C,eAAe,iBAAiB;GACX;EAEtB,GADM,MAAM,WACZ,CACF;EACD,aAAa;EACb,cAAc,MAAM,kBAAkB,OAAO,cAAc;CAC7D,GACA,GACF;AACF,CACF;AAEA,MAAM,sBAAsB,KAAK,SAAS,oBAAoB,OAQ3D;CACD,MAAM,eAAe,cACb,iCAAiC,MAAM,aAAa,MAAM,eAAe,GAC/E,CAAC,MAAM,aAAa,MAAM,eAAe,CAC3C;CACA,OACE,oBAAC,eAAD;EACE,YAAY,MAAM;EAClB,eAAe,MAAM,OAAO,CAAC,YAAY,IAAI,KAAA;EAC7C,eAAe,MAAM;EACrB,qBAAqB,MAAM;EAE1B,UAAA,MAAM;CACM,CAAA;AAEnB,CAAC;AAED,SAAS,0BACP,YACA,iBACY;CACZ,MAAM,eAAe,YAAY;CACjC,OAAO;EACL,GAAG;EACH,KAAK,WAAW;GACd,MAAM,YAAY,yBAAyB,SAAS;GACpD,MAAM,gBAAgB;GAMtB,IAAI,cAAc,kBAAkB,aAClC,OAAO,iBAAiB,eAAe,eAAe;GAExD,IAAI,iBAAiB,KAAA,GACnB,OAAO,cAAc,cAAc,SAAS;GAE9C,MAAM,EAAE,MAAM,OAAO,GAAG,iBAAiB;GACzC,OAAO,oBAAC,QAAD,EAAM,GAAI,aAAe,CAAA;EAClC;CACF;AACF;AAEA,SAAS,yBAA2C,OAAa;CAC/D,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,QAAQ,OAAO,KAAK,KAAK,GAClC,IAAI,SAAS,OACX,OAAO,QAAS,MAAkC;CAGtD,OAAO;AACT;AAEA,SAAS,iBACP,OAMA,iBACW;CACX,MAAM,EACJ,UACA,MAAM,OACN,2BAA2B,YAC3B,uBAAuB,SACvB,kBAAkB,UAClB,gBACA,GAAG,iBACD;CACJ,MAAM,gBAAgB,OAAO,OAAO;CACpC,MAAM,mBAAmB,OAAO,UAAU;CAC1C,OACE,8BAAC,QAAD;EACE,GAAI;EACJ,cAAW;EACX,KAAK,YAAY;EACjB,iBAAiB,UAAU;GACzB,iBAAiB,KAAK;GACtB,IAAI,aAAa,KAAA,GAAW,gBAAgB,QAAQ;EACtD;EACA,OACE;GACE,iCAAiC,OAAO,SAAS,aAAa,IAAI,gBAAgB;GAClF,kCAAkC,GAAG,OAAO,SAAS,gBAAgB,IAAI,mBAAmB,IAAI;EAClG;CAIE,GADH,QACG;AAEV"}
@@ -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,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.1",
4
4
  "description": "Composable, headless React UI primitives for Anvia applications.",
5
5
  "author": "anvia",
6
6
  "license": "MIT",
@@ -78,27 +78,27 @@
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.0",
102
102
  "@anvia/react": "^1.1.5",
103
103
  "@anvia/graph": "^1.1.6"
104
104
  },
@@ -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",
135
- "@anvia/react": "1.1.5",
136
- "@anvia/graph": "1.1.6"
134
+ "@anvia/client": "1.8.0",
135
+ "@anvia/graph": "1.1.6",
136
+ "@anvia/react": "1.1.5"
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":[]}
@@ -1,88 +0,0 @@
1
- import { ClientMetadata, ClientDataMap, ClientTransport, ClientStreamRequest } from '@anvia/client';
2
- import { UseChatResult } from '@anvia/react';
3
- import { ReactNode, ReactElement } from 'react';
4
-
5
- type JsonPrimitive = string | number | boolean | null;
6
- /** Any JSON-compatible value: primitives, objects, or readonly arrays of JSON values. */
7
- type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];
8
- type JsonObject = {
9
- [key: string]: JsonValue;
10
- };
11
- /** Answer to one question asked by a tool suspended on a human interaction. */
12
- type ToolQuestionAnswer = Readonly<{
13
- questionId: string;
14
- value: string;
15
- }>;
16
-
17
- type AgentQuestionChoice = Readonly<{
18
- label: string;
19
- value: string;
20
- }>;
21
- type AgentQuestionPrompt = Readonly<{
22
- id: string;
23
- text: string;
24
- choices?: readonly AgentQuestionChoice[];
25
- allowCustom?: boolean;
26
- }>;
27
- type AgentQuestionAnswer = ToolQuestionAnswer;
28
- type AgentInteractionRequestBase = Readonly<{
29
- id: string;
30
- toolName: string;
31
- toolCallId: string;
32
- callId?: string;
33
- internalCallId: string;
34
- }>;
35
- type AgentToolApprovalRequest = AgentInteractionRequestBase & Readonly<{
36
- type: "tool-approval";
37
- input: JsonValue;
38
- reason?: string;
39
- }>;
40
- type AgentToolQuestionRequest = AgentInteractionRequestBase & Readonly<{
41
- type: "tool-question";
42
- questions: readonly AgentQuestionPrompt[];
43
- }>;
44
- type AgentInteractionRequest = AgentToolApprovalRequest | AgentToolQuestionRequest;
45
-
46
- type ChatController<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap> = UseChatResult<ClientTransport<ClientStreamRequest, Data, Metadata>>;
47
- type ChatProviderProps<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap> = {
48
- controller: ChatController<Metadata, Data>;
49
- children?: ReactNode;
50
- };
51
- declare function ChatProvider<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap>({ controller, children }: ChatProviderProps<Metadata, Data>): ReactElement;
52
- declare function useChatContext<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap>(): ChatController<Metadata, Data>;
53
- declare function useHumanInput(): {
54
- approvals: {
55
- all: (Readonly<{
56
- request: AgentInteractionRequest;
57
- runId: string;
58
- status: "pending" | "responded" | "cancelled";
59
- }> & {
60
- request: AgentToolApprovalRequest;
61
- })[];
62
- pending: (Readonly<{
63
- request: AgentInteractionRequest;
64
- runId: string;
65
- status: "pending" | "responded" | "cancelled";
66
- }> & {
67
- request: AgentToolApprovalRequest;
68
- })[];
69
- };
70
- questions: {
71
- all: (Readonly<{
72
- request: AgentInteractionRequest;
73
- runId: string;
74
- status: "pending" | "responded" | "cancelled";
75
- }> & {
76
- request: AgentToolQuestionRequest;
77
- })[];
78
- pending: (Readonly<{
79
- request: AgentInteractionRequest;
80
- runId: string;
81
- status: "pending" | "responded" | "cancelled";
82
- }> & {
83
- request: AgentToolQuestionRequest;
84
- })[];
85
- };
86
- };
87
-
88
- export { type AgentToolApprovalRequest as A, type ChatController as C, ChatProvider as a, type ChatProviderProps as b, useHumanInput as c, type AgentToolQuestionRequest as d, type AgentQuestionAnswer as e, type AgentQuestionPrompt as f, useChatContext as u };