@mastra/playground-ui 40.0.0-alpha.3 → 40.0.0-alpha.4

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