@mastra/playground-ui 45.0.0 → 45.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -0
- package/dist/CommandPalette.css +135 -0
- package/dist/command-Duq1xsiS.js +168 -0
- package/dist/command-Duq1xsiS.js.map +1 -0
- package/dist/command-qsEykgml.cjs +197 -0
- package/dist/command-qsEykgml.cjs.map +1 -0
- package/dist/components/ChatShell.cjs.js +96 -0
- package/dist/components/ChatShell.cjs.js.map +1 -0
- package/dist/components/ChatShell.d.ts +2 -0
- package/dist/components/ChatShell.es.js +92 -0
- package/dist/components/ChatShell.es.js.map +1 -0
- package/dist/components/Command.cjs.js +10 -191
- package/dist/components/Command.cjs.js.map +1 -1
- package/dist/components/Command.es.js +1 -167
- package/dist/components/Command.es.js.map +1 -1
- package/dist/components/CommandPalette.cjs.js +180 -0
- package/dist/components/CommandPalette.cjs.js.map +1 -0
- package/dist/components/CommandPalette.d.ts +2 -0
- package/dist/components/CommandPalette.es.js +169 -0
- package/dist/components/CommandPalette.es.js.map +1 -0
- package/dist/components/Kbd.cjs.js +3 -24
- package/dist/components/Kbd.cjs.js.map +1 -1
- package/dist/components/Kbd.es.js +1 -26
- package/dist/components/Kbd.es.js.map +1 -1
- package/dist/components/MessageScroller.cjs.js +8 -524
- package/dist/components/MessageScroller.cjs.js.map +1 -1
- package/dist/components/MessageScroller.es.js +2 -504
- package/dist/components/MessageScroller.es.js.map +1 -1
- package/dist/components/ThreadRail.cjs.js +1 -1
- package/dist/components/ThreadRail.es.js +1 -1
- package/dist/kbd-Br7kdwaB.cjs +34 -0
- package/dist/kbd-Br7kdwaB.cjs.map +1 -0
- package/dist/kbd-DE0nj4DL.js +32 -0
- package/dist/kbd-DE0nj4DL.js.map +1 -0
- package/dist/message-scroller-BQpwFsqj.js +563 -0
- package/dist/message-scroller-BQpwFsqj.js.map +1 -0
- package/dist/message-scroller-DIgCd5n3.cjs +589 -0
- package/dist/message-scroller-DIgCd5n3.cjs.map +1 -0
- package/dist/{message-scroller-hooks-DdXqrmC2.cjs → message-scroller-context-_VfCYFBU.cjs} +6 -48
- package/dist/message-scroller-context-_VfCYFBU.cjs.map +1 -0
- package/dist/message-scroller-context-tTA6jxho.js +23 -0
- package/dist/message-scroller-context-tTA6jxho.js.map +1 -0
- package/dist/message-scroller-hooks-BxAf8k0Y.cjs +72 -0
- package/dist/message-scroller-hooks-BxAf8k0Y.cjs.map +1 -0
- package/dist/{message-scroller-hooks-CdsHnth6.js → message-scroller-hooks-D5yxCon2.js} +3 -19
- package/dist/message-scroller-hooks-D5yxCon2.js.map +1 -0
- package/dist/src/ds/components/ChatShell/chat-shell.d.ts +46 -0
- package/dist/src/ds/components/ChatShell/chat-shell.stories.d.ts +8 -0
- package/dist/src/ds/components/ChatShell/index.d.ts +11 -0
- package/dist/src/ds/components/CommandPalette/command-palette.d.ts +37 -0
- package/dist/src/ds/components/CommandPalette/command-palette.stories.d.ts +12 -0
- package/dist/src/ds/components/CommandPalette/index.d.ts +1 -0
- package/dist/src/ds/components/Kbd/kbd.d.ts +2 -1
- package/dist/src/ds/components/MessageScroller/message-scroller-context.d.ts +4 -0
- package/dist/src/ds/components/MessageScroller/message-scroller.d.ts +8 -7
- package/dist/style.css +343 -2
- package/package.json +6 -6
- package/dist/message-scroller-hooks-CdsHnth6.js.map +0 -1
- package/dist/message-scroller-hooks-DdXqrmC2.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-scroller-DIgCd5n3.cjs","sources":["../src/ds/components/MessageScroller/message-scroller.tsx"],"sourcesContent":["import { ArrowDownIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport {\n AUTO_SCROLL_ATTACH_THRESHOLD,\n DEFAULT_REACH_START_THRESHOLD,\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 /** Called when the reader scrolls near the start — where older history is loaded. */\n onReachStart?: () => void;\n /** Hold the reading position when older items are added above the current ones. */\n preserveScrollOnPrepend?: boolean;\n reachStartThreshold?: number;\n scrollEdgeThreshold?: number;\n scrollMargin?: number;\n scrollPreviousItemPeek?: number;\n}\n\nexport function MessageScrollerProvider({\n autoScroll = false,\n children,\n defaultScrollPosition = 'end',\n onReachStart,\n preserveScrollOnPrepend = false,\n reachStartThreshold = DEFAULT_REACH_START_THRESHOLD,\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 const atEndRef = React.useRef(true);\n // Mount sits at scrollTop 0 before the default scroll lands, indistinguishable\n // from a reader asking for older history. Arms only once settled at the end.\n const reachStartArmedRef = React.useRef(false);\n const reachStartFiredRef = React.useRef(false);\n const prependAnchorRef = React.useRef<{ scrollHeight: number; scrollTop: number } | null>(null);\n const firstItemIdRef = React.useRef<string | undefined>(undefined);\n // Off notifyScroll's deps on purpose: consumers pass it inline, and a fresh\n // identity per render would republish the actions context to every consumer.\n const onReachStartRef = React.useRef(onReachStart);\n React.useEffect(() => {\n onReachStartRef.current = onReachStart;\n }, [onReachStart]);\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 atEndRef.current = true;\n publishScrollable(DEFAULT_SCROLLABLE);\n return;\n }\n\n const remainingScroll = viewportElement.scrollHeight - viewportElement.scrollTop - viewportElement.clientHeight;\n atEndRef.current = remainingScroll < AUTO_SCROLL_ATTACH_THRESHOLD;\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 notifyScroll = React.useCallback(() => {\n const wasScrollable = Boolean(viewportElement && viewportElement.scrollHeight > viewportElement.clientHeight);\n syncAfterScroll();\n if (!viewportElement) return;\n\n if (atEndRef.current && wasScrollable) reachStartArmedRef.current = true;\n\n if (!reachStartArmedRef.current) return;\n if (!wasScrollable) return;\n if (viewportElement.scrollTop > reachStartThreshold) {\n reachStartFiredRef.current = false;\n return;\n }\n // One request per trip to the start: staying there must not queue a second.\n if (reachStartFiredRef.current) return;\n if (!onReachStartRef.current) return;\n\n reachStartFiredRef.current = true;\n if (preserveScrollOnPrepend) {\n prependAnchorRef.current = {\n scrollHeight: viewportElement.scrollHeight,\n scrollTop: viewportElement.scrollTop,\n };\n }\n onReachStartRef.current();\n }, [preserveScrollOnPrepend, reachStartThreshold, syncAfterScroll, viewportElement]);\n\n const notifyContentResize = React.useCallback(() => {\n const followEnd = autoScroll && defaultScrollAppliedRef.current && atEndRef.current && viewportElement;\n if (followEnd) {\n scrollViewportTo(\n viewportElement,\n Math.max(0, viewportElement.scrollHeight - viewportElement.clientHeight),\n 'auto',\n );\n }\n syncAfterScroll();\n }, [autoScroll, syncAfterScroll, viewportElement]);\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 // Older items land above the reader and shove their position down. A prepend is\n // told from an append by the first item's id, then undone by offsetting\n // scrollTop by however much taller the content got.\n React.useLayoutEffect(() => {\n const previousFirstItemId = firstItemIdRef.current;\n // From the DOM, not the registry: prepended items register last, so registry\n // order stops matching reading order.\n const firstItemId = contentElement?.querySelector<HTMLElement>('[data-slot=\"message-scroller-item\"]')?.dataset\n .messageId;\n firstItemIdRef.current = firstItemId;\n\n const anchor = prependAnchorRef.current;\n prependAnchorRef.current = null;\n if (!anchor || !viewportElement || firstItemId === previousFirstItemId) return;\n\n reachStartFiredRef.current = false;\n const grownBy = viewportElement.scrollHeight - anchor.scrollHeight;\n if (grownBy > 0) viewportElement.scrollTop = anchor.scrollTop + grownBy;\n }, [contentElement, itemsVersion, viewportElement]);\n\n React.useLayoutEffect(() => {\n if (!autoScroll || !defaultScrollAppliedRef.current || !atEndRef.current) return;\n scrollToEnd({ behavior: 'auto' });\n }, [autoScroll, itemsVersion, scrollToEnd]);\n\n const actionsContextValue = React.useMemo<MessageScrollerActionsContextValue>(\n () => ({\n notifyContentResize,\n notifyScroll,\n registerItem,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n setContentElement,\n setRootElement,\n setViewportElement,\n syncAfterScroll,\n }),\n [notifyContentResize, notifyScroll, 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\nexport const MessageScrollerViewport = React.forwardRef<HTMLDivElement, MessageScrollerViewportProps>(\n ({ className, onScroll, role, tabIndex, ...props }, ref) => {\n const { setViewportElement, notifyScroll } = 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 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 notifyScroll();\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, notifyContentResize, syncAfterScroll } =\n 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(notifyContentResize);\n observer.observe(contentElement, { childList: true, subtree: false });\n return () => observer.disconnect();\n }, [contentElement, notifyContentResize]);\n\n React.useEffect(() => {\n if (!contentElement || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(notifyContentResize);\n observer.observe(contentElement);\n return () => observer.disconnect();\n }, [contentElement, notifyContentResize]);\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 // Optional, unlike the other slots: the same row renderer is reused outside a\n // scroller (draft pages, previews), where there is simply nothing to register.\n const registerItem = React.useContext(MessageScrollerActionsContext)?.registerItem;\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 || !registerItem) 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 inline-flex min-h-5 min-w-7 -translate-x-1/2 items-center justify-center rounded-full border border-border1 bg-surface3 text-neutral6 shadow-[0_1px_2px_-1px_oklch(0%_0_0deg/10%),0_8px_20px_-12px_oklch(0%_0_0deg/25%)] 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_REACH_START_THRESHOLD","DEFAULT_SCROLL_EDGE_THRESHOLD","DEFAULT_SCROLL_MARGIN","DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK","React","DEFAULT_SCROLLABLE","DEFAULT_VISIBILITY","AUTO_SCROLL_ATTACH_THRESHOLD","jsx","MessageScrollerActionsContext","MessageScrollerScrollableContext","MessageScrollerVisibilityContext","useRequiredMessageScrollerActionsContext","cn","jsxs","useRequiredMessageScrollerScrollableContext","Fragment","ArrowDownIcon"],"mappings":"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"}
|
|
@@ -26,6 +26,8 @@ const DEFAULT_VISIBILITY = { currentAnchorId: void 0, visibleMessageIds: [] };
|
|
|
26
26
|
const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;
|
|
27
27
|
const DEFAULT_SCROLL_MARGIN = 0;
|
|
28
28
|
const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;
|
|
29
|
+
const DEFAULT_REACH_START_THRESHOLD = 160;
|
|
30
|
+
const AUTO_SCROLL_ATTACH_THRESHOLD = 160;
|
|
29
31
|
const MessageScrollerActionsContext = React__namespace.createContext(null);
|
|
30
32
|
const MessageScrollerScrollableContext = React__namespace.createContext(null);
|
|
31
33
|
const MessageScrollerVisibilityContext = React__namespace.createContext(null);
|
|
@@ -38,47 +40,8 @@ const useRequiredMessageScrollerActionsContext = (hookName) => useRequiredContex
|
|
|
38
40
|
const useRequiredMessageScrollerScrollableContext = (hookName) => useRequiredContext(MessageScrollerScrollableContext, hookName);
|
|
39
41
|
const useRequiredMessageScrollerVisibilityContext = (hookName) => useRequiredContext(MessageScrollerVisibilityContext, hookName);
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return React__namespace.useMemo(
|
|
44
|
-
() => ({ scrollToEnd, scrollToMessage, scrollToStart }),
|
|
45
|
-
[scrollToEnd, scrollToMessage, scrollToStart]
|
|
46
|
-
);
|
|
47
|
-
};
|
|
48
|
-
const useOptionalMessageScroller = () => {
|
|
49
|
-
const context = React__namespace.useContext(MessageScrollerActionsContext);
|
|
50
|
-
return React__namespace.useMemo(() => {
|
|
51
|
-
if (!context) return void 0;
|
|
52
|
-
return {
|
|
53
|
-
scrollToEnd: context.scrollToEnd,
|
|
54
|
-
scrollToMessage: context.scrollToMessage,
|
|
55
|
-
scrollToStart: context.scrollToStart
|
|
56
|
-
};
|
|
57
|
-
}, [context]);
|
|
58
|
-
};
|
|
59
|
-
const useMessageScrollerScrollable = () => {
|
|
60
|
-
const { start, end } = useRequiredMessageScrollerScrollableContext("useMessageScrollerScrollable");
|
|
61
|
-
return React__namespace.useMemo(() => ({ start, end }), [end, start]);
|
|
62
|
-
};
|
|
63
|
-
const useOptionalMessageScrollerScrollable = () => {
|
|
64
|
-
const context = React__namespace.useContext(MessageScrollerScrollableContext);
|
|
65
|
-
return React__namespace.useMemo(() => context ? { start: context.start, end: context.end } : void 0, [context]);
|
|
66
|
-
};
|
|
67
|
-
const useMessageScrollerVisibility = () => {
|
|
68
|
-
const { currentAnchorId, visibleMessageIds } = useRequiredMessageScrollerVisibilityContext("useMessageScrollerVisibility");
|
|
69
|
-
return React__namespace.useMemo(() => ({ currentAnchorId, visibleMessageIds }), [currentAnchorId, visibleMessageIds]);
|
|
70
|
-
};
|
|
71
|
-
const useOptionalMessageScrollerVisibility = () => {
|
|
72
|
-
const context = React__namespace.useContext(MessageScrollerVisibilityContext);
|
|
73
|
-
return React__namespace.useMemo(
|
|
74
|
-
() => context ? {
|
|
75
|
-
currentAnchorId: context.currentAnchorId,
|
|
76
|
-
visibleMessageIds: context.visibleMessageIds
|
|
77
|
-
} : void 0,
|
|
78
|
-
[context]
|
|
79
|
-
);
|
|
80
|
-
};
|
|
81
|
-
|
|
43
|
+
exports.AUTO_SCROLL_ATTACH_THRESHOLD = AUTO_SCROLL_ATTACH_THRESHOLD;
|
|
44
|
+
exports.DEFAULT_REACH_START_THRESHOLD = DEFAULT_REACH_START_THRESHOLD;
|
|
82
45
|
exports.DEFAULT_SCROLLABLE = DEFAULT_SCROLLABLE;
|
|
83
46
|
exports.DEFAULT_SCROLL_EDGE_THRESHOLD = DEFAULT_SCROLL_EDGE_THRESHOLD;
|
|
84
47
|
exports.DEFAULT_SCROLL_MARGIN = DEFAULT_SCROLL_MARGIN;
|
|
@@ -87,12 +50,7 @@ exports.DEFAULT_VISIBILITY = DEFAULT_VISIBILITY;
|
|
|
87
50
|
exports.MessageScrollerActionsContext = MessageScrollerActionsContext;
|
|
88
51
|
exports.MessageScrollerScrollableContext = MessageScrollerScrollableContext;
|
|
89
52
|
exports.MessageScrollerVisibilityContext = MessageScrollerVisibilityContext;
|
|
90
|
-
exports.useMessageScroller = useMessageScroller;
|
|
91
|
-
exports.useMessageScrollerScrollable = useMessageScrollerScrollable;
|
|
92
|
-
exports.useMessageScrollerVisibility = useMessageScrollerVisibility;
|
|
93
|
-
exports.useOptionalMessageScroller = useOptionalMessageScroller;
|
|
94
|
-
exports.useOptionalMessageScrollerScrollable = useOptionalMessageScrollerScrollable;
|
|
95
|
-
exports.useOptionalMessageScrollerVisibility = useOptionalMessageScrollerVisibility;
|
|
96
53
|
exports.useRequiredMessageScrollerActionsContext = useRequiredMessageScrollerActionsContext;
|
|
97
54
|
exports.useRequiredMessageScrollerScrollableContext = useRequiredMessageScrollerScrollableContext;
|
|
98
|
-
|
|
55
|
+
exports.useRequiredMessageScrollerVisibilityContext = useRequiredMessageScrollerVisibilityContext;
|
|
56
|
+
//# sourceMappingURL=message-scroller-context-_VfCYFBU.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-scroller-context-_VfCYFBU.cjs","sources":["../src/ds/components/MessageScroller/message-scroller-context.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type MessageScrollerDefaultScrollPosition = 'start' | 'end' | 'last-anchor';\nexport type MessageScrollerButtonDirection = 'start' | 'end';\nexport type MessageScrollerScrollAlign = 'start' | 'center' | 'end' | 'nearest';\n\nexport type MessageScrollerScrollOptions = {\n align?: MessageScrollerScrollAlign;\n behavior?: ScrollBehavior;\n scrollMargin?: number;\n};\n\nexport type MessageScrollerScrollable = {\n start: boolean;\n end: boolean;\n};\n\nexport type MessageScrollerVisibility = {\n currentAnchorId: string | undefined;\n visibleMessageIds: string[];\n};\n\nexport type MessageScrollerActionsContextValue = {\n notifyContentResize: () => void;\n notifyScroll: () => void;\n registerItem: (messageId: string, element: HTMLElement, scrollAnchor: boolean) => () => void;\n scrollToEnd: (options?: MessageScrollerScrollOptions) => boolean;\n scrollToMessage: (messageId: string, options?: MessageScrollerScrollOptions) => boolean;\n scrollToStart: (options?: MessageScrollerScrollOptions) => boolean;\n setContentElement: (element: HTMLDivElement | null) => void;\n setRootElement: (element: HTMLDivElement | null) => void;\n setViewportElement: (element: HTMLDivElement | null) => void;\n syncAfterScroll: () => void;\n};\n\nexport const DEFAULT_SCROLLABLE: MessageScrollerScrollable = { start: false, end: false };\nexport const DEFAULT_VISIBILITY: MessageScrollerVisibility = { currentAnchorId: undefined, visibleMessageIds: [] };\nexport const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;\nexport const DEFAULT_SCROLL_MARGIN = 0;\nexport const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;\nexport const DEFAULT_REACH_START_THRESHOLD = 160;\n\n// Looser than the edge threshold, which only decides whether the scroll buttons\n// are active: how far from the end a reader may sit and still be carried along\n// by growing content.\nexport const AUTO_SCROLL_ATTACH_THRESHOLD = 160;\n\nexport const MessageScrollerActionsContext = React.createContext<MessageScrollerActionsContextValue | null>(null);\nexport const MessageScrollerScrollableContext = React.createContext<MessageScrollerScrollable | null>(null);\nexport const MessageScrollerVisibilityContext = React.createContext<MessageScrollerVisibility | null>(null);\n\nconst useRequiredContext = <TValue>(context: React.Context<TValue | null>, hookName: string) => {\n const value = React.useContext(context);\n if (!value) throw new Error(`${hookName} must be used within MessageScrollerProvider.`);\n return value;\n};\n\nexport const useRequiredMessageScrollerActionsContext = (hookName: string) =>\n useRequiredContext(MessageScrollerActionsContext, hookName);\n\nexport const useRequiredMessageScrollerScrollableContext = (hookName: string) =>\n useRequiredContext(MessageScrollerScrollableContext, hookName);\n\nexport const useRequiredMessageScrollerVisibilityContext = (hookName: string) =>\n useRequiredContext(MessageScrollerVisibilityContext, hookName);\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmCO,MAAM,kBAAA,GAAgD,EAAE,KAAA,EAAO,KAAA,EAAO,KAAK,KAAA;AAC3E,MAAM,qBAAgD,EAAE,eAAA,EAAiB,MAAA,EAAW,iBAAA,EAAmB,EAAC;AACxG,MAAM,6BAAA,GAAgC;AACtC,MAAM,qBAAA,GAAwB;AAC9B,MAAM,iCAAA,GAAoC;AAC1C,MAAM,6BAAA,GAAgC;AAKtC,MAAM,4BAAA,GAA+B;AAErC,MAAM,6BAAA,GAAgCA,gBAAA,CAAM,aAAA,CAAyD,IAAI;AACzG,MAAM,gCAAA,GAAmCA,gBAAA,CAAM,aAAA,CAAgD,IAAI;AACnG,MAAM,gCAAA,GAAmCA,gBAAA,CAAM,aAAA,CAAgD,IAAI;AAE1G,MAAM,kBAAA,GAAqB,CAAS,OAAA,EAAuC,QAAA,KAAqB;AAC9F,EAAA,MAAM,KAAA,GAAQA,gBAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AACtC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,6CAAA,CAA+C,CAAA;AACtF,EAAA,OAAO,KAAA;AACT,CAAA;AAEO,MAAM,wCAAA,GAA2C,CAAC,QAAA,KACvD,kBAAA,CAAmB,+BAA+B,QAAQ;AAErD,MAAM,2CAAA,GAA8C,CAAC,QAAA,KAC1D,kBAAA,CAAmB,kCAAkC,QAAQ;AAExD,MAAM,2CAAA,GAA8C,CAAC,QAAA,KAC1D,kBAAA,CAAmB,kCAAkC,QAAQ;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_SCROLLABLE = { start: false, end: false };
|
|
4
|
+
const DEFAULT_VISIBILITY = { currentAnchorId: void 0, visibleMessageIds: [] };
|
|
5
|
+
const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;
|
|
6
|
+
const DEFAULT_SCROLL_MARGIN = 0;
|
|
7
|
+
const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;
|
|
8
|
+
const DEFAULT_REACH_START_THRESHOLD = 160;
|
|
9
|
+
const AUTO_SCROLL_ATTACH_THRESHOLD = 160;
|
|
10
|
+
const MessageScrollerActionsContext = React.createContext(null);
|
|
11
|
+
const MessageScrollerScrollableContext = React.createContext(null);
|
|
12
|
+
const MessageScrollerVisibilityContext = React.createContext(null);
|
|
13
|
+
const useRequiredContext = (context, hookName) => {
|
|
14
|
+
const value = React.useContext(context);
|
|
15
|
+
if (!value) throw new Error(`${hookName} must be used within MessageScrollerProvider.`);
|
|
16
|
+
return value;
|
|
17
|
+
};
|
|
18
|
+
const useRequiredMessageScrollerActionsContext = (hookName) => useRequiredContext(MessageScrollerActionsContext, hookName);
|
|
19
|
+
const useRequiredMessageScrollerScrollableContext = (hookName) => useRequiredContext(MessageScrollerScrollableContext, hookName);
|
|
20
|
+
const useRequiredMessageScrollerVisibilityContext = (hookName) => useRequiredContext(MessageScrollerVisibilityContext, hookName);
|
|
21
|
+
|
|
22
|
+
export { AUTO_SCROLL_ATTACH_THRESHOLD as A, DEFAULT_SCROLLABLE as D, MessageScrollerActionsContext as M, DEFAULT_VISIBILITY as a, DEFAULT_SCROLL_EDGE_THRESHOLD as b, DEFAULT_SCROLL_MARGIN as c, DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK as d, DEFAULT_REACH_START_THRESHOLD as e, MessageScrollerScrollableContext as f, MessageScrollerVisibilityContext as g, useRequiredMessageScrollerScrollableContext as h, useRequiredMessageScrollerVisibilityContext as i, useRequiredMessageScrollerActionsContext as u };
|
|
23
|
+
//# sourceMappingURL=message-scroller-context-tTA6jxho.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-scroller-context-tTA6jxho.js","sources":["../src/ds/components/MessageScroller/message-scroller-context.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type MessageScrollerDefaultScrollPosition = 'start' | 'end' | 'last-anchor';\nexport type MessageScrollerButtonDirection = 'start' | 'end';\nexport type MessageScrollerScrollAlign = 'start' | 'center' | 'end' | 'nearest';\n\nexport type MessageScrollerScrollOptions = {\n align?: MessageScrollerScrollAlign;\n behavior?: ScrollBehavior;\n scrollMargin?: number;\n};\n\nexport type MessageScrollerScrollable = {\n start: boolean;\n end: boolean;\n};\n\nexport type MessageScrollerVisibility = {\n currentAnchorId: string | undefined;\n visibleMessageIds: string[];\n};\n\nexport type MessageScrollerActionsContextValue = {\n notifyContentResize: () => void;\n notifyScroll: () => void;\n registerItem: (messageId: string, element: HTMLElement, scrollAnchor: boolean) => () => void;\n scrollToEnd: (options?: MessageScrollerScrollOptions) => boolean;\n scrollToMessage: (messageId: string, options?: MessageScrollerScrollOptions) => boolean;\n scrollToStart: (options?: MessageScrollerScrollOptions) => boolean;\n setContentElement: (element: HTMLDivElement | null) => void;\n setRootElement: (element: HTMLDivElement | null) => void;\n setViewportElement: (element: HTMLDivElement | null) => void;\n syncAfterScroll: () => void;\n};\n\nexport const DEFAULT_SCROLLABLE: MessageScrollerScrollable = { start: false, end: false };\nexport const DEFAULT_VISIBILITY: MessageScrollerVisibility = { currentAnchorId: undefined, visibleMessageIds: [] };\nexport const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;\nexport const DEFAULT_SCROLL_MARGIN = 0;\nexport const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;\nexport const DEFAULT_REACH_START_THRESHOLD = 160;\n\n// Looser than the edge threshold, which only decides whether the scroll buttons\n// are active: how far from the end a reader may sit and still be carried along\n// by growing content.\nexport const AUTO_SCROLL_ATTACH_THRESHOLD = 160;\n\nexport const MessageScrollerActionsContext = React.createContext<MessageScrollerActionsContextValue | null>(null);\nexport const MessageScrollerScrollableContext = React.createContext<MessageScrollerScrollable | null>(null);\nexport const MessageScrollerVisibilityContext = React.createContext<MessageScrollerVisibility | null>(null);\n\nconst useRequiredContext = <TValue>(context: React.Context<TValue | null>, hookName: string) => {\n const value = React.useContext(context);\n if (!value) throw new Error(`${hookName} must be used within MessageScrollerProvider.`);\n return value;\n};\n\nexport const useRequiredMessageScrollerActionsContext = (hookName: string) =>\n useRequiredContext(MessageScrollerActionsContext, hookName);\n\nexport const useRequiredMessageScrollerScrollableContext = (hookName: string) =>\n useRequiredContext(MessageScrollerScrollableContext, hookName);\n\nexport const useRequiredMessageScrollerVisibilityContext = (hookName: string) =>\n useRequiredContext(MessageScrollerVisibilityContext, hookName);\n"],"names":[],"mappings":";;AAmCO,MAAM,kBAAA,GAAgD,EAAE,KAAA,EAAO,KAAA,EAAO,KAAK,KAAA;AAC3E,MAAM,qBAAgD,EAAE,eAAA,EAAiB,MAAA,EAAW,iBAAA,EAAmB,EAAC;AACxG,MAAM,6BAAA,GAAgC;AACtC,MAAM,qBAAA,GAAwB;AAC9B,MAAM,iCAAA,GAAoC;AAC1C,MAAM,6BAAA,GAAgC;AAKtC,MAAM,4BAAA,GAA+B;AAErC,MAAM,6BAAA,GAAgC,KAAA,CAAM,aAAA,CAAyD,IAAI;AACzG,MAAM,gCAAA,GAAmC,KAAA,CAAM,aAAA,CAAgD,IAAI;AACnG,MAAM,gCAAA,GAAmC,KAAA,CAAM,aAAA,CAAgD,IAAI;AAE1G,MAAM,kBAAA,GAAqB,CAAS,OAAA,EAAuC,QAAA,KAAqB;AAC9F,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AACtC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,6CAAA,CAA+C,CAAA;AACtF,EAAA,OAAO,KAAA;AACT,CAAA;AAEO,MAAM,wCAAA,GAA2C,CAAC,QAAA,KACvD,kBAAA,CAAmB,+BAA+B,QAAQ;AAErD,MAAM,2CAAA,GAA8C,CAAC,QAAA,KAC1D,kBAAA,CAAmB,kCAAkC,QAAQ;AAExD,MAAM,2CAAA,GAA8C,CAAC,QAAA,KAC1D,kBAAA,CAAmB,kCAAkC,QAAQ;;;;"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const React = require('react');
|
|
4
|
+
const messageScrollerContext = require('./message-scroller-context-_VfCYFBU.cjs');
|
|
5
|
+
|
|
6
|
+
function _interopNamespaceDefault(e) {
|
|
7
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
|
|
8
|
+
if (e) {
|
|
9
|
+
for (const k in e) {
|
|
10
|
+
if (k !== 'default') {
|
|
11
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: () => e[k]
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
n.default = e;
|
|
20
|
+
return Object.freeze(n);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
24
|
+
|
|
25
|
+
const useMessageScroller = () => {
|
|
26
|
+
const { scrollToEnd, scrollToMessage, scrollToStart } = messageScrollerContext.useRequiredMessageScrollerActionsContext("useMessageScroller");
|
|
27
|
+
return React__namespace.useMemo(
|
|
28
|
+
() => ({ scrollToEnd, scrollToMessage, scrollToStart }),
|
|
29
|
+
[scrollToEnd, scrollToMessage, scrollToStart]
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
const useOptionalMessageScroller = () => {
|
|
33
|
+
const context = React__namespace.useContext(messageScrollerContext.MessageScrollerActionsContext);
|
|
34
|
+
return React__namespace.useMemo(() => {
|
|
35
|
+
if (!context) return void 0;
|
|
36
|
+
return {
|
|
37
|
+
scrollToEnd: context.scrollToEnd,
|
|
38
|
+
scrollToMessage: context.scrollToMessage,
|
|
39
|
+
scrollToStart: context.scrollToStart
|
|
40
|
+
};
|
|
41
|
+
}, [context]);
|
|
42
|
+
};
|
|
43
|
+
const useMessageScrollerScrollable = () => {
|
|
44
|
+
const { start, end } = messageScrollerContext.useRequiredMessageScrollerScrollableContext("useMessageScrollerScrollable");
|
|
45
|
+
return React__namespace.useMemo(() => ({ start, end }), [end, start]);
|
|
46
|
+
};
|
|
47
|
+
const useOptionalMessageScrollerScrollable = () => {
|
|
48
|
+
const context = React__namespace.useContext(messageScrollerContext.MessageScrollerScrollableContext);
|
|
49
|
+
return React__namespace.useMemo(() => context ? { start: context.start, end: context.end } : void 0, [context]);
|
|
50
|
+
};
|
|
51
|
+
const useMessageScrollerVisibility = () => {
|
|
52
|
+
const { currentAnchorId, visibleMessageIds } = messageScrollerContext.useRequiredMessageScrollerVisibilityContext("useMessageScrollerVisibility");
|
|
53
|
+
return React__namespace.useMemo(() => ({ currentAnchorId, visibleMessageIds }), [currentAnchorId, visibleMessageIds]);
|
|
54
|
+
};
|
|
55
|
+
const useOptionalMessageScrollerVisibility = () => {
|
|
56
|
+
const context = React__namespace.useContext(messageScrollerContext.MessageScrollerVisibilityContext);
|
|
57
|
+
return React__namespace.useMemo(
|
|
58
|
+
() => context ? {
|
|
59
|
+
currentAnchorId: context.currentAnchorId,
|
|
60
|
+
visibleMessageIds: context.visibleMessageIds
|
|
61
|
+
} : void 0,
|
|
62
|
+
[context]
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
exports.useMessageScroller = useMessageScroller;
|
|
67
|
+
exports.useMessageScrollerScrollable = useMessageScrollerScrollable;
|
|
68
|
+
exports.useMessageScrollerVisibility = useMessageScrollerVisibility;
|
|
69
|
+
exports.useOptionalMessageScroller = useOptionalMessageScroller;
|
|
70
|
+
exports.useOptionalMessageScrollerScrollable = useOptionalMessageScrollerScrollable;
|
|
71
|
+
exports.useOptionalMessageScrollerVisibility = useOptionalMessageScrollerVisibility;
|
|
72
|
+
//# sourceMappingURL=message-scroller-hooks-BxAf8k0Y.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-scroller-hooks-BxAf8k0Y.cjs","sources":["../src/ds/components/MessageScroller/message-scroller-hooks.ts"],"sourcesContent":["import * as React from 'react';\n\nimport {\n MessageScrollerActionsContext,\n MessageScrollerScrollableContext,\n MessageScrollerVisibilityContext,\n useRequiredMessageScrollerActionsContext,\n useRequiredMessageScrollerScrollableContext,\n useRequiredMessageScrollerVisibilityContext,\n} from './message-scroller-context';\n\nexport const useMessageScroller = () => {\n const { scrollToEnd, scrollToMessage, scrollToStart } =\n useRequiredMessageScrollerActionsContext('useMessageScroller');\n return React.useMemo(\n () => ({ scrollToEnd, scrollToMessage, scrollToStart }),\n [scrollToEnd, scrollToMessage, scrollToStart],\n );\n};\n\nexport const useOptionalMessageScroller = () => {\n const context = React.useContext(MessageScrollerActionsContext);\n return React.useMemo(() => {\n if (!context) return undefined;\n return {\n scrollToEnd: context.scrollToEnd,\n scrollToMessage: context.scrollToMessage,\n scrollToStart: context.scrollToStart,\n };\n }, [context]);\n};\n\nexport const useMessageScrollerScrollable = () => {\n const { start, end } = useRequiredMessageScrollerScrollableContext('useMessageScrollerScrollable');\n return React.useMemo(() => ({ start, end }), [end, start]);\n};\n\nexport const useOptionalMessageScrollerScrollable = () => {\n const context = React.useContext(MessageScrollerScrollableContext);\n return React.useMemo(() => (context ? { start: context.start, end: context.end } : undefined), [context]);\n};\n\nexport const useMessageScrollerVisibility = () => {\n const { currentAnchorId, visibleMessageIds } =\n useRequiredMessageScrollerVisibilityContext('useMessageScrollerVisibility');\n return React.useMemo(() => ({ currentAnchorId, visibleMessageIds }), [currentAnchorId, visibleMessageIds]);\n};\n\nexport const useOptionalMessageScrollerVisibility = () => {\n const context = React.useContext(MessageScrollerVisibilityContext);\n return React.useMemo(\n () =>\n context\n ? {\n currentAnchorId: context.currentAnchorId,\n visibleMessageIds: context.visibleMessageIds,\n }\n : undefined,\n [context],\n );\n};\n"],"names":["useRequiredMessageScrollerActionsContext","React","MessageScrollerActionsContext","useRequiredMessageScrollerScrollableContext","MessageScrollerScrollableContext","useRequiredMessageScrollerVisibilityContext","MessageScrollerVisibilityContext"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAWO,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,aAAA,EAAc,GAClDA,gEAAyC,oBAAoB,CAAA;AAC/D,EAAA,OAAOC,gBAAA,CAAM,OAAA;AAAA,IACX,OAAO,EAAE,WAAA,EAAa,eAAA,EAAiB,aAAA,EAAc,CAAA;AAAA,IACrD,CAAC,WAAA,EAAa,eAAA,EAAiB,aAAa;AAAA,GAC9C;AACF;AAEO,MAAM,6BAA6B,MAAM;AAC9C,EAAA,MAAM,OAAA,GAAUA,gBAAA,CAAM,UAAA,CAAWC,oDAA6B,CAAA;AAC9D,EAAA,OAAOD,gBAAA,CAAM,QAAQ,MAAM;AACzB,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,OAAO;AAAA,MACL,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,eAAe,OAAA,CAAQ;AAAA,KACzB;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACd;AAEO,MAAM,+BAA+B,MAAM;AAChD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAIE,mEAA4C,8BAA8B,CAAA;AACjG,EAAA,OAAOF,gBAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,KAAA,EAAO,KAAI,CAAA,EAAI,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3D;AAEO,MAAM,uCAAuC,MAAM;AACxD,EAAA,MAAM,OAAA,GAAUA,gBAAA,CAAM,UAAA,CAAWG,uDAAgC,CAAA;AACjE,EAAA,OAAOH,gBAAA,CAAM,OAAA,CAAQ,MAAO,OAAA,GAAU,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI,GAAI,MAAA,EAAY,CAAC,OAAO,CAAC,CAAA;AAC1G;AAEO,MAAM,+BAA+B,MAAM;AAChD,EAAA,MAAM,EAAE,eAAA,EAAiB,iBAAA,EAAkB,GACzCI,mEAA4C,8BAA8B,CAAA;AAC5E,EAAA,OAAOJ,gBAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,eAAA,EAAiB,mBAAkB,CAAA,EAAI,CAAC,eAAA,EAAiB,iBAAiB,CAAC,CAAA;AAC3G;AAEO,MAAM,uCAAuC,MAAM;AACxD,EAAA,MAAM,OAAA,GAAUA,gBAAA,CAAM,UAAA,CAAWK,uDAAgC,CAAA;AACjE,EAAA,OAAOL,gBAAA,CAAM,OAAA;AAAA,IACX,MACE,OAAA,GACI;AAAA,MACE,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,mBAAmB,OAAA,CAAQ;AAAA,KAC7B,GACA,MAAA;AAAA,IACN,CAAC,OAAO;AAAA,GACV;AACF;;;;;;;;;"}
|
|
@@ -1,21 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
|
|
3
|
-
const DEFAULT_SCROLLABLE = { start: false, end: false };
|
|
4
|
-
const DEFAULT_VISIBILITY = { currentAnchorId: void 0, visibleMessageIds: [] };
|
|
5
|
-
const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;
|
|
6
|
-
const DEFAULT_SCROLL_MARGIN = 0;
|
|
7
|
-
const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;
|
|
8
|
-
const MessageScrollerActionsContext = React.createContext(null);
|
|
9
|
-
const MessageScrollerScrollableContext = React.createContext(null);
|
|
10
|
-
const MessageScrollerVisibilityContext = React.createContext(null);
|
|
11
|
-
const useRequiredContext = (context, hookName) => {
|
|
12
|
-
const value = React.useContext(context);
|
|
13
|
-
if (!value) throw new Error(`${hookName} must be used within MessageScrollerProvider.`);
|
|
14
|
-
return value;
|
|
15
|
-
};
|
|
16
|
-
const useRequiredMessageScrollerActionsContext = (hookName) => useRequiredContext(MessageScrollerActionsContext, hookName);
|
|
17
|
-
const useRequiredMessageScrollerScrollableContext = (hookName) => useRequiredContext(MessageScrollerScrollableContext, hookName);
|
|
18
|
-
const useRequiredMessageScrollerVisibilityContext = (hookName) => useRequiredContext(MessageScrollerVisibilityContext, hookName);
|
|
2
|
+
import { u as useRequiredMessageScrollerActionsContext, h as useRequiredMessageScrollerScrollableContext, i as useRequiredMessageScrollerVisibilityContext, M as MessageScrollerActionsContext, f as MessageScrollerScrollableContext, g as MessageScrollerVisibilityContext } from './message-scroller-context-tTA6jxho.js';
|
|
19
3
|
|
|
20
4
|
const useMessageScroller = () => {
|
|
21
5
|
const { scrollToEnd, scrollToMessage, scrollToStart } = useRequiredMessageScrollerActionsContext("useMessageScroller");
|
|
@@ -58,5 +42,5 @@ const useOptionalMessageScrollerVisibility = () => {
|
|
|
58
42
|
);
|
|
59
43
|
};
|
|
60
44
|
|
|
61
|
-
export {
|
|
62
|
-
//# sourceMappingURL=message-scroller-hooks-
|
|
45
|
+
export { useMessageScrollerScrollable as a, useMessageScrollerVisibility as b, useOptionalMessageScroller as c, useOptionalMessageScrollerScrollable as d, useOptionalMessageScrollerVisibility as e, useMessageScroller as u };
|
|
46
|
+
//# sourceMappingURL=message-scroller-hooks-D5yxCon2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-scroller-hooks-D5yxCon2.js","sources":["../src/ds/components/MessageScroller/message-scroller-hooks.ts"],"sourcesContent":["import * as React from 'react';\n\nimport {\n MessageScrollerActionsContext,\n MessageScrollerScrollableContext,\n MessageScrollerVisibilityContext,\n useRequiredMessageScrollerActionsContext,\n useRequiredMessageScrollerScrollableContext,\n useRequiredMessageScrollerVisibilityContext,\n} from './message-scroller-context';\n\nexport const useMessageScroller = () => {\n const { scrollToEnd, scrollToMessage, scrollToStart } =\n useRequiredMessageScrollerActionsContext('useMessageScroller');\n return React.useMemo(\n () => ({ scrollToEnd, scrollToMessage, scrollToStart }),\n [scrollToEnd, scrollToMessage, scrollToStart],\n );\n};\n\nexport const useOptionalMessageScroller = () => {\n const context = React.useContext(MessageScrollerActionsContext);\n return React.useMemo(() => {\n if (!context) return undefined;\n return {\n scrollToEnd: context.scrollToEnd,\n scrollToMessage: context.scrollToMessage,\n scrollToStart: context.scrollToStart,\n };\n }, [context]);\n};\n\nexport const useMessageScrollerScrollable = () => {\n const { start, end } = useRequiredMessageScrollerScrollableContext('useMessageScrollerScrollable');\n return React.useMemo(() => ({ start, end }), [end, start]);\n};\n\nexport const useOptionalMessageScrollerScrollable = () => {\n const context = React.useContext(MessageScrollerScrollableContext);\n return React.useMemo(() => (context ? { start: context.start, end: context.end } : undefined), [context]);\n};\n\nexport const useMessageScrollerVisibility = () => {\n const { currentAnchorId, visibleMessageIds } =\n useRequiredMessageScrollerVisibilityContext('useMessageScrollerVisibility');\n return React.useMemo(() => ({ currentAnchorId, visibleMessageIds }), [currentAnchorId, visibleMessageIds]);\n};\n\nexport const useOptionalMessageScrollerVisibility = () => {\n const context = React.useContext(MessageScrollerVisibilityContext);\n return React.useMemo(\n () =>\n context\n ? {\n currentAnchorId: context.currentAnchorId,\n visibleMessageIds: context.visibleMessageIds,\n }\n : undefined,\n [context],\n );\n};\n"],"names":[],"mappings":";;;AAWO,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,aAAA,EAAc,GAClD,yCAAyC,oBAAoB,CAAA;AAC/D,EAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACX,OAAO,EAAE,WAAA,EAAa,eAAA,EAAiB,aAAA,EAAc,CAAA;AAAA,IACrD,CAAC,WAAA,EAAa,eAAA,EAAiB,aAAa;AAAA,GAC9C;AACF;AAEO,MAAM,6BAA6B,MAAM;AAC9C,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,6BAA6B,CAAA;AAC9D,EAAA,OAAO,KAAA,CAAM,QAAQ,MAAM;AACzB,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,OAAO;AAAA,MACL,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,eAAe,OAAA,CAAQ;AAAA,KACzB;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACd;AAEO,MAAM,+BAA+B,MAAM;AAChD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,4CAA4C,8BAA8B,CAAA;AACjG,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,KAAA,EAAO,KAAI,CAAA,EAAI,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3D;AAEO,MAAM,uCAAuC,MAAM;AACxD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,gCAAgC,CAAA;AACjE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAO,OAAA,GAAU,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI,GAAI,MAAA,EAAY,CAAC,OAAO,CAAC,CAAA;AAC1G;AAEO,MAAM,+BAA+B,MAAM;AAChD,EAAA,MAAM,EAAE,eAAA,EAAiB,iBAAA,EAAkB,GACzC,4CAA4C,8BAA8B,CAAA;AAC5E,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,eAAA,EAAiB,mBAAkB,CAAA,EAAI,CAAC,eAAA,EAAiB,iBAAiB,CAAC,CAAA;AAC3G;AAEO,MAAM,uCAAuC,MAAM;AACxD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,gCAAgC,CAAA;AACjE,EAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACX,MACE,OAAA,GACI;AAAA,MACE,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,mBAAmB,OAAA,CAAQ;AAAA,KAC7B,GACA,MAAA;AAAA,IACN,CAAC,OAAO;AAAA,GACV;AACF;;;;"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ComponentPropsWithoutRef } from 'react';
|
|
2
|
+
import { MessageScrollerButtonProps, MessageScrollerContentProps, MessageScrollerProviderProps, MessageScrollerViewportProps } from '../MessageScroller';
|
|
3
|
+
export type ChatShellProps = ComponentPropsWithoutRef<'div'> & {
|
|
4
|
+
scroller?: Omit<MessageScrollerProviderProps, 'children'>;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* A chat page frame with exactly one scroll container. Bars sit above it, the
|
|
8
|
+
* composer docks inside it, every region shares one column.
|
|
9
|
+
*
|
|
10
|
+
* Tuned through custom properties, all defaulted here: `--chat-column` (column
|
|
11
|
+
* width), `--chat-surface` (page colour), `--chat-gutter` (room above and below
|
|
12
|
+
* the composer), `--chat-veil` (what the dock paints with), `--chat-inset-end`
|
|
13
|
+
* (room an overlay panel claims on the end edge).
|
|
14
|
+
*/
|
|
15
|
+
export declare function ChatShellRoot({ className, scroller, ...props }: ChatShellProps): import("react").JSX.Element;
|
|
16
|
+
/**
|
|
17
|
+
* Full-width row above the scroller (session header, goal bar). No end inset: the
|
|
18
|
+
* overlay panel it would dodge floats inside the stage, below the bars.
|
|
19
|
+
*/
|
|
20
|
+
export declare function ChatShellBar({ className, ...props }: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element;
|
|
21
|
+
/** Positioned region holding the scroller plus anything overlaying it. */
|
|
22
|
+
export declare function ChatShellStage({ className, ...props }: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element;
|
|
23
|
+
/**
|
|
24
|
+
* The one scroll container. It takes the end inset itself — on an ancestor the
|
|
25
|
+
* same room would drag the scrollbar inward, off the true edge.
|
|
26
|
+
*/
|
|
27
|
+
export declare function ChatShellViewport({ className, children, ...props }: MessageScrollerViewportProps): import("react").JSX.Element;
|
|
28
|
+
/** Scrolling content. Its bottom padding is the unveiled air above the composer. */
|
|
29
|
+
export declare function ChatShellContent({ className, ...props }: MessageScrollerContentProps): import("react").JSX.Element;
|
|
30
|
+
/** The shared reading column. Every chat region must go through it. */
|
|
31
|
+
export declare function ChatShellColumn({ className, ...props }: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element;
|
|
32
|
+
/**
|
|
33
|
+
* Composer region, sticky but left in flow: its own height reserves the room the
|
|
34
|
+
* transcript scrolls behind, so nothing measures it and a composer growing under
|
|
35
|
+
* the cursor resizes no box the scroller watches.
|
|
36
|
+
*
|
|
37
|
+
* The veil is a background, not an overlay, so it passes behind the composer card
|
|
38
|
+
* and dims the transcript in its rounded corners too.
|
|
39
|
+
*/
|
|
40
|
+
export declare function ChatShellDock({ className, ...props }: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element;
|
|
41
|
+
/**
|
|
42
|
+
* Jump-to-latest, floating just above the dock. It belongs inside the dock:
|
|
43
|
+
* anywhere else it centres on a box the scrollbar has not narrowed, landing off
|
|
44
|
+
* the composer's axis.
|
|
45
|
+
*/
|
|
46
|
+
export declare function ChatShellScrollButton({ className, ...props }: MessageScrollerButtonProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { ChatShell } from './index';
|
|
3
|
+
declare const meta: Meta<typeof ChatShell>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof ChatShell>;
|
|
6
|
+
export declare const ShortThread: Story;
|
|
7
|
+
export declare const LongThread: Story;
|
|
8
|
+
export declare const UnbreakableTokenInColumn: Story;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ChatShellBar, ChatShellColumn, ChatShellContent, ChatShellDock, ChatShellRoot, ChatShellScrollButton, ChatShellStage, ChatShellViewport } from './chat-shell';
|
|
2
|
+
export type { ChatShellProps } from './chat-shell';
|
|
3
|
+
export declare const ChatShell: typeof ChatShellRoot & {
|
|
4
|
+
Bar: typeof ChatShellBar;
|
|
5
|
+
Column: typeof ChatShellColumn;
|
|
6
|
+
Content: typeof ChatShellContent;
|
|
7
|
+
Dock: typeof ChatShellDock;
|
|
8
|
+
ScrollButton: typeof ChatShellScrollButton;
|
|
9
|
+
Stage: typeof ChatShellStage;
|
|
10
|
+
Viewport: typeof ChatShellViewport;
|
|
11
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ComponentPropsWithoutRef, HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import { CommandDialog, CommandInput, CommandItem } from '../Command';
|
|
3
|
+
type CommandPaletteDialogProps = ComponentPropsWithoutRef<typeof CommandDialog>;
|
|
4
|
+
declare function CommandPaletteDialog({ children, contentClassName, commandClassName, showOverlay, overlayClassName, ...props }: CommandPaletteDialogProps): import("react").JSX.Element;
|
|
5
|
+
type CommandPaletteInputProps = ComponentPropsWithoutRef<typeof CommandInput>;
|
|
6
|
+
declare function CommandPaletteInput({ wrapperClassName, ...props }: CommandPaletteInputProps): import("react").JSX.Element;
|
|
7
|
+
declare function CommandPaletteBody({ children, className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
8
|
+
type CommandPaletteRailProps = ComponentPropsWithoutRef<'aside'> & {
|
|
9
|
+
'aria-label': string;
|
|
10
|
+
};
|
|
11
|
+
declare function CommandPaletteRail({ children, className, ...props }: CommandPaletteRailProps): import("react").JSX.Element;
|
|
12
|
+
declare function CommandPaletteScope({ icon, label, count, active, onSelect, }: {
|
|
13
|
+
icon: ReactNode;
|
|
14
|
+
label: string;
|
|
15
|
+
count: number;
|
|
16
|
+
active: boolean;
|
|
17
|
+
onSelect: () => void;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
type CommandPaletteResultsProps = {
|
|
20
|
+
'aria-label': string;
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
footer?: ReactNode;
|
|
23
|
+
};
|
|
24
|
+
declare function CommandPaletteResults({ children, footer, ...props }: CommandPaletteResultsProps): import("react").JSX.Element;
|
|
25
|
+
type CommandPaletteItemProps = Omit<ComponentPropsWithoutRef<typeof CommandItem>, 'children'> & {
|
|
26
|
+
icon: ReactNode;
|
|
27
|
+
title: string;
|
|
28
|
+
subtitle?: string;
|
|
29
|
+
path?: string;
|
|
30
|
+
badge?: string;
|
|
31
|
+
shortcut?: ReactNode;
|
|
32
|
+
};
|
|
33
|
+
declare function CommandPaletteItem({ icon, title, subtitle, path, badge, shortcut, className, ...props }: CommandPaletteItemProps): import("react").JSX.Element;
|
|
34
|
+
declare function CommandPaletteFooter({ label }: {
|
|
35
|
+
label: string;
|
|
36
|
+
}): import("react").JSX.Element;
|
|
37
|
+
export { CommandPaletteBody, CommandPaletteDialog, CommandPaletteFooter, CommandPaletteInput, CommandPaletteItem, CommandPaletteRail, CommandPaletteResults, CommandPaletteScope, };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { CommandPaletteDialog } from './command-palette';
|
|
3
|
+
declare const meta: {
|
|
4
|
+
title: string;
|
|
5
|
+
component: typeof CommandPaletteDialog;
|
|
6
|
+
parameters: {
|
|
7
|
+
layout: string;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export default meta;
|
|
11
|
+
type Story = StoryObj<typeof meta>;
|
|
12
|
+
export declare const Default: Story;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandPaletteBody, CommandPaletteDialog, CommandPaletteFooter, CommandPaletteInput, CommandPaletteItem, CommandPaletteRail, CommandPaletteResults, CommandPaletteScope, } from './command-palette';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export type KbdProps = {
|
|
2
2
|
children: React.ReactNode;
|
|
3
3
|
theme?: 'light' | 'dark';
|
|
4
|
+
size?: 'default' | 'sm' | 'xs';
|
|
4
5
|
className?: string;
|
|
5
6
|
};
|
|
6
|
-
export declare const Kbd: ({ children, theme, className }: KbdProps) => import("react").JSX.Element;
|
|
7
|
+
export declare const Kbd: ({ children, theme, size, className }: KbdProps) => import("react").JSX.Element;
|
|
@@ -16,6 +16,8 @@ export type MessageScrollerVisibility = {
|
|
|
16
16
|
visibleMessageIds: string[];
|
|
17
17
|
};
|
|
18
18
|
export type MessageScrollerActionsContextValue = {
|
|
19
|
+
notifyContentResize: () => void;
|
|
20
|
+
notifyScroll: () => void;
|
|
19
21
|
registerItem: (messageId: string, element: HTMLElement, scrollAnchor: boolean) => () => void;
|
|
20
22
|
scrollToEnd: (options?: MessageScrollerScrollOptions) => boolean;
|
|
21
23
|
scrollToMessage: (messageId: string, options?: MessageScrollerScrollOptions) => boolean;
|
|
@@ -30,6 +32,8 @@ export declare const DEFAULT_VISIBILITY: MessageScrollerVisibility;
|
|
|
30
32
|
export declare const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;
|
|
31
33
|
export declare const DEFAULT_SCROLL_MARGIN = 0;
|
|
32
34
|
export declare const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;
|
|
35
|
+
export declare const DEFAULT_REACH_START_THRESHOLD = 160;
|
|
36
|
+
export declare const AUTO_SCROLL_ATTACH_THRESHOLD = 160;
|
|
33
37
|
export declare const MessageScrollerActionsContext: React.Context<MessageScrollerActionsContextValue | null>;
|
|
34
38
|
export declare const MessageScrollerScrollableContext: React.Context<MessageScrollerScrollable | null>;
|
|
35
39
|
export declare const MessageScrollerVisibilityContext: React.Context<MessageScrollerVisibility | null>;
|
|
@@ -5,19 +5,20 @@ export interface MessageScrollerProviderProps {
|
|
|
5
5
|
autoScroll?: boolean;
|
|
6
6
|
children?: React.ReactNode;
|
|
7
7
|
defaultScrollPosition?: MessageScrollerDefaultScrollPosition;
|
|
8
|
+
/** Called when the reader scrolls near the start — where older history is loaded. */
|
|
9
|
+
onReachStart?: () => void;
|
|
10
|
+
/** Hold the reading position when older items are added above the current ones. */
|
|
11
|
+
preserveScrollOnPrepend?: boolean;
|
|
12
|
+
reachStartThreshold?: number;
|
|
8
13
|
scrollEdgeThreshold?: number;
|
|
9
14
|
scrollMargin?: number;
|
|
10
15
|
scrollPreviousItemPeek?: number;
|
|
11
16
|
}
|
|
12
|
-
export declare function MessageScrollerProvider({ autoScroll, children, defaultScrollPosition, scrollEdgeThreshold, scrollMargin, scrollPreviousItemPeek, }: MessageScrollerProviderProps): React.JSX.Element;
|
|
17
|
+
export declare function MessageScrollerProvider({ autoScroll, children, defaultScrollPosition, onReachStart, preserveScrollOnPrepend, reachStartThreshold, scrollEdgeThreshold, scrollMargin, scrollPreviousItemPeek, }: MessageScrollerProviderProps): React.JSX.Element;
|
|
13
18
|
export type MessageScrollerProps = React.HTMLAttributes<HTMLDivElement>;
|
|
14
19
|
export declare const MessageScroller: React.ForwardRefExoticComponent<MessageScrollerProps & React.RefAttributes<HTMLDivElement>>;
|
|
15
|
-
export type MessageScrollerViewportProps = React.HTMLAttributes<HTMLDivElement
|
|
16
|
-
|
|
17
|
-
};
|
|
18
|
-
export declare const MessageScrollerViewport: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
|
|
19
|
-
preserveScrollOnPrepend?: boolean;
|
|
20
|
-
} & React.RefAttributes<HTMLDivElement>>;
|
|
20
|
+
export type MessageScrollerViewportProps = React.HTMLAttributes<HTMLDivElement>;
|
|
21
|
+
export declare const MessageScrollerViewport: React.ForwardRefExoticComponent<MessageScrollerViewportProps & React.RefAttributes<HTMLDivElement>>;
|
|
21
22
|
export type MessageScrollerContentProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
22
23
|
spacerClassName?: string;
|
|
23
24
|
};
|