@anvia/react-ui 0.5.1 → 0.6.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 (42) hide show
  1. package/README.md +19 -12
  2. package/dist/attachment/index.js +2 -2
  3. package/dist/chat/index.js +5 -4
  4. package/dist/{chunk-YQJLVBQD.js → chunk-43U2XQP2.js} +8 -2
  5. package/dist/{chunk-YQJLVBQD.js.map → chunk-43U2XQP2.js.map} +1 -1
  6. package/dist/{chunk-GZHTC36V.js → chunk-56CV6S76.js} +2 -2
  7. package/dist/{chunk-NGEDM4XU.js → chunk-7HR34SOF.js} +2 -2
  8. package/dist/{chunk-ZODMCETL.js → chunk-7I6XUWM7.js} +136 -72
  9. package/dist/chunk-7I6XUWM7.js.map +1 -0
  10. package/dist/{chunk-2N5PXLAS.js → chunk-7RMRM7W3.js} +2 -2
  11. package/dist/{chunk-SWGMBZR2.js → chunk-LM5SU5AP.js} +23 -5
  12. package/dist/{chunk-SWGMBZR2.js.map → chunk-LM5SU5AP.js.map} +1 -1
  13. package/dist/{chunk-KNOZLODL.js → chunk-R3NA6BWW.js} +2 -2
  14. package/dist/{chunk-WUMACFYS.js → chunk-SBYUKODG.js} +2 -2
  15. package/dist/chunk-UESNSQGQ.js +302 -0
  16. package/dist/chunk-UESNSQGQ.js.map +1 -0
  17. package/dist/{chunk-T6GPGCK4.js → chunk-VEYJNQVW.js} +2 -2
  18. package/dist/completion/index.js +2 -2
  19. package/dist/human-input/index.js +2 -2
  20. package/dist/image/index.js +2 -2
  21. package/dist/index.d.ts +3 -2
  22. package/dist/index.js +13 -9
  23. package/dist/message/index.d.ts +8 -13
  24. package/dist/message/index.js +4 -3
  25. package/dist/{message-Beb4ZLNU.d.ts → message-CkEnKhAn.d.ts} +2 -0
  26. package/dist/selection-toolbar/index.js +2 -2
  27. package/dist/shared.d.ts +1 -1
  28. package/dist/shared.js +1 -1
  29. package/dist/stream/index.d.ts +20 -0
  30. package/dist/stream/index.js +8 -0
  31. package/dist/stream/index.js.map +1 -0
  32. package/dist/stream/styles.css +9 -0
  33. package/dist/styles.css +5 -8
  34. package/dist/thread-list/index.js +2 -2
  35. package/package.json +20 -14
  36. package/dist/chunk-ZODMCETL.js.map +0 -1
  37. /package/dist/{chunk-GZHTC36V.js.map → chunk-56CV6S76.js.map} +0 -0
  38. /package/dist/{chunk-NGEDM4XU.js.map → chunk-7HR34SOF.js.map} +0 -0
  39. /package/dist/{chunk-2N5PXLAS.js.map → chunk-7RMRM7W3.js.map} +0 -0
  40. /package/dist/{chunk-KNOZLODL.js.map → chunk-R3NA6BWW.js.map} +0 -0
  41. /package/dist/{chunk-WUMACFYS.js.map → chunk-SBYUKODG.js.map} +0 -0
  42. /package/dist/{chunk-T6GPGCK4.js.map → chunk-VEYJNQVW.js.map} +0 -0
@@ -0,0 +1,302 @@
1
+ import {
2
+ renderPrimitive
3
+ } from "./chunk-T3ZFZ3NP.js";
4
+
5
+ // src/stream/markdown.tsx
6
+ import {
7
+ createElement,
8
+ forwardRef,
9
+ memo,
10
+ useMemo,
11
+ useRef
12
+ } from "react";
13
+ import ReactMarkdown from "react-markdown";
14
+ import remarkGfm from "remark-gfm";
15
+
16
+ // src/stream/markdown-blocks.ts
17
+ import { lexer } from "marked";
18
+ function splitStreamMarkdownBlocks(content, options = {}) {
19
+ if (content.length === 0) {
20
+ return [];
21
+ }
22
+ if (options.singleDocument === true) {
23
+ return [{ content, startOffset: 0 }];
24
+ }
25
+ try {
26
+ const tokens = lexer(content, { gfm: false });
27
+ if (tokens.some((token) => token.type === "def") || Object.keys(tokens.links).length > 0) {
28
+ return [{ content, startOffset: 0 }];
29
+ }
30
+ const rawBlocks = [];
31
+ for (const token of tokens) {
32
+ if (token.type === "space" && rawBlocks.length > 0) {
33
+ const lastIndex = rawBlocks.length - 1;
34
+ rawBlocks[lastIndex] = `${rawBlocks[lastIndex] ?? ""}${token.raw}`;
35
+ } else {
36
+ rawBlocks.push(token.raw);
37
+ }
38
+ }
39
+ if (rawBlocks.length === 0 || rawBlocks.join("") !== content) {
40
+ return [{ content, startOffset: 0 }];
41
+ }
42
+ let startOffset = 0;
43
+ return rawBlocks.map((block) => {
44
+ const result = { content: block, startOffset };
45
+ startOffset += block.length;
46
+ return result;
47
+ });
48
+ } catch {
49
+ return [{ content, startOffset: 0 }];
50
+ }
51
+ }
52
+
53
+ // src/stream/markdown-reveal.ts
54
+ var streamRevealConfig = {
55
+ bandGraphemes: 2,
56
+ minimumOpacity: 0.12,
57
+ tailGraphemes: 24
58
+ };
59
+ function createStreamGradientRevealPlugin(frameId) {
60
+ return function streamGradientRevealPlugin() {
61
+ return (tree) => {
62
+ const targets = collectTextTargets(tree);
63
+ const renderedText = targets.map((target) => target.node.value ?? "").join("");
64
+ const bands = createRevealBands(renderedText);
65
+ wrapStreamRevealBands(targets, bands, frameId);
66
+ };
67
+ };
68
+ }
69
+ function collectTextTargets(tree) {
70
+ const targets = [];
71
+ let offset = 0;
72
+ function visit(node, parent, index) {
73
+ if (node.type === "element" && node.tagName === "pre") {
74
+ return;
75
+ }
76
+ if (node.type === "text" && node.value !== void 0 && parent !== void 0) {
77
+ if (!/\S/u.test(node.value)) {
78
+ return;
79
+ }
80
+ const startOffset = offset;
81
+ offset += node.value.length;
82
+ targets.push({
83
+ endOffset: offset,
84
+ index,
85
+ node,
86
+ parent,
87
+ startOffset
88
+ });
89
+ return;
90
+ }
91
+ for (const [childIndex, child] of (node.children ?? []).entries()) {
92
+ visit(child, node, childIndex);
93
+ }
94
+ }
95
+ visit(tree, void 0, 0);
96
+ return targets;
97
+ }
98
+ function createRevealBands(content) {
99
+ const tail = segmentTailGraphemeRanges(content, streamRevealConfig.tailGraphemes);
100
+ const bands = [];
101
+ for (let index = 0; index < tail.length; index += streamRevealConfig.bandGraphemes) {
102
+ const first = tail[index];
103
+ const endIndex = Math.min(index + streamRevealConfig.bandGraphemes, tail.length) - 1;
104
+ const last = tail[endIndex];
105
+ if (first === void 0 || last === void 0) {
106
+ continue;
107
+ }
108
+ const progress = tail.length === 1 ? 1 : endIndex / (tail.length - 1);
109
+ bands.push({
110
+ startOffset: first.startOffset,
111
+ endOffset: last.endOffset,
112
+ opacity: Math.max(
113
+ streamRevealConfig.minimumOpacity,
114
+ 1 - progress * (1 - streamRevealConfig.minimumOpacity)
115
+ )
116
+ });
117
+ }
118
+ return bands;
119
+ }
120
+ function wrapStreamRevealBands(targets, bands, frameId) {
121
+ for (const target of [...targets].reverse()) {
122
+ const value = target.node.value ?? "";
123
+ const intersectingBands = bands.filter(
124
+ (band) => band.endOffset > target.startOffset && band.startOffset < target.endOffset
125
+ );
126
+ if (intersectingBands.length === 0) {
127
+ continue;
128
+ }
129
+ const replacement = [];
130
+ let cursor = 0;
131
+ for (const band of intersectingBands) {
132
+ const start = Math.max(0, band.startOffset - target.startOffset);
133
+ const end = Math.min(value.length, band.endOffset - target.startOffset);
134
+ if (start > cursor) {
135
+ replacement.push({ type: "text", value: value.slice(cursor, start) });
136
+ }
137
+ if (end > start) {
138
+ replacement.push({
139
+ type: "element",
140
+ tagName: "span",
141
+ properties: {
142
+ "data-anvia-stream-frame-id": `${frameId}:${band.startOffset}`,
143
+ "data-anvia-stream-opacity": String(band.opacity),
144
+ "data-anvia-stream-reveal": ""
145
+ },
146
+ children: [{ type: "text", value: value.slice(start, end) }]
147
+ });
148
+ }
149
+ cursor = Math.max(cursor, end);
150
+ }
151
+ if (cursor < value.length) {
152
+ replacement.push({ type: "text", value: value.slice(cursor) });
153
+ }
154
+ target.parent.children?.splice(target.index, 1, ...replacement);
155
+ }
156
+ }
157
+ function segmentTailGraphemeRanges(content, limit) {
158
+ if (typeof Intl !== "undefined" && typeof Intl.Segmenter === "function") {
159
+ const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
160
+ const segments = segmenter.segment(content);
161
+ const ranges2 = [];
162
+ let cursor2 = content.length;
163
+ while (cursor2 > 0 && ranges2.length < limit) {
164
+ const segment = segments.containing(cursor2 - 1);
165
+ if (segment === void 0) {
166
+ break;
167
+ }
168
+ ranges2.unshift({
169
+ startOffset: segment.index,
170
+ endOffset: segment.index + segment.segment.length
171
+ });
172
+ cursor2 = segment.index;
173
+ }
174
+ return ranges2;
175
+ }
176
+ const ranges = [];
177
+ let cursor = content.length;
178
+ while (cursor > 0 && ranges.length < limit) {
179
+ let startOffset = cursor - 1;
180
+ const code = content.charCodeAt(startOffset);
181
+ if (code >= 56320 && code <= 57343 && startOffset > 0) {
182
+ const previousCode = content.charCodeAt(startOffset - 1);
183
+ if (previousCode >= 55296 && previousCode <= 56319) {
184
+ startOffset -= 1;
185
+ }
186
+ }
187
+ ranges.unshift({ startOffset, endOffset: cursor });
188
+ cursor = startOffset;
189
+ }
190
+ return ranges;
191
+ }
192
+
193
+ // src/stream/markdown.tsx
194
+ import { jsx } from "react/jsx-runtime";
195
+ import { createElement as createElement2 } from "react";
196
+ var defaultRemarkPlugins = [remarkGfm];
197
+ var StreamMarkdown = forwardRef(
198
+ function StreamMarkdown2({ components, content, live = false, remarkPlugins, remarkRehypeOptions, ...props }, ref) {
199
+ const previousContentRef = useRef(content);
200
+ const frameIdRef = useRef(0);
201
+ if (previousContentRef.current !== content) {
202
+ previousContentRef.current = content;
203
+ frameIdRef.current += 1;
204
+ }
205
+ const blocks = useMemo(
206
+ () => splitStreamMarkdownBlocks(content, {
207
+ singleDocument: remarkPlugins !== void 0
208
+ }),
209
+ [content, remarkPlugins]
210
+ );
211
+ const streamingComponents = useMemo(() => withStreamRevealComponent(components), [components]);
212
+ return renderPrimitive(
213
+ "div",
214
+ {
215
+ ...props,
216
+ children: blocks.map((block, index) => /* @__PURE__ */ jsx(
217
+ StreamMarkdownBlock,
218
+ {
219
+ components: streamingComponents,
220
+ content: block.content,
221
+ frameId: live && index === blocks.length - 1 ? frameIdRef.current : 0,
222
+ live: live && index === blocks.length - 1,
223
+ remarkPlugins: remarkPlugins ?? defaultRemarkPlugins,
224
+ remarkRehypeOptions
225
+ },
226
+ block.startOffset
227
+ )),
228
+ "data-anvia-stream-markdown": "",
229
+ "data-live": live ? "" : void 0
230
+ },
231
+ ref
232
+ );
233
+ }
234
+ );
235
+ var StreamMarkdownBlock = memo(function StreamMarkdownBlock2(props) {
236
+ const revealPlugin = useMemo(
237
+ () => createStreamGradientRevealPlugin(props.frameId),
238
+ [props.frameId]
239
+ );
240
+ return /* @__PURE__ */ jsx(
241
+ ReactMarkdown,
242
+ {
243
+ components: props.components,
244
+ rehypePlugins: props.live ? [revealPlugin] : void 0,
245
+ remarkPlugins: props.remarkPlugins,
246
+ remarkRehypeOptions: props.remarkRehypeOptions,
247
+ children: props.content
248
+ }
249
+ );
250
+ });
251
+ function withStreamRevealComponent(components) {
252
+ const consumerSpan = components?.span;
253
+ return {
254
+ ...components,
255
+ span(spanProps) {
256
+ const safeProps = componentPropsWithoutKey(spanProps);
257
+ const internalProps = safeProps;
258
+ if (internalProps["data-anvia-stream-reveal"] !== void 0) {
259
+ return streamRevealSpan(internalProps);
260
+ }
261
+ if (consumerSpan !== void 0) {
262
+ return createElement(consumerSpan, safeProps);
263
+ }
264
+ const { node: _node, ...elementProps } = safeProps;
265
+ return /* @__PURE__ */ jsx("span", { ...elementProps });
266
+ }
267
+ };
268
+ }
269
+ function componentPropsWithoutKey(props) {
270
+ const result = {};
271
+ for (const name of Object.keys(props)) {
272
+ if (name !== "key") {
273
+ result[name] = props[name];
274
+ }
275
+ }
276
+ return result;
277
+ }
278
+ function streamRevealSpan(props) {
279
+ const {
280
+ children,
281
+ node: _node,
282
+ "data-anvia-stream-frame-id": frameId,
283
+ "data-anvia-stream-opacity": opacity,
284
+ ...elementProps
285
+ } = props;
286
+ const parsedOpacity = Number(opacity);
287
+ return /* @__PURE__ */ createElement2(
288
+ "span",
289
+ {
290
+ ...elementProps,
291
+ "data-anvia-stream-frame-id": frameId,
292
+ key: frameId ?? "stream-frame",
293
+ style: { opacity: Number.isFinite(parsedOpacity) ? parsedOpacity : 1 }
294
+ },
295
+ children
296
+ );
297
+ }
298
+
299
+ export {
300
+ StreamMarkdown
301
+ };
302
+ //# sourceMappingURL=chunk-UESNSQGQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stream/markdown.tsx","../src/stream/markdown-blocks.ts","../src/stream/markdown-reveal.ts"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n createElement,\n forwardRef,\n memo,\n type ReactNode,\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 } from \"./markdown-reveal\";\n\nexport type StreamMarkdownProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\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 previousContentRef = useRef(content);\n const frameIdRef = useRef(0);\n if (previousContentRef.current !== content) {\n previousContentRef.current = content;\n frameIdRef.current += 1;\n }\n\n const blocks = useMemo(\n () =>\n splitStreamMarkdownBlocks(content, {\n singleDocument: remarkPlugins !== undefined,\n }),\n [content, remarkPlugins],\n );\n const streamingComponents = useMemo(() => withStreamRevealComponent(components), [components]);\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 frameId={live && index === blocks.length - 1 ? frameIdRef.current : 0}\n live={live && index === blocks.length - 1}\n remarkPlugins={remarkPlugins ?? defaultRemarkPlugins}\n remarkRehypeOptions={remarkRehypeOptions}\n key={block.startOffset}\n />\n )),\n \"data-anvia-stream-markdown\": \"\",\n \"data-live\": live ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst StreamMarkdownBlock = memo(function StreamMarkdownBlock(props: {\n components: Components;\n content: string;\n frameId: number;\n live: boolean;\n remarkPlugins: ReactMarkdownOptions[\"remarkPlugins\"];\n remarkRehypeOptions: ReactMarkdownOptions[\"remarkRehypeOptions\"];\n}) {\n const revealPlugin = useMemo(\n () => createStreamGradientRevealPlugin(props.frameId),\n [props.frameId],\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(components: Components | undefined): 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-anvia-stream-frame-id\"?: string | undefined;\n \"data-anvia-stream-opacity\"?: string | undefined;\n \"data-anvia-stream-reveal\"?: string | undefined;\n };\n if (internalProps[\"data-anvia-stream-reveal\"] !== undefined) {\n return streamRevealSpan(internalProps);\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-anvia-stream-frame-id\"?: string | undefined;\n \"data-anvia-stream-opacity\"?: string | undefined;\n \"data-anvia-stream-reveal\"?: string | undefined;\n },\n): ReactNode {\n const {\n children,\n node: _node,\n \"data-anvia-stream-frame-id\": frameId,\n \"data-anvia-stream-opacity\": opacity,\n ...elementProps\n } = props;\n const parsedOpacity = Number(opacity);\n return (\n <span\n {...elementProps}\n data-anvia-stream-frame-id={frameId}\n key={frameId ?? \"stream-frame\"}\n style={{ opacity: Number.isFinite(parsedOpacity) ? parsedOpacity : 1 }}\n >\n {children}\n </span>\n );\n}\n","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 minimumOpacity: 0.12,\n tailGraphemes: 24,\n} as const;\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 RevealBand = {\n endOffset: number;\n opacity: number;\n startOffset: number;\n};\n\nexport function createStreamGradientRevealPlugin(frameId: number) {\n return function streamGradientRevealPlugin() {\n return (tree: MarkdownNode) => {\n const targets = collectTextTargets(tree);\n const renderedText = targets.map((target) => target.node.value ?? \"\").join(\"\");\n const bands = createRevealBands(renderedText);\n wrapStreamRevealBands(targets, bands, frameId);\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 createRevealBands(content: string): RevealBand[] {\n const tail = segmentTailGraphemeRanges(content, streamRevealConfig.tailGraphemes);\n const bands: RevealBand[] = [];\n\n for (let index = 0; index < tail.length; index += streamRevealConfig.bandGraphemes) {\n const first = tail[index];\n const endIndex = Math.min(index + streamRevealConfig.bandGraphemes, tail.length) - 1;\n const last = tail[endIndex];\n if (first === undefined || last === undefined) {\n continue;\n }\n const progress = tail.length === 1 ? 1 : endIndex / (tail.length - 1);\n bands.push({\n startOffset: first.startOffset,\n endOffset: last.endOffset,\n opacity: Math.max(\n streamRevealConfig.minimumOpacity,\n 1 - progress * (1 - streamRevealConfig.minimumOpacity),\n ),\n });\n }\n return bands;\n}\n\nfunction wrapStreamRevealBands(\n targets: readonly TextTarget[],\n bands: readonly RevealBand[],\n frameId: number,\n): void {\n for (const target of [...targets].reverse()) {\n const value = target.node.value ?? \"\";\n const intersectingBands = bands.filter(\n (band) => band.endOffset > target.startOffset && band.startOffset < target.endOffset,\n );\n if (intersectingBands.length === 0) {\n continue;\n }\n\n const replacement: MarkdownNode[] = [];\n let cursor = 0;\n for (const band of intersectingBands) {\n const start = Math.max(0, band.startOffset - target.startOffset);\n const end = Math.min(value.length, band.endOffset - target.startOffset);\n if (start > cursor) {\n replacement.push({ type: \"text\", value: value.slice(cursor, start) });\n }\n if (end > start) {\n replacement.push({\n type: \"element\",\n tagName: \"span\",\n properties: {\n \"data-anvia-stream-frame-id\": `${frameId}:${band.startOffset}`,\n \"data-anvia-stream-opacity\": String(band.opacity),\n \"data-anvia-stream-reveal\": \"\",\n },\n children: [{ type: \"text\", value: value.slice(start, end) }],\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\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"],"mappings":"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","names":["ranges","cursor","createElement","StreamMarkdown","StreamMarkdownBlock"]}
@@ -5,7 +5,7 @@ import {
5
5
  InternalCompletionInputProvider,
6
6
  useCompletionContext,
7
7
  useCompletionInput
8
- } from "./chunk-YQJLVBQD.js";
8
+ } from "./chunk-43U2XQP2.js";
9
9
 
10
10
  // src/completion/form.tsx
11
11
  import {
@@ -197,4 +197,4 @@ var Completion = {
197
197
  export {
198
198
  Completion
199
199
  };
200
- //# sourceMappingURL=chunk-T6GPGCK4.js.map
200
+ //# sourceMappingURL=chunk-VEYJNQVW.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  Completion
3
- } from "../chunk-T6GPGCK4.js";
3
+ } from "../chunk-VEYJNQVW.js";
4
4
  import "../chunk-T3ZFZ3NP.js";
5
5
  import {
6
6
  CompletionProvider,
7
7
  useCompletionContext,
8
8
  useCompletionInput
9
- } from "../chunk-YQJLVBQD.js";
9
+ } from "../chunk-43U2XQP2.js";
10
10
  export {
11
11
  Completion,
12
12
  CompletionProvider,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HumanInput
3
- } from "../chunk-KNOZLODL.js";
3
+ } from "../chunk-R3NA6BWW.js";
4
4
  import "../chunk-T3ZFZ3NP.js";
5
5
  import {
6
6
  useApproval,
@@ -8,7 +8,7 @@ import {
8
8
  useHumanInput,
9
9
  useQuestion,
10
10
  useQuestionPrompt
11
- } from "../chunk-YQJLVBQD.js";
11
+ } from "../chunk-43U2XQP2.js";
12
12
  export {
13
13
  HumanInput,
14
14
  useApproval,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Image
3
- } from "../chunk-NGEDM4XU.js";
3
+ } from "../chunk-7HR34SOF.js";
4
4
  import "../chunk-T3ZFZ3NP.js";
5
5
  import {
6
6
  useImage
7
- } from "../chunk-YQJLVBQD.js";
7
+ } from "../chunk-43U2XQP2.js";
8
8
  export {
9
9
  Image,
10
10
  useImage
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { C as CompletionController, a as CompletionInputContextValue, b as Compl
5
5
  export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, c as ComposerEntitiesUpdate, d as ComposerEntity, e as ComposerEntityData, f as ComposerMessageMetadata, g as ComposerQuote, h as ComposerTriggerDefinition, i as ComposerTriggerItem, j as ComposerTriggerItems, k as ComposerTriggerItemsArgs, l as ComposerTriggerState, m as ComposerTriggerStateUpdate, u as useComposer } from './composer-CzsbDFPt.js';
6
6
  export { A as ApprovalContextValue, Q as QuestionContextValue, a as QuestionPromptContextValue, u as useApproval, b as useQuestion, c as useQuestionPrompt } from './human-input-CydeYm_7.js';
7
7
  export { I as ImageContextValue, u as useImage } from './image-DanUxcl2.js';
8
- export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage, b as useMessagePart } from './message-Beb4ZLNU.js';
8
+ export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage, b as useMessagePart } from './message-CkEnKhAn.js';
9
9
  export { S as SelectionToolbarContextValue, a as SelectionToolbarSelection, u as useSelectionToolbar } from './selection-toolbar-Cwjbuv5S.js';
10
10
  export { T as ThreadContextValue, u as useThread } from './thread-uEm8hH0s.js';
11
11
  export { T as ThreadListController, a as ThreadListItemContextValue, b as ThreadListProvider, c as ThreadListProviderProps, d as ThreadListRecord, u as useThreadList, e as useThreadListItem } from './thread-list-On8db4XL.js';
@@ -13,9 +13,10 @@ export { Composer, ComposerSubmitMessage, ComposerSubmitMessageArgs, Thread } fr
13
13
  export { Completion } from './completion/index.js';
14
14
  export { HumanInput } from './human-input/index.js';
15
15
  export { Image } from './image/index.js';
16
- export { Message, MessageAttachmentPart, MessageEntityProps, MessagePartsFilter, MessageToolPart, MessageToolRenderWhen } from './message/index.js';
16
+ export { Message, MessageAttachmentPart, MessageEntityProps, MessagePartsFilter, MessageStreamOptions, MessageToolPart, MessageToolRenderWhen } from './message/index.js';
17
17
  export { SelectionToolbar } from './selection-toolbar/index.js';
18
18
  export { P as PrimitiveProps, a as PrimitiveRef } from './render-CRKWam2v.js';
19
+ export { StreamMarkdown, StreamMarkdownProps } from './stream/index.js';
19
20
  export { ThreadList, ThreadListItem } from './thread-list/index.js';
20
21
  import '@anvia/react';
21
22
  import 'react';
package/dist/index.js CHANGED
@@ -1,29 +1,32 @@
1
1
  import {
2
2
  SelectionToolbar
3
- } from "./chunk-GZHTC36V.js";
3
+ } from "./chunk-56CV6S76.js";
4
4
  import {
5
5
  ThreadList,
6
6
  ThreadListItem
7
- } from "./chunk-2N5PXLAS.js";
7
+ } from "./chunk-7RMRM7W3.js";
8
8
  import {
9
9
  Composer,
10
10
  Thread
11
- } from "./chunk-SWGMBZR2.js";
11
+ } from "./chunk-LM5SU5AP.js";
12
12
  import {
13
13
  Completion
14
- } from "./chunk-T6GPGCK4.js";
14
+ } from "./chunk-VEYJNQVW.js";
15
15
  import {
16
16
  HumanInput
17
- } from "./chunk-KNOZLODL.js";
17
+ } from "./chunk-R3NA6BWW.js";
18
18
  import {
19
19
  Image
20
- } from "./chunk-NGEDM4XU.js";
20
+ } from "./chunk-7HR34SOF.js";
21
21
  import {
22
22
  Message
23
- } from "./chunk-ZODMCETL.js";
23
+ } from "./chunk-7I6XUWM7.js";
24
+ import {
25
+ StreamMarkdown
26
+ } from "./chunk-UESNSQGQ.js";
24
27
  import {
25
28
  Attachment
26
- } from "./chunk-WUMACFYS.js";
29
+ } from "./chunk-SBYUKODG.js";
27
30
  import "./chunk-T3ZFZ3NP.js";
28
31
  import {
29
32
  ChatProvider,
@@ -45,7 +48,7 @@ import {
45
48
  useThread,
46
49
  useThreadList,
47
50
  useThreadListItem
48
- } from "./chunk-YQJLVBQD.js";
51
+ } from "./chunk-43U2XQP2.js";
49
52
  export {
50
53
  Attachment,
51
54
  ChatProvider,
@@ -56,6 +59,7 @@ export {
56
59
  Image,
57
60
  Message,
58
61
  SelectionToolbar,
62
+ StreamMarkdown,
59
63
  Thread,
60
64
  ThreadList,
61
65
  ThreadListItem,
@@ -1,11 +1,11 @@
1
1
  import * as react_markdown from 'react-markdown';
2
2
  import * as _anvia_react from '@anvia/react';
3
- import { UIMessagePart } from '@anvia/react';
3
+ import { UIMessagePart, StreamSmoothingLifecycle } from '@anvia/react';
4
4
  import * as react from 'react';
5
5
  import { HTMLAttributes } from 'react';
6
6
  export { u as useChatContext } from '../chat-B3kucz1w.js';
7
7
  import { d as ComposerEntity } from '../composer-CzsbDFPt.js';
8
- export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage, b as useMessagePart } from '../message-Beb4ZLNU.js';
8
+ export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage, b as useMessagePart } from '../message-CkEnKhAn.js';
9
9
  import { P as PrimitiveProps } from '../render-CRKWam2v.js';
10
10
 
11
11
  type MessagePartsFilter = (part: UIMessagePart) => boolean;
@@ -16,6 +16,7 @@ type MessageToolRenderWhen = "always" | "pending" | "settled";
16
16
  type MessageAttachmentPart = Extract<UIMessagePart, {
17
17
  type: "attachment";
18
18
  }>;
19
+ type MessageStreamOptions = StreamSmoothingLifecycle;
19
20
 
20
21
  type MessageEntityProps = HTMLAttributes<HTMLSpanElement> & {
21
22
  entity: ComposerEntity;
@@ -31,6 +32,8 @@ declare const Message: {
31
32
  readonly Parts: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
32
33
  children?: react.ReactNode | ((part: _anvia_react.UIMessagePart) => react.ReactNode);
33
34
  filter?: MessagePartsFilter;
35
+ } & {
36
+ stream?: MessageStreamOptions;
34
37
  } & react.RefAttributes<HTMLDivElement>>;
35
38
  readonly Part: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
36
39
  children?: react.ReactNode | ((part: _anvia_react.UIMessagePart) => react.ReactNode);
@@ -38,18 +41,10 @@ declare const Message: {
38
41
  readonly Text: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref">, "asChild"> & {
39
42
  asChild?: boolean;
40
43
  } & {
41
- animate?: boolean;
42
- animationMode?: _anvia_react.StreamAnimationMode;
43
- isStreaming?: boolean;
44
- smoothingPreset?: _anvia_react.StreamSmoothingPreset;
45
- reducedMotion?: boolean;
44
+ stream?: MessageStreamOptions;
46
45
  } & react.RefAttributes<HTMLSpanElement>>;
47
46
  readonly Markdown: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
48
- animate?: boolean;
49
- animationMode?: _anvia_react.StreamAnimationMode;
50
- isStreaming?: boolean;
51
- smoothingPreset?: _anvia_react.StreamSmoothingPreset;
52
- reducedMotion?: boolean;
47
+ stream?: MessageStreamOptions;
53
48
  } & {
54
49
  children?: string;
55
50
  components?: react_markdown.Components;
@@ -106,4 +101,4 @@ declare const Message: {
106
101
  } & react.RefAttributes<HTMLButtonElement>>;
107
102
  };
108
103
 
109
- export { Message, type MessageAttachmentPart, type MessageEntityProps, type MessagePartsFilter, type MessageToolPart, type MessageToolRenderWhen };
104
+ export { Message, type MessageAttachmentPart, type MessageEntityProps, type MessagePartsFilter, type MessageStreamOptions, type MessageToolPart, type MessageToolRenderWhen };
@@ -1,13 +1,14 @@
1
1
  import {
2
2
  Message
3
- } from "../chunk-ZODMCETL.js";
4
- import "../chunk-WUMACFYS.js";
3
+ } from "../chunk-7I6XUWM7.js";
4
+ import "../chunk-UESNSQGQ.js";
5
+ import "../chunk-SBYUKODG.js";
5
6
  import "../chunk-T3ZFZ3NP.js";
6
7
  import {
7
8
  useChatContext,
8
9
  useMessage,
9
10
  useMessagePart
10
- } from "../chunk-YQJLVBQD.js";
11
+ } from "../chunk-43U2XQP2.js";
11
12
  export {
12
13
  Message,
13
14
  useChatContext,
@@ -4,7 +4,9 @@ type MessageContextValue = {
4
4
  message: UIMessage;
5
5
  };
6
6
  type MessagePartContextValue = {
7
+ isLive: boolean;
7
8
  part: UIMessagePart;
9
+ streamControlled: boolean;
8
10
  };
9
11
  declare function useMessage(): MessageContextValue;
10
12
  declare function useMessagePart(): MessagePartContextValue;
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  SelectionToolbar
3
- } from "../chunk-GZHTC36V.js";
3
+ } from "../chunk-56CV6S76.js";
4
4
  import "../chunk-T3ZFZ3NP.js";
5
5
  import {
6
6
  useSelectionToolbar
7
- } from "../chunk-YQJLVBQD.js";
7
+ } from "../chunk-43U2XQP2.js";
8
8
  export {
9
9
  SelectionToolbar,
10
10
  useSelectionToolbar
package/dist/shared.d.ts CHANGED
@@ -4,7 +4,7 @@ export { C as CompletionController, a as CompletionInputContextValue, b as Compl
4
4
  export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, c as ComposerEntitiesUpdate, d as ComposerEntity, e as ComposerEntityData, f as ComposerMessageMetadata, g as ComposerQuote, h as ComposerTriggerDefinition, i as ComposerTriggerItem, j as ComposerTriggerItems, k as ComposerTriggerItemsArgs, l as ComposerTriggerState, m as ComposerTriggerStateUpdate, u as useComposer } from './composer-CzsbDFPt.js';
5
5
  export { A as ApprovalContextValue, Q as QuestionContextValue, a as QuestionPromptContextValue, u as useApproval, b as useQuestion, c as useQuestionPrompt } from './human-input-CydeYm_7.js';
6
6
  export { I as ImageContextValue, u as useImage } from './image-DanUxcl2.js';
7
- export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage, b as useMessagePart } from './message-Beb4ZLNU.js';
7
+ export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage, b as useMessagePart } from './message-CkEnKhAn.js';
8
8
  export { S as SelectionToolbarContextValue, a as SelectionToolbarSelection, u as useSelectionToolbar } from './selection-toolbar-Cwjbuv5S.js';
9
9
  export { T as ThreadContextValue, u as useThread } from './thread-uEm8hH0s.js';
10
10
  export { T as ThreadListController, a as ThreadListItemContextValue, b as ThreadListProvider, c as ThreadListProviderProps, d as ThreadListRecord, u as useThreadList, e as useThreadListItem } from './thread-list-On8db4XL.js';
package/dist/shared.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  useThread,
19
19
  useThreadList,
20
20
  useThreadListItem
21
- } from "./chunk-YQJLVBQD.js";
21
+ } from "./chunk-43U2XQP2.js";
22
22
  export {
23
23
  ChatProvider,
24
24
  CompletionProvider,
@@ -0,0 +1,20 @@
1
+ import * as react from 'react';
2
+ import { Components, Options } from 'react-markdown';
3
+ import { P as PrimitiveProps } from '../render-CRKWam2v.js';
4
+
5
+ type StreamMarkdownProps = Omit<PrimitiveProps<"div">, "children"> & {
6
+ components?: Components;
7
+ content: string;
8
+ live?: boolean;
9
+ remarkPlugins?: Options["remarkPlugins"];
10
+ remarkRehypeOptions?: Options["remarkRehypeOptions"];
11
+ };
12
+ declare const StreamMarkdown: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
13
+ components?: Components;
14
+ content: string;
15
+ live?: boolean;
16
+ remarkPlugins?: Options["remarkPlugins"];
17
+ remarkRehypeOptions?: Options["remarkRehypeOptions"];
18
+ } & react.RefAttributes<HTMLDivElement>>;
19
+
20
+ export { StreamMarkdown, type StreamMarkdownProps };
@@ -0,0 +1,8 @@
1
+ import {
2
+ StreamMarkdown
3
+ } from "../chunk-UESNSQGQ.js";
4
+ import "../chunk-T3ZFZ3NP.js";
5
+ export {
6
+ StreamMarkdown
7
+ };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,9 @@
1
+ @keyframes anvia-stream-gradient-settle {
2
+ to {
3
+ opacity: 1;
4
+ }
5
+ }
6
+
7
+ [data-anvia-stream-reveal] {
8
+ animation: anvia-stream-gradient-settle 180ms linear both;
9
+ }