@aiquants/virtualscroll 2.4.0 → 2.6.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.
@@ -36,11 +36,54 @@ export type VirtualScrollRange = {
36
36
  */
37
37
  export type VirtualScrollHandle = {
38
38
  /**
39
- * Scrolls to a LOGICAL position (updater form receives the current logical position).
39
+ * Jumps to a LOGICAL position (updater form receives the current logical position).
40
40
  * Returns the applied (clamped) LOGICAL position.
41
- * 論理位置へスクロール (updater は現在の論理位置を受け取る)。適用後 (クランプ後) の論理位置を返す。
41
+ * 論理位置へ**ジャンプ**する (updater は現在の論理位置を受け取る)。適用後 (クランプ後) の論理位置を返す。
42
+ *
43
+ * ❗ **連続的なスクロール入力 (ホイール等) の橋渡しには使わないこと。`scrollBy` を使う。**
44
+ * これは「行を狙って飛ぶ」ための API であり、ペイン自身のホイール処理とは意味が 2 点異なる:
45
+ *
46
+ * 1. **絶対位置を `Math.floor` する** (行解決のため)。デルタを足して渡すと 1px 未満の移動が
47
+ * 毎回消えるため、精密トラックパッドでは**一切動かない**。
48
+ * 2. **スクロールアンカーを張る** (`scrollToIndex` 経由)。狙った行に留まり続けるための仕様だが、
49
+ * 以後 `contentSize` / `itemCount` / `viewportSize` / インセットが変わるたびにドリフト補正が
50
+ * その行へ**再ピン留め**するため、絞り込みなどで一覧が過去の位置へ戻って見える。
51
+ *
52
+ * ❗ `scrollTo(handle.getScrollPosition() + delta)` と書かないこと。ペイン未接続時の
53
+ * `getScrollPosition()` は番兵 `-1` を返すため `-1 + delta` が混入する。相対移動は `scrollBy`
54
+ * (推奨) か updater 形式 `scrollTo(prev => prev + delta)` を使う (updater の `prev` は内部の
55
+ * 最新位置から取るため番兵が混入しない)。
42
56
  */
43
57
  scrollTo: (position: number | ((prev: number) => number)) => number;
58
+ /**
59
+ * Scrolls by a delta using the exact semantics of the pane's own wheel handling.
60
+ * ペイン自身のホイール処理と**同一の意味**でデルタ分スクロールする。
61
+ *
62
+ * ペインの外に置いた要素 (列ヘッダー帯・固定フッター・横スクロールバー行など) の上での
63
+ * ホイールを一覧へ橋渡しするための API。ホイールリスナーは `.aqvs-scroll-pane` にしか付かないため、
64
+ * ペイン外はホイールの死角になる。この口はその死角を埋める。
65
+ *
66
+ * `scrollTo` との違い (どちらもペイン自身のホイールと同じ扱いにするための選択):
67
+ *
68
+ * - **float のまま相対加算する** (丸めない)。1px 未満のデルタも積み上がって動く。
69
+ * - **アンカーを張らない**。手動スクロールとして扱われるため、保留アンカーはむしろ**解除される**
70
+ * (ペイン上でホイールを回したときと同じ)。以後のサイズ変化で位置が巻き戻ることがない。
71
+ * - 慣性は停止する (ペイン上のホイールと同じ)。
72
+ *
73
+ * @param delta - Signed pixels to scroll (positive scrolls down) / 符号付きの移動量 (正で下方向)
74
+ * @returns The applied (clamped) LOGICAL position / 適用後 (クランプ後) の論理位置
75
+ */
76
+ scrollBy: (delta: number) => number;
77
+ /**
78
+ * Applies one wheel event with the pane's own rules; returns whether it was consumed.
79
+ * ペイン自身の規則で 1 つのホイールイベントを適用し、消費したかどうかを返す。
80
+ *
81
+ * 一覧の**外**に置いた要素 (列ヘッダー帯・固定フッター・空表示など) のホイールを、ペイン内と
82
+ * 寸分違わぬ意味論で流し込むための唯一の口。軸分解・速度倍率・スクロール可否・横成分の委譲先・
83
+ * 慣性停止のすべてがペイン側の 1 箇所で決まるため、消費側が規則を書き直したり食い違わせたりできない。
84
+ * 直接呼ぶより `useWheelBridge` (passive:false 登録と後始末込み) を使うこと。
85
+ */
86
+ applyWheel: (event: WheelEvent) => boolean;
44
87
  /**
45
88
  * Current LOGICAL scroll position. -1 when the pane is not connected.
46
89
  * 現在の論理スクロール位置。ペイン未接続時は -1。
@@ -198,8 +241,71 @@ export type VirtualScrollProps<T> = {
198
241
  onItemFocus?: (index: number) => void;
199
242
  scrollBarOptions?: VirtualScrollScrollBarOptions;
200
243
  behaviorOptions?: VirtualScrollBehaviorOptions;
201
- /** Delegates horizontal wheel/trackpad delta to an upstream owner (e.g. a frozen-column grid). / 横ホイール量を上流へ委譲する。 */
244
+ /** Delegates horizontal wheel/trackpad delta to an upstream owner (e.g. a frozen-column grid). / 横ホイール量を上流へ委譲する。
245
+ *
246
+ * ❗ **ホイール由来だけの口ではない。** `horizontalKeyInputs` を指定すると**キーボード由来の横量**も
247
+ * ここへ流れる。名前は 2.x で公開済みのため据え置くが、意味は「横軸が N px 動いた。横軸はあなたの所有物である」。
248
+ */
202
249
  onWheelHorizontal?: (deltaX: number) => void;
250
+ /**
251
+ * Keyboard gestures that emit a horizontal scroll delta through `onWheelHorizontal` (default: none).
252
+ * `onWheelHorizontal` へ横スクロール量を流すキーボード操作の種別 (既定: 無効)。
253
+ *
254
+ * - `[]` / 未指定 (既定): 横キーボードスクロールを行わない。
255
+ * - `["shift-arrow"]`: `Shift + ←/→` のみ。木の展開/折りたたみ (`←/→`) やグリッドのセル移動と
256
+ * 衝突しないため、既存の行 UI を持つ消費側でも安全に有効化できる。
257
+ * - `["arrow"]`: 素の `←/→` のみ。`Shift + ←/→` を選択範囲の拡張に使うグリッド向け。
258
+ * - `["arrow", "shift-arrow"]`: 両方。
259
+ *
260
+ * ❗ **配列なのは 4 状態が独立に必要だからである。** `"none" | "shift-arrows" | "arrows"` のような
261
+ * 段階的な文字列にすると `"arrows"` が `"shift-arrows"` を含んでしまい、「素の矢印だけ横スクロール、
262
+ * `Shift + ←/→` は消費側の範囲選択に残す」(Excel / データグリッドの標準) が**表現できない**。
263
+ * 同じ理由で種別配列を採るのが `pointerDragInputs` であり、本パッケージの既存の作法に揃えてある。
264
+ *
265
+ * ❗ **既定が無効なのは、行ハンドラを奪わないためである。** 本パッケージの行キーハンドラは
266
+ * capture フェーズに付くため、消費側の行 (bubble) より先に走る。既定で `←/→` を消費すると
267
+ * ツリーの展開/折りたたみのような既存操作を奪ってしまう。消費するのは `preventDefault()` のみで
268
+ * **伝播は止めない** (縦の矢印キーと同じ契約)。`stopPropagation()` は行ハンドラだけでなく
269
+ * `document` / `window` の bubble リスナーごとイベントを消し、ホットキーライブラリや
270
+ * キー入力のテレメトリまで巻き添えにするため採らない。消費側が二重動作を避ける手段は
271
+ * `defaultPrevented` の確認である。
272
+ *
273
+ * 前提: 横軸を所有するのは消費側なので、`onWheelHorizontal` が未指定なら何も起きない
274
+ * (キーイベントも消費しない)。行にフォーカスがあるときだけ働くため
275
+ * `behaviorOptions.enableKeyboardNavigation` も必要。
276
+ *
277
+ * ❗ **符号は物理キー基準** (`→` が正、`←` が負) である。横軸の向きを知っているのは消費側だけなので、
278
+ * RTL (`direction: rtl`) の一覧では消費側が受け取った値を反転すること。パッケージ側で
279
+ * `direction` を推測すると、横スクロールの実体 (CSS 変数・`scrollLeft`・transform) がどの要素の
280
+ * どの座標系かを知らないまま符号を決めることになり、当たらない前提を増やすだけになる。
281
+ *
282
+ * ❗ **働くのは行そのものにフォーカスがあるときだけである** (`event.target === event.currentTarget`)。
283
+ * 行の**中**の要素 (自作のタブ・ラジオ相当・スライダー相当など `role` だけで矢印キー操作を実装した
284
+ * ウィジェット、リンク、ネイティブの横スクロール領域) にフォーカスがある間は奪わない。
285
+ * 入力要素の allowlist だけでは `role` 実装のウィジェットを守れないため、対象そのもので判定する。
286
+ *
287
+ * 長押しの連続スクロールは **OS のキーリピート**に委ねる (`keydown` が繰り返し届く)。スクロールバーの
288
+ * 矢印ボタンが明示的なリピートタイマーを持つ (`ARROW_HOLD_DELAY` / `ARROW_HOLD_INTERVAL`) のは
289
+ * ポインタ押下にリピートが存在しないためで、キーボードとの非対称は入力機構の差に由来する。
290
+ *
291
+ * ❗ **`onWheelHorizontal` と同じ「横軸のシーム」に属するため、意図的にトップレベルに置いてある。**
292
+ * `behaviorOptions` の中へ入れると、横軸を自前で所有するラッパー (例: `@aiquants/directory-tree` は
293
+ * `Omit<VirtualScrollProps, "onWheelHorizontal">` で横軸を封じている) が `behaviorOptions` を
294
+ * そのまま素通しするため、封じたはずのシームへ横から到達できてしまう。
295
+ */
296
+ horizontalKeyInputs?: readonly ("arrow" | "shift-arrow")[];
297
+ /**
298
+ * Pixels emitted per horizontal arrow key press (default: 40, matching browser arrow scrolling).
299
+ * 横矢印キー 1 回あたりの移動量 (px。既定 40 = ブラウザの矢印スクロール相当)。
300
+ *
301
+ * ❗ **有限かつ正の値のみを受け付ける。** `0` / 負値 / `NaN` / `Infinity` を渡すと
302
+ * **キーを消費しない** (既定値へ黙って読み替えることはしない)。0 を既定へ差し替えると
303
+ * 呼び出し側の明示的な指定を握り潰し、0 のまま通すと「キーを食うのに 1px も動かない」
304
+ * 死んだ操作になる。
305
+ * 警告は `keydown` ではなく **prop の変化時に 1 回だけ**出す (キーリピート中に
306
+ * コンソールが溢れるため)。
307
+ */
308
+ horizontalKeyStep?: number;
203
309
  /**
204
310
  * ARIA / identity attributes applied to the scrollable CONTENT element — the element that
205
311
  * directly owns the rendered rows and excludes the scrollbar and overlay chrome.
@@ -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 $=require("react/jsx-runtime"),r=require("react"),St=require("tailwind-merge");class R{level;prefix;impl;constructor(e=2,t="[virtualscroll]",s=console){this.level=e,this.prefix=t,this.impl=s}static instance=new R(2,"[virtualscroll]");static setLevel(e){R.instance.setLevel(e)}setLevel(e){this.level=e}static setImplementation(e){R.instance.setImplementation(e)}setImplementation(e){this.impl=e}static setPrefix(e){R.instance.setPrefix(e)}setPrefix(e){this.prefix=e}static isEnabled(e){return R.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){R.instance.debug(e,...t)}debug(e,...t){this.level<=0&&this.impl.debug(...this.formatMessage(R.resolveLazy(e)),...t.map(R.resolveLazy))}static info(e,...t){R.instance.info(e,...t)}info(e,...t){this.level<=1&&this.impl.info(...this.formatMessage(R.resolveLazy(e)),...t.map(R.resolveLazy))}static warn(e,...t){R.instance.warn(e,...t)}warn(e,...t){this.level<=2&&this.impl.warn(...this.formatMessage(R.resolveLazy(e)),...t.map(R.resolveLazy))}static error(e,...t){R.instance.error(e,...t)}error(e,...t){this.level<=3&&this.impl.error(...this.formatMessage(R.resolveLazy(e)),...t.map(R.resolveLazy))}}const Ht={active:!1,offsetX:0,offsetY:0,distance:0,direction:0,pointerId:null},Dt=6,sr=8,ir=({dragState:n,normalizedDistance:e})=>{const t=1+e*.18,s=.16+e*.24,i=.38+e*.28,o=n.active?"80ms ease-out":"220ms ease";return $.jsxs($.Fragment,{children:[$.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:`${o}, ${n.active?"80ms":"260ms"} box-shadow ease`}}),$.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"}})]})},Wt=r.memo(r.forwardRef(({onDragChange:n,className:e,maxVisualDistance:t=160,size:s=40,style:i,opacity:o=1,renderVisual:c},f)=>{const[d,x]=r.useState(Ht),S=r.useRef(null),v=r.useRef(null),C=r.useRef({x:0,y:0}),g=r.useRef(null),E=r.useRef(0),Q=r.useCallback(I=>{x(I),n(I)},[n]),Y=r.useCallback((I,q,W=!1)=>{const{x:Ke,y:X}=C.current,we=I-Ke,Ne=q-X,Re=Math.abs(Ne),Ae=Re<Dt?0:Ne<0?-1:1,oe=E.current;let Be=Ae;const B=Dt+sr;Ae===0?oe!==0&&Re<B?Be=oe:(Be=0,W||(E.current=0)):Ae!==oe&&oe!==0&&Re<B?Be=oe:E.current=Ae,Q({active:W||Re>=Dt,offsetX:we,offsetY:Ne,distance:Re,direction:Be,pointerId:S.current})},[Q]),le=r.useCallback(I=>{if(I===null)return;const q=g.current;q?.hasPointerCapture(I)&&q.releasePointerCapture(I)},[]),ce=r.useCallback((I=!1)=>{I&&le(S.current),S.current=null,v.current=null,E.current=0,Q(Ht)},[Q,le]),ie=r.useCallback(I=>{if(S.current!==null&&S.current!==I.pointerId){v.current={pointerId:I.pointerId,clientX:I.clientX,clientY:I.clientY},I.preventDefault(),I.stopPropagation();return}I.preventDefault(),I.stopPropagation();const q=g.current??I.currentTarget,{left:W,top:Ke,width:X,height:we}=q.getBoundingClientRect();C.current={x:W+X/2,y:Ke+we/2},S.current=I.pointerId;try{q.setPointerCapture(I.pointerId)}catch{}Y(I.clientX,I.clientY,!0)},[Y]),pe=r.useCallback(I=>{if(S.current!==I.pointerId){v.current!==null&&v.current.pointerId===I.pointerId&&(v.current={pointerId:I.pointerId,clientX:I.clientX,clientY:I.clientY});return}I.preventDefault(),Y(I.clientX,I.clientY)},[Y]),he=r.useCallback(I=>{if(S.current!==I.pointerId){v.current!==null&&v.current.pointerId===I.pointerId&&(v.current=null);return}I.preventDefault(),I.stopPropagation();const q=v.current;if(v.current=null,q!==null){le(I.pointerId);const W=g.current;let Ke=!0;if(W!==null&&typeof W.setPointerCapture=="function")try{W.setPointerCapture(q.pointerId)}catch(X){(typeof X=="object"&&X!==null&&"name"in X?X.name:void 0)==="NotFoundError"&&(Ke=!1)}if(Ke){S.current=q.pointerId,Y(q.clientX,q.clientY,!0);return}}ce(!0)},[ce,le,Y]),z=r.useCallback(I=>{I.target===I.currentTarget&&S.current===I.pointerId&&ce(!1)},[ce]);r.useImperativeHandle(f,()=>({reset:()=>{ce(!0)},getElement:()=>g.current}),[ce]);const A=Math.min(Math.max(o,0),1),w=s/64,K=Math.min(d.distance,t)/t,te=d.direction*K*10*w,H=c??ir,L={dragState:d,normalizedDistance:K,sizeScale:w,size:s,opacity:A},re={...i,width:s,height:s,transform:`translateY(${te}px)`};return re.opacity=A,$.jsx("div",{ref:g,"data-testid":"virtual-scroll-tap-circle",className:St.twMerge("aqvs-tap-scroll-circle",e),style:re,tabIndex:-1,onPointerDown:ie,onPointerMove:pe,onPointerUp:he,onPointerCancel:he,onLostPointerCapture:z,role:"presentation",children:H(L)})}));Wt.displayName="TapScrollCircle";const ae=(n,e,t)=>Math.max(e,Math.min(t,n)),Ft="virtualscroll:tap-scroll-cancel",qt=20,or=250,ar=60,lr=20,cr=20,Yt={maxDistance:240,minSpeedMultiplier:.2},ur=Yt.maxDistance,Xt={active:!1,offsetX:0,offsetY:0,distance:0,direction:0,pointerId:null},At=2.2,fr=8,dr=120,mr=1/10,nt={enabled:!0,size:40,offsetX:-80,offsetY:0,className:void 0,maxVisualDistance:ur,minSpeedMultiplier:Yt.minSpeedMultiplier,opacity:.9,renderVisual:void 0,maxSpeedCurve:void 0},pr=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"},hr=(n,e)=>{const t=n?.maxSpeedMultiplier,s=typeof t=="number"?t:Zt(e);return{enabled:n?.enabled??nt.enabled,size:n?.size??nt.size,offsetX:n?.offsetX??nt.offsetX,offsetY:n?.offsetY??nt.offsetY,className:n?.className??nt.className,maxVisualDistance:n?.maxVisualDistance??nt.maxVisualDistance,maxSpeedMultiplier:s,minSpeedMultiplier:Math.max(n?.minSpeedMultiplier??nt.minSpeedMultiplier,0),opacity:ae(n?.opacity??nt.opacity,0,1),renderVisual:n?.renderVisual??nt.renderVisual,maxSpeedCurve:n?.maxSpeedCurve??nt.maxSpeedCurve}},gr=({isDragging:n,isThumbHovered:e,enableThumbDrag:t})=>r.useMemo(()=>t?n?"dragging":e?"hover":"idle":"disabled",[t,n,e]),br=({canUseArrowButtons:n,enableArrowButtons:e,resetTapScroll:t,scrollByStep:s})=>{const i=r.useRef(null),o=r.useRef(null),c=r.useRef(null),f=r.useCallback(()=>{i.current!==null&&(window.clearInterval(i.current),i.current=null),o.current!==null&&(window.clearTimeout(o.current),o.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(()=>{f()},[f]),x=r.useCallback(v=>C=>{if(!n)return;C.cancelable&&C.preventDefault(),C.stopPropagation(),t(),f(),s(v),o.current=window.setTimeout(()=>{i.current=window.setInterval(()=>{s(v)},ar)},or);const g=()=>f();c.current=g,window.addEventListener("pointerup",g),window.addEventListener("pointercancel",g),window.addEventListener("blur",g)},[n,f,t,s]),S=r.useCallback(v=>C=>{e&&(C.key==="Enter"||C.key===" "||C.key==="Spacebar")&&(C.preventDefault(),s(v))},[e,s]);return r.useEffect(()=>{n||f()},[n,f]),r.useEffect(()=>()=>{f()},[f]),{handleArrowPointerDown:x,handleArrowPointerUp:d,handleArrowKeyDown:S}},xr=700,dt=(n,e)=>typeof n=="number"&&Number.isFinite(n)?n:e,Gt=({distance:n,maxDistance:e,viewportSize:t,minSpeedMultiplier:s,maxSpeedMultiplier:i,hasCustomMaxSpeedMultiplier:o,curve:c})=>{const f=Math.max(dt(n,0),0),d=dt(e,0),x=d>0?Math.min(f,d)/d:1,S=Math.max(dt(t,0),0),v=Math.max(dt(s,0),0),C=Math.max(dt(i,0),0),g=Math.max(S*v,40),E=o?g:1200,Q=Math.max(S*C,E),Y=c?Math.max(dt(c.exponentialScale,C),0):0,le=c?Math.min(Q,Math.max(S*Y,g)):Q,ce=Math.max(le,g);let ie=x**1.1;if(c){const he=Math.min(Math.max(dt(c.exponentialSteepness,0),0),xr);if(he===0)ie=x;else{const z=Math.expm1(he)||1;ie=Math.min(Math.max(Math.expm1(he*x)/z,0),1)}}const pe=Math.min(Math.max(dt(c?.easedOffset,0),0),1);return g+(ce-g)*(pe+(1-pe)*ie)},Zt=n=>{if(!n||n<=0)return At;const e=Math.max(1,n),t=Math.log10(e),s=At+t*fr;return ae(s,At,dr)},Jt=({contentSize:n,viewportSize:e,scrollPosition:t,onScroll:s,enableThumbDrag:i=!0,enableTrackClick:o=!0,enableArrowButtons:c=!0,horizontal:f=!1,scrollBarWidth:d=12,className:x,ariaControls:S,tapScrollCircleOptions:v,itemCount:C,renderThumbOverlay:g,visibleStartIndex:E,visibleEndIndex:Q})=>{const[Y,le]=r.useState(!1),[ce,ie]=r.useState(!1),[pe,he]=r.useState(!1),z=r.useRef(null),A=r.useRef({pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1,captureTarget:null}),w=r.useRef({pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1}),K=r.useRef(t),te=r.useRef(s),H=r.useRef(Xt),L=r.useRef(null),re=r.useRef(null),I=r.useRef(null),q=r.useRef(0),W=r.useRef(0),Ke=r.useMemo(()=>hr(v,C),[C,v]),X=r.useMemo(()=>pr(f),[f]),{enabled:we,size:Ne,offsetX:Re,offsetY:Ae,className:oe,maxVisualDistance:Be,maxSpeedMultiplier:B,minSpeedMultiplier:Se,opacity:Le,renderVisual:ge,maxSpeedCurve:st}=Ke,T=r.useRef({viewportSize:e,maxScrollPosition:Math.max(n-e,0),scrollBarVisible:n>e,effectiveTapMaxDistance:Math.max(Be,1),tapCircleMaxSpeedMultiplier:B,tapCircleMinSpeedMultiplier:Se,tapCircleMaxSpeedCurve:st,tapScrollCircleOptions:v,effectiveTrackLength:0,onScroll:s,scrollPosition:t}),{mainSizeKey:it,crossSizeKey:ct,positionKey:y,selectDelta:G,getPointerCoordinate:Xe,arrowLabels:ot,arrowIcons:Ve,directionClass:Qe,orientation:ue}=X,p=Math.max(Be,1),ne=e/n,ee=Math.max(e-d*2,0),V=ne*ee,F=Math.min(Math.max(qt,V||0),ee||qt),Z=n-e,Ie=Math.max(ee-F,0),Pe=Z<=0||Ie<=0?0:ae(t/Z*Ie,0,Ie),ze=Pe+F/2,j=n>e||Y,ye=j&&c;r.useLayoutEffect(()=>{T.current={viewportSize:e,maxScrollPosition:Z,scrollBarVisible:j,effectiveTapMaxDistance:p,tapCircleMaxSpeedMultiplier:B,tapCircleMinSpeedMultiplier:Se,tapCircleMaxSpeedCurve:st,tapScrollCircleOptions:v,effectiveTrackLength:Ie,onScroll:s,scrollPosition:t}}),r.useLayoutEffect(()=>{K.current=t},[t]),r.useLayoutEffect(()=>{te.current=s},[s]),r.useEffect(()=>{i||ie(!1)},[i]);const ke=gr({isDragging:Y,isThumbHovered:ce,enableThumbDrag:i}),se=r.useCallback((a,b)=>{const M=T.current,k=b??K.current;if(te.current){const _e=te.current(a,k);if(typeof _e=="number"&&Number.isFinite(_e))return K.current=_e,_e}const O=typeof a=="function"?a(k):a,be=Math.max(M.maxScrollPosition,0),Oe=M.scrollBarVisible?ae(O,0,be):0;return K.current=Oe,Oe},[]),We=r.useCallback(a=>{const b=T.current,M=K.current;if(!b.scrollBarVisible||b.maxScrollPosition<=0){const tt=se(0,M),It=tt-M;return{nextPosition:tt,actualDelta:It,reachedBoundary:!0}}if(a===0)return{nextPosition:M,actualDelta:0,reachedBoundary:!1};const O=se(tt=>ae(tt+a,0,b.maxScrollPosition),M),be=O-M,Oe=a<0&&M+a<=0,_e=a>0&&M+a>=b.maxScrollPosition,ht=a<0&&(O<=0||Oe&&be===0)||a>0&&(O>=b.maxScrollPosition||_e&&be===0);return{nextPosition:O,actualDelta:be,reachedBoundary:ht}},[se]),et=r.useCallback((a,b)=>{a.current+=b;const M=Math.max(T.current.maxScrollPosition,0);M>0&&(a.current=ae(a.current,-M,M));const k=We(a.current);return a.current-=k.actualDelta,k.reachedBoundary&&(a.current=0),k},[We]),Ce=r.useCallback(()=>{re.current!==null&&(window.cancelAnimationFrame(re.current),re.current=null),I.current=null,q.current=0,W.current=0},[]),ve=r.useCallback(()=>{H.current={...Xt},he(!1),L.current?.reset(),Ce()},[Ce]),je=r.useCallback(a=>{const b=H.current,M=T.current;if(!b.active||b.direction===0){Ce();return}if(!M.scrollBarVisible||M.maxScrollPosition<=0){Ce();return}const k=I.current??a,O=Math.max((a-k)/1e3,0),be=Math.min(O,mr);if(I.current=a,be<=0){re.current=window.requestAnimationFrame(je);return}const Oe=Gt({distance:b.distance,maxDistance:M.effectiveTapMaxDistance,viewportSize:M.viewportSize,minSpeedMultiplier:M.tapCircleMinSpeedMultiplier,maxSpeedMultiplier:M.tapCircleMaxSpeedMultiplier,hasCustomMaxSpeedMultiplier:typeof M.tapScrollCircleOptions?.maxSpeedMultiplier=="number",curve:M.tapCircleMaxSpeedCurve});W.current!==b.direction&&(W.current=b.direction,q.current=0);const{reachedBoundary:_e}=et(q,b.direction*Oe*be);if(_e){Ce();return}re.current=window.requestAnimationFrame(je)},[et,Ce]),He=r.useCallback(()=>{re.current===null&&(I.current=null,q.current=0,re.current=window.requestAnimationFrame(je))},[je]);r.useEffect(()=>{const a=H.current;!a.active||a.direction===0||He()},[n,e,He]),r.useEffect(()=>()=>{Ce()},[Ce]);const m=r.useCallback(a=>{H.current=a,he(a.active),a.active&&a.direction!==0?He():Ce()},[He,Ce]);r.useEffect(()=>{we||ve()},[ve,we]),r.useEffect(()=>{const a=b=>{const k=b.detail?.paneId;k&&S&&k!==S||ve()};return window.addEventListener(Ft,a),()=>{window.removeEventListener(Ft,a)}},[S,ve]),r.useEffect(()=>{if(!we)return;const a=b=>{if(!H.current.active||H.current.pointerId===b.pointerId)return;const M=b.target;if(!(M instanceof Node)){ve();return}L.current?.getElement()?.contains(M)||ve()};return document.addEventListener("pointerdown",a,!0),()=>{document.removeEventListener("pointerdown",a,!0)}},[ve,we]);const P=a=>{if(!j||Ie<=0||Z<=0)return 0;const b=ae(a,0,Ie);return ae(b/Ie*Z,0,Z)},Ee=r.useCallback(a=>{const{scrollBarVisible:b,effectiveTrackLength:M,maxScrollPosition:k}=T.current;if(R.debug("[ScrollBar] calculateScrollPositionFromThumb",()=>({thumbPos:a,trackLen:M,maxScroll:k})),M<=0||k<=0)return null;const O=ae(a,0,M);return ae(O/M*k,0,k)},[]),$e=r.useCallback(a=>{const b=a.getBoundingClientRect(),M=f?b.width:b.height,k=ht=>{const tt=Number.parseFloat(ht);return Number.isFinite(tt)?tt:0},O=window.getComputedStyle(a),be=k(f?O.width:O.height),Oe=be>0?be+k(f?O.paddingLeft:O.paddingTop)+k(f?O.paddingRight:O.paddingBottom)+k(f?O.borderLeftWidth:O.borderTopWidth)+k(f?O.borderRightWidth:O.borderBottomWidth):0,_e=Oe>0?Oe:f?a.offsetWidth:a.offsetHeight;return _e<=0||M<=0?1:M/_e},[f]),Me=r.useCallback(a=>{const b=A.current;if(b.pointerId!==a.pointerId)return;const M=a.clientX-b.startClientX,k=a.clientY-b.startClientY,O=G(M,k)/(b.scale||1);R.debug("[ScrollBar] handleThumbPointerMove",()=>({delta:O,startThumbPosition:b.startThumbPosition,clientY:a.clientY,startClientY:b.startClientY,metrics:T.current}));const be=Ee(b.startThumbPosition+O);be!==null&&se(be),a.cancelable&&a.preventDefault()},[G,Ee,se]),Ge=r.useCallback(a=>{const b=A.current;if(b.pointerId!==a.pointerId)return;document.removeEventListener("pointermove",Me),document.removeEventListener("pointerup",Ge),document.removeEventListener("pointercancel",Ge);const M=b.captureTarget;if(M?.hasPointerCapture?.(a.pointerId)&&M.releasePointerCapture(a.pointerId),A.current={pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1,captureTarget:null},le(!1),z.current){const k=z.current.getBoundingClientRect();a.clientX>=k.left&&a.clientX<=k.right&&a.clientY>=k.top&&a.clientY<=k.bottom||ie(!1)}else ie(!1)},[Me]);r.useEffect(()=>()=>{document.removeEventListener("pointermove",Me),document.removeEventListener("pointerup",Ge),document.removeEventListener("pointercancel",Ge)},[Me,Ge]);const qe=r.useRef(0),Ze=r.useRef(0),ut=r.useCallback(a=>{const b=Math.max(Math.round(T.current.viewportSize/cr),lr);Ze.current!==a&&(Ze.current=a,qe.current=0),et(qe,a*b)},[et]),{handleArrowPointerDown:mt,handleArrowPointerUp:bt,handleArrowKeyDown:me}=br({canUseArrowButtons:ye,enableArrowButtons:c,resetTapScroll:ve,scrollByStep:ut}),ft=a=>{if(!j)return;if(!i){a.preventDefault(),a.stopPropagation();return}if(a.pointerType==="mouse"&&a.button!==0||a.ctrlKey)return;ve();const b=a.currentTarget,M=$e(b);let k=null;if(b.setPointerCapture)try{b.setPointerCapture(a.pointerId),k=b}catch{k=null}A.current={pointerId:a.pointerId,startThumbPosition:Pe,startClientX:a.clientX,startClientY:a.clientY,scale:M,captureTarget:k},document.addEventListener("pointermove",Me),document.addEventListener("pointerup",Ge),document.addEventListener("pointercancel",Ge),le(!0),ie(!0),a.preventDefault(),a.stopPropagation()},wt=a=>{if(!j)return;if(!o){a.preventDefault(),a.stopPropagation();return}if(a.pointerType==="mouse"&&a.button!==0||a.ctrlKey)return;const b=a.currentTarget,M=b.getBoundingClientRect(),k=Xe(a),O=$e(b),be=(k-(f?M.left:M.top))/O;ve();const Oe=be-F/2,_e=P(Oe);if(se(_e),b.setPointerCapture)try{b.setPointerCapture(a.pointerId)}catch{}w.current={pointerId:a.pointerId,startThumbPosition:Oe,startClientX:a.clientX,startClientY:a.clientY,scale:O},a.preventDefault(),a.stopPropagation()},pt=()=>{w.current={pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1}},Ue=a=>{const b=w.current;if(b.pointerId!==a.pointerId)return;if(a.pointerType==="mouse"&&a.buttons===0){pt();return}const M=a.clientX-b.startClientX,k=a.clientY-b.startClientY,O=G(M,k)/(b.scale||1),be=P(b.startThumbPosition+O);se(be),a.cancelable&&a.preventDefault()},Rt=a=>{if(w.current.pointerId!==a.pointerId)return;const b=a.currentTarget;b.hasPointerCapture?.(a.pointerId)&&b.releasePointerCapture(a.pointerId),pt(),a.preventDefault(),a.stopPropagation()},Pt=a=>{if(w.current.pointerId!==a.pointerId)return;const b=a.currentTarget;b.hasPointerCapture?.(a.pointerId)&&b.releasePointerCapture(a.pointerId),pt()},yt=a=>{a.target===a.currentTarget&&w.current.pointerId===a.pointerId&&pt()},Ct=r.useMemo(()=>ae((pe?1:.8)*Le,0,1),[pe,Le]),Vt=r.useMemo(()=>{const b=`calc(50% - ${Ne/2}px + ${Ae}px)`;return{left:Re,top:b}},[Re,Ae,Ne]),rt=(a,b,M,k)=>$.jsx("button",{type:"button",tabIndex:0,className:"aqvs-scrollbar-arrow-button",style:{[it]:d,[ct]:d},"aria-label":b,onPointerDown:mt(a),onPointerUp:bt,onPointerLeave:bt,onPointerCancel:bt,onKeyDown:me(a),"aria-disabled":!c,disabled:!ye,children:$.jsx("span",{"aria-hidden":"true",children:M})},k),at=g&&j?{orientation:ue,scrollPosition:t,maxScrollPosition:Z,contentSize:n,viewportSize:e,thumbSize:F,thumbPosition:Pe,thumbCenter:ze,trackSize:ee,isDragging:Y,isTapScrollActive:pe,visibleStartIndex:E,visibleEndIndex:Q}:null;return $.jsxs("div",{className:St.twMerge("aqvs-scrollbar",Qe,x),style:{[it]:e,[ct]:d},"data-visible":j?"true":"false",role:"scrollbar",tabIndex:-1,"aria-controls":S,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":Z,"aria-orientation":f?"horizontal":"vertical",children:[!f&&j&&we&&$.jsx(Wt,{ref:L,className:St.twMerge("aqvs-scrollbar-tap-circle-wrapper",oe),size:Ne,maxVisualDistance:p,style:Vt,opacity:Ct,renderVisual:ge,onDragChange:m},"tap-circle"),rt(-1,ot[0],Ve[0],"arrow-start"),$.jsxs("div",{className:"aqvs-scrollbar-track",style:{borderRadius:d/2},onPointerDown:wt,onPointerMove:Ue,onPointerUp:Rt,onPointerCancel:Pt,onLostPointerCapture:yt,"aria-disabled":!o,children:[at&&$.jsx("div",{className:"aqvs-scrollbar-overlay","aria-hidden":!0,children:g?.(at)},"overlay"),$.jsx("div",{className:"aqvs-scrollbar-thumb-wrapper",style:{[it]:F,[y]:Pe,...f?{top:0,bottom:0}:{left:0,right:0}},"data-visible":j||Y?"true":"false",onPointerDown:ft,role:"slider","aria-orientation":f?"horizontal":"vertical","aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":Z,"aria-disabled":!i,tabIndex:-1,children:$.jsx("div",{ref:z,className:St.twMerge("aqvs-scrollbar-thumb",f?"aqvs-scrollbar-thumb-horizontal":"aqvs-scrollbar-thumb-vertical"),"data-testid":"aqvs-scrollbar-thumb","data-thumb-state":ke,style:{borderRadius:d-1,cursor:i?"pointer":"default"},onMouseEnter:()=>{i&&ie(!0)},onMouseLeave:()=>{i&&ie(!1)}},"thumb")},"thumb-wrapper")]},"track"),rt(1,ot[1],Ve[1],"arrow-end")]})},Sr=["mouse","pen","touch"],Lt=(n,e)=>!(n==="mouse"||n==="pen"||n==="touch")||e.includes(n),Ir=n=>n==="mouse"||n==="pen",Tt={maxVelocity:6,minVelocity:.02,deceleration:.0025,velocitySampleWindow:90,startVelocityThreshold:.04},Et=(n,e,t)=>{for(const[s,i,o]of e)t==="add"?n.addEventListener(s,i,o):n.removeEventListener(s,i,o)},Qt=r.forwardRef(({children:n,contentSize:e,viewportSize:t,onViewportSizeChange:s,scrollBarWidth:i=12,enableThumbDrag:o=!0,enableTrackClick:c=!0,enableArrowButtons:f=!0,enablePointerDrag:d=!0,pointerDragInputs:x=Sr,onScroll:S,className:v,testId:C,style:g,background:E,tapScrollCircleOptions:Q,inertiaOptions:Y,itemCount:le,renderThumbOverlay:ce,wheelSpeedMultiplier:ie=1,onWheelHorizontal:pe,contentInsets:he,visibleStartIndex:z,visibleEndIndex:A,renderOverlay:w,initialScrollPosition:K=0,contentProps:te},H)=>{const L=r.useRef(Number.isFinite(K)?Math.max(0,K):0),re=r.useRef(null),I=r.useRef(null),q=t===void 0,[W,Ke]=r.useState(0),X=t??W,we=r.useRef(null);r.useLayoutEffect(()=>{if(!q)return;const p=I.current;if(!p)return;const ne=()=>{const V=p.offsetHeight;if(V>0){Ke(F=>F===V?F:V);return}p.offsetParent!==null&&e>0&&we.current!=="zero"&&(we.current="zero",R.warn("[ScrollPane] The self-measured viewport is 0px. Give the scroll pane's host element a definite height (e.g. h-full, flex-1 + min-h-0, an explicit px height), or pass viewportSize explicitly."))};if(ne(),typeof ResizeObserver!="function")return;const ee=new ResizeObserver(ne);return ee.observe(p),()=>{ee.disconnect()}},[e,q]),r.useLayoutEffect(()=>{q&&s?.(W)},[q,W,s]),r.useLayoutEffect(()=>{if(q)return;const p=re.current;if(!p)return;const ne=()=>{const V=p.clientHeight;if(V<=0||Math.abs(V-X)<=1)return;const F=`${X}/${V}`;we.current!==F&&(we.current=F,R.warn(`[ScrollPane] viewportSize=${X} but the host band is ${V}px. The clip window, max scroll position, thumb mapping, rendered row count and scrollability all derive from viewportSize, so they are now wrong. Omit viewportSize to let the pane measure itself.`))};if(ne(),typeof ResizeObserver!="function")return;const ee=new ResizeObserver(ne);return ee.observe(p),()=>{ee.disconnect()}},[q,X]);const Ne=r.useRef(pe);r.useEffect(()=>{Ne.current=pe},[pe]);const Re=r.useRef({frame:null,velocity:0,lastTimestamp:null,generation:0}),Ae=r.useMemo(()=>({maxVelocity:Y?.maxVelocity??Tt.maxVelocity,minVelocity:Y?.minVelocity??Tt.minVelocity,deceleration:Y?.deceleration??Tt.deceleration,velocitySampleWindow:Y?.velocitySampleWindow??Tt.velocitySampleWindow,startVelocityThreshold:Y?.startVelocityThreshold??Tt.startVelocityThreshold}),[Y]),oe=r.useMemo(()=>({top:Math.max(0,he?.top??0),bottom:Math.max(0,he?.bottom??0)}),[he]);R.debug("[ScrollPane] ScrollPane rendered",()=>({contentSize:e,viewportSize:X,scrollBarWidth:i,className:v,style:g,tapScrollCircleOptions:Q,inertiaOptions:Y,enablePointerDrag:d,contentInsets:oe}));const Be=r.useRef({contentSize:e,viewportSize:X});Be.current={contentSize:e,viewportSize:X};const B=r.useMemo(()=>e>X,[e,X]),Se=r.useCallback(p=>{const{contentSize:ne,viewportSize:ee}=Be.current,V=ne>ee,F=L.current;if(R.debug("[ScrollPane] scrollTo called",()=>({newPosition:p,contentSize:ne,viewportSize:ee,currentIsScrollable:V,prevPosition:F})),!V)return L.current!==0&&(L.current=0,S?.(0,F)),L.current;const Z=typeof p=="function"?p(L.current):p;if(!Number.isFinite(Z))return R.warn("[ScrollPane] scrollTo received a non-finite position; keeping the current position",{nextPosition:Z}),L.current;const Ie=Math.max(ne-ee,0),Pe=ae(Z,0,Ie);return L.current!==Pe&&(L.current=Pe,S?.(Pe,F)),L.current},[S]),Le=r.useRef(Se);r.useEffect(()=>{Le.current=Se},[Se]);const ge=r.useCallback(()=>{const p=Re.current;p.generation+=1,p.frame!==null&&cancelAnimationFrame(p.frame),p.frame=null,p.velocity=0,p.lastTimestamp=null},[]),st=r.useRef(ge);r.useEffect(()=>{st.current=ge},[ge]),r.useEffect(()=>()=>{st.current()},[]);const T=r.useCallback(p=>{if(!B)return;const{maxVelocity:ne,minVelocity:ee,deceleration:V,startVelocityThreshold:F}=Ae,Z=ae(p,-ne,ne);if(Math.abs(Z)<F)return;ge(),Re.current.velocity=Z,Re.current.lastTimestamp=null;const Ie=Re.current.generation,Pe=ze=>{const j=Re.current;if(j.generation!==Ie)return;if(j.lastTimestamp===null){j.lastTimestamp=ze,j.frame=requestAnimationFrame(Pe);return}const ye=ze-j.lastTimestamp;if(j.lastTimestamp=ze,ye<=0){j.frame=requestAnimationFrame(Pe);return}const ke=j.velocity;let se=ke;const We=V*ye;ke>0?se=Math.max(0,ke-We):ke<0&&(se=Math.min(0,ke+We));const Ce=(ke+se)/2*ye,ve=L.current;if(Ce!==0&&Le.current($e=>$e+Ce),Re.current.generation!==Ie)return;const je=L.current,{contentSize:He,viewportSize:m}=Be.current,P=Math.max(He-m,0);j.velocity=se;const Ee=je===ve||je<=0&&se<=0||je>=P&&se>=0;if(Math.abs(se)<ee||Ee){ge();return}j.frame=requestAnimationFrame(Pe)};Re.current.frame=requestAnimationFrame(Pe)},[B,Ae,ge]),it=r.useRef(T);r.useEffect(()=>{it.current=T},[T]),r.useLayoutEffect(()=>{Be.current={contentSize:e,viewportSize:X}},[e,X]),r.useLayoutEffect(()=>{const p=I.current;if(!p)return;const ne=()=>{p.scrollTop!==0&&(R.debug("[ScrollPane] Native scroll detected, resetting to 0",()=>({scrollTop:p.scrollTop})),p.scrollTop=0),p.scrollLeft!==0&&(p.scrollLeft=0)};return p.addEventListener("scroll",ne),()=>p.removeEventListener("scroll",ne)},[]),r.useLayoutEffect(()=>{if(B){R.debug("[ScrollPane] Adjusting scroll position due to content or viewport size change",()=>({contentSize:e,viewportSize:X,scrollPosition:L.current}));const p=ae(e-X,0,e);L.current>p&&Se(p)}else Se(0)},[B,Se,e,X]),r.useEffect(()=>{const p=V=>{if(V.ctrlKey)return;const F=V.shiftKey&&V.deltaX===0,Z=F?V.deltaY:V.deltaX,Ie=F?0:V.deltaY;if(Z!==0&&Math.abs(Z)>=Math.abs(Ie)){if(Ne.current){V.preventDefault(),ge();let j=Z;V.deltaMode===1?j*=16:V.deltaMode===2&&(j*=X),Ne.current(j)}return}if(!B||V.deltaY===0)return;V.preventDefault(),ge();let ze=V.deltaY;V.deltaMode===1?ze*=16:V.deltaMode===2&&(ze*=X),ie!==1&&(ze*=ie),R.debug("[ScrollPane] wheel event",()=>({deltaY:ze,scrollPosition:L.current,wheelSpeedMultiplier:ie,deltaMode:V.deltaMode,scrollTop:I.current?.scrollTop})),Se(j=>j+ze)},ne=()=>{ge()},ee=re.current;return ee&&(ee.addEventListener("wheel",p,{passive:!1}),ee.addEventListener("pointerdown",ne,{capture:!0,passive:!0})),()=>{ee&&(ee.removeEventListener("wheel",p),ee.removeEventListener("pointerdown",ne,{capture:!0}))}},[B,Se,ge,X,ie]),r.useImperativeHandle(H,()=>({scrollTo:p=>(ge(),Se(p)),getScrollPosition:()=>L.current,getContentSize:()=>e,getViewportSize:()=>X}),[Se,e,X,ge]);const ct=r.useId(),y=te?.id??ct,G=r.useRef({pointerType:"",pointerId:null,startClientY:0,startScroll:0,isDragging:!1,shouldCancelNextClick:!1,clickResetTimer:null,velocitySamples:[]}),Xe=r.useRef(d),ot=r.useRef(x);r.useEffect(()=>{Xe.current=d},[d]),r.useEffect(()=>{ot.current=x},[x]);const Ve=r.useRef(B);r.useEffect(()=>{Ve.current=B},[B]);const Qe=r.useRef(Ae);r.useEffect(()=>{Qe.current=Ae},[Ae]),r.useEffect(()=>{const p=G.current;if(d&&B&&(p.pointerId===null||Lt(p.pointerType,x))||p.pointerId===null)return;const ne=I.current;p.clickResetTimer!==null&&(window.clearTimeout(p.clickResetTimer),p.clickResetTimer=null);const ee=p.isDragging&&p.shouldCancelNextClick,V=p.pointerId;p.pointerId=null,p.pointerType="",p.startClientY=0,p.startScroll=0,p.isDragging=!1,p.shouldCancelNextClick=ee,p.velocitySamples=[],ne?.hasPointerCapture(V)&&ne.releasePointerCapture(V)},[d,x,B]),r.useEffect(()=>{const p=I.current;if(!p)return;const ne=6,ee=()=>typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now(),V=()=>{const m=G.current;m.pointerId=null,m.pointerType="",m.startClientY=0,m.startScroll=0,m.isDragging=!1,m.velocitySamples=[]},F=()=>{const m=G.current;m.clickResetTimer!==null&&(window.clearTimeout(m.clickResetTimer),m.clickResetTimer=null)},Z=m=>{const P=G.current,Ee=ee();P.velocitySamples.push({clientY:m,time:Ee});const $e=Qe.current.velocitySampleWindow;P.velocitySamples=P.velocitySamples.filter(Me=>Ee-Me.time<=$e)},Ie=m=>m instanceof HTMLElement&&m.closest("[data-scrollpane-ignore-drag='true']")!==null,Pe=m=>{const P=G.current;P.shouldCancelNextClick&&(m.preventDefault(),m.stopPropagation(),P.shouldCancelNextClick=!1)},ze=m=>{const P=G.current;if(!P.isDragging){if(P.isDragging=!0,P.shouldCancelNextClick=!0,!p.hasPointerCapture(m.pointerId))try{p.setPointerCapture(m.pointerId)}catch{}Z(m.clientY)}},j=m=>m.isTrusted||m.target===p,ye=m=>{const P=G.current;p.hasPointerCapture(m)&&p.releasePointerCapture(m),P.shouldCancelNextClick=!1,F(),V()},ke=m=>{const P=G.current;if(P.pointerId!==m.pointerId)return;if(m.buttons===0&&Ir(m.pointerType)){ye(m.pointerId);return}if(!(Xe.current&&Ve.current)||!Lt(m.pointerType,ot.current)||!P.isDragging&&(Math.abs(m.clientY-P.startClientY)<ne||(ze(m),!P.isDragging)))return;Z(m.clientY);const Ee=m.clientY-P.startClientY,$e=P.startScroll-Ee;Le.current($e),m.cancelable&&m.preventDefault()},se=()=>{const m=G.current;return m.pointerId!==null||!m.shouldCancelNextClick?!1:(F(),m.clickResetTimer=window.setTimeout(()=>{const P=G.current;P.shouldCancelNextClick=!1,P.clickResetTimer=null},0),!0)},We=m=>{const P=G.current;if(P.pointerId!==m.pointerId){se();return}P.isDragging&&P.shouldCancelNextClick&&m.cancelable&&(m.preventDefault(),m.stopPropagation()),P.isDragging&&Z(m.clientY);let Ee=0;if(P.isDragging&&P.velocitySamples.length>=2){const Me=P.velocitySamples,Ge=Qe.current.velocitySampleWindow,qe=Me[Me.length-1],Ze=Me.find(ut=>qe.time-ut.time<=Ge)??Me[0];if(qe&&Ze&&qe.time!==Ze.time){const ut=qe.clientY-Ze.clientY,mt=qe.time-Ze.time;Ee=-(ut/mt)}}F(),P.shouldCancelNextClick&&(P.clickResetTimer=window.setTimeout(()=>{const Me=G.current;Me.shouldCancelNextClick=!1,Me.clickResetTimer=null},0));const $e=Qe.current.startVelocityThreshold;V(),p.hasPointerCapture(m.pointerId)&&p.releasePointerCapture(m.pointerId),Math.abs(Ee)>=$e&&it.current?.(Ee)},et=m=>{if(G.current.pointerId!==null){if(!m.isPrimary||m.pointerType!==G.current.pointerType)return;ye(G.current.pointerId)}if(G.current.shouldCancelNextClick&&(F(),G.current.shouldCancelNextClick=!1),!(Xe.current&&Ve.current)||!Lt(m.pointerType,ot.current)||m.button!==0&&m.pointerType==="mouse"||m.ctrlKey||m.metaKey||m.altKey||Ie(m.target))return;window.dispatchEvent(new CustomEvent(Ft,{detail:{paneId:ct}})),st.current?.();const P=G.current;F(),P.pointerId=m.pointerId,P.pointerType=m.pointerType,P.startClientY=m.clientY,P.startScroll=L.current,P.isDragging=!1,P.shouldCancelNextClick=!1,P.velocitySamples=[]},Ce=m=>{if(G.current.pointerId!==m.pointerId){se();return}j(m)&&ye(m.pointerId)},je=[["click",Pe,!0],["pointerdown",et,{passive:!1}],["lostpointercapture",m=>{m.target!==p||G.current.pointerId!==m.pointerId||ye(m.pointerId)},void 0]],He=[["pointermove",ke,{passive:!1}],["pointerup",We,void 0],["pointercancel",Ce,void 0]];return Et(p,je,"add"),Et(window,He,"add"),()=>{Et(p,je,"remove"),Et(window,He,"remove");const m=G.current;m.pointerId!==null&&p.hasPointerCapture(m.pointerId)&&p.releasePointerCapture(m.pointerId),F(),V()}},[ct]);const ue=r.useCallback(p=>(ge(),Se(p)),[Se,ge]);return $.jsxs("div",{ref:re,"data-testid":C,"data-self-measured":q?"true":void 0,className:St.twMerge("aqvs-scroll-pane",v),style:g,children:[$.jsxs("div",{ref:I,className:St.twMerge("aqvs-scroll-pane-content"),"data-testid":"aqvs-scroll-pane-content",style:{height:q?void 0:X,paddingTop:oe.top,paddingBottom:oe.bottom,...d&&B&&x.some(p=>p==="touch"||p==="pen")?{touchAction:"none"}:{}},...te,id:y,children:[E,n(L.current)]}),$.jsx(Jt,{contentSize:e,viewportSize:X,scrollPosition:L.current,onScroll:ue,enableThumbDrag:o,enableTrackClick:c,enableArrowButtons:f,scrollBarWidth:i,ariaControls:y,tapScrollCircleOptions:Q,itemCount:le,renderThumbOverlay:ce,visibleStartIndex:z,visibleEndIndex:A},"scrollbar"),w?.()]})}),jt=(n,e,t)=>Math.min(Math.max(n,e),t),vr=({dragState:n,normalizedDistance:e,sizeScale:t,size:s})=>{const i=Math.max(s/2,1),o=1+e*.65,c=Math.max(.65,1-e*.25),f=n.direction*e*26*t,d=.8+e*.18,x=3*t,S=6*t,v=22*t,C=Math.abs(f)+S,g=f>0?x:-Math.abs(f)-x,E=Math.max(2.5,3*t),Q=jt(n.offsetX,-i,i),Y=jt(n.offsetY,-i,i),le=i*.35,ce=Q/i*le,ie=Y/i*le,pe=ce*.45,he=ie*.45,z=Math.max(v*.38,6),A=.65+e*.2,w=n.active;return $.jsxs($.Fragment,{children:[$.jsx("div",{className:"aqvs-tap-scroll-circle-gradient",style:{transform:`scale(${c}, ${o})`,transition:w?"40ms transform ease-out":"200ms ease transform"}}),$.jsx("div",{className:"aqvs-sample-visual-pupil",style:{width:v,height:v,transform:`translate(calc(-50% + ${ce}px), calc(-50% + ${ie}px)) scale(${c}, ${d*o})`,transition:w?"70ms transform ease-out":"200ms ease transform"}}),$.jsx("div",{className:"aqvs-sample-visual-highlight",style:{width:z,height:z,transform:`translate(calc(-50% + ${pe}px), calc(-50% + ${he}px)) scale(${c}, ${o})`,opacity:A,boxShadow:"0 0 8px rgba(255,255,255,0.45)",transition:w?"120ms opacity 150ms, 120ms transform ease-out ease-out":"220ms ease transform, 240ms opacity ease"}}),$.jsx("div",{className:"aqvs-sample-visual-rod",style:{width:E,height:C,transform:`translate(-50%, ${g}px)`,opacity:e,transition:w?"40ms height, 60ms opacity ease-out ease-out":"200ms ease height, 120ms ease opacity"}})]})},kt=100,Tr=n=>{if(!Number.isFinite(n))return 0n;const e=Math.trunc(n);return e<=0?0n:BigInt(e)},Ot=(n,e)=>{if(!Number.isFinite(n))throw new Error(`valueFn returned a non-finite value at index ${e}: ${n}`);return n},xt=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 lt{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 o=0,c;if(i>0){const f=s?.sampleRange??{from:0,to:Math.min(kt-1,i-1)};let d=Math.max(0,Math.trunc(f.from)),x=Math.min(Math.trunc(f.to),i-1);if(d>x&&(d=0,x=Math.min(kt-1,i-1)),i>kt)o=lt._sampleBaseValueStrided(t,i,kt),s?.materialize&&(c={from:d,values:lt._collectValidatedValues(t,d,x)});else{const S=lt._collectValidatedValues(t,d,x);o=lt._modeOrMedian([...S]),s?.materialize&&(c={from:d,values:S})}}if(this.size=i,this.tree=new Map,this.deltas=new Map,this.total=void 0,this.valueFn=t,this.baseValue=o,c)for(let f=0;f<c.values.length;f++){const d=c.from+f;if(d>=this.size)break;const x=c.values[f]-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 o=t;o<=s;o++)i.push(Ot(e(o),o));return i}static _modeOrMedian(e){if(e.length===0)return 0;e.sort((c,f)=>c-f);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 o=0;for(const c of e){const f=(i.get(c)??0)+1;i.set(c,f),f>o&&(o=f)}if(o>e.length*.2){const c=[];for(const[d,x]of i.entries())x===o&&c.push(d);const f=c.reduce((d,x)=>d+x,0);s=Math.floor(f/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 o=[];for(let c=0;c<t&&o.length<s;c+=i)o.push(Ot(e(c),c));return lt._modeOrMedian(o)}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=xt(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:o}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(o))throw new Error(`Value must be a finite number: ${o}`);if(o<0)throw new Error("Value cannot be negative.");const c=s.has(i)?s.get(i)??0:this.deltas.get(i)??0,f=c+this.baseValue,d=o-f;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=xt(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,o=Ot(this.valueFn(e),e)-this.baseValue;if(o!==s&&(o===0?this.deltas.delete(e):this.deltas.set(e,o),t)){const c=o-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 f of i){const d=Math.max(0,Math.trunc(f.from)),x=Math.min(Math.trunc(f.to),this.size-1);for(let S=d;S<=x;S++)this._materialize(S)}if(t===void 0)return;if(s){this._materialize(t);return}const o=i[0].from,c=i[i.length-1].to;t>=o&&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 o;for(;;){if(o=this._descend(e,s),o<0||o>=this.size)return{index:-1,total:this.total??this.getTotal(),cumulative:void 0,currentValue:void 0,safeIndex:void 0};if(!i)break;const f=this.deltas.get(o)??0;if(this._materialize(o),(this.deltas.get(o)??0)===f)break}const c=this.prefixSum(o);return{index:o,total:this.total??c.total,cumulative:c.cumulative,currentValue:c.currentValue,safeIndex:c.safeIndex}}_descend(e,t){let s=0,i=0,o=1;for(;o<<1<=this.size;)o<<=1;for(;o>0;o>>=1){const c=s+o;if(c<=this.size){const d=(this.tree.get(c)??0)+this.baseValue*o;(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=Tr(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 o=t.materializeOption?.materialize===!0;for(;;){let c=0n,f=i-1n,d,x,S=this.total;for(;c<=f;){const g=c+f>>1n,E=Number(g),Q=this.prefixSum(E);if(S=Q.total,s?Q.cumulative>=e:Q.cumulative<=e)if(d=g,x=Q,s){if(g===0n)break;f=g-1n}else c=g+1n;else if(s)c=g+1n;else{if(g===0n)break;f=g-1n}}const v=x,C=d!==void 0?Number(d):-1;if(o&&C>=0){const g=this.deltas.get(C)??0;if(this._materialize(C),(this.deltas.get(C)??0)!==g)continue}return{index:C,total:S,cumulative:v?.cumulative,currentValue:v?.currentValue,safeIndex:v?.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=ae(Math.trunc(e),0,this.size-1),i=t?.materializeOption;this._materializeRanges(i,s,!0);let o=0,c=s+1;for(;c>0;){const d=this.tree.get(c)??0;o+=d;const x=xt(c);if(x===0)break;c-=x}const f=i?.materialize?this.get(s):(this.deltas.get(s)||0)+this.baseValue;return{cumulative:o+this.baseValue*(s+1),total:this.total,currentValue:f,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&&R.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 o=s+1;for(;o<=this.size;){t.set(o,(t.get(o)??0)+i);const c=xt(o);if(c===0)break;o+=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 o of this.deltas.keys())o>=t&&this.deltas.delete(o);this.size=t,this.rebuildTree()}else this._growSize(s,t);else{if(t>0)for(const o of this.deltas.keys())o>=t&&this.deltas.delete(o);this.size=t,this.rebuildTree()}const i=this.prefixSum(this.getSize()-1);i.cumulative!==i.total&&R.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 o=e+1;for(;o<=s;){const c=xt(o);if(c===0)break;o+=c}for(;o<=i;){this.tree.set(o,(this.tree.get(o)??0)+t);const c=xt(o);if(c===0)break;o+=c}}_growSize(e,t){if(this.size=t,this.deltas.size>0){const s=lt._minCoveredLowBound(e,t);if(e-s<this.deltas.size)for(let o=s;o<e;o++){const c=this.deltas.get(o);c===void 0||c===0||this._propagateDeltaToGrownNodes(o,c,e,t)}else for(const[o,c]of this.deltas.entries())c===0||o<s||this._propagateDeltaToGrownNodes(o,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 Mr=(n,e)=>{const t=n?.sampleRange,s=e?.sampleRange;return t===s?!1:t&&s?t.from!==s.from||t.to!==s.to:!0},er=(n,e,t)=>{const s=Number.isFinite(n)&&n>0?Math.trunc(n):0,i=r.useRef(null),o=r.useRef({size:s,valueOrFn:e,options:t});i.current===null&&(i.current=new lt(s,e,t));const c=i.current,f=o.current,d=f.size!==s,x=f.valueOrFn!==e,S=Mr(f.options,t),v=f.size===0&&s>0&&(!i.current||i.current.base===0);if(x||S){const C=t?.resetOnValueFnChange??!0;S||x&&C||v?(t?.debug&&R.debug("[useFenwickMapTree] reset",{valueOrFnChanged:x,optionsChanged:S}),c.reset(s,e,t)):(d&&(t?.debug&&R.debug("[useFenwickMapTree] resize (with valueFn change)",{from:f.size,to:s}),c.changeSize(s)),t?.debug&&R.debug("[useFenwickMapTree] setValueFn (no reset)",{valueOrFnChanged:x}),c.setValueFn(e,{reset:!1})),o.current={size:s,valueOrFn:e,options:t}}else d&&(t?.debug&&R.debug("[useFenwickMapTree] resize",{from:f.size,to:s}),v?c.reset(s,e,t):c.changeSize(s),o.current={size:s,valueOrFn:e,options:t});return c};class wr{key;value;prev=null;next=null;constructor(e,t){this.key=e,this.value=t}}class _t{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 tr(n){const e=r.useRef(new Map),t=r.useRef(new _t),s=Math.floor(n),i=r.useRef(s);r.useEffect(()=>{if(i.current=s,Number.isNaN(s)||s<0){R.warn(`useLruCache: invalid capacity ${n}; the cache will not store any entries.`),e.current.clear(),t.current=new _t;return}if(Number.isFinite(s))for(;e.current.size>s;){const S=t.current.removeHead();if(S)e.current.delete(S.key);else break}},[n,s]);const o=r.useCallback(S=>{const v=e.current.get(S);if(v)return t.current.moveToTail(v),v.value},[]),c=r.useCallback((S,v)=>{const C=i.current;if(Number.isNaN(C)||C<=0)return;let g=e.current.get(S);if(g)g.value=v,t.current.moveToTail(g);else{if(e.current.size>=C){const E=t.current.removeHead();E&&e.current.delete(E.key)}g=new wr(S,v),e.current.set(S,g),t.current.addToTail(g)}},[]),f=r.useCallback(S=>e.current.has(S),[]),d=r.useCallback(S=>{const v=e.current.get(S);v&&(t.current.remove(v),e.current.delete(S))},[]),x=r.useCallback(()=>{e.current.clear(),t.current=new _t},[]);return r.useMemo(()=>({get:o,set:c,has:f,remove:d,clear:x}),[o,c,f,d,x])}const Rr=1e4,Pr=()=>{const{get:n,set:e,has:t,clear:s}=tr(Rr);return r.useMemo(()=>({get:n,set:e,has:t,clear:s}),[n,e,t,s])},xe=(n,e)=>e<=0?0:ae(n,0,e-1),$t=n=>({top:Math.max(0,n?.top??0),bottom:Math.max(0,n?.bottom??0)}),Je=(n,e)=>n<=e?0:n-e,gt=(n,e)=>n<=0?0:n+e,Nt=1e3,Ut=2e3,yr=1048576,Mt=n=>{if(!Number.isFinite(n))return 0n;const e=Math.trunc(n);return e<=0?0n:BigInt(e)},Cr=(n,e,t,s,i,o,c,f)=>{const d=Mt(s);if(d===0n)return{renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0};const x=z=>z<0n?0n:z>=d?d-1n:z,S={materializeOption:{materialize:!1}},{index:v,cumulative:C}=o.findIndexAtOrAfter(n,S);let g;v===-1?g=d-1n:(C===n?g=Mt(v+1):g=Mt(v),g>=d&&(g=d-1n)),n<=0&&(g=0n),f&&n>=c&&(g=d-1n);const E=z=>{const A=Number(z);if(!Number.isSafeInteger(A))return null;const{cumulative:w}=o.prefixSum(A,{materializeOption:{materialize:!1}});if(!Number.isFinite(w))return null;const{index:K}=o.findIndexAtOrAfter(w+.5,{materializeOption:{materialize:!1}});if(K===-1)return null;const te=Mt(K);return te>z?te:null},Q=z=>{let A=0,w=z,K=z,te=0n,H=0;for(;w<d&&A<e;){const L=Number(w),re=i(L);if(A+=re,K=w,w+=1n,te+=1n,!Number.isFinite(re)||re<0)break;if(re===0){if(H+=1,H>Nt){const I=E(K);if(I!==null&&I>w)w=I,H=0;else if(I!==null&&I===w&&i(Number(w))>0)H=0;else break}}else H=0}return te===0n&&(K=z),{height:A,end:K}};let{height:Y,end:le}=Q(g);if(Y<e&&g>0n){let z=g,A=Y,w=0;for(;z>0n&&A<e;){z-=1n;const te=Number(z),H=i(te);if(A+=H,!Number.isFinite(H)||H<0)break;if(H===0){if(w+=1,w>Nt){const L=Number(z);if(!Number.isSafeInteger(L))break;const{cumulative:re}=o.prefixSum(L,{materializeOption:{materialize:!1}});if(!Number.isFinite(re))break;const{index:I}=o.findIndexAtOrAfter(re-.5,{materializeOption:{materialize:!1}}),q=I===-1?-1n:Mt(I);if(q>=0n&&q<z)z=q+1n,w=0;else if(q===z&&z>=1n&&i(Number(z-1n))>0)w=0;else break}}else w=0}g=x(z);const K=Q(g);Y=K.height,le=K.end}const ce=x(g),ie=x(le),pe=x(ce-BigInt(Math.max(0,t))),he=x(ie+BigInt(Math.max(0,t)));return{renderingStartIndex:xe(Number(pe),s),renderingEndIndex:xe(Number(he),s),visibleStartIndex:xe(Number(ce),s),visibleEndIndex:xe(Number(ie),s)}},Er=(n,e,t,s,i,o,c)=>{if(s===0)return{renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0};const f=Number.isFinite(c),d=f?Math.min(Math.max(0,n),c):Math.max(0,n);if(s>=Number.MAX_SAFE_INTEGER)return Cr(d,e,t,s,i,o,c,f);const{index:x,cumulative:S,currentValue:v}=o.findIndexAtOrAfter(d,{materializeOption:{materialize:!1}}),C=x===-1?e<=0||(S??0)<d+(v??0)?s-1:0:x;let g=xe(C,s),E=0;if(x!==-1&&S===d)g=xe(x+1,s),E=0;else if(g===x&&S!==void 0&&v!==void 0)E=S-v-d;else{const{cumulative:z,currentValue:A}=o.prefixSum(g,{materializeOption:{materialize:!1}});E=(z??0)-(A??0)-d}const Q=E,Y=(z,A)=>{let w=z,K=A,te=0;for(;w<s&&K<e;){const H=i(w);if(K+=H,w++,!Number.isFinite(H)||H<0)break;if(H===0){if(te++,te>Nt){const{cumulative:L}=o.prefixSum(w-1,{materializeOption:{materialize:!1}}),{index:re}=Number.isFinite(L)?o.findIndexAtOrAfter(L+.5,{materializeOption:{materialize:!1}}):{index:-1};if(re>w)w=re,te=0;else if(re===w&&i(w)>0)te=0;else break}}else te=0}return{cursor:w,height:K}},le=Y(g,E);let ce=le.cursor;if(E=le.height,E<e&&g>0){let z=E+Math.abs(Math.min(0,Q)),A=g-1,w=0;for(;A>=0&&z<e;){const te=i(A);if(z+=te,!Number.isFinite(te)||te<0){A--;break}if(te===0){if(w++,w>Nt){const{cumulative:H}=o.prefixSum(A,{materializeOption:{materialize:!1}}),{index:L}=Number.isFinite(H)?o.findIndexAtOrAfter(H-.5,{materializeOption:{materialize:!1}}):{index:-1};if(L!==-1&&L<A){A=L,w=0;continue}if(L===A&&A>=1&&i(A-1)>0)w=0;else{A--;break}}}else w=0;A--}g=xe(A+1,s);const K=Y(g,0);ce=K.cursor,E=K.height}const ie=xe(g-t,s),pe=xe(Math.max(ce-1,g),s),he=xe(pe+t,s);return{renderingStartIndex:ie,renderingEndIndex:he,visibleStartIndex:g,visibleEndIndex:pe}},Kt=(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(o){console.error("[useThrottledInvoker] Error flushing pending callback on unmount",o)}i.arg=null}},[i,n,t]),r.useCallback(o=>{if(i.arg=o,i.id!==null)return;const c=f=>{if(i.id=null,i.arg===null)return;const d=f-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=f}i.arg!==null&&(i.id=requestAnimationFrame(c))};i.id=requestAnimationFrame(c)},[s,t,n,i])},kr=r.memo(({index:n,top:e,height:t,item:s,children:i,clipItemHeight:o,enableKeyboardNavigation:c,onKeyDown:f,onFocus:d,registerItemRef:x})=>{const S=r.useCallback(E=>x(n,E),[n,x]),v=r.useCallback(E=>f(E,n),[n,f]),C=r.useCallback(()=>d(n),[n,d]),g=r.useCallback(E=>{E.currentTarget.focus({preventScroll:!0})},[]);return $.jsx("div",{ref:S,"data-index":n,"data-virtualscroll-item":"true",className:"aqvs-item-container",style:{top:e,height:t,overflow:o?"hidden":void 0},tabIndex:c?-1:void 0,onPointerDown:c?g:void 0,onKeyDownCapture:c?v:void 0,onFocusCapture:c?C:void 0,children:i(s,n)})}),Nr=({itemCount:n,getItem:e,getItemKey:t,getItemHeight:s,viewportSize:i,overscanCount:o=15,className:c,testId:f,onScroll:d,onRangeChange:x,children:S,background:v,initialScrollIndex:C,initialScrollOffset:g,initialScrollAnchor:E,callbackThrottleMs:Q=5,contentInsets:Y,onItemFocus:le,scrollBarOptions:ce,behaviorOptions:ie,onWheelHorizontal:pe,contentProps:he},z)=>{const{width:A,enableThumbDrag:w,enableTrackClick:K,enableArrowButtons:te,enableScrollToTopBottomButtons:H,renderThumbOverlay:L,tapScrollCircleOptions:re}=ce??{},{enablePointerDrag:I,pointerDragInputs:q,enableKeyboardNavigation:W=!0,wheelSpeedMultiplier:Ke,inertiaOptions:X,clipItemHeight:we=!1,resetOnGetItemHeightChange:Ne=!1}=ie??{},[Re,Ae]=r.useState(0),oe=i??Re,Be=r.useCallback(l=>{Ae(u=>u===l?u:l)},[]),B=r.useRef(null),Se=r.useRef({renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0,scrollPosition:0,totalHeight:0}),Le=r.useRef(E&&n>0?{index:ae(Math.trunc(E.index),0,n-1),align:"top",offset:-Math.max(0,E.offsetPx??0)}:null),ge=r.useRef(!1),st=r.useRef(!0);r.useEffect(()=>{if(st.current){st.current=!1;return}Ne&&(Le.current=null)},[Ne,s]);const T=r.useMemo(()=>$t(Y),[Y]),[it]=r.useState(()=>{const u=E?.index??C,h=typeof u=="number"&&Number.isFinite(u)?Math.max(0,Math.trunc(u)):0;return{from:Math.max(0,h-50),to:h+50}}),ct=r.useMemo(()=>({sampleRange:it,resetOnValueFnChange:Ne,materialize:!0}),[Ne,it]),y=er(n,s,ct),[G]=r.useState(()=>{let l=0,u=0;if(E&&n>0){const h=ae(Math.trunc(E.index),0,n-1),N=Math.max(0,E.offsetPx??0),D=ae(h-o*2,0,n-1),_=ae(h+o*2,0,n-1),U=h>0||N>0?{materializeOption:{materialize:!0,ranges:[{from:D,to:_}]}}:void 0,{cumulative:J,total:Te,currentValue:fe}=y.prefixSum(h,U),de=Math.max(J-fe+N,0);l=gt(de,T.top),u=Te??y.getTotal()}else if(typeof C=="number"){const h=ae(C,0,n-1),N=ae(h-o*2,0,n-1),D=ae(h+o*2,0,n-1),_=C>0?{materializeOption:{materialize:!0,ranges:[{from:N,to:D}]}}:void 0,{cumulative:U,total:J,currentValue:Te}=y.prefixSum(C,_),fe=Math.max(U-Te,0);l=gt(fe,T.top),u=J??y.getTotal()}else typeof g=="number"&&(l=gt(Math.max(g,0),T.top)),u=y.getTotal();return{position:l,total:u}}),[Xe,ot]=r.useState(G.position),[Ve,Qe]=r.useState(G.total),ue=r.useRef(G.position),p=r.useRef(T.top),ne=r.useRef(d??void 0),ee=r.useRef(x??void 0),V=r.useRef(new Map),F=r.useRef(null),Z=r.useRef(null),[Ie,Pe]=r.useState(null),[ze,j]=r.useState(!1),ye=r.useRef(null),ke=r.useRef(!1),se=r.useRef(0),We=r.useRef(!1),et=r.useRef(!1),Ce=r.useRef(n);Ce.current!==n&&(Ce.current=n,et.current=!0),r.useEffect(()=>{ne.current=d??void 0,ee.current=x??void 0},[x,d]);const ve=r.useCallback(l=>{if(W&&l&&typeof l.focus=="function")try{l.focus({preventScroll:!0})}catch{l.focus()}},[W]),je=r.useCallback((l,{position:u,totalHeight:h})=>{l(u,h)},[]),He=Kt(ne,Q,je),m=r.useCallback((l,u)=>{l(u)},[]),P=Kt(ee,Q,m),Ee=r.useRef(T.top);Ee.current=T.top;const $e=r.useRef(He);$e.current=He,r.useEffect(()=>(ge.current=!1,()=>{ge.current=!0,ye.current&&(clearTimeout(ye.current),ye.current=null)}),[]),r.useEffect(()=>{W||(V.current.clear(),F.current=null,Z.current=null)},[W]);const Me=r.useCallback((l,u)=>{if(!u){V.current.delete(l);return}W&&(V.current.set(l,u),F.current===l&&(F.current=null,Z.current=l,ve(u)))},[W,ve]),Ge=.01,qe=r.useRef({rafId:null,loopActive:!1,idleFrames:0,lastRenderedPosition:G.position}),Ze=r.useCallback(()=>{const l=qe.current;l.rafId!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(l.rafId),l.rafId=null,l.loopActive=!1,l.idleFrames=0},[]);r.useEffect(()=>()=>{Ze()},[Ze]);const ut=r.useRef(()=>{}),mt=r.useCallback(()=>{const l=qe.current;l.rafId=null;const u=ue.current,h=Je(u,Ee.current),N=y.getTotal();if(ot(_=>Math.abs(_-u)<Ge?_:u),Math.abs(l.lastRenderedPosition-u)>=Ge?($e.current({position:h,totalHeight:N}),l.lastRenderedPosition=u,l.idleFrames=0):l.idleFrames+=1,l.idleFrames>=2){Ze();return}if(typeof requestAnimationFrame=="function"){l.rafId=requestAnimationFrame(_=>ut.current(_));return}l.loopActive=!1},[y,Ze]);ut.current=mt;const bt=r.useCallback(()=>{const l=qe.current;if(l.idleFrames=0,!l.loopActive){if(l.loopActive=!0,typeof requestAnimationFrame=="function"){l.rafId=requestAnimationFrame(mt);return}l.loopActive=!1}},[mt]),me=r.useCallback((l,u)=>{const h=u?.immediate??!1,N=Je(l,T.top);if(ue.current=l,h){qe.current.lastRenderedPosition=l,qe.current.idleFrames=0,ot(l),He({position:N,totalHeight:y.getTotal()});return}bt()},[bt,y,T.top,He]),ft=r.useCallback(l=>{const u=B.current;if(!u)return l;const h=u.getScrollPosition();se.current+=1;const N=u.scrollTo(l);return N===h&&(se.current=Math.max(0,se.current-1)),Math.abs(N-l)>.5&&(We.current=!0),N},[]),wt=r.useRef(!1);r.useEffect(()=>{if(!wt.current)if(wt.current=!0,E==null&&typeof C!="number"&&typeof g=="number"){const l=gt(Math.max(g,0),T.top),u=Math.abs(l-ue.current)>.5;me(l,{immediate:!0}),u&&B.current?.scrollTo(l)}else me(ue.current,{immediate:!0})},[E,C,g,T.top,me]),r.useEffect(()=>{const l=y.getTotal();if(Ve!==l){Qe(l);return}if(We.current){We.current=!1;const u=B.current;if(u&&Math.abs(u.getScrollPosition()-ue.current)>.5){const h=ft(ue.current);We.current=!1,me(h,{immediate:!0})}}},[y,Ve,n,ft,me]),r.useEffect(()=>{if(Le.current!==null){const{index:l,align:u,offset:h}=Le.current,N=xe(l,n),{cumulative:D,currentValue:_}=y.prefixSum(N,{materializeOption:{materialize:!1}});if(D!==void 0&&_!==void 0){const U=Math.max(D-_,0);let J=U;u==="bottom"?J=D-oe:u==="center"&&(J=U+_/2-oe/2),h&&(J-=h),J=Math.max(0,J);const Te=Math.max(0,Ve+T.top+T.bottom-oe),fe=Math.min(gt(J,T.top),Te);Math.abs(fe-ue.current)>1&&(R.debug("[VirtualScroll] Drift correction",{from:ue.current,to:fe,targetIndex:N}),se.current===0&&(se.current+=1),B.current?.scrollTo(fe),me(fe,{immediate:!0}))}}et.current=!1},[Ve,y,n,T.top,me,oe,T.bottom]),r.useEffect(()=>{const l=p.current;if(l===T.top||(p.current=T.top,Le.current))return;const u=Je(ue.current,l),h=gt(u,T.top);ue.current=h,B.current?.scrollTo(h),me(h,{immediate:!0})},[T.top,me]);const pt=r.useCallback((l,u)=>{if(n===0)return;const h=xe(l,n),N=y.get(h),D=u-N,_=y.update(h,u);_!==void 0&&Qe(_),R.debug("[VirtualScroll] Updated item size manually",{index:h,size:u,total:_});let U=Le.current?Le.current.index:null;if(U===null){const J=ue.current,Te=$t(Y).top,fe=Je(J,Te),{index:de,cumulative:Fe}=y.findIndexAtOrAfter(fe,{materializeOption:{materialize:!1}});U=Fe!==void 0&&Fe===fe?de+1:de}if(U!==-1&&h<U&&D!==0){const J=ue.current,Te=J+D;ft(Te),me(Te,{immediate:!0}),R.debug("[VirtualScroll] Adjusted scroll for layout shift (manual update)",{from:J,to:Te,causedByIndex:h,delta:D,activeVisibleStartIndex:U})}},[y,n,ft,me,Y]),Ue=r.useCallback((l,u)=>{if(!B.current||n===0)return;const h=xe(l,n),N=xe(h-o*2,n),D=xe(h+o*2,n),{cumulative:_,total:U,currentValue:J}=y.prefixSum(h,{materializeOption:{materialize:!0,ranges:[{from:N,to:D}]}});if(R.debug("[VirtualScroll] Scrolling to index:",h,"ItemBottom:",_,"Total height:",U,"ItemHeight:",J,"safeIndexFrom:",N,"safeIndexTo:",D),!U)return;const Te=Math.max(_-J,0);let fe=Te;u?.align==="bottom"?fe=_-oe:u?.align==="center"&&(fe=Te+J/2-oe/2),u?.offset&&(fe-=u.offset),fe=Math.max(0,fe);const de=gt(fe,T.top),Fe=B.current?.getContentSize()??U+T.top+T.bottom,De=Math.max(0,Fe-oe),Ye=Math.min(de,De);Le.current={index:h,align:u?.align,offset:u?.offset};const vt=B.current?.getScrollPosition()??-1,zt=Math.abs(vt-Ye)>.5;ke.current=!1,se.current=0,zt&&(ke.current=!0,se.current+=1,B.current?.scrollTo(Ye)),Qe(U),me(Ye,{immediate:!0}),R.debug("[VirtualScroll] Setting scroll position to:",Ye,{original:de,max:De})},[y,o,n,T.top,T.bottom,oe,me]),Rt=r.useRef(E&&n===0?E:null);r.useEffect(()=>{const l=Rt.current;!l||n===0||(Rt.current=null,Ue(ae(Math.trunc(l.index),0,n-1),{align:"top",offset:-Math.max(0,l.offsetPx??0)}))},[n,Ue]);const Pt=r.useCallback(l=>{if(!B.current||n===0)return;const u=y.getTotal(),h=ae(Math.floor(l),0,u),{index:N,cumulative:D,currentValue:_}=y.findIndexAtOrAfter(h,{materializeOption:{materialize:!1}}),J=(D??0)-(_??0)-h;Ue(N,{offset:J})},[y,n,Ue]),yt=r.useCallback(()=>{if(n===0)return null;const l=Je(ue.current,T.top),{index:u,cumulative:h,currentValue:N}=y.findIndexAtOrAfter(l,{materializeOption:{materialize:!1}});if(u===-1)return{index:n-1,offsetPx:0};if(h===l)return{index:ae(u+1,0,n-1),offsetPx:0};const D=(h??0)-(N??0);return{index:u,offsetPx:Math.max(0,l-D)}},[y,n,T.top]),Ct=r.useCallback(l=>{const u=Je(ue.current,T.top),h=typeof l=="function"?l(u):l;Pt(h);const N=B.current?.getScrollPosition(),D=typeof N=="number"?N:ue.current;return me(D),Je(D,Ee.current)},[T.top,Pt,me]),Vt=r.useCallback((l,u)=>{R.debug("[VirtualScroll] Scroll position changed:",l);const h=ke.current;h&&(ke.current=!1);const N=se.current>0;if(N&&(se.current=0),h||N||et.current||(Le.current=null),me(l),H){if(h||N)return;const D=l-u;if(R.debug("[VirtualScroll] Scroll diff:",D,"New:",l,"Prev:",u),Math.abs(D)>1){const _=D>0?"down":"up";Pe(_),j(!0),R.debug("[VirtualScroll] Showing scroll buttons. Direction:",_),ye.current&&clearTimeout(ye.current),ye.current=setTimeout(()=>{j(!1),R.debug("[VirtualScroll] Hiding scroll buttons")},2e3)}}},[me,H]),rt=r.useMemo(()=>Je(Xe,T.top),[T.top,Xe]),at=r.useMemo(()=>{const l=y.getTotal(),u=Er(rt,oe,o,n,s,y,l);return R.debug("[VirtualScroll] Calculated rendering range:",()=>({...u,scrollPosition:rt,renderingContentSize:l,overscanCount:o,viewportSize:oe})),u},[rt,oe,o,n,s,y]),{renderingStartIndex:a,renderingEndIndex:b,visibleStartIndex:M,visibleEndIndex:k}=at,O=r.useCallback((l,u)=>{if(!W||n===0)return;const h=xe(l,n);if(!(u?.ensureVisible??!0)){const De=V.current.get(h);De&&(F.current=null,Z.current=h,ve(De));return}const D=y.prefixSum(h,{materializeOption:{materialize:!1}}),_=D.currentValue,U=Math.max(D.cumulative-_,0),J=U+_,Te=Je(ue.current,T.top),fe=Te+oe;if(U<Te||J>fe){Ue(h);const De=V.current.get(h);De?(F.current=null,Z.current=h,ve(De)):F.current=h;return}const Fe=V.current.get(h);if(Fe){F.current=null,Z.current=h,ve(Fe);return}F.current=h},[W,n,y,T.top,Ue,ve,oe]),be=r.useCallback((l,u)=>{if(!W||l.defaultPrevented||l.altKey||l.metaKey||l.ctrlKey)return;const h=l.target;if(h){const N=h.tagName;if(N==="INPUT"||N==="TEXTAREA"||N==="SELECT"||h.isContentEditable)return}if(l.key==="ArrowDown"){u<n-1&&(l.preventDefault(),O(u+1));return}if(l.key==="ArrowUp"){u>0&&(l.preventDefault(),O(u-1));return}if(l.key==="PageDown"){if(u<n-1){l.preventDefault();const{visibleStartIndex:N,visibleEndIndex:D}=Se.current,_=Math.max(D-N+1,1),U=Math.max(_,1),J=xe(Math.min(u+U,n-1),n);O(J)}return}if(l.key==="PageUp"&&u>0){l.preventDefault();const{visibleStartIndex:N,visibleEndIndex:D}=Se.current,_=Math.max(D-N+1,1),U=Math.max(_,1),J=xe(u-U,n);O(J)}},[W,n,O]),Oe=r.useCallback(l=>{if(!W)return;const u=xe(l,n);F.current=null,Z.current=u,le?.(u)},[W,n,le]);r.useEffect(()=>{const l=B.current?.getScrollPosition()??0,u=ue.current,h=Je(u,T.top);R.debug("[VirtualScroll] Range change effect triggered",()=>({renderingStartIndex:a,renderingEndIndex:b,visibleStartIndex:M,visibleEndIndex:k,scrollPositionState:Xe,paneScrollPosition:u,logicalScrollPosition:h,contentSize:Ve,scrollPaneScrollPosition:l})),P({renderingStartIndex:a,renderingEndIndex:b,visibleStartIndex:M,visibleEndIndex:k,scrollPosition:h,totalHeight:Ve})},[Ve,b,a,T.top,P,Xe,k,M]);const _e=r.useCallback(()=>{if(!H)return null;const l=ze&&Ie!==null,u=Ie==="up";return $.jsx("div",{className:"aqvs-scroll-to-edge-overlay","data-visible":l,inert:!l,children:u?$.jsx("div",{className:"aqvs-scroll-to-edge-button-container aqvs-scroll-to-edge-button-container-top",children:$.jsx("button",{type:"button",className:"aqvs-scroll-to-edge-button",tabIndex:l?0:-1,onClick:h=>{h.stopPropagation(),ke.current=!0,Ue(0),j(!1)},children:"Top"})}):$.jsx("div",{className:"aqvs-scroll-to-edge-button-container aqvs-scroll-to-edge-button-container-bottom",children:$.jsx("button",{type:"button",className:"aqvs-scroll-to-edge-button",tabIndex:l?0:-1,onClick:h=>{h.stopPropagation(),ke.current=!0,Ue(n-1),j(!1)},children:"Bottom"})})})},[H,ze,Ie,Ue,n]),ht=r.useRef(0),{visibleItems:tt,renderAnchor:It}=r.useMemo(()=>{if(n===0)return{visibleItems:$.jsx("div",{className:"aqvs-no-items-container",children:$.jsx("div",{className:"aqvs-no-items-text",children:"No items"})}),renderAnchor:0};const l=xe(a,n),u=xe(b,n),{cumulative:h,currentValue:N}=y.prefixSum(l,{materializeOption:{materialize:!1}}),D=h-N;Number.isFinite(D)&&Math.abs(D-ht.current)>yr&&(ht.current=D);const _=ht.current,U=[],J=[];let Te=0,fe=D;for(let de=l;de<=u;de++){if(J.length>=Ut){R.warn("[VirtualScroll] Rendered item count reached the safety cap; truncating render window.",{cap:Ut,safeRenderingStartIndex:l,safeRenderingEndIndex:u});break}const Fe=s(de),De=y.get(de),Ye=Fe-De;Ye!==0&&U.push({index:de,value:Fe});const vt=fe+Te,zt=t?t(de):de;J.push($.jsx(kr,{index:de,top:vt-_,height:Fe,item:e(de),clipItemHeight:we,enableKeyboardNavigation:W,onKeyDown:be,onFocus:Oe,registerItemRef:Me,children:S},zt)),Te+=Ye,fe+=De}return U.length>0&&Promise.resolve().then(()=>{if(ge.current)return;let de=0;for(const Ye of U)if(Ye.index<M){const vt=y.get(Ye.index);de+=Ye.value-vt}const Fe=y.updates(U);if(ge.current||typeof Fe!="number")return;Qe(Fe),R.debug("[VirtualScroll] Updated heights for items",U,"New total height:",Fe);const De=B.current?.getScrollPosition()??ue.current;if(de!==0){const Ye=De+de;ft(Ye),me(Ye,{immediate:!0}),R.debug("[VirtualScroll] Adjusted scroll for layout shift (auto update)",{from:De,to:Ye,shiftAmount:de})}else De!==ue.current&&me(De)}),{visibleItems:J,renderAnchor:_}},[S,we,Ve,W,n,y,e,t,s,Oe,be,ft,Me,b,a,me,M]),rr=r.useCallback(l=>{const u=(Q??0)>0,h=Math.abs(l-Xe),N=u&&h>.5?Xe:l,D=Je(N,T.top);if(R.debug("[VirtualScroll] Rendering visible items",()=>({currentScrollPosition:l,effectiveScrollPosition:D,renderingStartIndex:a,renderingEndIndex:b,itemCount:n,viewportSize:oe,callbackThrottleMs:Q,diff:h,rawEffectiveScrollPosition:N})),n===0)return tt;const _=T.top+It-N,U=T.bottom>0?$.jsx("div",{className:"aqvs-bottom-inset",style:{top:y.getTotal()-It,height:T.bottom}},"virtualscroll-bottom-inset"):null;return R.debug("[VirtualScroll] Rendering items",()=>({containerTop:_,logicalScrollPosition:rt,resolvedInsets:T,effectiveScrollPosition:D})),$.jsxs("div",{className:"aqvs-items-wrapper",style:{top:0,transform:`translateY(${_}px)`,willChange:"transform"},children:[tt,U]})},[Q,n,y,rt,It,b,a,T,Xe,oe,tt]),Bt=r.useMemo(()=>({renderingStartIndex:at.renderingStartIndex,renderingEndIndex:at.renderingEndIndex,visibleStartIndex:at.visibleStartIndex,visibleEndIndex:at.visibleEndIndex,scrollPosition:rt,totalHeight:y.getTotal()}),[at,rt,y,Ve]);r.useEffect(()=>{Se.current=Bt},[Bt]),r.useImperativeHandle(z,()=>({getScrollPosition:()=>{const l=B.current?.getScrollPosition();return typeof l=="number"?Je(l,Ee.current):-1},getContentSize:()=>B.current?.getContentSize()??-1,getViewportSize:()=>B.current?.getViewportSize()??-1,scrollTo:Ct,scrollToIndex:Ue,getFenwickTreeTotalHeight:()=>y.getTotal(),getFenwickSize:()=>y.getSize(),focusItemAtIndex:O,getRange:()=>Se.current,getScrollAnchor:yt,updateItemSize:pt}),[Ct,Ue,y,O,yt,pt]);const nr=y.getTotal()+T.top+T.bottom;return $.jsx(Qt,{ref:B,contentSize:nr,viewportSize:i,onViewportSizeChange:Be,className:c,testId:f,onScroll:Vt,background:v,tapScrollCircleOptions:re,inertiaOptions:X,itemCount:n,scrollBarWidth:A,enableThumbDrag:w,enableTrackClick:K,enableArrowButtons:te,enablePointerDrag:I,pointerDragInputs:q,renderThumbOverlay:L,wheelSpeedMultiplier:Ke,onWheelHorizontal:pe,contentInsets:T,contentProps:he,visibleStartIndex:M,visibleEndIndex:k,renderOverlay:_e,initialScrollPosition:G.position,children:rr})},Vr=r.forwardRef(Nr);exports.FenwickMapTree=lt;exports.ScrollBar=Jt;exports.ScrollPane=Qt;exports.TAP_SCROLL_SPEED_DEFAULTS=Yt;exports.VirtualScroll=Vr;exports.computeAutoTapScrollMaxSpeedMultiplier=Zt;exports.computeTapScrollSpeed=Gt;exports.minmax=ae;exports.tapScrollCircleSampleVisual=vr;exports.useFenwickMapTree=er;exports.useHeightCache=Pr;exports.useLruCache=tr;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("react/jsx-runtime"),r=require("react"),vt=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 Ut={active:!1,offsetX:0,offsetY:0,distance:0,direction:0,pointerId:null},_t=6,pr=8,hr=({dragState:n,normalizedDistance:e})=>{const t=1+e*.18,s=.16+e*.24,i=.38+e*.28,o=n.active?"80ms ease-out":"220ms ease";return j.jsxs(j.Fragment,{children:[j.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:`${o}, ${n.active?"80ms":"260ms"} box-shadow ease`}}),j.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"}})]})},nr=r.memo(r.forwardRef(({onDragChange:n,className:e,maxVisualDistance:t=160,size:s=40,style:i,opacity:o=1,renderVisual:l},f)=>{const[p,b]=r.useState(Ut),S=r.useRef(null),v=r.useRef(null),k=r.useRef({x:0,y:0}),g=r.useRef(null),N=r.useRef(0),Z=r.useCallback(I=>{b(I),n(I)},[n]),Y=r.useCallback((I,q,Ce=!1)=>{const{x:Ge,y:C}=k.current,Ne=I-Ge,We=q-C,Me=Math.abs(We),Ee=Me<_t?0:We<0?-1:1,Ue=N.current;let He=Ee;const B=_t+pr;Ee===0?Ue!==0&&Me<B?He=Ue:(He=0,Ce||(N.current=0)):Ee!==Ue&&Ue!==0&&Me<B?He=Ue:N.current=Ee,Z({active:Ce||Me>=_t,offsetX:Ne,offsetY:We,distance:Me,direction:He,pointerId:S.current})},[Z]),ce=r.useCallback(I=>{if(I===null)return;const q=g.current;q?.hasPointerCapture(I)&&q.releasePointerCapture(I)},[]),ue=r.useCallback((I=!1)=>{I&&ce(S.current),S.current=null,v.current=null,N.current=0,Z(Ut)},[Z,ce]),ne=r.useCallback(I=>{if(S.current!==null&&S.current!==I.pointerId){v.current={pointerId:I.pointerId,clientX:I.clientX,clientY:I.clientY},I.preventDefault(),I.stopPropagation();return}I.preventDefault(),I.stopPropagation();const q=g.current??I.currentTarget,{left:Ce,top:Ge,width:C,height:Ne}=q.getBoundingClientRect();k.current={x:Ce+C/2,y:Ge+Ne/2},S.current=I.pointerId;try{q.setPointerCapture(I.pointerId)}catch{}Y(I.clientX,I.clientY,!0)},[Y]),oe=r.useCallback(I=>{if(S.current!==I.pointerId){v.current!==null&&v.current.pointerId===I.pointerId&&(v.current={pointerId:I.pointerId,clientX:I.clientX,clientY:I.clientY});return}I.preventDefault(),Y(I.clientX,I.clientY)},[Y]),fe=r.useCallback(I=>{if(S.current!==I.pointerId){v.current!==null&&v.current.pointerId===I.pointerId&&(v.current=null);return}I.preventDefault(),I.stopPropagation();const q=v.current;if(v.current=null,q!==null){ce(I.pointerId);const Ce=g.current;let Ge=!0;if(Ce!==null&&typeof Ce.setPointerCapture=="function")try{Ce.setPointerCapture(q.pointerId)}catch(C){(typeof C=="object"&&C!==null&&"name"in C?C.name:void 0)==="NotFoundError"&&(Ge=!1)}if(Ge){S.current=q.pointerId,Y(q.clientX,q.clientY,!0);return}}ue(!0)},[ue,ce,Y]),M=r.useCallback(I=>{I.target===I.currentTarget&&S.current===I.pointerId&&ue(!1)},[ue]);r.useImperativeHandle(f,()=>({reset:()=>{ue(!0)},getElement:()=>g.current}),[ue]);const L=Math.min(Math.max(o,0),1),T=s/64,U=Math.min(p.distance,t)/t,ee=p.direction*U*10*T,K=l??hr,F={dragState:p,normalizedDistance:U,sizeScale:T,size:s,opacity:L},G={...i,width:s,height:s,transform:`translateY(${ee}px)`};return G.opacity=L,j.jsx("div",{ref:g,"data-testid":"virtual-scroll-tap-circle",className:vt.twMerge("aqvs-tap-scroll-circle",e),style:G,tabIndex:-1,onPointerDown:ne,onPointerMove:oe,onPointerUp:fe,onPointerCancel:fe,onLostPointerCapture:M,role:"presentation",children:K(F)})}));nr.displayName="TapScrollCircle";const re=(n,e,t)=>Math.max(e,Math.min(t,n)),qt="virtualscroll:tap-scroll-cancel",Kt=20,gr=250,br=60,xr=20,Sr=20,Xt={maxDistance:240,minSpeedMultiplier:.2},Ir=Xt.maxDistance,Gt={active:!1,offsetX:0,offsetY:0,distance:0,direction:0,pointerId:null},Ft=2.2,vr=8,wr=120,Tr=1/10,it={enabled:!0,size:40,offsetX:-80,offsetY:0,className:void 0,maxVisualDistance:Ir,minSpeedMultiplier:Xt.minSpeedMultiplier,opacity:.9,renderVisual:void 0,maxSpeedCurve:void 0},Mr=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"},Rr=(n,e)=>{const t=n?.maxSpeedMultiplier,s=typeof t=="number"?t:ir(e);return{enabled:n?.enabled??it.enabled,size:n?.size??it.size,offsetX:n?.offsetX??it.offsetX,offsetY:n?.offsetY??it.offsetY,className:n?.className??it.className,maxVisualDistance:n?.maxVisualDistance??it.maxVisualDistance,maxSpeedMultiplier:s,minSpeedMultiplier:Math.max(n?.minSpeedMultiplier??it.minSpeedMultiplier,0),opacity:re(n?.opacity??it.opacity,0,1),renderVisual:n?.renderVisual??it.renderVisual,maxSpeedCurve:n?.maxSpeedCurve??it.maxSpeedCurve}},Pr=({isDragging:n,isThumbHovered:e,enableThumbDrag:t})=>r.useMemo(()=>t?n?"dragging":e?"hover":"idle":"disabled",[t,n,e]),yr=({canUseArrowButtons:n,enableArrowButtons:e,resetTapScroll:t,scrollByStep:s})=>{const i=r.useRef(null),o=r.useRef(null),l=r.useRef(null),f=r.useCallback(()=>{i.current!==null&&(window.clearInterval(i.current),i.current=null),o.current!==null&&(window.clearTimeout(o.current),o.current=null),l.current!==null&&(window.removeEventListener("pointerup",l.current),window.removeEventListener("pointercancel",l.current),window.removeEventListener("blur",l.current),l.current=null)},[]),p=r.useCallback(()=>{f()},[f]),b=r.useCallback(v=>k=>{if(!n)return;k.cancelable&&k.preventDefault(),k.stopPropagation(),t(),f(),s(v),o.current=window.setTimeout(()=>{i.current=window.setInterval(()=>{s(v)},br)},gr);const g=()=>f();l.current=g,window.addEventListener("pointerup",g),window.addEventListener("pointercancel",g),window.addEventListener("blur",g)},[n,f,t,s]),S=r.useCallback(v=>k=>{e&&(k.key==="Enter"||k.key===" "||k.key==="Spacebar")&&(k.preventDefault(),s(v))},[e,s]);return r.useEffect(()=>{n||f()},[n,f]),r.useEffect(()=>()=>{f()},[f]),{handleArrowPointerDown:b,handleArrowPointerUp:p,handleArrowKeyDown:S}},Cr=700,ht=(n,e)=>typeof n=="number"&&Number.isFinite(n)?n:e,sr=({distance:n,maxDistance:e,viewportSize:t,minSpeedMultiplier:s,maxSpeedMultiplier:i,hasCustomMaxSpeedMultiplier:o,curve:l})=>{const f=Math.max(ht(n,0),0),p=ht(e,0),b=p>0?Math.min(f,p)/p:1,S=Math.max(ht(t,0),0),v=Math.max(ht(s,0),0),k=Math.max(ht(i,0),0),g=Math.max(S*v,40),N=o?g:1200,Z=Math.max(S*k,N),Y=l?Math.max(ht(l.exponentialScale,k),0):0,ce=l?Math.min(Z,Math.max(S*Y,g)):Z,ue=Math.max(ce,g);let ne=b**1.1;if(l){const fe=Math.min(Math.max(ht(l.exponentialSteepness,0),0),Cr);if(fe===0)ne=b;else{const M=Math.expm1(fe)||1;ne=Math.min(Math.max(Math.expm1(fe*b)/M,0),1)}}const oe=Math.min(Math.max(ht(l?.easedOffset,0),0),1);return g+(ue-g)*(oe+(1-oe)*ne)},ir=n=>{if(!n||n<=0)return Ft;const e=Math.max(1,n),t=Math.log10(e),s=Ft+t*vr;return re(s,Ft,wr)},or=({contentSize:n,viewportSize:e,scrollPosition:t,onScroll:s,enableThumbDrag:i=!0,enableTrackClick:o=!0,enableArrowButtons:l=!0,horizontal:f=!1,scrollBarWidth:p=12,className:b,ariaControls:S,tapScrollCircleOptions:v,itemCount:k,renderThumbOverlay:g,visibleStartIndex:N,visibleEndIndex:Z})=>{const[Y,ce]=r.useState(!1),[ue,ne]=r.useState(!1),[oe,fe]=r.useState(!1),M=r.useRef(null),L=r.useRef({pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1,captureTarget:null}),T=r.useRef({pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1}),U=r.useRef(t),ee=r.useRef(s),K=r.useRef(Gt),F=r.useRef(null),G=r.useRef(null),I=r.useRef(null),q=r.useRef(0),Ce=r.useRef(0),Ge=r.useMemo(()=>Rr(v,k),[k,v]),C=r.useMemo(()=>Mr(f),[f]),{enabled:Ne,size:We,offsetX:Me,offsetY:Ee,className:Ue,maxVisualDistance:He,maxSpeedMultiplier:B,minSpeedMultiplier:Ve,opacity:se,renderVisual:me,maxSpeedCurve:_e}=Ge,ze=r.useRef({viewportSize:e,maxScrollPosition:Math.max(n-e,0),scrollBarVisible:n>e,effectiveTapMaxDistance:Math.max(He,1),tapCircleMaxSpeedMultiplier:B,tapCircleMinSpeedMultiplier:Ve,tapCircleMaxSpeedCurve:_e,tapScrollCircleOptions:v,effectiveTrackLength:0,onScroll:s,scrollPosition:t}),{mainSizeKey:ot,crossSizeKey:P,positionKey:at,selectDelta:lt,getPointerCoordinate:E,arrowLabels:J,arrowIcons:qe,directionClass:dt,orientation:Fe}=C,Ze=Math.max(He,1),ae=e/n,d=Math.max(e-p*2,0),X=ae*d,$=Math.min(Math.max(Kt,X||0),d||Kt),O=n-e,H=Math.max(d-$,0),be=O<=0||H<=0?0:re(t/O*H,0,H),Re=be+$/2,Q=n>e||Y,De=Q&&l;r.useLayoutEffect(()=>{ze.current={viewportSize:e,maxScrollPosition:O,scrollBarVisible:Q,effectiveTapMaxDistance:Ze,tapCircleMaxSpeedMultiplier:B,tapCircleMinSpeedMultiplier:Ve,tapCircleMaxSpeedCurve:_e,tapScrollCircleOptions:v,effectiveTrackLength:H,onScroll:s,scrollPosition:t}}),r.useLayoutEffect(()=>{U.current=t},[t]),r.useLayoutEffect(()=>{ee.current=s},[s]),r.useEffect(()=>{i||ne(!1)},[i]);const pe=Pr({isDragging:Y,isThumbHovered:ue,enableThumbDrag:i}),ke=r.useCallback((c,x)=>{const R=ze.current,V=x??U.current;if(ee.current){const Se=ee.current(c,V);if(typeof Se=="number"&&Number.isFinite(Se))return U.current=Se,Se}const W=typeof c=="function"?c(V):c,ie=Math.max(R.maxScrollPosition,0),ye=R.scrollBarVisible?re(W,0,ie):0;return U.current=ye,ye},[]),Xe=r.useCallback(c=>{const x=ze.current,R=U.current;if(!x.scrollBarVisible||x.maxScrollPosition<=0){const je=ke(0,R),St=je-R;return{nextPosition:je,actualDelta:St,reachedBoundary:!0}}if(c===0)return{nextPosition:R,actualDelta:0,reachedBoundary:!1};const W=ke(je=>re(je+c,0,x.maxScrollPosition),R),ie=W-R,ye=c<0&&R+c<=0,Se=c>0&&R+c>=x.maxScrollPosition,rt=c<0&&(W<=0||ye&&ie===0)||c>0&&(W>=x.maxScrollPosition||Se&&ie===0);return{nextPosition:W,actualDelta:ie,reachedBoundary:rt}},[ke]),ve=r.useCallback((c,x)=>{c.current+=x;const R=Math.max(ze.current.maxScrollPosition,0);R>0&&(c.current=re(c.current,-R,R));const V=Xe(c.current);return c.current-=V.actualDelta,V.reachedBoundary&&(c.current=0),V},[Xe]),he=r.useCallback(()=>{G.current!==null&&(window.cancelAnimationFrame(G.current),G.current=null),I.current=null,q.current=0,Ce.current=0},[]),we=r.useCallback(()=>{K.current={...Gt},fe(!1),F.current?.reset(),he()},[he]),Pe=r.useCallback(c=>{const x=K.current,R=ze.current;if(!x.active||x.direction===0){he();return}if(!R.scrollBarVisible||R.maxScrollPosition<=0){he();return}const V=I.current??c,W=Math.max((c-V)/1e3,0),ie=Math.min(W,Tr);if(I.current=c,ie<=0){G.current=window.requestAnimationFrame(Pe);return}const ye=sr({distance:x.distance,maxDistance:R.effectiveTapMaxDistance,viewportSize:R.viewportSize,minSpeedMultiplier:R.tapCircleMinSpeedMultiplier,maxSpeedMultiplier:R.tapCircleMaxSpeedMultiplier,hasCustomMaxSpeedMultiplier:typeof R.tapScrollCircleOptions?.maxSpeedMultiplier=="number",curve:R.tapCircleMaxSpeedCurve});Ce.current!==x.direction&&(Ce.current=x.direction,q.current=0);const{reachedBoundary:Se}=ve(q,x.direction*ye*ie);if(Se){he();return}G.current=window.requestAnimationFrame(Pe)},[ve,he]),Je=r.useCallback(()=>{G.current===null&&(I.current=null,q.current=0,G.current=window.requestAnimationFrame(Pe))},[Pe]);r.useEffect(()=>{const c=K.current;!c.active||c.direction===0||Je()},[n,e,Je]),r.useEffect(()=>()=>{he()},[he]);const Qe=r.useCallback(c=>{K.current=c,fe(c.active),c.active&&c.direction!==0?Je():he()},[Je,he]);r.useEffect(()=>{Ne||we()},[we,Ne]),r.useEffect(()=>{const c=x=>{const V=x.detail?.paneId;V&&S&&V!==S||we()};return window.addEventListener(qt,c),()=>{window.removeEventListener(qt,c)}},[S,we]),r.useEffect(()=>{if(!Ne)return;const c=x=>{if(!K.current.active||K.current.pointerId===x.pointerId)return;const R=x.target;if(!(R instanceof Node)){we();return}F.current?.getElement()?.contains(R)||we()};return document.addEventListener("pointerdown",c,!0),()=>{document.removeEventListener("pointerdown",c,!0)}},[we,Ne]);const et=c=>{if(!Q||H<=0||O<=0)return 0;const x=re(c,0,H);return re(x/H*O,0,O)},m=r.useCallback(c=>{const{scrollBarVisible:x,effectiveTrackLength:R,maxScrollPosition:V}=ze.current;if(w.debug("[ScrollBar] calculateScrollPositionFromThumb",()=>({thumbPos:c,trackLen:R,maxScroll:V})),R<=0||V<=0)return null;const W=re(c,0,R);return re(W/R*V,0,V)},[]),y=r.useCallback(c=>{const x=c.getBoundingClientRect(),R=f?x.width:x.height,V=rt=>{const je=Number.parseFloat(rt);return Number.isFinite(je)?je:0},W=window.getComputedStyle(c),ie=V(f?W.width:W.height),ye=ie>0?ie+V(f?W.paddingLeft:W.paddingTop)+V(f?W.paddingRight:W.paddingBottom)+V(f?W.borderLeftWidth:W.borderTopWidth)+V(f?W.borderRightWidth:W.borderBottomWidth):0,Se=ye>0?ye:f?c.offsetWidth:c.offsetHeight;return Se<=0||R<=0?1:R/Se},[f]),xe=r.useCallback(c=>{const x=L.current;if(x.pointerId!==c.pointerId)return;const R=c.clientX-x.startClientX,V=c.clientY-x.startClientY,W=lt(R,V)/(x.scale||1);w.debug("[ScrollBar] handleThumbPointerMove",()=>({delta:W,startThumbPosition:x.startThumbPosition,clientY:c.clientY,startClientY:x.startClientY,metrics:ze.current}));const ie=m(x.startThumbPosition+W);ie!==null&&ke(ie),c.cancelable&&c.preventDefault()},[lt,m,ke]),Ae=r.useCallback(c=>{const x=L.current;if(x.pointerId!==c.pointerId)return;document.removeEventListener("pointermove",xe),document.removeEventListener("pointerup",Ae),document.removeEventListener("pointercancel",Ae);const R=x.captureTarget;if(R?.hasPointerCapture?.(c.pointerId)&&R.releasePointerCapture(c.pointerId),L.current={pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1,captureTarget:null},ce(!1),M.current){const V=M.current.getBoundingClientRect();c.clientX>=V.left&&c.clientX<=V.right&&c.clientY>=V.top&&c.clientY<=V.bottom||ne(!1)}else ne(!1)},[xe]);r.useEffect(()=>()=>{document.removeEventListener("pointermove",xe),document.removeEventListener("pointerup",Ae),document.removeEventListener("pointercancel",Ae)},[xe,Ae]);const Le=r.useRef(0),tt=r.useRef(0),nt=r.useCallback(c=>{const x=Math.max(Math.round(ze.current.viewportSize/Sr),xr);tt.current!==c&&(tt.current=c,Le.current=0),ve(Le,c*x)},[ve]),{handleArrowPointerDown:ct,handleArrowPointerUp:st,handleArrowKeyDown:ut}=yr({canUseArrowButtons:De,enableArrowButtons:l,resetTapScroll:we,scrollByStep:nt}),xt=c=>{if(!Q)return;if(!i){c.preventDefault(),c.stopPropagation();return}if(c.pointerType==="mouse"&&c.button!==0||c.ctrlKey)return;we();const x=c.currentTarget,R=y(x);let V=null;if(x.setPointerCapture)try{x.setPointerCapture(c.pointerId),V=x}catch{V=null}L.current={pointerId:c.pointerId,startThumbPosition:be,startClientX:c.clientX,startClientY:c.clientY,scale:R,captureTarget:V},document.addEventListener("pointermove",xe),document.addEventListener("pointerup",Ae),document.addEventListener("pointercancel",Ae),ce(!0),ne(!0),c.preventDefault(),c.stopPropagation()},yt=c=>{if(!Q)return;if(!o){c.preventDefault(),c.stopPropagation();return}if(c.pointerType==="mouse"&&c.button!==0||c.ctrlKey)return;const x=c.currentTarget,R=x.getBoundingClientRect(),V=E(c),W=y(x),ie=(V-(f?R.left:R.top))/W;we();const ye=ie-$/2,Se=et(ye);if(ke(Se),x.setPointerCapture)try{x.setPointerCapture(c.pointerId)}catch{}T.current={pointerId:c.pointerId,startThumbPosition:ye,startClientX:c.clientX,startClientY:c.clientY,scale:W},c.preventDefault(),c.stopPropagation()},mt=()=>{T.current={pointerId:null,startThumbPosition:0,startClientX:0,startClientY:0,scale:1}},Ct=c=>{const x=T.current;if(x.pointerId!==c.pointerId)return;if(c.pointerType==="mouse"&&c.buttons===0){mt();return}const R=c.clientX-x.startClientX,V=c.clientY-x.startClientY,W=lt(R,V)/(x.scale||1),ie=et(x.startThumbPosition+W);ke(ie),c.cancelable&&c.preventDefault()},ge=c=>{if(T.current.pointerId!==c.pointerId)return;const x=c.currentTarget;x.hasPointerCapture?.(c.pointerId)&&x.releasePointerCapture(c.pointerId),mt(),c.preventDefault(),c.stopPropagation()},pt=c=>{if(T.current.pointerId!==c.pointerId)return;const x=c.currentTarget;x.hasPointerCapture?.(c.pointerId)&&x.releasePointerCapture(c.pointerId),mt()},Et=c=>{c.target===c.currentTarget&&T.current.pointerId===c.pointerId&&mt()},kt=r.useMemo(()=>re((oe?1:.8)*se,0,1),[oe,se]),Ke=r.useMemo(()=>{const x=`calc(50% - ${We/2}px + ${Ee}px)`;return{left:Me,top:x}},[Me,Ee,We]),wt=(c,x,R,V)=>j.jsx("button",{type:"button",tabIndex:0,className:"aqvs-scrollbar-arrow-button",style:{[ot]:p,[P]:p},"aria-label":x,onPointerDown:ct(c),onPointerUp:st,onPointerLeave:st,onPointerCancel:st,onKeyDown:ut(c),"aria-disabled":!l,disabled:!De,children:j.jsx("span",{"aria-hidden":"true",children:R})},V),Tt=g&&Q?{orientation:Fe,scrollPosition:t,maxScrollPosition:O,contentSize:n,viewportSize:e,thumbSize:$,thumbPosition:be,thumbCenter:Re,trackSize:d,isDragging:Y,isTapScrollActive:oe,visibleStartIndex:N,visibleEndIndex:Z}:null;return j.jsxs("div",{className:vt.twMerge("aqvs-scrollbar",dt,b),style:{[ot]:e,[P]:p},"data-visible":Q?"true":"false",role:"scrollbar",tabIndex:-1,"aria-controls":S,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":O,"aria-orientation":f?"horizontal":"vertical",children:[!f&&Q&&Ne&&j.jsx(nr,{ref:F,className:vt.twMerge("aqvs-scrollbar-tap-circle-wrapper",Ue),size:We,maxVisualDistance:Ze,style:Ke,opacity:kt,renderVisual:me,onDragChange:Qe},"tap-circle"),wt(-1,J[0],qe[0],"arrow-start"),j.jsxs("div",{className:"aqvs-scrollbar-track",style:{borderRadius:p/2},onPointerDown:yt,onPointerMove:Ct,onPointerUp:ge,onPointerCancel:pt,onLostPointerCapture:Et,"aria-disabled":!o,children:[Tt&&j.jsx("div",{className:"aqvs-scrollbar-overlay","aria-hidden":!0,children:g?.(Tt)},"overlay"),j.jsx("div",{className:"aqvs-scrollbar-thumb-wrapper",style:{[ot]:$,[at]:be,...f?{top:0,bottom:0}:{left:0,right:0}},"data-visible":Q||Y?"true":"false",onPointerDown:xt,role:"slider","aria-orientation":f?"horizontal":"vertical","aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":O,"aria-disabled":!i,tabIndex:-1,children:j.jsx("div",{ref:M,className:vt.twMerge("aqvs-scrollbar-thumb",f?"aqvs-scrollbar-thumb-horizontal":"aqvs-scrollbar-thumb-vertical"),"data-testid":"aqvs-scrollbar-thumb","data-thumb-state":pe,style:{borderRadius:p-1,cursor:i?"pointer":"default"},onMouseEnter:()=>{i&&ne(!0)},onMouseLeave:()=>{i&&ne(!1)}},"thumb")},"thumb-wrapper")]},"track"),wt(1,J[1],qe[1],"arrow-end")]})},Er=16,Zt=(n,e,t)=>e===1?n*Er:e===2?n*t:n,kr=(n,e)=>{const t=n.shiftKey&&n.deltaX===0,s=t?n.deltaY:n.deltaX,i=t?0:n.deltaY,o=s!==0&&Math.abs(s)>=Math.abs(i);return{isZoomGesture:n.ctrlKey,isHorizontalDominant:o,horizontalDelta:Zt(s,n.deltaMode,e),verticalDelta:Zt(i,n.deltaMode,e)}},ar=new WeakSet,Jt=n=>{ar.add(n)},Nr=n=>ar.has(n),Vr=["mouse","pen","touch"],Yt=(n,e)=>!(n==="mouse"||n==="pen"||n==="touch")||e.includes(n),zr=n=>n==="mouse"||n==="pen",Rt={maxVelocity:6,minVelocity:.02,deceleration:.0025,velocitySampleWindow:90,startVelocityThreshold:.04},Nt=(n,e,t)=>{for(const[s,i,o]of e)t==="add"?n.addEventListener(s,i,o):n.removeEventListener(s,i,o)},lr=r.forwardRef(({children:n,contentSize:e,viewportSize:t,onViewportSizeChange:s,scrollBarWidth:i=12,enableThumbDrag:o=!0,enableTrackClick:l=!0,enableArrowButtons:f=!0,enablePointerDrag:p=!0,pointerDragInputs:b=Vr,onScroll:S,className:v,testId:k,style:g,background:N,tapScrollCircleOptions:Z,inertiaOptions:Y,itemCount:ce,renderThumbOverlay:ue,wheelSpeedMultiplier:ne=1,onWheelHorizontal:oe,contentInsets:fe,visibleStartIndex:M,visibleEndIndex:L,renderOverlay:T,initialScrollPosition:U=0,contentProps:ee},K)=>{const F=r.useRef(Number.isFinite(U)?Math.max(0,U):0),G=r.useRef(null),I=r.useRef(null),q=t===void 0,[Ce,Ge]=r.useState(0),C=t??Ce,Ne=r.useRef(null);r.useLayoutEffect(()=>{if(!q)return;const d=I.current;if(!d)return;const X=()=>{const O=d.offsetHeight;if(O>0){Ge(H=>H===O?H:O);return}d.offsetParent!==null&&e>0&&Ne.current!=="zero"&&(Ne.current="zero",w.warn("[ScrollPane] The self-measured viewport is 0px. Give the scroll pane's host element a definite height (e.g. h-full, flex-1 + min-h-0, an explicit px height), or pass viewportSize explicitly."))};if(X(),typeof ResizeObserver!="function")return;const $=new ResizeObserver(X);return $.observe(d),()=>{$.disconnect()}},[e,q]),r.useLayoutEffect(()=>{q&&s?.(Ce)},[q,Ce,s]),r.useLayoutEffect(()=>{if(q)return;const d=G.current;if(!d)return;const X=()=>{const O=d.clientHeight;if(O<=0||Math.abs(O-C)<=1)return;const H=`${C}/${O}`;Ne.current!==H&&(Ne.current=H,w.warn(`[ScrollPane] viewportSize=${C} but the host band is ${O}px. The clip window, max scroll position, thumb mapping, rendered row count and scrollability all derive from viewportSize, so they are now wrong. Omit viewportSize to let the pane measure itself.`))};if(X(),typeof ResizeObserver!="function")return;const $=new ResizeObserver(X);return $.observe(d),()=>{$.disconnect()}},[q,C]);const We=r.useRef(oe);r.useEffect(()=>{We.current=oe},[oe]);const Me=r.useRef({frame:null,velocity:0,lastTimestamp:null,generation:0}),Ee=r.useMemo(()=>({maxVelocity:Y?.maxVelocity??Rt.maxVelocity,minVelocity:Y?.minVelocity??Rt.minVelocity,deceleration:Y?.deceleration??Rt.deceleration,velocitySampleWindow:Y?.velocitySampleWindow??Rt.velocitySampleWindow,startVelocityThreshold:Y?.startVelocityThreshold??Rt.startVelocityThreshold}),[Y]),Ue=r.useMemo(()=>({top:Math.max(0,fe?.top??0),bottom:Math.max(0,fe?.bottom??0)}),[fe]);w.debug("[ScrollPane] ScrollPane rendered",()=>({contentSize:e,viewportSize:C,scrollBarWidth:i,className:v,style:g,tapScrollCircleOptions:Z,inertiaOptions:Y,enablePointerDrag:p,contentInsets:Ue}));const He=r.useRef({contentSize:e,viewportSize:C}),B=r.useMemo(()=>e>C,[e,C]),Ve=r.useCallback((d,X)=>{let $=X??He.current;X&&!(Number.isFinite(X.contentSize)&&Number.isFinite(X.viewportSize))&&(w.warn("[ScrollPane] scrollTo received non-finite dimsOverride; falling back to the committed dims",{dimsOverride:X}),$=He.current);const{contentSize:O,viewportSize:H}=$,be=O>H,Re=F.current;if(w.debug("[ScrollPane] scrollTo called",()=>({newPosition:d,contentSize:O,viewportSize:H,currentIsScrollable:be,prevPosition:Re})),!be)return F.current!==0&&(F.current=0,S?.(0,Re)),F.current;const Q=typeof d=="function"?d(F.current):d;if(!Number.isFinite(Q))return w.warn("[ScrollPane] scrollTo received a non-finite position; keeping the current position",{nextPosition:Q}),F.current;const De=Math.max(O-H,0),pe=re(Q,0,De);return F.current!==pe&&(F.current=pe,S?.(pe,Re)),F.current},[S]),se=r.useRef(Ve);r.useEffect(()=>{se.current=Ve},[Ve]);const me=r.useCallback(()=>{const d=Me.current;d.generation+=1,d.frame!==null&&cancelAnimationFrame(d.frame),d.frame=null,d.velocity=0,d.lastTimestamp=null},[]),_e=r.useRef(me);r.useEffect(()=>{_e.current=me},[me]),r.useEffect(()=>()=>{_e.current()},[]);const ze=r.useCallback(d=>{if(!B)return;const{maxVelocity:X,minVelocity:$,deceleration:O,startVelocityThreshold:H}=Ee,be=re(d,-X,X);if(Math.abs(be)<H)return;me(),Me.current.velocity=be,Me.current.lastTimestamp=null;const Re=Me.current.generation,Q=De=>{const pe=Me.current;if(pe.generation!==Re)return;if(pe.lastTimestamp===null){pe.lastTimestamp=De,pe.frame=requestAnimationFrame(Q);return}const ke=De-pe.lastTimestamp;if(pe.lastTimestamp=De,ke<=0){pe.frame=requestAnimationFrame(Q);return}const Xe=pe.velocity;let ve=Xe;const he=O*ke;Xe>0?ve=Math.max(0,Xe-he):Xe<0&&(ve=Math.min(0,Xe+he));const Pe=(Xe+ve)/2*ke,Je=F.current;if(Pe!==0&&se.current(Ae=>Ae+Pe),Me.current.generation!==Re)return;const Qe=F.current,{contentSize:et,viewportSize:m}=He.current,y=Math.max(et-m,0);pe.velocity=ve;const xe=Qe===Je||Qe<=0&&ve<=0||Qe>=y&&ve>=0;if(Math.abs(ve)<$||xe){me();return}pe.frame=requestAnimationFrame(Q)};Me.current.frame=requestAnimationFrame(Q)},[B,Ee,me]),ot=r.useRef(ze);r.useEffect(()=>{ot.current=ze},[ze]),r.useLayoutEffect(()=>{He.current={contentSize:e,viewportSize:C}},[e,C]),r.useLayoutEffect(()=>{const d=I.current;if(!d)return;const X=()=>{d.scrollTop!==0&&(w.debug("[ScrollPane] Native scroll detected, resetting to 0",()=>({scrollTop:d.scrollTop})),d.scrollTop=0),d.scrollLeft!==0&&(d.scrollLeft=0)};return d.addEventListener("scroll",X),()=>d.removeEventListener("scroll",X)},[]),r.useLayoutEffect(()=>{if(B){w.debug("[ScrollPane] Adjusting scroll position due to content or viewport size change",()=>({contentSize:e,viewportSize:C,scrollPosition:F.current}));const d=re(e-C,0,e);F.current>d&&Ve(d)}else Ve(0)},[B,Ve,e,C]);const P=r.useRef({isScrollable:B,viewportSize:C,wheelSpeedMultiplier:ne});r.useLayoutEffect(()=>{P.current={isScrollable:B,viewportSize:C,wheelSpeedMultiplier:ne}},[B,C,ne]);const at=r.useCallback(d=>{if(Nr(d))return!1;const{isScrollable:X,viewportSize:$,wheelSpeedMultiplier:O}=P.current,H=kr(d,$);if(H.isZoomGesture)return!1;if(H.isHorizontalDominant)return We.current?(Jt(d),d.preventDefault(),me(),We.current(H.horizontalDelta),!0):!1;if(!X||H.verticalDelta===0)return!1;Jt(d),d.preventDefault(),me();let be=H.verticalDelta;return O!==1&&(be*=O),w.debug("[ScrollPane] wheel event",()=>({deltaY:be,scrollPosition:F.current,wheelSpeedMultiplier:O,deltaMode:d.deltaMode,scrollTop:I.current?.scrollTop})),Ve(Re=>Re+be),!0},[Ve,me]);r.useEffect(()=>{const d=O=>{at(O)},X=()=>{me()},$=G.current;return $&&($.addEventListener("wheel",d,{passive:!1}),$.addEventListener("pointerdown",X,{capture:!0,passive:!0})),()=>{$&&($.removeEventListener("wheel",d),$.removeEventListener("pointerdown",X,{capture:!0}))}},[at,me]),r.useImperativeHandle(K,()=>({scrollTo:(d,X)=>(me(),Ve(d,X)),getScrollPosition:()=>F.current,getContentSize:()=>e,getViewportSize:()=>C,applyWheel:at}),[Ve,e,C,me,at]);const lt=r.useId(),E=ee?.id??lt,J=r.useRef({pointerType:"",pointerId:null,startClientY:0,startScroll:0,isDragging:!1,shouldCancelNextClick:!1,clickResetTimer:null,velocitySamples:[]}),qe=r.useRef(p),dt=r.useRef(b);r.useEffect(()=>{qe.current=p},[p]),r.useEffect(()=>{dt.current=b},[b]);const Fe=r.useRef(B);r.useEffect(()=>{Fe.current=B},[B]);const Ze=r.useRef(Ee);r.useEffect(()=>{Ze.current=Ee},[Ee]),r.useEffect(()=>{const d=J.current;if(p&&B&&(d.pointerId===null||Yt(d.pointerType,b))||d.pointerId===null)return;const X=I.current;d.clickResetTimer!==null&&(window.clearTimeout(d.clickResetTimer),d.clickResetTimer=null);const $=d.isDragging&&d.shouldCancelNextClick,O=d.pointerId;d.pointerId=null,d.pointerType="",d.startClientY=0,d.startScroll=0,d.isDragging=!1,d.shouldCancelNextClick=$,d.velocitySamples=[],X?.hasPointerCapture(O)&&X.releasePointerCapture(O)},[p,b,B]),r.useEffect(()=>{const d=I.current;if(!d)return;const X=6,$=()=>typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now(),O=()=>{const m=J.current;m.pointerId=null,m.pointerType="",m.startClientY=0,m.startScroll=0,m.isDragging=!1,m.velocitySamples=[]},H=()=>{const m=J.current;m.clickResetTimer!==null&&(window.clearTimeout(m.clickResetTimer),m.clickResetTimer=null)},be=m=>{const y=J.current,xe=$();y.velocitySamples.push({clientY:m,time:xe});const Ae=Ze.current.velocitySampleWindow;y.velocitySamples=y.velocitySamples.filter(Le=>xe-Le.time<=Ae)},Re=m=>m instanceof HTMLElement&&m.closest("[data-scrollpane-ignore-drag='true']")!==null,Q=m=>{const y=J.current;y.shouldCancelNextClick&&(m.preventDefault(),m.stopPropagation(),y.shouldCancelNextClick=!1)},De=m=>{const y=J.current;if(!y.isDragging){if(y.isDragging=!0,y.shouldCancelNextClick=!0,!d.hasPointerCapture(m.pointerId))try{d.setPointerCapture(m.pointerId)}catch{}be(m.clientY)}},pe=m=>m.isTrusted||m.target===d,ke=m=>{const y=J.current;d.hasPointerCapture(m)&&d.releasePointerCapture(m),y.shouldCancelNextClick=!1,H(),O()},Xe=m=>{const y=J.current;if(y.pointerId!==m.pointerId)return;if(m.buttons===0&&zr(m.pointerType)){ke(m.pointerId);return}if(!(qe.current&&Fe.current)||!Yt(m.pointerType,dt.current)||!y.isDragging&&(Math.abs(m.clientY-y.startClientY)<X||(De(m),!y.isDragging)))return;be(m.clientY);const xe=m.clientY-y.startClientY,Ae=y.startScroll-xe;se.current(Ae),m.cancelable&&m.preventDefault()},ve=()=>{const m=J.current;return m.pointerId!==null||!m.shouldCancelNextClick?!1:(H(),m.clickResetTimer=window.setTimeout(()=>{const y=J.current;y.shouldCancelNextClick=!1,y.clickResetTimer=null},0),!0)},he=m=>{const y=J.current;if(y.pointerId!==m.pointerId){ve();return}y.isDragging&&y.shouldCancelNextClick&&m.cancelable&&(m.preventDefault(),m.stopPropagation()),y.isDragging&&be(m.clientY);let xe=0;if(y.isDragging&&y.velocitySamples.length>=2){const Le=y.velocitySamples,tt=Ze.current.velocitySampleWindow,nt=Le[Le.length-1],ct=Le.find(st=>nt.time-st.time<=tt)??Le[0];if(nt&&ct&&nt.time!==ct.time){const st=nt.clientY-ct.clientY,ut=nt.time-ct.time;xe=-(st/ut)}}H(),y.shouldCancelNextClick&&(y.clickResetTimer=window.setTimeout(()=>{const Le=J.current;Le.shouldCancelNextClick=!1,Le.clickResetTimer=null},0));const Ae=Ze.current.startVelocityThreshold;O(),d.hasPointerCapture(m.pointerId)&&d.releasePointerCapture(m.pointerId),Math.abs(xe)>=Ae&&ot.current?.(xe)},we=m=>{if(J.current.pointerId!==null){if(!m.isPrimary||m.pointerType!==J.current.pointerType)return;ke(J.current.pointerId)}if(J.current.shouldCancelNextClick&&(H(),J.current.shouldCancelNextClick=!1),!(qe.current&&Fe.current)||!Yt(m.pointerType,dt.current)||m.button!==0&&m.pointerType==="mouse"||m.ctrlKey||m.metaKey||m.altKey||Re(m.target))return;window.dispatchEvent(new CustomEvent(qt,{detail:{paneId:lt}})),_e.current?.();const y=J.current;H(),y.pointerId=m.pointerId,y.pointerType=m.pointerType,y.startClientY=m.clientY,y.startScroll=F.current,y.isDragging=!1,y.shouldCancelNextClick=!1,y.velocitySamples=[]},Pe=m=>{if(J.current.pointerId!==m.pointerId){ve();return}pe(m)&&ke(m.pointerId)},Qe=[["click",Q,!0],["pointerdown",we,{passive:!1}],["lostpointercapture",m=>{m.target!==d||J.current.pointerId!==m.pointerId||ke(m.pointerId)},void 0]],et=[["pointermove",Xe,{passive:!1}],["pointerup",he,void 0],["pointercancel",Pe,void 0]];return Nt(d,Qe,"add"),Nt(window,et,"add"),()=>{Nt(d,Qe,"remove"),Nt(window,et,"remove");const m=J.current;m.pointerId!==null&&d.hasPointerCapture(m.pointerId)&&d.releasePointerCapture(m.pointerId),H(),O()}},[lt]);const ae=r.useCallback(d=>(me(),Ve(d)),[Ve,me]);return j.jsxs("div",{ref:G,"data-testid":k,"data-self-measured":q?"true":void 0,className:vt.twMerge("aqvs-scroll-pane",v),style:g,children:[j.jsxs("div",{ref:I,className:vt.twMerge("aqvs-scroll-pane-content"),"data-testid":"aqvs-scroll-pane-content",style:{height:q?void 0:C,paddingTop:Ue.top,paddingBottom:Ue.bottom,...p&&B&&b.some(d=>d==="touch"||d==="pen")?{touchAction:"none"}:{}},...ee,id:E,children:[N,n(F.current)]}),j.jsx(or,{contentSize:e,viewportSize:C,scrollPosition:F.current,onScroll:ae,enableThumbDrag:o,enableTrackClick:l,enableArrowButtons:f,scrollBarWidth:i,ariaControls:E,tapScrollCircleOptions:Z,itemCount:ce,renderThumbOverlay:ue,visibleStartIndex:M,visibleEndIndex:L},"scrollbar"),T?.()]})}),Qt=(n,e,t)=>Math.min(Math.max(n,e),t),Dr=({dragState:n,normalizedDistance:e,sizeScale:t,size:s})=>{const i=Math.max(s/2,1),o=1+e*.65,l=Math.max(.65,1-e*.25),f=n.direction*e*26*t,p=.8+e*.18,b=3*t,S=6*t,v=22*t,k=Math.abs(f)+S,g=f>0?b:-Math.abs(f)-b,N=Math.max(2.5,3*t),Z=Qt(n.offsetX,-i,i),Y=Qt(n.offsetY,-i,i),ce=i*.35,ue=Z/i*ce,ne=Y/i*ce,oe=ue*.45,fe=ne*.45,M=Math.max(v*.38,6),L=.65+e*.2,T=n.active;return j.jsxs(j.Fragment,{children:[j.jsx("div",{className:"aqvs-tap-scroll-circle-gradient",style:{transform:`scale(${l}, ${o})`,transition:T?"40ms transform ease-out":"200ms ease transform"}}),j.jsx("div",{className:"aqvs-sample-visual-pupil",style:{width:v,height:v,transform:`translate(calc(-50% + ${ue}px), calc(-50% + ${ne}px)) scale(${l}, ${p*o})`,transition:T?"70ms transform ease-out":"200ms ease transform"}}),j.jsx("div",{className:"aqvs-sample-visual-highlight",style:{width:M,height:M,transform:`translate(calc(-50% + ${oe}px), calc(-50% + ${fe}px)) scale(${l}, ${o})`,opacity:L,boxShadow:"0 0 8px rgba(255,255,255,0.45)",transition:T?"120ms opacity 150ms, 120ms transform ease-out ease-out":"220ms ease transform, 240ms opacity ease"}}),j.jsx("div",{className:"aqvs-sample-visual-rod",style:{width:N,height:k,transform:`translate(-50%, ${g}px)`,opacity:e,transition:T?"40ms height, 60ms opacity ease-out ease-out":"200ms ease height, 120ms ease opacity"}})]})},Vt=100,Ar=n=>{if(!Number.isFinite(n))return 0n;const e=Math.trunc(n);return e<=0?0n:BigInt(e)},Bt=(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 ft{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 o=0,l;if(i>0){const f=s?.sampleRange??{from:0,to:Math.min(Vt-1,i-1)};let p=Math.max(0,Math.trunc(f.from)),b=Math.min(Math.trunc(f.to),i-1);if(p>b&&(p=0,b=Math.min(Vt-1,i-1)),i>Vt)o=ft._sampleBaseValueStrided(t,i,Vt),s?.materialize&&(l={from:p,values:ft._collectValidatedValues(t,p,b)});else{const S=ft._collectValidatedValues(t,p,b);o=ft._modeOrMedian([...S]),s?.materialize&&(l={from:p,values:S})}}if(this.size=i,this.tree=new Map,this.deltas=new Map,this.total=void 0,this.valueFn=t,this.baseValue=o,l)for(let f=0;f<l.values.length;f++){const p=l.from+f;if(p>=this.size)break;const b=l.values[f]-this.baseValue;b!==0&&(this.deltas.set(p,b),this._updateTree(p,b))}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 o=t;o<=s;o++)i.push(Bt(e(o),o));return i}static _modeOrMedian(e){if(e.length===0)return 0;e.sort((l,f)=>l-f);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 o=0;for(const l of e){const f=(i.get(l)??0)+1;i.set(l,f),f>o&&(o=f)}if(o>e.length*.2){const l=[];for(const[p,b]of i.entries())b===o&&l.push(p);const f=l.reduce((p,b)=>p+b,0);s=Math.floor(f/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 o=[];for(let l=0;l<t&&o.length<s;l+=i)o.push(Bt(e(l),l));return ft._modeOrMedian(o)}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:o}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(o))throw new Error(`Value must be a finite number: ${o}`);if(o<0)throw new Error("Value cannot be negative.");const l=s.has(i)?s.get(i)??0:this.deltas.get(i)??0,f=l+this.baseValue,p=o-f;p!==0&&t.push({index:i,change:p}),s.set(i,l+p)}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,o=Bt(this.valueFn(e),e)-this.baseValue;if(o!==s&&(o===0?this.deltas.delete(e):this.deltas.set(e,o),t)){const l=o-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 f of i){const p=Math.max(0,Math.trunc(f.from)),b=Math.min(Math.trunc(f.to),this.size-1);for(let S=p;S<=b;S++)this._materialize(S)}if(t===void 0)return;if(s){this._materialize(t);return}const o=i[0].from,l=i[i.length-1].to;t>=o&&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 o;for(;;){if(o=this._descend(e,s),o<0||o>=this.size)return{index:-1,total:this.total??this.getTotal(),cumulative:void 0,currentValue:void 0,safeIndex:void 0};if(!i)break;const f=this.deltas.get(o)??0;if(this._materialize(o),(this.deltas.get(o)??0)===f)break}const l=this.prefixSum(o);return{index:o,total:this.total??l.total,cumulative:l.cumulative,currentValue:l.currentValue,safeIndex:l.safeIndex}}_descend(e,t){let s=0,i=0,o=1;for(;o<<1<=this.size;)o<<=1;for(;o>0;o>>=1){const l=s+o;if(l<=this.size){const p=(this.tree.get(l)??0)+this.baseValue*o;(t?i+p<e:i+p<=e)&&(s=l,i+=p)}}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=Ar(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 o=t.materializeOption?.materialize===!0;for(;;){let l=0n,f=i-1n,p,b,S=this.total;for(;l<=f;){const g=l+f>>1n,N=Number(g),Z=this.prefixSum(N);if(S=Z.total,s?Z.cumulative>=e:Z.cumulative<=e)if(p=g,b=Z,s){if(g===0n)break;f=g-1n}else l=g+1n;else if(s)l=g+1n;else{if(g===0n)break;f=g-1n}}const v=b,k=p!==void 0?Number(p):-1;if(o&&k>=0){const g=this.deltas.get(k)??0;if(this._materialize(k),(this.deltas.get(k)??0)!==g)continue}return{index:k,total:S,cumulative:v?.cumulative,currentValue:v?.currentValue,safeIndex:v?.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=re(Math.trunc(e),0,this.size-1),i=t?.materializeOption;this._materializeRanges(i,s,!0);let o=0,l=s+1;for(;l>0;){const p=this.tree.get(l)??0;o+=p;const b=It(l);if(b===0)break;l-=b}const f=i?.materialize?this.get(s):(this.deltas.get(s)||0)+this.baseValue;return{cumulative:o+this.baseValue*(s+1),total:this.total,currentValue:f,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 o=s+1;for(;o<=this.size;){t.set(o,(t.get(o)??0)+i);const l=It(o);if(l===0)break;o+=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 o of this.deltas.keys())o>=t&&this.deltas.delete(o);this.size=t,this.rebuildTree()}else this._growSize(s,t);else{if(t>0)for(const o of this.deltas.keys())o>=t&&this.deltas.delete(o);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 o=e+1;for(;o<=s;){const l=It(o);if(l===0)break;o+=l}for(;o<=i;){this.tree.set(o,(this.tree.get(o)??0)+t);const l=It(o);if(l===0)break;o+=l}}_growSize(e,t){if(this.size=t,this.deltas.size>0){const s=ft._minCoveredLowBound(e,t);if(e-s<this.deltas.size)for(let o=s;o<e;o++){const l=this.deltas.get(o);l===void 0||l===0||this._propagateDeltaToGrownNodes(o,l,e,t)}else for(const[o,l]of this.deltas.entries())l===0||o<s||this._propagateDeltaToGrownNodes(o,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 Lr=(n,e)=>{const t=n?.sampleRange,s=e?.sampleRange;return t===s?!1:t&&s?t.from!==s.from||t.to!==s.to:!0},cr=(n,e,t)=>{const s=Number.isFinite(n)&&n>0?Math.trunc(n):0,i=r.useRef(null),o=r.useRef({size:s,valueOrFn:e,options:t});i.current===null&&(i.current=new ft(s,e,t));const l=i.current,f=o.current,p=f.size!==s,b=f.valueOrFn!==e,S=Lr(f.options,t),v=f.size===0&&s>0&&(!i.current||i.current.base===0);if(b||S){const k=t?.resetOnValueFnChange??!0;S||b&&k||v?(t?.debug&&w.debug("[useFenwickMapTree] reset",{valueOrFnChanged:b,optionsChanged:S}),l.reset(s,e,t)):(p&&(t?.debug&&w.debug("[useFenwickMapTree] resize (with valueFn change)",{from:f.size,to:s}),l.changeSize(s)),t?.debug&&w.debug("[useFenwickMapTree] setValueFn (no reset)",{valueOrFnChanged:b}),l.setValueFn(e,{reset:!1})),o.current={size:s,valueOrFn:e,options:t}}else p&&(t?.debug&&w.debug("[useFenwickMapTree] resize",{from:f.size,to:s}),v?l.reset(s,e,t):l.changeSize(s),o.current={size:s,valueOrFn:e,options:t});return l};class Or{key;value;prev=null;next=null;constructor(e,t){this.key=e,this.value=t}}class Ht{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 ur(n){const e=r.useRef(new Map),t=r.useRef(new Ht),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 Ht;return}if(Number.isFinite(s))for(;e.current.size>s;){const S=t.current.removeHead();if(S)e.current.delete(S.key);else break}},[n,s]);const o=r.useCallback(S=>{const v=e.current.get(S);if(v)return t.current.moveToTail(v),v.value},[]),l=r.useCallback((S,v)=>{const k=i.current;if(Number.isNaN(k)||k<=0)return;let g=e.current.get(S);if(g)g.value=v,t.current.moveToTail(g);else{if(e.current.size>=k){const N=t.current.removeHead();N&&e.current.delete(N.key)}g=new Or(S,v),e.current.set(S,g),t.current.addToTail(g)}},[]),f=r.useCallback(S=>e.current.has(S),[]),p=r.useCallback(S=>{const v=e.current.get(S);v&&(t.current.remove(v),e.current.delete(S))},[]),b=r.useCallback(()=>{e.current.clear(),t.current=new Ht},[]);return r.useMemo(()=>({get:o,set:l,has:f,remove:p,clear:b}),[o,l,f,p,b])}const _r=1e4,Fr=()=>{const{get:n,set:e,has:t,clear:s}=ur(_r);return r.useMemo(()=>({get:n,set:e,has:t,clear:s}),[n,e,t,s])},Yr=(n,e)=>{const t=r.useRef(e),s=r.useRef(n);r.useLayoutEffect(()=>{t.current=e,s.current=n},[e,n]);const i=r.useRef(new WeakMap);return r.useCallback(o=>{if(!o||i.current.has(o))return;const l=f=>{t.current?.enableBridge!==!1&&s.current.current?.applyWheel(f)};return o.addEventListener("wheel",l,{passive:!1}),i.current.set(o,l),()=>{i.current.get(o)===l&&(o.removeEventListener("wheel",l),i.current.delete(o))}},[])},Ie=(n,e)=>e<=0?0:re(n,0,e-1),er=n=>({top:Math.max(0,n?.top??0),bottom:Math.max(0,n?.bottom??0)}),$e=(n,e)=>n<=e?0:n-e,bt=(n,e)=>n<=0?0:n+e,zt=1e3,tr=2e3,Br=1048576,Hr=40,qr=n=>{const e=n.ownerDocument.defaultView?.getSelection();if(!e||e.isCollapsed||e.rangeCount===0)return!1;for(let t=0;t<e.rangeCount;t+=1)if(e.getRangeAt(t).intersectsNode(n))return!0;return!1},Pt=n=>{if(!Number.isFinite(n))return 0n;const e=Math.trunc(n);return e<=0?0n:BigInt(e)},Xr=(n,e,t,s,i,o,l,f)=>{const p=Pt(s);if(p===0n)return{renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0};const b=M=>M<0n?0n:M>=p?p-1n:M,S={materializeOption:{materialize:!1}},{index:v,cumulative:k}=o.findIndexAtOrAfter(n,S);let g;v===-1?g=p-1n:(k===n?g=Pt(v+1):g=Pt(v),g>=p&&(g=p-1n)),n<=0&&(g=0n),f&&n>=l&&(g=p-1n);const N=M=>{const L=Number(M);if(!Number.isSafeInteger(L))return null;const{cumulative:T}=o.prefixSum(L,{materializeOption:{materialize:!1}});if(!Number.isFinite(T))return null;const{index:U}=o.findIndexAtOrAfter(T+.5,{materializeOption:{materialize:!1}});if(U===-1)return null;const ee=Pt(U);return ee>M?ee:null},Z=M=>{let L=0,T=M,U=M,ee=0n,K=0;for(;T<p&&L<e;){const F=Number(T),G=i(F);if(L+=G,U=T,T+=1n,ee+=1n,!Number.isFinite(G)||G<0)break;if(G===0){if(K+=1,K>zt){const I=N(U);if(I!==null&&I>T)T=I,K=0;else if(I!==null&&I===T&&i(Number(T))>0)K=0;else break}}else K=0}return ee===0n&&(U=M),{height:L,end:U}};let{height:Y,end:ce}=Z(g);if(Y<e&&g>0n){let M=g,L=Y,T=0;for(;M>0n&&L<e;){M-=1n;const ee=Number(M),K=i(ee);if(L+=K,!Number.isFinite(K)||K<0)break;if(K===0){if(T+=1,T>zt){const F=Number(M);if(!Number.isSafeInteger(F))break;const{cumulative:G}=o.prefixSum(F,{materializeOption:{materialize:!1}});if(!Number.isFinite(G))break;const{index:I}=o.findIndexAtOrAfter(G-.5,{materializeOption:{materialize:!1}}),q=I===-1?-1n:Pt(I);if(q>=0n&&q<M)M=q+1n,T=0;else if(q===M&&M>=1n&&i(Number(M-1n))>0)T=0;else break}}else T=0}g=b(M);const U=Z(g);Y=U.height,ce=U.end}const ue=b(g),ne=b(ce),oe=b(ue-BigInt(Math.max(0,t))),fe=b(ne+BigInt(Math.max(0,t)));return{renderingStartIndex:Ie(Number(oe),s),renderingEndIndex:Ie(Number(fe),s),visibleStartIndex:Ie(Number(ue),s),visibleEndIndex:Ie(Number(ne),s)}},jr=(n,e,t,s,i,o,l)=>{if(s===0)return{renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0};const f=Number.isFinite(l),p=f?Math.min(Math.max(0,n),l):Math.max(0,n);if(s>=Number.MAX_SAFE_INTEGER)return Xr(p,e,t,s,i,o,l,f);const{index:b,cumulative:S,currentValue:v}=o.findIndexAtOrAfter(p,{materializeOption:{materialize:!1}}),k=b===-1?e<=0||(S??0)<p+(v??0)?s-1:0:b;let g=Ie(k,s),N=0;if(b!==-1&&S===p)g=Ie(b+1,s),N=0;else if(g===b&&S!==void 0&&v!==void 0)N=S-v-p;else{const{cumulative:M,currentValue:L}=o.prefixSum(g,{materializeOption:{materialize:!1}});N=(M??0)-(L??0)-p}const Z=N,Y=(M,L)=>{let T=M,U=L,ee=0;for(;T<s&&U<e;){const K=i(T);if(U+=K,T++,!Number.isFinite(K)||K<0)break;if(K===0){if(ee++,ee>zt){const{cumulative:F}=o.prefixSum(T-1,{materializeOption:{materialize:!1}}),{index:G}=Number.isFinite(F)?o.findIndexAtOrAfter(F+.5,{materializeOption:{materialize:!1}}):{index:-1};if(G>T)T=G,ee=0;else if(G===T&&i(T)>0)ee=0;else break}}else ee=0}return{cursor:T,height:U}},ce=Y(g,N);let ue=ce.cursor;if(N=ce.height,N<e&&g>0){let M=N+Math.abs(Math.min(0,Z)),L=g-1,T=0;for(;L>=0&&M<e;){const ee=i(L);if(M+=ee,!Number.isFinite(ee)||ee<0){L--;break}if(ee===0){if(T++,T>zt){const{cumulative:K}=o.prefixSum(L,{materializeOption:{materialize:!1}}),{index:F}=Number.isFinite(K)?o.findIndexAtOrAfter(K-.5,{materializeOption:{materialize:!1}}):{index:-1};if(F!==-1&&F<L){L=F,T=0;continue}if(F===L&&L>=1&&i(L-1)>0)T=0;else{L--;break}}}else T=0;L--}g=Ie(L+1,s);const U=Y(g,0);ue=U.cursor,N=U.height}const ne=Ie(g-t,s),oe=Ie(Math.max(ue-1,g),s),fe=Ie(oe+t,s);return{renderingStartIndex:ne,renderingEndIndex:fe,visibleStartIndex:g,visibleEndIndex:oe}},rr=(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(o){console.error("[useThrottledInvoker] Error flushing pending callback on unmount",o)}i.arg=null}},[i,n,t]),r.useCallback(o=>{if(i.arg=o,i.id!==null)return;const l=f=>{if(i.id=null,i.arg===null)return;const p=f-i.last;if(s===0||i.last===0||p>=s){if(n.current)try{t(n.current,i.arg)}catch(b){console.error("[useThrottledInvoker] Error invoking callback",b)}i.arg=null,i.last=f}i.arg!==null&&(i.id=requestAnimationFrame(l))};i.id=requestAnimationFrame(l)},[s,t,n,i])},$r=r.memo(({index:n,top:e,height:t,item:s,children:i,clipItemHeight:o,enableKeyboardNavigation:l,onKeyDown:f,onFocus:p,registerItemRef:b})=>{const S=r.useCallback(N=>b(n,N),[n,b]),v=r.useCallback(N=>f(N,n),[n,f]),k=r.useCallback(()=>p(n),[n,p]),g=r.useCallback(N=>{N.currentTarget.focus({preventScroll:!0})},[]);return j.jsx("div",{ref:S,"data-index":n,"data-virtualscroll-item":"true",className:"aqvs-item-container",style:{top:e,height:t,overflow:o?"hidden":void 0},tabIndex:l?-1:void 0,onPointerDown:l?g:void 0,onKeyDownCapture:l?v:void 0,onFocusCapture:l?k:void 0,children:i(s,n)})}),Wr=({itemCount:n,getItem:e,getItemKey:t,getItemHeight:s,viewportSize:i,overscanCount:o=15,className:l,testId:f,onScroll:p,onRangeChange:b,children:S,background:v,initialScrollIndex:k,initialScrollOffset:g,initialScrollAnchor:N,callbackThrottleMs:Z=5,contentInsets:Y,onItemFocus:ce,scrollBarOptions:ue,behaviorOptions:ne,onWheelHorizontal:oe,horizontalKeyInputs:fe,horizontalKeyStep:M=Hr,contentProps:L},T)=>{const{width:U,enableThumbDrag:ee,enableTrackClick:K,enableArrowButtons:F,enableScrollToTopBottomButtons:G,renderThumbOverlay:I,tapScrollCircleOptions:q}=ue??{},{enablePointerDrag:Ce,pointerDragInputs:Ge,enableKeyboardNavigation:C=!0,wheelSpeedMultiplier:Ne,inertiaOptions:We,clipItemHeight:Me=!1,resetOnGetItemHeightChange:Ee=!1}=ne??{},[Ue,He]=r.useState(0),B=i??Ue,Ve=r.useCallback(a=>{He(u=>u===a?u:a)},[]),se=r.useRef(null),me=r.useRef({renderingStartIndex:0,renderingEndIndex:0,visibleStartIndex:0,visibleEndIndex:0,scrollPosition:0,totalHeight:0}),_e=r.useRef(N&&n>0?{index:re(Math.trunc(N.index),0,n-1),align:"top",offset:-Math.max(0,N.offsetPx??0)}:null),ze=r.useRef(!1),ot=r.useRef(!0);r.useEffect(()=>{if(ot.current){ot.current=!1;return}Ee&&(_e.current=null)},[Ee,s]);const P=r.useMemo(()=>er(Y),[Y]),[at]=r.useState(()=>{const u=N?.index??k,h=typeof u=="number"&&Number.isFinite(u)?Math.max(0,Math.trunc(u)):0;return{from:Math.max(0,h-50),to:h+50}}),lt=r.useMemo(()=>({sampleRange:at,resetOnValueFnChange:Ee,materialize:!0}),[Ee,at]),E=cr(n,s,lt),[J]=r.useState(()=>{let a=0,u=0;if(N&&n>0){const h=re(Math.trunc(N.index),0,n-1),z=Math.max(0,N.offsetPx??0),D=re(h-o*2,0,n-1),A=re(h+o*2,0,n-1),_=h>0||z>0?{materializeOption:{materialize:!0,ranges:[{from:D,to:A}]}}:void 0,{cumulative:te,total:Te,currentValue:de}=E.prefixSum(h,_),le=Math.max(te-de+z,0);a=bt(le,P.top),u=Te??E.getTotal()}else if(typeof k=="number"){const h=re(k,0,n-1),z=re(h-o*2,0,n-1),D=re(h+o*2,0,n-1),A=k>0?{materializeOption:{materialize:!0,ranges:[{from:z,to:D}]}}:void 0,{cumulative:_,total:te,currentValue:Te}=E.prefixSum(k,A),de=Math.max(_-Te,0);a=bt(de,P.top),u=te??E.getTotal()}else typeof g=="number"&&(a=bt(Math.max(g,0),P.top)),u=E.getTotal();return{position:a,total:u}}),[qe,dt]=r.useState(J.position),[Fe,Ze]=r.useState(J.total),ae=r.useRef(J.position),d=r.useRef(P.top),X=r.useRef(p??void 0),$=r.useRef(b??void 0),O=r.useRef(oe),H=(fe?.length??0)>0,be=!!oe;r.useEffect(()=>{H&&(C||w.warn("[VirtualScroll] horizontalKeyInputs is set but behaviorOptions.enableKeyboardNavigation is false; horizontal keyboard scrolling is disabled because the row key handler is not mounted."),be||w.warn("[VirtualScroll] horizontalKeyInputs is set but onWheelHorizontal is missing; horizontal keyboard scrolling is disabled because the package does not own the horizontal axis."),Number.isFinite(M)&&M>0||w.warn(`[VirtualScroll] horizontalKeyStep must be a finite positive number, received ${M}. Horizontal arrow keys are left untouched.`))},[H,be,C,M]);const Re=r.useRef(new Map),Q=r.useRef(null),De=r.useRef(null),[pe,ke]=r.useState(null),[Xe,ve]=r.useState(!1),he=r.useRef(null),we=r.useRef(!1),Pe=r.useRef(0),Je=r.useRef(!1),Qe=r.useRef(!1),et=r.useRef(n);et.current!==n&&(et.current=n,Qe.current=!0),r.useLayoutEffect(()=>{X.current=p??void 0,$.current=b??void 0,O.current=oe},[b,p,oe]);const m=r.useCallback(a=>{if(C&&a&&typeof a.focus=="function")try{a.focus({preventScroll:!0})}catch{a.focus()}},[C]),y=r.useCallback((a,{position:u,totalHeight:h})=>{a(u,h)},[]),xe=rr(X,Z,y),Ae=r.useCallback((a,u)=>{a(u)},[]),Le=rr($,Z,Ae),tt=r.useRef(P.top);tt.current=P.top;const nt=r.useRef(xe);nt.current=xe,r.useEffect(()=>(ze.current=!1,()=>{ze.current=!0,he.current&&(clearTimeout(he.current),he.current=null)}),[]),r.useEffect(()=>{C||(Re.current.clear(),Q.current=null,De.current=null)},[C]);const ct=r.useCallback((a,u)=>{if(!u){Re.current.delete(a);return}C&&(Re.current.set(a,u),Q.current===a&&(Q.current=null,De.current=a,m(u)))},[C,m]),st=.01,ut=r.useRef({rafId:null,loopActive:!1,idleFrames:0,lastRenderedPosition:J.position}),xt=r.useCallback(()=>{const a=ut.current;a.rafId!==null&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(a.rafId),a.rafId=null,a.loopActive=!1,a.idleFrames=0},[]);r.useEffect(()=>()=>{xt()},[xt]);const yt=r.useRef(()=>{}),mt=r.useCallback(()=>{const a=ut.current;a.rafId=null;const u=ae.current,h=$e(u,tt.current),z=E.getTotal();if(dt(A=>Math.abs(A-u)<st?A:u),Math.abs(a.lastRenderedPosition-u)>=st?(nt.current({position:h,totalHeight:z}),a.lastRenderedPosition=u,a.idleFrames=0):a.idleFrames+=1,a.idleFrames>=2){xt();return}if(typeof requestAnimationFrame=="function"){a.rafId=requestAnimationFrame(A=>yt.current(A));return}a.loopActive=!1},[E,xt]);yt.current=mt;const Ct=r.useCallback(()=>{const a=ut.current;if(a.idleFrames=0,!a.loopActive){if(a.loopActive=!0,typeof requestAnimationFrame=="function"){a.rafId=requestAnimationFrame(mt);return}a.loopActive=!1}},[mt]),ge=r.useCallback((a,u)=>{const h=u?.immediate??!1,z=$e(a,P.top);if(ae.current=a,h){ut.current.lastRenderedPosition=a,ut.current.idleFrames=0,dt(a),xe({position:z,totalHeight:E.getTotal()});return}Ct()},[Ct,E,P.top,xe]),pt=r.useCallback((a,u=0)=>{const h=se.current;if(!h)return a;const z=h.getScrollPosition();Pe.current+=1;const D=h.getContentSize()+u,A=h.getViewportSize(),_=h.scrollTo(a,{contentSize:D,viewportSize:A});return _===z&&(Pe.current=Math.max(0,Pe.current-1)),Math.abs(_-a)>.5&&(Je.current=!0),_},[]),Et=r.useRef(!1);r.useEffect(()=>{if(!Et.current)if(Et.current=!0,N==null&&typeof k!="number"&&typeof g=="number"){const a=bt(Math.max(g,0),P.top),u=Math.abs(a-ae.current)>.5;ge(a,{immediate:!0}),u&&se.current?.scrollTo(a)}else ge(ae.current,{immediate:!0})},[N,k,g,P.top,ge]),r.useEffect(()=>{const a=E.getTotal();if(Fe!==a){Ze(a);return}if(Je.current){Je.current=!1;const u=se.current;if(u&&Math.abs(u.getScrollPosition()-ae.current)>.5){const h=pt(ae.current);Je.current=!1,ge(h,{immediate:!0})}}},[E,Fe,n,pt,ge]),r.useEffect(()=>{if(_e.current!==null){const{index:a,align:u,offset:h}=_e.current,z=Ie(a,n),{cumulative:D,currentValue:A}=E.prefixSum(z,{materializeOption:{materialize:!1}});if(D!==void 0&&A!==void 0){const _=Math.max(D-A,0);let te=_;u==="bottom"?te=D-B:u==="center"&&(te=_+A/2-B/2),h&&(te-=h),te=Math.max(0,te);const Te=Math.max(0,Fe+P.top+P.bottom-B),de=Math.min(bt(te,P.top),Te);Math.abs(de-ae.current)>1&&(w.debug("[VirtualScroll] Drift correction",{from:ae.current,to:de,targetIndex:z}),Pe.current===0&&(Pe.current+=1),se.current?.scrollTo(de),ge(de,{immediate:!0}))}}Qe.current=!1},[Fe,E,n,P.top,ge,B,P.bottom]),r.useEffect(()=>{const a=d.current;if(a===P.top||(d.current=P.top,_e.current))return;const u=$e(ae.current,a),h=bt(u,P.top);ae.current=h,se.current?.scrollTo(h),ge(h,{immediate:!0})},[P.top,ge]);const kt=r.useCallback((a,u)=>{if(n===0)return;const h=Ie(a,n),z=E.get(h),D=u-z,A=E.update(h,u);A!==void 0&&Ze(A),w.debug("[VirtualScroll] Updated item size manually",{index:h,size:u,total:A});let _=_e.current?_e.current.index:null;if(_===null){const te=ae.current,Te=er(Y).top,de=$e(te,Te),{index:le,cumulative:Ye}=E.findIndexAtOrAfter(de,{materializeOption:{materialize:!1}});_=Ye!==void 0&&Ye===de?le+1:le}if(_!==-1&&h<_&&D!==0){const te=ae.current,Te=te+D;pt(Te,D),ge(Te,{immediate:!0}),w.debug("[VirtualScroll] Adjusted scroll for layout shift (manual update)",{from:te,to:Te,causedByIndex:h,delta:D,activeVisibleStartIndex:_})}},[E,n,pt,ge,Y]),Ke=r.useCallback((a,u)=>{if(!se.current||n===0)return;const h=Ie(a,n),z=Ie(h-o*2,n),D=Ie(h+o*2,n),{cumulative:A,total:_,currentValue:te}=E.prefixSum(h,{materializeOption:{materialize:!0,ranges:[{from:z,to:D}]}});if(w.debug("[VirtualScroll] Scrolling to index:",h,"ItemBottom:",A,"Total height:",_,"ItemHeight:",te,"safeIndexFrom:",z,"safeIndexTo:",D),!_)return;const Te=Math.max(A-te,0);let de=Te;u?.align==="bottom"?de=A-B:u?.align==="center"&&(de=Te+te/2-B/2),u?.offset&&(de-=u.offset),de=Math.max(0,de);const le=bt(de,P.top),Ye=se.current?.getContentSize()??_+P.top+P.bottom,Oe=Math.max(0,Ye-B),Be=Math.min(le,Oe);_e.current={index:h,align:u?.align,offset:u?.offset};const Mt=se.current?.getScrollPosition()??-1,Ot=Math.abs(Mt-Be)>.5;we.current=!1,Pe.current=0,Ot&&(we.current=!0,Pe.current+=1,se.current?.scrollTo(Be)),Ze(_),ge(Be,{immediate:!0}),w.debug("[VirtualScroll] Setting scroll position to:",Be,{original:le,max:Oe})},[E,o,n,P.top,P.bottom,B,ge]),wt=r.useRef(N&&n===0?N:null);r.useEffect(()=>{const a=wt.current;!a||n===0||(wt.current=null,Ke(re(Math.trunc(a.index),0,n-1),{align:"top",offset:-Math.max(0,a.offsetPx??0)}))},[n,Ke]);const Tt=r.useCallback(a=>{if(!se.current||n===0)return;const u=E.getTotal(),h=re(Math.floor(a),0,u),{index:z,cumulative:D,currentValue:A}=E.findIndexAtOrAfter(h,{materializeOption:{materialize:!1}}),te=(D??0)-(A??0)-h;Ke(z,{offset:te})},[E,n,Ke]),c=r.useCallback(()=>{if(n===0)return null;const a=$e(ae.current,P.top),{index:u,cumulative:h,currentValue:z}=E.findIndexAtOrAfter(a,{materializeOption:{materialize:!1}});if(u===-1)return{index:n-1,offsetPx:0};if(h===a)return{index:re(u+1,0,n-1),offsetPx:0};const D=(h??0)-(z??0);return{index:u,offsetPx:Math.max(0,a-D)}},[E,n,P.top]),x=r.useCallback(a=>{const u=$e(ae.current,P.top),h=typeof a=="function"?a(u):a;Tt(h);const z=se.current?.getScrollPosition(),D=typeof z=="number"?z:ae.current;return ge(D),$e(D,tt.current)},[P.top,Tt,ge]),R=r.useCallback(a=>{const u=se.current;if(!u)return $e(ae.current,tt.current);const h=u.scrollTo(z=>z+a);return $e(h,tt.current)},[]),V=r.useCallback(a=>se.current?.applyWheel(a)??!1,[]),W=r.useCallback((a,u)=>{w.debug("[VirtualScroll] Scroll position changed:",a);const h=we.current;h&&(we.current=!1);const z=Pe.current>0;z&&(Pe.current=0);const D=Qe.current&&et.current===n;if(h||z||D||(_e.current=null),ge(a),G){if(h||z)return;const A=a-u;if(w.debug("[VirtualScroll] Scroll diff:",A,"New:",a,"Prev:",u),Math.abs(A)>1){const _=A>0?"down":"up";ke(_),ve(!0),w.debug("[VirtualScroll] Showing scroll buttons. Direction:",_),he.current&&clearTimeout(he.current),he.current=setTimeout(()=>{ve(!1),w.debug("[VirtualScroll] Hiding scroll buttons")},2e3)}}},[ge,G,n]),ie=r.useMemo(()=>$e(qe,P.top),[P.top,qe]),ye=r.useMemo(()=>{const a=E.getTotal(),u=jr(ie,B,o,n,s,E,a);return w.debug("[VirtualScroll] Calculated rendering range:",()=>({...u,scrollPosition:ie,renderingContentSize:a,overscanCount:o,viewportSize:B})),u},[ie,B,o,n,s,E]),{renderingStartIndex:Se,renderingEndIndex:rt,visibleStartIndex:je,visibleEndIndex:St}=ye,gt=r.useCallback((a,u)=>{if(!C||n===0)return;const h=Ie(a,n);if(!(u?.ensureVisible??!0)){const Oe=Re.current.get(h);Oe&&(Q.current=null,De.current=h,m(Oe));return}const D=E.prefixSum(h,{materializeOption:{materialize:!1}}),A=D.currentValue,_=Math.max(D.cumulative-A,0),te=_+A,Te=$e(ae.current,P.top),de=Te+B;if(_<Te||te>de){Ke(h);const Oe=Re.current.get(h);Oe?(Q.current=null,De.current=h,m(Oe)):Q.current=h;return}const Ye=Re.current.get(h);if(Ye){Q.current=null,De.current=h,m(Ye);return}Q.current=h},[C,n,E,P.top,Ke,m,B]),jt=r.useCallback((a,u)=>{if(!(!C||a.defaultPrevented)&&!(a.altKey||a.metaKey||a.ctrlKey)&&a.target===a.currentTarget&&!a.currentTarget.isContentEditable){if(a.key==="ArrowLeft"||a.key==="ArrowRight"){const h=O.current;if(!h)return;const z=a.shiftKey?"shift-arrow":"arrow";if(!fe?.includes(z)||a.shiftKey&&qr(a.currentTarget)||!(Number.isFinite(M)&&M>0))return;a.preventDefault(),h(a.key==="ArrowLeft"?-M:M);return}if(a.key==="ArrowDown"){u<n-1&&(a.preventDefault(),gt(u+1));return}if(a.key==="ArrowUp"){u>0&&(a.preventDefault(),gt(u-1));return}if(a.key==="PageDown"){if(u<n-1){a.preventDefault();const{visibleStartIndex:h,visibleEndIndex:z}=me.current,D=Math.max(z-h+1,1),A=Math.max(D,1),_=Ie(Math.min(u+A,n-1),n);gt(_)}return}if(a.key==="PageUp"&&u>0){a.preventDefault();const{visibleStartIndex:h,visibleEndIndex:z}=me.current,D=Math.max(z-h+1,1),A=Math.max(D,1),_=Ie(u-A,n);gt(_)}}},[C,n,gt,fe,M]),$t=r.useCallback(a=>{if(!C)return;const u=Ie(a,n);Q.current=null,De.current=u,ce?.(u)},[C,n,ce]);r.useEffect(()=>{const a=se.current?.getScrollPosition()??0,u=ae.current,h=$e(u,P.top);w.debug("[VirtualScroll] Range change effect triggered",()=>({renderingStartIndex:Se,renderingEndIndex:rt,visibleStartIndex:je,visibleEndIndex:St,scrollPositionState:qe,paneScrollPosition:u,logicalScrollPosition:h,contentSize:Fe,scrollPaneScrollPosition:a})),Le({renderingStartIndex:Se,renderingEndIndex:rt,visibleStartIndex:je,visibleEndIndex:St,scrollPosition:h,totalHeight:Fe})},[Fe,rt,Se,P.top,Le,qe,St,je]);const fr=r.useCallback(()=>{if(!G)return null;const a=Xe&&pe!==null,u=pe==="up";return j.jsx("div",{className:"aqvs-scroll-to-edge-overlay","data-visible":a,inert:!a,children:u?j.jsx("div",{className:"aqvs-scroll-to-edge-button-container aqvs-scroll-to-edge-button-container-top",children:j.jsx("button",{type:"button",className:"aqvs-scroll-to-edge-button",tabIndex:a?0:-1,onClick:h=>{h.stopPropagation(),we.current=!0,Ke(0),ve(!1)},children:"Top"})}):j.jsx("div",{className:"aqvs-scroll-to-edge-button-container aqvs-scroll-to-edge-button-container-bottom",children:j.jsx("button",{type:"button",className:"aqvs-scroll-to-edge-button",tabIndex:a?0:-1,onClick:h=>{h.stopPropagation(),we.current=!0,Ke(n-1),ve(!1)},children:"Bottom"})})})},[G,Xe,pe,Ke,n]),Dt=r.useRef(0),{visibleItems:At,renderAnchor:Lt}=r.useMemo(()=>{if(n===0)return{visibleItems:j.jsx("div",{className:"aqvs-no-items-container",children:j.jsx("div",{className:"aqvs-no-items-text",children:"No items"})}),renderAnchor:0};const a=Ie(Se,n),u=Ie(rt,n),{cumulative:h,currentValue:z}=E.prefixSum(a,{materializeOption:{materialize:!1}}),D=h-z;Number.isFinite(D)&&Math.abs(D-Dt.current)>Br&&(Dt.current=D);const A=Dt.current,_=[],te=[];let Te=0,de=D;for(let le=a;le<=u;le++){if(te.length>=tr){w.warn("[VirtualScroll] Rendered item count reached the safety cap; truncating render window.",{cap:tr,safeRenderingStartIndex:a,safeRenderingEndIndex:u});break}const Ye=s(le),Oe=E.get(le),Be=Ye-Oe;Be!==0&&_.push({index:le,value:Ye});const Mt=de+Te,Ot=t?t(le):le;te.push(j.jsx($r,{index:le,top:Mt-A,height:Ye,item:e(le),clipItemHeight:Me,enableKeyboardNavigation:C,onKeyDown:jt,onFocus:$t,registerItemRef:ct,children:S},Ot)),Te+=Be,de+=Oe}return _.length>0&&Promise.resolve().then(()=>{if(ze.current)return;let le=0;for(const Be of _)if(Be.index<je){const Mt=E.get(Be.index);le+=Be.value-Mt}const Ye=E.updates(_);if(ze.current||typeof Ye!="number")return;Ze(Ye),w.debug("[VirtualScroll] Updated heights for items",_,"New total height:",Ye);const Oe=se.current?.getScrollPosition()??ae.current;if(le!==0){const Be=Oe+le;pt(Be,le),ge(Be,{immediate:!0}),w.debug("[VirtualScroll] Adjusted scroll for layout shift (auto update)",{from:Oe,to:Be,shiftAmount:le})}else Oe!==ae.current&&ge(Oe)}),{visibleItems:te,renderAnchor:A}},[S,Me,Fe,C,n,E,e,t,s,$t,jt,pt,ct,rt,Se,ge,je]),dr=r.useCallback(a=>{const u=(Z??0)>0,h=Math.abs(a-qe),z=u&&h>.5?qe:a,D=$e(z,P.top);if(w.debug("[VirtualScroll] Rendering visible items",()=>({currentScrollPosition:a,effectiveScrollPosition:D,renderingStartIndex:Se,renderingEndIndex:rt,itemCount:n,viewportSize:B,callbackThrottleMs:Z,diff:h,rawEffectiveScrollPosition:z})),n===0)return At;const A=P.top+Lt-z,_=P.bottom>0?j.jsx("div",{className:"aqvs-bottom-inset",style:{top:E.getTotal()-Lt,height:P.bottom}},"virtualscroll-bottom-inset"):null;return w.debug("[VirtualScroll] Rendering items",()=>({containerTop:A,logicalScrollPosition:ie,resolvedInsets:P,effectiveScrollPosition:D})),j.jsxs("div",{className:"aqvs-items-wrapper",style:{top:0,transform:`translateY(${A}px)`,willChange:"transform"},children:[At,_]})},[Z,n,E,ie,Lt,rt,Se,P,qe,B,At]),Wt=r.useMemo(()=>({renderingStartIndex:ye.renderingStartIndex,renderingEndIndex:ye.renderingEndIndex,visibleStartIndex:ye.visibleStartIndex,visibleEndIndex:ye.visibleEndIndex,scrollPosition:ie,totalHeight:E.getTotal()}),[ye,ie,E,Fe]);r.useEffect(()=>{me.current=Wt},[Wt]),r.useImperativeHandle(T,()=>({getScrollPosition:()=>{const a=se.current?.getScrollPosition();return typeof a=="number"?$e(a,tt.current):-1},getContentSize:()=>se.current?.getContentSize()??-1,getViewportSize:()=>se.current?.getViewportSize()??-1,scrollTo:x,scrollBy:R,applyWheel:V,scrollToIndex:Ke,getFenwickTreeTotalHeight:()=>E.getTotal(),getFenwickSize:()=>E.getSize(),focusItemAtIndex:gt,getRange:()=>me.current,getScrollAnchor:c,updateItemSize:kt}),[x,R,V,Ke,E,gt,c,kt]);const mr=E.getTotal()+P.top+P.bottom;return j.jsx(lr,{ref:se,contentSize:mr,viewportSize:i,onViewportSizeChange:Ve,className:l,testId:f,onScroll:W,background:v,tapScrollCircleOptions:q,inertiaOptions:We,itemCount:n,scrollBarWidth:U,enableThumbDrag:ee,enableTrackClick:K,enableArrowButtons:F,enablePointerDrag:Ce,pointerDragInputs:Ge,renderThumbOverlay:I,wheelSpeedMultiplier:Ne,onWheelHorizontal:oe,contentInsets:P,contentProps:L,visibleStartIndex:je,visibleEndIndex:St,renderOverlay:fr,initialScrollPosition:J.position,children:dr})},Ur=r.forwardRef(Wr);exports.FenwickMapTree=ft;exports.ScrollBar=or;exports.ScrollPane=lr;exports.TAP_SCROLL_SPEED_DEFAULTS=Xt;exports.VirtualScroll=Ur;exports.computeAutoTapScrollMaxSpeedMultiplier=ir;exports.computeTapScrollSpeed=sr;exports.minmax=re;exports.tapScrollCircleSampleVisual=Dr;exports.useFenwickMapTree=cr;exports.useHeightCache=Fr;exports.useLruCache=ur;exports.useWheelBridge=Yr;
package/dist/index.d.cts CHANGED
@@ -11,5 +11,6 @@ export { tapScrollCircleSampleVisual } from './tapScrollCircleSampleVisual.cjs';
11
11
  export { FenwickMapTree, useFenwickMapTree } from './useFenwickMapTree.cjs';
12
12
  export { useHeightCache } from './useHeightCache.cjs';
13
13
  export { useLruCache } from './useLruCache.cjs';
14
+ export { useWheelBridge, type WheelBridgeOptions, type WheelBridgeTarget } from './useWheelBridge.cjs';
14
15
  export { minmax } from './utils.cjs';
15
16
  export { VirtualScroll, type VirtualScrollBehaviorOptions, type VirtualScrollHandle, type VirtualScrollProps, type VirtualScrollRange, type VirtualScrollScrollBarOptions, } from './VirtualScroll.cjs';
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export { tapScrollCircleSampleVisual } from './tapScrollCircleSampleVisual.tsx';
11
11
  export { FenwickMapTree, useFenwickMapTree } from './useFenwickMapTree.ts';
12
12
  export { useHeightCache } from './useHeightCache.ts';
13
13
  export { useLruCache } from './useLruCache.ts';
14
+ export { useWheelBridge, type WheelBridgeOptions, type WheelBridgeTarget } from './useWheelBridge.ts';
14
15
  export { minmax } from './utils.ts';
15
16
  export { VirtualScroll, type VirtualScrollBehaviorOptions, type VirtualScrollHandle, type VirtualScrollProps, type VirtualScrollRange, type VirtualScrollScrollBarOptions, } from './VirtualScroll.tsx';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sCAAsC,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,yBAAyB,EAAE,KAAK,gCAAgC,EAAE,yBAAyB,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAC3P,OAAO,EAAE,UAAU,EAAE,KAAK,uBAAuB,EAAE,KAAK,gBAAgB,EAAE,KAAK,wBAAwB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvJ,YAAY,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EACH,aAAa,EACb,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,GACrC,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sCAAsC,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,yBAAyB,EAAE,KAAK,gCAAgC,EAAE,yBAAyB,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAC3P,OAAO,EAAE,UAAU,EAAE,KAAK,uBAAuB,EAAE,KAAK,gBAAgB,EAAE,KAAK,wBAAwB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvJ,YAAY,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EACH,aAAa,EACb,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,GACrC,MAAM,qBAAqB,CAAA"}