@mastra/playground-ui 43.0.0 → 44.0.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.
- package/CHANGELOG.md +19 -0
- package/dist/components/DateRangeTimeline.cjs.js +1 -1
- package/dist/components/DateRangeTimeline.cjs.js.map +1 -1
- package/dist/components/DateRangeTimeline.es.js +1 -1
- package/dist/components/DateRangeTimeline.es.js.map +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/MessageScroller.cjs.js +1 -1
- package/dist/components/MessageScroller.cjs.js.map +1 -1
- package/dist/components/MessageScroller.es.js +1 -1
- package/dist/components/MessageScroller.es.js.map +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/{markdown-renderer-CD2YXUdF.cjs → markdown-renderer-CfWz5SWN.cjs} +2 -2
- package/dist/{markdown-renderer-CD2YXUdF.cjs.map → markdown-renderer-CfWz5SWN.cjs.map} +1 -1
- package/dist/{markdown-renderer-BzKf1Gel.js → markdown-renderer-CqAR8lve.js} +2 -2
- package/dist/{markdown-renderer-BzKf1Gel.js.map → markdown-renderer-CqAR8lve.js.map} +1 -1
- package/package.json +7 -7
|
@@ -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 'data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent size-full min-h-0 min-w-0 overflow-y-auto overscroll-contain',\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":["../../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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"}
|
|
@@ -379,7 +379,7 @@ const MessageScrollerViewport = React.forwardRef(
|
|
|
379
379
|
"data-slot": "message-scroller-viewport",
|
|
380
380
|
"data-preserve-scroll-on-prepend": preserveScrollOnPrepend ? "true" : void 0,
|
|
381
381
|
className: cn(
|
|
382
|
-
"
|
|
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
383
|
className
|
|
384
384
|
),
|
|
385
385
|
onScroll: (event) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageScroller.es.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 'data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent size-full min-h-0 min-w-0 overflow-y-auto overscroll-contain',\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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MessageScroller.es.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":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ const lucideReact = require('lucide-react');
|
|
|
7
7
|
const React = require('react');
|
|
8
8
|
const Badge = require('../../Badge-BlJpI3fY.cjs');
|
|
9
9
|
const Button = require('../../Button-Bm94fEF2.cjs');
|
|
10
|
-
const markdownRenderer = require('../../markdown-renderer-
|
|
10
|
+
const markdownRenderer = require('../../markdown-renderer-CfWz5SWN.cjs');
|
|
11
11
|
const Txt = require('../../Txt-I5lK8zy7.cjs');
|
|
12
12
|
const icons_Icon = require('../../icons/Icon.cjs.js');
|
|
13
13
|
const hooks_useCopyToClipboard = require('../../hooks/use-copy-to-clipboard.cjs.js');
|
|
@@ -3,7 +3,7 @@ import { CheckIcon, CopyIcon, Minimize2, Maximize2, ClipboardList } from 'lucide
|
|
|
3
3
|
import { useState, createContext, useContext } from 'react';
|
|
4
4
|
import { B as Badge } from '../../Badge-woV6OD8k.js';
|
|
5
5
|
import { B as Button } from '../../Button-Bx2lFdqb.js';
|
|
6
|
-
import { M as MarkdownRenderer } from '../../markdown-renderer-
|
|
6
|
+
import { M as MarkdownRenderer } from '../../markdown-renderer-CqAR8lve.js';
|
|
7
7
|
import { T as Txt } from '../../Txt-Df42XG5p.js';
|
|
8
8
|
import { Icon } from '../../icons/Icon.es.js';
|
|
9
9
|
import { useCopyToClipboard } from '../../hooks/use-copy-to-clipboard.es.js';
|
|
@@ -14,7 +14,7 @@ function MarkdownRenderer({ children }) {
|
|
|
14
14
|
const CodeBlock = ({ children, className, language, ...restProps }) => {
|
|
15
15
|
const code$1 = typeof children === "string" ? children : childrenTakeAllStringContents(children);
|
|
16
16
|
const preClass = utils_cn.cn(
|
|
17
|
-
"overflow-x-scroll rounded-md border bg-surface1/50 p-4 font-mono text-sm
|
|
17
|
+
"[scrollbar-width:none] overflow-x-scroll rounded-md border bg-surface1/50 p-4 font-mono text-sm",
|
|
18
18
|
className
|
|
19
19
|
);
|
|
20
20
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group/code relative mb-4", children: [
|
|
@@ -85,4 +85,4 @@ const COMPONENTS = {
|
|
|
85
85
|
};
|
|
86
86
|
|
|
87
87
|
exports.MarkdownRenderer = MarkdownRenderer;
|
|
88
|
-
//# sourceMappingURL=markdown-renderer-
|
|
88
|
+
//# sourceMappingURL=markdown-renderer-CfWz5SWN.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-renderer-
|
|
1
|
+
{"version":3,"file":"markdown-renderer-CfWz5SWN.cjs","sources":["../src/ds/components/MarkdownRenderer/markdown-renderer.tsx"],"sourcesContent":["import React from 'react';\nimport Markdown from 'react-markdown';\nimport type { Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport { Code } from '@/ds/components/Code';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { cn } from '@/lib/utils';\n\nexport type MarkdownRendererProps = {\n children: string;\n};\n\nexport function MarkdownRenderer({ children }: MarkdownRendererProps) {\n const processedText = children.replace(/\\\\n/g, '\\n');\n\n return (\n <Markdown remarkPlugins={[remarkGfm]} components={COMPONENTS} className=\"space-y-3\">\n {processedText}\n </Markdown>\n );\n}\n\ninterface CodeBlockProps extends React.HTMLAttributes<HTMLPreElement> {\n children: React.ReactNode;\n className?: string;\n language: string;\n}\n\nconst CodeBlock = ({ children, className, language, ...restProps }: CodeBlockProps) => {\n const code = typeof children === 'string' ? children : childrenTakeAllStringContents(children);\n\n const preClass = cn(\n '[scrollbar-width:none] overflow-x-scroll rounded-md border bg-surface1/50 p-4 font-mono text-sm',\n className,\n );\n\n return (\n <div className=\"group/code relative mb-4\">\n <Code code={code} lang={language} className={preClass} {...restProps} />\n\n <div className=\"invisible absolute top-2 right-2 flex gap-1 rounded-lg p-1 opacity-0 transition-all duration-200 group-hover/code:visible group-hover/code:opacity-100\">\n <CopyButton content={code} copyMessage=\"Copied code to clipboard\" />\n </div>\n </div>\n );\n};\n\nfunction childrenTakeAllStringContents(element: any): string {\n if (typeof element === 'string') {\n return element;\n }\n\n if (element?.props?.children) {\n let children = element.props.children;\n\n if (Array.isArray(children)) {\n return children.map(child => childrenTakeAllStringContents(child)).join('');\n } else {\n return childrenTakeAllStringContents(children);\n }\n }\n\n return '';\n}\n\n// Create component wrappers with className\nconst COMPONENTS: Components = {\n h1: ({ children, ...props }) => (\n <h1 className=\"text-2xl font-semibold\" {...props}>\n {children}\n </h1>\n ),\n h2: ({ children, ...props }) => (\n <h2 className=\"text-xl font-semibold\" {...props}>\n {children}\n </h2>\n ),\n h3: ({ children, ...props }) => (\n <h3 className=\"text-lg font-semibold\" {...props}>\n {children}\n </h3>\n ),\n h4: ({ children, ...props }) => (\n <h4 className=\"text-base font-semibold\" {...props}>\n {children}\n </h4>\n ),\n h5: ({ children, ...props }) => (\n <h5 className=\"font-medium\" {...props}>\n {children}\n </h5>\n ),\n strong: ({ children, ...props }) => (\n <strong className=\"font-semibold\" {...props}>\n {children}\n </strong>\n ),\n a: ({ children, ...props }) => (\n <a className=\"underline underline-offset-2\" {...props}>\n {children}\n </a>\n ),\n blockquote: ({ children, ...props }) => (\n <blockquote className=\"border-neutral6 border-l-2 pl-4\" {...props}>\n {children}\n </blockquote>\n ),\n code: ({ children, className, ...rest }: any) => {\n const match = /language-(\\w+)/.exec(className || '');\n return match ? (\n <CodeBlock className={className} language={match[1]} {...rest}>\n {children}\n </CodeBlock>\n ) : (\n <code\n className={cn(\n 'font-mono [:not(pre)>&]:rounded-md [:not(pre)>&]:bg-surface1/50 [:not(pre)>&]:px-1 [:not(pre)>&]:py-0.5',\n )}\n {...rest}\n >\n {children}\n </code>\n );\n },\n pre: ({ children }: any) => children,\n ol: ({ children, ...props }) => (\n <ol className=\"list-decimal space-y-2 pl-6\" {...props}>\n {children}\n </ol>\n ),\n ul: ({ children, ...props }) => (\n <ul className=\"list-disc space-y-2 pl-6\" {...props}>\n {children}\n </ul>\n ),\n li: ({ children, ...props }) => (\n <li className=\"my-1.5\" {...props}>\n {children}\n </li>\n ),\n table: ({ children, ...props }) => (\n <table className=\"border-neutral6/20 w-full border-collapse overflow-y-auto rounded-md border\" {...props}>\n {children}\n </table>\n ),\n th: ({ children, ...props }) => (\n <th\n className=\"border-neutral6/20 border px-4 py-2 text-left font-bold [[align=center]]:text-center [[align=right]]:text-right\"\n {...props}\n >\n {children}\n </th>\n ),\n td: ({ children, ...props }) => (\n <td\n className=\"border-neutral6/20 border px-4 py-2 text-left [[align=center]]:text-center [[align=right]]:text-right\"\n {...props}\n >\n {children}\n </td>\n ),\n tr: ({ children, ...props }) => (\n <tr className=\"even:bg-surface4 m-0 border-t p-0\" {...props}>\n {children}\n </tr>\n ),\n p: ({ children, ...props }) => (\n <p className=\"leading-relaxed whitespace-pre-wrap\" {...props}>\n {children}\n </p>\n ),\n hr: ({ ...props }) => <hr className=\"border-neutral6/20\" {...props} />,\n};\n\nexport default MarkdownRenderer;\n"],"names":["jsx","code","cn","jsxs","Code","CopyButton"],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ function MarkdownRenderer({ children }) {
|
|
|
12
12
|
const CodeBlock = ({ children, className, language, ...restProps }) => {
|
|
13
13
|
const code = typeof children === "string" ? children : childrenTakeAllStringContents(children);
|
|
14
14
|
const preClass = cn(
|
|
15
|
-
"overflow-x-scroll rounded-md border bg-surface1/50 p-4 font-mono text-sm
|
|
15
|
+
"[scrollbar-width:none] overflow-x-scroll rounded-md border bg-surface1/50 p-4 font-mono text-sm",
|
|
16
16
|
className
|
|
17
17
|
);
|
|
18
18
|
return /* @__PURE__ */ jsxs("div", { className: "group/code relative mb-4", children: [
|
|
@@ -83,4 +83,4 @@ const COMPONENTS = {
|
|
|
83
83
|
};
|
|
84
84
|
|
|
85
85
|
export { MarkdownRenderer as M };
|
|
86
|
-
//# sourceMappingURL=markdown-renderer-
|
|
86
|
+
//# sourceMappingURL=markdown-renderer-CqAR8lve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-renderer-
|
|
1
|
+
{"version":3,"file":"markdown-renderer-CqAR8lve.js","sources":["../src/ds/components/MarkdownRenderer/markdown-renderer.tsx"],"sourcesContent":["import React from 'react';\nimport Markdown from 'react-markdown';\nimport type { Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport { Code } from '@/ds/components/Code';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { cn } from '@/lib/utils';\n\nexport type MarkdownRendererProps = {\n children: string;\n};\n\nexport function MarkdownRenderer({ children }: MarkdownRendererProps) {\n const processedText = children.replace(/\\\\n/g, '\\n');\n\n return (\n <Markdown remarkPlugins={[remarkGfm]} components={COMPONENTS} className=\"space-y-3\">\n {processedText}\n </Markdown>\n );\n}\n\ninterface CodeBlockProps extends React.HTMLAttributes<HTMLPreElement> {\n children: React.ReactNode;\n className?: string;\n language: string;\n}\n\nconst CodeBlock = ({ children, className, language, ...restProps }: CodeBlockProps) => {\n const code = typeof children === 'string' ? children : childrenTakeAllStringContents(children);\n\n const preClass = cn(\n '[scrollbar-width:none] overflow-x-scroll rounded-md border bg-surface1/50 p-4 font-mono text-sm',\n className,\n );\n\n return (\n <div className=\"group/code relative mb-4\">\n <Code code={code} lang={language} className={preClass} {...restProps} />\n\n <div className=\"invisible absolute top-2 right-2 flex gap-1 rounded-lg p-1 opacity-0 transition-all duration-200 group-hover/code:visible group-hover/code:opacity-100\">\n <CopyButton content={code} copyMessage=\"Copied code to clipboard\" />\n </div>\n </div>\n );\n};\n\nfunction childrenTakeAllStringContents(element: any): string {\n if (typeof element === 'string') {\n return element;\n }\n\n if (element?.props?.children) {\n let children = element.props.children;\n\n if (Array.isArray(children)) {\n return children.map(child => childrenTakeAllStringContents(child)).join('');\n } else {\n return childrenTakeAllStringContents(children);\n }\n }\n\n return '';\n}\n\n// Create component wrappers with className\nconst COMPONENTS: Components = {\n h1: ({ children, ...props }) => (\n <h1 className=\"text-2xl font-semibold\" {...props}>\n {children}\n </h1>\n ),\n h2: ({ children, ...props }) => (\n <h2 className=\"text-xl font-semibold\" {...props}>\n {children}\n </h2>\n ),\n h3: ({ children, ...props }) => (\n <h3 className=\"text-lg font-semibold\" {...props}>\n {children}\n </h3>\n ),\n h4: ({ children, ...props }) => (\n <h4 className=\"text-base font-semibold\" {...props}>\n {children}\n </h4>\n ),\n h5: ({ children, ...props }) => (\n <h5 className=\"font-medium\" {...props}>\n {children}\n </h5>\n ),\n strong: ({ children, ...props }) => (\n <strong className=\"font-semibold\" {...props}>\n {children}\n </strong>\n ),\n a: ({ children, ...props }) => (\n <a className=\"underline underline-offset-2\" {...props}>\n {children}\n </a>\n ),\n blockquote: ({ children, ...props }) => (\n <blockquote className=\"border-neutral6 border-l-2 pl-4\" {...props}>\n {children}\n </blockquote>\n ),\n code: ({ children, className, ...rest }: any) => {\n const match = /language-(\\w+)/.exec(className || '');\n return match ? (\n <CodeBlock className={className} language={match[1]} {...rest}>\n {children}\n </CodeBlock>\n ) : (\n <code\n className={cn(\n 'font-mono [:not(pre)>&]:rounded-md [:not(pre)>&]:bg-surface1/50 [:not(pre)>&]:px-1 [:not(pre)>&]:py-0.5',\n )}\n {...rest}\n >\n {children}\n </code>\n );\n },\n pre: ({ children }: any) => children,\n ol: ({ children, ...props }) => (\n <ol className=\"list-decimal space-y-2 pl-6\" {...props}>\n {children}\n </ol>\n ),\n ul: ({ children, ...props }) => (\n <ul className=\"list-disc space-y-2 pl-6\" {...props}>\n {children}\n </ul>\n ),\n li: ({ children, ...props }) => (\n <li className=\"my-1.5\" {...props}>\n {children}\n </li>\n ),\n table: ({ children, ...props }) => (\n <table className=\"border-neutral6/20 w-full border-collapse overflow-y-auto rounded-md border\" {...props}>\n {children}\n </table>\n ),\n th: ({ children, ...props }) => (\n <th\n className=\"border-neutral6/20 border px-4 py-2 text-left font-bold [[align=center]]:text-center [[align=right]]:text-right\"\n {...props}\n >\n {children}\n </th>\n ),\n td: ({ children, ...props }) => (\n <td\n className=\"border-neutral6/20 border px-4 py-2 text-left [[align=center]]:text-center [[align=right]]:text-right\"\n {...props}\n >\n {children}\n </td>\n ),\n tr: ({ children, ...props }) => (\n <tr className=\"even:bg-surface4 m-0 border-t p-0\" {...props}>\n {children}\n </tr>\n ),\n p: ({ children, ...props }) => (\n <p className=\"leading-relaxed whitespace-pre-wrap\" {...props}>\n {children}\n </p>\n ),\n hr: ({ ...props }) => <hr className=\"border-neutral6/20\" {...props} />,\n};\n\nexport default MarkdownRenderer;\n"],"names":[],"mappings":"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"}
|