@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.
- package/README.md +19 -12
- package/dist/attachment/index.js +2 -2
- package/dist/chat/index.js +5 -4
- package/dist/{chunk-YQJLVBQD.js → chunk-43U2XQP2.js} +8 -2
- package/dist/{chunk-YQJLVBQD.js.map → chunk-43U2XQP2.js.map} +1 -1
- package/dist/{chunk-GZHTC36V.js → chunk-56CV6S76.js} +2 -2
- package/dist/{chunk-NGEDM4XU.js → chunk-7HR34SOF.js} +2 -2
- package/dist/{chunk-ZODMCETL.js → chunk-7I6XUWM7.js} +136 -72
- package/dist/chunk-7I6XUWM7.js.map +1 -0
- package/dist/{chunk-2N5PXLAS.js → chunk-7RMRM7W3.js} +2 -2
- package/dist/{chunk-SWGMBZR2.js → chunk-LM5SU5AP.js} +23 -5
- package/dist/{chunk-SWGMBZR2.js.map → chunk-LM5SU5AP.js.map} +1 -1
- package/dist/{chunk-KNOZLODL.js → chunk-R3NA6BWW.js} +2 -2
- package/dist/{chunk-WUMACFYS.js → chunk-SBYUKODG.js} +2 -2
- package/dist/chunk-UESNSQGQ.js +302 -0
- package/dist/chunk-UESNSQGQ.js.map +1 -0
- package/dist/{chunk-T6GPGCK4.js → chunk-VEYJNQVW.js} +2 -2
- package/dist/completion/index.js +2 -2
- package/dist/human-input/index.js +2 -2
- package/dist/image/index.js +2 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +13 -9
- package/dist/message/index.d.ts +8 -13
- package/dist/message/index.js +4 -3
- package/dist/{message-Beb4ZLNU.d.ts → message-CkEnKhAn.d.ts} +2 -0
- package/dist/selection-toolbar/index.js +2 -2
- package/dist/shared.d.ts +1 -1
- package/dist/shared.js +1 -1
- package/dist/stream/index.d.ts +20 -0
- package/dist/stream/index.js +8 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/styles.css +9 -0
- package/dist/styles.css +5 -8
- package/dist/thread-list/index.js +2 -2
- package/package.json +20 -14
- package/dist/chunk-ZODMCETL.js.map +0 -1
- /package/dist/{chunk-GZHTC36V.js.map → chunk-56CV6S76.js.map} +0 -0
- /package/dist/{chunk-NGEDM4XU.js.map → chunk-7HR34SOF.js.map} +0 -0
- /package/dist/{chunk-2N5PXLAS.js.map → chunk-7RMRM7W3.js.map} +0 -0
- /package/dist/{chunk-KNOZLODL.js.map → chunk-R3NA6BWW.js.map} +0 -0
- /package/dist/{chunk-WUMACFYS.js.map → chunk-SBYUKODG.js.map} +0 -0
- /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-
|
|
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-
|
|
200
|
+
//# sourceMappingURL=chunk-VEYJNQVW.js.map
|
package/dist/completion/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Completion
|
|
3
|
-
} from "../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
11
|
+
} from "../chunk-43U2XQP2.js";
|
|
12
12
|
export {
|
|
13
13
|
HumanInput,
|
|
14
14
|
useApproval,
|
package/dist/image/index.js
CHANGED
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-
|
|
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-
|
|
3
|
+
} from "./chunk-56CV6S76.js";
|
|
4
4
|
import {
|
|
5
5
|
ThreadList,
|
|
6
6
|
ThreadListItem
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7RMRM7W3.js";
|
|
8
8
|
import {
|
|
9
9
|
Composer,
|
|
10
10
|
Thread
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-LM5SU5AP.js";
|
|
12
12
|
import {
|
|
13
13
|
Completion
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-VEYJNQVW.js";
|
|
15
15
|
import {
|
|
16
16
|
HumanInput
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-R3NA6BWW.js";
|
|
18
18
|
import {
|
|
19
19
|
Image
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-7HR34SOF.js";
|
|
21
21
|
import {
|
|
22
22
|
Message
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-7I6XUWM7.js";
|
|
24
|
+
import {
|
|
25
|
+
StreamMarkdown
|
|
26
|
+
} from "./chunk-UESNSQGQ.js";
|
|
24
27
|
import {
|
|
25
28
|
Attachment
|
|
26
|
-
} from "./chunk-
|
|
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-
|
|
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,
|
package/dist/message/index.d.ts
CHANGED
|
@@ -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-
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|
package/dist/message/index.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Message
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
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-
|
|
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-
|
|
3
|
+
} from "../chunk-56CV6S76.js";
|
|
4
4
|
import "../chunk-T3ZFZ3NP.js";
|
|
5
5
|
import {
|
|
6
6
|
useSelectionToolbar
|
|
7
|
-
} from "../chunk-
|
|
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-
|
|
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
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|