Files
cline/patches/@shadcn%2Freact@0.3.1.patch
BeeandSaoud Rizwan d20b337eb5 feat(desktop): add transcript outline with shared shadcn message scroller (#14948)
* feat(desktop): add transcript outline with shared message scroller

* fix(desktop): avoid repeated outline work during streaming

* fix(ui): preserve transcript position when replacing rows

* fix(ui): respect reduced motion in MessageScrollerButton

The shared scroll-to-end button always passed shadcn's default smooth
behavior. Resolve it from prefers-reduced-motion like the outline does,
keeping an explicit behavior prop as an override.

* test(desktop): cover saved-session row swap and streaming growth

Add a regression test for continuing a saved session: history hydrates
after the provider mounts, a new prompt pins near the top, then the
activity row is swapped for the first answer row in one commit and the
viewport must stay on the new prompt. Make the streaming test grow the
transcript and deliver the resize notification instead of only changing
answer text.

* chore(ui): tidy message-scroller check in smoke-package

---------

Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>
2026-10-09 12:22:02 -07:00

20 lines
38 KiB
Diff

diff --git a/dist/message-scroller/index.js b/dist/message-scroller/index.js
index ba994f34a6286cc533f388f61de59b5948a290b9..f09aec51833ab752146bd094e5731a76ac870bf9 100644
--- a/dist/message-scroller/index.js
+++ b/dist/message-scroller/index.js
@@ -1,2 +1,11 @@
"use client";
-import {c,a,b}from'../chunk-HBS6WEDP.js';import*as f from'react';import {jsx,jsxs}from'react/jsx-runtime';var _e=8,Be=64,Fe=0,J=.5,je=180,Ge=new Set(["ArrowDown","ArrowUp","End","Home","PageDown","PageUp"," "]),ge={start:false,end:false},vt=[],Q={currentAnchorId:null,visibleMessageIds:vt};function Ne({content:e,scrollEdgeThreshold:t,spacer:r,viewport:n}){if(!n||!e)return ge;let l=Re({content:e,spacer:r,viewport:n});return {start:n.scrollTop>t,end:l-n.scrollTop-n.clientHeight>t}}function Ue({content:e,scrollMargin:t,scrollPreviousItemPeek:r,spacer:n,viewport:l,visibleMessageIds:c}){if(!e||!l)return Q;let S=l.getBoundingClientRect(),o=S.top+t+r,b=typeof IntersectionObserver>"u",v=[],m=null;for(let L of ee(e,n)){let R=L.dataset.messageId;if(!R)continue;let E=L.dataset.scrollAnchor==="true",h=E||b?L.getBoundingClientRect():null;(b&&h?h.bottom>o&&h.top<S.bottom:c.has(R))&&v.push(R),E&&h&&h.top<=o+J&&(m=R);}return v.length===0&&m===null?Q:{currentAnchorId:m,visibleMessageIds:v}}function ee(e,t){return Array.from(e.children).filter(r=>r instanceof HTMLElement&&r!==t)}function Ye(e,t){for(let r=t;r<e.length;r++){let n=e[r];if(n?.dataset.scrollAnchor==="true")return n}return null}function ze(e,t){for(let r of e)if(r.dataset.scrollAnchor==="true"&&!t.has(r))return r;return null}function qe(e,t){let r=0;for(let n=t;n<e.length;n++)if(e[n]?.dataset.scrollAnchor==="true"&&(r+=1,r>1))return true;return false}function Ke(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(r?.dataset.scrollAnchor==="true")return r}return null}function We({content:e,spacer:t,viewport:r}){let n=r.getBoundingClientRect();for(let l of ee(e,t)){if(!l.dataset.messageId)continue;let c=l.getBoundingClientRect();if(c.bottom>n.top&&c.top<n.bottom)return l}return null}function $e({align:e,element:t,scrollMargin:r,spacer:n,viewport:l}){let c=me(t,l),S=t.getBoundingClientRect().height,o=ht(n);if(e==="center"){let b=Math.max(0,l.clientHeight-o.start-o.end);return c-o.start-(b-S)/2-r}if(e==="end")return c-l.clientHeight+S+o.end+r;if(e==="nearest"){let b=c+S,v=l.scrollTop+o.start,m=l.scrollTop+l.clientHeight-o.end;return c>=v&&b<=m?l.scrollTop:c<v?c-o.start-r:b-l.clientHeight+o.end+r}return c-o.start-r}function me(e,t){let r=e.getBoundingClientRect(),n=t.getBoundingClientRect();return r.top-n.top+t.scrollTop}function te(e,t){return e.getBoundingClientRect().top-t.getBoundingClientRect().top}function Je({content:e,scrollTop:t,spacer:r,viewport:n}){let l=Re({content:e,spacer:r,viewport:n});return t+n.clientHeight-l}function Re({content:e,spacer:t,viewport:r}){let n=ee(e,t),l=Xe(e),c=r.getBoundingClientRect(),S=r.scrollTop,o=l.start+l.end;for(let b of n){let v=b.getBoundingClientRect();o=Math.max(o,v.bottom-c.top+S+l.end);}return o}function Qe(e){return Math.max(0,e.scrollHeight-e.clientHeight)}function Xe(e){let t=window.getComputedStyle(e);return {end:pe(t.paddingBlockEnd||t.paddingBottom),start:pe(t.paddingBlockStart||t.paddingTop)}}function ht(e){let t=e?.parentElement;return t?Xe(t):{end:0,start:0}}function Ze(e){if(!e)return 0;let t=window.getComputedStyle(e),r=t.rowGap==="normal"?t.gap:t.rowGap;return pe(r)}function pe(e){if(!e)return 0;let t=Number.parseFloat(e);return Number.isFinite(t)?t:0}function et(e,t){let r=e,n=new Set;return {getSnapshot:()=>r,hasListeners:()=>n.size>0,setSnapshot:l=>{t(r,l)||(r=l,n.forEach(c=>c()));},subscribe:(l,c,S)=>{let o=n.size===0;return n.add(l),o&&c?.(),()=>{n.delete(l),n.size===0&&S?.();}}}}function de(e,t){return et(e,t)}function tt(){return et(Q,Lt)}function rt(e,t){return e.start===t.start&&e.end===t.end}function Lt(e,t){return e.currentAnchorId!==t.currentAnchorId||e.visibleMessageIds.length!==t.visibleMessageIds.length?false:e.visibleMessageIds.every((r,n)=>r===t.visibleMessageIds[n])}function nt({autoScroll:e,defaultScrollPosition:t,scrollEdgeThreshold:r,scrollMargin:n,scrollPreviousItemPeek:l}){let c=f.useRef(e),S=f.useRef(false),o=f.useRef(null),b=f.useRef(false),v=f.useRef(r),m=f.useRef(0),L=f.useRef(null),R=f.useRef(0),E=f.useRef(e?"following-bottom":"free-scrolling"),h=f.useRef(new Map),I=f.useRef(null),u=f.useRef(null),k=f.useRef(null),j=f.useRef(l),_=f.useRef(true),Y=f.useRef(null),x=f.useRef(n),V=f.useRef(null),P=f.useRef(0),G=f.useRef(0),A=f.useRef(null),le=f.useRef(null),z=f.useRef(null),B=f.useRef(null),i=f.useRef(null),d=f.useRef(null),T=f.useRef(null),w=f.useRef(null),C=f.useRef(null),y=f.useRef(new Set),F=f.useRef(new WeakSet);return z.current===null&&(z.current=de(t==="end"||t==="last-anchor",(q,X)=>q===X)),B.current===null&&(B.current=de(ge,rt)),C.current===null&&(C.current=tt()),c.current=e,v.current=r,x.current=n,j.current=l,{autoScrollRef:c,autoscrollingRef:S,autoscrollingTimeoutRef:i,streamingTurnRef:k,contentRef:o,defaultScrollPositionAppliedRef:b,firstItemRef:L,itemCountRef:m,lastScrollTopRef:R,messageElementsRef:h,modeRef:E,pendingScrollFrameRef:V,pendingScrollToMessageRef:I,prependRestoreRef:u,preserveScrollOnPrependRef:_,pendingDefaultScrollStore:z.current,rootRef:Y,scrollEdgeThresholdRef:v,scrollMarginRef:x,scrollPreviousItemPeekRef:j,spacerGapRef:P,spacerHeightRef:G,spacerRef:A,stateFrameRef:le,stateStore:B.current,viewportRef:d,visibilityFrameRef:T,visibilityObserverRef:w,visibilityStore:C.current,visibleMessageIdsRef:y,handledScrollAnchorsRef:F}}function Me(e){e.pendingDefaultScrollStore.setSnapshot(false);}function re(e){e.defaultScrollPositionAppliedRef.current=true,Me(e);}function lt({refs:e,commitScrollState:t,scheduleStateCommit:r,scheduleVisibilitySync:n}){let{streamingTurnRef:l,autoScrollRef:c,autoscrollingRef:S,autoscrollingTimeoutRef:o,contentRef:b,itemCountRef:v,messageElementsRef:m,modeRef:L,pendingScrollToMessageRef:R,prependRestoreRef:E,scrollMarginRef:h,scrollPreviousItemPeekRef:I,spacerGapRef:u,spacerHeightRef:k,spacerRef:j,viewportRef:_}=e,Y=f.useCallback(i=>{o.current!==null&&(window.clearTimeout(o.current),o.current=null),S.current!==i&&(S.current=i,t()),i&&(o.current=window.setTimeout(()=>{o.current=null,S.current=false,t();},je));},[t]),x=f.useCallback(i=>{let d=j.current;if(!d)return;let T=Math.max(0,Math.ceil(i));k.current!==T&&(k.current=T,d.hidden=T===0,d.style.height=`${T}px`,d.style.marginTop=T>0?`${-u.current}px`:"");},[]),V=f.useCallback((i,{behavior:d="auto",autoscrolling:T=false}={})=>{let w=_.current;if(!w)return;let C=Math.max(0,i);if(Math.abs(w.scrollTop-C)<=J){w.scrollTop=C,t();return}T&&Y(true),w.scrollTo({top:C,behavior:d}),r();},[t,r,Y]),P=f.useCallback(({behavior:i="auto"}={})=>_.current?(x(0),l.current=null,L.current="free-scrolling",V(0,{behavior:i}),n(),true):false,[n,V,x]),G=f.useCallback(({behavior:i="auto"}={})=>{let d=_.current;return d?(x(0),l.current=null,L.current=c.current?"following-bottom":"free-scrolling",V(Qe(d),{autoscrolling:true,behavior:i}),n(),true):false},[n,V,x]),A=f.useCallback((i,{align:d="start",behavior:T="auto",scrollMargin:w=h.current}={},{keepPreviousPeek:C=false}={})=>{let y=b.current,F=_.current;if(!y||!F||!y.contains(i))return false;let q=$e({align:d,element:i,scrollMargin:C?w+I.current:w,spacer:j.current,viewport:F}),X=Je({content:y,scrollTop:q,spacer:j.current,viewport:F});return x(X),E.current={element:i,viewportTop:te(i,F)},L.current=C?"anchored-to-message":"settling-jump",l.current=C?i:null,V(q,{behavior:T}),n(),true},[n,V,x]),le=f.useCallback(()=>{let i=l.current;return !i||!i.isConnected||L.current!=="anchored-to-message"?false:A(i,{align:"start"},{keepPreviousPeek:true})},[A]),z=f.useCallback((i,d)=>{let T=m.current.get(i);return T?(re(e),A(T,d)?(R.current=null,true):(R.current={messageId:i,options:d},true)):v.current===0?(R.current={messageId:i,options:d},re(e),true):false},[A]);return {flushPendingScrollToMessage:f.useCallback(()=>{let i=R.current;if(!i)return false;let d=m.current.get(i.messageId);return !d||!A(d,i.options)?false:(R.current=null,re(e),true)},[A]),reanchorToAnchoredMessage:le,scrollToElement:A,scrollToEnd:G,scrollToMessage:z,scrollToStart:P}}function ot(e,t){return f.useCallback(r=>{e.current=r,r&&t();},[e,t])}function st({autoScroll:e=false,defaultScrollPosition:t="end",scrollEdgeThreshold:r=_e,scrollPreviousItemPeek:n=Be,scrollMargin:l=Fe}){let c=nt({autoScroll:e,defaultScrollPosition:t,scrollEdgeThreshold:r,scrollMargin:l,scrollPreviousItemPeek:n}),{streamingTurnRef:S,autoScrollRef:o,autoscrollingRef:b,autoscrollingTimeoutRef:v,contentRef:m,defaultScrollPositionAppliedRef:L,firstItemRef:R,itemCountRef:E,lastScrollTopRef:h,messageElementsRef:I,modeRef:u,pendingScrollFrameRef:k,pendingScrollToMessageRef:j,prependRestoreRef:_,preserveScrollOnPrependRef:Y,pendingDefaultScrollStore:x,rootRef:V,scrollEdgeThresholdRef:P,scrollMarginRef:G,scrollPreviousItemPeekRef:A,spacerGapRef:le,spacerHeightRef:z,spacerRef:B,stateFrameRef:i,stateStore:d,viewportRef:T,visibilityFrameRef:w,visibilityObserverRef:C,visibilityStore:y,visibleMessageIdsRef:F,handledScrollAnchorsRef:q}=c,X=f.useRef(t);X.current!==t&&(X.current=t,L.current=false);let ce=f.useCallback(s=>{let a=V.current,M=T.current,H=[s.start&&"start",s.end&&"end"].filter(Boolean).join(" "),fe=b.current;for(let W of [a,M])W&&(H?W.setAttribute("data-scrollable",H):W.removeAttribute("data-scrollable"),W.toggleAttribute("data-autoscrolling",fe));},[]),be=f.useCallback(s=>{let a=T.current?.scrollTop??0,M=a<h.current-J;h.current=a,o.current&&!s.end&&u.current!=="settling-jump"&&u.current!=="anchored-to-message"?u.current="following-bottom":u.current==="following-bottom"&&s.end&&M&&!b.current&&(u.current="free-scrolling");},[]),N=f.useCallback(()=>{let s=Ne({content:m.current,scrollEdgeThreshold:P.current,spacer:B.current,viewport:T.current});be(s);let a=u.current==="following-bottom"?{...s,end:false}:s;ce(a),d.setSnapshot(a);},[be,d,ce]),oe=f.useCallback(()=>{i.current===null&&(i.current=window.requestAnimationFrame(()=>{i.current=null,N();}));},[N]),O=f.useCallback(()=>{y.hasListeners()&&w.current===null&&(w.current=window.requestAnimationFrame(()=>{w.current=null,y.hasListeners()&&y.setSnapshot(Ue({content:m.current,scrollMargin:G.current,scrollPreviousItemPeek:A.current,spacer:B.current,viewport:T.current,visibleMessageIds:F.current}));}));},[y]),{flushPendingScrollToMessage:ae,reanchorToAnchoredMessage:Te,scrollToElement:se,scrollToEnd:D,scrollToMessage:Ee,scrollToStart:ie}=lt({refs:c,commitScrollState:N,scheduleStateCommit:oe,scheduleVisibilitySync:O}),ve=f.useCallback(()=>{let s=_.current,a=T.current;if(!s||!a||!s.element.isConnected)return false;let H=te(s.element,a)-s.viewportTop;return Math.abs(H)<=J?false:(a.scrollTop+=H,s.viewportTop=te(s.element,a),oe(),O(),true)},[oe,O]),Z=f.useCallback(()=>{let s=m.current,a=T.current;if(!s||!a){_.current=null;return}let M=We({content:s,spacer:B.current,viewport:a});_.current=M?{element:M,viewportTop:te(M,a)}:null;},[]),he=f.useCallback(()=>{k.current===null&&(k.current=window.requestAnimationFrame(()=>{k.current=null,ae()&&Z();}));},[Z,ae]),ue=f.useCallback(()=>{if(!t||L.current||E.current===0)return false;let s=false;if(t==="last-anchor"){let a=m.current,M=T.current,H=a&&M?Ke(ee(a,B.current)):null;if(!a||!M||!H)s=D({behavior:"auto"});else {let fe=me(H,M);s=Re({content:a,spacer:B.current,viewport:M})-fe<=M.clientHeight?D({behavior:"auto"}):se(H,{align:"start"},{keepPreviousPeek:true});}}else s=t==="end"?D({behavior:"auto"}):ie({behavior:"auto"});return s?(re(c),true):false},[t,se,D,ie]),Le=f.useCallback(()=>{let s=m.current;if(!s)return;let a=ee(s,B.current),M=E.current,H=R.current;E.current=a.length,R.current=a[0]??null,(()=>{if(ae())return;if(M===0){if(ue()||a.length>0&&o.current&&D({behavior:"auto"}))return;N(),O();return}let W=H?a.indexOf(H):-1;if(Y.current&&W>0){ve();return}if(a.length>M){let $=Ye(a,M);if($){if(o.current&&u.current==="following-bottom"&&qe(a,M)){D({behavior:"auto"});return}se($,{align:"start"},{keepPreviousPeek:true}),q.current.add($);return}}if(a.length===M){let $=ze(a,q.current);if($){se($,{align:"start"},{keepPreviousPeek:true}),q.current.add($);return}}u.current==="following-bottom"&&o.current?D({behavior:"auto"}):(N(),O());})(),Z();},[ue,Z,N,ae,ve,O,se,D]),Ce=f.useCallback(()=>{if(u.current==="following-bottom"&&o.current){D({behavior:"auto"});return}let s=z.current;if(Te()){o.current&&s>0&&z.current===0&&D({behavior:"auto"});return}oe(),O();},[Te,oe,O,D]),Pe=f.useCallback(()=>{let s=T.current;if(!(!s||!y.hasListeners())){if(typeof IntersectionObserver>"u"){O();return}C.current||(C.current=new IntersectionObserver(a=>{for(let M of a){let H=M.target.dataset.messageId;H&&(M.isIntersecting?F.current.add(H):F.current.delete(H));}O();},{root:s,rootMargin:`${-(G.current+A.current)}px 0px 0px 0px`,threshold:[0,.01,.5,1]})),I.current.forEach(a=>{C.current?.observe(a);}),O();}},[O,y]),we=f.useCallback(()=>{w.current!==null&&(window.cancelAnimationFrame(w.current),w.current=null),C.current?.disconnect(),C.current=null,F.current.clear(),y.setSnapshot(Q);},[y]),bt=f.useCallback((s,a,M)=>{if(a){I.current.set(s,a),C.current?.observe(a),O(),j.current?.messageId===s&&he();return}M&&I.current.get(s)===M&&(I.current.delete(s),F.current.delete(s),C.current?.unobserve(M),O());},[he,O]),Oe=f.useCallback(()=>{(u.current==="following-bottom"||u.current==="anchored-to-message"||u.current==="settling-jump")&&(S.current=null,u.current="free-scrolling");},[]),ye=f.useCallback(()=>ce(d.getSnapshot()),[d,ce]),He=ot(V,ye),Ie=ot(T,ye),Ae=f.useCallback(s=>{m.current=s;},[]),De=f.useCallback(s=>{B.current=s,le.current=Ze(s?.parentElement??null);},[]),xe=f.useCallback(()=>{N(),O(),Z();},[Z,N,O]),Tt=f.useMemo(()=>({handleContentChange:Le,handleResize:Ce,observeVisibility:Pe,pendingDefaultScrollStore:x,preserveScrollOnPrependRef:Y,scrollToEnd:D,scrollToMessage:Ee,scrollToStart:ie,setContentElement:Ae,setRootElement:He,setSpacerElement:De,setViewportElement:Ie,stateStore:d,syncAfterScroll:xe,unobserveVisibility:we,userScrollIntent:Oe,viewportRef:T,visibilityStore:y}),[Le,Ce,Pe,x,D,Ee,ie,Ae,He,De,Ie,d,xe,we,Oe,y]);return f.useLayoutEffect(()=>{ue()||E.current===0&&Me(c);},[ue]),f.useEffect(()=>()=>{i.current!==null&&(window.cancelAnimationFrame(i.current),i.current=null),w.current!==null&&(window.cancelAnimationFrame(w.current),w.current=null),v.current!==null&&(window.clearTimeout(v.current),v.current=null),k.current!==null&&(window.cancelAnimationFrame(k.current),k.current=null),C.current?.disconnect(),C.current=null;},[]),f.useLayoutEffect(()=>{if(e&&u.current==="following-bottom"&&E.current>0){D({behavior:"auto"});return}N();},[e,N,D]),{context:Tt,registerMessage:bt}}function at(e){let t=f.useRef(e);return t.current=e,t}var it=f.createContext(null),ut=f.createContext(null);function K(){let e=f.useContext(it);if(!e)throw new Error("useMessageScroller must be used within a MessageScroller.");return e}function Ct(){let e=f.useContext(ut);if(!e)throw new Error("MessageScrollerItem must be used within a MessageScroller.");return e}function Pt(){let{scrollToEnd:e,scrollToMessage:t,scrollToStart:r}=K();return f.useMemo(()=>({scrollToEnd:e,scrollToMessage:t,scrollToStart:r}),[e,t,r])}function wt(){let{stateStore:e}=K();return f.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getSnapshot)}function Ot(){let{observeVisibility:e,unobserveVisibility:t,visibilityStore:r}=K(),n=f.useCallback(l=>r.subscribe(l,e,t),[e,t,r]);return f.useSyncExternalStore(n,r.getSnapshot,r.getSnapshot)}function ft({autoScroll:e=false,children:t,defaultScrollPosition:r="end",scrollEdgeThreshold:n,scrollPreviousItemPeek:l,scrollMargin:c}){let{context:S,registerMessage:o}=st({autoScroll:e,defaultScrollPosition:r,scrollEdgeThreshold:n,scrollPreviousItemPeek:l,scrollMargin:c});return jsx(it.Provider,{value:S,children:jsx(ut.Provider,{value:o,children:t})})}function St(){let{pendingDefaultScrollStore:e}=K();return f.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getSnapshot)}function gt({children:e,...t}){let{setRootElement:r}=K(),n=St();return jsx("div",{ref:r,...t,...n?{"data-pending-scroll":""}:null,children:e})}function Rt({"aria-label":e,children:t,onKeyDown:r,onScroll:n,onTouchMove:l,onWheel:c$1,preserveScrollOnPrepend:S=true,ref:o,role:b,tabIndex:v,...m}){let{handleResize:L,preserveScrollOnPrependRef:R,setViewportElement:E,syncAfterScroll:h,userScrollIntent:I,viewportRef:u}=K(),k=St();R.current=S;let j=f.useCallback(P=>{E(P),c(o)?.(P);},[o,E]);function _(P){h(),n?.(P);}function Y(P){I(),c$1?.(P);}function x(P){I(),l?.(P);}function V(P){Ge.has(P.key)&&I(),r?.(P);}return f.useEffect(()=>{let P=u.current;if(!P||typeof ResizeObserver>"u")return;let G=0,A=new ResizeObserver(()=>{window.cancelAnimationFrame(G),G=window.requestAnimationFrame(L);});return A.observe(P),()=>{window.cancelAnimationFrame(G),A.disconnect();}},[L,u]),jsx("div",{ref:j,role:b??"region","aria-label":e??"Messages",tabIndex:v??0,onKeyDown:V,onScroll:_,onTouchMove:x,onWheel:Y,...m,...k?{"data-pending-scroll":""}:null,children:t})}function pt({"aria-relevant":e,children:t,ref:r,role:n,spacerClassName:l,...c$1}){let{handleContentChange:S,handleResize:o,setContentElement:b,setSpacerElement:v}=K(),m=f.useRef(null),L=f.useCallback(R=>{m.current=R,b(R),c(r)?.(R);},[r,b]);return f.useLayoutEffect(()=>{let R=m.current;if(!R||(S(),typeof MutationObserver>"u"))return;let E=new MutationObserver(()=>{S();});return E.observe(R,{childList:true}),()=>E.disconnect()},[S]),f.useEffect(()=>{let R=m.current;if(!R||typeof ResizeObserver>"u")return;let E=0,h=new ResizeObserver(()=>{window.cancelAnimationFrame(E),E=window.requestAnimationFrame(o);});return h.observe(R),()=>{window.cancelAnimationFrame(E),h.disconnect();}},[o]),jsxs("div",{ref:L,role:n??"log","aria-relevant":e??"additions",...c$1,children:[t,jsx("div",{ref:v,"aria-hidden":"true","data-message-scroller-spacer":"",hidden:true,className:l})]})}function mt({messageId:e,ref:t,scrollAnchor:r=false,...n}){let l=Ct(),c$1=f.useRef(null),S=f.useCallback(o=>{let b=c$1.current;c$1.current=o,e&&l(e,o,b),c(t)?.(o);},[e,t,l]);return jsx("div",{ref:S,"data-message-id":e,"data-scroll-anchor":r?"true":"false",...n})}function dt({behavior:e="smooth",children:t,direction:r="end",onClick:n,render:l,tabIndex:c,type:S="button",...o}){let{scrollToEnd:b$1,scrollToStart:v,stateStore:m}=K(),L=at(n),R=f.useCallback(u=>m.subscribe(u),[m]),E=f.useCallback(()=>{let u=m.getSnapshot();return r==="start"?u.start:u.end},[r,m]),h=f.useSyncExternalStore(R,E,E),I=f.useCallback(u=>{h&&(L.current?.(u),u.defaultPrevented||(u.currentTarget.blur(),r==="start"?v({behavior:e}):b$1({behavior:e})));},[e,r,h,L,b$1,v]);return a({defaultTagName:"button",props:b({type:S,inert:!h,tabIndex:h?c:-1,children:t??jsxs("span",{children:["Scroll to ",r]}),onClick:I},o),render:l,state:{active:h,direction:r},stateAttributesMapping:{active:u=>({"data-active":u?"true":"false"})}})}var er={Provider:ft,Root:gt,Viewport:Rt,Content:pt,Item:mt,Button:dt};export{er as MessageScroller,Pt as useMessageScroller,wt as useMessageScrollerScrollable,Ot as useMessageScrollerVisibility};
\ No newline at end of file
+import {c,a,b}from'../chunk-HBS6WEDP.js';import*as f from'react';import {jsx,jsxs}from'react/jsx-runtime';var _e=8,Be=64,Fe=0,J=.5,je=180,Ge=new Set(["ArrowDown","ArrowUp","End","Home","PageDown","PageUp"," "]),ge={start:false,end:false},vt=[],Q={currentAnchorId:null,visibleMessageIds:vt};function Ne({content:e,scrollEdgeThreshold:t,spacer:r,viewport:n}){if(!n||!e)return ge;let l=Re({content:e,spacer:r,viewport:n});return {start:n.scrollTop>t,end:l-n.scrollTop-n.clientHeight>t}}function Ue({content:e,scrollMargin:t,scrollPreviousItemPeek:r,spacer:n,viewport:l,visibleMessageIds:c}){if(!e||!l)return Q;let S=l.getBoundingClientRect(),o=S.top+t+r,b=typeof IntersectionObserver>"u",v=[],m=null;for(let L of ee(e,n)){let R=L.dataset.messageId;if(!R)continue;let E=L.dataset.scrollAnchor==="true",h=E||b?L.getBoundingClientRect():null;(b&&h?h.bottom>o&&h.top<S.bottom:c.has(R))&&v.push(R),E&&h&&h.top<=o+J&&(m=R);}return v.length===0&&m===null?Q:{currentAnchorId:m,visibleMessageIds:v}}function ee(e,t){return Array.from(e.children).filter(r=>r instanceof HTMLElement&&r!==t)}function Ye(e,t){for(let r=t;r<e.length;r++){let n=e[r];if(n?.dataset.scrollAnchor==="true")return n}return null}function ze(e,t,previousRows){
+ // Replacing an existing row is not a new turn. Only an existing row whose
+ // anchor has not been consumed may start a turn without increasing row count.
+ for(let r of e)if(previousRows.has(r)&&r.dataset.scrollAnchor==="true"&&!t.has(r))return r;
+ return null
+}function qe(e,t){let r=0;for(let n=t;n<e.length;n++)if(e[n]?.dataset.scrollAnchor==="true"&&(r+=1,r>1))return true;return false}function Ke(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(r?.dataset.scrollAnchor==="true")return r}return null}function We({content:e,spacer:t,viewport:r}){let n=r.getBoundingClientRect();for(let l of ee(e,t)){if(!l.dataset.messageId)continue;let c=l.getBoundingClientRect();if(c.bottom>n.top&&c.top<n.bottom)return l}return null}function $e({align:e,element:t,scrollMargin:r,spacer:n,viewport:l}){let c=me(t,l),S=t.getBoundingClientRect().height,o=ht(n);if(e==="center"){let b=Math.max(0,l.clientHeight-o.start-o.end);return c-o.start-(b-S)/2-r}if(e==="end")return c-l.clientHeight+S+o.end+r;if(e==="nearest"){let b=c+S,v=l.scrollTop+o.start,m=l.scrollTop+l.clientHeight-o.end;return c>=v&&b<=m?l.scrollTop:c<v?c-o.start-r:b-l.clientHeight+o.end+r}return c-o.start-r}function me(e,t){let r=e.getBoundingClientRect(),n=t.getBoundingClientRect();return r.top-n.top+t.scrollTop}function te(e,t){return e.getBoundingClientRect().top-t.getBoundingClientRect().top}function Je({content:e,scrollTop:t,spacer:r,viewport:n}){let l=Re({content:e,spacer:r,viewport:n});return t+n.clientHeight-l}function Re({content:e,spacer:t,viewport:r}){let n=ee(e,t),l=Xe(e),c=r.getBoundingClientRect(),S=r.scrollTop,o=l.start+l.end;for(let b of n){let v=b.getBoundingClientRect();o=Math.max(o,v.bottom-c.top+S+l.end);}return o}function Qe(e){return Math.max(0,e.scrollHeight-e.clientHeight)}function Xe(e){let t=window.getComputedStyle(e);return {end:pe(t.paddingBlockEnd||t.paddingBottom),start:pe(t.paddingBlockStart||t.paddingTop)}}function ht(e){let t=e?.parentElement;return t?Xe(t):{end:0,start:0}}function Ze(e){if(!e)return 0;let t=window.getComputedStyle(e),r=t.rowGap==="normal"?t.gap:t.rowGap;return pe(r)}function pe(e){if(!e)return 0;let t=Number.parseFloat(e);return Number.isFinite(t)?t:0}function et(e,t){let r=e,n=new Set;return {getSnapshot:()=>r,hasListeners:()=>n.size>0,setSnapshot:l=>{t(r,l)||(r=l,n.forEach(c=>c()));},subscribe:(l,c,S)=>{let o=n.size===0;return n.add(l),o&&c?.(),()=>{n.delete(l),n.size===0&&S?.();}}}}function de(e,t){return et(e,t)}function tt(){return et(Q,Lt)}function rt(e,t){return e.start===t.start&&e.end===t.end}function Lt(e,t){return e.currentAnchorId!==t.currentAnchorId||e.visibleMessageIds.length!==t.visibleMessageIds.length?false:e.visibleMessageIds.every((r,n)=>r===t.visibleMessageIds[n])}function nt({autoScroll:e,defaultScrollPosition:t,scrollEdgeThreshold:r,scrollMargin:n,scrollPreviousItemPeek:l}){let c=f.useRef(e),S=f.useRef(false),o=f.useRef(null),b=f.useRef(false),v=f.useRef(r),m=f.useRef(0),L=f.useRef(null),R=f.useRef(0),E=f.useRef(e?"following-bottom":"free-scrolling"),h=f.useRef(new Map),I=f.useRef(null),u=f.useRef(null),k=f.useRef(null),j=f.useRef(l),_=f.useRef(true),Y=f.useRef(null),x=f.useRef(n),V=f.useRef(null),P=f.useRef(0),G=f.useRef(0),A=f.useRef(null),le=f.useRef(null),z=f.useRef(null),B=f.useRef(null),i=f.useRef(null),d=f.useRef(null),T=f.useRef(null),w=f.useRef(null),C=f.useRef(null),y=f.useRef(new Set),F=f.useRef(new WeakSet);return z.current===null&&(z.current=de(t==="end"||t==="last-anchor",(q,X)=>q===X)),B.current===null&&(B.current=de(ge,rt)),C.current===null&&(C.current=tt()),c.current=e,v.current=r,x.current=n,j.current=l,{autoScrollRef:c,autoscrollingRef:S,autoscrollingTimeoutRef:i,streamingTurnRef:k,contentRef:o,defaultScrollPositionAppliedRef:b,firstItemRef:L,itemCountRef:m,lastScrollTopRef:R,messageElementsRef:h,modeRef:E,pendingScrollFrameRef:V,pendingScrollToMessageRef:I,prependRestoreRef:u,preserveScrollOnPrependRef:_,pendingDefaultScrollStore:z.current,rootRef:Y,scrollEdgeThresholdRef:v,scrollMarginRef:x,scrollPreviousItemPeekRef:j,spacerGapRef:P,spacerHeightRef:G,spacerRef:A,stateFrameRef:le,stateStore:B.current,viewportRef:d,visibilityFrameRef:T,visibilityObserverRef:w,visibilityStore:C.current,visibleMessageIdsRef:y,handledScrollAnchorsRef:F}}function Me(e){e.pendingDefaultScrollStore.setSnapshot(false);}function re(e){e.defaultScrollPositionAppliedRef.current=true,Me(e);}function lt({refs:e,commitScrollState:t,scheduleStateCommit:r,scheduleVisibilitySync:n}){let{streamingTurnRef:l,autoScrollRef:c,autoscrollingRef:S,autoscrollingTimeoutRef:o,contentRef:b,itemCountRef:v,messageElementsRef:m,modeRef:L,pendingScrollToMessageRef:R,prependRestoreRef:E,scrollMarginRef:h,scrollPreviousItemPeekRef:I,spacerGapRef:u,spacerHeightRef:k,spacerRef:j,viewportRef:_}=e,Y=f.useCallback(i=>{o.current!==null&&(window.clearTimeout(o.current),o.current=null),S.current!==i&&(S.current=i,t()),i&&(o.current=window.setTimeout(()=>{o.current=null,S.current=false,t();},je));},[t]),x=f.useCallback(i=>{let d=j.current;if(!d)return;let T=Math.max(0,Math.ceil(i));k.current!==T&&(k.current=T,d.hidden=T===0,d.style.height=`${T}px`,d.style.marginTop=T>0?`${-u.current}px`:"");},[]),V=f.useCallback((i,{behavior:d="auto",autoscrolling:T=false}={})=>{let w=_.current;if(!w)return;let C=Math.max(0,i);if(Math.abs(w.scrollTop-C)<=J){w.scrollTop=C,t();return}T&&Y(true),w.scrollTo({top:C,behavior:d}),r();},[t,r,Y]),P=f.useCallback(({behavior:i="auto"}={})=>_.current?(x(0),l.current=null,L.current="free-scrolling",V(0,{behavior:i}),n(),true):false,[n,V,x]),G=f.useCallback(({behavior:i="auto"}={})=>{let d=_.current;return d?(x(0),l.current=null,L.current=c.current?"following-bottom":"free-scrolling",V(Qe(d),{autoscrolling:true,behavior:i}),n(),true):false},[n,V,x]),A=f.useCallback((i,{align:d="start",behavior:T="auto",scrollMargin:w=h.current}={},{keepPreviousPeek:C=false}={})=>{let y=b.current,F=_.current;if(!y||!F||!y.contains(i))return false;let q=$e({align:d,element:i,scrollMargin:C?w+I.current:w,spacer:j.current,viewport:F}),X=Je({content:y,scrollTop:q,spacer:j.current,viewport:F});return x(X),E.current={element:i,viewportTop:te(i,F)},L.current=C?"anchored-to-message":"settling-jump",l.current=C?i:null,V(q,{behavior:T}),n(),true},[n,V,x]),le=f.useCallback(()=>{let i=l.current;return !i||!i.isConnected||L.current!=="anchored-to-message"?false:A(i,{align:"start"},{keepPreviousPeek:true})},[A]),z=f.useCallback((i,d)=>{let T=m.current.get(i);return T?(re(e),A(T,d)?(R.current=null,true):(R.current={messageId:i,options:d},true)):v.current===0?(R.current={messageId:i,options:d},re(e),true):false},[A]);return {flushPendingScrollToMessage:f.useCallback(()=>{let i=R.current;if(!i)return false;let d=m.current.get(i.messageId);return !d||!A(d,i.options)?false:(R.current=null,re(e),true)},[A]),reanchorToAnchoredMessage:le,scrollToElement:A,scrollToEnd:G,scrollToMessage:z,scrollToStart:P}}function ot(e,t){return f.useCallback(r=>{e.current=r,r&&t();},[e,t])}function st({autoScroll:e=false,defaultScrollPosition:t="end",scrollEdgeThreshold:r=_e,scrollPreviousItemPeek:n=Be,scrollMargin:l=Fe}){let c=nt({autoScroll:e,defaultScrollPosition:t,scrollEdgeThreshold:r,scrollMargin:l,scrollPreviousItemPeek:n}),{streamingTurnRef:S,autoScrollRef:o,autoscrollingRef:b,autoscrollingTimeoutRef:v,contentRef:m,defaultScrollPositionAppliedRef:L,firstItemRef:R,itemCountRef:E,lastScrollTopRef:h,messageElementsRef:I,modeRef:u,pendingScrollFrameRef:k,pendingScrollToMessageRef:j,prependRestoreRef:_,preserveScrollOnPrependRef:Y,pendingDefaultScrollStore:x,rootRef:V,scrollEdgeThresholdRef:P,scrollMarginRef:G,scrollPreviousItemPeekRef:A,spacerGapRef:le,spacerHeightRef:z,spacerRef:B,stateFrameRef:i,stateStore:d,viewportRef:T,visibilityFrameRef:w,visibilityObserverRef:C,visibilityStore:y,visibleMessageIdsRef:F,handledScrollAnchorsRef:q}=c,X=f.useRef(t),previousRowsRef=f.useRef(new Set);X.current!==t&&(X.current=t,L.current=false);let ce=f.useCallback(s=>{let a=V.current,M=T.current,H=[s.start&&"start",s.end&&"end"].filter(Boolean).join(" "),fe=b.current;for(let W of [a,M])W&&(H?W.setAttribute("data-scrollable",H):W.removeAttribute("data-scrollable"),W.toggleAttribute("data-autoscrolling",fe));},[]),be=f.useCallback(s=>{let a=T.current?.scrollTop??0,M=a<h.current-J;h.current=a,o.current&&!s.end&&u.current!=="settling-jump"&&u.current!=="anchored-to-message"?u.current="following-bottom":u.current==="following-bottom"&&s.end&&M&&!b.current&&(u.current="free-scrolling");},[]),N=f.useCallback(()=>{let s=Ne({content:m.current,scrollEdgeThreshold:P.current,spacer:B.current,viewport:T.current});be(s);let a=u.current==="following-bottom"?{...s,end:false}:s;ce(a),d.setSnapshot(a);},[be,d,ce]),oe=f.useCallback(()=>{i.current===null&&(i.current=window.requestAnimationFrame(()=>{i.current=null,N();}));},[N]),O=f.useCallback(()=>{y.hasListeners()&&w.current===null&&(w.current=window.requestAnimationFrame(()=>{w.current=null,y.hasListeners()&&y.setSnapshot(Ue({content:m.current,scrollMargin:G.current,scrollPreviousItemPeek:A.current,spacer:B.current,viewport:T.current,visibleMessageIds:F.current}));}));},[y]),{flushPendingScrollToMessage:ae,reanchorToAnchoredMessage:Te,scrollToElement:se,scrollToEnd:D,scrollToMessage:Ee,scrollToStart:ie}=lt({refs:c,commitScrollState:N,scheduleStateCommit:oe,scheduleVisibilitySync:O}),ve=f.useCallback(()=>{let s=_.current,a=T.current;if(!s||!a||!s.element.isConnected)return false;let H=te(s.element,a)-s.viewportTop;return Math.abs(H)<=J?false:(a.scrollTop+=H,s.viewportTop=te(s.element,a),oe(),O(),true)},[oe,O]),Z=f.useCallback(()=>{let s=m.current,a=T.current;if(!s||!a){_.current=null;return}let M=We({content:s,spacer:B.current,viewport:a});_.current=M?{element:M,viewportTop:te(M,a)}:null;},[]),he=f.useCallback(()=>{k.current===null&&(k.current=window.requestAnimationFrame(()=>{k.current=null,ae()&&Z();}));},[Z,ae]),ue=f.useCallback(()=>{if(!t||L.current||E.current===0)return false;let s=false;if(t==="last-anchor"){let a=m.current,M=T.current,H=a&&M?Ke(ee(a,B.current)):null;if(!a||!M||!H)s=D({behavior:"auto"});else {let fe=me(H,M);s=Re({content:a,spacer:B.current,viewport:M})-fe<=M.clientHeight?D({behavior:"auto"}):se(H,{align:"start"},{keepPreviousPeek:true});}}else s=t==="end"?D({behavior:"auto"}):ie({behavior:"auto"});return s?(re(c),true):false},[t,se,D,ie]),Le=f.useCallback(()=>{let s=m.current;if(!s)return;let a=ee(s,B.current),M=E.current,H=R.current;let previousRows=previousRowsRef.current;previousRowsRef.current=new Set(a);E.current=a.length,R.current=a[0]??null,(()=>{if(ae())return;if(M===0){if(ue()||a.length>0&&o.current&&D({behavior:"auto"}))return;N(),O();return}let W=H?a.indexOf(H):-1;if(Y.current&&W>0){ve();return}if(a.length>M){let $=Ye(a,M);if($){if(o.current&&u.current==="following-bottom"&&qe(a,M)){D({behavior:"auto"});return}se($,{align:"start"},{keepPreviousPeek:true}),q.current.add($);return}}if(a.length===M){let $=ze(a,q.current,previousRows);if($){se($,{align:"start"},{keepPreviousPeek:true}),q.current.add($);return}}u.current==="following-bottom"&&o.current?D({behavior:"auto"}):(N(),O());} )();
+ // Consume every anchor in this snapshot, including initially loaded history,
+ // prepended history and replacement rows, so later updates cannot replay it.
+ for(let row of a)if(row.dataset.scrollAnchor==="true")q.current.add(row);
+ Z();},[ue,Z,N,ae,ve,O,se,D]),Ce=f.useCallback(()=>{if(u.current==="following-bottom"&&o.current){D({behavior:"auto"});return}let s=z.current;if(Te()){o.current&&s>0&&z.current===0&&D({behavior:"auto"});return}oe(),O();},[Te,oe,O,D]),Pe=f.useCallback(()=>{let s=T.current;if(!(!s||!y.hasListeners())){if(typeof IntersectionObserver>"u"){O();return}C.current||(C.current=new IntersectionObserver(a=>{for(let M of a){let H=M.target.dataset.messageId;H&&(M.isIntersecting?F.current.add(H):F.current.delete(H));}O();},{root:s,rootMargin:`${-(G.current+A.current)}px 0px 0px 0px`,threshold:[0,.01,.5,1]})),I.current.forEach(a=>{C.current?.observe(a);}),O();}},[O,y]),we=f.useCallback(()=>{w.current!==null&&(window.cancelAnimationFrame(w.current),w.current=null),C.current?.disconnect(),C.current=null,F.current.clear(),y.setSnapshot(Q);},[y]),bt=f.useCallback((s,a,M)=>{if(a){I.current.set(s,a),C.current?.observe(a),O(),j.current?.messageId===s&&he();return}M&&I.current.get(s)===M&&(I.current.delete(s),F.current.delete(s),C.current?.unobserve(M),O());},[he,O]),Oe=f.useCallback(()=>{(u.current==="following-bottom"||u.current==="anchored-to-message"||u.current==="settling-jump")&&(S.current=null,u.current="free-scrolling");},[]),ye=f.useCallback(()=>ce(d.getSnapshot()),[d,ce]),He=ot(V,ye),Ie=ot(T,ye),Ae=f.useCallback(s=>{m.current=s;},[]),De=f.useCallback(s=>{B.current=s,le.current=Ze(s?.parentElement??null);},[]),xe=f.useCallback(()=>{N(),O(),Z();},[Z,N,O]),Tt=f.useMemo(()=>({handleContentChange:Le,handleResize:Ce,observeVisibility:Pe,pendingDefaultScrollStore:x,preserveScrollOnPrependRef:Y,scrollToEnd:D,scrollToMessage:Ee,scrollToStart:ie,setContentElement:Ae,setRootElement:He,setSpacerElement:De,setViewportElement:Ie,stateStore:d,syncAfterScroll:xe,unobserveVisibility:we,userScrollIntent:Oe,viewportRef:T,visibilityStore:y}),[Le,Ce,Pe,x,D,Ee,ie,Ae,He,De,Ie,d,xe,we,Oe,y]);return f.useLayoutEffect(()=>{ue()||E.current===0&&Me(c);},[ue]),f.useEffect(()=>()=>{i.current!==null&&(window.cancelAnimationFrame(i.current),i.current=null),w.current!==null&&(window.cancelAnimationFrame(w.current),w.current=null),v.current!==null&&(window.clearTimeout(v.current),v.current=null),k.current!==null&&(window.cancelAnimationFrame(k.current),k.current=null),C.current?.disconnect(),C.current=null;},[]),f.useLayoutEffect(()=>{if(e&&u.current==="following-bottom"&&E.current>0){D({behavior:"auto"});return}N();},[e,N,D]),{context:Tt,registerMessage:bt}}function at(e){let t=f.useRef(e);return t.current=e,t}var it=f.createContext(null),ut=f.createContext(null);function K(){let e=f.useContext(it);if(!e)throw new Error("useMessageScroller must be used within a MessageScroller.");return e}function Ct(){let e=f.useContext(ut);if(!e)throw new Error("MessageScrollerItem must be used within a MessageScroller.");return e}function Pt(){let{scrollToEnd:e,scrollToMessage:t,scrollToStart:r}=K();return f.useMemo(()=>({scrollToEnd:e,scrollToMessage:t,scrollToStart:r}),[e,t,r])}function wt(){let{stateStore:e}=K();return f.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getSnapshot)}function Ot(){let{observeVisibility:e,unobserveVisibility:t,visibilityStore:r}=K(),n=f.useCallback(l=>r.subscribe(l,e,t),[e,t,r]);return f.useSyncExternalStore(n,r.getSnapshot,r.getSnapshot)}function ft({autoScroll:e=false,children:t,defaultScrollPosition:r="end",scrollEdgeThreshold:n,scrollPreviousItemPeek:l,scrollMargin:c}){let{context:S,registerMessage:o}=st({autoScroll:e,defaultScrollPosition:r,scrollEdgeThreshold:n,scrollPreviousItemPeek:l,scrollMargin:c});return jsx(it.Provider,{value:S,children:jsx(ut.Provider,{value:o,children:t})})}function St(){let{pendingDefaultScrollStore:e}=K();return f.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getSnapshot)}function gt({children:e,...t}){let{setRootElement:r}=K(),n=St();return jsx("div",{ref:r,...t,...n?{"data-pending-scroll":""}:null,children:e})}function Rt({"aria-label":e,children:t,onKeyDown:r,onScroll:n,onTouchMove:l,onWheel:c$1,preserveScrollOnPrepend:S=true,ref:o,role:b,tabIndex:v,...m}){let{handleResize:L,preserveScrollOnPrependRef:R,setViewportElement:E,syncAfterScroll:h,userScrollIntent:I,viewportRef:u}=K(),k=St();R.current=S;let j=f.useCallback(P=>{E(P),c(o)?.(P);},[o,E]);function _(P){h(),n?.(P);}function Y(P){I(),c$1?.(P);}function x(P){I(),l?.(P);}function V(P){Ge.has(P.key)&&I(),r?.(P);}return f.useEffect(()=>{let P=u.current;if(!P||typeof ResizeObserver>"u")return;let G=0,A=new ResizeObserver(()=>{window.cancelAnimationFrame(G),G=window.requestAnimationFrame(L);});return A.observe(P),()=>{window.cancelAnimationFrame(G),A.disconnect();}},[L,u]),jsx("div",{ref:j,role:b??"region","aria-label":e??"Messages",tabIndex:v??0,onKeyDown:V,onScroll:_,onTouchMove:x,onWheel:Y,...m,...k?{"data-pending-scroll":""}:null,children:t})}function pt({"aria-relevant":e,children:t,ref:r,role:n,spacerClassName:l,...c$1}){let{handleContentChange:S,handleResize:o,setContentElement:b,setSpacerElement:v}=K(),m=f.useRef(null),L=f.useCallback(R=>{m.current=R,b(R),c(r)?.(R);},[r,b]);return f.useLayoutEffect(()=>{let R=m.current;if(!R||(S(),typeof MutationObserver>"u"))return;let E=new MutationObserver(()=>{S();});return E.observe(R,{childList:true}),()=>E.disconnect()},[S]),f.useEffect(()=>{let R=m.current;if(!R||typeof ResizeObserver>"u")return;let E=0,h=new ResizeObserver(()=>{window.cancelAnimationFrame(E),E=window.requestAnimationFrame(o);});return h.observe(R),()=>{window.cancelAnimationFrame(E),h.disconnect();}},[o]),jsxs("div",{ref:L,role:n??"log","aria-relevant":e??"additions",...c$1,children:[t,jsx("div",{ref:v,"aria-hidden":"true","data-message-scroller-spacer":"",hidden:true,className:l})]})}function mt({messageId:e,ref:t,scrollAnchor:r=false,...n}){let l=Ct(),c$1=f.useRef(null),S=f.useCallback(o=>{let b=c$1.current;c$1.current=o,e&&l(e,o,b),c(t)?.(o);},[e,t,l]);return jsx("div",{ref:S,"data-message-id":e,"data-scroll-anchor":r?"true":"false",...n})}function dt({behavior:e="smooth",children:t,direction:r="end",onClick:n,render:l,tabIndex:c,type:S="button",...o}){let{scrollToEnd:b$1,scrollToStart:v,stateStore:m}=K(),L=at(n),R=f.useCallback(u=>m.subscribe(u),[m]),E=f.useCallback(()=>{let u=m.getSnapshot();return r==="start"?u.start:u.end},[r,m]),h=f.useSyncExternalStore(R,E,E),I=f.useCallback(u=>{h&&(L.current?.(u),u.defaultPrevented||(u.currentTarget.blur(),r==="start"?v({behavior:e}):b$1({behavior:e})));},[e,r,h,L,b$1,v]);return a({defaultTagName:"button",props:b({type:S,inert:!h,tabIndex:h?c:-1,children:t??jsxs("span",{children:["Scroll to ",r]}),onClick:I},o),render:l,state:{active:h,direction:r},stateAttributesMapping:{active:u=>({"data-active":u?"true":"false"})}})}var er={Provider:ft,Root:gt,Viewport:Rt,Content:pt,Item:mt,Button:dt};export{er as MessageScroller,Pt as useMessageScroller,wt as useMessageScrollerScrollable,Ot as useMessageScrollerVisibility};
\ No newline at end of file