@mastra/playground-ui 64.0.1-alpha.0 → 65.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +10 -2
  2. package/components.css +340 -0
  3. package/dist/code-DJReJPSX.cjs.map +1 -1
  4. package/dist/code-DLuATvYu.js.map +1 -1
  5. package/dist/components/Breadcrumb.cjs.js +4 -2
  6. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  7. package/dist/components/Breadcrumb.es.js +5 -3
  8. package/dist/components/Breadcrumb.es.js.map +1 -1
  9. package/dist/components/ChatShell.cjs.js +2 -2
  10. package/dist/components/ChatShell.cjs.js.map +1 -1
  11. package/dist/components/ChatShell.es.js +2 -2
  12. package/dist/components/ChatShell.es.js.map +1 -1
  13. package/dist/components/Composer.cjs.js +1 -1
  14. package/dist/components/Composer.cjs.js.map +1 -1
  15. package/dist/components/Composer.es.js +1 -1
  16. package/dist/components/Composer.es.js.map +1 -1
  17. package/dist/components/DataList.cjs.js +5 -5
  18. package/dist/components/DataList.es.js +5 -5
  19. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  20. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  21. package/dist/components/LogsDataList.cjs.js +2 -2
  22. package/dist/components/LogsDataList.es.js +2 -2
  23. package/dist/components/MessageScroller.cjs.js +1 -1
  24. package/dist/components/MessageScroller.es.js +1 -1
  25. package/dist/components/SavedViews.cjs.js +0 -1
  26. package/dist/components/SavedViews.cjs.js.map +1 -1
  27. package/dist/components/SavedViews.es.js +0 -1
  28. package/dist/components/SavedViews.es.js.map +1 -1
  29. package/dist/components/fluid-hover-highlight.cjs.js +7 -1
  30. package/dist/components/fluid-hover-highlight.cjs.js.map +1 -1
  31. package/dist/components/fluid-hover-highlight.es.js +7 -1
  32. package/dist/components/fluid-hover-highlight.es.js.map +1 -1
  33. package/dist/{data-list-DUfXIhyC.cjs → data-list-CmjTe8xE.cjs} +3 -3
  34. package/dist/{data-list-DUfXIhyC.cjs.map → data-list-CmjTe8xE.cjs.map} +1 -1
  35. package/dist/{data-list-DXQY_iQW.js → data-list-DT1LVR29.js} +3 -3
  36. package/dist/{data-list-DXQY_iQW.js.map → data-list-DT1LVR29.js.map} +1 -1
  37. package/dist/{data-list-skeleton-B_SXAeE0.js → data-list-skeleton-bNfITSHs.js} +2 -2
  38. package/dist/{data-list-skeleton-B_SXAeE0.js.map → data-list-skeleton-bNfITSHs.js.map} +1 -1
  39. package/dist/{data-list-skeleton-BqC9Gggi.cjs → data-list-skeleton-sdcaabdX.cjs} +2 -2
  40. package/dist/{data-list-skeleton-BqC9Gggi.cjs.map → data-list-skeleton-sdcaabdX.cjs.map} +1 -1
  41. package/dist/{data-list-spacer-tQaBaum4.cjs → data-list-spacer-CdlT6bDd.cjs} +2 -2
  42. package/dist/{data-list-spacer-tQaBaum4.cjs.map → data-list-spacer-CdlT6bDd.cjs.map} +1 -1
  43. package/dist/{data-list-spacer-ByA4ce2a.js → data-list-spacer-D--gDmOm.js} +2 -2
  44. package/dist/{data-list-spacer-ByA4ce2a.js.map → data-list-spacer-D--gDmOm.js.map} +1 -1
  45. package/dist/{data-list-top-ByT2Mo77.cjs → data-list-top-DJh08vFA.cjs} +2 -9
  46. package/dist/data-list-top-DJh08vFA.cjs.map +1 -0
  47. package/dist/{data-list-top-DSr_ocKA.js → data-list-top-T-mtdIUp.js} +2 -9
  48. package/dist/data-list-top-T-mtdIUp.js.map +1 -0
  49. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +104 -92
  50. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js.map +1 -1
  51. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +105 -93
  52. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js.map +1 -1
  53. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  54. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  55. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +3 -3
  56. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +3 -3
  57. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +6 -10
  58. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
  59. package/dist/domains/observability/components/trace-as-item-dialog.es.js +7 -11
  60. package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
  61. package/dist/domains/scores/components/score-as-item-dialog.cjs.js +3 -9
  62. package/dist/domains/scores/components/score-as-item-dialog.cjs.js.map +1 -1
  63. package/dist/domains/scores/components/score-as-item-dialog.es.js +4 -10
  64. package/dist/domains/scores/components/score-as-item-dialog.es.js.map +1 -1
  65. package/dist/domains/scores/components/score-data-panel.cjs.js +9 -1
  66. package/dist/domains/scores/components/score-data-panel.cjs.js.map +1 -1
  67. package/dist/domains/scores/components/score-data-panel.es.js +9 -1
  68. package/dist/domains/scores/components/score-data-panel.es.js.map +1 -1
  69. package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -1
  70. package/dist/domains/scores/components/trace-scores-tab.es.js +1 -1
  71. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js +12 -13
  72. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js.map +1 -1
  73. package/dist/domains/traces/components/format-hierarchical-spans.es.js +12 -13
  74. package/dist/domains/traces/components/format-hierarchical-spans.es.js.map +1 -1
  75. package/dist/domains/traces/components/span-rows.cjs.js +2 -1
  76. package/dist/domains/traces/components/span-rows.cjs.js.map +1 -1
  77. package/dist/domains/traces/components/span-rows.es.js +2 -1
  78. package/dist/domains/traces/components/span-rows.es.js.map +1 -1
  79. package/dist/domains/traces/components/thread-trace/thread-trace-list.cjs.js +1 -1
  80. package/dist/domains/traces/components/thread-trace/thread-trace-list.es.js +1 -1
  81. package/dist/domains/traces/components/thread-trace/thread-trace-root.cjs.js +1 -1
  82. package/dist/domains/traces/components/thread-trace/thread-trace-root.es.js +1 -1
  83. package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
  84. package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
  85. package/dist/domains/traces/components/trace-span-timeline.cjs.js +2 -1
  86. package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
  87. package/dist/domains/traces/components/trace-span-timeline.es.js +2 -1
  88. package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
  89. package/dist/domains/traces/components/traces-list-view.cjs.js +4 -4
  90. package/dist/domains/traces/components/traces-list-view.es.js +4 -4
  91. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
  92. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
  93. package/dist/domains/traces/utils/span-timing.cjs.js +10 -0
  94. package/dist/domains/traces/utils/span-timing.cjs.js.map +1 -1
  95. package/dist/domains/traces/utils/span-timing.es.js +10 -1
  96. package/dist/domains/traces/utils/span-timing.es.js.map +1 -1
  97. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  98. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  99. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
  100. package/dist/ee/signals/components/entity-index-list.es.js +1 -1
  101. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -1
  102. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -1
  103. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  104. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  105. package/dist/hooks/use-fluid-hover.cjs.js +3 -2
  106. package/dist/hooks/use-fluid-hover.cjs.js.map +1 -1
  107. package/dist/hooks/use-fluid-hover.es.js +3 -2
  108. package/dist/hooks/use-fluid-hover.es.js.map +1 -1
  109. package/dist/layout/tabbed-container.cjs.js +1 -1
  110. package/dist/layout/tabbed-container.es.js +1 -1
  111. package/dist/{logs-data-list-CoER2Hst.js → logs-data-list-Cb85LPcT.js} +3 -3
  112. package/dist/{logs-data-list-CoER2Hst.js.map → logs-data-list-Cb85LPcT.js.map} +1 -1
  113. package/dist/{logs-data-list-DRR6cMgl.cjs → logs-data-list-DlQxxrNw.cjs} +3 -3
  114. package/dist/{logs-data-list-DRR6cMgl.cjs.map → logs-data-list-DlQxxrNw.cjs.map} +1 -1
  115. package/dist/{message-scroller-CS1KxKn6.js → message-scroller-C6gXU5d5.js} +2 -2
  116. package/dist/{message-scroller-CS1KxKn6.js.map → message-scroller-C6gXU5d5.js.map} +1 -1
  117. package/dist/{message-scroller-C4fH6uJg.cjs → message-scroller-fjucuCuw.cjs} +2 -2
  118. package/dist/{message-scroller-C4fH6uJg.cjs.map → message-scroller-fjucuCuw.cjs.map} +1 -1
  119. package/dist/primitives/raised-surface.cjs.js.map +1 -1
  120. package/dist/primitives/raised-surface.es.js.map +1 -1
  121. package/dist/scroll-area-CAY0DNQj.cjs.map +1 -1
  122. package/dist/scroll-area-MaMqo4l8.js.map +1 -1
  123. package/dist/src/domains/datasets/components/index.d.ts +1 -1
  124. package/dist/src/domains/datasets/components/save-as-dataset-item-dialog.d.ts +14 -3
  125. package/dist/src/domains/observability/components/trace-as-item-dialog.d.ts +5 -3
  126. package/dist/src/domains/scores/components/score-as-item-dialog.d.ts +3 -3
  127. package/dist/src/domains/traces/utils/span-timing.d.ts +2 -0
  128. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -2
  129. package/dist/src/ds/components/ChatShell/chat-shell.d.ts +3 -2
  130. package/dist/src/ds/components/Code/code.d.ts +1 -1
  131. package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +4 -0
  132. package/dist/src/ds/primitives/raised-surface.d.ts +1 -1
  133. package/dist/src/hooks/use-fluid-hover.d.ts +1 -0
  134. package/dist/style.css +32 -31
  135. package/dist/toast.css +1 -1
  136. package/dist/tokens.cjs.js.map +1 -1
  137. package/dist/tokens.es.js.map +1 -1
  138. package/dist/{traces-data-list-BgjeB-BF.cjs → traces-data-list-Bhhg9drs.cjs} +4 -4
  139. package/dist/{traces-data-list-BgjeB-BF.cjs.map → traces-data-list-Bhhg9drs.cjs.map} +1 -1
  140. package/dist/{traces-data-list-Zoai0OW_.js → traces-data-list-DMWPJFBc.js} +4 -4
  141. package/dist/{traces-data-list-Zoai0OW_.js.map → traces-data-list-DMWPJFBc.js.map} +1 -1
  142. package/dist/use-text-highlight.css +4 -4
  143. package/package.json +15 -11
  144. package/sources.css +1 -0
  145. package/theme/code.css +17 -0
  146. package/theme/surfaces.css +2 -2
  147. package/theme.css +2 -0
  148. package/dist/data-list-top-ByT2Mo77.cjs.map +0 -1
  149. package/dist/data-list-top-DSr_ocKA.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"message-scroller-CS1KxKn6.js","sources":["../src/ds/components/MessageScroller/message-scroller-geometry.ts","../src/ds/components/MessageScroller/message-scroller-glide.ts","../src/ds/components/MessageScroller/message-scroller-trip.ts","../src/ds/components/MessageScroller/message-scroller.tsx"],"sourcesContent":["import type { MessageScrollerScrollAlign } from './message-scroller-context';\n\n/**\n * Geometry behind the scroller: how far to scroll for a given alignment, and\n * which anchored message the reader is currently on. Split out from the\n * component so each rule can be reasoned about — and tested — on its own.\n */\n\n/** A message the scroller tracks, and whether a turn is anchored to it. */\nexport type MessageScrollerItemRecord = {\n element: HTMLElement;\n scrollAnchor: boolean;\n};\n\n/** Sub-pixel slack, so a message resting exactly on the anchor line still counts. */\nexport const VISIBILITY_EPSILON = 0.5;\n\nexport const 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,\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom) || 0,\n };\n};\n\nexport const getMaxScroll = (viewportElement: HTMLElement) =>\n Math.max(0, viewportElement.scrollHeight - viewportElement.clientHeight);\n\nexport const 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\nexport const getScrollTarget = ({\n align,\n contentElement,\n element,\n scrollMargin,\n viewportElement,\n}: {\n align: MessageScrollerScrollAlign;\n /** The padding framing the transcript lives here, however deep the rows nest. */\n contentElement: HTMLElement | null;\n element: HTMLElement;\n scrollMargin: number;\n viewportElement: HTMLElement;\n}) => {\n const contentPadding = getContentPadding(contentElement);\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\n/**\n * Where the reader must sit for the last row to rest at the end of the view.\n *\n * Not the end of the scroll: a chat reserves room under a live turn so a reply\n * grows into empty space, and docks its composer in the flow. Both sit below the\n * last row, so scrolling to the end of the box carries that row — and the message\n * that opened the turn — out of the view above. Reading it from the rows means no\n * one has to publish a height for anyone else to subtract.\n */\nexport const getFollowTarget = ({\n contentElement,\n items,\n viewportElement,\n}: {\n contentElement: HTMLElement | null;\n items: Array<readonly [string, MessageScrollerItemRecord]>;\n viewportElement: HTMLElement;\n}) => {\n const end = getMaxScroll(viewportElement);\n const lastRow = items.at(-1)?.[1].element;\n if (!lastRow || !contentElement) return end;\n\n const contentBottom = getRelativeTop(contentElement, viewportElement) + contentElement.getBoundingClientRect().height;\n const belowContent = Math.max(0, viewportElement.scrollHeight - contentBottom);\n const rowBottom = getRelativeTop(lastRow, viewportElement) + lastRow.getBoundingClientRect().height;\n\n return Math.min(end, Math.max(0, rowBottom + belowContent - viewportElement.clientHeight));\n};\n\nexport const 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","/** Longest single growth worth smoothing. Past it the move is one the reader asked for. */\nconst GLIDE_MAX = 240;\nconst GLIDE_MS = 220;\nconst GLIDE_EASE = 'cubic-bezier(0.33, 1, 0.68, 1)';\n\nfunction currentOffset(element: HTMLElement): number {\n if (typeof DOMMatrixReadOnly === 'undefined') return 0;\n const { transform } = getComputedStyle(element);\n if (!transform || transform === 'none') return 0;\n return new DOMMatrixReadOnly(transform).m42;\n}\n\nconst travels = new WeakMap<HTMLElement, AbortController>();\n\nfunction release(element: HTMLElement): void {\n travels.get(element)?.abort();\n travels.delete(element);\n element.style.transition = '';\n element.style.transform = '';\n}\n\nfunction calm(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Hides a scroll that has already happened. The end is pinned instantly, as it must\n * be, then the content is put back where the reader last saw it and travels to zero\n * on the compositor — so a reply growing a line at a time reads as one movement\n * rather than a snap per wrapped line.\n *\n * Transform, not layout: `scrollHeight` never changes, so nothing here can feed the\n * resize that called it. A line landing mid-travel only adds to the distance left.\n */\nexport function glideContent(element: HTMLElement | null, delta: number): void {\n if (!element || delta <= 0 || calm()) return;\n\n const offset = currentOffset(element) + delta;\n if (offset > GLIDE_MAX) {\n release(element);\n return;\n }\n\n element.style.transition = 'none';\n element.style.transform = `translateY(${offset}px)`;\n // Commit the displaced position, or the browser only ever sees the settled one.\n void element.offsetHeight;\n element.style.transition = `transform ${GLIDE_MS}ms ${GLIDE_EASE}`;\n element.style.transform = 'translateY(0)';\n // A settled transform would leave the content a containing block for anything\n // fixed inside it, so the styles come off once the travel is spent. Descendants'\n // transitions bubble here too, so only the content's own settle counts.\n travels.get(element)?.abort();\n const travel = new AbortController();\n travels.set(element, travel);\n const settle = (event: TransitionEvent) => {\n if (event.target !== element) return;\n if (currentOffset(element) === 0) release(element);\n };\n element.addEventListener('transitionend', settle, { signal: travel.signal });\n element.addEventListener('transitioncancel', settle, { signal: travel.signal });\n}\n","import { VISIBILITY_EPSILON } from './message-scroller-geometry';\n\n/** One designed curve for the one scripted trip: fast liftoff, long settle. */\nconst TRIP_MS = 560;\n/** How long past its clock a trip may chase a destination the layout hasn't released yet. */\nconst TRIP_OVERTIME_MS = 240;\n\nconst easeOutQuint = (t: number) => 1 - (1 - t) ** 5;\n\nexport type TripEndReason = 'arrived' | 'interrupted' | 'expired';\n\nexport interface TripAnimation {\n cancel: () => void;\n}\n\n/**\n * Drives the viewport to a destination the way a transition would, not the way\n * `scrollTo({ behavior: 'smooth' })` does: the destination is re-read every frame,\n * so a layout still settling under the trip — the reserved room opening beneath a\n * new turn — bends the path instead of restarting the curve. Writes are clamped by\n * the browser, so until the room has opened far enough the trip simply rides the\n * end of the box down.\n *\n * The reader keeps the last word: a scroll position this trip didn't write ends it.\n */\nexport function startTrip(\n viewportElement: HTMLElement,\n getTarget: () => number | undefined,\n onEnd: (reason: TripEndReason) => void,\n): TripAnimation {\n const reduceMotion =\n typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration = reduceMotion ? 0 : TRIP_MS;\n const startedAt = performance.now();\n const from = viewportElement.scrollTop;\n let lastWritten = from;\n let frame = 0;\n let ended = false;\n\n const end = (reason: TripEndReason) => {\n ended = true;\n onEnd(reason);\n };\n\n const step = () => {\n if (Math.abs(viewportElement.scrollTop - lastWritten) > 1) return end('interrupted');\n const target = getTarget();\n if (target === undefined) return end('expired');\n const elapsed = performance.now() - startedAt;\n const progress = duration === 0 ? 1 : Math.min(1, elapsed / duration);\n viewportElement.scrollTop = from + (target - from) * easeOutQuint(progress);\n lastWritten = viewportElement.scrollTop;\n if (progress === 1 && Math.abs(lastWritten - target) <= VISIBILITY_EPSILON) return end('arrived');\n if (elapsed >= duration + TRIP_OVERTIME_MS) return end('expired');\n frame = window.requestAnimationFrame(step);\n };\n\n frame = window.requestAnimationFrame(step);\n\n return {\n cancel: () => {\n if (ended) return;\n ended = true;\n window.cancelAnimationFrame(frame);\n },\n };\n}\n","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 {\n VISIBILITY_EPSILON,\n getCurrentAnchorId,\n getFollowTarget,\n getMaxScroll,\n getScrollTarget,\n} from './message-scroller-geometry';\nimport type { MessageScrollerItemRecord } from './message-scroller-geometry';\nimport { glideContent } from './message-scroller-glide';\nimport { startTrip } from './message-scroller-trip';\nimport type { TripAnimation } from './message-scroller-trip';\n\nimport { overlaySurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { mergeRefs } from '@/lib/merge-refs';\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\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 orderItemsByDocumentPosition = (items: Array<readonly [string, MessageScrollerItemRecord]>) =>\n items.sort(([, left], [, right]) => {\n const position = left.element.compareDocumentPosition(right.element);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;\n return 0;\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\nexport interface MessageScrollerProviderProps {\n /** Carry the reader with the stream, re-attaching on a new turn. Off still parks a new turn, without following the reply. */\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 // Rebuilt on register/unregister only — scroll runs this too often to sort per event.\n const orderedItemsRef = React.useRef<Array<readonly [string, MessageScrollerItemRecord]> | null>(null);\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 deferDefaultScrollRef = React.useRef(false);\n const defaultScrollScheduledRef = React.useRef(false);\n const seenAnchorIdsRef = React.useRef<Set<string> | null>(null);\n seenAnchorIdsRef.current ??= new Set<string>();\n const seenAnchorIds = seenAnchorIdsRef.current;\n // Message ID reconciliation keeps the row element while replacing its ID.\n const seenAnchorElementsRef = React.useRef<WeakSet<HTMLElement> | null>(null);\n seenAnchorElementsRef.current ??= new WeakSet<HTMLElement>();\n const seenAnchorElements = seenAnchorElementsRef.current;\n const turnAnchoringArmedRef = 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 // Attachment is a mode, not a measurement: a growing reply moves the end away\n // without the reader having moved, so only the reader detaches it.\n const followingRef = React.useRef(true);\n // A smooth trip in flight, remembered by destination — the end of the stream, or\n // the anchor a new turn parks at. Sampled mid-flight it reads as a reader who\n // left, so it suspends detachment; a position going backwards calls it off.\n const tripRef = React.useRef<'end' | { anchorId: string } | null>(null);\n // The frame loop behind an anchor trip. Owns clearing its trip: it alone can\n // tell the reader taking over from its own writes landing.\n const tripAnimationRef = React.useRef<TripAnimation | null>(null);\n const lastScrollTopRef = React.useRef(0);\n // Only a reader moving backwards asks for older history: a mount sitting at\n // scrollTop 0 before the default scroll lands has not moved.\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 // Registration is mount order, not document order, once history is prepended.\n const getOrderedItems = React.useCallback(() => {\n orderedItemsRef.current ??= orderItemsByDocumentPosition(Array.from(itemsRegistry.entries()));\n return orderedItemsRef.current;\n }, [itemsRegistry]);\n\n // The one definition of \"the end\" — following it, resting at it, offering the trip\n // back to it. Everything below the last row (reserved room, the docked composer)\n // is room to grow into, never somewhere to scroll.\n const followTarget = React.useCallback(() => {\n if (!viewportElement) return 0;\n\n return getFollowTarget({ contentElement, items: getOrderedItems(), viewportElement });\n }, [contentElement, getOrderedItems, viewportElement]);\n\n const anchorTripTarget = React.useCallback(\n (anchorId: string) => {\n const item = itemsRegistry.get(anchorId);\n if (!item || !viewportElement) return undefined;\n return Math.max(\n 0,\n getScrollTarget({ align: 'start', contentElement, element: item.element, scrollMargin, viewportElement }),\n );\n },\n [contentElement, itemsRegistry, scrollMargin, viewportElement],\n );\n\n // The motion's destination, never the decision's: the room under a fresh turn is\n // still opening when the trip starts — on a short thread the box has not even\n // grown yet — so the cap is re-read per frame and the trip rides the end of the\n // box until the opened room decides where the message rests.\n const parkTripTarget = React.useCallback(\n (anchorId: string) => {\n const target = anchorTripTarget(anchorId);\n if (target === undefined || !viewportElement) return target;\n return Math.min(target, getMaxScroll(viewportElement));\n },\n [anchorTripTarget, viewportElement],\n );\n\n const cancelTripAnimation = React.useCallback(() => {\n tripAnimationRef.current?.cancel();\n tripAnimationRef.current = null;\n }, []);\n\n const updateScrollable = React.useCallback(\n ({ fromScroll = false }: { fromScroll?: boolean } = {}) => {\n if (!viewportElement) {\n atEndRef.current = true;\n publishScrollable(DEFAULT_SCROLLABLE);\n return false;\n }\n\n const { scrollTop } = viewportElement;\n const remainingScroll = followTarget() - scrollTop;\n const wentBack = scrollTop < lastScrollTopRef.current;\n atEndRef.current = remainingScroll < AUTO_SCROLL_ATTACH_THRESHOLD;\n if (tripRef.current === 'end' && (wentBack || atEndRef.current)) tripRef.current = null;\n lastScrollTopRef.current = scrollTop;\n // Scrolling back is the only way out of the stream, the end the only way back in:\n // a position merely left behind by a growing reply is us chasing it, not them leaving.\n if (fromScroll && tripRef.current === null && (wentBack || atEndRef.current)) {\n followingRef.current = atEndRef.current;\n }\n\n publishScrollable({\n start: scrollTop > scrollEdgeThreshold,\n end: remainingScroll > scrollEdgeThreshold && !(autoScroll && followingRef.current),\n });\n\n return wentBack;\n },\n [autoScroll, followTarget, publishScrollable, scrollEdgeThreshold, viewportElement],\n );\n\n const getLastAnchorId = React.useCallback(\n () =>\n getOrderedItems()\n .filter(([, item]) => item.scrollAnchor)\n .at(-1)?.[0],\n [getOrderedItems],\n );\n\n const updateVisibility = React.useCallback(() => {\n const items = getOrderedItems();\n const fallbackAnchorId = getLastAnchorId() ?? 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 }, [\n getLastAnchorId,\n getOrderedItems,\n intersectingMessageIds,\n publishVisibility,\n scrollMargin,\n scrollPreviousItemPeek,\n viewportElement,\n ]);\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 const readerWentBack = updateScrollable({ fromScroll: true });\n updateVisibility();\n if (!viewportElement) return;\n\n if (readerWentBack && 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, updateScrollable, updateVisibility, 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, contentElement, 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 cancelTripAnimation();\n tripRef.current = null;\n scrollViewportTo(viewportElement, 0, behavior);\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [cancelTripAnimation, syncAfterScroll, viewportElement],\n );\n\n const scrollToEnd = React.useCallback(\n ({ behavior = 'auto' }: MessageScrollerScrollOptions = {}) => {\n if (!viewportElement) return false;\n cancelTripAnimation();\n followingRef.current = true;\n tripRef.current = behavior === 'smooth' ? 'end' : null;\n scrollViewportTo(viewportElement, followTarget(), behavior);\n // Published now, not next frame: a button that hears about the trip late flashes.\n syncAfterScroll();\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [cancelTripAnimation, followTarget, 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 // A reply grows into the room its turn reserved and moves nothing: only once the\n // last row would fall past the end of the view is there anything to follow, and\n // then by exactly what it overflowed — pinned instantly, glided on the compositor.\n const notifyContentResize = React.useCallback(() => {\n const trip = tripRef.current;\n const onAnchorTrip = trip !== null && trip !== 'end';\n // An anchor trip re-reads its destination every frame, so a layout settling\n // under it — the reserved room opening — bends its path without help from here.\n if (!onAnchorTrip && autoScroll && defaultScrollAppliedRef.current && followingRef.current && viewportElement) {\n const overflow = followTarget() - viewportElement.scrollTop;\n if (overflow > VISIBILITY_EPSILON) {\n // A trip already in flight is retargeted rather than cut short; only the\n // instant catch-up needs the glide to read as one movement.\n const travelling = trip === 'end';\n scrollViewportTo(viewportElement, followTarget(), travelling ? 'smooth' : 'auto');\n if (!travelling) glideContent(contentElement, overflow);\n }\n }\n syncAfterScroll();\n }, [autoScroll, contentElement, followTarget, syncAfterScroll, viewportElement]);\n\n const registerItem = React.useCallback(\n (messageId: string, element: HTMLElement, scrollAnchor: boolean) => {\n itemsRegistry.set(messageId, { element, scrollAnchor });\n orderedItemsRef.current = null;\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 orderedItemsRef.current = null;\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) return undefined;\n if (itemsRegistry.size === 0) {\n deferDefaultScrollRef.current = true;\n return undefined;\n }\n\n const applyDefaultScroll = () => {\n const lastAnchorId = getLastAnchorId();\n // Where a thread opens decides whether it starts attached: a restored reading\n // position has the stream below it. `scrollToEnd` takes this back when it lands.\n followingRef.current = false;\n let didScroll = false;\n if (defaultScrollPosition === 'start') {\n didScroll = scrollToStart({ behavior: 'auto' });\n } else if (defaultScrollPosition === 'last-anchor') {\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) return;\n defaultScrollAppliedRef.current = true;\n // A fresh thread opens on its first message with nothing to scroll yet: it is\n // at its end, so the reply streaming in under it is followed.\n if (autoScroll && getMaxScroll(viewportElement) <= VISIBILITY_EPSILON) followingRef.current = true;\n // Settling is what arms turn anchoring: the rows the transcript opened with\n // are recorded as read here, and on a settled thread the next anchor to\n // register is the send itself — an arming left to a later anchoring pass\n // would be eaten by that send instead of parking it.\n for (const [messageId, item] of getOrderedItems()) {\n if (!item.scrollAnchor) continue;\n seenAnchorIds.add(messageId);\n seenAnchorElements.add(item.element);\n }\n turnAnchoringArmedRef.current = true;\n };\n\n if (!deferDefaultScrollRef.current) {\n applyDefaultScroll();\n return undefined;\n }\n if (defaultScrollScheduledRef.current) return undefined;\n\n defaultScrollScheduledRef.current = true;\n let cancelled = false;\n scheduleScrollSync(() => {\n scheduleScrollSync(() => {\n defaultScrollScheduledRef.current = false;\n if (!cancelled && !defaultScrollAppliedRef.current) applyDefaultScroll();\n });\n });\n return () => {\n cancelled = true;\n defaultScrollScheduledRef.current = false;\n };\n }, [\n autoScroll,\n defaultScrollPosition,\n getLastAnchorId,\n getOrderedItems,\n itemsRegistry,\n itemsVersion,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n seenAnchorElements,\n seenAnchorIds,\n viewportElement,\n ]);\n\n // A turn opening is the one scripted scroll of a conversation: it carries the\n // reader to the message they just sent and parks it as high as the room the turn\n // reserves under it allows. The answer then grows into that room and moves\n // nothing at all — following only takes over once it outgrows the room.\n React.useLayoutEffect(() => {\n const lastAnchorId = getLastAnchorId();\n const lastAnchor = lastAnchorId ? itemsRegistry.get(lastAnchorId) : undefined;\n const opensTurn =\n turnAnchoringArmedRef.current &&\n lastAnchorId !== undefined &&\n lastAnchor !== undefined &&\n !seenAnchorIds.has(lastAnchorId) &&\n !seenAnchorElements.has(lastAnchor.element);\n\n for (const [messageId, item] of getOrderedItems()) {\n if (!item.scrollAnchor) continue;\n seenAnchorIds.add(messageId);\n seenAnchorElements.add(item.element);\n }\n turnAnchoringArmedRef.current = defaultScrollAppliedRef.current;\n\n if (opensTurn && lastAnchorId) {\n if (autoScroll) followingRef.current = true;\n cancelTripAnimation();\n const target = viewportElement ? anchorTripTarget(lastAnchorId) : undefined;\n // A turn opening at the top of the transcript — the first message of a fresh\n // thread — is already parked: no trip, and nothing moves.\n if (\n target === undefined ||\n !viewportElement ||\n Math.abs(target - viewportElement.scrollTop) <= VISIBILITY_EPSILON\n ) {\n tripRef.current = null;\n } else {\n tripRef.current = { anchorId: lastAnchorId };\n tripAnimationRef.current = startTrip(\n viewportElement,\n () => parkTripTarget(lastAnchorId),\n reason => {\n tripAnimationRef.current = null;\n tripRef.current = null;\n if (reason === 'interrupted') followingRef.current = atEndRef.current;\n syncAfterScroll();\n },\n );\n }\n // Published now: the reader just re-attached, and a button that hears late flashes.\n syncAfterScroll();\n return;\n }\n\n // Rows landing outside a turn — restored history, a notice — still belong to a\n // reader riding the stream, and reach them without a second animation. A trip\n // to an anchor keeps the viewport; a parked reader has new rows growing into\n // the room above the fold, with nothing below to catch up to.\n if (!autoScroll || !defaultScrollAppliedRef.current || !followingRef.current) return;\n if (tripRef.current !== null && tripRef.current !== 'end') return;\n if (viewportElement && followTarget() - viewportElement.scrollTop <= VISIBILITY_EPSILON) return;\n scrollToEnd({ behavior: tripRef.current === 'end' ? 'smooth' : 'auto' });\n }, [\n anchorTripTarget,\n autoScroll,\n cancelTripAnimation,\n followTarget,\n getLastAnchorId,\n getOrderedItems,\n itemsRegistry,\n itemsVersion,\n parkTripTarget,\n scrollToEnd,\n seenAnchorElements,\n seenAnchorIds,\n syncAfterScroll,\n viewportElement,\n ]);\n\n // A viewport going away mid-trip strands the frame loop on a detached element.\n React.useEffect(\n () => () => {\n cancelTripAnimation();\n tripRef.current = null;\n },\n [cancelTripAnimation, 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 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', 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 container so consumers can size the room under a live turn in cqh.\n '[container-type:size] size-full min-h-0 min-w-0 overflow-y-auto overscroll-contain',\n '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 // content-visibility contains painting. Reserve room for a 2px outline + 2px offset,\n // and compensate with negative margins so message alignment and spacing stay unchanged.\n className={cn(\n '-m-1 min-w-0 shrink-0 p-1 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]',\n className,\n )}\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 overlaySurfaceStyle,\n 'absolute inset-s-1/2 inline-flex min-h-5 min-w-7 -translate-x-1/2 items-center justify-center rounded-full text-foreground transition-[scale,opacity] duration-200 hover:[--surface-tint:var(--fill-subtle)] 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]: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=start]:top-4 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":"message-scroller-C6gXU5d5.js","sources":["../src/ds/components/MessageScroller/message-scroller-geometry.ts","../src/ds/components/MessageScroller/message-scroller-glide.ts","../src/ds/components/MessageScroller/message-scroller-trip.ts","../src/ds/components/MessageScroller/message-scroller.tsx"],"sourcesContent":["import type { MessageScrollerScrollAlign } from './message-scroller-context';\n\n/**\n * Geometry behind the scroller: how far to scroll for a given alignment, and\n * which anchored message the reader is currently on. Split out from the\n * component so each rule can be reasoned about — and tested — on its own.\n */\n\n/** A message the scroller tracks, and whether a turn is anchored to it. */\nexport type MessageScrollerItemRecord = {\n element: HTMLElement;\n scrollAnchor: boolean;\n};\n\n/** Sub-pixel slack, so a message resting exactly on the anchor line still counts. */\nexport const VISIBILITY_EPSILON = 0.5;\n\nexport const 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,\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom) || 0,\n };\n};\n\nexport const getMaxScroll = (viewportElement: HTMLElement) =>\n Math.max(0, viewportElement.scrollHeight - viewportElement.clientHeight);\n\nexport const 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\nexport const getScrollTarget = ({\n align,\n contentElement,\n element,\n scrollMargin,\n viewportElement,\n}: {\n align: MessageScrollerScrollAlign;\n /** The padding framing the transcript lives here, however deep the rows nest. */\n contentElement: HTMLElement | null;\n element: HTMLElement;\n scrollMargin: number;\n viewportElement: HTMLElement;\n}) => {\n const contentPadding = getContentPadding(contentElement);\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\n/**\n * Where the reader must sit for the last row to rest at the end of the view.\n *\n * Not the end of the scroll: a chat reserves room under a live turn so a reply\n * grows into empty space, and docks its composer in the flow. Both sit below the\n * last row, so scrolling to the end of the box carries that row — and the message\n * that opened the turn — out of the view above. Reading it from the rows means no\n * one has to publish a height for anyone else to subtract.\n */\nexport const getFollowTarget = ({\n contentElement,\n items,\n viewportElement,\n}: {\n contentElement: HTMLElement | null;\n items: Array<readonly [string, MessageScrollerItemRecord]>;\n viewportElement: HTMLElement;\n}) => {\n const end = getMaxScroll(viewportElement);\n const lastRow = items.at(-1)?.[1].element;\n if (!lastRow || !contentElement) return end;\n\n const contentBottom = getRelativeTop(contentElement, viewportElement) + contentElement.getBoundingClientRect().height;\n const belowContent = Math.max(0, viewportElement.scrollHeight - contentBottom);\n const rowBottom = getRelativeTop(lastRow, viewportElement) + lastRow.getBoundingClientRect().height;\n\n return Math.min(end, Math.max(0, rowBottom + belowContent - viewportElement.clientHeight));\n};\n\nexport const 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","/** Longest single growth worth smoothing. Past it the move is one the reader asked for. */\nconst GLIDE_MAX = 240;\nconst GLIDE_MS = 220;\nconst GLIDE_EASE = 'cubic-bezier(0.33, 1, 0.68, 1)';\n\nfunction currentOffset(element: HTMLElement): number {\n if (typeof DOMMatrixReadOnly === 'undefined') return 0;\n const { transform } = getComputedStyle(element);\n if (!transform || transform === 'none') return 0;\n return new DOMMatrixReadOnly(transform).m42;\n}\n\nconst travels = new WeakMap<HTMLElement, AbortController>();\n\nfunction release(element: HTMLElement): void {\n travels.get(element)?.abort();\n travels.delete(element);\n element.style.transition = '';\n element.style.transform = '';\n}\n\nfunction calm(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Hides a scroll that has already happened. The end is pinned instantly, as it must\n * be, then the content is put back where the reader last saw it and travels to zero\n * on the compositor — so a reply growing a line at a time reads as one movement\n * rather than a snap per wrapped line.\n *\n * Transform, not layout: `scrollHeight` never changes, so nothing here can feed the\n * resize that called it. A line landing mid-travel only adds to the distance left.\n */\nexport function glideContent(element: HTMLElement | null, delta: number): void {\n if (!element || delta <= 0 || calm()) return;\n\n const offset = currentOffset(element) + delta;\n if (offset > GLIDE_MAX) {\n release(element);\n return;\n }\n\n element.style.transition = 'none';\n element.style.transform = `translateY(${offset}px)`;\n // Commit the displaced position, or the browser only ever sees the settled one.\n void element.offsetHeight;\n element.style.transition = `transform ${GLIDE_MS}ms ${GLIDE_EASE}`;\n element.style.transform = 'translateY(0)';\n // A settled transform would leave the content a containing block for anything\n // fixed inside it, so the styles come off once the travel is spent. Descendants'\n // transitions bubble here too, so only the content's own settle counts.\n travels.get(element)?.abort();\n const travel = new AbortController();\n travels.set(element, travel);\n const settle = (event: TransitionEvent) => {\n if (event.target !== element) return;\n if (currentOffset(element) === 0) release(element);\n };\n element.addEventListener('transitionend', settle, { signal: travel.signal });\n element.addEventListener('transitioncancel', settle, { signal: travel.signal });\n}\n","import { VISIBILITY_EPSILON } from './message-scroller-geometry';\n\n/** One designed curve for the one scripted trip: fast liftoff, long settle. */\nconst TRIP_MS = 560;\n/** How long past its clock a trip may chase a destination the layout hasn't released yet. */\nconst TRIP_OVERTIME_MS = 240;\n\nconst easeOutQuint = (t: number) => 1 - (1 - t) ** 5;\n\nexport type TripEndReason = 'arrived' | 'interrupted' | 'expired';\n\nexport interface TripAnimation {\n cancel: () => void;\n}\n\n/**\n * Drives the viewport to a destination the way a transition would, not the way\n * `scrollTo({ behavior: 'smooth' })` does: the destination is re-read every frame,\n * so a layout still settling under the trip — the reserved room opening beneath a\n * new turn — bends the path instead of restarting the curve. Writes are clamped by\n * the browser, so until the room has opened far enough the trip simply rides the\n * end of the box down.\n *\n * The reader keeps the last word: a scroll position this trip didn't write ends it.\n */\nexport function startTrip(\n viewportElement: HTMLElement,\n getTarget: () => number | undefined,\n onEnd: (reason: TripEndReason) => void,\n): TripAnimation {\n const reduceMotion =\n typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration = reduceMotion ? 0 : TRIP_MS;\n const startedAt = performance.now();\n const from = viewportElement.scrollTop;\n let lastWritten = from;\n let frame = 0;\n let ended = false;\n\n const end = (reason: TripEndReason) => {\n ended = true;\n onEnd(reason);\n };\n\n const step = () => {\n if (Math.abs(viewportElement.scrollTop - lastWritten) > 1) return end('interrupted');\n const target = getTarget();\n if (target === undefined) return end('expired');\n const elapsed = performance.now() - startedAt;\n const progress = duration === 0 ? 1 : Math.min(1, elapsed / duration);\n viewportElement.scrollTop = from + (target - from) * easeOutQuint(progress);\n lastWritten = viewportElement.scrollTop;\n if (progress === 1 && Math.abs(lastWritten - target) <= VISIBILITY_EPSILON) return end('arrived');\n if (elapsed >= duration + TRIP_OVERTIME_MS) return end('expired');\n frame = window.requestAnimationFrame(step);\n };\n\n frame = window.requestAnimationFrame(step);\n\n return {\n cancel: () => {\n if (ended) return;\n ended = true;\n window.cancelAnimationFrame(frame);\n },\n };\n}\n","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 {\n VISIBILITY_EPSILON,\n getCurrentAnchorId,\n getFollowTarget,\n getMaxScroll,\n getScrollTarget,\n} from './message-scroller-geometry';\nimport type { MessageScrollerItemRecord } from './message-scroller-geometry';\nimport { glideContent } from './message-scroller-glide';\nimport { startTrip } from './message-scroller-trip';\nimport type { TripAnimation } from './message-scroller-trip';\n\nimport { overlaySurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { mergeRefs } from '@/lib/merge-refs';\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\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 orderItemsByDocumentPosition = (items: Array<readonly [string, MessageScrollerItemRecord]>) =>\n items.sort(([, left], [, right]) => {\n const position = left.element.compareDocumentPosition(right.element);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;\n return 0;\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\nexport interface MessageScrollerProviderProps {\n /** Carry the reader with the stream, re-attaching on a new turn. Off still parks a new turn, without following the reply. */\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 // Rebuilt on register/unregister only — scroll runs this too often to sort per event.\n const orderedItemsRef = React.useRef<Array<readonly [string, MessageScrollerItemRecord]> | null>(null);\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 deferDefaultScrollRef = React.useRef(false);\n const defaultScrollScheduledRef = React.useRef(false);\n const seenAnchorIdsRef = React.useRef<Set<string> | null>(null);\n seenAnchorIdsRef.current ??= new Set<string>();\n const seenAnchorIds = seenAnchorIdsRef.current;\n // Message ID reconciliation keeps the row element while replacing its ID.\n const seenAnchorElementsRef = React.useRef<WeakSet<HTMLElement> | null>(null);\n seenAnchorElementsRef.current ??= new WeakSet<HTMLElement>();\n const seenAnchorElements = seenAnchorElementsRef.current;\n const turnAnchoringArmedRef = 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 // Attachment is a mode, not a measurement: a growing reply moves the end away\n // without the reader having moved, so only the reader detaches it.\n const followingRef = React.useRef(true);\n // A smooth trip in flight, remembered by destination — the end of the stream, or\n // the anchor a new turn parks at. Sampled mid-flight it reads as a reader who\n // left, so it suspends detachment; a position going backwards calls it off.\n const tripRef = React.useRef<'end' | { anchorId: string } | null>(null);\n // The frame loop behind an anchor trip. Owns clearing its trip: it alone can\n // tell the reader taking over from its own writes landing.\n const tripAnimationRef = React.useRef<TripAnimation | null>(null);\n const lastScrollTopRef = React.useRef(0);\n // Only a reader moving backwards asks for older history: a mount sitting at\n // scrollTop 0 before the default scroll lands has not moved.\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 // Registration is mount order, not document order, once history is prepended.\n const getOrderedItems = React.useCallback(() => {\n orderedItemsRef.current ??= orderItemsByDocumentPosition(Array.from(itemsRegistry.entries()));\n return orderedItemsRef.current;\n }, [itemsRegistry]);\n\n // The one definition of \"the end\" — following it, resting at it, offering the trip\n // back to it. Everything below the last row (reserved room, the docked composer)\n // is room to grow into, never somewhere to scroll.\n const followTarget = React.useCallback(() => {\n if (!viewportElement) return 0;\n\n return getFollowTarget({ contentElement, items: getOrderedItems(), viewportElement });\n }, [contentElement, getOrderedItems, viewportElement]);\n\n const anchorTripTarget = React.useCallback(\n (anchorId: string) => {\n const item = itemsRegistry.get(anchorId);\n if (!item || !viewportElement) return undefined;\n return Math.max(\n 0,\n getScrollTarget({ align: 'start', contentElement, element: item.element, scrollMargin, viewportElement }),\n );\n },\n [contentElement, itemsRegistry, scrollMargin, viewportElement],\n );\n\n // The motion's destination, never the decision's: the room under a fresh turn is\n // still opening when the trip starts — on a short thread the box has not even\n // grown yet — so the cap is re-read per frame and the trip rides the end of the\n // box until the opened room decides where the message rests.\n const parkTripTarget = React.useCallback(\n (anchorId: string) => {\n const target = anchorTripTarget(anchorId);\n if (target === undefined || !viewportElement) return target;\n return Math.min(target, getMaxScroll(viewportElement));\n },\n [anchorTripTarget, viewportElement],\n );\n\n const cancelTripAnimation = React.useCallback(() => {\n tripAnimationRef.current?.cancel();\n tripAnimationRef.current = null;\n }, []);\n\n const updateScrollable = React.useCallback(\n ({ fromScroll = false }: { fromScroll?: boolean } = {}) => {\n if (!viewportElement) {\n atEndRef.current = true;\n publishScrollable(DEFAULT_SCROLLABLE);\n return false;\n }\n\n const { scrollTop } = viewportElement;\n const remainingScroll = followTarget() - scrollTop;\n const wentBack = scrollTop < lastScrollTopRef.current;\n atEndRef.current = remainingScroll < AUTO_SCROLL_ATTACH_THRESHOLD;\n if (tripRef.current === 'end' && (wentBack || atEndRef.current)) tripRef.current = null;\n lastScrollTopRef.current = scrollTop;\n // Scrolling back is the only way out of the stream, the end the only way back in:\n // a position merely left behind by a growing reply is us chasing it, not them leaving.\n if (fromScroll && tripRef.current === null && (wentBack || atEndRef.current)) {\n followingRef.current = atEndRef.current;\n }\n\n publishScrollable({\n start: scrollTop > scrollEdgeThreshold,\n end: remainingScroll > scrollEdgeThreshold && !(autoScroll && followingRef.current),\n });\n\n return wentBack;\n },\n [autoScroll, followTarget, publishScrollable, scrollEdgeThreshold, viewportElement],\n );\n\n const getLastAnchorId = React.useCallback(\n () =>\n getOrderedItems()\n .filter(([, item]) => item.scrollAnchor)\n .at(-1)?.[0],\n [getOrderedItems],\n );\n\n const updateVisibility = React.useCallback(() => {\n const items = getOrderedItems();\n const fallbackAnchorId = getLastAnchorId() ?? 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 }, [\n getLastAnchorId,\n getOrderedItems,\n intersectingMessageIds,\n publishVisibility,\n scrollMargin,\n scrollPreviousItemPeek,\n viewportElement,\n ]);\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 const readerWentBack = updateScrollable({ fromScroll: true });\n updateVisibility();\n if (!viewportElement) return;\n\n if (readerWentBack && 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, updateScrollable, updateVisibility, 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, contentElement, 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 cancelTripAnimation();\n tripRef.current = null;\n scrollViewportTo(viewportElement, 0, behavior);\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [cancelTripAnimation, syncAfterScroll, viewportElement],\n );\n\n const scrollToEnd = React.useCallback(\n ({ behavior = 'auto' }: MessageScrollerScrollOptions = {}) => {\n if (!viewportElement) return false;\n cancelTripAnimation();\n followingRef.current = true;\n tripRef.current = behavior === 'smooth' ? 'end' : null;\n scrollViewportTo(viewportElement, followTarget(), behavior);\n // Published now, not next frame: a button that hears about the trip late flashes.\n syncAfterScroll();\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [cancelTripAnimation, followTarget, 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 // A reply grows into the room its turn reserved and moves nothing: only once the\n // last row would fall past the end of the view is there anything to follow, and\n // then by exactly what it overflowed — pinned instantly, glided on the compositor.\n const notifyContentResize = React.useCallback(() => {\n const trip = tripRef.current;\n const onAnchorTrip = trip !== null && trip !== 'end';\n // An anchor trip re-reads its destination every frame, so a layout settling\n // under it — the reserved room opening — bends its path without help from here.\n if (!onAnchorTrip && autoScroll && defaultScrollAppliedRef.current && followingRef.current && viewportElement) {\n const overflow = followTarget() - viewportElement.scrollTop;\n if (overflow > VISIBILITY_EPSILON) {\n // A trip already in flight is retargeted rather than cut short; only the\n // instant catch-up needs the glide to read as one movement.\n const travelling = trip === 'end';\n scrollViewportTo(viewportElement, followTarget(), travelling ? 'smooth' : 'auto');\n if (!travelling) glideContent(contentElement, overflow);\n }\n }\n syncAfterScroll();\n }, [autoScroll, contentElement, followTarget, syncAfterScroll, viewportElement]);\n\n const registerItem = React.useCallback(\n (messageId: string, element: HTMLElement, scrollAnchor: boolean) => {\n itemsRegistry.set(messageId, { element, scrollAnchor });\n orderedItemsRef.current = null;\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 orderedItemsRef.current = null;\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) return undefined;\n if (itemsRegistry.size === 0) {\n deferDefaultScrollRef.current = true;\n return undefined;\n }\n\n const applyDefaultScroll = () => {\n const lastAnchorId = getLastAnchorId();\n // Where a thread opens decides whether it starts attached: a restored reading\n // position has the stream below it. `scrollToEnd` takes this back when it lands.\n followingRef.current = false;\n let didScroll = false;\n if (defaultScrollPosition === 'start') {\n didScroll = scrollToStart({ behavior: 'auto' });\n } else if (defaultScrollPosition === 'last-anchor') {\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) return;\n defaultScrollAppliedRef.current = true;\n // A fresh thread opens on its first message with nothing to scroll yet: it is\n // at its end, so the reply streaming in under it is followed.\n if (autoScroll && getMaxScroll(viewportElement) <= VISIBILITY_EPSILON) followingRef.current = true;\n // Settling is what arms turn anchoring: the rows the transcript opened with\n // are recorded as read here, and on a settled thread the next anchor to\n // register is the send itself — an arming left to a later anchoring pass\n // would be eaten by that send instead of parking it.\n for (const [messageId, item] of getOrderedItems()) {\n if (!item.scrollAnchor) continue;\n seenAnchorIds.add(messageId);\n seenAnchorElements.add(item.element);\n }\n turnAnchoringArmedRef.current = true;\n };\n\n if (!deferDefaultScrollRef.current) {\n applyDefaultScroll();\n return undefined;\n }\n if (defaultScrollScheduledRef.current) return undefined;\n\n defaultScrollScheduledRef.current = true;\n let cancelled = false;\n scheduleScrollSync(() => {\n scheduleScrollSync(() => {\n defaultScrollScheduledRef.current = false;\n if (!cancelled && !defaultScrollAppliedRef.current) applyDefaultScroll();\n });\n });\n return () => {\n cancelled = true;\n defaultScrollScheduledRef.current = false;\n };\n }, [\n autoScroll,\n defaultScrollPosition,\n getLastAnchorId,\n getOrderedItems,\n itemsRegistry,\n itemsVersion,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n seenAnchorElements,\n seenAnchorIds,\n viewportElement,\n ]);\n\n // A turn opening is the one scripted scroll of a conversation: it carries the\n // reader to the message they just sent and parks it as high as the room the turn\n // reserves under it allows. The answer then grows into that room and moves\n // nothing at all — following only takes over once it outgrows the room.\n React.useLayoutEffect(() => {\n const lastAnchorId = getLastAnchorId();\n const lastAnchor = lastAnchorId ? itemsRegistry.get(lastAnchorId) : undefined;\n const opensTurn =\n turnAnchoringArmedRef.current &&\n lastAnchorId !== undefined &&\n lastAnchor !== undefined &&\n !seenAnchorIds.has(lastAnchorId) &&\n !seenAnchorElements.has(lastAnchor.element);\n\n for (const [messageId, item] of getOrderedItems()) {\n if (!item.scrollAnchor) continue;\n seenAnchorIds.add(messageId);\n seenAnchorElements.add(item.element);\n }\n turnAnchoringArmedRef.current = defaultScrollAppliedRef.current;\n\n if (opensTurn && lastAnchorId) {\n if (autoScroll) followingRef.current = true;\n cancelTripAnimation();\n const target = viewportElement ? anchorTripTarget(lastAnchorId) : undefined;\n // A turn opening at the top of the transcript — the first message of a fresh\n // thread — is already parked: no trip, and nothing moves.\n if (\n target === undefined ||\n !viewportElement ||\n Math.abs(target - viewportElement.scrollTop) <= VISIBILITY_EPSILON\n ) {\n tripRef.current = null;\n } else {\n tripRef.current = { anchorId: lastAnchorId };\n tripAnimationRef.current = startTrip(\n viewportElement,\n () => parkTripTarget(lastAnchorId),\n reason => {\n tripAnimationRef.current = null;\n tripRef.current = null;\n if (reason === 'interrupted') followingRef.current = atEndRef.current;\n syncAfterScroll();\n },\n );\n }\n // Published now: the reader just re-attached, and a button that hears late flashes.\n syncAfterScroll();\n return;\n }\n\n // Rows landing outside a turn — restored history, a notice — still belong to a\n // reader riding the stream, and reach them without a second animation. A trip\n // to an anchor keeps the viewport; a parked reader has new rows growing into\n // the room above the fold, with nothing below to catch up to.\n if (!autoScroll || !defaultScrollAppliedRef.current || !followingRef.current) return;\n if (tripRef.current !== null && tripRef.current !== 'end') return;\n if (viewportElement && followTarget() - viewportElement.scrollTop <= VISIBILITY_EPSILON) return;\n scrollToEnd({ behavior: tripRef.current === 'end' ? 'smooth' : 'auto' });\n }, [\n anchorTripTarget,\n autoScroll,\n cancelTripAnimation,\n followTarget,\n getLastAnchorId,\n getOrderedItems,\n itemsRegistry,\n itemsVersion,\n parkTripTarget,\n scrollToEnd,\n seenAnchorElements,\n seenAnchorIds,\n syncAfterScroll,\n viewportElement,\n ]);\n\n // A viewport going away mid-trip strands the frame loop on a detached element.\n React.useEffect(\n () => () => {\n cancelTripAnimation();\n tripRef.current = null;\n },\n [cancelTripAnimation, 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 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', 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 container so consumers can size the room under a live turn in cqh.\n '[container-type:size] size-full min-h-0 min-w-0 overflow-y-auto overscroll-y-contain',\n '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 // content-visibility contains painting. Reserve room for a 2px outline + 2px offset,\n // and compensate with negative margins so message alignment and spacing stay unchanged.\n className={cn(\n '-m-1 min-w-0 shrink-0 p-1 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]',\n className,\n )}\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 overlaySurfaceStyle,\n 'absolute inset-s-1/2 inline-flex min-h-5 min-w-7 -translate-x-1/2 items-center justify-center rounded-full text-foreground transition-[scale,opacity] duration-200 hover:[--surface-tint:var(--fill-subtle)] 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]: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=start]:top-4 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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"}
@@ -720,7 +720,7 @@ const MessageScrollerViewport = React__namespace.forwardRef(
720
720
  "data-slot": "message-scroller-viewport",
721
721
  className: utils_cn.cn(
722
722
  // Size container so consumers can size the room under a live turn in cqh.
723
- "[container-type:size] size-full min-h-0 min-w-0 overflow-y-auto overscroll-contain",
723
+ "[container-type:size] size-full min-h-0 min-w-0 overflow-y-auto overscroll-y-contain",
724
724
  "data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent",
725
725
  className
726
726
  ),
@@ -853,4 +853,4 @@ exports.MessageScrollerContent = MessageScrollerContent;
853
853
  exports.MessageScrollerItem = MessageScrollerItem;
854
854
  exports.MessageScrollerProvider = MessageScrollerProvider;
855
855
  exports.MessageScrollerViewport = MessageScrollerViewport;
856
- //# sourceMappingURL=message-scroller-C4fH6uJg.cjs.map
856
+ //# sourceMappingURL=message-scroller-fjucuCuw.cjs.map