@mastra/playground-ui 45.0.0 → 45.1.0-alpha.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 (59) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/dist/CommandPalette.css +135 -0
  3. package/dist/command-Duq1xsiS.js +168 -0
  4. package/dist/command-Duq1xsiS.js.map +1 -0
  5. package/dist/command-qsEykgml.cjs +197 -0
  6. package/dist/command-qsEykgml.cjs.map +1 -0
  7. package/dist/components/ChatShell.cjs.js +96 -0
  8. package/dist/components/ChatShell.cjs.js.map +1 -0
  9. package/dist/components/ChatShell.d.ts +2 -0
  10. package/dist/components/ChatShell.es.js +92 -0
  11. package/dist/components/ChatShell.es.js.map +1 -0
  12. package/dist/components/Command.cjs.js +10 -191
  13. package/dist/components/Command.cjs.js.map +1 -1
  14. package/dist/components/Command.es.js +1 -167
  15. package/dist/components/Command.es.js.map +1 -1
  16. package/dist/components/CommandPalette.cjs.js +180 -0
  17. package/dist/components/CommandPalette.cjs.js.map +1 -0
  18. package/dist/components/CommandPalette.d.ts +2 -0
  19. package/dist/components/CommandPalette.es.js +169 -0
  20. package/dist/components/CommandPalette.es.js.map +1 -0
  21. package/dist/components/Kbd.cjs.js +3 -24
  22. package/dist/components/Kbd.cjs.js.map +1 -1
  23. package/dist/components/Kbd.es.js +1 -26
  24. package/dist/components/Kbd.es.js.map +1 -1
  25. package/dist/components/MessageScroller.cjs.js +8 -524
  26. package/dist/components/MessageScroller.cjs.js.map +1 -1
  27. package/dist/components/MessageScroller.es.js +2 -504
  28. package/dist/components/MessageScroller.es.js.map +1 -1
  29. package/dist/components/ThreadRail.cjs.js +1 -1
  30. package/dist/components/ThreadRail.es.js +1 -1
  31. package/dist/kbd-Br7kdwaB.cjs +34 -0
  32. package/dist/kbd-Br7kdwaB.cjs.map +1 -0
  33. package/dist/kbd-DE0nj4DL.js +32 -0
  34. package/dist/kbd-DE0nj4DL.js.map +1 -0
  35. package/dist/message-scroller-BQpwFsqj.js +563 -0
  36. package/dist/message-scroller-BQpwFsqj.js.map +1 -0
  37. package/dist/message-scroller-DIgCd5n3.cjs +589 -0
  38. package/dist/message-scroller-DIgCd5n3.cjs.map +1 -0
  39. package/dist/{message-scroller-hooks-DdXqrmC2.cjs → message-scroller-context-_VfCYFBU.cjs} +6 -48
  40. package/dist/message-scroller-context-_VfCYFBU.cjs.map +1 -0
  41. package/dist/message-scroller-context-tTA6jxho.js +23 -0
  42. package/dist/message-scroller-context-tTA6jxho.js.map +1 -0
  43. package/dist/message-scroller-hooks-BxAf8k0Y.cjs +72 -0
  44. package/dist/message-scroller-hooks-BxAf8k0Y.cjs.map +1 -0
  45. package/dist/{message-scroller-hooks-CdsHnth6.js → message-scroller-hooks-D5yxCon2.js} +3 -19
  46. package/dist/message-scroller-hooks-D5yxCon2.js.map +1 -0
  47. package/dist/src/ds/components/ChatShell/chat-shell.d.ts +46 -0
  48. package/dist/src/ds/components/ChatShell/chat-shell.stories.d.ts +8 -0
  49. package/dist/src/ds/components/ChatShell/index.d.ts +11 -0
  50. package/dist/src/ds/components/CommandPalette/command-palette.d.ts +37 -0
  51. package/dist/src/ds/components/CommandPalette/command-palette.stories.d.ts +12 -0
  52. package/dist/src/ds/components/CommandPalette/index.d.ts +1 -0
  53. package/dist/src/ds/components/Kbd/kbd.d.ts +2 -1
  54. package/dist/src/ds/components/MessageScroller/message-scroller-context.d.ts +4 -0
  55. package/dist/src/ds/components/MessageScroller/message-scroller.d.ts +8 -7
  56. package/dist/style.css +343 -2
  57. package/package.json +6 -6
  58. package/dist/message-scroller-hooks-CdsHnth6.js.map +0 -1
  59. package/dist/message-scroller-hooks-DdXqrmC2.cjs.map +0 -1
@@ -2,537 +2,21 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const jsxRuntime = require('react/jsx-runtime');
6
- const lucideReact = require('lucide-react');
7
- const React = require('react');
8
- const messageScrollerHooks = require('../message-scroller-hooks-DdXqrmC2.cjs');
9
- const utils_cn = require('../cn-vA5sWo9W.cjs');
5
+ const messageScroller = require('../message-scroller-DIgCd5n3.cjs');
6
+ const messageScrollerHooks = require('../message-scroller-hooks-BxAf8k0Y.cjs');
10
7
 
11
- function _interopNamespaceDefault(e) {
12
- const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
13
- if (e) {
14
- for (const k in e) {
15
- if (k !== 'default') {
16
- const d = Object.getOwnPropertyDescriptor(e, k);
17
- Object.defineProperty(n, k, d.get ? d : {
18
- enumerable: true,
19
- get: () => e[k]
20
- });
21
- }
22
- }
23
- }
24
- n.default = e;
25
- return Object.freeze(n);
26
- }
27
8
 
28
- const React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
29
-
30
- const VISIBILITY_EPSILON = 0.5;
31
- const mergeRefs = (...refs) => (element) => {
32
- refs.forEach((ref) => {
33
- if (!ref) return;
34
- if (typeof ref === "function") {
35
- ref(element);
36
- return;
37
- }
38
- ref.current = element;
39
- });
40
- };
41
- const scrollableMatches = (left, right) => left.start === right.start && left.end === right.end;
42
- const visibilityMatches = (left, right) => left.currentAnchorId === right.currentAnchorId && left.visibleMessageIds.length === right.visibleMessageIds.length && left.visibleMessageIds.every((messageId, index) => messageId === right.visibleMessageIds[index]);
43
- const getContentPadding = (contentElement) => {
44
- if (!contentElement) return { start: 0, end: 0 };
45
- const styles = window.getComputedStyle(contentElement);
46
- return {
47
- start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop || "0") || 0,
48
- end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom || "0") || 0
49
- };
50
- };
51
- const getRelativeTop = (element, viewportElement) => {
52
- const elementRect = element.getBoundingClientRect();
53
- const viewportRect = viewportElement.getBoundingClientRect();
54
- return elementRect.top - viewportRect.top + viewportElement.scrollTop;
55
- };
56
- const scrollViewportTo = (viewportElement, top, behavior) => {
57
- if (typeof viewportElement.scrollTo === "function") {
58
- viewportElement.scrollTo({ top, behavior });
59
- return;
60
- }
61
- viewportElement.scrollTop = top;
62
- };
63
- const scheduleScrollSync = (callback) => {
64
- if (typeof window.requestAnimationFrame === "function") {
65
- window.requestAnimationFrame(callback);
66
- return;
67
- }
68
- window.setTimeout(callback, 0);
69
- };
70
- const getScrollTarget = ({
71
- align,
72
- element,
73
- scrollMargin,
74
- viewportElement
75
- }) => {
76
- const contentPadding = getContentPadding(element.parentElement);
77
- const elementTop = getRelativeTop(element, viewportElement);
78
- const elementHeight = element.getBoundingClientRect().height;
79
- const visibleHeight = Math.max(0, viewportElement.clientHeight - contentPadding.start - contentPadding.end);
80
- if (align === "center") return elementTop - contentPadding.start - (visibleHeight - elementHeight) / 2 - scrollMargin;
81
- if (align === "end")
82
- return elementTop - viewportElement.clientHeight + elementHeight + contentPadding.end + scrollMargin;
83
- if (align === "nearest") {
84
- const elementBottom = elementTop + elementHeight;
85
- const viewportTop = viewportElement.scrollTop + contentPadding.start;
86
- const viewportBottom = viewportElement.scrollTop + viewportElement.clientHeight - contentPadding.end;
87
- if (elementTop >= viewportTop && elementBottom <= viewportBottom) return viewportElement.scrollTop;
88
- return elementTop < viewportTop ? elementTop - contentPadding.start - scrollMargin : elementBottom - viewportElement.clientHeight + contentPadding.end + scrollMargin;
89
- }
90
- return elementTop - contentPadding.start - scrollMargin;
91
- };
92
- const getCurrentAnchorId = ({
93
- fallbackAnchorId,
94
- items,
95
- scrollMargin,
96
- scrollPreviousItemPeek,
97
- visibleMessageIds,
98
- viewportElement
99
- }) => {
100
- const anchorLine = viewportElement.getBoundingClientRect().top + scrollMargin + scrollPreviousItemPeek;
101
- const anchors = items.filter(([, item]) => item.scrollAnchor);
102
- let anchoredAboveViewport;
103
- for (const [messageId, item] of anchors) {
104
- if (item.element.getBoundingClientRect().top <= anchorLine + VISIBILITY_EPSILON) {
105
- anchoredAboveViewport = messageId;
106
- }
107
- }
108
- if (anchoredAboveViewport) return anchoredAboveViewport;
109
- return anchors.find(([messageId]) => visibleMessageIds.has(messageId))?.[0] ?? fallbackAnchorId;
110
- };
111
- function MessageScrollerProvider({
112
- autoScroll = false,
113
- children,
114
- defaultScrollPosition = "end",
115
- scrollEdgeThreshold = messageScrollerHooks.DEFAULT_SCROLL_EDGE_THRESHOLD,
116
- scrollMargin = messageScrollerHooks.DEFAULT_SCROLL_MARGIN,
117
- scrollPreviousItemPeek = messageScrollerHooks.DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK
118
- }) {
119
- const itemsRef = React__namespace.useRef(null);
120
- itemsRef.current ??= /* @__PURE__ */ new Map();
121
- const itemsRegistry = itemsRef.current;
122
- const visibleMessageIdsRef = React__namespace.useRef(null);
123
- visibleMessageIdsRef.current ??= /* @__PURE__ */ new Set();
124
- const intersectingMessageIds = visibleMessageIdsRef.current;
125
- const [itemsVersion, setItemsVersion] = React__namespace.useState(0);
126
- const [rootElement, setRootElement] = React__namespace.useState(null);
127
- const [viewportElement, setViewportElement] = React__namespace.useState(null);
128
- const [contentElement, setContentElement] = React__namespace.useState(null);
129
- const defaultScrollAppliedRef = React__namespace.useRef(false);
130
- const [scrollable, setScrollable] = React__namespace.useState(messageScrollerHooks.DEFAULT_SCROLLABLE);
131
- const [visibility, setVisibility] = React__namespace.useState(messageScrollerHooks.DEFAULT_VISIBILITY);
132
- const publishScrollable = React__namespace.useCallback(
133
- (nextScrollable) => {
134
- const scrollableValue = [nextScrollable.start && "start", nextScrollable.end && "end"].filter(Boolean).join(" ");
135
- for (const element of [rootElement, viewportElement]) {
136
- if (!element) continue;
137
- if (scrollableValue) {
138
- element.setAttribute("data-scrollable", scrollableValue);
139
- } else {
140
- element.removeAttribute("data-scrollable");
141
- }
142
- }
143
- setScrollable((current) => scrollableMatches(current, nextScrollable) ? current : nextScrollable);
144
- },
145
- [rootElement, viewportElement]
146
- );
147
- const publishVisibility = React__namespace.useCallback((nextVisibility) => {
148
- setVisibility((current) => visibilityMatches(current, nextVisibility) ? current : nextVisibility);
149
- }, []);
150
- const updateScrollable = React__namespace.useCallback(() => {
151
- if (!viewportElement) {
152
- publishScrollable(messageScrollerHooks.DEFAULT_SCROLLABLE);
153
- return;
154
- }
155
- const remainingScroll = viewportElement.scrollHeight - viewportElement.scrollTop - viewportElement.clientHeight;
156
- publishScrollable({
157
- start: viewportElement.scrollTop > scrollEdgeThreshold,
158
- end: remainingScroll > scrollEdgeThreshold
159
- });
160
- }, [publishScrollable, scrollEdgeThreshold, viewportElement]);
161
- const updateVisibility = React__namespace.useCallback(() => {
162
- const items = Array.from(itemsRegistry.entries());
163
- const fallbackAnchorId = items.filter(([, item]) => item.scrollAnchor).at(-1)?.[0] ?? items.at(-1)?.[0];
164
- if (items.length === 0) {
165
- publishVisibility(messageScrollerHooks.DEFAULT_VISIBILITY);
166
- return;
167
- }
168
- if (!viewportElement) {
169
- publishVisibility({
170
- currentAnchorId: fallbackAnchorId,
171
- visibleMessageIds: fallbackAnchorId ? [fallbackAnchorId] : []
172
- });
173
- return;
174
- }
175
- const viewportRect = viewportElement.getBoundingClientRect();
176
- const visibleMessageIds = /* @__PURE__ */ new Set();
177
- if (typeof IntersectionObserver === "undefined") {
178
- const visibilityTop = viewportRect.top + scrollMargin + scrollPreviousItemPeek;
179
- items.forEach(([messageId, item]) => {
180
- const rect = item.element.getBoundingClientRect();
181
- if (rect.bottom > visibilityTop && rect.top < viewportRect.bottom) visibleMessageIds.add(messageId);
182
- });
183
- } else {
184
- intersectingMessageIds.forEach((messageId) => visibleMessageIds.add(messageId));
185
- }
186
- const orderedVisibleMessageIds = items.flatMap(
187
- ([messageId]) => visibleMessageIds.has(messageId) ? [messageId] : []
188
- );
189
- publishVisibility({
190
- currentAnchorId: getCurrentAnchorId({
191
- fallbackAnchorId,
192
- items,
193
- scrollMargin,
194
- scrollPreviousItemPeek,
195
- visibleMessageIds,
196
- viewportElement
197
- }),
198
- visibleMessageIds: orderedVisibleMessageIds.length > 0 ? orderedVisibleMessageIds : fallbackAnchorId ? [fallbackAnchorId] : []
199
- });
200
- }, [intersectingMessageIds, itemsRegistry, publishVisibility, scrollMargin, scrollPreviousItemPeek, viewportElement]);
201
- const syncAfterScroll = React__namespace.useCallback(() => {
202
- updateScrollable();
203
- updateVisibility();
204
- }, [updateScrollable, updateVisibility]);
205
- const scrollToElement = React__namespace.useCallback(
206
- (element, {
207
- align = "start",
208
- behavior = "auto",
209
- scrollMargin: optionScrollMargin = scrollMargin
210
- } = {}) => {
211
- if (!viewportElement || !contentElement?.contains(element)) return false;
212
- const nextScrollTop = Math.max(
213
- 0,
214
- getScrollTarget({ align, element, scrollMargin: optionScrollMargin, viewportElement })
215
- );
216
- if (Math.abs(viewportElement.scrollTop - nextScrollTop) <= VISIBILITY_EPSILON) {
217
- scrollViewportTo(viewportElement, nextScrollTop, "auto");
218
- syncAfterScroll();
219
- return true;
220
- }
221
- scrollViewportTo(viewportElement, nextScrollTop, behavior);
222
- scheduleScrollSync(syncAfterScroll);
223
- return true;
224
- },
225
- [contentElement, scrollMargin, syncAfterScroll, viewportElement]
226
- );
227
- const scrollToStart = React__namespace.useCallback(
228
- ({ behavior = "auto" } = {}) => {
229
- if (!viewportElement) return false;
230
- scrollViewportTo(viewportElement, 0, behavior);
231
- scheduleScrollSync(syncAfterScroll);
232
- return true;
233
- },
234
- [syncAfterScroll, viewportElement]
235
- );
236
- const scrollToEnd = React__namespace.useCallback(
237
- ({ behavior = "auto" } = {}) => {
238
- if (!viewportElement) return false;
239
- scrollViewportTo(
240
- viewportElement,
241
- Math.max(0, viewportElement.scrollHeight - viewportElement.clientHeight),
242
- behavior
243
- );
244
- scheduleScrollSync(syncAfterScroll);
245
- return true;
246
- },
247
- [syncAfterScroll, viewportElement]
248
- );
249
- const scrollToMessage = React__namespace.useCallback(
250
- (messageId, options) => {
251
- const item = itemsRegistry.get(messageId);
252
- if (!item) return false;
253
- return scrollToElement(item.element, options);
254
- },
255
- [itemsRegistry, scrollToElement]
256
- );
257
- const registerItem = React__namespace.useCallback(
258
- (messageId, element, scrollAnchor) => {
259
- itemsRegistry.set(messageId, { element, scrollAnchor });
260
- setItemsVersion((version) => version + 1);
261
- return () => {
262
- const current = itemsRegistry.get(messageId);
263
- if (current?.element !== element) return;
264
- itemsRegistry.delete(messageId);
265
- intersectingMessageIds.delete(messageId);
266
- setItemsVersion((version) => version + 1);
267
- };
268
- },
269
- [intersectingMessageIds, itemsRegistry]
270
- );
271
- React__namespace.useEffect(() => {
272
- if (!contentElement || !viewportElement || typeof IntersectionObserver === "undefined") {
273
- updateVisibility();
274
- return void 0;
275
- }
276
- const messageIdByElement = /* @__PURE__ */ new Map();
277
- for (const [messageId, item] of itemsRegistry) {
278
- messageIdByElement.set(item.element, messageId);
279
- }
280
- const observer = new IntersectionObserver(
281
- (entries) => {
282
- for (const entry of entries) {
283
- const messageId = messageIdByElement.get(entry.target);
284
- if (!messageId) continue;
285
- if (entry.isIntersecting) {
286
- intersectingMessageIds.add(messageId);
287
- } else {
288
- intersectingMessageIds.delete(messageId);
289
- }
290
- }
291
- updateVisibility();
292
- },
293
- {
294
- root: viewportElement,
295
- rootMargin: `${-(scrollMargin + scrollPreviousItemPeek)}px 0px 0px 0px`,
296
- threshold: [0, 0.01, 0.5, 1]
297
- }
298
- );
299
- for (const [, item] of itemsRegistry) observer.observe(item.element);
300
- updateVisibility();
301
- return () => observer.disconnect();
302
- }, [
303
- contentElement,
304
- intersectingMessageIds,
305
- itemsRegistry,
306
- itemsVersion,
307
- scrollMargin,
308
- scrollPreviousItemPeek,
309
- updateVisibility,
310
- viewportElement
311
- ]);
312
- React__namespace.useEffect(() => {
313
- if (!viewportElement || typeof ResizeObserver === "undefined") return void 0;
314
- const observer = new ResizeObserver(syncAfterScroll);
315
- observer.observe(viewportElement);
316
- return () => observer.disconnect();
317
- }, [syncAfterScroll, viewportElement]);
318
- React__namespace.useLayoutEffect(() => {
319
- updateScrollable();
320
- updateVisibility();
321
- }, [itemsVersion, updateScrollable, updateVisibility]);
322
- React__namespace.useLayoutEffect(() => {
323
- if (defaultScrollAppliedRef.current || !viewportElement || itemsRegistry.size === 0) return;
324
- let didScroll = false;
325
- if (defaultScrollPosition === "start") {
326
- didScroll = scrollToStart({ behavior: "auto" });
327
- } else if (defaultScrollPosition === "last-anchor") {
328
- const lastAnchorId = Array.from(itemsRegistry.entries()).filter(([, item]) => item.scrollAnchor).at(-1)?.[0];
329
- didScroll = lastAnchorId ? scrollToMessage(lastAnchorId, { align: "start", behavior: "auto" }) : scrollToEnd({ behavior: "auto" });
330
- } else {
331
- didScroll = scrollToEnd({ behavior: "auto" });
332
- }
333
- if (didScroll) defaultScrollAppliedRef.current = true;
334
- }, [
335
- defaultScrollPosition,
336
- itemsRegistry,
337
- itemsVersion,
338
- scrollToEnd,
339
- scrollToMessage,
340
- scrollToStart,
341
- viewportElement
342
- ]);
343
- React__namespace.useLayoutEffect(() => {
344
- if (!autoScroll || !defaultScrollAppliedRef.current) return;
345
- scrollToEnd({ behavior: "auto" });
346
- }, [autoScroll, itemsVersion, scrollToEnd]);
347
- const actionsContextValue = React__namespace.useMemo(
348
- () => ({
349
- registerItem,
350
- scrollToEnd,
351
- scrollToMessage,
352
- scrollToStart,
353
- setContentElement,
354
- setRootElement,
355
- setViewportElement,
356
- syncAfterScroll
357
- }),
358
- [registerItem, scrollToEnd, scrollToMessage, scrollToStart, syncAfterScroll]
359
- );
360
- const scrollableContextValue = React__namespace.useMemo(
361
- () => ({
362
- end: scrollable.end,
363
- start: scrollable.start
364
- }),
365
- [scrollable.end, scrollable.start]
366
- );
367
- const visibilityContextValue = React__namespace.useMemo(
368
- () => ({
369
- currentAnchorId: visibility.currentAnchorId,
370
- visibleMessageIds: visibility.visibleMessageIds
371
- }),
372
- [visibility.currentAnchorId, visibility.visibleMessageIds]
373
- );
374
- return /* @__PURE__ */ jsxRuntime.jsx(messageScrollerHooks.MessageScrollerActionsContext.Provider, { value: actionsContextValue, children: /* @__PURE__ */ jsxRuntime.jsx(messageScrollerHooks.MessageScrollerScrollableContext.Provider, { value: scrollableContextValue, children: /* @__PURE__ */ jsxRuntime.jsx(messageScrollerHooks.MessageScrollerVisibilityContext.Provider, { value: visibilityContextValue, children }) }) });
375
- }
376
- const MessageScroller = React__namespace.forwardRef(
377
- ({ className, ...props }, ref) => {
378
- const { setRootElement } = messageScrollerHooks.useRequiredMessageScrollerActionsContext("MessageScroller");
379
- return /* @__PURE__ */ jsxRuntime.jsx(
380
- "div",
381
- {
382
- ref: mergeRefs(setRootElement, ref),
383
- "data-slot": "message-scroller",
384
- className: utils_cn.cn("group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden", className),
385
- ...props
386
- }
387
- );
388
- }
389
- );
390
- MessageScroller.displayName = "MessageScroller";
391
- const MessageScrollerViewport = React__namespace.forwardRef(
392
- ({ className, onScroll, preserveScrollOnPrepend, role, tabIndex, ...props }, ref) => {
393
- const { setViewportElement, syncAfterScroll } = messageScrollerHooks.useRequiredMessageScrollerActionsContext("MessageScrollerViewport");
394
- const viewportRef = React__namespace.useMemo(() => mergeRefs(setViewportElement, ref), [ref, setViewportElement]);
395
- return /* @__PURE__ */ jsxRuntime.jsx(
396
- "div",
397
- {
398
- ref: viewportRef,
399
- role: role ?? "region",
400
- tabIndex: tabIndex ?? 0,
401
- "data-slot": "message-scroller-viewport",
402
- "data-preserve-scroll-on-prepend": preserveScrollOnPrepend ? "true" : void 0,
403
- className: utils_cn.cn(
404
- "size-full min-h-0 min-w-0 overflow-y-auto overscroll-contain data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent",
405
- className
406
- ),
407
- onScroll: (event) => {
408
- syncAfterScroll();
409
- onScroll?.(event);
410
- },
411
- ...props
412
- }
413
- );
414
- }
415
- );
416
- MessageScrollerViewport.displayName = "MessageScrollerViewport";
417
- const MessageScrollerContent = React__namespace.forwardRef(
418
- ({ children, className, spacerClassName, role, "aria-relevant": ariaRelevant = "additions", ...props }, ref) => {
419
- const { setContentElement, syncAfterScroll } = messageScrollerHooks.useRequiredMessageScrollerActionsContext("MessageScrollerContent");
420
- const [contentElement, setLocalContentElement] = React__namespace.useState(null);
421
- const contentRef = React__namespace.useMemo(
422
- () => mergeRefs(setContentElement, setLocalContentElement, ref),
423
- [ref, setContentElement]
424
- );
425
- React__namespace.useLayoutEffect(() => {
426
- syncAfterScroll();
427
- }, [syncAfterScroll]);
428
- React__namespace.useEffect(() => {
429
- if (!contentElement || typeof MutationObserver === "undefined") return void 0;
430
- const observer = new MutationObserver(syncAfterScroll);
431
- observer.observe(contentElement, { childList: true, subtree: false });
432
- return () => observer.disconnect();
433
- }, [contentElement, syncAfterScroll]);
434
- React__namespace.useEffect(() => {
435
- if (!contentElement || typeof ResizeObserver === "undefined") return void 0;
436
- const observer = new ResizeObserver(syncAfterScroll);
437
- observer.observe(contentElement);
438
- return () => observer.disconnect();
439
- }, [contentElement, syncAfterScroll]);
440
- return /* @__PURE__ */ jsxRuntime.jsxs(
441
- "div",
442
- {
443
- ref: contentRef,
444
- role: role ?? "log",
445
- "aria-relevant": ariaRelevant,
446
- "data-slot": "message-scroller-content",
447
- className: utils_cn.cn("flex h-max min-h-full flex-col gap-6", className),
448
- ...props,
449
- children: [
450
- children,
451
- /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": "true", "data-message-scroller-spacer": "", hidden: true, className: spacerClassName })
452
- ]
453
- }
454
- );
455
- }
456
- );
457
- MessageScrollerContent.displayName = "MessageScrollerContent";
458
- const MessageScrollerItem = React__namespace.forwardRef(
459
- ({ className, messageId, scrollAnchor = false, ...props }, ref) => {
460
- const { registerItem } = messageScrollerHooks.useRequiredMessageScrollerActionsContext("MessageScrollerItem");
461
- const unregisterRef = React__namespace.useRef(void 0);
462
- const itemRef = React__namespace.useCallback(
463
- (element) => {
464
- unregisterRef.current?.();
465
- unregisterRef.current = void 0;
466
- mergeRefs(ref)(element);
467
- if (!element || !messageId) return;
468
- unregisterRef.current = registerItem(messageId, element, scrollAnchor);
469
- },
470
- [messageId, ref, registerItem, scrollAnchor]
471
- );
472
- return /* @__PURE__ */ jsxRuntime.jsx(
473
- "div",
474
- {
475
- ref: itemRef,
476
- "data-slot": "message-scroller-item",
477
- "data-message-id": messageId,
478
- "data-scroll-anchor": scrollAnchor ? "true" : "false",
479
- className: utils_cn.cn("min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]", className),
480
- ...props
481
- }
482
- );
483
- }
484
- );
485
- MessageScrollerItem.displayName = "MessageScrollerItem";
486
- const MessageScrollerButton = React__namespace.forwardRef(
487
- ({ behavior = "smooth", direction = "end", className, children, onClick, tabIndex, type = "button", ...props }, ref) => {
488
- const { scrollToEnd, scrollToStart } = messageScrollerHooks.useRequiredMessageScrollerActionsContext("MessageScrollerButton");
489
- const { start, end } = messageScrollerHooks.useRequiredMessageScrollerScrollableContext("MessageScrollerButton");
490
- const active = direction === "start" ? start : end;
491
- return /* @__PURE__ */ jsxRuntime.jsx(
492
- "button",
493
- {
494
- ref,
495
- type,
496
- ...props,
497
- "data-slot": "message-scroller-button",
498
- "data-active": active ? "true" : "false",
499
- "data-direction": direction,
500
- tabIndex: active ? tabIndex : -1,
501
- className: utils_cn.cn(
502
- "absolute inset-s-1/2 -translate-x-1/2 rounded-full border border-border1 bg-surface3 text-neutral6 transition-[translate,scale,opacity] duration-200 hover:bg-surface4 data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180",
503
- className
504
- ),
505
- onClick: (event) => {
506
- if (!active) return;
507
- onClick?.(event);
508
- if (event.defaultPrevented) return;
509
- event.currentTarget.blur();
510
- if (direction === "start") {
511
- scrollToStart({ behavior });
512
- } else {
513
- scrollToEnd({ behavior });
514
- }
515
- },
516
- children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
517
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowDownIcon, { className: "size-4", "aria-hidden": true }),
518
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: direction === "end" ? "Scroll to end" : "Scroll to start" })
519
- ] })
520
- }
521
- );
522
- }
523
- );
524
- MessageScrollerButton.displayName = "MessageScrollerButton";
525
9
 
10
+ exports.MessageScroller = messageScroller.MessageScroller;
11
+ exports.MessageScrollerButton = messageScroller.MessageScrollerButton;
12
+ exports.MessageScrollerContent = messageScroller.MessageScrollerContent;
13
+ exports.MessageScrollerItem = messageScroller.MessageScrollerItem;
14
+ exports.MessageScrollerProvider = messageScroller.MessageScrollerProvider;
15
+ exports.MessageScrollerViewport = messageScroller.MessageScrollerViewport;
526
16
  exports.useMessageScroller = messageScrollerHooks.useMessageScroller;
527
17
  exports.useMessageScrollerScrollable = messageScrollerHooks.useMessageScrollerScrollable;
528
18
  exports.useMessageScrollerVisibility = messageScrollerHooks.useMessageScrollerVisibility;
529
19
  exports.useOptionalMessageScroller = messageScrollerHooks.useOptionalMessageScroller;
530
20
  exports.useOptionalMessageScrollerScrollable = messageScrollerHooks.useOptionalMessageScrollerScrollable;
531
21
  exports.useOptionalMessageScrollerVisibility = messageScrollerHooks.useOptionalMessageScrollerVisibility;
532
- exports.MessageScroller = MessageScroller;
533
- exports.MessageScrollerButton = MessageScrollerButton;
534
- exports.MessageScrollerContent = MessageScrollerContent;
535
- exports.MessageScrollerItem = MessageScrollerItem;
536
- exports.MessageScrollerProvider = MessageScrollerProvider;
537
- exports.MessageScrollerViewport = MessageScrollerViewport;
538
22
  //# sourceMappingURL=MessageScroller.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageScroller.cjs.js","sources":["../../src/ds/components/MessageScroller/message-scroller.tsx"],"sourcesContent":["import { ArrowDownIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport {\n DEFAULT_SCROLL_EDGE_THRESHOLD,\n DEFAULT_SCROLL_MARGIN,\n DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK,\n DEFAULT_SCROLLABLE,\n DEFAULT_VISIBILITY,\n MessageScrollerActionsContext,\n MessageScrollerScrollableContext,\n MessageScrollerVisibilityContext,\n useRequiredMessageScrollerActionsContext,\n useRequiredMessageScrollerScrollableContext,\n} from './message-scroller-context';\nimport type {\n MessageScrollerActionsContextValue,\n MessageScrollerButtonDirection,\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollOptions,\n MessageScrollerScrollable,\n MessageScrollerVisibility,\n} from './message-scroller-context';\n\nimport { cn } from '@/lib/utils';\n\nexport type {\n MessageScrollerButtonDirection,\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollOptions,\n MessageScrollerScrollable,\n MessageScrollerVisibility,\n} from './message-scroller-context';\n\ntype MessageScrollerItemRecord = {\n element: HTMLElement;\n scrollAnchor: boolean;\n};\n\nconst VISIBILITY_EPSILON = 0.5;\n\nconst mergeRefs =\n <TElement,>(...refs: Array<React.Ref<TElement> | undefined>) =>\n (element: TElement | null) => {\n refs.forEach(ref => {\n if (!ref) return;\n if (typeof ref === 'function') {\n ref(element);\n return;\n }\n ref.current = element;\n });\n };\n\nconst scrollableMatches = (left: MessageScrollerScrollable, right: MessageScrollerScrollable) =>\n left.start === right.start && left.end === right.end;\n\nconst visibilityMatches = (left: MessageScrollerVisibility, right: MessageScrollerVisibility) =>\n left.currentAnchorId === right.currentAnchorId &&\n left.visibleMessageIds.length === right.visibleMessageIds.length &&\n left.visibleMessageIds.every((messageId, index) => messageId === right.visibleMessageIds[index]);\n\nconst getContentPadding = (contentElement: HTMLElement | null) => {\n if (!contentElement) return { start: 0, end: 0 };\n const styles = window.getComputedStyle(contentElement);\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop || '0') || 0,\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom || '0') || 0,\n };\n};\n\nconst getRelativeTop = (element: HTMLElement, viewportElement: HTMLElement) => {\n const elementRect = element.getBoundingClientRect();\n const viewportRect = viewportElement.getBoundingClientRect();\n return elementRect.top - viewportRect.top + viewportElement.scrollTop;\n};\n\nconst scrollViewportTo = (viewportElement: HTMLElement, top: number, behavior: ScrollBehavior) => {\n if (typeof viewportElement.scrollTo === 'function') {\n viewportElement.scrollTo({ top, behavior });\n return;\n }\n\n viewportElement.scrollTop = top;\n};\n\nconst scheduleScrollSync = (callback: () => void) => {\n if (typeof window.requestAnimationFrame === 'function') {\n window.requestAnimationFrame(callback);\n return;\n }\n\n window.setTimeout(callback, 0);\n};\n\nconst getScrollTarget = ({\n align,\n element,\n scrollMargin,\n viewportElement,\n}: {\n align: MessageScrollerScrollAlign;\n element: HTMLElement;\n scrollMargin: number;\n viewportElement: HTMLElement;\n}) => {\n const contentPadding = getContentPadding(element.parentElement);\n const elementTop = getRelativeTop(element, viewportElement);\n const elementHeight = element.getBoundingClientRect().height;\n const visibleHeight = Math.max(0, viewportElement.clientHeight - contentPadding.start - contentPadding.end);\n\n if (align === 'center') return elementTop - contentPadding.start - (visibleHeight - elementHeight) / 2 - scrollMargin;\n if (align === 'end')\n return elementTop - viewportElement.clientHeight + elementHeight + contentPadding.end + scrollMargin;\n\n if (align === 'nearest') {\n const elementBottom = elementTop + elementHeight;\n const viewportTop = viewportElement.scrollTop + contentPadding.start;\n const viewportBottom = viewportElement.scrollTop + viewportElement.clientHeight - contentPadding.end;\n if (elementTop >= viewportTop && elementBottom <= viewportBottom) return viewportElement.scrollTop;\n return elementTop < viewportTop\n ? elementTop - contentPadding.start - scrollMargin\n : elementBottom - viewportElement.clientHeight + contentPadding.end + scrollMargin;\n }\n\n return elementTop - contentPadding.start - scrollMargin;\n};\n\nconst getCurrentAnchorId = ({\n fallbackAnchorId,\n items,\n scrollMargin,\n scrollPreviousItemPeek,\n visibleMessageIds,\n viewportElement,\n}: {\n fallbackAnchorId: string | undefined;\n items: Array<readonly [string, MessageScrollerItemRecord]>;\n scrollMargin: number;\n scrollPreviousItemPeek: number;\n visibleMessageIds: Set<string>;\n viewportElement: HTMLElement;\n}) => {\n const anchorLine = viewportElement.getBoundingClientRect().top + scrollMargin + scrollPreviousItemPeek;\n const anchors = items.filter(([, item]) => item.scrollAnchor);\n let anchoredAboveViewport: string | undefined;\n\n for (const [messageId, item] of anchors) {\n if (item.element.getBoundingClientRect().top <= anchorLine + VISIBILITY_EPSILON) {\n anchoredAboveViewport = messageId;\n }\n }\n\n if (anchoredAboveViewport) return anchoredAboveViewport;\n return anchors.find(([messageId]) => visibleMessageIds.has(messageId))?.[0] ?? fallbackAnchorId;\n};\n\nexport interface MessageScrollerProviderProps {\n autoScroll?: boolean;\n children?: React.ReactNode;\n defaultScrollPosition?: MessageScrollerDefaultScrollPosition;\n scrollEdgeThreshold?: number;\n scrollMargin?: number;\n scrollPreviousItemPeek?: number;\n}\n\nexport function MessageScrollerProvider({\n autoScroll = false,\n children,\n defaultScrollPosition = 'end',\n scrollEdgeThreshold = DEFAULT_SCROLL_EDGE_THRESHOLD,\n scrollMargin = DEFAULT_SCROLL_MARGIN,\n scrollPreviousItemPeek = DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK,\n}: MessageScrollerProviderProps) {\n const itemsRef = React.useRef<Map<string, MessageScrollerItemRecord> | null>(null);\n itemsRef.current ??= new Map<string, MessageScrollerItemRecord>();\n const itemsRegistry = itemsRef.current;\n const visibleMessageIdsRef = React.useRef<Set<string> | null>(null);\n visibleMessageIdsRef.current ??= new Set<string>();\n const intersectingMessageIds = visibleMessageIdsRef.current;\n const [itemsVersion, setItemsVersion] = React.useState(0);\n const [rootElement, setRootElement] = React.useState<HTMLDivElement | null>(null);\n const [viewportElement, setViewportElement] = React.useState<HTMLDivElement | null>(null);\n const [contentElement, setContentElement] = React.useState<HTMLDivElement | null>(null);\n const defaultScrollAppliedRef = React.useRef(false);\n const [scrollable, setScrollable] = React.useState<MessageScrollerScrollable>(DEFAULT_SCROLLABLE);\n const [visibility, setVisibility] = React.useState<MessageScrollerVisibility>(DEFAULT_VISIBILITY);\n\n const publishScrollable = React.useCallback(\n (nextScrollable: MessageScrollerScrollable) => {\n const scrollableValue = [nextScrollable.start && 'start', nextScrollable.end && 'end'].filter(Boolean).join(' ');\n\n for (const element of [rootElement, viewportElement]) {\n if (!element) continue;\n if (scrollableValue) {\n element.setAttribute('data-scrollable', scrollableValue);\n } else {\n element.removeAttribute('data-scrollable');\n }\n }\n\n setScrollable(current => (scrollableMatches(current, nextScrollable) ? current : nextScrollable));\n },\n [rootElement, viewportElement],\n );\n\n const publishVisibility = React.useCallback((nextVisibility: MessageScrollerVisibility) => {\n setVisibility(current => (visibilityMatches(current, nextVisibility) ? current : nextVisibility));\n }, []);\n\n const updateScrollable = React.useCallback(() => {\n if (!viewportElement) {\n publishScrollable(DEFAULT_SCROLLABLE);\n return;\n }\n\n const remainingScroll = viewportElement.scrollHeight - viewportElement.scrollTop - viewportElement.clientHeight;\n publishScrollable({\n start: viewportElement.scrollTop > scrollEdgeThreshold,\n end: remainingScroll > scrollEdgeThreshold,\n });\n }, [publishScrollable, scrollEdgeThreshold, viewportElement]);\n\n const updateVisibility = React.useCallback(() => {\n const items = Array.from(itemsRegistry.entries());\n const fallbackAnchorId = items.filter(([, item]) => item.scrollAnchor).at(-1)?.[0] ?? items.at(-1)?.[0];\n\n if (items.length === 0) {\n publishVisibility(DEFAULT_VISIBILITY);\n return;\n }\n\n if (!viewportElement) {\n publishVisibility({\n currentAnchorId: fallbackAnchorId,\n visibleMessageIds: fallbackAnchorId ? [fallbackAnchorId] : [],\n });\n return;\n }\n\n const viewportRect = viewportElement.getBoundingClientRect();\n const visibleMessageIds = new Set<string>();\n\n if (typeof IntersectionObserver === 'undefined') {\n const visibilityTop = viewportRect.top + scrollMargin + scrollPreviousItemPeek;\n items.forEach(([messageId, item]) => {\n const rect = item.element.getBoundingClientRect();\n if (rect.bottom > visibilityTop && rect.top < viewportRect.bottom) visibleMessageIds.add(messageId);\n });\n } else {\n intersectingMessageIds.forEach(messageId => visibleMessageIds.add(messageId));\n }\n\n const orderedVisibleMessageIds = items.flatMap(([messageId]) =>\n visibleMessageIds.has(messageId) ? [messageId] : [],\n );\n\n publishVisibility({\n currentAnchorId: getCurrentAnchorId({\n fallbackAnchorId,\n items,\n scrollMargin,\n scrollPreviousItemPeek,\n visibleMessageIds,\n viewportElement,\n }),\n visibleMessageIds:\n orderedVisibleMessageIds.length > 0 ? orderedVisibleMessageIds : fallbackAnchorId ? [fallbackAnchorId] : [],\n });\n }, [intersectingMessageIds, itemsRegistry, publishVisibility, scrollMargin, scrollPreviousItemPeek, viewportElement]);\n\n const syncAfterScroll = React.useCallback(() => {\n updateScrollable();\n updateVisibility();\n }, [updateScrollable, updateVisibility]);\n\n const scrollToElement = React.useCallback(\n (\n element: HTMLElement,\n {\n align = 'start',\n behavior = 'auto',\n scrollMargin: optionScrollMargin = scrollMargin,\n }: MessageScrollerScrollOptions = {},\n ) => {\n if (!viewportElement || !contentElement?.contains(element)) return false;\n\n const nextScrollTop = Math.max(\n 0,\n getScrollTarget({ align, element, scrollMargin: optionScrollMargin, viewportElement }),\n );\n\n if (Math.abs(viewportElement.scrollTop - nextScrollTop) <= VISIBILITY_EPSILON) {\n scrollViewportTo(viewportElement, nextScrollTop, 'auto');\n syncAfterScroll();\n return true;\n }\n\n scrollViewportTo(viewportElement, nextScrollTop, behavior);\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [contentElement, scrollMargin, syncAfterScroll, viewportElement],\n );\n\n const scrollToStart = React.useCallback(\n ({ behavior = 'auto' }: MessageScrollerScrollOptions = {}) => {\n if (!viewportElement) return false;\n scrollViewportTo(viewportElement, 0, behavior);\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [syncAfterScroll, viewportElement],\n );\n\n const scrollToEnd = React.useCallback(\n ({ behavior = 'auto' }: MessageScrollerScrollOptions = {}) => {\n if (!viewportElement) return false;\n scrollViewportTo(\n viewportElement,\n Math.max(0, viewportElement.scrollHeight - viewportElement.clientHeight),\n behavior,\n );\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [syncAfterScroll, viewportElement],\n );\n\n const scrollToMessage = React.useCallback(\n (messageId: string, options?: MessageScrollerScrollOptions) => {\n const item = itemsRegistry.get(messageId);\n if (!item) return false;\n return scrollToElement(item.element, options);\n },\n [itemsRegistry, scrollToElement],\n );\n\n const registerItem = React.useCallback(\n (messageId: string, element: HTMLElement, scrollAnchor: boolean) => {\n itemsRegistry.set(messageId, { element, scrollAnchor });\n setItemsVersion(version => version + 1);\n\n return () => {\n const current = itemsRegistry.get(messageId);\n if (current?.element !== element) return;\n itemsRegistry.delete(messageId);\n intersectingMessageIds.delete(messageId);\n setItemsVersion(version => version + 1);\n };\n },\n [intersectingMessageIds, itemsRegistry],\n );\n\n React.useEffect(() => {\n if (!contentElement || !viewportElement || typeof IntersectionObserver === 'undefined') {\n updateVisibility();\n return undefined;\n }\n\n const messageIdByElement = new Map<Element, string>();\n for (const [messageId, item] of itemsRegistry) {\n messageIdByElement.set(item.element, messageId);\n }\n\n const observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n const messageId = messageIdByElement.get(entry.target);\n if (!messageId) continue;\n if (entry.isIntersecting) {\n intersectingMessageIds.add(messageId);\n } else {\n intersectingMessageIds.delete(messageId);\n }\n }\n updateVisibility();\n },\n {\n root: viewportElement,\n rootMargin: `${-(scrollMargin + scrollPreviousItemPeek)}px 0px 0px 0px`,\n threshold: [0, 0.01, 0.5, 1],\n },\n );\n\n for (const [, item] of itemsRegistry) observer.observe(item.element);\n updateVisibility();\n\n return () => observer.disconnect();\n }, [\n contentElement,\n intersectingMessageIds,\n itemsRegistry,\n itemsVersion,\n scrollMargin,\n scrollPreviousItemPeek,\n updateVisibility,\n viewportElement,\n ]);\n\n React.useEffect(() => {\n if (!viewportElement || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(syncAfterScroll);\n observer.observe(viewportElement);\n return () => observer.disconnect();\n }, [syncAfterScroll, viewportElement]);\n\n React.useLayoutEffect(() => {\n updateScrollable();\n updateVisibility();\n }, [itemsVersion, updateScrollable, updateVisibility]);\n\n React.useLayoutEffect(() => {\n if (defaultScrollAppliedRef.current || !viewportElement || itemsRegistry.size === 0) return;\n\n let didScroll = false;\n if (defaultScrollPosition === 'start') {\n didScroll = scrollToStart({ behavior: 'auto' });\n } else if (defaultScrollPosition === 'last-anchor') {\n const lastAnchorId = Array.from(itemsRegistry.entries())\n .filter(([, item]) => item.scrollAnchor)\n .at(-1)?.[0];\n didScroll = lastAnchorId\n ? scrollToMessage(lastAnchorId, { align: 'start', behavior: 'auto' })\n : scrollToEnd({ behavior: 'auto' });\n } else {\n didScroll = scrollToEnd({ behavior: 'auto' });\n }\n\n if (didScroll) defaultScrollAppliedRef.current = true;\n }, [\n defaultScrollPosition,\n itemsRegistry,\n itemsVersion,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n viewportElement,\n ]);\n\n React.useLayoutEffect(() => {\n if (!autoScroll || !defaultScrollAppliedRef.current) return;\n scrollToEnd({ behavior: 'auto' });\n }, [autoScroll, itemsVersion, scrollToEnd]);\n\n const actionsContextValue = React.useMemo<MessageScrollerActionsContextValue>(\n () => ({\n registerItem,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n setContentElement,\n setRootElement,\n setViewportElement,\n syncAfterScroll,\n }),\n [registerItem, scrollToEnd, scrollToMessage, scrollToStart, syncAfterScroll],\n );\n\n const scrollableContextValue = React.useMemo<MessageScrollerScrollable>(\n () => ({\n end: scrollable.end,\n start: scrollable.start,\n }),\n [scrollable.end, scrollable.start],\n );\n\n const visibilityContextValue = React.useMemo<MessageScrollerVisibility>(\n () => ({\n currentAnchorId: visibility.currentAnchorId,\n visibleMessageIds: visibility.visibleMessageIds,\n }),\n [visibility.currentAnchorId, visibility.visibleMessageIds],\n );\n\n return (\n <MessageScrollerActionsContext.Provider value={actionsContextValue}>\n <MessageScrollerScrollableContext.Provider value={scrollableContextValue}>\n <MessageScrollerVisibilityContext.Provider value={visibilityContextValue}>\n {children}\n </MessageScrollerVisibilityContext.Provider>\n </MessageScrollerScrollableContext.Provider>\n </MessageScrollerActionsContext.Provider>\n );\n}\n\nexport type MessageScrollerProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const MessageScroller = React.forwardRef<HTMLDivElement, MessageScrollerProps>(\n ({ className, ...props }, ref) => {\n const { setRootElement } = useRequiredMessageScrollerActionsContext('MessageScroller');\n return (\n <div\n ref={mergeRefs(setRootElement, ref)}\n data-slot=\"message-scroller\"\n className={cn('group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden', className)}\n {...props}\n />\n );\n },\n);\nMessageScroller.displayName = 'MessageScroller';\n\nexport type MessageScrollerViewportProps = React.HTMLAttributes<HTMLDivElement> & {\n preserveScrollOnPrepend?: boolean;\n};\n\nexport const MessageScrollerViewport = React.forwardRef<HTMLDivElement, MessageScrollerViewportProps>(\n ({ className, onScroll, preserveScrollOnPrepend, role, tabIndex, ...props }, ref) => {\n const { setViewportElement, syncAfterScroll } = useRequiredMessageScrollerActionsContext('MessageScrollerViewport');\n const viewportRef = React.useMemo(() => mergeRefs(setViewportElement, ref), [ref, setViewportElement]);\n\n return (\n <div\n ref={viewportRef}\n role={role ?? 'region'}\n tabIndex={tabIndex ?? 0}\n data-slot=\"message-scroller-viewport\"\n data-preserve-scroll-on-prepend={preserveScrollOnPrepend ? 'true' : undefined}\n className={cn(\n 'size-full min-h-0 min-w-0 overflow-y-auto overscroll-contain data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent',\n className,\n )}\n onScroll={event => {\n syncAfterScroll();\n onScroll?.(event);\n }}\n {...props}\n />\n );\n },\n);\nMessageScrollerViewport.displayName = 'MessageScrollerViewport';\n\nexport type MessageScrollerContentProps = React.HTMLAttributes<HTMLDivElement> & {\n spacerClassName?: string;\n};\n\nexport const MessageScrollerContent = React.forwardRef<HTMLDivElement, MessageScrollerContentProps>(\n ({ children, className, spacerClassName, role, 'aria-relevant': ariaRelevant = 'additions', ...props }, ref) => {\n const { setContentElement, syncAfterScroll } = useRequiredMessageScrollerActionsContext('MessageScrollerContent');\n const [contentElement, setLocalContentElement] = React.useState<HTMLDivElement | null>(null);\n\n const contentRef = React.useMemo(\n () => mergeRefs<HTMLDivElement>(setContentElement, setLocalContentElement, ref),\n [ref, setContentElement],\n );\n\n React.useLayoutEffect(() => {\n syncAfterScroll();\n }, [syncAfterScroll]);\n\n React.useEffect(() => {\n if (!contentElement || typeof MutationObserver === 'undefined') return undefined;\n const observer = new MutationObserver(syncAfterScroll);\n observer.observe(contentElement, { childList: true, subtree: false });\n return () => observer.disconnect();\n }, [contentElement, syncAfterScroll]);\n\n React.useEffect(() => {\n if (!contentElement || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(syncAfterScroll);\n observer.observe(contentElement);\n return () => observer.disconnect();\n }, [contentElement, syncAfterScroll]);\n\n return (\n <div\n ref={contentRef}\n role={role ?? 'log'}\n aria-relevant={ariaRelevant}\n data-slot=\"message-scroller-content\"\n className={cn('flex h-max min-h-full flex-col gap-6', className)}\n {...props}\n >\n {children}\n <div aria-hidden=\"true\" data-message-scroller-spacer=\"\" hidden className={spacerClassName} />\n </div>\n );\n },\n);\nMessageScrollerContent.displayName = 'MessageScrollerContent';\n\nexport type MessageScrollerItemProps = React.HTMLAttributes<HTMLDivElement> & {\n messageId?: string;\n scrollAnchor?: boolean;\n};\n\nexport const MessageScrollerItem = React.forwardRef<HTMLDivElement, MessageScrollerItemProps>(\n ({ className, messageId, scrollAnchor = false, ...props }, ref) => {\n const { registerItem } = useRequiredMessageScrollerActionsContext('MessageScrollerItem');\n const unregisterRef = React.useRef<(() => void) | undefined>(undefined);\n const itemRef = React.useCallback(\n (element: HTMLDivElement | null) => {\n unregisterRef.current?.();\n unregisterRef.current = undefined;\n mergeRefs(ref)(element);\n\n if (!element || !messageId) return;\n unregisterRef.current = registerItem(messageId, element, scrollAnchor);\n },\n [messageId, ref, registerItem, scrollAnchor],\n );\n\n return (\n <div\n ref={itemRef}\n data-slot=\"message-scroller-item\"\n data-message-id={messageId}\n data-scroll-anchor={scrollAnchor ? 'true' : 'false'}\n className={cn('min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]', className)}\n {...props}\n />\n );\n },\n);\nMessageScrollerItem.displayName = 'MessageScrollerItem';\n\nexport type MessageScrollerButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> & {\n behavior?: ScrollBehavior;\n children?: React.ReactNode;\n direction?: MessageScrollerButtonDirection;\n};\n\nexport const MessageScrollerButton = React.forwardRef<HTMLButtonElement, MessageScrollerButtonProps>(\n (\n { behavior = 'smooth', direction = 'end', className, children, onClick, tabIndex, type = 'button', ...props },\n ref,\n ) => {\n const { scrollToEnd, scrollToStart } = useRequiredMessageScrollerActionsContext('MessageScrollerButton');\n const { start, end } = useRequiredMessageScrollerScrollableContext('MessageScrollerButton');\n const active = direction === 'start' ? start : end;\n\n return (\n <button\n ref={ref}\n type={type}\n {...props}\n data-slot=\"message-scroller-button\"\n data-active={active ? 'true' : 'false'}\n data-direction={direction}\n tabIndex={active ? tabIndex : -1}\n className={cn(\n 'absolute inset-s-1/2 -translate-x-1/2 rounded-full border border-border1 bg-surface3 text-neutral6 transition-[translate,scale,opacity] duration-200 hover:bg-surface4 data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180',\n className,\n )}\n onClick={event => {\n if (!active) return;\n onClick?.(event);\n if (event.defaultPrevented) return;\n event.currentTarget.blur();\n if (direction === 'start') {\n scrollToStart({ behavior });\n } else {\n scrollToEnd({ behavior });\n }\n }}\n >\n {children ?? (\n <>\n <ArrowDownIcon className=\"size-4\" aria-hidden />\n <span className=\"sr-only\">{direction === 'end' ? 'Scroll to end' : 'Scroll to start'}</span>\n </>\n )}\n </button>\n );\n },\n);\nMessageScrollerButton.displayName = 'MessageScrollerButton';\n"],"names":["DEFAULT_SCROLL_EDGE_THRESHOLD","DEFAULT_SCROLL_MARGIN","DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK","React","DEFAULT_SCROLLABLE","DEFAULT_VISIBILITY","jsx","MessageScrollerActionsContext","MessageScrollerScrollableContext","MessageScrollerVisibilityContext","useRequiredMessageScrollerActionsContext","cn","jsxs","useRequiredMessageScrollerScrollableContext","Fragment","ArrowDownIcon"],"mappings":"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"}
1
+ {"version":3,"file":"MessageScroller.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}