@aiquants/virtualscroll 1.25.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,7 +2,36 @@
2
2
 
3
3
  All notable changes to `@aiquants/virtualscroll` are documented here.
4
4
 
5
- ## 1.25.0 (公開予定)
5
+ ## 2.0.0 (2026-08-11)
6
+
7
+ ### Breaking
8
+
9
+ - **`VirtualScrollHandle` is now fully LOGICAL-space** — the essential fix that makes
10
+ coordinate-mixing bugs structurally impossible for consumers:
11
+ - `getScrollPosition()` now returns the **logical** position (was: pane position).
12
+ - `scrollTo()` now returns the applied **logical** position (was: pane position).
13
+ - The handle no longer extends `ScrollPaneHandle`; pane coordinates are an internal
14
+ implementation detail (ScrollPane's own handle remains pane-space by definition).
15
+ Rationale: the old asymmetry (logical input, pane output) forced consumers to write
16
+ conversion code, which caused two real bugs (daily-report's 6px initial offset and
17
+ directory-tree's double-inset anchor drift). Consumers WITHOUT `contentInsets` see no
18
+ numeric change (both spaces coincide when the top inset is 0). Consumers WITH insets:
19
+ delete your `± topInset` conversions — every handle/callback value is logical now.
20
+ 移行: inset 未使用の消費者は数値変化なし。inset 使用の消費者は ± topInset 換算を全削除する
21
+ (ハンドル・コールバックの値はすべて論理座標)。
22
+
23
+ ### Fixed
24
+
25
+ - Dynamic `contentInsets.top` changes no longer double-apply the inset delta when a scroll
26
+ anchor (`scrollToIndex` / `initialScrollAnchor`) is pending: the inset-sync effect now delegates
27
+ positioning to the drift-correction effect while an anchor exists (it only updates its
28
+ bookkeeping). The logical position is invariant under runtime inset changes on BOTH paths
29
+ (anchored and manual-scroll), each pinned by a regression test. This closes the previously
30
+ documented known issue.
31
+ 動的 inset 変更 × 保留アンカーの二重適用 (既知課題) を根治。論理位置は実行時の inset 変更に
32
+ 対して不変 (アンカー有り/無しの両経路をピンで固定)。
33
+
34
+ ## 1.25.0
6
35
 
7
36
  ### Added
8
37
 
package/README.md CHANGED
@@ -244,9 +244,9 @@ exists in the DOM.
244
244
 
245
245
  | Method | Type | Description |
246
246
  | --- | --- | --- |
247
- | `scrollTo` | `(position: number \| ((prev: number) => number)) => number` | Scroll to a **logical** position (updater form supported). Returns the applied **pane** position |
247
+ | `scrollTo` | `(position: number \| ((prev: number) => number)) => number` | Scroll to a **logical** position (updater receives the current logical position). Returns the applied **logical** position (2.0.0) |
248
248
  | `scrollToIndex` | `(index: number, options?: { align?: "top" \| "bottom" \| "center"; offset?: number }) => void` | Scroll to specific item index with optional alignment and offset |
249
- | `getScrollPosition` | `() => number` | Get current **pane** scroll position (`-1` when the pane is not connected) |
249
+ | `getScrollPosition` | `() => number` | Get current **logical** scroll position (2.0.0; `-1` when the pane is not connected) |
250
250
  | `getContentSize` | `() => number` | Get total content size (insets included) |
251
251
  | `getViewportSize` | `() => number` | Get viewport size |
252
252
  | `focusItemAtIndex` | `(index: number, options?: { ensureVisible?: boolean }) => void` | Focus item at specific index |
@@ -256,11 +256,12 @@ exists in the DOM.
256
256
  | `getFenwickSize` | `() => number` | Item count managed by the Fenwick tree |
257
257
  | `updateItemSize` | `(index: number, size: number) => void` | Manually update one item's size (with layout-shift compensation). `getItemHeight(index)` must return the same value afterwards |
258
258
 
259
- **Coordinate systems**: with `contentInsets`, positions exist in two spaces **logical** (content px,
260
- insets excluded: `onScroll` / `onRangeChange` deliver it; `initialScrollOffset` / `scrollTo` input /
261
- `getScrollAnchor` consume and produce it) and **pane** (insets included: `getScrollPosition` /
262
- `scrollTo` return value). Logical 0 maps to pane 0 (true top, top inset visible; unified in 1.24.0).
263
- Mixing the two spaces produces a permanent few-px offset.
259
+ **Coordinate system (2.0.0)**: every position the handle and callbacks accept or return is
260
+ **logical** (content px, insets excluded) `onScroll` / `onRangeChange` / `initialScroll*` /
261
+ `getScrollAnchor` / `scrollTo` (input AND return) / `getScrollPosition` all share one space, so no
262
+ conversion code is ever needed in consumers. Pane coordinates (insets included) are an internal
263
+ detail; only `ScrollPane`'s own handle speaks pane-space (it IS the pane). Logical 0 maps to
264
+ pane 0 internally (true top, top inset visible; unified in 1.24.0).
264
265
 
265
266
  ### VirtualScrollRange
266
267
 
@@ -1,5 +1,5 @@
1
1
  import { default as React, ReactNode } from 'react';
2
- import { ScrollPaneHandle, ScrollPaneProps } from './ScrollPane.cjs';
2
+ import { ScrollPaneProps } from './ScrollPane.cjs';
3
3
  import { useFenwickMapTree } from './useFenwickMapTree.cjs';
4
4
  /**
5
5
  * Represents the current state of the rendered range and scroll metrics.
@@ -21,11 +21,35 @@ export type VirtualScrollRange = {
21
21
  totalHeight: number;
22
22
  };
23
23
  /**
24
- * Handle interface for controlling the VirtualScroll component externally.
24
+ * Imperative handle of VirtualScroll. Every position it accepts or returns is in the
25
+ * LOGICAL coordinate space (content px, insets excluded) — the same space as onScroll /
26
+ * onRangeChange / initialScrollOffset / getScrollAnchor.
27
+ * VirtualScroll の命令ハンドル。受け取る位置・返す位置は**すべて論理座標** (inset 抜きの
28
+ * コンテンツ px) で、onScroll / onRangeChange / initialScrollOffset / getScrollAnchor と同一空間。
25
29
  *
26
- * 外部から VirtualScroll コンポーネントを制御するためのハンドルインターフェース。
30
+ * ペイン座標 (inset 込み) は内部実装詳細であり、このハンドルからは一切露出しない。
31
+ * 2.0.0 以前は getScrollPosition と scrollTo の返値だけがペイン座標という非対称があり、
32
+ * 消費者側の換算コードが 2 度の実害バグ (daily-report 初期 6px ずれ / directory-tree の
33
+ * inset 二重適用) を生んだ。座標系の混在を消費者から構造的に不能にするための統一である。
34
+ * ScrollPane 自身のハンドル (ScrollPaneHandle) はペインそのものなのでペイン座標のままであり、
35
+ * その境界はこの型が引き受ける。
27
36
  */
28
- export type VirtualScrollHandle = ScrollPaneHandle & {
37
+ export type VirtualScrollHandle = {
38
+ /**
39
+ * Scrolls to a LOGICAL position (updater form receives the current logical position).
40
+ * Returns the applied (clamped) LOGICAL position.
41
+ * 論理位置へスクロール (updater は現在の論理位置を受け取る)。適用後 (クランプ後) の論理位置を返す。
42
+ */
43
+ scrollTo: (position: number | ((prev: number) => number)) => number;
44
+ /**
45
+ * Current LOGICAL scroll position. -1 when the pane is not connected.
46
+ * 現在の論理スクロール位置。ペイン未接続時は -1。
47
+ */
48
+ getScrollPosition: () => number;
49
+ /** Total pane content size including insets (a size, not a position) / インセット込みのコンテンツ総高さ (位置ではなくサイズ)。未接続時は -1 */
50
+ getContentSize: () => number;
51
+ /** Viewport size / ビューポートの高さ。未接続時は -1 */
52
+ getViewportSize: () => number;
29
53
  /** Scrolls to a specific item index / 指定したアイテムインデックスへスクロール */
30
54
  scrollToIndex: (index: number, options?: {
31
55
  align?: "top" | "bottom" | "center";
@@ -1,5 +1,5 @@
1
1
  import { default as React, ReactNode } from 'react';
2
- import { ScrollPaneHandle, ScrollPaneProps } from './ScrollPane.tsx';
2
+ import { ScrollPaneProps } from './ScrollPane.tsx';
3
3
  import { useFenwickMapTree } from './useFenwickMapTree.ts';
4
4
  /**
5
5
  * Represents the current state of the rendered range and scroll metrics.
@@ -21,11 +21,35 @@ export type VirtualScrollRange = {
21
21
  totalHeight: number;
22
22
  };
23
23
  /**
24
- * Handle interface for controlling the VirtualScroll component externally.
24
+ * Imperative handle of VirtualScroll. Every position it accepts or returns is in the
25
+ * LOGICAL coordinate space (content px, insets excluded) — the same space as onScroll /
26
+ * onRangeChange / initialScrollOffset / getScrollAnchor.
27
+ * VirtualScroll の命令ハンドル。受け取る位置・返す位置は**すべて論理座標** (inset 抜きの
28
+ * コンテンツ px) で、onScroll / onRangeChange / initialScrollOffset / getScrollAnchor と同一空間。
25
29
  *
26
- * 外部から VirtualScroll コンポーネントを制御するためのハンドルインターフェース。
30
+ * ペイン座標 (inset 込み) は内部実装詳細であり、このハンドルからは一切露出しない。
31
+ * 2.0.0 以前は getScrollPosition と scrollTo の返値だけがペイン座標という非対称があり、
32
+ * 消費者側の換算コードが 2 度の実害バグ (daily-report 初期 6px ずれ / directory-tree の
33
+ * inset 二重適用) を生んだ。座標系の混在を消費者から構造的に不能にするための統一である。
34
+ * ScrollPane 自身のハンドル (ScrollPaneHandle) はペインそのものなのでペイン座標のままであり、
35
+ * その境界はこの型が引き受ける。
27
36
  */
28
- export type VirtualScrollHandle = ScrollPaneHandle & {
37
+ export type VirtualScrollHandle = {
38
+ /**
39
+ * Scrolls to a LOGICAL position (updater form receives the current logical position).
40
+ * Returns the applied (clamped) LOGICAL position.
41
+ * 論理位置へスクロール (updater は現在の論理位置を受け取る)。適用後 (クランプ後) の論理位置を返す。
42
+ */
43
+ scrollTo: (position: number | ((prev: number) => number)) => number;
44
+ /**
45
+ * Current LOGICAL scroll position. -1 when the pane is not connected.
46
+ * 現在の論理スクロール位置。ペイン未接続時は -1。
47
+ */
48
+ getScrollPosition: () => number;
49
+ /** Total pane content size including insets (a size, not a position) / インセット込みのコンテンツ総高さ (位置ではなくサイズ)。未接続時は -1 */
50
+ getContentSize: () => number;
51
+ /** Viewport size / ビューポートの高さ。未接続時は -1 */
52
+ getViewportSize: () => number;
29
53
  /** Scrolls to a specific item index / 指定したアイテムインデックスへスクロール */
30
54
  scrollToIndex: (index: number, options?: {
31
55
  align?: "top" | "bottom" | "center";
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualScroll.d.ts","sourceRoot":"","sources":["../src/VirtualScroll.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VirtualScroll.d.ts","sourceRoot":"","sources":["../src/VirtualScroll.tsx"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Y=require("react/jsx-runtime"),r=require("react"),gt=require("tailwind-merge");class w{level;prefix;impl;constructor(e=2,t="[virtualscroll]",s=console){this.level=e,this.prefix=t,this.impl=s}static instance=new w(2,"[virtualscroll]");static setLevel(e){w.instance.setLevel(e)}setLevel(e){this.level=e}static setImplementation(e){w.instance.setImplementation(e)}setImplementation(e){this.impl=e}static setPrefix(e){w.instance.setPrefix(e)}setPrefix(e){this.prefix=e}static isEnabled(e){return w.instance.isEnabled(e)}isEnabled(e){return this.level<=e}static resolveLazy(e){if(typeof e!="function")return e;try{return e()}catch{return e}}formatMessage(e){return typeof e=="string"?[`${this.prefix} ${e}`]:[this.prefix,e]}static debug(e,...t){w.instance.debug(e,...t)}debug(e,...t){this.level<=0&&this.impl.debug(...this.formatMessage(w.resolveLazy(e)),...t.map(w.resolveLazy))}static info(e,...t){w.instance.info(e,...t)}info(e,...t){this.level<=1&&this.impl.info(...this.formatMessage(w.resolveLazy(e)),...t.map(w.resolveLazy))}static warn(e,...t){w.instance.warn(e,...t)}warn(e,...t){this.level<=2&&this.impl.warn(...this.formatMessage(w.resolveLazy(e)),...t.map(w.resolveLazy))}static error(e,...t){w.instance.error(e,...t)}error(e,...t){this.level<=3&&this.impl.error(...this.formatMessage(w.resolveLazy(e)),...t.map(w.resolveLazy))}}const Yt={active:!1,offsetX:0,offsetY:0,distance:0,direction:0,pointerId:null},Dt=6,er=8,tr=({dragState:n,normalizedDistance:e})=>{const t=1+e*.18,s=.16+e*.24,i=.38+e*.28,a=n.active?"80ms ease-out":"220ms ease";return Y.jsxs(Y.Fragment,{children:[Y.jsx("div",{className:"aqvs-tap-scroll-circle-visual-outer",style:{background:"linear-gradient(140deg, rgba(255,255,255,0.62), rgba(72,72,72,0.48))",boxShadow:`0 0 0 1px rgba(255,255,255,0.28), 0 10px 22px rgba(0,0,0,${s})`,transform:`scale(${t})`,transition:`${a}, ${n.active?"80ms":"260ms"} box-shadow ease`}}),Y.jsx("div",{className:"aqvs-tap-scroll-circle-inner",style:{background:"linear-gradient(140deg, rgba(255,255,255,0.72), rgba(28,28,28,0.58))",boxShadow:"inset 0 4px 10px rgba(0,0,0,0.24), inset 0 0 2px rgba(255,255,255,0.55)",opacity:i,transition:n.active?"120ms opacity ease-out":"220ms opacity ease"}})]})},Ut=r.memo(r.forwardRef(({onDragChange:n,className:e,maxVisualDistance:t=160,size:s=40,style:i,opacity:a=1,renderVisual:l},u)=>{const[d,x]=r.useState(Yt),I=r.useRef(null),M=r.useRef(null),E=r.useRef({x:0,y:0}),h=r.useRef(null),N=r.useRef(0),F=r.useCallback(T=>{x(T),n(T)},[n]),U=r.useCallback((T,B,q=!1)=>{const{x:Ye,y:Ne}=E.current,te=T-Ye,re=B-Ne,W=Math.abs(re),Z=W<Dt?0:re<0?-1:1,Pe=N.current;let Ve=Z;const je=Dt+er;Z===0?Pe!==0&&W<je?Ve=Pe:(Ve=0,q||(N.current=0)):Z!==Pe&&Pe!==0&&W<je?Ve=Pe:N.current=Z,F({active:q||W>=Dt,offsetX:te,offsetY:re,distance:W,direction:Ve,pointerId:I.current})},[F]),ie=r.useCallback(T=>{if(T===null)return;const B=h.current;B?.hasPointerCapture(T)&&B.releasePointerCapture(T)},[]),Q=r.useCallback((T=!1)=>{T&&ie(I.current),I.current=null,M.current=null,N.current=0,F(Yt)},[F,ie]),ee=r.useCallback(T=>{if(I.current!==null&&I.current!==T.pointerId){M.current={pointerId:T.pointerId,clientX:T.clientX,clientY:T.clientY},T.preventDefault(),T.stopPropagation();return}T.preventDefault(),T.stopPropagation();const B=h.current??T.currentTarget,{left:q,top:Ye,width:Ne,height:te}=B.getBoundingClientRect();E.current={x:q+Ne/2,y:Ye+te/2},I.current=T.pointerId;try{B.setPointerCapture(T.pointerId)}catch{}U(T.clientX,T.clientY,!0)},[U]),ge=r.useCallback(T=>{if(I.current!==T.pointerId){M.current!==null&&M.current.pointerId===T.pointerId&&(M.current={pointerId:T.pointerId,clientX:T.clientX,clientY:T.clientY});return}T.preventDefault(),U(T.clientX,T.clientY)},[U]),ve=r.useCallback(T=>{if(I.current!==T.pointerId){M.current!==null&&M.current.pointerId===T.pointerId&&(M.current=null);return}T.preventDefault(),T.stopPropagation();const B=M.current;if(M.current=null,B!==null){ie(T.pointerId);const q=h.current;let Ye=!0;if(q!==null&&typeof q.setPointerCapture=="function")try{q.setPointerCapture(B.pointerId)}catch(Ne){(typeof Ne=="object"&&Ne!==null&&"name"in Ne?Ne.name:void 0)==="NotFoundError"&&(Ye=!1)}if(Ye){I.current=B.pointerId,U(B.clientX,B.clientY,!0);return}}Q(!0)},[Q,ie,U]),V=r.useCallback(T=>{T.target===T.currentTarget&&I.current===T.pointerId&&Q(!1)},[Q]);r.useImperativeHandle(u,()=>({reset:()=>{Q(!0)},getElement:()=>h.current}),[Q]);const L=Math.min(Math.max(a,0),1),S=s/64,j=Math.min(d.distance,t)/t,G=d.direction*j*10*S,P=l??tr,ae={dragState:d,normalizedDistance:j,sizeScale:S,size:s,opacity:L},K={...i,width:s,height:s,transform:`translateY(${G}px)`};return K.opacity=L,Y.jsx("div",{ref:h,"data-testid":"virtual-scroll-tap-circle",className:gt.twMerge("aqvs-tap-scroll-circle",e),style:K,tabIndex:-1,onPointerDown:ee,onPointerMove:ge,onPointerUp:ve,onPointerCancel:ve,onLostPointerCapture:V,role:"presentation",children:P(ae)})}));Ut.displayName="TapScrollCircle";const J=(n,e,t)=>Math.max(e,Math.min(t,n)),Ft="virtualscroll:tap-scroll-cancel",Bt=20,rr=250,nr=60,sr=20,ir=20,zt={maxDistance:240,minSpeedMultiplier:.2},ar=zt.maxDistance,qt={active:!1,offsetX:0,offsetY:0,distance:0,direction:0,pointerId:null},At=2.2,or=8,lr=120,cr=1/10,Ze={enabled:!0,size:40,offsetX:-80,offsetY:0,className:void 0,maxVisualDistance:ar,minSpeedMultiplier:zt.minSpeedMultiplier,opacity:.9,renderVisual:void 0,maxSpeedCurve:void 0},ur=n=>n?{mainSizeKey:"width",crossSizeKey:"height",positionKey:"left",selectDelta:(e,t)=>e,getPointerCoordinate:({clientX:e})=>e,arrowLabels:["Scroll left","Scroll right"],arrowIcons:["◀","▶"],directionClass:"aqvs-scrollbar-horizontal",orientation:"horizontal"}:{mainSizeKey:"height",crossSizeKey:"width",positionKey:"top",selectDelta:(e,t)=>t,getPointerCoordinate:({clientY:e})=>e,arrowLabels:["Scroll up","Scroll down"],arrowIcons:["▲","▼"],directionClass:"aqvs-scrollbar-vertical",orientation:"vertical"},fr=(n,e)=>{const t=n?.maxSpeedMultiplier,s=typeof t=="number"?t:Wt(e);return{enabled:n?.enabled??Ze.enabled,size:n?.size??Ze.size,offsetX:n?.offsetX??Ze.offsetX,offsetY:n?.offsetY??Ze.offsetY,className:n?.className??Ze.className,maxVisualDistance:n?.maxVisualDistance??Ze.maxVisualDistance,maxSpeedMultiplier:s,minSpeedMultiplier:Math.max(n?.minSpeedMultiplier??Ze.minSpeedMultiplier,0),opacity:J(n?.opacity??Ze.opacity,0,1),renderVisual:n?.renderVisual??Ze.renderVisual,maxSpeedCurve:n?.maxSpeedCurve??Ze.maxSpeedCurve}},dr=({isDragging:n,isThumbHovered:e,enableThumbDrag:t})=>r.useMemo(()=>t?n?"dragging":e?"hover":"idle":"disabled",[t,n,e]),mr=({canUseArrowButtons:n,enableArrowButtons:e,resetTapScroll:t,scrollByStep:s})=>{const i=r.useRef(null),a=r.useRef(null),l=r.useRef(null),u=r.useCallback(()=>{i.current!==null&&(window.clearInterval(i.current),i.current=null),a.current!==null&&(window.clearTimeout(a.current),a.current=null),l.current!==null&&(window.removeEventListener("pointerup",l.current),window.removeEventListener("pointercancel",l.current),window.removeEventListener("blur",l.current),l.current=null)},[]),d=r.useCallback(()=>{u()},[u]),x=r.useCallback(M=>E=>{if(!n)return;E.cancelable&&E.preventDefault(),E.stopPropagation(),t(),u(),s(M),a.current=window.setTimeout(()=>{i.current=window.setInterval(()=>{s(M)},nr)},rr);const h=()=>u();l.current=h,window.addEventListener("pointerup",h),window.addEventListener("pointercancel",h),window.addEventListener("blur",h)},[n,u,t,s]),I=r.useCallback(M=>E=>{e&&(E.key==="Enter"||E.key===" "||E.key==="Spacebar")&&(E.preventDefault(),s(M))},[e,s]);return r.useEffect(()=>{n||u()},[n,u]),r.useEffect(()=>()=>{u()},[u]),{handleArrowPointerDown:x,handleArrowPointerUp:d,handleArrowKeyDown:I}},pr=700,dt=(n,e)=>typeof n=="number"&&Number.isFinite(n)?n:e,Kt=({distance:n,maxDistance:e,viewportSize:t,minSpeedMultiplier:s,maxSpeedMultiplier:i,hasCustomMaxSpeedMultiplier:a,curve:l})=>{const u=Math.max(dt(n,0),0),d=dt(e,0),x=d>0?Math.min(u,d)/d:1,I=Math.max(dt(t,0),0),M=Math.max(dt(s,0),0),E=Math.max(dt(i,0),0),h=Math.max(I*M,40),N=a?h:1200,F=Math.max(I*E,N),U=l?Math.max(dt(l.exponentialScale,E),0):0,ie=l?Math.min(F,Math.max(I*U,h)):F,Q=Math.max(ie,h);let ee=x**1.1;if(l){const ve=Math.min(Math.max(dt(l.exponentialSteepness,0),0),pr);if(ve===0)ee=x;else{const V=Math.expm1(ve)||1;ee=Math.min(Math.max(Math.expm1(ve*x)/V,0),1)}}const ge=Math.min(Math.max(dt(l?.easedOffset,0),0),1);return h+(Q-h)*(ge+(1-ge)*ee)},Wt=n=>{if(!n||n<=0)return At;const e=Math.max(1,n),t=Math.log10(e),s=At+t*or;return J(s,At,lr)},Gt=({contentSize:n,viewportSize:e,scrollPosition:t,onScroll:s,enableThumbDrag:i=!0,enableTrackClick:a=!0,enableArrowButtons:l=!0,horizontal:u=!1,scrollBarWidth:d=12,className:x,ariaControls:I,tapScrollCircleOptions:M,itemCount:E,renderThumbOverlay:h,visibleStartIndex:N,visibleEndIndex:F})=>{const[U,ie]=r.useState(!1),[Q,ee]=r.useState(!1),[ge,ve]=r.useState(!1),V=r.useRef(null),L=r.useRef({pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1,captureTarget:null}),S=r.useRef({pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1}),j=r.useRef(t),G=r.useRef(s),P=r.useRef(qt),ae=r.useRef(null),K=r.useRef(null),T=r.useRef(null),B=r.useRef(0),q=r.useRef(0),Ye=r.useMemo(()=>fr(M,E),[E,M]),Ne=r.useMemo(()=>ur(u),[u]),{enabled:te,size:re,offsetX:W,offsetY:Z,className:Pe,maxVisualDistance:Ve,maxSpeedMultiplier:je,minSpeedMultiplier:y,opacity:lt,renderVisual:ne,maxSpeedCurve:C}=Ye,we=r.useRef({viewportSize:e,maxScrollPosition:Math.max(n-e,0),scrollBarVisible:n>e,effectiveTapMaxDistance:Math.max(Ve,1),tapCircleMaxSpeedMultiplier:je,tapCircleMinSpeedMultiplier:y,tapCircleMaxSpeedCurve:C,tapScrollCircleOptions:M,effectiveTrackLength:0,onScroll:s,scrollPosition:t}),{mainSizeKey:_e,crossSizeKey:Ke,positionKey:qe,selectDelta:g,getPointerCoordinate:_,arrowLabels:pe,arrowIcons:H,directionClass:Te,orientation:oe}=Ne,be=Math.max(Ve,1),Me=e/n,Se=Math.max(e-d*2,0),le=Me*Se,ke=Math.min(Math.max(Bt,le||0),Se||Bt),ce=n-e,se=Math.max(Se-ke,0),De=ce<=0||se<=0?0:J(t/ce*se,0,se),Be=De+ke/2,ye=n>e||U,Qe=ye&&l;r.useLayoutEffect(()=>{we.current={viewportSize:e,maxScrollPosition:ce,scrollBarVisible:ye,effectiveTapMaxDistance:be,tapCircleMaxSpeedMultiplier:je,tapCircleMinSpeedMultiplier:y,tapCircleMaxSpeedCurve:C,tapScrollCircleOptions:M,effectiveTrackLength:se,onScroll:s,scrollPosition:t}}),r.useLayoutEffect(()=>{j.current=t},[t]),r.useLayoutEffect(()=>{G.current=s},[s]),r.useEffect(()=>{i||ee(!1)},[i]);const $e=dr({isDragging:U,isThumbHovered:Q,enableThumbDrag:i}),Ce=r.useCallback((o,b)=>{const v=we.current,D=b??j.current;if(G.current){const Oe=G.current(o,D);if(typeof Oe=="number"&&Number.isFinite(Oe))return j.current=Oe,Oe}const z=typeof o=="function"?o(D):o,he=Math.max(v.maxScrollPosition,0),Ae=v.scrollBarVisible?J(z,0,he):0;return j.current=Ae,Ae},[]),m=r.useCallback(o=>{const b=we.current,v=j.current;if(!b.scrollBarVisible||b.maxScrollPosition<=0){const at=Ce(0,v),c=at-v;return{nextPosition:at,actualDelta:c,reachedBoundary:!0}}if(o===0)return{nextPosition:v,actualDelta:0,reachedBoundary:!1};const z=Ce(at=>J(at+o,0,b.maxScrollPosition),v),he=z-v,Ae=o<0&&v+o<=0,Oe=o>0&&v+o>=b.maxScrollPosition,xt=o<0&&(z<=0||Ae&&he===0)||o>0&&(z>=b.maxScrollPosition||Oe&&he===0);return{nextPosition:z,actualDelta:he,reachedBoundary:xt}},[Ce]),R=r.useCallback((o,b)=>{o.current+=b;const v=Math.max(we.current.maxScrollPosition,0);v>0&&(o.current=J(o.current,-v,v));const D=m(o.current);return o.current-=D.actualDelta,D.reachedBoundary&&(o.current=0),D},[m]),ue=r.useCallback(()=>{K.current!==null&&(window.cancelAnimationFrame(K.current),K.current=null),T.current=null,B.current=0,q.current=0},[]),xe=r.useCallback(()=>{P.current={...qt},ve(!1),ae.current?.reset(),ue()},[ue]),Ee=r.useCallback(o=>{const b=P.current,v=we.current;if(!b.active||b.direction===0){ue();return}if(!v.scrollBarVisible||v.maxScrollPosition<=0){ue();return}const D=T.current??o,z=Math.max((o-D)/1e3,0),he=Math.min(z,cr);if(T.current=o,he<=0){K.current=window.requestAnimationFrame(Ee);return}const Ae=Kt({distance:b.distance,maxDistance:v.effectiveTapMaxDistance,viewportSize:v.viewportSize,minSpeedMultiplier:v.tapCircleMinSpeedMultiplier,maxSpeedMultiplier:v.tapCircleMaxSpeedMultiplier,hasCustomMaxSpeedMultiplier:typeof v.tapScrollCircleOptions?.maxSpeedMultiplier=="number",curve:v.tapCircleMaxSpeedCurve});q.current!==b.direction&&(q.current=b.direction,B.current=0);const{reachedBoundary:Oe}=R(B,b.direction*Ae*he);if(Oe){ue();return}K.current=window.requestAnimationFrame(Ee)},[R,ue]),et=r.useCallback(()=>{K.current===null&&(T.current=null,B.current=0,K.current=window.requestAnimationFrame(Ee))},[Ee]);r.useEffect(()=>{const o=P.current;!o.active||o.direction===0||et()},[n,e,et]),r.useEffect(()=>()=>{ue()},[ue]);const We=r.useCallback(o=>{P.current=o,ve(o.active),o.active&&o.direction!==0?et():ue()},[et,ue]);r.useEffect(()=>{te||xe()},[xe,te]),r.useEffect(()=>{const o=b=>{const D=b.detail?.paneId;D&&I&&D!==I||xe()};return window.addEventListener(Ft,o),()=>{window.removeEventListener(Ft,o)}},[I,xe]),r.useEffect(()=>{if(!te)return;const o=b=>{if(!P.current.active||P.current.pointerId===b.pointerId)return;const v=b.target;if(!(v instanceof Node)){xe();return}ae.current?.getElement()?.contains(v)||xe()};return document.addEventListener("pointerdown",o,!0),()=>{document.removeEventListener("pointerdown",o,!0)}},[xe,te]);const Ge=o=>{if(!ye||se<=0||ce<=0)return 0;const b=J(o,0,se);return J(b/se*ce,0,ce)},Xe=r.useCallback(o=>{const{scrollBarVisible:b,effectiveTrackLength:v,maxScrollPosition:D}=we.current;if(w.debug("[ScrollBar] calculateScrollPositionFromThumb",()=>({thumbPos:o,trackLen:v,maxScroll:D})),v<=0||D<=0)return null;const z=J(o,0,v);return J(z/v*D,0,D)},[]),tt=r.useCallback(o=>{const b=o.getBoundingClientRect(),v=u?b.width:b.height,D=xt=>{const at=Number.parseFloat(xt);return Number.isFinite(at)?at:0},z=window.getComputedStyle(o),he=D(u?z.width:z.height),Ae=he>0?he+D(u?z.paddingLeft:z.paddingTop)+D(u?z.paddingRight:z.paddingBottom)+D(u?z.borderLeftWidth:z.borderTopWidth)+D(u?z.borderRightWidth:z.borderBottomWidth):0,Oe=Ae>0?Ae:u?o.offsetWidth:o.offsetHeight;return Oe<=0||v<=0?1:v/Oe},[u]),ct=r.useCallback(o=>{const b=L.current;if(b.pointerId!==o.pointerId)return;const v=o.clientX-b.startClientX,D=o.clientY-b.startClientY,z=g(v,D)/(b.scale||1);w.debug("[ScrollBar] handleThumbPointerMove",()=>({delta:z,startThumbPosition:b.startThumbPosition,clientY:o.clientY,startClientY:b.startClientY,metrics:we.current}));const he=Xe(b.startThumbPosition+z);he!==null&&Ce(he),o.cancelable&&o.preventDefault()},[g,Xe,Ce]),Ue=r.useCallback(o=>{const b=L.current;if(b.pointerId!==o.pointerId)return;document.removeEventListener("pointermove",ct),document.removeEventListener("pointerup",Ue),document.removeEventListener("pointercancel",Ue);const v=b.captureTarget;if(v?.hasPointerCapture?.(o.pointerId)&&v.releasePointerCapture(o.pointerId),L.current={pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1,captureTarget:null},ie(!1),V.current){const D=V.current.getBoundingClientRect();o.clientX>=D.left&&o.clientX<=D.right&&o.clientY>=D.top&&o.clientY<=D.bottom||ee(!1)}else ee(!1)},[ct]);r.useEffect(()=>()=>{document.removeEventListener("pointermove",ct),document.removeEventListener("pointerup",Ue),document.removeEventListener("pointercancel",Ue)},[ct,Ue]);const Tt=r.useRef(0),fe=r.useRef(0),ut=r.useCallback(o=>{const b=Math.max(Math.round(we.current.viewportSize/ir),sr);fe.current!==o&&(fe.current=o,Tt.current=0),R(Tt,o*b)},[R]),{handleArrowPointerDown:vt,handleArrowPointerUp:bt,handleArrowKeyDown:He}=mr({canUseArrowButtons:Qe,enableArrowButtons:l,resetTapScroll:xe,scrollByStep:ut}),Pt=o=>{if(!ye)return;if(!i){o.preventDefault(),o.stopPropagation();return}if(o.pointerType==="mouse"&&o.button!==0||o.ctrlKey)return;xe();const b=o.currentTarget,v=tt(b);let D=null;if(b.setPointerCapture)try{b.setPointerCapture(o.pointerId),D=b}catch{D=null}L.current={pointerId:o.pointerId,startThumbPosition:De,startClientX:o.clientX,startClientY:o.clientY,scale:v,captureTarget:D},document.addEventListener("pointermove",ct),document.addEventListener("pointerup",Ue),document.addEventListener("pointercancel",Ue),ie(!0),ee(!0),o.preventDefault(),o.stopPropagation()},yt=o=>{if(!ye)return;if(!a){o.preventDefault(),o.stopPropagation();return}if(o.pointerType==="mouse"&&o.button!==0||o.ctrlKey)return;const b=o.currentTarget,v=b.getBoundingClientRect(),D=_(o),z=tt(b),he=(D-(u?v.left:v.top))/z;xe();const Ae=he-ke/2,Oe=Ge(Ae);if(Ce(Oe),b.setPointerCapture)try{b.setPointerCapture(o.pointerId)}catch{}S.current={pointerId:o.pointerId,startThumbPosition:Ae,startClientX:o.clientX,startClientY:o.clientY,scale:z},o.preventDefault(),o.stopPropagation()},mt=()=>{S.current={pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1}},Ct=o=>{const b=S.current;if(b.pointerId!==o.pointerId)return;if(o.pointerType==="mouse"&&o.buttons===0){mt();return}const v=o.clientX-b.startClientX,D=o.clientY-b.startClientY,z=g(v,D)/(b.scale||1),he=Ge(b.startThumbPosition+z);Ce(he),o.cancelable&&o.preventDefault()},kt=o=>{if(S.current.pointerId!==o.pointerId)return;const b=o.currentTarget;b.hasPointerCapture?.(o.pointerId)&&b.releasePointerCapture(o.pointerId),mt(),o.preventDefault(),o.stopPropagation()},rt=o=>{if(S.current.pointerId!==o.pointerId)return;const b=o.currentTarget;b.hasPointerCapture?.(o.pointerId)&&b.releasePointerCapture(o.pointerId),mt()},ft=o=>{o.target===o.currentTarget&&S.current.pointerId===o.pointerId&&mt()},nt=r.useMemo(()=>J((ge?1:.8)*lt,0,1),[ge,lt]),st=r.useMemo(()=>{const b=`calc(50% - ${re/2}px + ${Z}px)`;return{left:W,top:b}},[W,Z,re]),it=(o,b,v,D)=>Y.jsx("button",{type:"button",tabIndex:0,className:"aqvs-scrollbar-arrow-button",style:{[_e]:d,[Ke]:d},"aria-label":b,onPointerDown:vt(o),onPointerUp:bt,onPointerLeave:bt,onPointerCancel:bt,onKeyDown:He(o),"aria-disabled":!l,disabled:!Qe,children:Y.jsx("span",{"aria-hidden":"true",children:v})},D),pt=h&&ye?{orientation:oe,scrollPosition:t,maxScrollPosition:ce,contentSize:n,viewportSize:e,thumbSize:ke,thumbPosition:De,thumbCenter:Be,trackSize:Se,isDragging:U,isTapScrollActive:ge,visibleStartIndex:N,visibleEndIndex:F}:null;return Y.jsxs("div",{className:gt.twMerge("aqvs-scrollbar",Te,!ye&&"pointer-events-none opacity-0",x),style:{[_e]:e,[Ke]:d},role:"scrollbar",tabIndex:-1,"aria-controls":I,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":ce,"aria-orientation":u?"horizontal":"vertical",children:[!u&&ye&&te&&Y.jsx(Ut,{ref:ae,className:gt.twMerge("aqvs-scrollbar-tap-circle-wrapper",Pe),size:re,maxVisualDistance:be,style:st,opacity:nt,renderVisual:ne,onDragChange:We},"tap-circle"),it(-1,pe[0],H[0],"arrow-start"),Y.jsxs("div",{className:"aqvs-scrollbar-track",style:{borderRadius:d/2},onPointerDown:yt,onPointerMove:Ct,onPointerUp:kt,onPointerCancel:rt,onLostPointerCapture:ft,"aria-disabled":!a,children:[pt&&Y.jsx("div",{className:"aqvs-scrollbar-overlay","aria-hidden":!0,children:h?.(pt)},"overlay"),Y.jsx("div",{className:gt.twMerge("aqvs-scrollbar-thumb-wrapper",!(ye||U)&&"pointer-events-none opacity-0"),style:{[_e]:ke,[qe]:De,...u?{top:0,bottom:0}:{left:0,right:0}},onPointerDown:Pt,role:"slider","aria-orientation":u?"horizontal":"vertical","aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":ce,"aria-disabled":!i,tabIndex:-1,children:Y.jsx("div",{ref:V,className:gt.twMerge("aqvs-scrollbar-thumb",u?"aqvs-scrollbar-thumb-horizontal":"aqvs-scrollbar-thumb-vertical"),"data-testid":"aqvs-scrollbar-thumb","data-thumb-state":$e,style:{borderRadius:d-1,cursor:i?"pointer":"default"},onMouseEnter:()=>{i&&ee(!0)},onMouseLeave:()=>{i&&ee(!1)}},"thumb")},"thumb-wrapper")]},"track"),it(1,pe[1],H[1],"arrow-end")]})},hr=["mouse","pen","touch"],Lt=(n,e)=>!(n==="mouse"||n==="pen"||n==="touch")||e.includes(n),gr=n=>n==="mouse"||n==="pen",St={maxVelocity:6,minVelocity:.02,deceleration:.0025,velocitySampleWindow:90,startVelocityThreshold:.04},wt=(n,e,t)=>{for(const[s,i,a]of e)t==="add"?n.addEventListener(s,i,a):n.removeEventListener(s,i,a)},Zt=r.forwardRef(({children:n,contentSize:e,viewportSize:t,scrollBarWidth:s=12,enableThumbDrag:i=!0,enableTrackClick:a=!0,enableArrowButtons:l=!0,enablePointerDrag:u=!0,pointerDragInputs:d=hr,onScroll:x,className:I,testId:M,style:E,background:h,tapScrollCircleOptions:N,inertiaOptions:F,itemCount:U,renderThumbOverlay:ie,wheelSpeedMultiplier:Q=1,onWheelHorizontal:ee,contentInsets:ge,visibleStartIndex:ve,visibleEndIndex:V,renderOverlay:L,initialScrollPosition:S=0,contentProps:j},G)=>{const P=r.useRef(Number.isFinite(S)?Math.max(0,S):0),ae=r.useRef(null),K=r.useRef(null),T=r.useRef(ee);r.useEffect(()=>{T.current=ee},[ee]);const B=r.useRef({frame:null,velocity:0,lastTimestamp:null,generation:0}),q=r.useMemo(()=>({maxVelocity:F?.maxVelocity??St.maxVelocity,minVelocity:F?.minVelocity??St.minVelocity,deceleration:F?.deceleration??St.deceleration,velocitySampleWindow:F?.velocitySampleWindow??St.velocitySampleWindow,startVelocityThreshold:F?.startVelocityThreshold??St.startVelocityThreshold}),[F]),Ye=r.useMemo(()=>({top:Math.max(0,ge?.top??0),bottom:Math.max(0,ge?.bottom??0)}),[ge]);w.debug("[ScrollPane] ScrollPane rendered",()=>({contentSize:e,viewportSize:t,scrollBarWidth:s,className:I,style:E,tapScrollCircleOptions:N,inertiaOptions:F,enablePointerDrag:u,contentInsets:Ye}));const Ne=r.useRef({contentSize:e,viewportSize:t});Ne.current={contentSize:e,viewportSize:t};const te=r.useMemo(()=>e>t,[e,t]),re=r.useCallback(g=>{const{contentSize:_,viewportSize:pe}=Ne.current,H=_>pe,Te=P.current;if(w.debug("[ScrollPane] scrollTo called",()=>({newPosition:g,contentSize:_,viewportSize:pe,currentIsScrollable:H,prevPosition:Te})),!H)return P.current!==0&&(P.current=0,x?.(0,Te)),P.current;const oe=typeof g=="function"?g(P.current):g;if(!Number.isFinite(oe))return w.warn("[ScrollPane] scrollTo received a non-finite position; keeping the current position",{nextPosition:oe}),P.current;const be=Math.max(_-pe,0),Me=J(oe,0,be);return P.current!==Me&&(P.current=Me,x?.(Me,Te)),P.current},[x]),W=r.useRef(re);r.useEffect(()=>{W.current=re},[re]);const Z=r.useCallback(()=>{const g=B.current;g.generation+=1,g.frame!==null&&cancelAnimationFrame(g.frame),g.frame=null,g.velocity=0,g.lastTimestamp=null},[]),Pe=r.useRef(Z);r.useEffect(()=>{Pe.current=Z},[Z]),r.useEffect(()=>()=>{Pe.current()},[]);const Ve=r.useCallback(g=>{if(!te)return;const{maxVelocity:_,minVelocity:pe,deceleration:H,startVelocityThreshold:Te}=q,oe=J(g,-_,_);if(Math.abs(oe)<Te)return;Z(),B.current.velocity=oe,B.current.lastTimestamp=null;const be=B.current.generation,Me=Se=>{const le=B.current;if(le.generation!==be)return;if(le.lastTimestamp===null){le.lastTimestamp=Se,le.frame=requestAnimationFrame(Me);return}const ke=Se-le.lastTimestamp;if(le.lastTimestamp=Se,ke<=0){le.frame=requestAnimationFrame(Me);return}const ce=le.velocity;let se=ce;const De=H*ke;ce>0?se=Math.max(0,ce-De):ce<0&&(se=Math.min(0,ce+De));const ye=(ce+se)/2*ke,Qe=P.current;if(ye!==0&&W.current(xe=>xe+ye),B.current.generation!==be)return;const $e=P.current,{contentSize:Ce,viewportSize:m}=Ne.current,R=Math.max(Ce-m,0);le.velocity=se;const ue=$e===Qe||$e<=0&&se<=0||$e>=R&&se>=0;if(Math.abs(se)<pe||ue){Z();return}le.frame=requestAnimationFrame(Me)};B.current.frame=requestAnimationFrame(Me)},[te,q,Z]),je=r.useRef(Ve);r.useEffect(()=>{je.current=Ve},[Ve]),r.useLayoutEffect(()=>{Ne.current={contentSize:e,viewportSize:t}},[e,t]),r.useLayoutEffect(()=>{const g=K.current;if(!g)return;const _=()=>{g.scrollTop!==0&&(w.debug("[ScrollPane] Native scroll detected, resetting to 0",()=>({scrollTop:g.scrollTop})),g.scrollTop=0),g.scrollLeft!==0&&(g.scrollLeft=0)};return g.addEventListener("scroll",_),()=>g.removeEventListener("scroll",_)},[]),r.useLayoutEffect(()=>{if(te){w.debug("[ScrollPane] Adjusting scroll position due to content or viewport size change",()=>({contentSize:e,viewportSize:t,scrollPosition:P.current}));const g=J(e-t,0,e);P.current>g&&re(g)}else re(0)},[te,re,e,t]),r.useEffect(()=>{const g=H=>{if(H.ctrlKey)return;const Te=H.shiftKey&&H.deltaX===0,oe=Te?H.deltaY:H.deltaX,be=Te?0:H.deltaY;if(oe!==0&&Math.abs(oe)>=Math.abs(be)){if(T.current){H.preventDefault(),Z();let le=oe;H.deltaMode===1?le*=16:H.deltaMode===2&&(le*=t),T.current(le)}return}if(!te||H.deltaY===0)return;H.preventDefault(),Z();let Se=H.deltaY;H.deltaMode===1?Se*=16:H.deltaMode===2&&(Se*=t),Q!==1&&(Se*=Q),w.debug("[ScrollPane] wheel event",()=>({deltaY:Se,scrollPosition:P.current,wheelSpeedMultiplier:Q,deltaMode:H.deltaMode,scrollTop:K.current?.scrollTop})),re(le=>le+Se)},_=()=>{Z()},pe=ae.current;return pe&&(pe.addEventListener("wheel",g,{passive:!1}),pe.addEventListener("pointerdown",_,{capture:!0,passive:!0})),()=>{pe&&(pe.removeEventListener("wheel",g),pe.removeEventListener("pointerdown",_,{capture:!0}))}},[te,re,Z,t,Q]),r.useImperativeHandle(G,()=>({scrollTo:g=>(Z(),re(g)),getScrollPosition:()=>P.current,getContentSize:()=>e,getViewportSize:()=>t}),[re,e,t,Z]);const y=r.useId(),lt=j?.id??y,ne=r.useRef({pointerType:"",pointerId:null,startClientY:0,startScroll:0,isDragging:!1,shouldCancelNextClick:!1,clickResetTimer:null,velocitySamples:[]}),C=r.useRef(u),we=r.useRef(d);r.useEffect(()=>{C.current=u},[u]),r.useEffect(()=>{we.current=d},[d]);const _e=r.useRef(te);r.useEffect(()=>{_e.current=te},[te]);const Ke=r.useRef(q);r.useEffect(()=>{Ke.current=q},[q]),r.useEffect(()=>{const g=ne.current;if(u&&te&&(g.pointerId===null||Lt(g.pointerType,d))||g.pointerId===null)return;const _=K.current;g.clickResetTimer!==null&&(window.clearTimeout(g.clickResetTimer),g.clickResetTimer=null);const pe=g.isDragging&&g.shouldCancelNextClick,H=g.pointerId;g.pointerId=null,g.pointerType="",g.startClientY=0,g.startScroll=0,g.isDragging=!1,g.shouldCancelNextClick=pe,g.velocitySamples=[],_?.hasPointerCapture(H)&&_.releasePointerCapture(H)},[u,d,te]),r.useEffect(()=>{const g=K.current;if(!g)return;const _=6,pe=()=>typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now(),H=()=>{const m=ne.current;m.pointerId=null,m.pointerType="",m.startClientY=0,m.startScroll=0,m.isDragging=!1,m.velocitySamples=[]},Te=()=>{const m=ne.current;m.clickResetTimer!==null&&(window.clearTimeout(m.clickResetTimer),m.clickResetTimer=null)},oe=m=>{const R=ne.current,ue=pe();R.velocitySamples.push({clientY:m,time:ue});const xe=Ke.current.velocitySampleWindow;R.velocitySamples=R.velocitySamples.filter(Ee=>ue-Ee.time<=xe)},be=m=>m instanceof HTMLElement&&m.closest("[data-scrollpane-ignore-drag='true']")!==null,Me=m=>{const R=ne.current;R.shouldCancelNextClick&&(m.preventDefault(),m.stopPropagation(),R.shouldCancelNextClick=!1)},Se=m=>{const R=ne.current;if(!R.isDragging){if(R.isDragging=!0,R.shouldCancelNextClick=!0,!g.hasPointerCapture(m.pointerId))try{g.setPointerCapture(m.pointerId)}catch{}oe(m.clientY)}},le=m=>m.isTrusted||m.target===g,ke=m=>{const R=ne.current;g.hasPointerCapture(m)&&g.releasePointerCapture(m),R.shouldCancelNextClick=!1,Te(),H()},ce=m=>{const R=ne.current;if(R.pointerId!==m.pointerId)return;if(m.buttons===0&&gr(m.pointerType)){ke(m.pointerId);return}if(!(C.current&&_e.current)||!Lt(m.pointerType,we.current)||!R.isDragging&&(Math.abs(m.clientY-R.startClientY)<_||(Se(m),!R.isDragging)))return;oe(m.clientY);const ue=m.clientY-R.startClientY,xe=R.startScroll-ue;W.current(xe),m.cancelable&&m.preventDefault()},se=()=>{const m=ne.current;return m.pointerId!==null||!m.shouldCancelNextClick?!1:(Te(),m.clickResetTimer=window.setTimeout(()=>{const R=ne.current;R.shouldCancelNextClick=!1,R.clickResetTimer=null},0),!0)},De=m=>{const R=ne.current;if(R.pointerId!==m.pointerId){se();return}R.isDragging&&R.shouldCancelNextClick&&m.cancelable&&(m.preventDefault(),m.stopPropagation()),R.isDragging&&oe(m.clientY);let ue=0;if(R.isDragging&&R.velocitySamples.length>=2){const Ee=R.velocitySamples,et=Ke.current.velocitySampleWindow,We=Ee[Ee.length-1],Ge=Ee.find(Xe=>We.time-Xe.time<=et)??Ee[0];if(We&&Ge&&We.time!==Ge.time){const Xe=We.clientY-Ge.clientY,tt=We.time-Ge.time;ue=-(Xe/tt)}}Te(),R.shouldCancelNextClick&&(R.clickResetTimer=window.setTimeout(()=>{const Ee=ne.current;Ee.shouldCancelNextClick=!1,Ee.clickResetTimer=null},0));const xe=Ke.current.startVelocityThreshold;H(),g.hasPointerCapture(m.pointerId)&&g.releasePointerCapture(m.pointerId),Math.abs(ue)>=xe&&je.current?.(ue)},Be=m=>{if(ne.current.pointerId!==null){if(!m.isPrimary||m.pointerType!==ne.current.pointerType)return;ke(ne.current.pointerId)}if(ne.current.shouldCancelNextClick&&(Te(),ne.current.shouldCancelNextClick=!1),!(C.current&&_e.current)||!Lt(m.pointerType,we.current)||m.button!==0&&m.pointerType==="mouse"||m.ctrlKey||m.metaKey||m.altKey||be(m.target))return;window.dispatchEvent(new CustomEvent(Ft,{detail:{paneId:y}})),Pe.current?.();const R=ne.current;Te(),R.pointerId=m.pointerId,R.pointerType=m.pointerType,R.startClientY=m.clientY,R.startScroll=P.current,R.isDragging=!1,R.shouldCancelNextClick=!1,R.velocitySamples=[]},ye=m=>{if(ne.current.pointerId!==m.pointerId){se();return}le(m)&&ke(m.pointerId)},$e=[["click",Me,!0],["pointerdown",Be,{passive:!1}],["lostpointercapture",m=>{m.target!==g||ne.current.pointerId!==m.pointerId||ke(m.pointerId)},void 0]],Ce=[["pointermove",ce,{passive:!1}],["pointerup",De,void 0],["pointercancel",ye,void 0]];return wt(g,$e,"add"),wt(window,Ce,"add"),()=>{wt(g,$e,"remove"),wt(window,Ce,"remove");const m=ne.current;m.pointerId!==null&&g.hasPointerCapture(m.pointerId)&&g.releasePointerCapture(m.pointerId),Te(),H()}},[y]);const qe=r.useCallback(g=>(Z(),re(g)),[re,Z]);return Y.jsxs("div",{ref:ae,"data-testid":M,className:gt.twMerge("aqvs-scroll-pane",I),style:E,children:[Y.jsxs("div",{ref:K,className:gt.twMerge("aqvs-scroll-pane-content"),"data-testid":"aqvs-scroll-pane-content",style:{height:t,paddingTop:Ye.top,paddingBottom:Ye.bottom,...u&&te&&d.some(g=>g==="touch"||g==="pen")?{touchAction:"none"}:{}},...j,id:lt,children:[h,n(P.current)]}),Y.jsx(Gt,{contentSize:e,viewportSize:t,scrollPosition:P.current,onScroll:qe,enableThumbDrag:i,enableTrackClick:a,enableArrowButtons:l,scrollBarWidth:s,ariaControls:lt,tapScrollCircleOptions:N,itemCount:U,renderThumbOverlay:ie,visibleStartIndex:ve,visibleEndIndex:V},"scrollbar"),L?.()]})}),Ht=(n,e,t)=>Math.min(Math.max(n,e),t),br=({dragState:n,normalizedDistance:e,sizeScale:t,size:s})=>{const i=Math.max(s/2,1),a=1+e*.65,l=Math.max(.65,1-e*.25),u=n.direction*e*26*t,d=.8+e*.18,x=3*t,I=6*t,M=22*t,E=Math.abs(u)+I,h=u>0?x:-Math.abs(u)-x,N=Math.max(2.5,3*t),F=Ht(n.offsetX,-i,i),U=Ht(n.offsetY,-i,i),ie=i*.35,Q=F/i*ie,ee=U/i*ie,ge=Q*.45,ve=ee*.45,V=Math.max(M*.38,6),L=.65+e*.2,S=n.active;return Y.jsxs(Y.Fragment,{children:[Y.jsx("div",{className:"aqvs-tap-scroll-circle-gradient",style:{transform:`scale(${l}, ${a})`,transition:S?"40ms transform ease-out":"200ms ease transform"}}),Y.jsx("div",{className:"aqvs-sample-visual-pupil",style:{width:M,height:M,transform:`translate(calc(-50% + ${Q}px), calc(-50% + ${ee}px)) scale(${l}, ${d*a})`,transition:S?"70ms transform ease-out":"200ms ease transform"}}),Y.jsx("div",{className:"aqvs-sample-visual-highlight",style:{width:V,height:V,transform:`translate(calc(-50% + ${ge}px), calc(-50% + ${ve}px)) scale(${l}, ${a})`,opacity:L,boxShadow:"0 0 8px rgba(255,255,255,0.45)",transition:S?"120ms opacity 150ms, 120ms transform ease-out ease-out":"220ms ease transform, 240ms opacity ease"}}),Y.jsx("div",{className:"aqvs-sample-visual-rod",style:{width:N,height:E,transform:`translate(-50%, ${h}px)`,opacity:e,transition:S?"40ms height, 60ms opacity ease-out ease-out":"200ms ease height, 120ms ease opacity"}})]})},Et=100,xr=n=>{if(!Number.isFinite(n))return 0n;const e=Math.trunc(n);return e<=0?0n:BigInt(e)},_t=(n,e)=>{if(!Number.isFinite(n))throw new Error(`valueFn returned a non-finite value at index ${e}: ${n}`);return n},It=n=>{if(n<=0||!Number.isFinite(n))return 0;const e=Math.trunc(n);if(e<=2147483647)return e&-e;const t=BigInt(e)&-BigInt(e);return Number(t)};class ot{tree;deltas;size;baseValue;valueFn;total;constructor(e,t,s){this.reset(e,t,s)}reset(e,t,s){const i=Number.isFinite(e)&&e>0?Math.trunc(e):0;if(typeof t!="function"){this.size=i,this.tree=new Map,this.deltas=new Map,this.valueFn=void 0,this.baseValue=t,this.total=this.baseValue*this.size;return}let a=0,l;if(i>0){const u=s?.sampleRange??{from:0,to:Math.min(Et-1,i-1)};let d=Math.max(0,Math.trunc(u.from)),x=Math.min(Math.trunc(u.to),i-1);if(d>x&&(d=0,x=Math.min(Et-1,i-1)),i>Et)a=ot._sampleBaseValueStrided(t,i,Et),s?.materialize&&(l={from:d,values:ot._collectValidatedValues(t,d,x)});else{const I=ot._collectValidatedValues(t,d,x);a=ot._modeOrMedian([...I]),s?.materialize&&(l={from:d,values:I})}}if(this.size=i,this.tree=new Map,this.deltas=new Map,this.total=void 0,this.valueFn=t,this.baseValue=a,l)for(let u=0;u<l.values.length;u++){const d=l.from+u;if(d>=this.size)break;const x=l.values[u]-this.baseValue;x!==0&&(this.deltas.set(d,x),this._updateTree(d,x))}this.total=this.getTotal()}setValueFn(e,t){if(t?.reset){this.reset(this.size,e);return}typeof e=="function"?this.valueFn=e:(this.valueFn=void 0,this.baseValue=e,this.total=this._computeTreeTotal())}static _collectValidatedValues(e,t,s){const i=[];for(let a=t;a<=s;a++)i.push(_t(e(a),a));return i}static _modeOrMedian(e){if(e.length===0)return 0;e.sort((l,u)=>l-u);const t=Math.floor(e.length/2);let s;e.length%2===0?s=Math.floor((e[t-1]+e[t])/2):s=e[t];const i=new Map;let a=0;for(const l of e){const u=(i.get(l)??0)+1;i.set(l,u),u>a&&(a=u)}if(a>e.length*.2){const l=[];for(const[d,x]of i.entries())x===a&&l.push(d);const u=l.reduce((d,x)=>d+x,0);s=Math.floor(u/l.length)}return s}static _sampleBaseValueStrided(e,t,s){if(t<=0)return 0;let i=Math.max(1,Math.ceil(t/s));i%2===0&&(i+=1);const a=[];for(let l=0;l<t&&a.length<s;l+=i)a.push(_t(e(l),l));return ot._modeOrMedian(a)}update(e,t){return this.updates([{index:e,value:t}])}updates(e){const t=this._buildDeltaUpdates(e);return t.length>0?this.updateDeltas(t):this.total}updateDelta(e,t){return this.updateDeltas([{index:e,change:t}])}updateDeltas(e){const t=new Map;for(const{index:s,change:i}of e){if(s<0||s>=this.size)throw new Error(`Index ${s} out of bounds`);if(!Number.isInteger(s))throw new Error(`Index must be an integer: ${s}`);if(!Number.isFinite(i))throw new Error(`Change must be a finite number: ${i}`);const l=(t.get(s)??this.deltas.get(s)??0)+i;if(l+this.baseValue<-1e-9)throw new Error(`Change would make the value at index ${s} negative: ${l+this.baseValue}`);t.set(s,l)}for(const{index:s,change:i}of e){const l=(this.deltas.get(s)??0)+i;l===0?this.deltas.delete(s):this.deltas.set(s,l),this._updateTree(s,i)}return this.total}_updateTree(e,t){if(t===0)return;let s=e+1;for(;s<=this.size;){this.tree.set(s,(this.tree.get(s)??0)+t);const i=It(s);if(i===0)break;s+=i}this.total!==void 0&&(this.total+=t)}_buildDeltaUpdates(e){const t=[],s=new Map;for(const{index:i,value:a}of e){if(i<0||i>=this.size)throw new Error(`Index ${i} out of bounds`);if(!Number.isInteger(i))throw new Error(`Index must be an integer: ${i}`);if(!Number.isFinite(a))throw new Error(`Value must be a finite number: ${a}`);if(a<0)throw new Error("Value cannot be negative.");const l=s.has(i)?s.get(i)??0:this.deltas.get(i)??0,u=l+this.baseValue,d=a-u;d!==0&&t.push({index:i,change:d}),s.set(i,l+d)}return t}_computeTreeTotal(){if(this.size<=0)return 0;let e=0,t=this.size;for(;t>0;){e+=this.tree.get(t)??0;const s=It(t);if(s===0)break;t-=s}return e+this.baseValue*this.size}_materialize(e,t=!0){if(this.valueFn){const s=this.deltas.get(e)??0,a=_t(this.valueFn(e),e)-this.baseValue;if(a!==s&&(a===0?this.deltas.delete(e):this.deltas.set(e,a),t)){const l=a-s;this._updateTree(e,l)}}}_materializeRanges(e,t,s=!1){if(!(e?.materialize&&this.valueFn))return;const i=e.ranges;if(i&&i.length>0){for(const u of i){const d=Math.max(0,Math.trunc(u.from)),x=Math.min(Math.trunc(u.to),this.size-1);for(let I=d;I<=x;I++)this._materialize(I)}if(t===void 0)return;if(s){this._materialize(t);return}const a=i[0].from,l=i[i.length-1].to;t>=a&&t<=l&&this._materialize(t);return}t!==void 0&&this._materialize(t)}_findIndex(e,t={},s){if(this.size>=1073741824)return this._findIndexLarge(e,t,s);if(this.size===0)return{index:-1,total:this.total??0,cumulative:void 0,currentValue:void 0,safeIndex:void 0};this._materializeRanges(t.materializeOption);const i=t.materializeOption?.materialize===!0;let a;for(;;){if(a=this._descend(e,s),a<0||a>=this.size)return{index:-1,total:this.total??this.getTotal(),cumulative:void 0,currentValue:void 0,safeIndex:void 0};if(!i)break;const u=this.deltas.get(a)??0;if(this._materialize(a),(this.deltas.get(a)??0)===u)break}const l=this.prefixSum(a);return{index:a,total:this.total??l.total,cumulative:l.cumulative,currentValue:l.currentValue,safeIndex:l.safeIndex}}_descend(e,t){let s=0,i=0,a=1;for(;a<<1<=this.size;)a<<=1;for(;a>0;a>>=1){const l=s+a;if(l<=this.size){const d=(this.tree.get(l)??0)+this.baseValue*a;(t?i+d<e:i+d<=e)&&(s=l,i+=d)}}return t?s:s-1}_findIndexLarge(e,t,s){if(this.size===0)return{index:-1,total:this.total??0,cumulative:void 0,currentValue:void 0,safeIndex:void 0};const i=xr(this.size);if(i===0n)return{index:-1,total:this.total??0,cumulative:void 0,currentValue:void 0,safeIndex:void 0};this._materializeRanges(t.materializeOption);const a=t.materializeOption?.materialize===!0;for(;;){let l=0n,u=i-1n,d,x,I=this.total;for(;l<=u;){const h=l+u>>1n,N=Number(h),F=this.prefixSum(N);if(I=F.total,s?F.cumulative>=e:F.cumulative<=e)if(d=h,x=F,s){if(h===0n)break;u=h-1n}else l=h+1n;else if(s)l=h+1n;else{if(h===0n)break;u=h-1n}}const M=x,E=d!==void 0?Number(d):-1;if(a&&E>=0){const h=this.deltas.get(E)??0;if(this._materialize(E),(this.deltas.get(E)??0)!==h)continue}return{index:E,total:I,cumulative:M?.cumulative,currentValue:M?.currentValue,safeIndex:M?.safeIndex}}}prefixSum(e,t){if(e<0||Number.isNaN(e))return{cumulative:0,total:this.total,currentValue:0,safeIndex:0};if(this.size===0)return{cumulative:0,total:this.total??0,currentValue:0,safeIndex:0};const s=J(Math.trunc(e),0,this.size-1),i=t?.materializeOption;this._materializeRanges(i,s,!0);let a=0,l=s+1;for(;l>0;){const d=this.tree.get(l)??0;a+=d;const x=It(l);if(x===0)break;l-=x}const u=i?.materialize?this.get(s):(this.deltas.get(s)||0)+this.baseValue;return{cumulative:a+this.baseValue*(s+1),total:this.total,currentValue:u,safeIndex:s}}get(e,t){if(this.size===0)return 0;if(!Number.isInteger(e)||e<0||e>=this.size)throw new Error("Index out of bounds");const s=t?.materializeOption;return this._materializeRanges(s,e),(this.deltas.get(e)??0)+this.baseValue}getTotal(e){const t=e?.materializeOption;if(this._materializeRanges(t),this.total===void 0)if(this.size===0)this.total=0;else{this.total=this._computeTreeTotal();const s=this.prefixSum(this.getSize()-1);s.cumulative!==s.total&&w.error("Inconsistent Fenwick Tree state")}return this.total}rebuildTree(e){if(e?.materialize&&this.valueFn){const s=this.valueFn;this.reset(this.size,i=>s(i),{materialize:!0});return}const t=new Map;for(const[s,i]of this.deltas.entries()){if(i===0)continue;let a=s+1;for(;a<=this.size;){t.set(a,(t.get(a)??0)+i);const l=It(a);if(l===0)break;a+=l}}this.tree=t,this.total=this._computeTreeTotal()}calculateAccumulatedError(){if(this.total===void 0)return 0;let e=this.baseValue*this.size;for(const[t,s]of this.deltas)t<this.size&&(e+=s);return this.total-e}changeSize(e){if(!Number.isFinite(e))throw new Error(`Size must be a finite number: ${e}`);const t=Math.max(0,Math.trunc(e)),s=this.size;if(t===s)return;if(t>s)if(s===0&&this.deltas.size>0){for(const a of this.deltas.keys())a>=t&&this.deltas.delete(a);this.size=t,this.rebuildTree()}else this._growSize(s,t);else{if(t>0)for(const a of this.deltas.keys())a>=t&&this.deltas.delete(a);this.size=t,this.rebuildTree()}const i=this.prefixSum(this.getSize()-1);i.cumulative!==i.total&&w.error("Inconsistent Fenwick Tree state")}static _minCoveredLowBound(e,t){let s=1;for(;;){const i=s*2;if(Math.floor(t/i)*i<=e)break;s=i}return s*Math.floor(e/s)}_propagateDeltaToGrownNodes(e,t,s,i){let a=e+1;for(;a<=s;){const l=It(a);if(l===0)break;a+=l}for(;a<=i;){this.tree.set(a,(this.tree.get(a)??0)+t);const l=It(a);if(l===0)break;a+=l}}_growSize(e,t){if(this.size=t,this.deltas.size>0){const s=ot._minCoveredLowBound(e,t);if(e-s<this.deltas.size)for(let a=s;a<e;a++){const l=this.deltas.get(a);l===void 0||l===0||this._propagateDeltaToGrownNodes(a,l,e,t)}else for(const[a,l]of this.deltas.entries())l===0||a<s||this._propagateDeltaToGrownNodes(a,l,e,t)}this.total=this._computeTreeTotal()}getSize(){return this.size}get base(){return this.baseValue}findIndexAtOrAfter(e,t){return this._findIndex(e,t??{},!0)}findIndexAtOrBefore(e,t){return this._findIndex(e,t??{},!1)}}const Ir=(n,e)=>{const t=n?.sampleRange,s=e?.sampleRange;return t===s?!1:t&&s?t.from!==s.from||t.to!==s.to:!0},Jt=(n,e,t)=>{const s=Number.isFinite(n)&&n>0?Math.trunc(n):0,i=r.useRef(null),a=r.useRef({size:s,valueOrFn:e,options:t});i.current===null&&(i.current=new ot(s,e,t));const l=i.current,u=a.current,d=u.size!==s,x=u.valueOrFn!==e,I=Ir(u.options,t),M=u.size===0&&s>0&&(!i.current||i.current.base===0);if(x||I){const E=t?.resetOnValueFnChange??!0;I||x&&E||M?(t?.debug&&w.debug("[useFenwickMapTree] reset",{valueOrFnChanged:x,optionsChanged:I}),l.reset(s,e,t)):(d&&(t?.debug&&w.debug("[useFenwickMapTree] resize (with valueFn change)",{from:u.size,to:s}),l.changeSize(s)),t?.debug&&w.debug("[useFenwickMapTree] setValueFn (no reset)",{valueOrFnChanged:x}),l.setValueFn(e,{reset:!1})),a.current={size:s,valueOrFn:e,options:t}}else d&&(t?.debug&&w.debug("[useFenwickMapTree] resize",{from:u.size,to:s}),M?l.reset(s,e,t):l.changeSize(s),a.current={size:s,valueOrFn:e,options:t});return l};class Tr{key;value;prev=null;next=null;constructor(e,t){this.key=e,this.value=t}}class Ot{head=null;tail=null;addToTail(e){this.tail?(this.tail.next=e,e.prev=this.tail,this.tail=e):this.head=this.tail=e}remove(e){e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev,e.prev=null,e.next=null}removeHead(){const e=this.head;return e&&this.remove(e),e}moveToTail(e){this.remove(e),this.addToTail(e)}}function Qt(n){const e=r.useRef(new Map),t=r.useRef(new Ot),s=Math.floor(n),i=r.useRef(s);r.useEffect(()=>{if(i.current=s,Number.isNaN(s)||s<0){w.warn(`useLruCache: invalid capacity ${n}; the cache will not store any entries.`),e.current.clear(),t.current=new Ot;return}if(Number.isFinite(s))for(;e.current.size>s;){const I=t.current.removeHead();if(I)e.current.delete(I.key);else break}},[n,s]);const a=r.useCallback(I=>{const M=e.current.get(I);if(M)return t.current.moveToTail(M),M.value},[]),l=r.useCallback((I,M)=>{const E=i.current;if(Number.isNaN(E)||E<=0)return;let h=e.current.get(I);if(h)h.value=M,t.current.moveToTail(h);else{if(e.current.size>=E){const N=t.current.removeHead();N&&e.current.delete(N.key)}h=new Tr(I,M),e.current.set(I,h),t.current.addToTail(h)}},[]),u=r.useCallback(I=>e.current.has(I),[]),d=r.useCallback(I=>{const M=e.current.get(I);M&&(t.current.remove(M),e.current.delete(I))},[]),x=r.useCallback(()=>{e.current.clear(),t.current=new Ot},[]);return r.useMemo(()=>({get:a,set:l,has:u,remove:d,clear:x}),[a,l,u,d,x])}const Mr=1e4,Sr=()=>{const{get:n,set:e,has:t,clear:s}=Qt(Mr);return r.useMemo(()=>({get:n,set:e,has:t,clear:s}),[n,e,t,s])},Ie=(n,e)=>e<=0?0:J(n,0,e-1),Xt=n=>({top:Math.max(0,n?.top??0),bottom:Math.max(0,n?.bottom??0)}),Je=(n,e)=>n<=e?0:n-e,ht=(n,e)=>n<=0?0:n+e,Nt=1e3,jt=2e3,Rr=1048576,Rt=n=>{if(!Number.isFinite(n))return 0n;const e=Math.trunc(n);return e<=0?0n:BigInt(e)},vr=(n,e,t,s,i,a,l,u)=>{const d=Rt(s);if(d===0n)return{renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0};const x=V=>V<0n?0n:V>=d?d-1n:V,I={materializeOption:{materialize:!1}},{index:M,cumulative:E}=a.findIndexAtOrAfter(n,I);let h;M===-1?h=d-1n:(E===n?h=Rt(M+1):h=Rt(M),h>=d&&(h=d-1n)),n<=0&&(h=0n),u&&n>=l&&(h=d-1n);const N=V=>{const L=Number(V);if(!Number.isSafeInteger(L))return null;const{cumulative:S}=a.prefixSum(L,{materializeOption:{materialize:!1}});if(!Number.isFinite(S))return null;const{index:j}=a.findIndexAtOrAfter(S+.5,{materializeOption:{materialize:!1}});if(j===-1)return null;const G=Rt(j);return G>V?G:null},F=V=>{let L=0,S=V,j=V,G=0n,P=0;for(;S<d&&L<e;){const ae=Number(S),K=i(ae);if(L+=K,j=S,S+=1n,G+=1n,!Number.isFinite(K)||K<0)break;if(K===0){if(P+=1,P>Nt){const T=N(j);if(T!==null&&T>S)S=T,P=0;else if(T!==null&&T===S&&i(Number(S))>0)P=0;else break}}else P=0}return G===0n&&(j=V),{height:L,end:j}};let{height:U,end:ie}=F(h);if(U<e&&h>0n){let V=h,L=U,S=0;for(;V>0n&&L<e;){V-=1n;const G=Number(V),P=i(G);if(L+=P,!Number.isFinite(P)||P<0)break;if(P===0){if(S+=1,S>Nt){const ae=Number(V);if(!Number.isSafeInteger(ae))break;const{cumulative:K}=a.prefixSum(ae,{materializeOption:{materialize:!1}});if(!Number.isFinite(K))break;const{index:T}=a.findIndexAtOrAfter(K-.5,{materializeOption:{materialize:!1}}),B=T===-1?-1n:Rt(T);if(B>=0n&&B<V)V=B+1n,S=0;else if(B===V&&V>=1n&&i(Number(V-1n))>0)S=0;else break}}else S=0}h=x(V);const j=F(h);U=j.height,ie=j.end}const Q=x(h),ee=x(ie),ge=x(Q-BigInt(Math.max(0,t))),ve=x(ee+BigInt(Math.max(0,t)));return{renderingStartIndex:Ie(Number(ge),s),renderingEndIndex:Ie(Number(ve),s),visibleStartIndex:Ie(Number(Q),s),visibleEndIndex:Ie(Number(ee),s)}},Pr=(n,e,t,s,i,a,l)=>{if(s===0)return{renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0};const u=Number.isFinite(l),d=u?Math.min(Math.max(0,n),l):Math.max(0,n);if(s>=Number.MAX_SAFE_INTEGER)return vr(d,e,t,s,i,a,l,u);const{index:x,cumulative:I,currentValue:M}=a.findIndexAtOrAfter(d,{materializeOption:{materialize:!1}}),E=x===-1?e<=0||(I??0)<d+(M??0)?s-1:0:x;let h=Ie(E,s),N=0;if(x!==-1&&I===d)h=Ie(x+1,s),N=0;else if(h===x&&I!==void 0&&M!==void 0)N=I-M-d;else{const{cumulative:V,currentValue:L}=a.prefixSum(h,{materializeOption:{materialize:!1}});N=(V??0)-(L??0)-d}const F=N,U=(V,L)=>{let S=V,j=L,G=0;for(;S<s&&j<e;){const P=i(S);if(j+=P,S++,!Number.isFinite(P)||P<0)break;if(P===0){if(G++,G>Nt){const{cumulative:ae}=a.prefixSum(S-1,{materializeOption:{materialize:!1}}),{index:K}=Number.isFinite(ae)?a.findIndexAtOrAfter(ae+.5,{materializeOption:{materialize:!1}}):{index:-1};if(K>S)S=K,G=0;else if(K===S&&i(S)>0)G=0;else break}}else G=0}return{cursor:S,height:j}},ie=U(h,N);let Q=ie.cursor;if(N=ie.height,N<e&&h>0){let V=N+Math.abs(Math.min(0,F)),L=h-1,S=0;for(;L>=0&&V<e;){const G=i(L);if(V+=G,!Number.isFinite(G)||G<0){L--;break}if(G===0){if(S++,S>Nt){const{cumulative:P}=a.prefixSum(L,{materializeOption:{materialize:!1}}),{index:ae}=Number.isFinite(P)?a.findIndexAtOrAfter(P-.5,{materializeOption:{materialize:!1}}):{index:-1};if(ae!==-1&&ae<L){L=ae,S=0;continue}if(ae===L&&L>=1&&i(L-1)>0)S=0;else{L--;break}}}else S=0;L--}h=Ie(L+1,s);const j=U(h,0);Q=j.cursor,N=j.height}const ee=Ie(h-t,s),ge=Ie(Math.max(Q-1,h),s),ve=Ie(ge+t,s);return{renderingStartIndex:ee,renderingEndIndex:ve,visibleStartIndex:h,visibleEndIndex:ge}},$t=(n,e,t)=>{const s=Math.max(0,e??0),i=r.useRef({last:0,id:null,arg:null}).current;return r.useEffect(()=>()=>{if(i.id!==null&&(cancelAnimationFrame(i.id),i.id=null),i.arg!==null&&n.current){try{t(n.current,i.arg)}catch(a){console.error("[useThrottledInvoker] Error flushing pending callback on unmount",a)}i.arg=null}},[i,n,t]),r.useCallback(a=>{if(i.arg=a,i.id!==null)return;const l=u=>{if(i.id=null,i.arg===null)return;const d=u-i.last;if(s===0||i.last===0||d>=s){if(n.current)try{t(n.current,i.arg)}catch(x){console.error("[useThrottledInvoker] Error invoking callback",x)}i.arg=null,i.last=u}i.arg!==null&&(i.id=requestAnimationFrame(l))};i.id=requestAnimationFrame(l)},[s,t,n,i])},yr=r.memo(({index:n,top:e,height:t,item:s,children:i,clipItemHeight:a,enableKeyboardNavigation:l,onKeyDown:u,onFocus:d,registerItemRef:x})=>{const I=r.useCallback(N=>x(n,N),[n,x]),M=r.useCallback(N=>u(N,n),[n,u]),E=r.useCallback(()=>d(n),[n,d]),h=r.useCallback(N=>{N.currentTarget.focus({preventScroll:!0})},[]);return Y.jsx("div",{ref:I,"data-index":n,"data-virtualscroll-item":"true",className:"aqvs-item-container",style:{top:e,height:t,overflow:a?"hidden":void 0},tabIndex:l?-1:void 0,onPointerDown:l?h:void 0,onKeyDownCapture:l?M:void 0,onFocusCapture:l?E:void 0,children:i(s,n)})}),Cr=({itemCount:n,getItem:e,getItemKey:t,getItemHeight:s,viewportSize:i,overscanCount:a=15,className:l,testId:u,onScroll:d,onRangeChange:x,children:I,background:M,initialScrollIndex:E,initialScrollOffset:h,initialScrollAnchor:N,callbackThrottleMs:F=5,contentInsets:U,onItemFocus:ie,scrollBarOptions:Q,behaviorOptions:ee,onWheelHorizontal:ge,contentProps:ve},V)=>{const{width:L,enableThumbDrag:S,enableTrackClick:j,enableArrowButtons:G,enableScrollToTopBottomButtons:P,renderThumbOverlay:ae,tapScrollCircleOptions:K}=Q??{},{enablePointerDrag:T,pointerDragInputs:B,enableKeyboardNavigation:q=!0,wheelSpeedMultiplier:Ye,inertiaOptions:Ne,clipItemHeight:te=!1,resetOnGetItemHeightChange:re=!1}=ee??{},W=r.useRef(null),Z=r.useRef({renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0,scrollPosition:0,totalHeight:0}),Pe=r.useRef(N&&n>0?{index:J(Math.trunc(N.index),0,n-1),align:"top",offset:-Math.max(0,N.offsetPx??0)}:null),Ve=r.useRef(!1),je=r.useRef(!0);r.useEffect(()=>{if(je.current){je.current=!1;return}re&&(Pe.current=null)},[re,s]);const y=r.useMemo(()=>Xt(U),[U]),[lt]=r.useState(()=>{const f=N?.index??E,p=typeof f=="number"&&Number.isFinite(f)?Math.max(0,Math.trunc(f)):0;return{from:Math.max(0,p-50),to:p+50}}),ne=r.useMemo(()=>({sampleRange:lt,resetOnValueFnChange:re,materialize:!0}),[re,lt]),C=Jt(n,s,ne),[we]=r.useState(()=>{let c=0,f=0;if(N&&n>0){const p=J(Math.trunc(N.index),0,n-1),k=Math.max(0,N.offsetPx??0),A=J(p-a*2,0,n-1),O=J(p+a*2,0,n-1),X=p>0||k>0?{materializeOption:{materialize:!0,ranges:[{from:A,to:O}]}}:void 0,{cumulative:$,total:Re,currentValue:de}=C.prefixSum(p,X),me=Math.max($-de+k,0);c=ht(me,y.top),f=Re??C.getTotal()}else if(typeof E=="number"){const p=J(E,0,n-1),k=J(p-a*2,0,n-1),A=J(p+a*2,0,n-1),O=E>0?{materializeOption:{materialize:!0,ranges:[{from:k,to:A}]}}:void 0,{cumulative:X,total:$,currentValue:Re}=C.prefixSum(E,O),de=Math.max(X-Re,0);c=ht(de,y.top),f=$??C.getTotal()}else typeof h=="number"&&(c=ht(Math.max(h,0),y.top)),f=C.getTotal();return{position:c,total:f}}),[_e,Ke]=r.useState(we.position),[qe,g]=r.useState(we.total),_=r.useRef(we.position),pe=r.useRef(y.top),H=r.useRef(d??void 0),Te=r.useRef(x??void 0),oe=r.useRef(new Map),be=r.useRef(null),Me=r.useRef(null),[Se,le]=r.useState(null),[ke,ce]=r.useState(!1),se=r.useRef(null),De=r.useRef(!1),Be=r.useRef(0),ye=r.useRef(!1),Qe=r.useRef(!1),$e=r.useRef(n);$e.current!==n&&($e.current=n,Qe.current=!0),r.useEffect(()=>{H.current=d??void 0,Te.current=x??void 0},[x,d]);const Ce=r.useCallback(c=>{if(q&&c&&typeof c.focus=="function")try{c.focus({preventScroll:!0})}catch{c.focus()}},[q]),m=r.useCallback((c,{position:f,totalHeight:p})=>{c(f,p)},[]),R=$t(H,F,m),ue=r.useCallback((c,f)=>{c(f)},[]),xe=$t(Te,F,ue),Ee=r.useRef(y.top);Ee.current=y.top;const et=r.useRef(R);et.current=R,r.useEffect(()=>(Ve.current=!1,()=>{Ve.current=!0,se.current&&(clearTimeout(se.current),se.current=null)}),[]),r.useEffect(()=>{q||(oe.current.clear(),be.current=null,Me.current=null)},[q]);const We=r.useCallback((c,f)=>{if(!f){oe.current.delete(c);return}q&&(oe.current.set(c,f),be.current===c&&(be.current=null,Me.current=c,Ce(f)))},[q,Ce]),Ge=.01,Xe=r.useRef({rafId:null,loopActive:!1,idleFrames:0,lastRenderedPosition:we.position}),tt=r.useCallback(()=>{const c=Xe.current;c.rafId!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(c.rafId),c.rafId=null,c.loopActive=!1,c.idleFrames=0},[]);r.useEffect(()=>()=>{tt()},[tt]);const ct=r.useRef(()=>{}),Ue=r.useCallback(()=>{const c=Xe.current;c.rafId=null;const f=_.current,p=Je(f,Ee.current),k=C.getTotal();if(Ke(O=>Math.abs(O-f)<Ge?O:f),Math.abs(c.lastRenderedPosition-f)>=Ge?(et.current({position:p,totalHeight:k}),c.lastRenderedPosition=f,c.idleFrames=0):c.idleFrames+=1,c.idleFrames>=2){tt();return}if(typeof requestAnimationFrame=="function"){c.rafId=requestAnimationFrame(O=>ct.current(O));return}c.loopActive=!1},[C,tt]);ct.current=Ue;const Tt=r.useCallback(()=>{const c=Xe.current;if(c.idleFrames=0,!c.loopActive){if(c.loopActive=!0,typeof requestAnimationFrame=="function"){c.rafId=requestAnimationFrame(Ue);return}c.loopActive=!1}},[Ue]),fe=r.useCallback((c,f)=>{const p=f?.immediate??!1,k=Je(c,y.top);if(_.current=c,p){Xe.current.lastRenderedPosition=c,Xe.current.idleFrames=0,Ke(c),R({position:k,totalHeight:C.getTotal()});return}Tt()},[Tt,C,y.top,R]),ut=r.useCallback(c=>{const f=W.current;if(!f)return c;const p=f.getScrollPosition();Be.current+=1;const k=f.scrollTo(c);return k===p&&(Be.current=Math.max(0,Be.current-1)),Math.abs(k-c)>.5&&(ye.current=!0),k},[]),vt=r.useRef(!1);r.useEffect(()=>{if(!vt.current)if(vt.current=!0,N==null&&typeof E!="number"&&typeof h=="number"){const c=ht(Math.max(h,0),y.top),f=Math.abs(c-_.current)>.5;fe(c,{immediate:!0}),f&&W.current?.scrollTo(c)}else fe(_.current,{immediate:!0})},[N,E,h,y.top,fe]),r.useEffect(()=>{const c=C.getTotal();if(qe!==c){g(c);return}if(ye.current){ye.current=!1;const f=W.current;if(f&&Math.abs(f.getScrollPosition()-_.current)>.5){const p=ut(_.current);ye.current=!1,fe(p,{immediate:!0})}}},[C,qe,n,ut,fe]),r.useEffect(()=>{if(Pe.current!==null){const{index:c,align:f,offset:p}=Pe.current,k=Ie(c,n),{cumulative:A,currentValue:O}=C.prefixSum(k,{materializeOption:{materialize:!1}});if(A!==void 0&&O!==void 0){const X=Math.max(A-O,0);let $=X;f==="bottom"?$=A-i:f==="center"&&($=X+O/2-i/2),p&&($-=p),$=Math.max(0,$);const Re=Math.max(0,qe+y.top+y.bottom-i),de=Math.min(ht($,y.top),Re);Math.abs(de-_.current)>1&&(w.debug("[VirtualScroll] Drift correction",{from:_.current,to:de,targetIndex:k}),Be.current===0&&(Be.current+=1),W.current?.scrollTo(de),fe(de,{immediate:!0}))}}Qe.current=!1},[qe,C,n,y.top,fe,i,y.bottom]),r.useEffect(()=>{const c=pe.current;if(c===y.top)return;const f=Je(_.current,c),p=ht(f,y.top);pe.current=y.top,_.current=p,W.current?.scrollTo(p),fe(p,{immediate:!0})},[y.top,fe]);const bt=r.useCallback((c,f)=>{if(n===0)return;const p=Ie(c,n),k=C.get(p),A=f-k,O=C.update(p,f);O!==void 0&&g(O),w.debug("[VirtualScroll] Updated item size manually",{index:p,size:f,total:O});let X=Pe.current?Pe.current.index:null;if(X===null){const $=_.current,Re=Xt(U).top,de=Je($,Re),{index:me,cumulative:Fe}=C.findIndexAtOrAfter(de,{materializeOption:{materialize:!1}});X=Fe!==void 0&&Fe===de?me+1:me}if(X!==-1&&p<X&&A!==0){const $=_.current,Re=$+A;ut(Re),fe(Re,{immediate:!0}),w.debug("[VirtualScroll] Adjusted scroll for layout shift (manual update)",{from:$,to:Re,causedByIndex:p,delta:A,activeVisibleStartIndex:X})}},[C,n,ut,fe,U]),He=r.useCallback((c,f)=>{if(!W.current||n===0)return;const p=Ie(c,n),k=Ie(p-a*2,n),A=Ie(p+a*2,n),{cumulative:O,total:X,currentValue:$}=C.prefixSum(p,{materializeOption:{materialize:!0,ranges:[{from:k,to:A}]}});if(w.debug("[VirtualScroll] Scrolling to index:",p,"ItemBottom:",O,"Total height:",X,"ItemHeight:",$,"safeIndexFrom:",k,"safeIndexTo:",A),!X)return;const Re=Math.max(O-$,0);let de=Re;f?.align==="bottom"?de=O-i:f?.align==="center"&&(de=Re+$/2-i/2),f?.offset&&(de-=f.offset),de=Math.max(0,de);const me=ht(de,y.top),Fe=W.current?.getContentSize()??X+y.top+y.bottom,Le=Math.max(0,Fe-i),ze=Math.min(me,Le);Pe.current={index:p,align:f?.align,offset:f?.offset};const Mt=W.current?.getScrollPosition()??-1,Vt=Math.abs(Mt-ze)>.5;De.current=!1,Be.current=0,Vt&&(De.current=!0,Be.current+=1,W.current?.scrollTo(ze)),g(X),fe(ze,{immediate:!0}),w.debug("[VirtualScroll] Setting scroll position to:",ze,{original:me,max:Le})},[C,a,n,y.top,y.bottom,i,fe]),Pt=r.useRef(N&&n===0?N:null);r.useEffect(()=>{const c=Pt.current;!c||n===0||(Pt.current=null,He(J(Math.trunc(c.index),0,n-1),{align:"top",offset:-Math.max(0,c.offsetPx??0)}))},[n,He]);const yt=r.useCallback(c=>{if(!W.current||n===0)return;const f=C.getTotal(),p=J(Math.floor(c),0,f),{index:k,cumulative:A,currentValue:O}=C.findIndexAtOrAfter(p,{materializeOption:{materialize:!1}}),$=(A??0)-(O??0)-p;He(k,{offset:$})},[C,n,He]),mt=r.useCallback(()=>{if(n===0)return null;const c=Je(_.current,y.top),{index:f,cumulative:p,currentValue:k}=C.findIndexAtOrAfter(c,{materializeOption:{materialize:!1}});if(f===-1)return{index:n-1,offsetPx:0};if(p===c)return{index:J(f+1,0,n-1),offsetPx:0};const A=(p??0)-(k??0);return{index:f,offsetPx:Math.max(0,c-A)}},[C,n,y.top]),Ct=r.useCallback(c=>{const f=Je(_.current,y.top),p=typeof c=="function"?c(f):c;yt(p);const k=W.current?.getScrollPosition(),A=typeof k=="number"?k:_.current;return fe(A),A},[y.top,yt,fe]),kt=r.useCallback((c,f)=>{w.debug("[VirtualScroll] Scroll position changed:",c);const p=De.current;p&&(De.current=!1);const k=Be.current>0;if(k&&(Be.current=0),p||k||Qe.current||(Pe.current=null),fe(c),P){if(p||k)return;const A=c-f;if(w.debug("[VirtualScroll] Scroll diff:",A,"New:",c,"Prev:",f),Math.abs(A)>1){const O=A>0?"down":"up";le(O),ce(!0),w.debug("[VirtualScroll] Showing scroll buttons. Direction:",O),se.current&&clearTimeout(se.current),se.current=setTimeout(()=>{ce(!1),w.debug("[VirtualScroll] Hiding scroll buttons")},2e3)}}},[fe,P]),rt=r.useMemo(()=>Je(_e,y.top),[y.top,_e]),ft=r.useMemo(()=>{const c=C.getTotal(),f=Pr(rt,i,a,n,s,C,c);return w.debug("[VirtualScroll] Calculated rendering range:",()=>({...f,scrollPosition:rt,renderingContentSize:c,overscanCount:a,viewportSize:i})),f},[rt,i,a,n,s,C]),{renderingStartIndex:nt,renderingEndIndex:st,visibleStartIndex:it,visibleEndIndex:pt}=ft,o=r.useCallback((c,f)=>{if(!q||n===0)return;const p=Ie(c,n);if(!(f?.ensureVisible??!0)){const Le=oe.current.get(p);Le&&(be.current=null,Me.current=p,Ce(Le));return}const A=C.prefixSum(p,{materializeOption:{materialize:!1}}),O=A.currentValue,X=Math.max(A.cumulative-O,0),$=X+O,Re=Je(_.current,y.top),de=Re+i;if(X<Re||$>de){He(p);const Le=oe.current.get(p);Le?(be.current=null,Me.current=p,Ce(Le)):be.current=p;return}const Fe=oe.current.get(p);if(Fe){be.current=null,Me.current=p,Ce(Fe);return}be.current=p},[q,n,C,y.top,He,Ce,i]),b=r.useCallback((c,f)=>{if(!q||c.defaultPrevented||c.altKey||c.metaKey||c.ctrlKey)return;const p=c.target;if(p){const k=p.tagName;if(k==="INPUT"||k==="TEXTAREA"||k==="SELECT"||p.isContentEditable)return}if(c.key==="ArrowDown"){f<n-1&&(c.preventDefault(),o(f+1));return}if(c.key==="ArrowUp"){f>0&&(c.preventDefault(),o(f-1));return}if(c.key==="PageDown"){if(f<n-1){c.preventDefault();const{visibleStartIndex:k,visibleEndIndex:A}=Z.current,O=Math.max(A-k+1,1),X=Math.max(O,1),$=Ie(Math.min(f+X,n-1),n);o($)}return}if(c.key==="PageUp"&&f>0){c.preventDefault();const{visibleStartIndex:k,visibleEndIndex:A}=Z.current,O=Math.max(A-k+1,1),X=Math.max(O,1),$=Ie(f-X,n);o($)}},[q,n,o]),v=r.useCallback(c=>{if(!q)return;const f=Ie(c,n);be.current=null,Me.current=f,ie?.(f)},[q,n,ie]);r.useEffect(()=>{const c=W.current?.getScrollPosition()??0,f=_.current,p=Je(f,y.top);w.debug("[VirtualScroll] Range change effect triggered",()=>({renderingStartIndex:nt,renderingEndIndex:st,visibleStartIndex:it,visibleEndIndex:pt,scrollPositionState:_e,paneScrollPosition:f,logicalScrollPosition:p,contentSize:qe,scrollPaneScrollPosition:c})),xe({renderingStartIndex:nt,renderingEndIndex:st,visibleStartIndex:it,visibleEndIndex:pt,scrollPosition:p,totalHeight:qe})},[qe,st,nt,y.top,xe,_e,pt,it]);const D=r.useCallback(()=>{if(!P)return null;const c=ke&&Se!==null,f=Se==="up";return Y.jsx("div",{className:"aqvs-scroll-to-edge-overlay","data-visible":c,children:f?Y.jsx("div",{className:"aqvs-scroll-to-edge-button-container aqvs-scroll-to-edge-button-container-top",children:Y.jsx("button",{type:"button",className:"aqvs-scroll-to-edge-button",onClick:p=>{p.stopPropagation(),De.current=!0,He(0),ce(!1)},children:"Top"})}):Y.jsx("div",{className:"aqvs-scroll-to-edge-button-container aqvs-scroll-to-edge-button-container-bottom",children:Y.jsx("button",{type:"button",className:"aqvs-scroll-to-edge-button",onClick:p=>{p.stopPropagation(),De.current=!0,He(n-1),ce(!1)},children:"Bottom"})})})},[P,ke,Se,He,n]),z=r.useRef(0),{visibleItems:he,renderAnchor:Ae}=r.useMemo(()=>{if(n===0)return{visibleItems:Y.jsx("div",{className:"aqvs-no-items-container",children:Y.jsx("div",{className:"aqvs-no-items-text",children:"No items"})}),renderAnchor:0};const c=Ie(nt,n),f=Ie(st,n),{cumulative:p,currentValue:k}=C.prefixSum(c,{materializeOption:{materialize:!1}}),A=p-k;Number.isFinite(A)&&Math.abs(A-z.current)>Rr&&(z.current=A);const O=z.current,X=[],$=[];let Re=0,de=A;for(let me=c;me<=f;me++){if($.length>=jt){w.warn("[VirtualScroll] Rendered item count reached the safety cap; truncating render window.",{cap:jt,safeRenderingStartIndex:c,safeRenderingEndIndex:f});break}const Fe=s(me),Le=C.get(me),ze=Fe-Le;ze!==0&&X.push({index:me,value:Fe});const Mt=de+Re,Vt=t?t(me):me;$.push(Y.jsx(yr,{index:me,top:Mt-O,height:Fe,item:e(me),clipItemHeight:te,enableKeyboardNavigation:q,onKeyDown:b,onFocus:v,registerItemRef:We,children:I},Vt)),Re+=ze,de+=Le}return X.length>0&&Promise.resolve().then(()=>{if(Ve.current)return;let me=0;for(const ze of X)if(ze.index<it){const Mt=C.get(ze.index);me+=ze.value-Mt}const Fe=C.updates(X);if(Ve.current||typeof Fe!="number")return;g(Fe),w.debug("[VirtualScroll] Updated heights for items",X,"New total height:",Fe);const Le=W.current?.getScrollPosition()??_.current;if(me!==0){const ze=Le+me;ut(ze),fe(ze,{immediate:!0}),w.debug("[VirtualScroll] Adjusted scroll for layout shift (auto update)",{from:Le,to:ze,shiftAmount:me})}else Le!==_.current&&fe(Le)}),{visibleItems:$,renderAnchor:O}},[I,te,qe,q,n,C,e,t,s,v,b,ut,We,st,nt,fe,it]),Oe=r.useCallback(c=>{const f=(F??0)>0,p=Math.abs(c-_e),k=f&&p>.5?_e:c,A=Je(k,y.top);if(w.debug("[VirtualScroll] Rendering visible items",()=>({currentScrollPosition:c,effectiveScrollPosition:A,renderingStartIndex:nt,renderingEndIndex:st,itemCount:n,viewportSize:i,callbackThrottleMs:F,diff:p,rawEffectiveScrollPosition:k})),n===0)return he;const O=y.top+Ae-k,X=y.bottom>0?Y.jsx("div",{className:"aqvs-bottom-inset",style:{top:C.getTotal()-Ae,height:y.bottom}},"virtualscroll-bottom-inset"):null;return w.debug("[VirtualScroll] Rendering items",()=>({containerTop:O,logicalScrollPosition:rt,resolvedInsets:y,effectiveScrollPosition:A})),Y.jsxs("div",{className:"aqvs-items-wrapper",style:{top:0,transform:`translateY(${O}px)`,willChange:"transform"},children:[he,X]})},[F,n,C,rt,Ae,st,nt,y,_e,i,he]),xt=r.useMemo(()=>({renderingStartIndex:ft.renderingStartIndex,renderingEndIndex:ft.renderingEndIndex,visibleStartIndex:ft.visibleStartIndex,visibleEndIndex:ft.visibleEndIndex,scrollPosition:rt,totalHeight:C.getTotal()}),[ft,rt,C,qe]);r.useEffect(()=>{Z.current=xt},[xt]),r.useImperativeHandle(V,()=>({getScrollPosition:()=>W.current?.getScrollPosition()??-1,getContentSize:()=>W.current?.getContentSize()??-1,getViewportSize:()=>W.current?.getViewportSize()??-1,scrollTo:Ct,scrollToIndex:He,getFenwickTreeTotalHeight:()=>C.getTotal(),getFenwickSize:()=>C.getSize(),focusItemAtIndex:o,getRange:()=>Z.current,getScrollAnchor:mt,updateItemSize:bt}),[Ct,He,C,o,mt,bt]);const at=C.getTotal()+y.top+y.bottom;return Y.jsx(Zt,{ref:W,contentSize:at,viewportSize:i,className:l,testId:u,onScroll:kt,background:M,tapScrollCircleOptions:K,inertiaOptions:Ne,itemCount:n,scrollBarWidth:L,enableThumbDrag:S,enableTrackClick:j,enableArrowButtons:G,enablePointerDrag:T,pointerDragInputs:B,renderThumbOverlay:ae,wheelSpeedMultiplier:Ye,onWheelHorizontal:ge,contentInsets:y,contentProps:ve,visibleStartIndex:it,visibleEndIndex:pt,renderOverlay:D,initialScrollPosition:we.position,children:Oe})},wr=r.forwardRef(Cr);exports.FenwickMapTree=ot;exports.ScrollBar=Gt;exports.ScrollPane=Zt;exports.TAP_SCROLL_SPEED_DEFAULTS=zt;exports.VirtualScroll=wr;exports.computeAutoTapScrollMaxSpeedMultiplier=Wt;exports.computeTapScrollSpeed=Kt;exports.minmax=J;exports.tapScrollCircleSampleVisual=br;exports.useFenwickMapTree=Jt;exports.useHeightCache=Sr;exports.useLruCache=Qt;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Y=require("react/jsx-runtime"),r=require("react"),gt=require("tailwind-merge");class w{level;prefix;impl;constructor(e=2,t="[virtualscroll]",s=console){this.level=e,this.prefix=t,this.impl=s}static instance=new w(2,"[virtualscroll]");static setLevel(e){w.instance.setLevel(e)}setLevel(e){this.level=e}static setImplementation(e){w.instance.setImplementation(e)}setImplementation(e){this.impl=e}static setPrefix(e){w.instance.setPrefix(e)}setPrefix(e){this.prefix=e}static isEnabled(e){return w.instance.isEnabled(e)}isEnabled(e){return this.level<=e}static resolveLazy(e){if(typeof e!="function")return e;try{return e()}catch{return e}}formatMessage(e){return typeof e=="string"?[`${this.prefix} ${e}`]:[this.prefix,e]}static debug(e,...t){w.instance.debug(e,...t)}debug(e,...t){this.level<=0&&this.impl.debug(...this.formatMessage(w.resolveLazy(e)),...t.map(w.resolveLazy))}static info(e,...t){w.instance.info(e,...t)}info(e,...t){this.level<=1&&this.impl.info(...this.formatMessage(w.resolveLazy(e)),...t.map(w.resolveLazy))}static warn(e,...t){w.instance.warn(e,...t)}warn(e,...t){this.level<=2&&this.impl.warn(...this.formatMessage(w.resolveLazy(e)),...t.map(w.resolveLazy))}static error(e,...t){w.instance.error(e,...t)}error(e,...t){this.level<=3&&this.impl.error(...this.formatMessage(w.resolveLazy(e)),...t.map(w.resolveLazy))}}const Yt={active:!1,offsetX:0,offsetY:0,distance:0,direction:0,pointerId:null},Dt=6,er=8,tr=({dragState:n,normalizedDistance:e})=>{const t=1+e*.18,s=.16+e*.24,i=.38+e*.28,a=n.active?"80ms ease-out":"220ms ease";return Y.jsxs(Y.Fragment,{children:[Y.jsx("div",{className:"aqvs-tap-scroll-circle-visual-outer",style:{background:"linear-gradient(140deg, rgba(255,255,255,0.62), rgba(72,72,72,0.48))",boxShadow:`0 0 0 1px rgba(255,255,255,0.28), 0 10px 22px rgba(0,0,0,${s})`,transform:`scale(${t})`,transition:`${a}, ${n.active?"80ms":"260ms"} box-shadow ease`}}),Y.jsx("div",{className:"aqvs-tap-scroll-circle-inner",style:{background:"linear-gradient(140deg, rgba(255,255,255,0.72), rgba(28,28,28,0.58))",boxShadow:"inset 0 4px 10px rgba(0,0,0,0.24), inset 0 0 2px rgba(255,255,255,0.55)",opacity:i,transition:n.active?"120ms opacity ease-out":"220ms opacity ease"}})]})},Ut=r.memo(r.forwardRef(({onDragChange:n,className:e,maxVisualDistance:t=160,size:s=40,style:i,opacity:a=1,renderVisual:c},u)=>{const[d,x]=r.useState(Yt),I=r.useRef(null),M=r.useRef(null),E=r.useRef({x:0,y:0}),h=r.useRef(null),N=r.useRef(0),F=r.useCallback(T=>{x(T),n(T)},[n]),U=r.useCallback((T,B,q=!1)=>{const{x:Ye,y:Ne}=E.current,te=T-Ye,re=B-Ne,W=Math.abs(re),Z=W<Dt?0:re<0?-1:1,Te=N.current;let Ve=Z;const $e=Dt+er;Z===0?Te!==0&&W<$e?Ve=Te:(Ve=0,q||(N.current=0)):Z!==Te&&Te!==0&&W<$e?Ve=Te:N.current=Z,F({active:q||W>=Dt,offsetX:te,offsetY:re,distance:W,direction:Ve,pointerId:I.current})},[F]),ie=r.useCallback(T=>{if(T===null)return;const B=h.current;B?.hasPointerCapture(T)&&B.releasePointerCapture(T)},[]),Q=r.useCallback((T=!1)=>{T&&ie(I.current),I.current=null,M.current=null,N.current=0,F(Yt)},[F,ie]),ee=r.useCallback(T=>{if(I.current!==null&&I.current!==T.pointerId){M.current={pointerId:T.pointerId,clientX:T.clientX,clientY:T.clientY},T.preventDefault(),T.stopPropagation();return}T.preventDefault(),T.stopPropagation();const B=h.current??T.currentTarget,{left:q,top:Ye,width:Ne,height:te}=B.getBoundingClientRect();E.current={x:q+Ne/2,y:Ye+te/2},I.current=T.pointerId;try{B.setPointerCapture(T.pointerId)}catch{}U(T.clientX,T.clientY,!0)},[U]),ge=r.useCallback(T=>{if(I.current!==T.pointerId){M.current!==null&&M.current.pointerId===T.pointerId&&(M.current={pointerId:T.pointerId,clientX:T.clientX,clientY:T.clientY});return}T.preventDefault(),U(T.clientX,T.clientY)},[U]),ye=r.useCallback(T=>{if(I.current!==T.pointerId){M.current!==null&&M.current.pointerId===T.pointerId&&(M.current=null);return}T.preventDefault(),T.stopPropagation();const B=M.current;if(M.current=null,B!==null){ie(T.pointerId);const q=h.current;let Ye=!0;if(q!==null&&typeof q.setPointerCapture=="function")try{q.setPointerCapture(B.pointerId)}catch(Ne){(typeof Ne=="object"&&Ne!==null&&"name"in Ne?Ne.name:void 0)==="NotFoundError"&&(Ye=!1)}if(Ye){I.current=B.pointerId,U(B.clientX,B.clientY,!0);return}}Q(!0)},[Q,ie,U]),V=r.useCallback(T=>{T.target===T.currentTarget&&I.current===T.pointerId&&Q(!1)},[Q]);r.useImperativeHandle(u,()=>({reset:()=>{Q(!0)},getElement:()=>h.current}),[Q]);const L=Math.min(Math.max(a,0),1),S=s/64,j=Math.min(d.distance,t)/t,G=d.direction*j*10*S,P=c??tr,ae={dragState:d,normalizedDistance:j,sizeScale:S,size:s,opacity:L},K={...i,width:s,height:s,transform:`translateY(${G}px)`};return K.opacity=L,Y.jsx("div",{ref:h,"data-testid":"virtual-scroll-tap-circle",className:gt.twMerge("aqvs-tap-scroll-circle",e),style:K,tabIndex:-1,onPointerDown:ee,onPointerMove:ge,onPointerUp:ye,onPointerCancel:ye,onLostPointerCapture:V,role:"presentation",children:P(ae)})}));Ut.displayName="TapScrollCircle";const J=(n,e,t)=>Math.max(e,Math.min(t,n)),Ft="virtualscroll:tap-scroll-cancel",Bt=20,rr=250,nr=60,sr=20,ir=20,zt={maxDistance:240,minSpeedMultiplier:.2},ar=zt.maxDistance,qt={active:!1,offsetX:0,offsetY:0,distance:0,direction:0,pointerId:null},At=2.2,or=8,lr=120,cr=1/10,Je={enabled:!0,size:40,offsetX:-80,offsetY:0,className:void 0,maxVisualDistance:ar,minSpeedMultiplier:zt.minSpeedMultiplier,opacity:.9,renderVisual:void 0,maxSpeedCurve:void 0},ur=n=>n?{mainSizeKey:"width",crossSizeKey:"height",positionKey:"left",selectDelta:(e,t)=>e,getPointerCoordinate:({clientX:e})=>e,arrowLabels:["Scroll left","Scroll right"],arrowIcons:["◀","▶"],directionClass:"aqvs-scrollbar-horizontal",orientation:"horizontal"}:{mainSizeKey:"height",crossSizeKey:"width",positionKey:"top",selectDelta:(e,t)=>t,getPointerCoordinate:({clientY:e})=>e,arrowLabels:["Scroll up","Scroll down"],arrowIcons:["▲","▼"],directionClass:"aqvs-scrollbar-vertical",orientation:"vertical"},fr=(n,e)=>{const t=n?.maxSpeedMultiplier,s=typeof t=="number"?t:Wt(e);return{enabled:n?.enabled??Je.enabled,size:n?.size??Je.size,offsetX:n?.offsetX??Je.offsetX,offsetY:n?.offsetY??Je.offsetY,className:n?.className??Je.className,maxVisualDistance:n?.maxVisualDistance??Je.maxVisualDistance,maxSpeedMultiplier:s,minSpeedMultiplier:Math.max(n?.minSpeedMultiplier??Je.minSpeedMultiplier,0),opacity:J(n?.opacity??Je.opacity,0,1),renderVisual:n?.renderVisual??Je.renderVisual,maxSpeedCurve:n?.maxSpeedCurve??Je.maxSpeedCurve}},dr=({isDragging:n,isThumbHovered:e,enableThumbDrag:t})=>r.useMemo(()=>t?n?"dragging":e?"hover":"idle":"disabled",[t,n,e]),mr=({canUseArrowButtons:n,enableArrowButtons:e,resetTapScroll:t,scrollByStep:s})=>{const i=r.useRef(null),a=r.useRef(null),c=r.useRef(null),u=r.useCallback(()=>{i.current!==null&&(window.clearInterval(i.current),i.current=null),a.current!==null&&(window.clearTimeout(a.current),a.current=null),c.current!==null&&(window.removeEventListener("pointerup",c.current),window.removeEventListener("pointercancel",c.current),window.removeEventListener("blur",c.current),c.current=null)},[]),d=r.useCallback(()=>{u()},[u]),x=r.useCallback(M=>E=>{if(!n)return;E.cancelable&&E.preventDefault(),E.stopPropagation(),t(),u(),s(M),a.current=window.setTimeout(()=>{i.current=window.setInterval(()=>{s(M)},nr)},rr);const h=()=>u();c.current=h,window.addEventListener("pointerup",h),window.addEventListener("pointercancel",h),window.addEventListener("blur",h)},[n,u,t,s]),I=r.useCallback(M=>E=>{e&&(E.key==="Enter"||E.key===" "||E.key==="Spacebar")&&(E.preventDefault(),s(M))},[e,s]);return r.useEffect(()=>{n||u()},[n,u]),r.useEffect(()=>()=>{u()},[u]),{handleArrowPointerDown:x,handleArrowPointerUp:d,handleArrowKeyDown:I}},pr=700,dt=(n,e)=>typeof n=="number"&&Number.isFinite(n)?n:e,Kt=({distance:n,maxDistance:e,viewportSize:t,minSpeedMultiplier:s,maxSpeedMultiplier:i,hasCustomMaxSpeedMultiplier:a,curve:c})=>{const u=Math.max(dt(n,0),0),d=dt(e,0),x=d>0?Math.min(u,d)/d:1,I=Math.max(dt(t,0),0),M=Math.max(dt(s,0),0),E=Math.max(dt(i,0),0),h=Math.max(I*M,40),N=a?h:1200,F=Math.max(I*E,N),U=c?Math.max(dt(c.exponentialScale,E),0):0,ie=c?Math.min(F,Math.max(I*U,h)):F,Q=Math.max(ie,h);let ee=x**1.1;if(c){const ye=Math.min(Math.max(dt(c.exponentialSteepness,0),0),pr);if(ye===0)ee=x;else{const V=Math.expm1(ye)||1;ee=Math.min(Math.max(Math.expm1(ye*x)/V,0),1)}}const ge=Math.min(Math.max(dt(c?.easedOffset,0),0),1);return h+(Q-h)*(ge+(1-ge)*ee)},Wt=n=>{if(!n||n<=0)return At;const e=Math.max(1,n),t=Math.log10(e),s=At+t*or;return J(s,At,lr)},Gt=({contentSize:n,viewportSize:e,scrollPosition:t,onScroll:s,enableThumbDrag:i=!0,enableTrackClick:a=!0,enableArrowButtons:c=!0,horizontal:u=!1,scrollBarWidth:d=12,className:x,ariaControls:I,tapScrollCircleOptions:M,itemCount:E,renderThumbOverlay:h,visibleStartIndex:N,visibleEndIndex:F})=>{const[U,ie]=r.useState(!1),[Q,ee]=r.useState(!1),[ge,ye]=r.useState(!1),V=r.useRef(null),L=r.useRef({pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1,captureTarget:null}),S=r.useRef({pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1}),j=r.useRef(t),G=r.useRef(s),P=r.useRef(qt),ae=r.useRef(null),K=r.useRef(null),T=r.useRef(null),B=r.useRef(0),q=r.useRef(0),Ye=r.useMemo(()=>fr(M,E),[E,M]),Ne=r.useMemo(()=>ur(u),[u]),{enabled:te,size:re,offsetX:W,offsetY:Z,className:Te,maxVisualDistance:Ve,maxSpeedMultiplier:$e,minSpeedMultiplier:y,opacity:lt,renderVisual:ne,maxSpeedCurve:C}=Ye,Ee=r.useRef({viewportSize:e,maxScrollPosition:Math.max(n-e,0),scrollBarVisible:n>e,effectiveTapMaxDistance:Math.max(Ve,1),tapCircleMaxSpeedMultiplier:$e,tapCircleMinSpeedMultiplier:y,tapCircleMaxSpeedCurve:C,tapScrollCircleOptions:M,effectiveTrackLength:0,onScroll:s,scrollPosition:t}),{mainSizeKey:_e,crossSizeKey:We,positionKey:qe,selectDelta:g,getPointerCoordinate:_,arrowLabels:pe,arrowIcons:H,directionClass:Me,orientation:oe}=Ne,be=Math.max(Ve,1),Se=e/n,Re=Math.max(e-d*2,0),le=Se*Re,ke=Math.min(Math.max(Bt,le||0),Re||Bt),ce=n-e,se=Math.max(Re-ke,0),De=ce<=0||se<=0?0:J(t/ce*se,0,se),Be=De+ke/2,Ce=n>e||U,Qe=Ce&&c;r.useLayoutEffect(()=>{Ee.current={viewportSize:e,maxScrollPosition:ce,scrollBarVisible:Ce,effectiveTapMaxDistance:be,tapCircleMaxSpeedMultiplier:$e,tapCircleMinSpeedMultiplier:y,tapCircleMaxSpeedCurve:C,tapScrollCircleOptions:M,effectiveTrackLength:se,onScroll:s,scrollPosition:t}}),r.useLayoutEffect(()=>{j.current=t},[t]),r.useLayoutEffect(()=>{G.current=s},[s]),r.useEffect(()=>{i||ee(!1)},[i]);const Ue=dr({isDragging:U,isThumbHovered:Q,enableThumbDrag:i}),we=r.useCallback((o,b)=>{const v=Ee.current,D=b??j.current;if(G.current){const Oe=G.current(o,D);if(typeof Oe=="number"&&Number.isFinite(Oe))return j.current=Oe,Oe}const z=typeof o=="function"?o(D):o,he=Math.max(v.maxScrollPosition,0),Ae=v.scrollBarVisible?J(z,0,he):0;return j.current=Ae,Ae},[]),m=r.useCallback(o=>{const b=Ee.current,v=j.current;if(!b.scrollBarVisible||b.maxScrollPosition<=0){const at=we(0,v),l=at-v;return{nextPosition:at,actualDelta:l,reachedBoundary:!0}}if(o===0)return{nextPosition:v,actualDelta:0,reachedBoundary:!1};const z=we(at=>J(at+o,0,b.maxScrollPosition),v),he=z-v,Ae=o<0&&v+o<=0,Oe=o>0&&v+o>=b.maxScrollPosition,xt=o<0&&(z<=0||Ae&&he===0)||o>0&&(z>=b.maxScrollPosition||Oe&&he===0);return{nextPosition:z,actualDelta:he,reachedBoundary:xt}},[we]),R=r.useCallback((o,b)=>{o.current+=b;const v=Math.max(Ee.current.maxScrollPosition,0);v>0&&(o.current=J(o.current,-v,v));const D=m(o.current);return o.current-=D.actualDelta,D.reachedBoundary&&(o.current=0),D},[m]),ue=r.useCallback(()=>{K.current!==null&&(window.cancelAnimationFrame(K.current),K.current=null),T.current=null,B.current=0,q.current=0},[]),xe=r.useCallback(()=>{P.current={...qt},ye(!1),ae.current?.reset(),ue()},[ue]),ve=r.useCallback(o=>{const b=P.current,v=Ee.current;if(!b.active||b.direction===0){ue();return}if(!v.scrollBarVisible||v.maxScrollPosition<=0){ue();return}const D=T.current??o,z=Math.max((o-D)/1e3,0),he=Math.min(z,cr);if(T.current=o,he<=0){K.current=window.requestAnimationFrame(ve);return}const Ae=Kt({distance:b.distance,maxDistance:v.effectiveTapMaxDistance,viewportSize:v.viewportSize,minSpeedMultiplier:v.tapCircleMinSpeedMultiplier,maxSpeedMultiplier:v.tapCircleMaxSpeedMultiplier,hasCustomMaxSpeedMultiplier:typeof v.tapScrollCircleOptions?.maxSpeedMultiplier=="number",curve:v.tapCircleMaxSpeedCurve});q.current!==b.direction&&(q.current=b.direction,B.current=0);const{reachedBoundary:Oe}=R(B,b.direction*Ae*he);if(Oe){ue();return}K.current=window.requestAnimationFrame(ve)},[R,ue]),et=r.useCallback(()=>{K.current===null&&(T.current=null,B.current=0,K.current=window.requestAnimationFrame(ve))},[ve]);r.useEffect(()=>{const o=P.current;!o.active||o.direction===0||et()},[n,e,et]),r.useEffect(()=>()=>{ue()},[ue]);const Ge=r.useCallback(o=>{P.current=o,ye(o.active),o.active&&o.direction!==0?et():ue()},[et,ue]);r.useEffect(()=>{te||xe()},[xe,te]),r.useEffect(()=>{const o=b=>{const D=b.detail?.paneId;D&&I&&D!==I||xe()};return window.addEventListener(Ft,o),()=>{window.removeEventListener(Ft,o)}},[I,xe]),r.useEffect(()=>{if(!te)return;const o=b=>{if(!P.current.active||P.current.pointerId===b.pointerId)return;const v=b.target;if(!(v instanceof Node)){xe();return}ae.current?.getElement()?.contains(v)||xe()};return document.addEventListener("pointerdown",o,!0),()=>{document.removeEventListener("pointerdown",o,!0)}},[xe,te]);const Ze=o=>{if(!Ce||se<=0||ce<=0)return 0;const b=J(o,0,se);return J(b/se*ce,0,ce)},Xe=r.useCallback(o=>{const{scrollBarVisible:b,effectiveTrackLength:v,maxScrollPosition:D}=Ee.current;if(w.debug("[ScrollBar] calculateScrollPositionFromThumb",()=>({thumbPos:o,trackLen:v,maxScroll:D})),v<=0||D<=0)return null;const z=J(o,0,v);return J(z/v*D,0,D)},[]),tt=r.useCallback(o=>{const b=o.getBoundingClientRect(),v=u?b.width:b.height,D=xt=>{const at=Number.parseFloat(xt);return Number.isFinite(at)?at:0},z=window.getComputedStyle(o),he=D(u?z.width:z.height),Ae=he>0?he+D(u?z.paddingLeft:z.paddingTop)+D(u?z.paddingRight:z.paddingBottom)+D(u?z.borderLeftWidth:z.borderTopWidth)+D(u?z.borderRightWidth:z.borderBottomWidth):0,Oe=Ae>0?Ae:u?o.offsetWidth:o.offsetHeight;return Oe<=0||v<=0?1:v/Oe},[u]),ct=r.useCallback(o=>{const b=L.current;if(b.pointerId!==o.pointerId)return;const v=o.clientX-b.startClientX,D=o.clientY-b.startClientY,z=g(v,D)/(b.scale||1);w.debug("[ScrollBar] handleThumbPointerMove",()=>({delta:z,startThumbPosition:b.startThumbPosition,clientY:o.clientY,startClientY:b.startClientY,metrics:Ee.current}));const he=Xe(b.startThumbPosition+z);he!==null&&we(he),o.cancelable&&o.preventDefault()},[g,Xe,we]),Ke=r.useCallback(o=>{const b=L.current;if(b.pointerId!==o.pointerId)return;document.removeEventListener("pointermove",ct),document.removeEventListener("pointerup",Ke),document.removeEventListener("pointercancel",Ke);const v=b.captureTarget;if(v?.hasPointerCapture?.(o.pointerId)&&v.releasePointerCapture(o.pointerId),L.current={pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1,captureTarget:null},ie(!1),V.current){const D=V.current.getBoundingClientRect();o.clientX>=D.left&&o.clientX<=D.right&&o.clientY>=D.top&&o.clientY<=D.bottom||ee(!1)}else ee(!1)},[ct]);r.useEffect(()=>()=>{document.removeEventListener("pointermove",ct),document.removeEventListener("pointerup",Ke),document.removeEventListener("pointercancel",Ke)},[ct,Ke]);const Tt=r.useRef(0),fe=r.useRef(0),ut=r.useCallback(o=>{const b=Math.max(Math.round(Ee.current.viewportSize/ir),sr);fe.current!==o&&(fe.current=o,Tt.current=0),R(Tt,o*b)},[R]),{handleArrowPointerDown:vt,handleArrowPointerUp:bt,handleArrowKeyDown:He}=mr({canUseArrowButtons:Qe,enableArrowButtons:c,resetTapScroll:xe,scrollByStep:ut}),Pt=o=>{if(!Ce)return;if(!i){o.preventDefault(),o.stopPropagation();return}if(o.pointerType==="mouse"&&o.button!==0||o.ctrlKey)return;xe();const b=o.currentTarget,v=tt(b);let D=null;if(b.setPointerCapture)try{b.setPointerCapture(o.pointerId),D=b}catch{D=null}L.current={pointerId:o.pointerId,startThumbPosition:De,startClientX:o.clientX,startClientY:o.clientY,scale:v,captureTarget:D},document.addEventListener("pointermove",ct),document.addEventListener("pointerup",Ke),document.addEventListener("pointercancel",Ke),ie(!0),ee(!0),o.preventDefault(),o.stopPropagation()},yt=o=>{if(!Ce)return;if(!a){o.preventDefault(),o.stopPropagation();return}if(o.pointerType==="mouse"&&o.button!==0||o.ctrlKey)return;const b=o.currentTarget,v=b.getBoundingClientRect(),D=_(o),z=tt(b),he=(D-(u?v.left:v.top))/z;xe();const Ae=he-ke/2,Oe=Ze(Ae);if(we(Oe),b.setPointerCapture)try{b.setPointerCapture(o.pointerId)}catch{}S.current={pointerId:o.pointerId,startThumbPosition:Ae,startClientX:o.clientX,startClientY:o.clientY,scale:z},o.preventDefault(),o.stopPropagation()},mt=()=>{S.current={pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1}},Ct=o=>{const b=S.current;if(b.pointerId!==o.pointerId)return;if(o.pointerType==="mouse"&&o.buttons===0){mt();return}const v=o.clientX-b.startClientX,D=o.clientY-b.startClientY,z=g(v,D)/(b.scale||1),he=Ze(b.startThumbPosition+z);we(he),o.cancelable&&o.preventDefault()},kt=o=>{if(S.current.pointerId!==o.pointerId)return;const b=o.currentTarget;b.hasPointerCapture?.(o.pointerId)&&b.releasePointerCapture(o.pointerId),mt(),o.preventDefault(),o.stopPropagation()},rt=o=>{if(S.current.pointerId!==o.pointerId)return;const b=o.currentTarget;b.hasPointerCapture?.(o.pointerId)&&b.releasePointerCapture(o.pointerId),mt()},ft=o=>{o.target===o.currentTarget&&S.current.pointerId===o.pointerId&&mt()},nt=r.useMemo(()=>J((ge?1:.8)*lt,0,1),[ge,lt]),st=r.useMemo(()=>{const b=`calc(50% - ${re/2}px + ${Z}px)`;return{left:W,top:b}},[W,Z,re]),it=(o,b,v,D)=>Y.jsx("button",{type:"button",tabIndex:0,className:"aqvs-scrollbar-arrow-button",style:{[_e]:d,[We]:d},"aria-label":b,onPointerDown:vt(o),onPointerUp:bt,onPointerLeave:bt,onPointerCancel:bt,onKeyDown:He(o),"aria-disabled":!c,disabled:!Qe,children:Y.jsx("span",{"aria-hidden":"true",children:v})},D),pt=h&&Ce?{orientation:oe,scrollPosition:t,maxScrollPosition:ce,contentSize:n,viewportSize:e,thumbSize:ke,thumbPosition:De,thumbCenter:Be,trackSize:Re,isDragging:U,isTapScrollActive:ge,visibleStartIndex:N,visibleEndIndex:F}:null;return Y.jsxs("div",{className:gt.twMerge("aqvs-scrollbar",Me,!Ce&&"pointer-events-none opacity-0",x),style:{[_e]:e,[We]:d},role:"scrollbar",tabIndex:-1,"aria-controls":I,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":ce,"aria-orientation":u?"horizontal":"vertical",children:[!u&&Ce&&te&&Y.jsx(Ut,{ref:ae,className:gt.twMerge("aqvs-scrollbar-tap-circle-wrapper",Te),size:re,maxVisualDistance:be,style:st,opacity:nt,renderVisual:ne,onDragChange:Ge},"tap-circle"),it(-1,pe[0],H[0],"arrow-start"),Y.jsxs("div",{className:"aqvs-scrollbar-track",style:{borderRadius:d/2},onPointerDown:yt,onPointerMove:Ct,onPointerUp:kt,onPointerCancel:rt,onLostPointerCapture:ft,"aria-disabled":!a,children:[pt&&Y.jsx("div",{className:"aqvs-scrollbar-overlay","aria-hidden":!0,children:h?.(pt)},"overlay"),Y.jsx("div",{className:gt.twMerge("aqvs-scrollbar-thumb-wrapper",!(Ce||U)&&"pointer-events-none opacity-0"),style:{[_e]:ke,[qe]:De,...u?{top:0,bottom:0}:{left:0,right:0}},onPointerDown:Pt,role:"slider","aria-orientation":u?"horizontal":"vertical","aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":ce,"aria-disabled":!i,tabIndex:-1,children:Y.jsx("div",{ref:V,className:gt.twMerge("aqvs-scrollbar-thumb",u?"aqvs-scrollbar-thumb-horizontal":"aqvs-scrollbar-thumb-vertical"),"data-testid":"aqvs-scrollbar-thumb","data-thumb-state":Ue,style:{borderRadius:d-1,cursor:i?"pointer":"default"},onMouseEnter:()=>{i&&ee(!0)},onMouseLeave:()=>{i&&ee(!1)}},"thumb")},"thumb-wrapper")]},"track"),it(1,pe[1],H[1],"arrow-end")]})},hr=["mouse","pen","touch"],Lt=(n,e)=>!(n==="mouse"||n==="pen"||n==="touch")||e.includes(n),gr=n=>n==="mouse"||n==="pen",St={maxVelocity:6,minVelocity:.02,deceleration:.0025,velocitySampleWindow:90,startVelocityThreshold:.04},wt=(n,e,t)=>{for(const[s,i,a]of e)t==="add"?n.addEventListener(s,i,a):n.removeEventListener(s,i,a)},Zt=r.forwardRef(({children:n,contentSize:e,viewportSize:t,scrollBarWidth:s=12,enableThumbDrag:i=!0,enableTrackClick:a=!0,enableArrowButtons:c=!0,enablePointerDrag:u=!0,pointerDragInputs:d=hr,onScroll:x,className:I,testId:M,style:E,background:h,tapScrollCircleOptions:N,inertiaOptions:F,itemCount:U,renderThumbOverlay:ie,wheelSpeedMultiplier:Q=1,onWheelHorizontal:ee,contentInsets:ge,visibleStartIndex:ye,visibleEndIndex:V,renderOverlay:L,initialScrollPosition:S=0,contentProps:j},G)=>{const P=r.useRef(Number.isFinite(S)?Math.max(0,S):0),ae=r.useRef(null),K=r.useRef(null),T=r.useRef(ee);r.useEffect(()=>{T.current=ee},[ee]);const B=r.useRef({frame:null,velocity:0,lastTimestamp:null,generation:0}),q=r.useMemo(()=>({maxVelocity:F?.maxVelocity??St.maxVelocity,minVelocity:F?.minVelocity??St.minVelocity,deceleration:F?.deceleration??St.deceleration,velocitySampleWindow:F?.velocitySampleWindow??St.velocitySampleWindow,startVelocityThreshold:F?.startVelocityThreshold??St.startVelocityThreshold}),[F]),Ye=r.useMemo(()=>({top:Math.max(0,ge?.top??0),bottom:Math.max(0,ge?.bottom??0)}),[ge]);w.debug("[ScrollPane] ScrollPane rendered",()=>({contentSize:e,viewportSize:t,scrollBarWidth:s,className:I,style:E,tapScrollCircleOptions:N,inertiaOptions:F,enablePointerDrag:u,contentInsets:Ye}));const Ne=r.useRef({contentSize:e,viewportSize:t});Ne.current={contentSize:e,viewportSize:t};const te=r.useMemo(()=>e>t,[e,t]),re=r.useCallback(g=>{const{contentSize:_,viewportSize:pe}=Ne.current,H=_>pe,Me=P.current;if(w.debug("[ScrollPane] scrollTo called",()=>({newPosition:g,contentSize:_,viewportSize:pe,currentIsScrollable:H,prevPosition:Me})),!H)return P.current!==0&&(P.current=0,x?.(0,Me)),P.current;const oe=typeof g=="function"?g(P.current):g;if(!Number.isFinite(oe))return w.warn("[ScrollPane] scrollTo received a non-finite position; keeping the current position",{nextPosition:oe}),P.current;const be=Math.max(_-pe,0),Se=J(oe,0,be);return P.current!==Se&&(P.current=Se,x?.(Se,Me)),P.current},[x]),W=r.useRef(re);r.useEffect(()=>{W.current=re},[re]);const Z=r.useCallback(()=>{const g=B.current;g.generation+=1,g.frame!==null&&cancelAnimationFrame(g.frame),g.frame=null,g.velocity=0,g.lastTimestamp=null},[]),Te=r.useRef(Z);r.useEffect(()=>{Te.current=Z},[Z]),r.useEffect(()=>()=>{Te.current()},[]);const Ve=r.useCallback(g=>{if(!te)return;const{maxVelocity:_,minVelocity:pe,deceleration:H,startVelocityThreshold:Me}=q,oe=J(g,-_,_);if(Math.abs(oe)<Me)return;Z(),B.current.velocity=oe,B.current.lastTimestamp=null;const be=B.current.generation,Se=Re=>{const le=B.current;if(le.generation!==be)return;if(le.lastTimestamp===null){le.lastTimestamp=Re,le.frame=requestAnimationFrame(Se);return}const ke=Re-le.lastTimestamp;if(le.lastTimestamp=Re,ke<=0){le.frame=requestAnimationFrame(Se);return}const ce=le.velocity;let se=ce;const De=H*ke;ce>0?se=Math.max(0,ce-De):ce<0&&(se=Math.min(0,ce+De));const Ce=(ce+se)/2*ke,Qe=P.current;if(Ce!==0&&W.current(xe=>xe+Ce),B.current.generation!==be)return;const Ue=P.current,{contentSize:we,viewportSize:m}=Ne.current,R=Math.max(we-m,0);le.velocity=se;const ue=Ue===Qe||Ue<=0&&se<=0||Ue>=R&&se>=0;if(Math.abs(se)<pe||ue){Z();return}le.frame=requestAnimationFrame(Se)};B.current.frame=requestAnimationFrame(Se)},[te,q,Z]),$e=r.useRef(Ve);r.useEffect(()=>{$e.current=Ve},[Ve]),r.useLayoutEffect(()=>{Ne.current={contentSize:e,viewportSize:t}},[e,t]),r.useLayoutEffect(()=>{const g=K.current;if(!g)return;const _=()=>{g.scrollTop!==0&&(w.debug("[ScrollPane] Native scroll detected, resetting to 0",()=>({scrollTop:g.scrollTop})),g.scrollTop=0),g.scrollLeft!==0&&(g.scrollLeft=0)};return g.addEventListener("scroll",_),()=>g.removeEventListener("scroll",_)},[]),r.useLayoutEffect(()=>{if(te){w.debug("[ScrollPane] Adjusting scroll position due to content or viewport size change",()=>({contentSize:e,viewportSize:t,scrollPosition:P.current}));const g=J(e-t,0,e);P.current>g&&re(g)}else re(0)},[te,re,e,t]),r.useEffect(()=>{const g=H=>{if(H.ctrlKey)return;const Me=H.shiftKey&&H.deltaX===0,oe=Me?H.deltaY:H.deltaX,be=Me?0:H.deltaY;if(oe!==0&&Math.abs(oe)>=Math.abs(be)){if(T.current){H.preventDefault(),Z();let le=oe;H.deltaMode===1?le*=16:H.deltaMode===2&&(le*=t),T.current(le)}return}if(!te||H.deltaY===0)return;H.preventDefault(),Z();let Re=H.deltaY;H.deltaMode===1?Re*=16:H.deltaMode===2&&(Re*=t),Q!==1&&(Re*=Q),w.debug("[ScrollPane] wheel event",()=>({deltaY:Re,scrollPosition:P.current,wheelSpeedMultiplier:Q,deltaMode:H.deltaMode,scrollTop:K.current?.scrollTop})),re(le=>le+Re)},_=()=>{Z()},pe=ae.current;return pe&&(pe.addEventListener("wheel",g,{passive:!1}),pe.addEventListener("pointerdown",_,{capture:!0,passive:!0})),()=>{pe&&(pe.removeEventListener("wheel",g),pe.removeEventListener("pointerdown",_,{capture:!0}))}},[te,re,Z,t,Q]),r.useImperativeHandle(G,()=>({scrollTo:g=>(Z(),re(g)),getScrollPosition:()=>P.current,getContentSize:()=>e,getViewportSize:()=>t}),[re,e,t,Z]);const y=r.useId(),lt=j?.id??y,ne=r.useRef({pointerType:"",pointerId:null,startClientY:0,startScroll:0,isDragging:!1,shouldCancelNextClick:!1,clickResetTimer:null,velocitySamples:[]}),C=r.useRef(u),Ee=r.useRef(d);r.useEffect(()=>{C.current=u},[u]),r.useEffect(()=>{Ee.current=d},[d]);const _e=r.useRef(te);r.useEffect(()=>{_e.current=te},[te]);const We=r.useRef(q);r.useEffect(()=>{We.current=q},[q]),r.useEffect(()=>{const g=ne.current;if(u&&te&&(g.pointerId===null||Lt(g.pointerType,d))||g.pointerId===null)return;const _=K.current;g.clickResetTimer!==null&&(window.clearTimeout(g.clickResetTimer),g.clickResetTimer=null);const pe=g.isDragging&&g.shouldCancelNextClick,H=g.pointerId;g.pointerId=null,g.pointerType="",g.startClientY=0,g.startScroll=0,g.isDragging=!1,g.shouldCancelNextClick=pe,g.velocitySamples=[],_?.hasPointerCapture(H)&&_.releasePointerCapture(H)},[u,d,te]),r.useEffect(()=>{const g=K.current;if(!g)return;const _=6,pe=()=>typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now(),H=()=>{const m=ne.current;m.pointerId=null,m.pointerType="",m.startClientY=0,m.startScroll=0,m.isDragging=!1,m.velocitySamples=[]},Me=()=>{const m=ne.current;m.clickResetTimer!==null&&(window.clearTimeout(m.clickResetTimer),m.clickResetTimer=null)},oe=m=>{const R=ne.current,ue=pe();R.velocitySamples.push({clientY:m,time:ue});const xe=We.current.velocitySampleWindow;R.velocitySamples=R.velocitySamples.filter(ve=>ue-ve.time<=xe)},be=m=>m instanceof HTMLElement&&m.closest("[data-scrollpane-ignore-drag='true']")!==null,Se=m=>{const R=ne.current;R.shouldCancelNextClick&&(m.preventDefault(),m.stopPropagation(),R.shouldCancelNextClick=!1)},Re=m=>{const R=ne.current;if(!R.isDragging){if(R.isDragging=!0,R.shouldCancelNextClick=!0,!g.hasPointerCapture(m.pointerId))try{g.setPointerCapture(m.pointerId)}catch{}oe(m.clientY)}},le=m=>m.isTrusted||m.target===g,ke=m=>{const R=ne.current;g.hasPointerCapture(m)&&g.releasePointerCapture(m),R.shouldCancelNextClick=!1,Me(),H()},ce=m=>{const R=ne.current;if(R.pointerId!==m.pointerId)return;if(m.buttons===0&&gr(m.pointerType)){ke(m.pointerId);return}if(!(C.current&&_e.current)||!Lt(m.pointerType,Ee.current)||!R.isDragging&&(Math.abs(m.clientY-R.startClientY)<_||(Re(m),!R.isDragging)))return;oe(m.clientY);const ue=m.clientY-R.startClientY,xe=R.startScroll-ue;W.current(xe),m.cancelable&&m.preventDefault()},se=()=>{const m=ne.current;return m.pointerId!==null||!m.shouldCancelNextClick?!1:(Me(),m.clickResetTimer=window.setTimeout(()=>{const R=ne.current;R.shouldCancelNextClick=!1,R.clickResetTimer=null},0),!0)},De=m=>{const R=ne.current;if(R.pointerId!==m.pointerId){se();return}R.isDragging&&R.shouldCancelNextClick&&m.cancelable&&(m.preventDefault(),m.stopPropagation()),R.isDragging&&oe(m.clientY);let ue=0;if(R.isDragging&&R.velocitySamples.length>=2){const ve=R.velocitySamples,et=We.current.velocitySampleWindow,Ge=ve[ve.length-1],Ze=ve.find(Xe=>Ge.time-Xe.time<=et)??ve[0];if(Ge&&Ze&&Ge.time!==Ze.time){const Xe=Ge.clientY-Ze.clientY,tt=Ge.time-Ze.time;ue=-(Xe/tt)}}Me(),R.shouldCancelNextClick&&(R.clickResetTimer=window.setTimeout(()=>{const ve=ne.current;ve.shouldCancelNextClick=!1,ve.clickResetTimer=null},0));const xe=We.current.startVelocityThreshold;H(),g.hasPointerCapture(m.pointerId)&&g.releasePointerCapture(m.pointerId),Math.abs(ue)>=xe&&$e.current?.(ue)},Be=m=>{if(ne.current.pointerId!==null){if(!m.isPrimary||m.pointerType!==ne.current.pointerType)return;ke(ne.current.pointerId)}if(ne.current.shouldCancelNextClick&&(Me(),ne.current.shouldCancelNextClick=!1),!(C.current&&_e.current)||!Lt(m.pointerType,Ee.current)||m.button!==0&&m.pointerType==="mouse"||m.ctrlKey||m.metaKey||m.altKey||be(m.target))return;window.dispatchEvent(new CustomEvent(Ft,{detail:{paneId:y}})),Te.current?.();const R=ne.current;Me(),R.pointerId=m.pointerId,R.pointerType=m.pointerType,R.startClientY=m.clientY,R.startScroll=P.current,R.isDragging=!1,R.shouldCancelNextClick=!1,R.velocitySamples=[]},Ce=m=>{if(ne.current.pointerId!==m.pointerId){se();return}le(m)&&ke(m.pointerId)},Ue=[["click",Se,!0],["pointerdown",Be,{passive:!1}],["lostpointercapture",m=>{m.target!==g||ne.current.pointerId!==m.pointerId||ke(m.pointerId)},void 0]],we=[["pointermove",ce,{passive:!1}],["pointerup",De,void 0],["pointercancel",Ce,void 0]];return wt(g,Ue,"add"),wt(window,we,"add"),()=>{wt(g,Ue,"remove"),wt(window,we,"remove");const m=ne.current;m.pointerId!==null&&g.hasPointerCapture(m.pointerId)&&g.releasePointerCapture(m.pointerId),Me(),H()}},[y]);const qe=r.useCallback(g=>(Z(),re(g)),[re,Z]);return Y.jsxs("div",{ref:ae,"data-testid":M,className:gt.twMerge("aqvs-scroll-pane",I),style:E,children:[Y.jsxs("div",{ref:K,className:gt.twMerge("aqvs-scroll-pane-content"),"data-testid":"aqvs-scroll-pane-content",style:{height:t,paddingTop:Ye.top,paddingBottom:Ye.bottom,...u&&te&&d.some(g=>g==="touch"||g==="pen")?{touchAction:"none"}:{}},...j,id:lt,children:[h,n(P.current)]}),Y.jsx(Gt,{contentSize:e,viewportSize:t,scrollPosition:P.current,onScroll:qe,enableThumbDrag:i,enableTrackClick:a,enableArrowButtons:c,scrollBarWidth:s,ariaControls:lt,tapScrollCircleOptions:N,itemCount:U,renderThumbOverlay:ie,visibleStartIndex:ye,visibleEndIndex:V},"scrollbar"),L?.()]})}),Ht=(n,e,t)=>Math.min(Math.max(n,e),t),br=({dragState:n,normalizedDistance:e,sizeScale:t,size:s})=>{const i=Math.max(s/2,1),a=1+e*.65,c=Math.max(.65,1-e*.25),u=n.direction*e*26*t,d=.8+e*.18,x=3*t,I=6*t,M=22*t,E=Math.abs(u)+I,h=u>0?x:-Math.abs(u)-x,N=Math.max(2.5,3*t),F=Ht(n.offsetX,-i,i),U=Ht(n.offsetY,-i,i),ie=i*.35,Q=F/i*ie,ee=U/i*ie,ge=Q*.45,ye=ee*.45,V=Math.max(M*.38,6),L=.65+e*.2,S=n.active;return Y.jsxs(Y.Fragment,{children:[Y.jsx("div",{className:"aqvs-tap-scroll-circle-gradient",style:{transform:`scale(${c}, ${a})`,transition:S?"40ms transform ease-out":"200ms ease transform"}}),Y.jsx("div",{className:"aqvs-sample-visual-pupil",style:{width:M,height:M,transform:`translate(calc(-50% + ${Q}px), calc(-50% + ${ee}px)) scale(${c}, ${d*a})`,transition:S?"70ms transform ease-out":"200ms ease transform"}}),Y.jsx("div",{className:"aqvs-sample-visual-highlight",style:{width:V,height:V,transform:`translate(calc(-50% + ${ge}px), calc(-50% + ${ye}px)) scale(${c}, ${a})`,opacity:L,boxShadow:"0 0 8px rgba(255,255,255,0.45)",transition:S?"120ms opacity 150ms, 120ms transform ease-out ease-out":"220ms ease transform, 240ms opacity ease"}}),Y.jsx("div",{className:"aqvs-sample-visual-rod",style:{width:N,height:E,transform:`translate(-50%, ${h}px)`,opacity:e,transition:S?"40ms height, 60ms opacity ease-out ease-out":"200ms ease height, 120ms ease opacity"}})]})},Et=100,xr=n=>{if(!Number.isFinite(n))return 0n;const e=Math.trunc(n);return e<=0?0n:BigInt(e)},_t=(n,e)=>{if(!Number.isFinite(n))throw new Error(`valueFn returned a non-finite value at index ${e}: ${n}`);return n},It=n=>{if(n<=0||!Number.isFinite(n))return 0;const e=Math.trunc(n);if(e<=2147483647)return e&-e;const t=BigInt(e)&-BigInt(e);return Number(t)};class ot{tree;deltas;size;baseValue;valueFn;total;constructor(e,t,s){this.reset(e,t,s)}reset(e,t,s){const i=Number.isFinite(e)&&e>0?Math.trunc(e):0;if(typeof t!="function"){this.size=i,this.tree=new Map,this.deltas=new Map,this.valueFn=void 0,this.baseValue=t,this.total=this.baseValue*this.size;return}let a=0,c;if(i>0){const u=s?.sampleRange??{from:0,to:Math.min(Et-1,i-1)};let d=Math.max(0,Math.trunc(u.from)),x=Math.min(Math.trunc(u.to),i-1);if(d>x&&(d=0,x=Math.min(Et-1,i-1)),i>Et)a=ot._sampleBaseValueStrided(t,i,Et),s?.materialize&&(c={from:d,values:ot._collectValidatedValues(t,d,x)});else{const I=ot._collectValidatedValues(t,d,x);a=ot._modeOrMedian([...I]),s?.materialize&&(c={from:d,values:I})}}if(this.size=i,this.tree=new Map,this.deltas=new Map,this.total=void 0,this.valueFn=t,this.baseValue=a,c)for(let u=0;u<c.values.length;u++){const d=c.from+u;if(d>=this.size)break;const x=c.values[u]-this.baseValue;x!==0&&(this.deltas.set(d,x),this._updateTree(d,x))}this.total=this.getTotal()}setValueFn(e,t){if(t?.reset){this.reset(this.size,e);return}typeof e=="function"?this.valueFn=e:(this.valueFn=void 0,this.baseValue=e,this.total=this._computeTreeTotal())}static _collectValidatedValues(e,t,s){const i=[];for(let a=t;a<=s;a++)i.push(_t(e(a),a));return i}static _modeOrMedian(e){if(e.length===0)return 0;e.sort((c,u)=>c-u);const t=Math.floor(e.length/2);let s;e.length%2===0?s=Math.floor((e[t-1]+e[t])/2):s=e[t];const i=new Map;let a=0;for(const c of e){const u=(i.get(c)??0)+1;i.set(c,u),u>a&&(a=u)}if(a>e.length*.2){const c=[];for(const[d,x]of i.entries())x===a&&c.push(d);const u=c.reduce((d,x)=>d+x,0);s=Math.floor(u/c.length)}return s}static _sampleBaseValueStrided(e,t,s){if(t<=0)return 0;let i=Math.max(1,Math.ceil(t/s));i%2===0&&(i+=1);const a=[];for(let c=0;c<t&&a.length<s;c+=i)a.push(_t(e(c),c));return ot._modeOrMedian(a)}update(e,t){return this.updates([{index:e,value:t}])}updates(e){const t=this._buildDeltaUpdates(e);return t.length>0?this.updateDeltas(t):this.total}updateDelta(e,t){return this.updateDeltas([{index:e,change:t}])}updateDeltas(e){const t=new Map;for(const{index:s,change:i}of e){if(s<0||s>=this.size)throw new Error(`Index ${s} out of bounds`);if(!Number.isInteger(s))throw new Error(`Index must be an integer: ${s}`);if(!Number.isFinite(i))throw new Error(`Change must be a finite number: ${i}`);const c=(t.get(s)??this.deltas.get(s)??0)+i;if(c+this.baseValue<-1e-9)throw new Error(`Change would make the value at index ${s} negative: ${c+this.baseValue}`);t.set(s,c)}for(const{index:s,change:i}of e){const c=(this.deltas.get(s)??0)+i;c===0?this.deltas.delete(s):this.deltas.set(s,c),this._updateTree(s,i)}return this.total}_updateTree(e,t){if(t===0)return;let s=e+1;for(;s<=this.size;){this.tree.set(s,(this.tree.get(s)??0)+t);const i=It(s);if(i===0)break;s+=i}this.total!==void 0&&(this.total+=t)}_buildDeltaUpdates(e){const t=[],s=new Map;for(const{index:i,value:a}of e){if(i<0||i>=this.size)throw new Error(`Index ${i} out of bounds`);if(!Number.isInteger(i))throw new Error(`Index must be an integer: ${i}`);if(!Number.isFinite(a))throw new Error(`Value must be a finite number: ${a}`);if(a<0)throw new Error("Value cannot be negative.");const c=s.has(i)?s.get(i)??0:this.deltas.get(i)??0,u=c+this.baseValue,d=a-u;d!==0&&t.push({index:i,change:d}),s.set(i,c+d)}return t}_computeTreeTotal(){if(this.size<=0)return 0;let e=0,t=this.size;for(;t>0;){e+=this.tree.get(t)??0;const s=It(t);if(s===0)break;t-=s}return e+this.baseValue*this.size}_materialize(e,t=!0){if(this.valueFn){const s=this.deltas.get(e)??0,a=_t(this.valueFn(e),e)-this.baseValue;if(a!==s&&(a===0?this.deltas.delete(e):this.deltas.set(e,a),t)){const c=a-s;this._updateTree(e,c)}}}_materializeRanges(e,t,s=!1){if(!(e?.materialize&&this.valueFn))return;const i=e.ranges;if(i&&i.length>0){for(const u of i){const d=Math.max(0,Math.trunc(u.from)),x=Math.min(Math.trunc(u.to),this.size-1);for(let I=d;I<=x;I++)this._materialize(I)}if(t===void 0)return;if(s){this._materialize(t);return}const a=i[0].from,c=i[i.length-1].to;t>=a&&t<=c&&this._materialize(t);return}t!==void 0&&this._materialize(t)}_findIndex(e,t={},s){if(this.size>=1073741824)return this._findIndexLarge(e,t,s);if(this.size===0)return{index:-1,total:this.total??0,cumulative:void 0,currentValue:void 0,safeIndex:void 0};this._materializeRanges(t.materializeOption);const i=t.materializeOption?.materialize===!0;let a;for(;;){if(a=this._descend(e,s),a<0||a>=this.size)return{index:-1,total:this.total??this.getTotal(),cumulative:void 0,currentValue:void 0,safeIndex:void 0};if(!i)break;const u=this.deltas.get(a)??0;if(this._materialize(a),(this.deltas.get(a)??0)===u)break}const c=this.prefixSum(a);return{index:a,total:this.total??c.total,cumulative:c.cumulative,currentValue:c.currentValue,safeIndex:c.safeIndex}}_descend(e,t){let s=0,i=0,a=1;for(;a<<1<=this.size;)a<<=1;for(;a>0;a>>=1){const c=s+a;if(c<=this.size){const d=(this.tree.get(c)??0)+this.baseValue*a;(t?i+d<e:i+d<=e)&&(s=c,i+=d)}}return t?s:s-1}_findIndexLarge(e,t,s){if(this.size===0)return{index:-1,total:this.total??0,cumulative:void 0,currentValue:void 0,safeIndex:void 0};const i=xr(this.size);if(i===0n)return{index:-1,total:this.total??0,cumulative:void 0,currentValue:void 0,safeIndex:void 0};this._materializeRanges(t.materializeOption);const a=t.materializeOption?.materialize===!0;for(;;){let c=0n,u=i-1n,d,x,I=this.total;for(;c<=u;){const h=c+u>>1n,N=Number(h),F=this.prefixSum(N);if(I=F.total,s?F.cumulative>=e:F.cumulative<=e)if(d=h,x=F,s){if(h===0n)break;u=h-1n}else c=h+1n;else if(s)c=h+1n;else{if(h===0n)break;u=h-1n}}const M=x,E=d!==void 0?Number(d):-1;if(a&&E>=0){const h=this.deltas.get(E)??0;if(this._materialize(E),(this.deltas.get(E)??0)!==h)continue}return{index:E,total:I,cumulative:M?.cumulative,currentValue:M?.currentValue,safeIndex:M?.safeIndex}}}prefixSum(e,t){if(e<0||Number.isNaN(e))return{cumulative:0,total:this.total,currentValue:0,safeIndex:0};if(this.size===0)return{cumulative:0,total:this.total??0,currentValue:0,safeIndex:0};const s=J(Math.trunc(e),0,this.size-1),i=t?.materializeOption;this._materializeRanges(i,s,!0);let a=0,c=s+1;for(;c>0;){const d=this.tree.get(c)??0;a+=d;const x=It(c);if(x===0)break;c-=x}const u=i?.materialize?this.get(s):(this.deltas.get(s)||0)+this.baseValue;return{cumulative:a+this.baseValue*(s+1),total:this.total,currentValue:u,safeIndex:s}}get(e,t){if(this.size===0)return 0;if(!Number.isInteger(e)||e<0||e>=this.size)throw new Error("Index out of bounds");const s=t?.materializeOption;return this._materializeRanges(s,e),(this.deltas.get(e)??0)+this.baseValue}getTotal(e){const t=e?.materializeOption;if(this._materializeRanges(t),this.total===void 0)if(this.size===0)this.total=0;else{this.total=this._computeTreeTotal();const s=this.prefixSum(this.getSize()-1);s.cumulative!==s.total&&w.error("Inconsistent Fenwick Tree state")}return this.total}rebuildTree(e){if(e?.materialize&&this.valueFn){const s=this.valueFn;this.reset(this.size,i=>s(i),{materialize:!0});return}const t=new Map;for(const[s,i]of this.deltas.entries()){if(i===0)continue;let a=s+1;for(;a<=this.size;){t.set(a,(t.get(a)??0)+i);const c=It(a);if(c===0)break;a+=c}}this.tree=t,this.total=this._computeTreeTotal()}calculateAccumulatedError(){if(this.total===void 0)return 0;let e=this.baseValue*this.size;for(const[t,s]of this.deltas)t<this.size&&(e+=s);return this.total-e}changeSize(e){if(!Number.isFinite(e))throw new Error(`Size must be a finite number: ${e}`);const t=Math.max(0,Math.trunc(e)),s=this.size;if(t===s)return;if(t>s)if(s===0&&this.deltas.size>0){for(const a of this.deltas.keys())a>=t&&this.deltas.delete(a);this.size=t,this.rebuildTree()}else this._growSize(s,t);else{if(t>0)for(const a of this.deltas.keys())a>=t&&this.deltas.delete(a);this.size=t,this.rebuildTree()}const i=this.prefixSum(this.getSize()-1);i.cumulative!==i.total&&w.error("Inconsistent Fenwick Tree state")}static _minCoveredLowBound(e,t){let s=1;for(;;){const i=s*2;if(Math.floor(t/i)*i<=e)break;s=i}return s*Math.floor(e/s)}_propagateDeltaToGrownNodes(e,t,s,i){let a=e+1;for(;a<=s;){const c=It(a);if(c===0)break;a+=c}for(;a<=i;){this.tree.set(a,(this.tree.get(a)??0)+t);const c=It(a);if(c===0)break;a+=c}}_growSize(e,t){if(this.size=t,this.deltas.size>0){const s=ot._minCoveredLowBound(e,t);if(e-s<this.deltas.size)for(let a=s;a<e;a++){const c=this.deltas.get(a);c===void 0||c===0||this._propagateDeltaToGrownNodes(a,c,e,t)}else for(const[a,c]of this.deltas.entries())c===0||a<s||this._propagateDeltaToGrownNodes(a,c,e,t)}this.total=this._computeTreeTotal()}getSize(){return this.size}get base(){return this.baseValue}findIndexAtOrAfter(e,t){return this._findIndex(e,t??{},!0)}findIndexAtOrBefore(e,t){return this._findIndex(e,t??{},!1)}}const Ir=(n,e)=>{const t=n?.sampleRange,s=e?.sampleRange;return t===s?!1:t&&s?t.from!==s.from||t.to!==s.to:!0},Jt=(n,e,t)=>{const s=Number.isFinite(n)&&n>0?Math.trunc(n):0,i=r.useRef(null),a=r.useRef({size:s,valueOrFn:e,options:t});i.current===null&&(i.current=new ot(s,e,t));const c=i.current,u=a.current,d=u.size!==s,x=u.valueOrFn!==e,I=Ir(u.options,t),M=u.size===0&&s>0&&(!i.current||i.current.base===0);if(x||I){const E=t?.resetOnValueFnChange??!0;I||x&&E||M?(t?.debug&&w.debug("[useFenwickMapTree] reset",{valueOrFnChanged:x,optionsChanged:I}),c.reset(s,e,t)):(d&&(t?.debug&&w.debug("[useFenwickMapTree] resize (with valueFn change)",{from:u.size,to:s}),c.changeSize(s)),t?.debug&&w.debug("[useFenwickMapTree] setValueFn (no reset)",{valueOrFnChanged:x}),c.setValueFn(e,{reset:!1})),a.current={size:s,valueOrFn:e,options:t}}else d&&(t?.debug&&w.debug("[useFenwickMapTree] resize",{from:u.size,to:s}),M?c.reset(s,e,t):c.changeSize(s),a.current={size:s,valueOrFn:e,options:t});return c};class Tr{key;value;prev=null;next=null;constructor(e,t){this.key=e,this.value=t}}class Ot{head=null;tail=null;addToTail(e){this.tail?(this.tail.next=e,e.prev=this.tail,this.tail=e):this.head=this.tail=e}remove(e){e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev,e.prev=null,e.next=null}removeHead(){const e=this.head;return e&&this.remove(e),e}moveToTail(e){this.remove(e),this.addToTail(e)}}function Qt(n){const e=r.useRef(new Map),t=r.useRef(new Ot),s=Math.floor(n),i=r.useRef(s);r.useEffect(()=>{if(i.current=s,Number.isNaN(s)||s<0){w.warn(`useLruCache: invalid capacity ${n}; the cache will not store any entries.`),e.current.clear(),t.current=new Ot;return}if(Number.isFinite(s))for(;e.current.size>s;){const I=t.current.removeHead();if(I)e.current.delete(I.key);else break}},[n,s]);const a=r.useCallback(I=>{const M=e.current.get(I);if(M)return t.current.moveToTail(M),M.value},[]),c=r.useCallback((I,M)=>{const E=i.current;if(Number.isNaN(E)||E<=0)return;let h=e.current.get(I);if(h)h.value=M,t.current.moveToTail(h);else{if(e.current.size>=E){const N=t.current.removeHead();N&&e.current.delete(N.key)}h=new Tr(I,M),e.current.set(I,h),t.current.addToTail(h)}},[]),u=r.useCallback(I=>e.current.has(I),[]),d=r.useCallback(I=>{const M=e.current.get(I);M&&(t.current.remove(M),e.current.delete(I))},[]),x=r.useCallback(()=>{e.current.clear(),t.current=new Ot},[]);return r.useMemo(()=>({get:a,set:c,has:u,remove:d,clear:x}),[a,c,u,d,x])}const Mr=1e4,Sr=()=>{const{get:n,set:e,has:t,clear:s}=Qt(Mr);return r.useMemo(()=>({get:n,set:e,has:t,clear:s}),[n,e,t,s])},Ie=(n,e)=>e<=0?0:J(n,0,e-1),Xt=n=>({top:Math.max(0,n?.top??0),bottom:Math.max(0,n?.bottom??0)}),je=(n,e)=>n<=e?0:n-e,ht=(n,e)=>n<=0?0:n+e,Nt=1e3,jt=2e3,Rr=1048576,Rt=n=>{if(!Number.isFinite(n))return 0n;const e=Math.trunc(n);return e<=0?0n:BigInt(e)},vr=(n,e,t,s,i,a,c,u)=>{const d=Rt(s);if(d===0n)return{renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0};const x=V=>V<0n?0n:V>=d?d-1n:V,I={materializeOption:{materialize:!1}},{index:M,cumulative:E}=a.findIndexAtOrAfter(n,I);let h;M===-1?h=d-1n:(E===n?h=Rt(M+1):h=Rt(M),h>=d&&(h=d-1n)),n<=0&&(h=0n),u&&n>=c&&(h=d-1n);const N=V=>{const L=Number(V);if(!Number.isSafeInteger(L))return null;const{cumulative:S}=a.prefixSum(L,{materializeOption:{materialize:!1}});if(!Number.isFinite(S))return null;const{index:j}=a.findIndexAtOrAfter(S+.5,{materializeOption:{materialize:!1}});if(j===-1)return null;const G=Rt(j);return G>V?G:null},F=V=>{let L=0,S=V,j=V,G=0n,P=0;for(;S<d&&L<e;){const ae=Number(S),K=i(ae);if(L+=K,j=S,S+=1n,G+=1n,!Number.isFinite(K)||K<0)break;if(K===0){if(P+=1,P>Nt){const T=N(j);if(T!==null&&T>S)S=T,P=0;else if(T!==null&&T===S&&i(Number(S))>0)P=0;else break}}else P=0}return G===0n&&(j=V),{height:L,end:j}};let{height:U,end:ie}=F(h);if(U<e&&h>0n){let V=h,L=U,S=0;for(;V>0n&&L<e;){V-=1n;const G=Number(V),P=i(G);if(L+=P,!Number.isFinite(P)||P<0)break;if(P===0){if(S+=1,S>Nt){const ae=Number(V);if(!Number.isSafeInteger(ae))break;const{cumulative:K}=a.prefixSum(ae,{materializeOption:{materialize:!1}});if(!Number.isFinite(K))break;const{index:T}=a.findIndexAtOrAfter(K-.5,{materializeOption:{materialize:!1}}),B=T===-1?-1n:Rt(T);if(B>=0n&&B<V)V=B+1n,S=0;else if(B===V&&V>=1n&&i(Number(V-1n))>0)S=0;else break}}else S=0}h=x(V);const j=F(h);U=j.height,ie=j.end}const Q=x(h),ee=x(ie),ge=x(Q-BigInt(Math.max(0,t))),ye=x(ee+BigInt(Math.max(0,t)));return{renderingStartIndex:Ie(Number(ge),s),renderingEndIndex:Ie(Number(ye),s),visibleStartIndex:Ie(Number(Q),s),visibleEndIndex:Ie(Number(ee),s)}},Pr=(n,e,t,s,i,a,c)=>{if(s===0)return{renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0};const u=Number.isFinite(c),d=u?Math.min(Math.max(0,n),c):Math.max(0,n);if(s>=Number.MAX_SAFE_INTEGER)return vr(d,e,t,s,i,a,c,u);const{index:x,cumulative:I,currentValue:M}=a.findIndexAtOrAfter(d,{materializeOption:{materialize:!1}}),E=x===-1?e<=0||(I??0)<d+(M??0)?s-1:0:x;let h=Ie(E,s),N=0;if(x!==-1&&I===d)h=Ie(x+1,s),N=0;else if(h===x&&I!==void 0&&M!==void 0)N=I-M-d;else{const{cumulative:V,currentValue:L}=a.prefixSum(h,{materializeOption:{materialize:!1}});N=(V??0)-(L??0)-d}const F=N,U=(V,L)=>{let S=V,j=L,G=0;for(;S<s&&j<e;){const P=i(S);if(j+=P,S++,!Number.isFinite(P)||P<0)break;if(P===0){if(G++,G>Nt){const{cumulative:ae}=a.prefixSum(S-1,{materializeOption:{materialize:!1}}),{index:K}=Number.isFinite(ae)?a.findIndexAtOrAfter(ae+.5,{materializeOption:{materialize:!1}}):{index:-1};if(K>S)S=K,G=0;else if(K===S&&i(S)>0)G=0;else break}}else G=0}return{cursor:S,height:j}},ie=U(h,N);let Q=ie.cursor;if(N=ie.height,N<e&&h>0){let V=N+Math.abs(Math.min(0,F)),L=h-1,S=0;for(;L>=0&&V<e;){const G=i(L);if(V+=G,!Number.isFinite(G)||G<0){L--;break}if(G===0){if(S++,S>Nt){const{cumulative:P}=a.prefixSum(L,{materializeOption:{materialize:!1}}),{index:ae}=Number.isFinite(P)?a.findIndexAtOrAfter(P-.5,{materializeOption:{materialize:!1}}):{index:-1};if(ae!==-1&&ae<L){L=ae,S=0;continue}if(ae===L&&L>=1&&i(L-1)>0)S=0;else{L--;break}}}else S=0;L--}h=Ie(L+1,s);const j=U(h,0);Q=j.cursor,N=j.height}const ee=Ie(h-t,s),ge=Ie(Math.max(Q-1,h),s),ye=Ie(ge+t,s);return{renderingStartIndex:ee,renderingEndIndex:ye,visibleStartIndex:h,visibleEndIndex:ge}},$t=(n,e,t)=>{const s=Math.max(0,e??0),i=r.useRef({last:0,id:null,arg:null}).current;return r.useEffect(()=>()=>{if(i.id!==null&&(cancelAnimationFrame(i.id),i.id=null),i.arg!==null&&n.current){try{t(n.current,i.arg)}catch(a){console.error("[useThrottledInvoker] Error flushing pending callback on unmount",a)}i.arg=null}},[i,n,t]),r.useCallback(a=>{if(i.arg=a,i.id!==null)return;const c=u=>{if(i.id=null,i.arg===null)return;const d=u-i.last;if(s===0||i.last===0||d>=s){if(n.current)try{t(n.current,i.arg)}catch(x){console.error("[useThrottledInvoker] Error invoking callback",x)}i.arg=null,i.last=u}i.arg!==null&&(i.id=requestAnimationFrame(c))};i.id=requestAnimationFrame(c)},[s,t,n,i])},yr=r.memo(({index:n,top:e,height:t,item:s,children:i,clipItemHeight:a,enableKeyboardNavigation:c,onKeyDown:u,onFocus:d,registerItemRef:x})=>{const I=r.useCallback(N=>x(n,N),[n,x]),M=r.useCallback(N=>u(N,n),[n,u]),E=r.useCallback(()=>d(n),[n,d]),h=r.useCallback(N=>{N.currentTarget.focus({preventScroll:!0})},[]);return Y.jsx("div",{ref:I,"data-index":n,"data-virtualscroll-item":"true",className:"aqvs-item-container",style:{top:e,height:t,overflow:a?"hidden":void 0},tabIndex:c?-1:void 0,onPointerDown:c?h:void 0,onKeyDownCapture:c?M:void 0,onFocusCapture:c?E:void 0,children:i(s,n)})}),Cr=({itemCount:n,getItem:e,getItemKey:t,getItemHeight:s,viewportSize:i,overscanCount:a=15,className:c,testId:u,onScroll:d,onRangeChange:x,children:I,background:M,initialScrollIndex:E,initialScrollOffset:h,initialScrollAnchor:N,callbackThrottleMs:F=5,contentInsets:U,onItemFocus:ie,scrollBarOptions:Q,behaviorOptions:ee,onWheelHorizontal:ge,contentProps:ye},V)=>{const{width:L,enableThumbDrag:S,enableTrackClick:j,enableArrowButtons:G,enableScrollToTopBottomButtons:P,renderThumbOverlay:ae,tapScrollCircleOptions:K}=Q??{},{enablePointerDrag:T,pointerDragInputs:B,enableKeyboardNavigation:q=!0,wheelSpeedMultiplier:Ye,inertiaOptions:Ne,clipItemHeight:te=!1,resetOnGetItemHeightChange:re=!1}=ee??{},W=r.useRef(null),Z=r.useRef({renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0,scrollPosition:0,totalHeight:0}),Te=r.useRef(N&&n>0?{index:J(Math.trunc(N.index),0,n-1),align:"top",offset:-Math.max(0,N.offsetPx??0)}:null),Ve=r.useRef(!1),$e=r.useRef(!0);r.useEffect(()=>{if($e.current){$e.current=!1;return}re&&(Te.current=null)},[re,s]);const y=r.useMemo(()=>Xt(U),[U]),[lt]=r.useState(()=>{const f=N?.index??E,p=typeof f=="number"&&Number.isFinite(f)?Math.max(0,Math.trunc(f)):0;return{from:Math.max(0,p-50),to:p+50}}),ne=r.useMemo(()=>({sampleRange:lt,resetOnValueFnChange:re,materialize:!0}),[re,lt]),C=Jt(n,s,ne),[Ee]=r.useState(()=>{let l=0,f=0;if(N&&n>0){const p=J(Math.trunc(N.index),0,n-1),k=Math.max(0,N.offsetPx??0),A=J(p-a*2,0,n-1),O=J(p+a*2,0,n-1),X=p>0||k>0?{materializeOption:{materialize:!0,ranges:[{from:A,to:O}]}}:void 0,{cumulative:$,total:Pe,currentValue:de}=C.prefixSum(p,X),me=Math.max($-de+k,0);l=ht(me,y.top),f=Pe??C.getTotal()}else if(typeof E=="number"){const p=J(E,0,n-1),k=J(p-a*2,0,n-1),A=J(p+a*2,0,n-1),O=E>0?{materializeOption:{materialize:!0,ranges:[{from:k,to:A}]}}:void 0,{cumulative:X,total:$,currentValue:Pe}=C.prefixSum(E,O),de=Math.max(X-Pe,0);l=ht(de,y.top),f=$??C.getTotal()}else typeof h=="number"&&(l=ht(Math.max(h,0),y.top)),f=C.getTotal();return{position:l,total:f}}),[_e,We]=r.useState(Ee.position),[qe,g]=r.useState(Ee.total),_=r.useRef(Ee.position),pe=r.useRef(y.top),H=r.useRef(d??void 0),Me=r.useRef(x??void 0),oe=r.useRef(new Map),be=r.useRef(null),Se=r.useRef(null),[Re,le]=r.useState(null),[ke,ce]=r.useState(!1),se=r.useRef(null),De=r.useRef(!1),Be=r.useRef(0),Ce=r.useRef(!1),Qe=r.useRef(!1),Ue=r.useRef(n);Ue.current!==n&&(Ue.current=n,Qe.current=!0),r.useEffect(()=>{H.current=d??void 0,Me.current=x??void 0},[x,d]);const we=r.useCallback(l=>{if(q&&l&&typeof l.focus=="function")try{l.focus({preventScroll:!0})}catch{l.focus()}},[q]),m=r.useCallback((l,{position:f,totalHeight:p})=>{l(f,p)},[]),R=$t(H,F,m),ue=r.useCallback((l,f)=>{l(f)},[]),xe=$t(Me,F,ue),ve=r.useRef(y.top);ve.current=y.top;const et=r.useRef(R);et.current=R,r.useEffect(()=>(Ve.current=!1,()=>{Ve.current=!0,se.current&&(clearTimeout(se.current),se.current=null)}),[]),r.useEffect(()=>{q||(oe.current.clear(),be.current=null,Se.current=null)},[q]);const Ge=r.useCallback((l,f)=>{if(!f){oe.current.delete(l);return}q&&(oe.current.set(l,f),be.current===l&&(be.current=null,Se.current=l,we(f)))},[q,we]),Ze=.01,Xe=r.useRef({rafId:null,loopActive:!1,idleFrames:0,lastRenderedPosition:Ee.position}),tt=r.useCallback(()=>{const l=Xe.current;l.rafId!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(l.rafId),l.rafId=null,l.loopActive=!1,l.idleFrames=0},[]);r.useEffect(()=>()=>{tt()},[tt]);const ct=r.useRef(()=>{}),Ke=r.useCallback(()=>{const l=Xe.current;l.rafId=null;const f=_.current,p=je(f,ve.current),k=C.getTotal();if(We(O=>Math.abs(O-f)<Ze?O:f),Math.abs(l.lastRenderedPosition-f)>=Ze?(et.current({position:p,totalHeight:k}),l.lastRenderedPosition=f,l.idleFrames=0):l.idleFrames+=1,l.idleFrames>=2){tt();return}if(typeof requestAnimationFrame=="function"){l.rafId=requestAnimationFrame(O=>ct.current(O));return}l.loopActive=!1},[C,tt]);ct.current=Ke;const Tt=r.useCallback(()=>{const l=Xe.current;if(l.idleFrames=0,!l.loopActive){if(l.loopActive=!0,typeof requestAnimationFrame=="function"){l.rafId=requestAnimationFrame(Ke);return}l.loopActive=!1}},[Ke]),fe=r.useCallback((l,f)=>{const p=f?.immediate??!1,k=je(l,y.top);if(_.current=l,p){Xe.current.lastRenderedPosition=l,Xe.current.idleFrames=0,We(l),R({position:k,totalHeight:C.getTotal()});return}Tt()},[Tt,C,y.top,R]),ut=r.useCallback(l=>{const f=W.current;if(!f)return l;const p=f.getScrollPosition();Be.current+=1;const k=f.scrollTo(l);return k===p&&(Be.current=Math.max(0,Be.current-1)),Math.abs(k-l)>.5&&(Ce.current=!0),k},[]),vt=r.useRef(!1);r.useEffect(()=>{if(!vt.current)if(vt.current=!0,N==null&&typeof E!="number"&&typeof h=="number"){const l=ht(Math.max(h,0),y.top),f=Math.abs(l-_.current)>.5;fe(l,{immediate:!0}),f&&W.current?.scrollTo(l)}else fe(_.current,{immediate:!0})},[N,E,h,y.top,fe]),r.useEffect(()=>{const l=C.getTotal();if(qe!==l){g(l);return}if(Ce.current){Ce.current=!1;const f=W.current;if(f&&Math.abs(f.getScrollPosition()-_.current)>.5){const p=ut(_.current);Ce.current=!1,fe(p,{immediate:!0})}}},[C,qe,n,ut,fe]),r.useEffect(()=>{if(Te.current!==null){const{index:l,align:f,offset:p}=Te.current,k=Ie(l,n),{cumulative:A,currentValue:O}=C.prefixSum(k,{materializeOption:{materialize:!1}});if(A!==void 0&&O!==void 0){const X=Math.max(A-O,0);let $=X;f==="bottom"?$=A-i:f==="center"&&($=X+O/2-i/2),p&&($-=p),$=Math.max(0,$);const Pe=Math.max(0,qe+y.top+y.bottom-i),de=Math.min(ht($,y.top),Pe);Math.abs(de-_.current)>1&&(w.debug("[VirtualScroll] Drift correction",{from:_.current,to:de,targetIndex:k}),Be.current===0&&(Be.current+=1),W.current?.scrollTo(de),fe(de,{immediate:!0}))}}Qe.current=!1},[qe,C,n,y.top,fe,i,y.bottom]),r.useEffect(()=>{const l=pe.current;if(l===y.top||(pe.current=y.top,Te.current))return;const f=je(_.current,l),p=ht(f,y.top);_.current=p,W.current?.scrollTo(p),fe(p,{immediate:!0})},[y.top,fe]);const bt=r.useCallback((l,f)=>{if(n===0)return;const p=Ie(l,n),k=C.get(p),A=f-k,O=C.update(p,f);O!==void 0&&g(O),w.debug("[VirtualScroll] Updated item size manually",{index:p,size:f,total:O});let X=Te.current?Te.current.index:null;if(X===null){const $=_.current,Pe=Xt(U).top,de=je($,Pe),{index:me,cumulative:Fe}=C.findIndexAtOrAfter(de,{materializeOption:{materialize:!1}});X=Fe!==void 0&&Fe===de?me+1:me}if(X!==-1&&p<X&&A!==0){const $=_.current,Pe=$+A;ut(Pe),fe(Pe,{immediate:!0}),w.debug("[VirtualScroll] Adjusted scroll for layout shift (manual update)",{from:$,to:Pe,causedByIndex:p,delta:A,activeVisibleStartIndex:X})}},[C,n,ut,fe,U]),He=r.useCallback((l,f)=>{if(!W.current||n===0)return;const p=Ie(l,n),k=Ie(p-a*2,n),A=Ie(p+a*2,n),{cumulative:O,total:X,currentValue:$}=C.prefixSum(p,{materializeOption:{materialize:!0,ranges:[{from:k,to:A}]}});if(w.debug("[VirtualScroll] Scrolling to index:",p,"ItemBottom:",O,"Total height:",X,"ItemHeight:",$,"safeIndexFrom:",k,"safeIndexTo:",A),!X)return;const Pe=Math.max(O-$,0);let de=Pe;f?.align==="bottom"?de=O-i:f?.align==="center"&&(de=Pe+$/2-i/2),f?.offset&&(de-=f.offset),de=Math.max(0,de);const me=ht(de,y.top),Fe=W.current?.getContentSize()??X+y.top+y.bottom,Le=Math.max(0,Fe-i),ze=Math.min(me,Le);Te.current={index:p,align:f?.align,offset:f?.offset};const Mt=W.current?.getScrollPosition()??-1,Vt=Math.abs(Mt-ze)>.5;De.current=!1,Be.current=0,Vt&&(De.current=!0,Be.current+=1,W.current?.scrollTo(ze)),g(X),fe(ze,{immediate:!0}),w.debug("[VirtualScroll] Setting scroll position to:",ze,{original:me,max:Le})},[C,a,n,y.top,y.bottom,i,fe]),Pt=r.useRef(N&&n===0?N:null);r.useEffect(()=>{const l=Pt.current;!l||n===0||(Pt.current=null,He(J(Math.trunc(l.index),0,n-1),{align:"top",offset:-Math.max(0,l.offsetPx??0)}))},[n,He]);const yt=r.useCallback(l=>{if(!W.current||n===0)return;const f=C.getTotal(),p=J(Math.floor(l),0,f),{index:k,cumulative:A,currentValue:O}=C.findIndexAtOrAfter(p,{materializeOption:{materialize:!1}}),$=(A??0)-(O??0)-p;He(k,{offset:$})},[C,n,He]),mt=r.useCallback(()=>{if(n===0)return null;const l=je(_.current,y.top),{index:f,cumulative:p,currentValue:k}=C.findIndexAtOrAfter(l,{materializeOption:{materialize:!1}});if(f===-1)return{index:n-1,offsetPx:0};if(p===l)return{index:J(f+1,0,n-1),offsetPx:0};const A=(p??0)-(k??0);return{index:f,offsetPx:Math.max(0,l-A)}},[C,n,y.top]),Ct=r.useCallback(l=>{const f=je(_.current,y.top),p=typeof l=="function"?l(f):l;yt(p);const k=W.current?.getScrollPosition(),A=typeof k=="number"?k:_.current;return fe(A),je(A,ve.current)},[y.top,yt,fe]),kt=r.useCallback((l,f)=>{w.debug("[VirtualScroll] Scroll position changed:",l);const p=De.current;p&&(De.current=!1);const k=Be.current>0;if(k&&(Be.current=0),p||k||Qe.current||(Te.current=null),fe(l),P){if(p||k)return;const A=l-f;if(w.debug("[VirtualScroll] Scroll diff:",A,"New:",l,"Prev:",f),Math.abs(A)>1){const O=A>0?"down":"up";le(O),ce(!0),w.debug("[VirtualScroll] Showing scroll buttons. Direction:",O),se.current&&clearTimeout(se.current),se.current=setTimeout(()=>{ce(!1),w.debug("[VirtualScroll] Hiding scroll buttons")},2e3)}}},[fe,P]),rt=r.useMemo(()=>je(_e,y.top),[y.top,_e]),ft=r.useMemo(()=>{const l=C.getTotal(),f=Pr(rt,i,a,n,s,C,l);return w.debug("[VirtualScroll] Calculated rendering range:",()=>({...f,scrollPosition:rt,renderingContentSize:l,overscanCount:a,viewportSize:i})),f},[rt,i,a,n,s,C]),{renderingStartIndex:nt,renderingEndIndex:st,visibleStartIndex:it,visibleEndIndex:pt}=ft,o=r.useCallback((l,f)=>{if(!q||n===0)return;const p=Ie(l,n);if(!(f?.ensureVisible??!0)){const Le=oe.current.get(p);Le&&(be.current=null,Se.current=p,we(Le));return}const A=C.prefixSum(p,{materializeOption:{materialize:!1}}),O=A.currentValue,X=Math.max(A.cumulative-O,0),$=X+O,Pe=je(_.current,y.top),de=Pe+i;if(X<Pe||$>de){He(p);const Le=oe.current.get(p);Le?(be.current=null,Se.current=p,we(Le)):be.current=p;return}const Fe=oe.current.get(p);if(Fe){be.current=null,Se.current=p,we(Fe);return}be.current=p},[q,n,C,y.top,He,we,i]),b=r.useCallback((l,f)=>{if(!q||l.defaultPrevented||l.altKey||l.metaKey||l.ctrlKey)return;const p=l.target;if(p){const k=p.tagName;if(k==="INPUT"||k==="TEXTAREA"||k==="SELECT"||p.isContentEditable)return}if(l.key==="ArrowDown"){f<n-1&&(l.preventDefault(),o(f+1));return}if(l.key==="ArrowUp"){f>0&&(l.preventDefault(),o(f-1));return}if(l.key==="PageDown"){if(f<n-1){l.preventDefault();const{visibleStartIndex:k,visibleEndIndex:A}=Z.current,O=Math.max(A-k+1,1),X=Math.max(O,1),$=Ie(Math.min(f+X,n-1),n);o($)}return}if(l.key==="PageUp"&&f>0){l.preventDefault();const{visibleStartIndex:k,visibleEndIndex:A}=Z.current,O=Math.max(A-k+1,1),X=Math.max(O,1),$=Ie(f-X,n);o($)}},[q,n,o]),v=r.useCallback(l=>{if(!q)return;const f=Ie(l,n);be.current=null,Se.current=f,ie?.(f)},[q,n,ie]);r.useEffect(()=>{const l=W.current?.getScrollPosition()??0,f=_.current,p=je(f,y.top);w.debug("[VirtualScroll] Range change effect triggered",()=>({renderingStartIndex:nt,renderingEndIndex:st,visibleStartIndex:it,visibleEndIndex:pt,scrollPositionState:_e,paneScrollPosition:f,logicalScrollPosition:p,contentSize:qe,scrollPaneScrollPosition:l})),xe({renderingStartIndex:nt,renderingEndIndex:st,visibleStartIndex:it,visibleEndIndex:pt,scrollPosition:p,totalHeight:qe})},[qe,st,nt,y.top,xe,_e,pt,it]);const D=r.useCallback(()=>{if(!P)return null;const l=ke&&Re!==null,f=Re==="up";return Y.jsx("div",{className:"aqvs-scroll-to-edge-overlay","data-visible":l,children:f?Y.jsx("div",{className:"aqvs-scroll-to-edge-button-container aqvs-scroll-to-edge-button-container-top",children:Y.jsx("button",{type:"button",className:"aqvs-scroll-to-edge-button",onClick:p=>{p.stopPropagation(),De.current=!0,He(0),ce(!1)},children:"Top"})}):Y.jsx("div",{className:"aqvs-scroll-to-edge-button-container aqvs-scroll-to-edge-button-container-bottom",children:Y.jsx("button",{type:"button",className:"aqvs-scroll-to-edge-button",onClick:p=>{p.stopPropagation(),De.current=!0,He(n-1),ce(!1)},children:"Bottom"})})})},[P,ke,Re,He,n]),z=r.useRef(0),{visibleItems:he,renderAnchor:Ae}=r.useMemo(()=>{if(n===0)return{visibleItems:Y.jsx("div",{className:"aqvs-no-items-container",children:Y.jsx("div",{className:"aqvs-no-items-text",children:"No items"})}),renderAnchor:0};const l=Ie(nt,n),f=Ie(st,n),{cumulative:p,currentValue:k}=C.prefixSum(l,{materializeOption:{materialize:!1}}),A=p-k;Number.isFinite(A)&&Math.abs(A-z.current)>Rr&&(z.current=A);const O=z.current,X=[],$=[];let Pe=0,de=A;for(let me=l;me<=f;me++){if($.length>=jt){w.warn("[VirtualScroll] Rendered item count reached the safety cap; truncating render window.",{cap:jt,safeRenderingStartIndex:l,safeRenderingEndIndex:f});break}const Fe=s(me),Le=C.get(me),ze=Fe-Le;ze!==0&&X.push({index:me,value:Fe});const Mt=de+Pe,Vt=t?t(me):me;$.push(Y.jsx(yr,{index:me,top:Mt-O,height:Fe,item:e(me),clipItemHeight:te,enableKeyboardNavigation:q,onKeyDown:b,onFocus:v,registerItemRef:Ge,children:I},Vt)),Pe+=ze,de+=Le}return X.length>0&&Promise.resolve().then(()=>{if(Ve.current)return;let me=0;for(const ze of X)if(ze.index<it){const Mt=C.get(ze.index);me+=ze.value-Mt}const Fe=C.updates(X);if(Ve.current||typeof Fe!="number")return;g(Fe),w.debug("[VirtualScroll] Updated heights for items",X,"New total height:",Fe);const Le=W.current?.getScrollPosition()??_.current;if(me!==0){const ze=Le+me;ut(ze),fe(ze,{immediate:!0}),w.debug("[VirtualScroll] Adjusted scroll for layout shift (auto update)",{from:Le,to:ze,shiftAmount:me})}else Le!==_.current&&fe(Le)}),{visibleItems:$,renderAnchor:O}},[I,te,qe,q,n,C,e,t,s,v,b,ut,Ge,st,nt,fe,it]),Oe=r.useCallback(l=>{const f=(F??0)>0,p=Math.abs(l-_e),k=f&&p>.5?_e:l,A=je(k,y.top);if(w.debug("[VirtualScroll] Rendering visible items",()=>({currentScrollPosition:l,effectiveScrollPosition:A,renderingStartIndex:nt,renderingEndIndex:st,itemCount:n,viewportSize:i,callbackThrottleMs:F,diff:p,rawEffectiveScrollPosition:k})),n===0)return he;const O=y.top+Ae-k,X=y.bottom>0?Y.jsx("div",{className:"aqvs-bottom-inset",style:{top:C.getTotal()-Ae,height:y.bottom}},"virtualscroll-bottom-inset"):null;return w.debug("[VirtualScroll] Rendering items",()=>({containerTop:O,logicalScrollPosition:rt,resolvedInsets:y,effectiveScrollPosition:A})),Y.jsxs("div",{className:"aqvs-items-wrapper",style:{top:0,transform:`translateY(${O}px)`,willChange:"transform"},children:[he,X]})},[F,n,C,rt,Ae,st,nt,y,_e,i,he]),xt=r.useMemo(()=>({renderingStartIndex:ft.renderingStartIndex,renderingEndIndex:ft.renderingEndIndex,visibleStartIndex:ft.visibleStartIndex,visibleEndIndex:ft.visibleEndIndex,scrollPosition:rt,totalHeight:C.getTotal()}),[ft,rt,C,qe]);r.useEffect(()=>{Z.current=xt},[xt]),r.useImperativeHandle(V,()=>({getScrollPosition:()=>{const l=W.current?.getScrollPosition();return typeof l=="number"?je(l,ve.current):-1},getContentSize:()=>W.current?.getContentSize()??-1,getViewportSize:()=>W.current?.getViewportSize()??-1,scrollTo:Ct,scrollToIndex:He,getFenwickTreeTotalHeight:()=>C.getTotal(),getFenwickSize:()=>C.getSize(),focusItemAtIndex:o,getRange:()=>Z.current,getScrollAnchor:mt,updateItemSize:bt}),[Ct,He,C,o,mt,bt]);const at=C.getTotal()+y.top+y.bottom;return Y.jsx(Zt,{ref:W,contentSize:at,viewportSize:i,className:c,testId:u,onScroll:kt,background:M,tapScrollCircleOptions:K,inertiaOptions:Ne,itemCount:n,scrollBarWidth:L,enableThumbDrag:S,enableTrackClick:j,enableArrowButtons:G,enablePointerDrag:T,pointerDragInputs:B,renderThumbOverlay:ae,wheelSpeedMultiplier:Ye,onWheelHorizontal:ge,contentInsets:y,contentProps:ye,visibleStartIndex:it,visibleEndIndex:pt,renderOverlay:D,initialScrollPosition:Ee.position,children:Oe})},wr=r.forwardRef(Cr);exports.FenwickMapTree=ot;exports.ScrollBar=Gt;exports.ScrollPane=Zt;exports.TAP_SCROLL_SPEED_DEFAULTS=zt;exports.VirtualScroll=wr;exports.computeAutoTapScrollMaxSpeedMultiplier=Wt;exports.computeTapScrollSpeed=Kt;exports.minmax=J;exports.tapScrollCircleSampleVisual=br;exports.useFenwickMapTree=Jt;exports.useHeightCache=Sr;exports.useLruCache=Qt;