@aiquants/virtualscroll 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,154 +1,145 @@
1
- import { jsx as H, jsxs as Se, Fragment as rt } from "react/jsx-runtime";
2
- import { forwardRef as ke, useState as pe, useRef as F, useCallback as y, useImperativeHandle as Ye, useMemo as Te, useEffect as se, useReducer as bt, useLayoutEffect as Ae, useId as Tt } from "react";
3
- import { twMerge as Ie } from "tailwind-merge";
4
- const Ze = {
1
+ import { jsx as Q, jsxs as Gt, Fragment as ye } from "react/jsx-runtime";
2
+ import { forwardRef as me, useState as Yt, useRef as w, useCallback as M, useImperativeHandle as he, useMemo as Vt, useEffect as L, useLayoutEffect as se, useId as Le } from "react";
3
+ import { twMerge as jt } from "tailwind-merge";
4
+ const xe = {
5
5
  active: !1,
6
6
  offsetX: 0,
7
7
  offsetY: 0,
8
8
  distance: 0,
9
9
  direction: 0
10
- }, Je = 6, yt = ({ dragState: s, normalizedDistance: e }) => {
11
- const t = 1 + e * 0.18, n = 0.16 + e * 0.24, r = 0.38 + e * 0.28, o = s.active ? "80ms ease-out" : "220ms ease";
12
- return /* @__PURE__ */ Se(rt, { children: [
13
- /* @__PURE__ */ H(
10
+ }, de = 6, Ye = 8, ze = ({ dragState: r, normalizedDistance: t }) => {
11
+ const e = 1 + t * 0.18, n = 0.16 + t * 0.24, o = 0.38 + t * 0.28, a = r.active ? "80ms ease-out" : "220ms ease";
12
+ return /* @__PURE__ */ Gt(ye, { children: [
13
+ /* @__PURE__ */ Q(
14
14
  "div",
15
15
  {
16
16
  className: "absolute inset-0 rounded-full",
17
17
  style: {
18
18
  background: "linear-gradient(140deg, rgba(255,255,255,0.62), rgba(72,72,72,0.48))",
19
19
  boxShadow: `0 0 0 1px rgba(255,255,255,0.28), 0 10px 22px rgba(0,0,0,${n})`,
20
- transform: `scale(${t})`,
21
- transition: `${o}, ${s.active ? "80ms" : "260ms"} box-shadow ease`
20
+ transform: `scale(${e})`,
21
+ transition: `${a}, ${r.active ? "80ms" : "260ms"} box-shadow ease`
22
22
  }
23
23
  }
24
24
  ),
25
- /* @__PURE__ */ H(
25
+ /* @__PURE__ */ Q(
26
26
  "div",
27
27
  {
28
- className: "absolute inset-[18%] rounded-full",
28
+ className: "aqvs:tap-scroll-circle-inner absolute rounded-full",
29
29
  style: {
30
30
  background: "linear-gradient(140deg, rgba(255,255,255,0.72), rgba(28,28,28,0.58))",
31
31
  boxShadow: "inset 0 4px 10px rgba(0,0,0,0.24), inset 0 0 2px rgba(255,255,255,0.55)",
32
- opacity: r,
33
- transition: s.active ? "120ms opacity ease-out" : "220ms opacity ease"
32
+ opacity: o,
33
+ transition: r.active ? "120ms opacity ease-out" : "220ms opacity ease"
34
34
  }
35
35
  }
36
36
  )
37
37
  ] });
38
- }, st = ke(({ onDragChange: s, className: e, maxVisualDistance: t = 160, size: n = 40, style: r, opacity: o = 1, renderVisual: i }, a) => {
39
- const [f, c] = pe(Ze), u = F(null), p = F({ x: 0, y: 0 }), E = F(null), A = y((d) => {
40
- c(d), s(d);
41
- }, [s]), O = y(
42
- (d, M, z = !1) => {
43
- const { x: Z, y: h } = p.current, _ = d - Z, g = M - h, P = Math.abs(g), R = P < Je ? 0 : g < 0 ? -1 : 1;
44
- A({
45
- active: z || P >= Je,
46
- offsetX: _,
47
- offsetY: g,
48
- distance: P,
49
- direction: R
38
+ }, Me = me(({ onDragChange: r, className: t, maxVisualDistance: e = 160, size: n = 40, style: o, opacity: a = 1, renderVisual: u }, f) => {
39
+ const [l, c] = Yt(xe), d = w(null), h = w({ x: 0, y: 0 }), b = w(null), T = w(0), k = M(
40
+ (C) => {
41
+ c(C), r(C);
42
+ },
43
+ [r]
44
+ ), _ = M(
45
+ (C, P, j = !1) => {
46
+ const { x: rt, y: Ct } = h.current, ot = C - rt, $ = P - Ct, ct = Math.abs($), dt = ct < de ? 0 : $ < 0 ? -1 : 1, A = T.current;
47
+ let S = dt;
48
+ const v = de + Ye;
49
+ dt === 0 ? A !== 0 && ct < v ? S = A : (S = 0, j || (T.current = 0)) : dt !== A && A !== 0 && ct < v ? S = A : T.current = dt, k({
50
+ active: j || ct >= de,
51
+ offsetX: ot,
52
+ offsetY: $,
53
+ distance: ct,
54
+ direction: S
50
55
  });
51
56
  },
52
- [A]
53
- ), te = y((d) => {
54
- if (d === null)
57
+ [k]
58
+ ), tt = M((C) => {
59
+ if (C === null)
55
60
  return;
56
- const M = E.current;
57
- M?.hasPointerCapture(d) && M.releasePointerCapture(d);
58
- }, []), X = y(
59
- (d = !1) => {
60
- d && te(u.current), u.current = null, A(Ze);
61
+ const P = b.current;
62
+ P?.hasPointerCapture(C) && P.releasePointerCapture(C);
63
+ }, []), Y = M(
64
+ (C = !1) => {
65
+ C && tt(d.current), d.current = null, T.current = 0, k(xe);
61
66
  },
62
- [A, te]
63
- ), ne = y(
64
- (d) => {
65
- d.preventDefault(), d.stopPropagation();
66
- const M = E.current ?? d.currentTarget, { left: z, top: Z, width: h, height: _ } = M.getBoundingClientRect();
67
- p.current = { x: z + h / 2, y: Z + _ / 2 }, u.current = d.pointerId, M.setPointerCapture(d.pointerId), O(d.clientX, d.clientY, !0);
67
+ [k, tt]
68
+ ), ut = M(
69
+ (C) => {
70
+ C.preventDefault(), C.stopPropagation();
71
+ const P = b.current ?? C.currentTarget, { left: j, top: rt, width: Ct, height: ot } = P.getBoundingClientRect();
72
+ h.current = { x: j + Ct / 2, y: rt + ot / 2 }, d.current = C.pointerId, P.setPointerCapture(C.pointerId), _(C.clientX, C.clientY, !0);
68
73
  },
69
- [O]
70
- ), S = y(
71
- (d) => {
72
- u.current === d.pointerId && (d.preventDefault(), O(d.clientX, d.clientY));
74
+ [_]
75
+ ), V = M(
76
+ (C) => {
77
+ d.current === C.pointerId && (C.preventDefault(), _(C.clientX, C.clientY));
73
78
  },
74
- [O]
75
- ), ce = y(
76
- (d) => {
77
- u.current === d.pointerId && (d.preventDefault(), d.stopPropagation(), X(!0));
79
+ [_]
80
+ ), D = M(
81
+ (C) => {
82
+ d.current === C.pointerId && (C.preventDefault(), C.stopPropagation(), Y(!0));
78
83
  },
79
- [X]
84
+ [Y]
80
85
  );
81
- Ye(
82
- a,
86
+ he(
87
+ f,
83
88
  () => ({
84
89
  reset: () => {
85
- X(!0);
90
+ Y(!0);
86
91
  },
87
- getElement: () => E.current
92
+ getElement: () => b.current
88
93
  }),
89
- [X]
94
+ [Y]
90
95
  );
91
- const le = Math.min(Math.max(o, 0), 1), G = n / 64, C = Math.min(f.distance, t) / t, K = f.direction * C * 10 * G, I = i ?? yt, x = {
92
- dragState: f,
93
- normalizedDistance: C,
94
- sizeScale: G,
96
+ const X = Math.min(Math.max(a, 0), 1), O = n / 64, R = Math.min(l.distance, e) / e, H = l.direction * R * 10 * O, q = u ?? ze, N = {
97
+ dragState: l,
98
+ normalizedDistance: R,
99
+ sizeScale: O,
95
100
  size: n,
96
- opacity: le
97
- }, $ = {
98
- ...r,
101
+ opacity: X
102
+ }, g = {
103
+ ...o,
99
104
  width: n,
100
105
  height: n,
101
- transform: `translateY(${K}px)`
106
+ transform: `translateY(${H}px)`
102
107
  };
103
- return $.opacity = le, /* @__PURE__ */ H(
108
+ return g.opacity = X, /* @__PURE__ */ Q(
104
109
  "div",
105
110
  {
106
- ref: E,
107
- className: Ie(
108
- "relative flex touch-none select-none items-center justify-center",
109
- "transition-transform duration-100 ease-out",
110
- e
111
- ),
112
- style: $,
113
- onPointerDown: ne,
114
- onPointerMove: S,
115
- onPointerUp: ce,
116
- onPointerCancel: ce,
111
+ ref: b,
112
+ "data-testid": "virtual-scroll-tap-circle",
113
+ className: jt("relative flex touch-none select-none items-center justify-center", "transition-transform duration-100 ease-out", t),
114
+ style: g,
115
+ tabIndex: -1,
116
+ onPointerDown: ut,
117
+ onPointerMove: V,
118
+ onPointerUp: D,
119
+ onPointerCancel: D,
117
120
  role: "presentation",
118
- children: I(x)
121
+ children: q(N)
119
122
  }
120
123
  );
121
124
  });
122
- st.displayName = "TapScrollCircle";
123
- const W = (s, e, t) => Math.min(t, Math.max(e, s)), Qe = (s, e, t) => {
124
- const n = "touches" in s.nativeEvent, r = n ? s.nativeEvent.touches[0] : s.nativeEvent, o = (a) => {
125
- n && a.cancelable && a.preventDefault();
126
- const f = "touches" in a ? a.touches[0] : a;
127
- e({
128
- deltaX: f.clientX - r.clientX,
129
- deltaY: f.clientY - r.clientY
130
- });
131
- }, i = () => {
132
- n ? (document.removeEventListener("touchmove", o), document.removeEventListener("touchend", i)) : (document.removeEventListener("mousemove", o), document.removeEventListener("mouseup", i)), t?.();
133
- };
134
- n ? (document.addEventListener("touchmove", o, { passive: !1 }), document.addEventListener("touchend", i)) : (document.addEventListener("mousemove", o), document.addEventListener("mouseup", i));
135
- }, ze = "virtualscroll:tap-scroll-cancel", Be = 20, St = 250, wt = 60, It = 20, Mt = 20, Pt = 220, et = { active: !1, offsetX: 0, offsetY: 0, distance: 0, direction: 0 }, Oe = 2.2, Vt = 8, Et = 120, me = {
125
+ Me.displayName = "TapScrollCircle";
126
+ const pt = (r, t, e) => Math.min(e, Math.max(t, r)), pe = "virtualscroll:tap-scroll-cancel", Ie = 20, Xe = 250, He = 60, Ue = 20, qe = 20, Be = 240, Te = { active: !1, offsetX: 0, offsetY: 0, distance: 0, direction: 0 }, fe = 2.2, $e = 8, We = 120, Ke = 1 / 60, Lt = {
136
127
  enabled: !0,
137
128
  size: 40,
138
129
  offsetX: -80,
139
130
  offsetY: 0,
140
131
  className: void 0,
141
- maxVisualDistance: Pt,
132
+ maxVisualDistance: Be,
142
133
  minSpeedMultiplier: 0.2,
143
- opacity: 1,
134
+ opacity: 0.9,
144
135
  renderVisual: void 0,
145
136
  maxSpeedCurve: void 0
146
- }, Ct = (s) => s ? {
137
+ }, je = (r) => r ? {
147
138
  mainSizeKey: "width",
148
139
  crossSizeKey: "height",
149
140
  positionKey: "left",
150
- selectDelta: (e, t) => e,
151
- getPointerCoordinate: ({ clientX: e }) => e,
141
+ selectDelta: (t, e) => t,
142
+ getPointerCoordinate: ({ clientX: t }) => t,
152
143
  arrowLabels: ["Scroll left", "Scroll right"],
153
144
  arrowIcons: ["◀", "▶"],
154
145
  directionClass: "flex flex-row items-stretch",
@@ -157,365 +148,413 @@ const W = (s, e, t) => Math.min(t, Math.max(e, s)), Qe = (s, e, t) => {
157
148
  mainSizeKey: "height",
158
149
  crossSizeKey: "width",
159
150
  positionKey: "top",
160
- selectDelta: (e, t) => t,
161
- getPointerCoordinate: ({ clientY: e }) => e,
151
+ selectDelta: (t, e) => e,
152
+ getPointerCoordinate: ({ clientY: t }) => t,
162
153
  arrowLabels: ["Scroll up", "Scroll down"],
163
154
  arrowIcons: ["▲", "▼"],
164
155
  directionClass: "flex flex-col items-stretch",
165
156
  orientation: "vertical"
166
- }, At = (s, e) => {
167
- const t = s?.maxSpeedMultiplier, n = typeof t == "number" ? t : Ft(e);
157
+ }, Ge = (r, t) => {
158
+ const e = r?.maxSpeedMultiplier, n = typeof e == "number" ? e : Qe(t);
168
159
  return {
169
- enabled: s?.enabled ?? me.enabled,
170
- size: s?.size ?? me.size,
171
- offsetX: s?.offsetX ?? me.offsetX,
172
- offsetY: s?.offsetY ?? me.offsetY,
173
- className: s?.className ?? me.className,
174
- maxVisualDistance: s?.maxVisualDistance ?? me.maxVisualDistance,
160
+ enabled: r?.enabled ?? Lt.enabled,
161
+ size: r?.size ?? Lt.size,
162
+ offsetX: r?.offsetX ?? Lt.offsetX,
163
+ offsetY: r?.offsetY ?? Lt.offsetY,
164
+ className: r?.className ?? Lt.className,
165
+ maxVisualDistance: r?.maxVisualDistance ?? Lt.maxVisualDistance,
175
166
  maxSpeedMultiplier: n,
176
- minSpeedMultiplier: Math.max(s?.minSpeedMultiplier ?? me.minSpeedMultiplier, 0),
177
- opacity: W(s?.opacity ?? me.opacity, 0, 1),
178
- renderVisual: s?.renderVisual ?? me.renderVisual,
179
- maxSpeedCurve: s?.maxSpeedCurve ?? me.maxSpeedCurve
167
+ minSpeedMultiplier: Math.max(r?.minSpeedMultiplier ?? Lt.minSpeedMultiplier, 0),
168
+ opacity: pt(r?.opacity ?? Lt.opacity, 0, 1),
169
+ renderVisual: r?.renderVisual ?? Lt.renderVisual,
170
+ maxSpeedCurve: r?.maxSpeedCurve ?? Lt.maxSpeedCurve
180
171
  };
181
- }, _t = ({ thumbRef: s, isDragging: e, isThumbHovered: t, enableThumbDrag: n, horizontal: r }) => {
182
- se(() => {
183
- const o = s.current;
184
- if (!o)
185
- return;
186
- const i = r ? "scaleY(1.06)" : "scaleX(1.06)", a = r ? "scaleY(1.12)" : "scaleX(1.12)";
187
- if (!n) {
188
- o.style.removeProperty("transform"), o.style.backgroundColor = "#7F7F7F", o.style.removeProperty("transition");
189
- return;
190
- }
191
- if (e) {
192
- o.style.transform = a, o.style.backgroundColor = "#4F4F4F", o.style.transition = "transform 60ms ease-out";
193
- return;
194
- }
195
- o.style.transition = "transform 80ms ease-out", t ? (o.style.transform = i, o.style.backgroundColor = "#5F5F5F") : (o.style.removeProperty("transform"), o.style.backgroundColor = "#7F7F7F");
196
- }, [n, r, e, t, s]);
197
- }, Rt = ({ canUseArrowButtons: s, enableArrowButtons: e, resetTapScroll: t, scrollByStep: n }) => {
198
- const r = F(null), o = F(null), i = y(() => {
199
- r.current !== null && (window.clearInterval(r.current), r.current = null), o.current !== null && (window.clearTimeout(o.current), o.current = null);
200
- }, []), a = y(() => {
201
- i();
202
- }, [i]), f = y(
203
- (u) => (p) => {
204
- s && (p.preventDefault(), p.stopPropagation(), t(), i(), n(u), o.current = window.setTimeout(() => {
205
- r.current = window.setInterval(() => {
206
- n(u);
207
- }, wt);
208
- }, St));
172
+ }, Ze = ({ isDragging: r, isThumbHovered: t, enableThumbDrag: e }) => Vt(() => e ? r ? "dragging" : t ? "hover" : "idle" : "disabled", [e, r, t]), Je = ({ canUseArrowButtons: r, enableArrowButtons: t, resetTapScroll: e, scrollByStep: n }) => {
173
+ const o = w(null), a = w(null), u = M(() => {
174
+ o.current !== null && (window.clearInterval(o.current), o.current = null), a.current !== null && (window.clearTimeout(a.current), a.current = null);
175
+ }, []), f = M(() => {
176
+ u();
177
+ }, [u]), l = M(
178
+ (d) => (h) => {
179
+ r && (h.preventDefault(), h.stopPropagation(), e(), u(), n(d), a.current = window.setTimeout(() => {
180
+ o.current = window.setInterval(() => {
181
+ n(d);
182
+ }, He);
183
+ }, Xe));
209
184
  },
210
- [s, i, t, n]
211
- ), c = y(
212
- (u) => (p) => {
213
- e && (p.key === "Enter" || p.key === " " || p.key === "Spacebar") && (p.preventDefault(), n(u));
185
+ [r, u, e, n]
186
+ ), c = M(
187
+ (d) => (h) => {
188
+ t && (h.key === "Enter" || h.key === " " || h.key === "Spacebar") && (h.preventDefault(), n(d));
214
189
  },
215
- [e, n]
190
+ [t, n]
216
191
  );
217
- return se(() => () => {
218
- i();
219
- }, [i]), { handleArrowPointerDown: f, handleArrowPointerUp: a, handleArrowKeyDown: c };
220
- }, Ft = (s) => {
221
- if (!s || s <= 0)
222
- return Oe;
223
- const e = Math.max(1, s), t = Math.log10(e), n = Oe + t * Vt;
224
- return W(n, Oe, Et);
225
- }, Lt = ({
226
- contentSize: s,
227
- viewportSize: e,
228
- scrollPosition: t,
192
+ return L(() => () => {
193
+ u();
194
+ }, [u]), { handleArrowPointerDown: l, handleArrowPointerUp: f, handleArrowKeyDown: c };
195
+ }, Qe = (r) => {
196
+ if (!r || r <= 0)
197
+ return fe;
198
+ const t = Math.max(1, r), e = Math.log10(t), n = fe + e * $e;
199
+ return pt(n, fe, We);
200
+ }, tn = ({
201
+ contentSize: r,
202
+ viewportSize: t,
203
+ scrollPosition: e,
229
204
  onScroll: n,
230
- enableThumbDrag: r = !0,
231
- enableTrackClick: o = !0,
232
- enableArrowButtons: i = !0,
233
- horizontal: a = !1,
234
- scrollBarWidth: f = 12,
205
+ enableThumbDrag: o = !0,
206
+ enableTrackClick: a = !0,
207
+ enableArrowButtons: u = !0,
208
+ horizontal: f = !1,
209
+ scrollBarWidth: l = 12,
235
210
  className: c,
236
- ariaControls: u,
237
- tapScrollCircleOptions: p,
238
- itemCount: E,
239
- renderThumbOverlay: A
211
+ ariaControls: d,
212
+ tapScrollCircleOptions: h,
213
+ itemCount: b,
214
+ renderThumbOverlay: T
240
215
  }) => {
241
- const [O, te] = pe(!1), [X, ne] = pe(!1), [S, ce] = pe(!1), le = F(null), G = F(t), C = F(et), K = F(null), I = F(null), x = F(null), $ = Te(() => At(p, E), [E, p]), d = Te(() => Ct(a), [a]), {
242
- enabled: M,
243
- size: z,
244
- offsetX: Z,
245
- offsetY: h,
246
- className: _,
247
- maxVisualDistance: g,
248
- maxSpeedMultiplier: P,
249
- minSpeedMultiplier: R,
250
- opacity: k,
251
- renderVisual: L,
252
- maxSpeedCurve: v
253
- } = $, { mainSizeKey: w, crossSizeKey: b, positionKey: T, selectDelta: V, getPointerCoordinate: J, arrowLabels: oe, arrowIcons: q, directionClass: Q, orientation: ie } = d, j = Math.max(g, 1), ge = e / s, D = f, l = Math.max(e - D * 2, 0), B = ge * l, U = Math.min(Math.max(Be, B || 0), l || Be), N = s - e, ue = Math.max(l - U, 0), xe = N <= 0 || ue <= 0 ? 0 : t / N * ue, ot = xe + U / 2, de = s > e, He = de && i;
254
- se(() => {
255
- G.current = t;
256
- }, [t]), se(() => {
257
- r || ne(!1);
258
- }, [r]), _t({ thumbRef: le, isDragging: O, isThumbHovered: X, enableThumbDrag: r, horizontal: a });
259
- const fe = y(() => {
260
- I.current !== null && (window.cancelAnimationFrame(I.current), I.current = null), x.current = null;
261
- }, []), he = y(() => {
262
- C.current = { ...et }, ce(!1), K.current?.reset(), fe();
263
- }, [fe]), Me = y(
264
- (m) => {
265
- const Y = C.current;
266
- if (!Y.active || Y.direction === 0) {
267
- fe();
216
+ const [k, _] = Yt(!1), [tt, Y] = Yt(!1), [ut, V] = Yt(!1), D = w(null), X = w({ pointerId: null, startThumbPosition: 0, startClientX: 0, startClientY: 0 }), O = w({ pointerId: null, startThumbPosition: 0, startClientX: 0, startClientY: 0 }), R = w(e), H = w(Te), q = w(null), N = w(null), g = w(null), C = Vt(() => Ge(h, b), [b, h]), P = Vt(() => je(f), [f]), {
217
+ enabled: j,
218
+ size: rt,
219
+ offsetX: Ct,
220
+ offsetY: ot,
221
+ className: $,
222
+ maxVisualDistance: ct,
223
+ maxSpeedMultiplier: dt,
224
+ minSpeedMultiplier: A,
225
+ opacity: S,
226
+ renderVisual: v,
227
+ maxSpeedCurve: it
228
+ } = C, W = w({
229
+ viewportSize: t,
230
+ maxScrollPosition: Math.max(r - t, 0),
231
+ scrollBarVisible: r > t,
232
+ effectiveTapMaxDistance: Math.max(ct, 1),
233
+ tapCircleMaxSpeedMultiplier: dt,
234
+ tapCircleMinSpeedMultiplier: A,
235
+ tapCircleMaxSpeedCurve: it,
236
+ tapScrollCircleOptions: h
237
+ }), { mainSizeKey: G, crossSizeKey: ft, positionKey: et, selectDelta: st, getPointerCoordinate: nt, arrowLabels: gt, arrowIcons: mt, directionClass: xt, orientation: St } = P, Et = Math.max(ct, 1), Dt = t / r, p = l, m = Math.max(t - p * 2, 0), ht = Dt * m, Z = Math.min(Math.max(Ie, ht || 0), m || Ie), z = r - t, Rt = Math.max(m - Z, 0), It = z <= 0 || Rt <= 0 ? 0 : e / z * Rt, At = It + Z / 2, Tt = r > t, _t = Tt && u;
238
+ W.current = {
239
+ viewportSize: t,
240
+ maxScrollPosition: z,
241
+ scrollBarVisible: Tt,
242
+ effectiveTapMaxDistance: Et,
243
+ tapCircleMaxSpeedMultiplier: dt,
244
+ tapCircleMinSpeedMultiplier: A,
245
+ tapCircleMaxSpeedCurve: it,
246
+ tapScrollCircleOptions: h
247
+ }, L(() => {
248
+ R.current = e;
249
+ }, [e]), L(() => {
250
+ o || Y(!1);
251
+ }, [o]);
252
+ const Ut = Ze({ isDragging: k, isThumbHovered: tt, enableThumbDrag: o }), vt = M(
253
+ (i, x) => {
254
+ const E = W.current, J = x ?? R.current;
255
+ if (n) {
256
+ const kt = n(i, J);
257
+ if (typeof kt == "number" && Number.isFinite(kt))
258
+ return R.current = kt, kt;
259
+ }
260
+ const bt = typeof i == "function" ? i(J) : i, Pt = Math.max(E.maxScrollPosition, 0), Nt = E.scrollBarVisible ? pt(bt, 0, Pt) : 0;
261
+ return R.current = Nt, Nt;
262
+ },
263
+ [n]
264
+ ), Ot = M(
265
+ (i) => {
266
+ const x = W.current, E = R.current;
267
+ if (!x.scrollBarVisible || x.maxScrollPosition <= 0) {
268
+ const kt = vt(0, E), ce = kt - E;
269
+ return { nextPosition: kt, actualDelta: ce, reachedBoundary: !0 };
270
+ }
271
+ if (i === 0)
272
+ return { nextPosition: E, actualDelta: 0, reachedBoundary: !1 };
273
+ const bt = vt((kt) => pt(kt + i, 0, x.maxScrollPosition), E), Pt = bt - E, Nt = Pt === 0 || i < 0 && bt <= 0 || i > 0 && bt >= x.maxScrollPosition;
274
+ return { nextPosition: bt, actualDelta: Pt, reachedBoundary: Nt };
275
+ },
276
+ [vt]
277
+ ), at = M(() => {
278
+ N.current !== null && (window.cancelAnimationFrame(N.current), N.current = null), g.current = null;
279
+ }, []), yt = M(() => {
280
+ H.current = { ...Te }, V(!1), q.current?.reset(), at();
281
+ }, [at]), Bt = M(
282
+ (i) => {
283
+ const x = H.current, E = W.current;
284
+ if (!x.active || x.direction === 0) {
285
+ at();
268
286
  return;
269
287
  }
270
- if (!de || N <= 0) {
271
- fe();
288
+ if (!E.scrollBarVisible || E.maxScrollPosition <= 0) {
289
+ at();
272
290
  return;
273
291
  }
274
- const ee = x.current ?? m, re = Math.max((m - ee) / 1e3, 0);
275
- if (x.current = m, re <= 0) {
276
- I.current = window.requestAnimationFrame(Me);
292
+ const J = g.current ?? i, bt = Math.max((i - J) / 1e3, 0), Pt = Math.min(bt, Ke);
293
+ if (g.current = i, Pt <= 0) {
294
+ N.current = window.requestAnimationFrame(Bt);
277
295
  return;
278
296
  }
279
- const ve = Math.min(Y.distance, j) / j, Re = ve ** 1.1, Ve = typeof p?.maxSpeedMultiplier == "number", ye = Math.max(e * R, 40), Fe = Ve ? ye : 1200;
280
- let Le = Math.max(e * P, Fe);
281
- if (v) {
282
- const Ee = Math.max(v.exponentialSteepness, 0), pt = Math.max(v.exponentialScale ?? P, 0), gt = Ee === 0 ? ve : Math.expm1(Ee * ve), Ge = Ee === 0 ? 1 : Math.expm1(Ee) || 1, xt = Ge === 0 ? ve : Math.min(Math.max(gt / Ge, 0), 1), vt = e * pt * xt;
283
- Le = Math.min(Le, Math.max(vt, ye));
297
+ const Nt = Math.min(x.distance, E.effectiveTapMaxDistance) / E.effectiveTapMaxDistance, kt = Nt ** 1.1, ce = typeof E.tapScrollCircleOptions?.maxSpeedMultiplier == "number", Zt = Math.max(E.viewportSize * E.tapCircleMinSpeedMultiplier, 40), we = ce ? Zt : 1200;
298
+ let ue = Math.max(E.viewportSize * E.tapCircleMaxSpeedMultiplier, we);
299
+ const ne = E.tapCircleMaxSpeedCurve;
300
+ if (ne) {
301
+ const re = Math.max(ne.exponentialSteepness, 0), Fe = Math.max(ne.exponentialScale ?? E.tapCircleMaxSpeedMultiplier, 0), Ne = re === 0 ? Nt : Math.expm1(re * Nt), ge = re === 0 ? 1 : Math.expm1(re) || 1, ke = ge === 0 ? Nt : Math.min(Math.max(Ne / ge, 0), 1), Oe = E.viewportSize * Fe * ke;
302
+ ue = Math.min(ue, Math.max(Oe, Zt));
284
303
  }
285
- const dt = Math.max(Le, ye), ft = Math.max(v?.easedOffset ?? 0, 0), ht = Math.min(1, Re + ft), mt = ye + (dt - ye) * ht, De = G.current, Ne = W(De + Y.direction * mt * re, 0, N);
286
- if (Ne === De) {
287
- fe();
304
+ const Ce = Math.max(ue, Zt), Re = Math.max(ne?.easedOffset ?? 0, 0), Ae = Math.min(1, kt + Re), Ve = Zt + (Ce - Zt) * Ae, Ee = x.direction * Ve * Pt, { actualDelta: De, reachedBoundary: _e } = Ot(Ee);
305
+ if (_e || De === 0) {
306
+ at();
288
307
  return;
289
308
  }
290
- G.current = Ne, n?.(Ne, De), I.current = window.requestAnimationFrame(Me);
309
+ N.current = window.requestAnimationFrame(Bt);
291
310
  },
292
- [j, N, n, de, fe, v, P, R, p, e]
293
- ), $e = y(() => {
294
- I.current === null && (x.current = null, I.current = window.requestAnimationFrame(Me));
295
- }, [Me]);
296
- se(() => () => {
297
- fe();
298
- }, [fe]);
299
- const it = y(
300
- (m) => {
301
- C.current = m, ce(m.active), m.active && m.direction !== 0 ? $e() : fe();
311
+ [Ot, at]
312
+ ), te = M(() => {
313
+ N.current === null && (g.current = null, N.current = window.requestAnimationFrame(Bt));
314
+ }, [Bt]);
315
+ L(() => () => {
316
+ at();
317
+ }, [at]);
318
+ const ae = M(
319
+ (i) => {
320
+ H.current = i, V(i.active), i.active && i.direction !== 0 ? te() : at();
302
321
  },
303
- [$e, fe]
322
+ [te, at]
304
323
  );
305
- se(() => {
306
- M || he();
307
- }, [he, M]), se(() => {
308
- const m = (Y) => {
309
- const re = Y.detail?.paneId;
310
- re && u && re !== u || he();
324
+ L(() => {
325
+ j || yt();
326
+ }, [yt, j]), L(() => {
327
+ const i = (x) => {
328
+ const J = x.detail?.paneId;
329
+ J && d && J !== d || yt();
311
330
  };
312
- return window.addEventListener(ze, m), () => {
313
- window.removeEventListener(ze, m);
331
+ return window.addEventListener(pe, i), () => {
332
+ window.removeEventListener(pe, i);
314
333
  };
315
- }, [u, he]), se(() => {
316
- if (!M)
334
+ }, [d, yt]), L(() => {
335
+ if (!j)
317
336
  return;
318
- const m = (Y) => {
319
- if (!C.current.active)
337
+ const i = (x) => {
338
+ if (!H.current.active)
320
339
  return;
321
- const ee = Y.target;
322
- if (!(ee instanceof Node)) {
323
- he();
340
+ const E = x.target;
341
+ if (!(E instanceof Node)) {
342
+ yt();
324
343
  return;
325
344
  }
326
- K.current?.getElement()?.contains(ee) || he();
345
+ q.current?.getElement()?.contains(E) || yt();
327
346
  };
328
- return document.addEventListener("pointerdown", m, !0), () => {
329
- document.removeEventListener("pointerdown", m, !0);
347
+ return document.addEventListener("pointerdown", i, !0), () => {
348
+ document.removeEventListener("pointerdown", i, !0);
330
349
  };
331
- }, [he, M]);
332
- const _e = (m) => {
333
- if (!de || ue <= 0 || N <= 0)
350
+ }, [yt, j]);
351
+ const s = (i) => {
352
+ if (!Tt || Rt <= 0 || z <= 0)
334
353
  return 0;
335
- const Y = W(m, 0, ue);
336
- return W(Y / ue * N, 0, N);
337
- }, at = (m) => {
338
- if (!de || N <= 0)
354
+ const x = pt(i, 0, Rt);
355
+ return pt(x / Rt * z, 0, z);
356
+ }, I = (i) => {
357
+ const x = Math.max(Math.round(t / qe), Ue);
358
+ Ot(i * x);
359
+ }, { handleArrowPointerDown: y, handleArrowPointerUp: F, handleArrowKeyDown: B } = Je({
360
+ canUseArrowButtons: _t,
361
+ enableArrowButtons: u,
362
+ resetTapScroll: yt,
363
+ scrollByStep: I
364
+ }), K = (i) => {
365
+ if (!Tt)
339
366
  return;
340
- const Y = Math.max(Math.round(e / Mt), It), ee = G.current, re = W(ee + m * Y, 0, N);
341
- re !== ee && (G.current = re, n?.(re, ee));
342
- }, { handleArrowPointerDown: Xe, handleArrowPointerUp: Pe, handleArrowKeyDown: lt } = Rt({
343
- canUseArrowButtons: He,
344
- enableArrowButtons: i,
345
- resetTapScroll: he,
346
- scrollByStep: at
347
- }), Ue = (m) => {
348
- if (!de)
349
- return;
350
- if (!r) {
351
- m.preventDefault(), m.stopPropagation();
367
+ if (!o) {
368
+ i.preventDefault(), i.stopPropagation();
352
369
  return;
353
370
  }
354
- if ("button" in m && m.button !== 0 || m.ctrlKey)
371
+ if (i.pointerType === "mouse" && i.button !== 0 || i.ctrlKey)
355
372
  return;
356
- m.stopPropagation(), he();
357
- const Y = xe;
358
- te(!0), ne(!0), Qe(
359
- m,
360
- ({ deltaX: ee, deltaY: re }) => {
361
- const ve = V(ee, re);
362
- n?.(_e(Y + ve), xe);
363
- },
364
- () => {
365
- te(!1), le.current && !le.current.matches(":hover") && ne(!1);
366
- }
367
- );
368
- }, Ke = (m) => {
369
- if (!de)
373
+ yt();
374
+ const x = i.currentTarget;
375
+ x.setPointerCapture && x.setPointerCapture(i.pointerId), X.current = {
376
+ pointerId: i.pointerId,
377
+ startThumbPosition: It,
378
+ startClientX: i.clientX,
379
+ startClientY: i.clientY
380
+ }, _(!0), Y(!0), i.preventDefault(), i.stopPropagation();
381
+ }, Mt = (i) => {
382
+ const x = X.current;
383
+ if (x.pointerId !== i.pointerId)
370
384
  return;
371
- if (!o) {
372
- m.preventDefault(), m.stopPropagation();
385
+ const E = i.clientX - x.startClientX, J = i.clientY - x.startClientY, bt = st(E, J), Pt = s(x.startThumbPosition + bt);
386
+ vt(Pt), i.cancelable && i.preventDefault();
387
+ }, zt = (i) => {
388
+ if (X.current.pointerId !== i.pointerId)
389
+ return;
390
+ const x = i.currentTarget;
391
+ x.hasPointerCapture(i.pointerId) && x.releasePointerCapture(i.pointerId), X.current = { pointerId: null, startThumbPosition: 0, startClientX: 0, startClientY: 0 }, _(!1), D.current && !D.current.matches(":hover") && Y(!1), i.preventDefault(), i.stopPropagation();
392
+ }, Ft = (i) => {
393
+ if (X.current.pointerId !== i.pointerId)
394
+ return;
395
+ const x = i.currentTarget;
396
+ x.hasPointerCapture(i.pointerId) && x.releasePointerCapture(i.pointerId), X.current = { pointerId: null, startThumbPosition: 0, startClientX: 0, startClientY: 0 }, _(!1), D.current && !D.current.matches(":hover") && Y(!1);
397
+ }, Xt = (i) => {
398
+ if (!Tt)
399
+ return;
400
+ if (!a) {
401
+ i.preventDefault(), i.stopPropagation();
373
402
  return;
374
403
  }
375
- if ("button" in m && m.button !== 0 || m.ctrlKey)
404
+ if (i.pointerType === "mouse" && i.button !== 0 || i.ctrlKey)
376
405
  return;
377
- const ee = "touches" in m.nativeEvent ? m.nativeEvent.touches[0] : m.nativeEvent, re = J(ee), ve = m.currentTarget.getBoundingClientRect(), Re = re - (a ? ve.left : ve.top);
378
- he();
379
- const Ve = Re - U / 2;
380
- n?.(_e(Ve), xe), Qe(m, ({ deltaX: ye, deltaY: Fe }) => {
381
- const We = V(ye, Fe);
382
- n?.(_e(Ve + We), xe);
383
- });
384
- }, ct = Te(() => W((S ? 1 : 0.8) * k, 0, 1), [S, k]), ut = Te(() => {
385
- const Y = `calc(50% - ${z / 2}px + ${h}px)`;
406
+ const x = i.currentTarget, E = x.getBoundingClientRect(), bt = nt(i) - (f ? E.left : E.top);
407
+ yt();
408
+ const Pt = bt - Z / 2, Nt = s(Pt);
409
+ vt(Nt), x.setPointerCapture && x.setPointerCapture(i.pointerId), O.current = {
410
+ pointerId: i.pointerId,
411
+ startThumbPosition: Pt,
412
+ startClientX: i.clientX,
413
+ startClientY: i.clientY
414
+ }, i.preventDefault(), i.stopPropagation();
415
+ }, $t = (i) => {
416
+ const x = O.current;
417
+ if (x.pointerId !== i.pointerId)
418
+ return;
419
+ const E = i.clientX - x.startClientX, J = i.clientY - x.startClientY, bt = st(E, J), Pt = s(x.startThumbPosition + bt);
420
+ vt(Pt), i.cancelable && i.preventDefault();
421
+ }, Ht = (i) => {
422
+ if (O.current.pointerId !== i.pointerId)
423
+ return;
424
+ const x = i.currentTarget;
425
+ x.hasPointerCapture(i.pointerId) && x.releasePointerCapture(i.pointerId), O.current = { pointerId: null, startThumbPosition: 0, startClientX: 0, startClientY: 0 }, i.preventDefault(), i.stopPropagation();
426
+ }, Wt = (i) => {
427
+ if (O.current.pointerId !== i.pointerId)
428
+ return;
429
+ const x = i.currentTarget;
430
+ x.hasPointerCapture(i.pointerId) && x.releasePointerCapture(i.pointerId), O.current = { pointerId: null, startThumbPosition: 0, startClientX: 0, startClientY: 0 };
431
+ }, U = Vt(() => pt((ut ? 1 : 0.8) * S, 0, 1), [ut, S]), Kt = Vt(() => {
432
+ const x = `calc(50% - ${rt / 2}px + ${ot}px)`;
386
433
  return {
387
- left: Z,
388
- top: Y
434
+ left: Ct,
435
+ top: x
389
436
  };
390
- }, [Z, h, z]), qe = (m, Y, ee) => /* @__PURE__ */ H(
437
+ }, [Ct, ot, rt]), le = (i, x, E) => /* @__PURE__ */ Q(
391
438
  "button",
392
439
  {
393
440
  type: "button",
394
- className: "flex items-center justify-center text-[#313131] text-xs transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[#60a5fa] focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-50",
441
+ tabIndex: -1,
442
+ className: "aqvs:scrollbar-arrow-button flex items-center justify-center text-xs transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-50",
395
443
  style: {
396
- [w]: D,
397
- [b]: f,
398
- backgroundColor: "#E0E0E0"
444
+ [G]: p,
445
+ [ft]: l
399
446
  },
400
- "aria-label": Y,
401
- onMouseDown: Xe(m),
402
- onTouchStart: Xe(m),
403
- onMouseUp: Pe,
404
- onMouseLeave: Pe,
405
- onTouchEnd: Pe,
406
- onTouchCancel: Pe,
407
- onKeyDown: lt(m),
408
- "aria-disabled": !i,
409
- disabled: !He,
410
- children: /* @__PURE__ */ H("span", { "aria-hidden": "true", children: ee })
447
+ "aria-label": x,
448
+ onMouseDown: y(i),
449
+ onTouchStart: y(i),
450
+ onMouseUp: F,
451
+ onMouseLeave: F,
452
+ onTouchEnd: F,
453
+ onTouchCancel: F,
454
+ onKeyDown: B(i),
455
+ "aria-disabled": !u,
456
+ disabled: !_t,
457
+ children: /* @__PURE__ */ Q("span", { "aria-hidden": "true", children: E })
411
458
  }
412
- ), je = A && de ? {
413
- orientation: ie,
414
- scrollPosition: t,
415
- maxScrollPosition: N,
416
- contentSize: s,
417
- viewportSize: e,
418
- thumbSize: U,
419
- thumbPosition: xe,
420
- thumbCenter: ot,
421
- trackSize: l,
422
- isDragging: O,
423
- isTapScrollActive: S
459
+ ), ee = T && Tt ? {
460
+ orientation: St,
461
+ scrollPosition: e,
462
+ maxScrollPosition: z,
463
+ contentSize: r,
464
+ viewportSize: t,
465
+ thumbSize: Z,
466
+ thumbPosition: It,
467
+ thumbCenter: At,
468
+ trackSize: m,
469
+ isDragging: k,
470
+ isTapScrollActive: ut
424
471
  } : null;
425
- return /* @__PURE__ */ Se(
472
+ return /* @__PURE__ */ Gt(
426
473
  "div",
427
474
  {
428
- className: Ie("group relative cursor-default select-none", Q, c),
475
+ className: jt("group relative cursor-default select-none", xt, c),
429
476
  style: {
430
- [w]: e,
431
- [b]: f,
477
+ [G]: t,
478
+ [ft]: l,
432
479
  backgroundColor: "white",
433
480
  userSelect: "none",
434
- position: "relative"
481
+ position: "relative",
482
+ touchAction: "none"
435
483
  },
436
484
  role: "scrollbar",
437
485
  tabIndex: -1,
438
- "aria-controls": u,
439
- "aria-valuenow": t,
486
+ "aria-controls": d,
487
+ "aria-valuenow": e,
440
488
  "aria-valuemin": 0,
441
- "aria-valuemax": N,
442
- "aria-orientation": a ? "horizontal" : "vertical",
489
+ "aria-valuemax": z,
490
+ "aria-orientation": f ? "horizontal" : "vertical",
443
491
  children: [
444
- !a && de && M && /* @__PURE__ */ H(
445
- st,
492
+ !f && Tt && j && /* @__PURE__ */ Q(
493
+ Me,
446
494
  {
447
- ref: K,
448
- className: Ie("pointer-events-auto absolute transition-opacity duration-150", _),
449
- size: z,
450
- maxVisualDistance: j,
451
- style: ut,
452
- opacity: ct,
453
- renderVisual: L,
454
- onDragChange: it
495
+ ref: q,
496
+ className: jt("pointer-events-auto absolute transition-opacity duration-150", $),
497
+ size: rt,
498
+ maxVisualDistance: Et,
499
+ style: Kt,
500
+ opacity: U,
501
+ renderVisual: v,
502
+ onDragChange: ae
455
503
  }
456
504
  ),
457
- qe(-1, oe[0], q[0]),
458
- /* @__PURE__ */ Se(
505
+ le(-1, gt[0], mt[0]),
506
+ /* @__PURE__ */ Gt(
459
507
  "div",
460
508
  {
461
- className: "relative flex-1",
509
+ className: "aqvs:scrollbar-track relative flex-1",
462
510
  style: {
463
- backgroundColor: "#F5F5F5",
464
- borderRadius: f / 2
511
+ borderRadius: l / 2,
512
+ touchAction: "none"
465
513
  },
466
- onMouseDown: Ke,
467
- onTouchStart: Ke,
468
- "aria-disabled": !o,
514
+ onPointerDown: Xt,
515
+ onPointerMove: $t,
516
+ onPointerUp: Ht,
517
+ onPointerCancel: Wt,
518
+ "aria-disabled": !a,
469
519
  children: [
470
- je && /* @__PURE__ */ H("div", { className: "pointer-events-none absolute inset-0", "aria-hidden": !0, children: A?.(je) }),
471
- de && // スクロールバーのつまみの当たり判定を広げるためのラッパー
472
- /* @__PURE__ */ H(
520
+ ee && /* @__PURE__ */ Q("div", { className: "pointer-events-none absolute inset-0", "aria-hidden": !0, children: T?.(ee) }),
521
+ Tt && // スクロールバーのつまみの当たり判定を広げるためのラッパー
522
+ /* @__PURE__ */ Q(
473
523
  "div",
474
524
  {
475
525
  className: "group absolute",
476
526
  style: {
477
- [w]: U,
478
- [T]: xe,
479
- ...a ? { top: 0, bottom: 0 } : { left: 0, right: 0 }
527
+ [G]: Z,
528
+ [et]: It,
529
+ ...f ? { top: 0, bottom: 0 } : { left: 0, right: 0 },
530
+ touchAction: "none"
480
531
  },
481
- onMouseDown: Ue,
482
- onTouchStart: Ue,
532
+ onPointerDown: K,
533
+ onPointerMove: Mt,
534
+ onPointerUp: zt,
535
+ onPointerCancel: Ft,
483
536
  role: "slider",
484
- "aria-orientation": a ? "horizontal" : "vertical",
485
- "aria-valuenow": t,
537
+ "aria-orientation": f ? "horizontal" : "vertical",
538
+ "aria-valuenow": e,
486
539
  "aria-valuemin": 0,
487
- "aria-valuemax": N,
488
- "aria-disabled": !r,
489
- tabIndex: r ? 0 : -1,
490
- children: /* @__PURE__ */ H(
540
+ "aria-valuemax": z,
541
+ "aria-disabled": !o,
542
+ tabIndex: -1,
543
+ children: /* @__PURE__ */ Q(
491
544
  "div",
492
545
  {
493
- ref: le,
494
- className: Ie(
495
- "absolute",
496
- a ? `inset-x-0 inset-y-[1.5px] group-hover:inset-y-[-0.5px] ${O ? "-inset-y-0.5" : "group-active:-inset-y-0.5"}` : `inset-x-[1.5px] inset-y-0 group-hover:inset-x-[-0.5px] ${O ? "-inset-x-0.5" : "group-active:-inset-x-0.5"}`
497
- ),
546
+ ref: D,
547
+ className: jt("aqvs:scrollbar-thumb absolute", f ? "aqvs:scrollbar-thumb-horizontal" : "aqvs:scrollbar-thumb-vertical"),
548
+ "data-thumb-state": Ut,
498
549
  style: {
499
- backgroundColor: "#7F7F7F",
500
- borderRadius: f - 1,
501
- cursor: r ? "pointer" : "default",
502
- ...a ? {
503
- left: 0,
504
- right: 0,
505
- top: 1.5,
506
- bottom: 1.5
507
- } : {
508
- top: 0,
509
- bottom: 0,
510
- left: 1.5,
511
- right: 1.5
512
- }
550
+ borderRadius: l - 1,
551
+ cursor: o ? "pointer" : "default"
513
552
  },
514
553
  onMouseEnter: () => {
515
- r && ne(!0);
554
+ o && Y(!0);
516
555
  },
517
556
  onMouseLeave: () => {
518
- r && ne(!1);
557
+ o && Y(!1);
519
558
  }
520
559
  }
521
560
  )
@@ -524,273 +563,367 @@ const W = (s, e, t) => Math.min(t, Math.max(e, s)), Qe = (s, e, t) => {
524
563
  ]
525
564
  }
526
565
  ),
527
- qe(1, oe[1], q[1])
566
+ le(1, gt[1], mt[1])
528
567
  ]
529
568
  }
530
569
  );
531
- }, ae = {
532
- debug(s, ...e) {
533
- typeof window < "u" && window.localStorage?.getItem("debug") === "true" && console.debug(`[VirtualScroll] ${s}`, ...e);
570
+ }, wt = {
571
+ debug(r, ...t) {
572
+ typeof window < "u" && window.localStorage?.getItem("debug") === "true" && console.debug(`[VirtualScroll] ${r}`, ...t);
534
573
  },
535
- warn(s, ...e) {
536
- console.warn(`[VirtualScroll] ${s}`, ...e);
574
+ warn(r, ...t) {
575
+ console.warn(`[VirtualScroll] ${r}`, ...t);
537
576
  },
538
- error(s, ...e) {
539
- console.error(`[VirtualScroll] ${s}`, ...e);
577
+ error(r, ...t) {
578
+ console.error(`[VirtualScroll] ${r}`, ...t);
540
579
  }
541
- }, we = {
580
+ }, Jt = {
542
581
  maxVelocity: 6,
543
582
  minVelocity: 0.02,
544
583
  deceleration: 25e-4,
545
584
  velocitySampleWindow: 90,
546
585
  startVelocityThreshold: 0.04
547
- }, Ce = (s, e, t) => {
548
- for (const [n, r, o] of e)
549
- t === "add" ? s.addEventListener(n, r, o) : s.removeEventListener(n, r, o);
550
- }, Dt = ke(({ children: s, contentSize: e, viewportSize: t, scrollBarWidth: n = 12, enableThumbDrag: r = !0, enableTrackClick: o = !0, enableArrowButtons: i = !0, enablePointerDrag: a = !0, onScroll: f, className: c, style: u, background: p, tapScrollCircleOptions: E, inertiaOptions: A, itemCount: O, renderThumbOverlay: te, wheelSpeedMultiplier: X = 1 }, ne) => {
551
- const S = F(0), [ce, le] = bt((h) => h + 1, 0), G = F(null), C = F(null), K = F({
552
- frame: null,
553
- velocity: 0,
554
- lastTimestamp: null
555
- }), I = Te(
556
- () => ({
557
- maxVelocity: A?.maxVelocity ?? we.maxVelocity,
558
- minVelocity: A?.minVelocity ?? we.minVelocity,
559
- deceleration: A?.deceleration ?? we.deceleration,
560
- velocitySampleWindow: A?.velocitySampleWindow ?? we.velocitySampleWindow,
561
- startVelocityThreshold: A?.startVelocityThreshold ?? we.startVelocityThreshold
562
- }),
563
- [A]
564
- );
565
- ae.debug("[ScrollPane] ScrollPane rendered", { contentSize: e, viewportSize: t, scrollBarWidth: n, className: c, style: u, tapScrollCircleOptions: E, inertiaOptions: A, enablePointerDrag: a });
566
- const x = F({ contentSize: e, viewportSize: t }), $ = Te(() => e > t, [e, t]), d = y(
567
- (h) => {
568
- const { contentSize: _, viewportSize: g } = x.current, P = _ > g, R = S.current;
569
- if (ae.debug("[ScrollPane] scrollTo called", { newPosition: h, contentSize: _, viewportSize: g, currentIsScrollable: P, prevPosition: R }), !P) {
570
- S.current !== 0 && (S.current = 0, f?.(0, R));
571
- return;
572
- }
573
- const k = typeof h == "function" ? h(S.current) : h, L = W(k, 0, _ - g);
574
- S.current !== L && (S.current = L, f?.(L, R));
575
- },
576
- [f]
577
- ), M = y(() => {
578
- const h = K.current;
579
- h.frame !== null && cancelAnimationFrame(h.frame), h.frame = null, h.velocity = 0, h.lastTimestamp = null;
580
- }, []), z = y(
581
- (h) => {
582
- if (!$)
586
+ }, oe = (r, t, e) => {
587
+ for (const [n, o, a] of t)
588
+ e === "add" ? r.addEventListener(n, o, a) : r.removeEventListener(n, o, a);
589
+ }, en = me(
590
+ ({
591
+ children: r,
592
+ contentSize: t,
593
+ viewportSize: e,
594
+ scrollBarWidth: n = 12,
595
+ enableThumbDrag: o = !0,
596
+ enableTrackClick: a = !0,
597
+ enableArrowButtons: u = !0,
598
+ enablePointerDrag: f = !0,
599
+ onScroll: l,
600
+ className: c,
601
+ style: d,
602
+ background: h,
603
+ tapScrollCircleOptions: b,
604
+ inertiaOptions: T,
605
+ itemCount: k,
606
+ renderThumbOverlay: _,
607
+ wheelSpeedMultiplier: tt = 1,
608
+ contentInsets: Y
609
+ }, ut) => {
610
+ const V = w(0), D = w(null), X = w(null), O = w({
611
+ frame: null,
612
+ velocity: 0,
613
+ lastTimestamp: null
614
+ }), R = Vt(
615
+ () => ({
616
+ maxVelocity: T?.maxVelocity ?? Jt.maxVelocity,
617
+ minVelocity: T?.minVelocity ?? Jt.minVelocity,
618
+ deceleration: T?.deceleration ?? Jt.deceleration,
619
+ velocitySampleWindow: T?.velocitySampleWindow ?? Jt.velocitySampleWindow,
620
+ startVelocityThreshold: T?.startVelocityThreshold ?? Jt.startVelocityThreshold
621
+ }),
622
+ [T]
623
+ ), H = Vt(() => ({
624
+ top: Math.max(0, Y?.top ?? 0),
625
+ bottom: Math.max(0, Y?.bottom ?? 0)
626
+ }), [Y]);
627
+ wt.debug("[ScrollPane] ScrollPane rendered", {
628
+ contentSize: t,
629
+ viewportSize: e,
630
+ scrollBarWidth: n,
631
+ className: c,
632
+ style: d,
633
+ tapScrollCircleOptions: b,
634
+ inertiaOptions: T,
635
+ enablePointerDrag: f,
636
+ contentInsets: H
637
+ });
638
+ const q = w({ contentSize: t, viewportSize: e }), N = Vt(() => t > e, [t, e]), g = M(
639
+ (S) => {
640
+ const { contentSize: v, viewportSize: it } = q.current, W = v > it, G = V.current;
641
+ if (wt.debug("[ScrollPane] scrollTo called", { newPosition: S, contentSize: v, viewportSize: it, currentIsScrollable: W, prevPosition: G }), !W)
642
+ return V.current !== 0 && (V.current = 0, l?.(0, G)), V.current;
643
+ const ft = typeof S == "function" ? S(V.current) : S, et = Math.max(v - it, 0), st = pt(ft, 0, et);
644
+ return V.current !== st && (V.current = st, l?.(st, G)), V.current;
645
+ },
646
+ [l]
647
+ ), C = M(() => {
648
+ const S = O.current;
649
+ S.frame !== null && cancelAnimationFrame(S.frame), S.frame = null, S.velocity = 0, S.lastTimestamp = null;
650
+ }, []), P = w(C);
651
+ L(() => {
652
+ P.current = C;
653
+ }, [C]);
654
+ const j = M(
655
+ (S) => {
656
+ if (!N)
657
+ return;
658
+ const { maxVelocity: v, minVelocity: it, deceleration: W, startVelocityThreshold: G } = R, ft = pt(S, -v, v);
659
+ if (Math.abs(ft) < G)
660
+ return;
661
+ C(), O.current.velocity = ft, O.current.lastTimestamp = null;
662
+ const et = (st) => {
663
+ const nt = O.current;
664
+ if (nt.lastTimestamp === null) {
665
+ nt.lastTimestamp = st, nt.frame = requestAnimationFrame(et);
666
+ return;
667
+ }
668
+ const gt = st - nt.lastTimestamp;
669
+ if (nt.lastTimestamp = st, gt <= 0) {
670
+ nt.frame = requestAnimationFrame(et);
671
+ return;
672
+ }
673
+ const mt = nt.velocity;
674
+ let xt = mt;
675
+ const St = W * gt;
676
+ mt > 0 ? xt = Math.max(0, mt - St) : mt < 0 && (xt = Math.min(0, mt + St));
677
+ const Dt = (mt + xt) / 2 * gt, p = V.current;
678
+ Dt !== 0 && g((It) => It + Dt);
679
+ const m = V.current, { contentSize: ht, viewportSize: Z } = q.current, z = Math.max(ht - Z, 0);
680
+ nt.velocity = xt;
681
+ const Rt = m === p || m <= 0 && xt <= 0 || m >= z && xt >= 0;
682
+ if (Math.abs(xt) < it || Rt) {
683
+ C();
684
+ return;
685
+ }
686
+ nt.frame = requestAnimationFrame(et);
687
+ };
688
+ O.current.frame = requestAnimationFrame(et);
689
+ },
690
+ [N, R, g, C]
691
+ ), rt = w(j);
692
+ L(() => {
693
+ rt.current = j;
694
+ }, [j]), se(() => {
695
+ q.current = { contentSize: t, viewportSize: e };
696
+ }, [t, e]), se(() => {
697
+ if (N) {
698
+ wt.debug("[ScrollPane] Adjusting scroll position due to content or viewport size change", { contentSize: t, viewportSize: e, scrollPosition: V.current });
699
+ const S = pt(t - e, 0, t);
700
+ V.current > S && g(S);
701
+ } else
702
+ g(0);
703
+ }, [N, g, t, e]), L(() => {
704
+ const S = (it) => {
705
+ if (!N)
706
+ return;
707
+ it.preventDefault(), C();
708
+ let W = it.deltaY;
709
+ it.deltaMode === 1 ? W *= 16 : it.deltaMode === 2 && (W *= e), tt !== 1 && (W *= tt), wt.debug("[ScrollPane] wheel event", { deltaY: W, scrollPosition: V.current, wheelSpeedMultiplier: tt }), g((G) => G + W);
710
+ }, v = D.current;
711
+ return v && v.addEventListener("wheel", S, { passive: !1 }), () => {
712
+ v && v.removeEventListener("wheel", S);
713
+ };
714
+ }, [N, g, C, e, tt]), he(
715
+ ut,
716
+ () => ({
717
+ scrollTo: g,
718
+ getScrollPosition: () => V.current,
719
+ getContentSize: () => t,
720
+ getViewportSize: () => e
721
+ }),
722
+ [g, t, e]
723
+ );
724
+ const Ct = w(g);
725
+ L(() => {
726
+ Ct.current = g;
727
+ }, [g]);
728
+ const ot = Le(), $ = w({
729
+ pointerId: null,
730
+ startClientY: 0,
731
+ startScroll: 0,
732
+ isDragging: !1,
733
+ shouldCancelNextClick: !1,
734
+ clickResetTimer: null,
735
+ velocitySamples: []
736
+ }), ct = w(f);
737
+ L(() => {
738
+ ct.current = f;
739
+ }, [f]);
740
+ const dt = w(N);
741
+ L(() => {
742
+ dt.current = N;
743
+ }, [N]);
744
+ const A = w(R);
745
+ return L(() => {
746
+ A.current = R;
747
+ }, [R]), L(() => {
748
+ if (f)
583
749
  return;
584
- const { maxVelocity: _, minVelocity: g, deceleration: P, startVelocityThreshold: R } = I, k = W(h, -_, _);
585
- if (Math.abs(k) < R)
750
+ const S = X.current, v = $.current;
751
+ v.pointerId !== null && S && S.hasPointerCapture(v.pointerId) && S.releasePointerCapture(v.pointerId), v.clickResetTimer !== null && (window.clearTimeout(v.clickResetTimer), v.clickResetTimer = null), v.pointerId = null, v.startClientY = 0, v.startScroll = 0, v.isDragging = !1, v.shouldCancelNextClick = !1, v.velocitySamples = [];
752
+ }, [f]), L(() => {
753
+ const S = X.current;
754
+ if (!S)
586
755
  return;
587
- M(), K.current.velocity = k, K.current.lastTimestamp = null;
588
- const L = (v) => {
589
- const w = K.current;
590
- if (w.lastTimestamp === null) {
591
- w.lastTimestamp = v, w.frame = requestAnimationFrame(L);
756
+ const v = 6, it = () => typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), W = () => {
757
+ const p = $.current;
758
+ p.pointerId = null, p.startClientY = 0, p.startScroll = 0, p.isDragging = !1, p.velocitySamples = [];
759
+ }, G = () => {
760
+ const p = $.current;
761
+ p.clickResetTimer !== null && (window.clearTimeout(p.clickResetTimer), p.clickResetTimer = null);
762
+ }, ft = (p) => {
763
+ const m = $.current, ht = it();
764
+ m.velocitySamples.push({ clientY: p, time: ht });
765
+ const Z = A.current.velocitySampleWindow;
766
+ m.velocitySamples = m.velocitySamples.filter((z) => ht - z.time <= Z);
767
+ }, et = (p) => p instanceof HTMLElement && p.closest("[data-scrollpane-ignore-drag='true']") !== null, st = (p) => {
768
+ const m = $.current;
769
+ m.shouldCancelNextClick && (p.preventDefault(), p.stopPropagation(), m.shouldCancelNextClick = !1);
770
+ }, nt = (p) => {
771
+ const m = $.current;
772
+ m.isDragging || (m.isDragging = !0, m.shouldCancelNextClick = !0, S.hasPointerCapture(p.pointerId) || S.setPointerCapture(p.pointerId), ft(p.clientY));
773
+ }, gt = (p) => {
774
+ const m = $.current;
775
+ if (m.pointerId !== p.pointerId || !(ct.current && dt.current) || !m.isDragging && (Math.abs(p.clientY - m.startClientY) < v || (nt(p), !m.isDragging)))
592
776
  return;
593
- }
594
- const b = v - w.lastTimestamp;
595
- if (w.lastTimestamp = v, b <= 0) {
596
- w.frame = requestAnimationFrame(L);
777
+ ft(p.clientY);
778
+ const ht = p.clientY - m.startClientY, Z = m.startScroll - ht;
779
+ Ct.current(Z), p.cancelable && p.preventDefault();
780
+ }, mt = (p) => {
781
+ const m = $.current;
782
+ if (m.pointerId !== p.pointerId)
597
783
  return;
784
+ m.isDragging && m.shouldCancelNextClick && p.cancelable && (p.preventDefault(), p.stopPropagation()), S.hasPointerCapture(p.pointerId) && S.releasePointerCapture(p.pointerId);
785
+ let ht = 0;
786
+ if (m.isDragging && m.velocitySamples.length >= 2) {
787
+ const z = m.velocitySamples, Rt = A.current.velocitySampleWindow, It = z[z.length - 1], At = z.find((Tt) => It.time - Tt.time <= Rt) ?? z[0];
788
+ if (It && At && It.time !== At.time) {
789
+ const Tt = It.clientY - At.clientY, _t = It.time - At.time;
790
+ ht = -(Tt / _t);
791
+ }
598
792
  }
599
- const T = w.velocity;
600
- let V = T;
601
- const J = P * b;
602
- T > 0 ? V = Math.max(0, T - J) : T < 0 && (V = Math.min(0, T + J));
603
- const q = (T + V) / 2 * b, Q = S.current;
604
- q !== 0 && d((B) => B + q);
605
- const ie = S.current, { contentSize: j, viewportSize: ge } = x.current, D = Math.max(j - ge, 0);
606
- w.velocity = V;
607
- const l = ie === Q || ie <= 0 && V <= 0 || ie >= D && V >= 0;
608
- if (Math.abs(V) < g || l) {
609
- M();
793
+ G(), m.shouldCancelNextClick && (m.clickResetTimer = window.setTimeout(() => {
794
+ const z = $.current;
795
+ z.shouldCancelNextClick = !1, z.clickResetTimer = null;
796
+ }, 0));
797
+ const Z = A.current.startVelocityThreshold;
798
+ W(), Math.abs(ht) >= Z && rt.current?.(ht);
799
+ }, xt = (p) => {
800
+ if (!(ct.current && dt.current) || p.button !== 0 && p.pointerType === "mouse" || p.ctrlKey || p.metaKey || p.altKey || et(p.target))
610
801
  return;
611
- }
612
- w.frame = requestAnimationFrame(L);
802
+ window.dispatchEvent(new CustomEvent(pe, { detail: { paneId: ot } })), P.current?.();
803
+ const m = $.current;
804
+ G(), m.pointerId = p.pointerId, m.startClientY = p.clientY, m.startScroll = V.current, m.isDragging = !1, m.shouldCancelNextClick = !1, m.velocitySamples = [];
805
+ }, St = (p) => {
806
+ const m = $.current;
807
+ m.pointerId === p.pointerId && (m.shouldCancelNextClick = !1, S.hasPointerCapture(p.pointerId) && S.releasePointerCapture(p.pointerId), G(), W());
808
+ }, Et = [
809
+ ["click", st, !0],
810
+ ["pointerdown", xt, { passive: !1 }],
811
+ ["pointermove", gt, { passive: !1 }],
812
+ ["pointerup", mt, void 0],
813
+ ["pointercancel", St, void 0]
814
+ ], Dt = [
815
+ ["pointermove", gt, { passive: !1 }],
816
+ ["pointerup", mt, void 0],
817
+ ["pointercancel", St, void 0]
818
+ ];
819
+ return oe(S, Et, "add"), oe(window, Dt, "add"), () => {
820
+ oe(S, Et, "remove"), oe(window, Dt, "remove");
821
+ const p = $.current;
822
+ p.pointerId !== null && S.hasPointerCapture(p.pointerId) && S.releasePointerCapture(p.pointerId), G(), W();
613
823
  };
614
- K.current.frame = requestAnimationFrame(L);
615
- },
616
- [$, I, d, M]
617
- );
618
- Ae(() => {
619
- x.current = { contentSize: e, viewportSize: t };
620
- }, [e, t]), Ae(() => {
621
- if ($) {
622
- ae.debug("[ScrollPane] Adjusting scroll position due to content or viewport size change", { contentSize: e, viewportSize: t, scrollPosition: S.current });
623
- const h = W(e - t, 0, e);
624
- S.current > h && d(h);
625
- } else
626
- d(0);
627
- }, [$, d, e, t]), se(() => {
628
- const h = (g) => {
629
- if (!$)
630
- return;
631
- g.preventDefault(), M();
632
- let P = g.deltaY;
633
- g.deltaMode === 1 ? P *= 16 : g.deltaMode === 2 && (P *= t), X !== 1 && (P *= X), ae.debug("[ScrollPane] wheel event", { deltaY: P, scrollPosition: S.current, wheelSpeedMultiplier: X }), d((R) => R + P);
634
- }, _ = G.current;
635
- return _ && _.addEventListener("wheel", h, { passive: !1 }), () => {
636
- _ && _.removeEventListener("wheel", h);
637
- };
638
- }, [$, d, M, t, X]), Ye(
639
- ne,
640
- () => ({
641
- scrollTo: d,
642
- getScrollPosition: () => S.current,
643
- getContentSize: () => e,
644
- getViewportSize: () => t
645
- }),
646
- [d, e, t]
647
- );
648
- const Z = Tt();
649
- return se(() => {
650
- const h = C.current;
651
- if (!h)
652
- return;
653
- if (!a) {
654
- M();
655
- return;
656
- }
657
- const _ = 6;
658
- let g = null, P = 0, R = 0, k = !1, L = !1, v = null, w = [];
659
- const b = () => {
660
- g = null, P = 0, R = 0, k = !1, w = [];
661
- }, T = (l) => {
662
- const B = performance.now();
663
- w.push({ clientY: l, time: B }), w = w.filter((U) => B - U.time <= I.velocitySampleWindow);
664
- }, V = (l) => l instanceof HTMLElement && l.closest("[data-scrollpane-ignore-drag='true']") !== null, J = (l) => {
665
- L && (l.preventDefault(), l.stopPropagation(), L = !1);
666
- }, oe = (l) => {
667
- k || (k = !0, L = !0, h.hasPointerCapture(l.pointerId) || h.setPointerCapture(l.pointerId), T(l.clientY));
668
- }, q = (l) => {
669
- if (g !== l.pointerId || !k && (Math.abs(l.clientY - P) < _ || (oe(l), !k)))
670
- return;
671
- T(l.clientY);
672
- const B = l.clientY - P, U = R - B;
673
- d(U), l.cancelable && l.preventDefault();
674
- }, Q = (l) => {
675
- if (g !== l.pointerId)
676
- return;
677
- k && L && l.cancelable && (l.preventDefault(), l.stopPropagation()), h.hasPointerCapture(l.pointerId) && h.releasePointerCapture(l.pointerId);
678
- let B = 0;
679
- if (k && w.length >= 2) {
680
- const U = w[w.length - 1], N = w.find((ue) => U.time - ue.time <= I.velocitySampleWindow) ?? w[0];
681
- if (U && N && U.time !== N.time) {
682
- const ue = U.clientY - N.clientY, xe = U.time - N.time;
683
- B = -(ue / xe);
824
+ }, [ot]), /* @__PURE__ */ Gt("div", { ref: D, className: jt("flex", c), style: d, children: [
825
+ /* @__PURE__ */ Gt(
826
+ "div",
827
+ {
828
+ ref: X,
829
+ className: jt("relative h-full flex-1 overflow-hidden"),
830
+ style: {
831
+ height: e,
832
+ paddingTop: H.top,
833
+ paddingBottom: H.bottom,
834
+ ...f ? { touchAction: "none" } : {}
835
+ },
836
+ id: ot,
837
+ children: [
838
+ h,
839
+ r(V.current)
840
+ ]
684
841
  }
685
- }
686
- b(), v !== null && window.clearTimeout(v), L && (v = window.setTimeout(() => {
687
- L = !1, v = null;
688
- }, 0)), Math.abs(B) >= I.startVelocityThreshold && z(B);
689
- }, ie = (l) => {
690
- $ && (l.button !== 0 && l.pointerType === "mouse" || l.ctrlKey || l.metaKey || l.altKey || V(l.target) || (window.dispatchEvent(new CustomEvent(ze, { detail: { paneId: Z } })), M(), g = l.pointerId, P = l.clientY, R = S.current, k = !1, L = !1, w = []));
691
- }, j = (l) => {
692
- g === l.pointerId && (L = !1, h.hasPointerCapture(l.pointerId) && h.releasePointerCapture(l.pointerId), v !== null && (window.clearTimeout(v), v = null), b());
693
- }, ge = [
694
- ["click", J, !0],
695
- ["pointerdown", ie, { passive: !1 }],
696
- ["pointermove", q, { passive: !1 }],
697
- ["pointerup", Q, void 0],
698
- ["pointercancel", j, void 0]
699
- ], D = [
700
- ["pointermove", q, { passive: !1 }],
701
- ["pointerup", Q, void 0],
702
- ["pointercancel", j, void 0]
703
- ];
704
- return Ce(h, ge, "add"), Ce(window, D, "add"), () => {
705
- Ce(h, ge, "remove"), Ce(window, D, "remove"), g !== null && h.hasPointerCapture(g) && h.releasePointerCapture(g), v !== null && window.clearTimeout(v), M();
706
- };
707
- }, [a, Z, $, I, d, z, M]), /* @__PURE__ */ Se("div", { ref: G, className: Ie("flex", c), style: u, children: [
708
- /* @__PURE__ */ Se(
709
- "div",
710
- {
711
- ref: C,
712
- className: "relative h-full flex-1 overflow-hidden",
713
- style: { height: t, ...a ? { touchAction: "none" } : {} },
714
- id: Z,
715
- children: [
716
- p,
717
- s(S.current)
718
- ]
719
- }
720
- ),
721
- $ && /* @__PURE__ */ H(
722
- Lt,
723
- {
724
- contentSize: e,
725
- viewportSize: t,
726
- scrollPosition: S.current,
727
- onScroll: d,
728
- enableThumbDrag: r,
729
- enableTrackClick: o,
730
- enableArrowButtons: i,
731
- scrollBarWidth: n,
732
- ariaControls: Z,
733
- tapScrollCircleOptions: E,
734
- itemCount: O,
735
- renderThumbOverlay: te
736
- }
737
- )
738
- ] });
739
- }), tt = (s, e, t) => Math.min(Math.max(s, e), t), qt = ({ dragState: s, normalizedDistance: e, sizeScale: t, size: n }) => {
740
- const r = Math.max(n / 2, 1), o = 1 + e * 0.65, i = Math.max(0.65, 1 - e * 0.25), a = s.direction * e * 26 * t, f = 0.8 + e * 0.18, c = 3 * t, u = 6 * t, p = 22 * t, E = Math.abs(a) + u, A = a > 0 ? c : -Math.abs(a) - c, O = Math.max(2.5, 3 * t), te = tt(s.offsetX, -r, r), X = tt(s.offsetY, -r, r), ne = r * 0.35, S = te / r * ne, ce = X / r * ne, le = S * 0.45, G = ce * 0.45, C = Math.max(p * 0.38, 6), K = 0.65 + e * 0.2, I = s.active;
741
- return /* @__PURE__ */ Se(rt, { children: [
742
- /* @__PURE__ */ H(
842
+ ),
843
+ N && /* @__PURE__ */ Q(
844
+ tn,
845
+ {
846
+ contentSize: t,
847
+ viewportSize: e,
848
+ scrollPosition: V.current,
849
+ onScroll: g,
850
+ enableThumbDrag: o,
851
+ enableTrackClick: a,
852
+ enableArrowButtons: u,
853
+ scrollBarWidth: n,
854
+ ariaControls: ot,
855
+ tapScrollCircleOptions: b,
856
+ itemCount: k,
857
+ renderThumbOverlay: _
858
+ }
859
+ )
860
+ ] });
861
+ }
862
+ ), be = (r, t, e) => Math.min(Math.max(r, t), e), In = ({ dragState: r, normalizedDistance: t, sizeScale: e, size: n }) => {
863
+ const o = Math.max(n / 2, 1), a = 1 + t * 0.65, u = Math.max(0.65, 1 - t * 0.25), f = r.direction * t * 26 * e, l = 0.8 + t * 0.18, c = 3 * e, d = 6 * e, h = 22 * e, b = Math.abs(f) + d, T = f > 0 ? c : -Math.abs(f) - c, k = Math.max(2.5, 3 * e), _ = be(r.offsetX, -o, o), tt = be(r.offsetY, -o, o), Y = o * 0.35, ut = _ / o * Y, V = tt / o * Y, D = ut * 0.45, X = V * 0.45, O = Math.max(h * 0.38, 6), R = 0.65 + t * 0.2, H = r.active;
864
+ return /* @__PURE__ */ Gt(ye, { children: [
865
+ /* @__PURE__ */ Q(
743
866
  "div",
744
867
  {
745
- className: "absolute inset-0 rounded-full border border-white/40 bg-linear-to-br from-[#1d4ed8]/60 via-[#60a5fa]/55 to-[#bfdbfe]/40 shadow-md",
868
+ className: "aqvs:tap-scroll-circle-gradient absolute inset-0 rounded-full border border-white/40 shadow-md",
746
869
  style: {
747
- transform: `scale(${i}, ${o})`,
748
- transition: I ? "40ms transform ease-out" : "200ms ease transform"
870
+ transform: `scale(${u}, ${a})`,
871
+ transition: H ? "40ms transform ease-out" : "200ms ease transform"
749
872
  }
750
873
  }
751
874
  ),
752
- /* @__PURE__ */ H(
875
+ /* @__PURE__ */ Q(
753
876
  "div",
754
877
  {
755
878
  className: "absolute top-1/2 left-1/2 rounded-full border border-white/50 bg-white/85",
756
879
  style: {
757
- width: p,
758
- height: p,
759
- transform: `translate(calc(-50% + ${S}px), calc(-50% + ${ce}px)) scale(${i}, ${f * o})`,
760
- transition: I ? "70ms transform ease-out" : "200ms ease transform"
880
+ width: h,
881
+ height: h,
882
+ transform: `translate(calc(-50% + ${ut}px), calc(-50% + ${V}px)) scale(${u}, ${l * a})`,
883
+ transition: H ? "70ms transform ease-out" : "200ms ease transform"
761
884
  }
762
885
  }
763
886
  ),
764
- /* @__PURE__ */ H(
887
+ /* @__PURE__ */ Q(
765
888
  "div",
766
889
  {
767
890
  className: "absolute top-1/2 left-1/2 rounded-full bg-white/80",
768
891
  style: {
769
- width: C,
770
- height: C,
771
- transform: `translate(calc(-50% + ${le}px), calc(-50% + ${G}px)) scale(${i}, ${o})`,
772
- opacity: K,
892
+ width: O,
893
+ height: O,
894
+ transform: `translate(calc(-50% + ${D}px), calc(-50% + ${X}px)) scale(${u}, ${a})`,
895
+ opacity: R,
773
896
  boxShadow: "0 0 8px rgba(255,255,255,0.45)",
774
- transition: I ? "120ms opacity 150ms, 120ms transform ease-out ease-out" : "220ms ease transform, 240ms opacity ease"
897
+ transition: H ? "120ms opacity 150ms, 120ms transform ease-out ease-out" : "220ms ease transform, 240ms opacity ease"
775
898
  }
776
899
  }
777
900
  ),
778
- /* @__PURE__ */ H(
901
+ /* @__PURE__ */ Q(
779
902
  "div",
780
903
  {
781
904
  className: "absolute top-1/2 left-1/2 rounded-full bg-white/50",
782
905
  style: {
783
- width: O,
784
- height: E,
785
- transform: `translate(-50%, ${A}px)`,
786
- opacity: e,
787
- transition: I ? "40ms height, 60ms opacity ease-out ease-out" : "200ms ease height, 120ms ease opacity"
906
+ width: k,
907
+ height: b,
908
+ transform: `translate(-50%, ${T}px)`,
909
+ opacity: t,
910
+ transition: H ? "40ms height, 60ms opacity ease-out ease-out" : "200ms ease height, 120ms ease opacity"
788
911
  }
789
912
  }
790
913
  )
791
914
  ] });
915
+ }, nn = (r) => {
916
+ if (!Number.isFinite(r))
917
+ return 0n;
918
+ const t = Math.trunc(r);
919
+ return t <= 0 ? 0n : BigInt(t);
920
+ }, ie = (r) => {
921
+ if (r <= 0 || !Number.isFinite(r))
922
+ return 0;
923
+ const t = Math.trunc(r), e = BigInt(t) & -BigInt(t);
924
+ return Number(e);
792
925
  };
793
- class Nt {
926
+ class rn {
794
927
  /**
795
928
  * @private
796
929
  * @property {Map<number, number>} tree - The Map storing the Fenwick tree structure, specifically the sums of deltas. It is 1-indexed.
@@ -830,8 +963,8 @@ class Nt {
830
963
  * @param {number | ((index: number) => number)} valueOrFn - The value for all elements, or a function to generate values.
831
964
  * @param {{ sampleRange?: { from: number; to: number }, materialize?: boolean }} [options] - Optional settings for initialization.
832
965
  */
833
- constructor(e, t, n) {
834
- this.reset(e, t, n);
966
+ constructor(t, e, n) {
967
+ this.reset(t, e, n);
835
968
  }
836
969
  /**
837
970
  * @method reset
@@ -841,26 +974,26 @@ class Nt {
841
974
  * @param {number | ((index: number) => number)} valueOrFn - The value for all elements, or a function to generate values.
842
975
  * @param {{ sampleRange?: { from: number; to: number }, materialize?: boolean }} [options] - Optional settings for initialization.
843
976
  */
844
- reset(e, t, n) {
845
- if (this.size = e, this.tree = /* @__PURE__ */ new Map(), this.deltas = /* @__PURE__ */ new Map(), this.total = void 0, typeof t == "function") {
846
- if (this.valueFn = t, this.size > 0) {
847
- const o = n?.sampleRange ?? {
977
+ reset(t, e, n) {
978
+ if (this.size = t, this.tree = /* @__PURE__ */ new Map(), this.deltas = /* @__PURE__ */ new Map(), this.total = void 0, typeof e == "function") {
979
+ if (this.valueFn = e, this.size > 0) {
980
+ const a = n?.sampleRange ?? {
848
981
  from: 0,
849
982
  to: Math.min(99, this.size - 1)
850
- }, { mode: i, materializedValues: a } = this._calculateMode(o.from, o.to);
851
- if (this.baseValue = i, n?.materialize)
852
- for (let f = 0; f < a.length; f++) {
853
- const c = a[f], u = o.from + f;
854
- if (u >= this.size)
983
+ }, { mode: u, materializedValues: f } = this._calculateMode(a.from, a.to);
984
+ if (this.baseValue = u, n?.materialize)
985
+ for (let l = 0; l < f.length; l++) {
986
+ const c = f[l], d = a.from + l;
987
+ if (d >= this.size)
855
988
  break;
856
- const p = c - this.baseValue;
857
- this.deltas.set(u, p), this._updateTree(u, p);
989
+ const h = c - this.baseValue;
990
+ this.deltas.set(d, h), this._updateTree(d, h);
858
991
  }
859
992
  } else
860
993
  this.baseValue = 0;
861
994
  this.total = this.getTotal();
862
995
  } else
863
- this.valueFn = void 0, this.baseValue = t, this.total = this.baseValue * this.size;
996
+ this.valueFn = void 0, this.baseValue = e, this.total = this.baseValue * this.size;
864
997
  }
865
998
  /**
866
999
  * @method setValueFn
@@ -868,8 +1001,8 @@ class Nt {
868
1001
  * @description 値関数を更新し、ツリーを再初期化する。
869
1002
  * @param {number | ((index: number) => number)} valueOrFn - The new value for all elements, or a function to generate values.
870
1003
  */
871
- setValueFn(e) {
872
- typeof e == "function" ? this.valueFn = e : (this.valueFn = void 0, this.baseValue = e);
1004
+ setValueFn(t) {
1005
+ typeof t == "function" ? this.valueFn = t : (this.valueFn = void 0, this.baseValue = t);
873
1006
  }
874
1007
  /**
875
1008
  * @private
@@ -880,33 +1013,33 @@ class Nt {
880
1013
  * @param {number} to - The ending index of the range (inclusive).
881
1014
  * @returns {{ mode: number; materializedValues: number[] }} An object containing the calculated mode and the array of generated values.
882
1015
  */
883
- _calculateMode(e, t) {
1016
+ _calculateMode(t, e) {
884
1017
  if (!this.valueFn)
885
1018
  return { mode: 0, materializedValues: [] };
886
1019
  const n = [];
887
- for (let c = e; c <= t && !(c >= this.size); c++)
1020
+ for (let c = t; c <= e && !(c >= this.size); c++)
888
1021
  n.push(this.valueFn(c));
889
- const r = [...n];
1022
+ const o = [...n];
890
1023
  if (n.length === 0)
891
1024
  return { mode: 0, materializedValues: [] };
892
- n.sort((c, u) => c - u);
893
- const o = Math.floor(n.length / 2);
894
- let i;
895
- n.length % 2 === 0 ? i = Math.floor((n[o - 1] + n[o]) / 2) : i = n[o];
896
- const a = /* @__PURE__ */ new Map();
897
- let f = 0;
1025
+ n.sort((c, d) => c - d);
1026
+ const a = Math.floor(n.length / 2);
1027
+ let u;
1028
+ n.length % 2 === 0 ? u = Math.floor((n[a - 1] + n[a]) / 2) : u = n[a];
1029
+ const f = /* @__PURE__ */ new Map();
1030
+ let l = 0;
898
1031
  for (const c of n) {
899
- const u = (a.get(c) ?? 0) + 1;
900
- a.set(c, u), u > f && (f = u);
1032
+ const d = (f.get(c) ?? 0) + 1;
1033
+ f.set(c, d), d > l && (l = d);
901
1034
  }
902
- if (f > 1) {
1035
+ if (l > 1) {
903
1036
  const c = [];
904
- for (const [p, E] of a.entries())
905
- E === f && c.push(p);
906
- const u = c.reduce((p, E) => p + E, 0);
907
- i = Math.floor(u / c.length);
1037
+ for (const [h, b] of f.entries())
1038
+ b === l && c.push(h);
1039
+ const d = c.reduce((h, b) => h + b, 0);
1040
+ u = Math.floor(d / c.length);
908
1041
  }
909
- return { mode: i, materializedValues: r };
1042
+ return { mode: u, materializedValues: o };
910
1043
  }
911
1044
  /**
912
1045
  * @method update
@@ -915,18 +1048,18 @@ class Nt {
915
1048
  * @param {number} index - The 0-based index to update.
916
1049
  * @param {number} value - The new value.
917
1050
  */
918
- update(e, t) {
919
- return this.updates([{ index: e, value: t }]);
1051
+ update(t, e) {
1052
+ return this.updates([{ index: t, value: e }]);
920
1053
  }
921
1054
  /**
922
1055
  * @method updates
923
1056
  * @description Updates the values at given indices.
924
1057
  * @description 指定されたインデックスの値を更新。
925
- * @param {ValueUpdate[]} updates - An array of updates, each with an index and the new value.
1058
+ * @param {ValueUpdate[]} updates - An array of updates, each with an index and the new value.
926
1059
  */
927
- updates(e) {
928
- const t = this._buildDeltaUpdates(e);
929
- return t.length > 0 ? this.updateDeltas(t) : this.total;
1060
+ updates(t) {
1061
+ const e = this._buildDeltaUpdates(t);
1062
+ return e.length > 0 ? this.updateDeltas(e) : this.total;
930
1063
  }
931
1064
  /**
932
1065
  * @method updateDelta
@@ -935,21 +1068,21 @@ class Nt {
935
1068
  * @param {number} index - The 0-based index to update.
936
1069
  * @param {number} change - The value to add to the delta at the given index.
937
1070
  */
938
- updateDelta(e, t) {
939
- return this.updateDeltas([{ index: e, change: t }]);
1071
+ updateDelta(t, e) {
1072
+ return this.updateDeltas([{ index: t, change: e }]);
940
1073
  }
941
1074
  /**
942
1075
  * @method updateDeltas
943
1076
  * @description Updates the deltas at given indices and propagates the changes through the tree.
944
1077
  * @description 指定されたインデックスのデルタを更新し、変更をツリーに伝播させる。
945
- * @param {DeltaUpdate[]} updates - An array of updates, each with an index and the change to apply.
1078
+ * @param {DeltaUpdate[]} updates - An array of updates, each with an index and the change to apply.
946
1079
  */
947
- updateDeltas(e) {
948
- for (const { index: t, change: n } of e) {
949
- if (t < 0 || t >= this.size)
950
- throw new Error(`Index ${t} out of bounds`);
951
- const r = this.deltas.get(t) ?? 0;
952
- this.deltas.set(t, r + n), this._updateTree(t, n);
1080
+ updateDeltas(t) {
1081
+ for (const { index: e, change: n } of t) {
1082
+ if (e < 0 || e >= this.size)
1083
+ throw new Error(`Index ${e} out of bounds`);
1084
+ const o = this.deltas.get(e) ?? 0;
1085
+ this.deltas.set(e, o + n), this._updateTree(e, n);
953
1086
  }
954
1087
  return this.total;
955
1088
  }
@@ -961,13 +1094,18 @@ class Nt {
961
1094
  * @param {number} index - The 0-based index that changed.
962
1095
  * @param {number} change - The change in value.
963
1096
  */
964
- _updateTree(e, t) {
965
- if (t === 0)
1097
+ _updateTree(t, e) {
1098
+ if (e === 0)
966
1099
  return;
967
- let n = e + 1;
968
- for (; n <= this.size; )
969
- this.tree.set(n, (this.tree.get(n) ?? 0) + t), n += n & -n;
970
- this.total !== void 0 && (this.total += t);
1100
+ let n = t + 1;
1101
+ for (; n <= this.size; ) {
1102
+ this.tree.set(n, (this.tree.get(n) ?? 0) + e);
1103
+ const o = ie(n);
1104
+ if (o === 0)
1105
+ break;
1106
+ n += o;
1107
+ }
1108
+ this.total !== void 0 && (this.total += e);
971
1109
  }
972
1110
  /**
973
1111
  * @private
@@ -977,17 +1115,37 @@ class Nt {
977
1115
  * @param {ValueUpdate[]} updates - Requested value updates.
978
1116
  * @returns {DeltaUpdate[]} Sanitized delta updates ready to apply.
979
1117
  */
980
- _buildDeltaUpdates(e) {
981
- const t = [];
982
- for (const { index: n, value: r } of e) {
1118
+ _buildDeltaUpdates(t) {
1119
+ const e = [];
1120
+ for (const { index: n, value: o } of t) {
983
1121
  if (n < 0 || n >= this.size)
984
1122
  throw new Error(`Index ${n} out of bounds`);
985
- if (r < 0)
1123
+ if (o < 0)
986
1124
  throw new Error("Value cannot be negative.");
987
- const o = this.deltas.has(n) ? (this.deltas.get(n) ?? 0) + this.baseValue : this.baseValue, i = r - o;
988
- i !== 0 && t.push({ index: n, change: i });
1125
+ const a = this.deltas.has(n) ? (this.deltas.get(n) ?? 0) + this.baseValue : this.baseValue, u = o - a;
1126
+ u !== 0 && e.push({ index: n, change: u });
1127
+ }
1128
+ return e;
1129
+ }
1130
+ /**
1131
+ * @private
1132
+ * @method _computeTreeTotal
1133
+ * @description Calculates the total height represented by the current Fenwick tree structure, reproducing the same traversal used by `prefixSum` at the last index to avoid floating-point drift.
1134
+ * @description Fenwick 木が保持する合計値を算出する。末尾インデックスでの `prefixSum` と同一の走査手順を再現し、浮動小数点の誤差を防ぐ。
1135
+ * @returns {number} The total height encoded in the Fenwick tree.
1136
+ */
1137
+ _computeTreeTotal() {
1138
+ if (this.size <= 0)
1139
+ return 0;
1140
+ let t = 0, e = this.size;
1141
+ for (; e > 0; ) {
1142
+ t += this.tree.get(e) ?? 0;
1143
+ const n = ie(e);
1144
+ if (n === 0)
1145
+ break;
1146
+ e -= n;
989
1147
  }
990
- return t;
1148
+ return t + this.baseValue * this.size;
991
1149
  }
992
1150
  /**
993
1151
  * @private
@@ -997,12 +1155,12 @@ class Nt {
997
1155
  * @param {number} index - The 0-based index to materialize.
998
1156
  * @param {boolean} [updateTree=true] - Whether to update the Fenwick tree after materialization.
999
1157
  */
1000
- _materialize(e, t = !0) {
1158
+ _materialize(t, e = !0) {
1001
1159
  if (this.valueFn) {
1002
- const n = this.deltas.get(e) ?? 0, o = this.valueFn(e) - this.baseValue;
1003
- if (o !== n && (this.deltas.set(e, o), t)) {
1004
- const i = o - n;
1005
- this._updateTree(e, i);
1160
+ const n = this.deltas.get(t) ?? 0, a = this.valueFn(t) - this.baseValue;
1161
+ if (a !== n && (this.deltas.set(t, a), e)) {
1162
+ const u = a - n;
1163
+ this._updateTree(t, u);
1006
1164
  }
1007
1165
  }
1008
1166
  }
@@ -1015,27 +1173,27 @@ class Nt {
1015
1173
  * @param {number | undefined} index - Target index for materialization.
1016
1174
  * @param {boolean} [forceIndex=false] - When true, materializes the index even if it is outside the provided ranges.
1017
1175
  */
1018
- _materializeRanges(e, t, n = !1) {
1019
- if (!(e?.materialize && this.valueFn))
1176
+ _materializeRanges(t, e, n = !1) {
1177
+ if (!(t?.materialize && this.valueFn))
1020
1178
  return;
1021
- const r = e.ranges;
1022
- if (r && r.length > 0) {
1023
- for (const a of r) {
1024
- const f = a.from, c = Math.min(a.to, this.size - 1);
1025
- for (let u = f; u <= c; u++)
1026
- this._materialize(u);
1179
+ const o = t.ranges;
1180
+ if (o && o.length > 0) {
1181
+ for (const f of o) {
1182
+ const l = f.from, c = Math.min(f.to, this.size - 1);
1183
+ for (let d = l; d <= c; d++)
1184
+ this._materialize(d);
1027
1185
  }
1028
- if (t === void 0)
1186
+ if (e === void 0)
1029
1187
  return;
1030
1188
  if (n) {
1031
- this._materialize(t);
1189
+ this._materialize(e);
1032
1190
  return;
1033
1191
  }
1034
- const o = r[0].from, i = r[r.length - 1].to;
1035
- t >= o && t <= i && this._materialize(t);
1192
+ const a = o[0].from, u = o[o.length - 1].to;
1193
+ e >= a && e <= u && this._materialize(e);
1036
1194
  return;
1037
1195
  }
1038
- t !== void 0 && this._materialize(t);
1196
+ e !== void 0 && this._materialize(e);
1039
1197
  }
1040
1198
  /**
1041
1199
  * @private
@@ -1047,15 +1205,55 @@ class Nt {
1047
1205
  * @param {boolean} chooseLowerBound - When true, finds the smallest index meeting or exceeding the target; otherwise finds the largest index not exceeding it.
1048
1206
  * @returns {{ index: number; total: number | undefined; cumulative: number | undefined; currentValue: number | undefined; safeIndex: number | undefined }} Binary search result.
1049
1207
  */
1050
- _findIndex(e, t = {}, n) {
1208
+ _findIndex(t, e = {}, n) {
1209
+ if (this.size >= Number.MAX_SAFE_INTEGER)
1210
+ return this._findIndexLarge(t, e, n);
1051
1211
  if (this.size === 0)
1052
1212
  return { index: -1, total: this.total ?? 0, cumulative: void 0, currentValue: void 0, safeIndex: void 0 };
1053
- let r = 0, o = this.size - 1, i = -1, a, f = this.total;
1054
- for (; r <= o; ) {
1055
- const c = Math.floor((r + o) / 2);
1056
- a = this.prefixSum(c, t), f = a.total, (n ? a.cumulative >= e : a.cumulative <= e) ? (i = c, n ? o = c - 1 : r = c + 1) : n ? r = c + 1 : o = c - 1;
1213
+ let o = 0, a = this.size - 1, u = -1, f, l = this.total;
1214
+ for (; o <= a; ) {
1215
+ const c = Math.floor((o + a) / 2);
1216
+ f = this.prefixSum(c, e), l = f.total, (n ? f.cumulative >= t : f.cumulative <= t) ? (u = c, n ? a = c - 1 : o = c + 1) : n ? o = c + 1 : a = c - 1;
1057
1217
  }
1058
- return { index: i, total: f, cumulative: a?.cumulative, currentValue: a?.currentValue, safeIndex: a?.safeIndex };
1218
+ return { index: u, total: l, cumulative: f?.cumulative, currentValue: f?.currentValue, safeIndex: f?.safeIndex };
1219
+ }
1220
+ /**
1221
+ * Executes a binary search using bigint arithmetic for extremely large sizes.
1222
+ *
1223
+ * 非常に大きなサイズに対して bigint 演算を用いた二分探索を実施。
1224
+ */
1225
+ _findIndexLarge(t, e, n) {
1226
+ if (this.size === 0)
1227
+ return { index: -1, total: this.total ?? 0, cumulative: void 0, currentValue: void 0, safeIndex: void 0 };
1228
+ const o = nn(this.size);
1229
+ if (o === 0n)
1230
+ return { index: -1, total: this.total ?? 0, cumulative: void 0, currentValue: void 0, safeIndex: void 0 };
1231
+ let a = 0n, u = o - 1n, f, l, c, d = this.total;
1232
+ for (; a <= u; ) {
1233
+ const T = a + u >> 1n, k = Number(T), _ = this.prefixSum(k, e);
1234
+ if (c = _, d = _.total, n ? _.cumulative >= t : _.cumulative <= t)
1235
+ if (f = T, l = _, n) {
1236
+ if (T === 0n)
1237
+ break;
1238
+ u = T - 1n;
1239
+ } else
1240
+ a = T + 1n;
1241
+ else if (n)
1242
+ a = T + 1n;
1243
+ else {
1244
+ if (T === 0n)
1245
+ break;
1246
+ u = T - 1n;
1247
+ }
1248
+ }
1249
+ const h = l ?? c;
1250
+ return {
1251
+ index: f !== void 0 ? Number(f) : -1,
1252
+ total: d,
1253
+ cumulative: h?.cumulative,
1254
+ currentValue: h?.currentValue,
1255
+ safeIndex: h?.safeIndex
1256
+ };
1059
1257
  }
1060
1258
  /**
1061
1259
  * @method prefixSum
@@ -1065,18 +1263,22 @@ class Nt {
1065
1263
  * @param {MaterializeConfig} [options] - Optional settings for materializing values.
1066
1264
  * @returns {{ cumulative: number; total: number | undefined; currentValue: number; safeIndex: number }} The cumulative sum of values from index 0 to the given index, the total sum, and the value at the given index.
1067
1265
  */
1068
- prefixSum(e, t) {
1069
- if (e < 0)
1266
+ prefixSum(t, e) {
1267
+ if (t < 0)
1070
1268
  return { cumulative: 0, total: this.total, currentValue: 0, safeIndex: 0 };
1071
- const n = W(e, 0, this.size - 1), r = t?.materializeOption;
1072
- this._materializeRanges(r, n, !0);
1073
- let o = 0, i = n + 1;
1074
- for (; i > 0; ) {
1075
- const f = this.tree.get(i) ?? 0;
1076
- o += f, i -= i & -i;
1269
+ const n = pt(t, 0, this.size - 1), o = e?.materializeOption;
1270
+ this._materializeRanges(o, n, !0);
1271
+ let a = 0, u = n + 1;
1272
+ for (; u > 0; ) {
1273
+ const l = this.tree.get(u) ?? 0;
1274
+ a += l;
1275
+ const c = ie(u);
1276
+ if (c === 0)
1277
+ break;
1278
+ u -= c;
1077
1279
  }
1078
- const a = r?.materialize ? this.get(n) : (this.deltas.get(n) || 0) + this.baseValue;
1079
- return { cumulative: o + this.baseValue * (n + 1), total: this.total, currentValue: a, safeIndex: n };
1280
+ const f = o?.materialize ? this.get(n) : (this.deltas.get(n) || 0) + this.baseValue;
1281
+ return { cumulative: a + this.baseValue * (n + 1), total: this.total, currentValue: f, safeIndex: n };
1080
1282
  }
1081
1283
  /**
1082
1284
  * @method get
@@ -1086,11 +1288,11 @@ class Nt {
1086
1288
  * @param {MaterializeConfig} [options] - Optional settings for materializing values.
1087
1289
  * @returns {number} The value at the given index.
1088
1290
  */
1089
- get(e, t) {
1090
- if (e < 0 || e >= this.size)
1291
+ get(t, e) {
1292
+ if (t < 0 || t >= this.size)
1091
1293
  throw new Error("Index out of bounds");
1092
- const n = t?.materializeOption;
1093
- return this._materializeRanges(n, e), (this.deltas.get(e) ?? 0) + this.baseValue;
1294
+ const n = e?.materializeOption;
1295
+ return this._materializeRanges(n, t), (this.deltas.get(t) ?? 0) + this.baseValue;
1094
1296
  }
1095
1297
  /**
1096
1298
  * @method getTotal
@@ -1099,18 +1301,15 @@ class Nt {
1099
1301
  * @param {MaterializeConfig} [options] - Optional settings for materializing values.
1100
1302
  * @returns {number} The total sum of all values.
1101
1303
  */
1102
- getTotal(e) {
1103
- const t = e?.materializeOption;
1104
- if (this._materializeRanges(t), this.total === void 0)
1304
+ getTotal(t) {
1305
+ const e = t?.materializeOption;
1306
+ if (this._materializeRanges(e), this.total === void 0)
1105
1307
  if (this.size === 0)
1106
1308
  this.total = 0;
1107
1309
  else {
1108
- let n = this.baseValue * this.size;
1109
- for (const o of this.deltas.values())
1110
- n += o;
1111
- this.total = n;
1112
- const r = this.prefixSum(this.getSize() - 1);
1113
- console.assert(r.cumulative === r.total, "Inconsistent Fenwick Tree state");
1310
+ this.total = this._computeTreeTotal();
1311
+ const n = this.prefixSum(this.getSize() - 1);
1312
+ console.assert(n.cumulative === n.total, "Inconsistent Fenwick Tree state");
1114
1313
  }
1115
1314
  return this.total;
1116
1315
  }
@@ -1121,22 +1320,26 @@ class Nt {
1121
1320
  * @param {object} [options] - Optional settings for rebuilding.
1122
1321
  * @param {boolean} [options.materialize=false] - If true and `valueFn` is provided, re-materializes all values, recalculating `deltas` and `baseValue`.
1123
1322
  */
1124
- rebuildTree(e) {
1125
- if (e?.materialize && this.valueFn) {
1126
- const r = this.valueFn;
1127
- this.reset(this.size, (o) => r(o), { materialize: !0 });
1323
+ rebuildTree(t) {
1324
+ if (t?.materialize && this.valueFn) {
1325
+ const n = this.valueFn;
1326
+ this.reset(this.size, (o) => n(o), { materialize: !0 });
1128
1327
  return;
1129
1328
  }
1130
- const t = /* @__PURE__ */ new Map();
1131
- let n = this.baseValue * this.size;
1132
- for (const [r, o] of this.deltas.entries()) {
1133
- if (n += o, o === 0)
1329
+ const e = /* @__PURE__ */ new Map();
1330
+ for (const [n, o] of this.deltas.entries()) {
1331
+ if (o === 0)
1134
1332
  continue;
1135
- let i = r + 1;
1136
- for (; i <= this.size; )
1137
- t.set(i, (t.get(i) ?? 0) + o), i += i & -i;
1333
+ let a = n + 1;
1334
+ for (; a <= this.size; ) {
1335
+ e.set(a, (e.get(a) ?? 0) + o);
1336
+ const u = ie(a);
1337
+ if (u === 0)
1338
+ break;
1339
+ a += u;
1340
+ }
1138
1341
  }
1139
- this.tree = t, this.total = n;
1342
+ this.tree = e, this.total = this._computeTreeTotal();
1140
1343
  }
1141
1344
  /**
1142
1345
  * @method calculateAccumulatedError
@@ -1147,10 +1350,10 @@ class Nt {
1147
1350
  calculateAccumulatedError() {
1148
1351
  if (this.total === void 0)
1149
1352
  return 0;
1150
- let e = this.baseValue * this.size;
1151
- for (const t of this.deltas.values())
1152
- e += t;
1153
- return this.total - e;
1353
+ let t = this.baseValue * this.size;
1354
+ for (const e of this.deltas.values())
1355
+ t += e;
1356
+ return this.total - t;
1154
1357
  }
1155
1358
  /**
1156
1359
  * @method changeSize
@@ -1158,14 +1361,14 @@ class Nt {
1158
1361
  * @description Fenwick Tree のサイズを変更する。
1159
1362
  * @param {number} newSize - The new size of the tree.
1160
1363
  */
1161
- changeSize(e) {
1162
- const t = this.size;
1163
- if (e === t)
1364
+ changeSize(t) {
1365
+ const e = this.size;
1366
+ if (t === e)
1164
1367
  return;
1165
- if (e < t)
1166
- for (const r of this.deltas.keys())
1167
- r >= e && this.deltas.delete(r);
1168
- this.size = e, this.rebuildTree();
1368
+ if (t < e)
1369
+ for (const o of this.deltas.keys())
1370
+ o >= t && this.deltas.delete(o);
1371
+ this.size = t, this.rebuildTree();
1169
1372
  const n = this.prefixSum(this.getSize() - 1);
1170
1373
  console.assert(n.cumulative === n.total, "Inconsistent Fenwick Tree state");
1171
1374
  }
@@ -1183,44 +1386,44 @@ class Nt {
1183
1386
  * @description Finds the first index where the cumulative sum is greater than or equal to a target value.
1184
1387
  * @description 累積和がターゲット値以上になる最初のインデックスを検索。
1185
1388
  * @param {number} target - The target cumulative sum.
1186
- * @param {MaterializeConfig} [options] - Optional settings for materializing values.
1187
- * @param {MaterializeOption} [options.materializeOption] - Options to control materialization.
1188
- * @param {boolean} [options.materializeOption.materialize=false] - Whether to materialize values.
1189
- * @param {MaterializeRange[]} [options.materializeOption.ranges] - Optional ranges for eager materialization.
1389
+ * @param {MaterializeConfig} [options] - Optional settings for materializing values.
1390
+ * @param {MaterializeOption} [options.materializeOption] - Options to control materialization.
1391
+ * @param {boolean} [options.materializeOption.materialize=false] - Whether to materialize values.
1392
+ * @param {MaterializeRange[]} [options.materializeOption.ranges] - Optional ranges for eager materialization.
1190
1393
  * @returns {{ index: number, total: number | undefined, cumulative: number | undefined, currentValue: number | undefined, safeIndex: number | undefined }} The 0-based index and the total sum, or -1 if not found.
1191
1394
  */
1192
- findIndexAtOrAfter(e, t) {
1193
- return this._findIndex(e, t ?? {}, !0);
1395
+ findIndexAtOrAfter(t, e) {
1396
+ return this._findIndex(t, e ?? {}, !0);
1194
1397
  }
1195
1398
  /**
1196
1399
  * @method findIndexAtOrBefore
1197
1400
  * @description Finds the last index where the cumulative sum is less than or equal to a target value.
1198
1401
  * @description 累積和がターゲット値以下になる最後のインデックスを検索。
1199
1402
  * @param {number} target - The target cumulative sum.
1200
- * @param {MaterializeConfig} [options] - Optional settings for materializing values.
1201
- * @param {MaterializeOption} [options.materializeOption] - Options to control materialization。
1202
- * @param {boolean} [options.materializeOption.materialize=false] - Whether to materialize values。
1203
- * @param {MaterializeRange[]} [options.materializeOption.ranges] - Optional ranges for eager materialization。
1403
+ * @param {MaterializeConfig} [options] - Optional settings for materializing values.
1404
+ * @param {MaterializeOption} [options.materializeOption] - Options to control materialization。
1405
+ * @param {boolean} [options.materializeOption.materialize=false] - Whether to materialize values。
1406
+ * @param {MaterializeRange[]} [options.materializeOption.ranges] - Optional ranges for eager materialization。
1204
1407
  * @returns {{ index: number, total: number | undefined, cumulative: number | undefined, currentValue: number | undefined, safeIndex: number | undefined }} The 0-based index and the total sum, or -1 if not found.
1205
1408
  */
1206
- findIndexAtOrBefore(e, t) {
1207
- return this._findIndex(e, t ?? {}, !1);
1409
+ findIndexAtOrBefore(t, e) {
1410
+ return this._findIndex(t, e ?? {}, !1);
1208
1411
  }
1209
1412
  }
1210
- const Ot = (s, e, t) => {
1211
- const n = Math.max(0, s), r = F(null), o = Te(() => new Nt(n, e, t), [n, e, t]);
1212
- return Object.is(r.current, o) || console.warn("[useFenwickMapTree] instance changed"), r.current = o, o;
1413
+ const on = (r, t, e) => {
1414
+ const n = Math.max(0, r), o = w(null), a = Vt(() => new rn(n, t, e), [n, t, e]);
1415
+ return Object.is(o.current, a) || console.warn("[useFenwickMapTree] instance changed"), o.current = a, a;
1213
1416
  };
1214
- class zt {
1417
+ class sn {
1215
1418
  key;
1216
1419
  value;
1217
1420
  prev = null;
1218
1421
  next = null;
1219
- constructor(e, t) {
1220
- this.key = e, this.value = t;
1422
+ constructor(t, e) {
1423
+ this.key = t, this.value = e;
1221
1424
  }
1222
1425
  }
1223
- class nt {
1426
+ class Pe {
1224
1427
  head = null;
1225
1428
  tail = null;
1226
1429
  /**
@@ -1229,8 +1432,8 @@ class nt {
1229
1432
  * @description ノードをリストの末尾に追加し、最も最近使用されたものとしてマークします。
1230
1433
  * @param {DoublyLinkedListNode<K, V>} node - The node to add.
1231
1434
  */
1232
- addToTail(e) {
1233
- this.tail ? (this.tail.next = e, e.prev = this.tail, this.tail = e) : this.head = this.tail = e;
1435
+ addToTail(t) {
1436
+ this.tail ? (this.tail.next = t, t.prev = this.tail, this.tail = t) : this.head = this.tail = t;
1234
1437
  }
1235
1438
  /**
1236
1439
  * @method remove
@@ -1238,8 +1441,8 @@ class nt {
1238
1441
  * @description 指定されたノードをリストから削除します。
1239
1442
  * @param {DoublyLinkedListNode<K, V>} node - The node to remove.
1240
1443
  */
1241
- remove(e) {
1242
- 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;
1444
+ remove(t) {
1445
+ t.prev ? t.prev.next = t.next : this.head = t.next, t.next ? t.next.prev = t.prev : this.tail = t.prev, t.prev = null, t.next = null;
1243
1446
  }
1244
1447
  /**
1245
1448
  * @method removeHead
@@ -1248,8 +1451,8 @@ class nt {
1248
1451
  * @returns {DoublyLinkedListNode<K, V> | null} The removed head node, or null if the list is empty.
1249
1452
  */
1250
1453
  removeHead() {
1251
- const e = this.head;
1252
- return e && this.remove(e), e;
1454
+ const t = this.head;
1455
+ return t && this.remove(t), t;
1253
1456
  }
1254
1457
  /**
1255
1458
  * @method moveToTail
@@ -1257,199 +1460,566 @@ class nt {
1257
1460
  * @description 既存のノードをリストの末尾に移動し、最も最近使用されたものとしてマークします。
1258
1461
  * @param {DoublyLinkedListNode<K, V>} node - The node to move.
1259
1462
  */
1260
- moveToTail(e) {
1261
- this.remove(e), this.addToTail(e);
1463
+ moveToTail(t) {
1464
+ this.remove(t), this.addToTail(t);
1262
1465
  }
1263
1466
  }
1264
- function kt(s) {
1265
- const e = F(/* @__PURE__ */ new Map()), t = F(new nt());
1266
- se(() => {
1267
- for (; e.current.size > s; ) {
1268
- const c = t.current.removeHead();
1269
- if (c)
1270
- e.current.delete(c.key);
1467
+ function an(r) {
1468
+ const t = w(/* @__PURE__ */ new Map()), e = w(new Pe());
1469
+ L(() => {
1470
+ for (; t.current.size > r; ) {
1471
+ const d = e.current.removeHead();
1472
+ if (d)
1473
+ t.current.delete(d.key);
1271
1474
  else
1272
1475
  break;
1273
1476
  }
1274
- }, [s]);
1275
- const n = y((c) => {
1276
- const u = e.current.get(c);
1277
- if (u)
1278
- return t.current.moveToTail(u), u.value;
1279
- }, []), r = y(
1280
- (c, u) => {
1281
- if (s <= 0)
1477
+ }, [r]);
1478
+ const n = M((d) => {
1479
+ const h = t.current.get(d);
1480
+ if (h)
1481
+ return e.current.moveToTail(h), h.value;
1482
+ }, []), o = M(
1483
+ (d, h) => {
1484
+ if (r <= 0)
1282
1485
  return;
1283
- let p = e.current.get(c);
1284
- if (p)
1285
- p.value = u, t.current.moveToTail(p);
1486
+ let b = t.current.get(d);
1487
+ if (b)
1488
+ b.value = h, e.current.moveToTail(b);
1286
1489
  else {
1287
- if (e.current.size >= s) {
1288
- const E = t.current.removeHead();
1289
- E && e.current.delete(E.key);
1490
+ if (t.current.size >= r) {
1491
+ const T = e.current.removeHead();
1492
+ T && t.current.delete(T.key);
1290
1493
  }
1291
- p = new zt(c, u), e.current.set(c, p), t.current.addToTail(p);
1494
+ b = new sn(d, h), t.current.set(d, b), e.current.addToTail(b);
1292
1495
  }
1293
1496
  },
1294
- [s]
1295
- ), o = y((c) => e.current.has(c), []), i = y(() => {
1296
- e.current.clear(), t.current = new nt();
1297
- }, []), [a, f] = pe(() => ({ get: n, set: r, has: o, clear: i }));
1298
- return se(() => f({ get: n, set: r, has: o, clear: i }), [n, r, o, i]), a;
1497
+ [r]
1498
+ ), a = M((d) => t.current.has(d), []), u = M((d) => {
1499
+ const h = t.current.get(d);
1500
+ h && (e.current.remove(h), t.current.delete(d));
1501
+ }, []), f = M(() => {
1502
+ t.current.clear(), e.current = new Pe();
1503
+ }, []), [l, c] = Yt(() => ({ get: n, set: o, has: a, remove: u, clear: f }));
1504
+ return L(() => c({ get: n, set: o, has: a, remove: u, clear: f }), [n, o, a, u, f]), l;
1299
1505
  }
1300
- const Yt = 1e4, jt = () => {
1301
- const { get: s, set: e, has: t, clear: n } = kt(Yt);
1302
- return { get: s, set: e, has: t, clear: n };
1303
- }, be = (s, e) => e <= 0 ? 0 : W(s, 0, e - 1), Ht = (s, e, t, n, r, o) => {
1506
+ const ln = 1e4, Tn = () => {
1507
+ const { get: r, set: t, has: e, clear: n } = an(ln);
1508
+ return { get: r, set: t, has: e, clear: n };
1509
+ }, lt = (r, t) => t <= 0 ? 0 : pt(r, 0, t - 1), cn = (r) => ({
1510
+ top: Math.max(0, r?.top ?? 0),
1511
+ bottom: Math.max(0, r?.bottom ?? 0)
1512
+ }), qt = (r, t) => r <= t ? 0 : r - t, Qt = (r, t) => r <= 0 ? t : r + t, Se = (r) => {
1513
+ if (!Number.isFinite(r))
1514
+ return 0n;
1515
+ const t = Math.trunc(r);
1516
+ return t <= 0 ? 0n : BigInt(t);
1517
+ }, un = (r, t, e, n, o, a, u, f) => {
1518
+ const l = Se(n);
1519
+ if (l === 0n)
1520
+ return { renderingStartIndex: 0, renderingEndIndex: 0, visibleStartIndex: 0, visibleEndIndex: 0 };
1521
+ const c = (D) => D < 0n ? 0n : D >= l ? l - 1n : D, d = { materializeOption: { materialize: !1 } }, { index: h } = a.findIndexAtOrAfter(r, d);
1522
+ let b;
1523
+ h === -1 ? b = l - 1n : (b = Se(h), b >= l && (b = l - 1n)), r <= 0 && (b = 0n), f && r >= u && (b = l - 1n);
1524
+ const T = (D) => {
1525
+ let X = 0, O = D, R = D, H = 0n;
1526
+ for (; O < l && X < t; ) {
1527
+ const q = Number(O), N = o(q);
1528
+ if (X += N, R = O, O += 1n, H += 1n, !Number.isFinite(N) || N <= 0)
1529
+ break;
1530
+ }
1531
+ return H === 0n && (R = D), { height: X, end: R };
1532
+ };
1533
+ let { height: k, end: _ } = T(b);
1534
+ if (k < t && b > 0n) {
1535
+ let D = b, X = k;
1536
+ for (; D > 0n && X < t; ) {
1537
+ D -= 1n;
1538
+ const R = Number(D), H = o(R);
1539
+ if (X += H, !Number.isFinite(H) || H <= 0)
1540
+ break;
1541
+ }
1542
+ b = c(D);
1543
+ const O = T(b);
1544
+ k = O.height, _ = O.end;
1545
+ }
1546
+ const tt = c(b), Y = c(_), ut = c(tt - BigInt(Math.max(0, e))), V = c(Y + BigInt(Math.max(0, e)));
1547
+ return {
1548
+ renderingStartIndex: lt(Number(ut), n),
1549
+ renderingEndIndex: lt(Number(V), n),
1550
+ visibleStartIndex: lt(Number(tt), n),
1551
+ visibleEndIndex: lt(Number(Y), n)
1552
+ };
1553
+ }, dn = (r, t, e, n, o, a) => {
1304
1554
  if (n === 0)
1305
1555
  return { renderingStartIndex: 0, renderingEndIndex: 0, visibleStartIndex: 0, visibleEndIndex: 0 };
1306
- const { index: i, cumulative: a, currentValue: f } = o.findIndexAtOrAfter(s, { materializeOption: { materialize: !1 } }), c = i === -1 ? 0 : i, u = i !== -1 && (a ?? 0) < s + (f ?? 0) ? c + 1 : c, p = be(u, n), E = be(p - t, n);
1307
- let A = 0, O = p;
1308
- for (; O < n && A < e; )
1309
- A += r(O), O++;
1310
- const te = be(O - 1, n), X = be(te + t, n);
1311
- return { renderingStartIndex: E, renderingEndIndex: X, visibleStartIndex: p, visibleEndIndex: te };
1312
- };
1313
- function $t({ itemCount: s, getItem: e, getItemHeight: t, viewportSize: n, overscanCount: r = 5, className: o, onScroll: i, onRangeChange: a, children: f, background: c, initialScrollIndex: u, initialScrollOffset: p, tapScrollCircleOptions: E, scrollBarWidth: A, enableThumbDrag: O, enableTrackClick: te, enableArrowButtons: X, enablePointerDrag: ne, inertiaOptions: S, renderThumbOverlay: ce, wheelSpeedMultiplier: le }, G) {
1314
- const C = F(null), K = F(!1);
1315
- se(() => (K.current = !0, () => {
1316
- K.current = !1;
1317
- }), []);
1318
- const I = F({ size: s, valueOrFn: t, options: { sampleRange: { from: 0, to: 100 } } }), x = Ot(I.current.size, I.current.valueOrFn, I.current.options), [$] = pe(() => {
1319
- let b = 0, T = 0;
1320
- if (typeof u == "number") {
1321
- const V = W(u, 0, s - 1), J = W(V - r * 2, 0, s - 1), oe = W(V + r * 2, 0, s - 1), q = u > 0 ? { materializeOption: { materialize: !0, ranges: [{ from: J, to: oe }] } } : void 0, { cumulative: Q, total: ie, currentValue: j } = x.prefixSum(u, q);
1322
- b = Q - j, T = ie ?? x.getTotal();
1323
- } else typeof p == "number" && (b = p), T = x.getTotal();
1324
- return { position: b, total: T };
1325
- }), [d, M] = pe($.position), [z, Z] = pe($.total), [h, _] = pe($.position), [g, P] = pe(s);
1326
- Ae(() => {
1327
- x.setValueFn(t), g !== s && (x.changeSize(s), P(s));
1328
- const b = x.getTotal();
1329
- z !== b && Z(b);
1330
- }, [x, g, s, z, t]), Ae(() => {
1331
- h !== null && C.current && (ae.debug("[VirtualScroll] Scrolling to position:", h), C.current.scrollTo(h), _(null));
1332
- }, [h]);
1333
- const R = y(
1334
- (b) => {
1335
- if (!C.current)
1556
+ const u = a.getTotal(), f = Number.isFinite(u), l = f ? Math.min(r, u) : r;
1557
+ if (n > Number.MAX_SAFE_INTEGER)
1558
+ return un(l, t, e, n, o, a, u, f);
1559
+ const { index: c, cumulative: d, currentValue: h } = a.findIndexAtOrAfter(l, { materializeOption: { materialize: !1 } }), b = c === -1 ? t <= 0 || (d ?? 0) < l + (h ?? 0) ? n - 1 : 0 : c;
1560
+ let T = lt(b, n), k = 0, _ = T;
1561
+ for (; _ < n && k < t; )
1562
+ k += o(_), _++;
1563
+ if (k < t && T > 0) {
1564
+ let V = k, D = T - 1;
1565
+ for (; D >= 0 && V < t; )
1566
+ V += o(D), D--;
1567
+ for (T = lt(D + 1, n), k = 0, _ = T; _ < n && k < t; )
1568
+ k += o(_), _++;
1569
+ }
1570
+ const tt = lt(T - e, n), Y = lt(Math.max(_ - 1, T), n), ut = lt(Y + e, n);
1571
+ return { renderingStartIndex: tt, renderingEndIndex: ut, visibleStartIndex: T, visibleEndIndex: Y };
1572
+ }, fn = () => typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), ve = (r, t, e) => {
1573
+ const n = Math.max(0, t ?? 0), o = w({
1574
+ lastInvokeAt: 0,
1575
+ rafId: null,
1576
+ pendingPayload: null,
1577
+ loopActive: !1,
1578
+ normalizedThrottle: n
1579
+ }), a = M(() => {
1580
+ const l = o.current;
1581
+ l.rafId !== null && typeof cancelAnimationFrame == "function" && cancelAnimationFrame(l.rafId), l.rafId = null, l.loopActive = !1;
1582
+ }, []), u = M(
1583
+ (l) => {
1584
+ const c = o.current;
1585
+ c.rafId = null;
1586
+ const d = typeof l == "number" ? l : fn(), h = c.normalizedThrottle, b = c.pendingPayload, T = r.current;
1587
+ if (b !== null && T) {
1588
+ const k = d - c.lastInvokeAt;
1589
+ (h === 0 || c.lastInvokeAt === 0 || k >= h) && (c.pendingPayload = null, c.lastInvokeAt = d, e(T, b));
1590
+ }
1591
+ if (c.pendingPayload !== null) {
1592
+ typeof requestAnimationFrame == "function" ? c.rafId = requestAnimationFrame(u) : c.loopActive = !1;
1336
1593
  return;
1337
- const T = be(b, g), V = be(T - r * 2, g), J = be(T + r * 2, g), { cumulative: oe, total: q, currentValue: Q } = x.prefixSum(T, { materializeOption: { materialize: !0, ranges: [{ from: V, to: J }] } });
1338
- ae.debug("[VirtualScroll] Scrolling to index:", T, "Offset:", oe, "Total height:", q, "Current value:", Q, "safeIndexFrom:", V, "safeIndexTo:", J), q && (Z(q), _(oe - Q), ae.debug("[VirtualScroll] Setting scroll position to:", oe - Q));
1594
+ }
1595
+ c.loopActive = !1;
1339
1596
  },
1340
- [x, r, g]
1341
- ), k = y(
1342
- (b) => {
1343
- if (!C.current)
1597
+ [r, e]
1598
+ ), f = M(() => {
1599
+ const l = o.current;
1600
+ if (!l.loopActive) {
1601
+ if (l.loopActive = !0, typeof requestAnimationFrame == "function") {
1602
+ l.rafId = requestAnimationFrame(u);
1344
1603
  return;
1345
- const T = x.getTotal(), V = W(Math.floor(b), 0, T), J = x.findIndexAtOrAfter(V, { materializeOption: { materialize: !1 } }).index;
1346
- R(J);
1604
+ }
1605
+ l.loopActive = !1;
1606
+ }
1607
+ }, [u]);
1608
+ return L(() => () => {
1609
+ a(), o.current.pendingPayload = null;
1610
+ }, [a]), L(() => {
1611
+ a();
1612
+ const l = o.current;
1613
+ l.lastInvokeAt = 0, l.pendingPayload = null, l.normalizedThrottle = n;
1614
+ }, [n, a]), M(
1615
+ (l) => {
1616
+ const c = o.current;
1617
+ c.pendingPayload = l, f();
1347
1618
  },
1348
- [x, R]
1349
- ), L = y(
1350
- (b, T) => {
1351
- ae.debug("[VirtualScroll] Scroll position changed:", b), M(b);
1352
- const V = x.getTotal();
1353
- i?.(b, V);
1619
+ [f]
1620
+ );
1621
+ }, pn = ({
1622
+ itemCount: r,
1623
+ getItem: t,
1624
+ getItemHeight: e,
1625
+ viewportSize: n,
1626
+ overscanCount: o = 15,
1627
+ className: a,
1628
+ onScroll: u,
1629
+ onRangeChange: f,
1630
+ children: l,
1631
+ background: c,
1632
+ initialScrollIndex: d,
1633
+ initialScrollOffset: h,
1634
+ tapScrollCircleOptions: b,
1635
+ scrollBarWidth: T,
1636
+ enableThumbDrag: k,
1637
+ enableTrackClick: _,
1638
+ enableArrowButtons: tt,
1639
+ enablePointerDrag: Y,
1640
+ inertiaOptions: ut,
1641
+ callbackThrottleMs: V = 5,
1642
+ renderThumbOverlay: D,
1643
+ wheelSpeedMultiplier: X,
1644
+ contentInsets: O,
1645
+ enableKeyboardNavigation: R = !0
1646
+ }, H) => {
1647
+ const q = w(null), N = w(!1), g = Vt(() => cn(O), [O]), C = w({ size: r, valueOrFn: e, options: { sampleRange: { from: 0, to: 100 } } }), P = on(C.current.size, C.current.valueOrFn, C.current.options), [j] = Yt(() => {
1648
+ let s = g.top, I = 0;
1649
+ if (typeof d == "number") {
1650
+ const y = pt(d, 0, r - 1), F = pt(y - o * 2, 0, r - 1), B = pt(y + o * 2, 0, r - 1), K = d > 0 ? { materializeOption: { materialize: !0, ranges: [{ from: F, to: B }] } } : void 0, { cumulative: Mt, total: zt, currentValue: Ft } = P.prefixSum(d, K), Xt = Math.max(Mt - Ft, 0);
1651
+ s = Qt(Xt, g.top), I = zt ?? P.getTotal();
1652
+ } else typeof h == "number" && (s = Qt(Math.max(h, 0), g.top)), I = P.getTotal();
1653
+ return { position: s, total: I };
1654
+ }), [rt, Ct] = Yt(j.position), [ot, $] = Yt(j.total), [ct, dt] = Yt(j.position), [A, S] = Yt(r), v = w(j.position), it = w(g.top), W = w(u ?? void 0), G = w(f ?? void 0), ft = w(/* @__PURE__ */ new Map()), et = w(null), st = w(null);
1655
+ L(() => {
1656
+ W.current = u ?? void 0, G.current = f ?? void 0;
1657
+ }, [f, u]);
1658
+ const nt = M(
1659
+ (s) => {
1660
+ if (R && s && typeof s.focus == "function")
1661
+ try {
1662
+ s.focus({ preventScroll: !0 });
1663
+ } catch {
1664
+ s.focus();
1665
+ }
1354
1666
  },
1355
- [x, i]
1356
- ), v = Te(() => {
1357
- const b = Ht(d, n, r, g, t, x);
1358
- return ae.debug("[VirtualScroll] Calculated rendering range:", {
1359
- ...b,
1360
- scrollPosition: d,
1361
- renderingContentSize: x.getTotal(),
1362
- overscanCount: r,
1667
+ [R]
1668
+ ), gt = ve(W, V, (s, { position: I, totalHeight: y }) => {
1669
+ s(I, y);
1670
+ }), mt = ve(G, V, (s, { renderingStartIndex: I, renderingEndIndex: y, visibleStartIndex: F, visibleEndIndex: B, scrollPosition: K, totalHeight: Mt }) => {
1671
+ s(I, y, F, B, K, Mt);
1672
+ });
1673
+ L(() => (N.current = !0, () => {
1674
+ N.current = !1;
1675
+ }), []), L(() => {
1676
+ R || (ft.current.clear(), et.current = null, st.current = null);
1677
+ }, [R]);
1678
+ const xt = 0.01, St = w({
1679
+ rafId: null,
1680
+ loopActive: !1,
1681
+ idleFrames: 0,
1682
+ lastRenderedPosition: j.position
1683
+ }), Et = M(() => {
1684
+ const s = St.current;
1685
+ s.rafId !== null && typeof cancelAnimationFrame == "function" && cancelAnimationFrame(s.rafId), s.rafId = null, s.loopActive = !1, s.idleFrames = 0;
1686
+ }, []);
1687
+ L(
1688
+ () => () => {
1689
+ Et();
1690
+ },
1691
+ [Et]
1692
+ );
1693
+ const Dt = M(() => {
1694
+ const s = St.current;
1695
+ s.rafId = null;
1696
+ const I = v.current, y = qt(I, g.top), F = P.getTotal();
1697
+ if (Ct((K) => Math.abs(K - I) < xt ? K : I), gt({ position: y, totalHeight: F }), Math.abs(s.lastRenderedPosition - I) >= xt ? (s.lastRenderedPosition = I, s.idleFrames = 0) : s.idleFrames += 1, s.idleFrames >= 2) {
1698
+ Et();
1699
+ return;
1700
+ }
1701
+ if (typeof requestAnimationFrame == "function") {
1702
+ s.rafId = requestAnimationFrame(Dt);
1703
+ return;
1704
+ }
1705
+ s.loopActive = !1;
1706
+ }, [P, g.top, gt, Et]), p = M(() => {
1707
+ const s = St.current;
1708
+ if (s.idleFrames = 0, !s.loopActive) {
1709
+ if (s.loopActive = !0, typeof requestAnimationFrame == "function") {
1710
+ s.rafId = requestAnimationFrame(Dt);
1711
+ return;
1712
+ }
1713
+ s.loopActive = !1;
1714
+ }
1715
+ }, [Dt]), m = M(
1716
+ (s, I) => {
1717
+ const y = I?.immediate ?? !1, F = qt(s, g.top);
1718
+ if (v.current = s, y) {
1719
+ St.current.lastRenderedPosition = s, St.current.idleFrames = 0, Ct(s), gt({ position: F, totalHeight: P.getTotal() });
1720
+ return;
1721
+ }
1722
+ p();
1723
+ },
1724
+ [p, P, g.top, gt]
1725
+ ), ht = w(!1);
1726
+ L(() => {
1727
+ if (!ht.current)
1728
+ if (ht.current = !0, typeof h == "number") {
1729
+ const s = Qt(Math.max(h, 0), g.top), I = Math.abs(s - v.current) > 0.5;
1730
+ m(s, { immediate: !0 }), I && dt(s);
1731
+ } else
1732
+ m(v.current, { immediate: !0 });
1733
+ }, [h, g.top, m]), se(() => {
1734
+ P.setValueFn(e), A !== r && (P.changeSize(r), S(r));
1735
+ const s = P.getTotal();
1736
+ ot !== s && $(s);
1737
+ }, [P, A, r, ot, e]), se(() => {
1738
+ ct !== null && q.current && (wt.debug("[VirtualScroll] Scrolling to position:", ct), q.current.scrollTo(ct), dt(null));
1739
+ }, [ct]), L(() => {
1740
+ const s = it.current;
1741
+ if (s === g.top)
1742
+ return;
1743
+ const I = qt(v.current, s), y = Qt(I, g.top);
1744
+ it.current = g.top, v.current = y, dt(y), m(y, { immediate: !0 });
1745
+ }, [g.top, m]);
1746
+ const Z = M(
1747
+ (s) => {
1748
+ if (!q.current)
1749
+ return;
1750
+ const I = lt(s, A), y = lt(I - o * 2, A), F = lt(I + o * 2, A), { cumulative: B, total: K, currentValue: Mt } = P.prefixSum(I, { materializeOption: { materialize: !0, ranges: [{ from: y, to: F }] } });
1751
+ if (wt.debug("[VirtualScroll] Scrolling to index:", I, "Offset:", B, "Total height:", K, "Current value:", Mt, "safeIndexFrom:", y, "safeIndexTo:", F), !K)
1752
+ return;
1753
+ const zt = Math.max(B - Mt, 0), Ft = Qt(zt, g.top);
1754
+ $(K), dt(Ft), wt.debug("[VirtualScroll] Setting scroll position to:", Ft);
1755
+ },
1756
+ [P, o, A, g.top]
1757
+ ), z = M(
1758
+ (s) => {
1759
+ if (!q.current)
1760
+ return;
1761
+ const I = P.getTotal(), y = pt(Math.floor(s), 0, I), F = P.findIndexAtOrAfter(y, { materializeOption: { materialize: !1 } }).index;
1762
+ Z(F);
1763
+ },
1764
+ [P, Z]
1765
+ ), Rt = M(
1766
+ (s) => {
1767
+ const I = qt(v.current, g.top), y = typeof s == "function" ? s(I) : s;
1768
+ z(y);
1769
+ const F = q.current?.getScrollPosition(), B = typeof F == "number" ? F : v.current;
1770
+ return m(B), B;
1771
+ },
1772
+ [g.top, z, m]
1773
+ ), It = M(
1774
+ (s, I) => {
1775
+ wt.debug("[VirtualScroll] Scroll position changed:", s), m(s);
1776
+ },
1777
+ [m]
1778
+ ), At = Vt(() => qt(rt, g.top), [g.top, rt]), Tt = Vt(() => {
1779
+ const s = dn(At, n, o, A, e, P);
1780
+ return wt.debug("[VirtualScroll] Calculated rendering range:", {
1781
+ ...s,
1782
+ scrollPosition: At,
1783
+ renderingContentSize: P.getTotal(),
1784
+ overscanCount: o,
1363
1785
  viewportSize: n
1364
- }), b;
1365
- }, [d, n, r, g, t, x]);
1366
- se(() => {
1367
- const b = C.current?.getScrollPosition() ?? 0;
1368
- ae.debug("[VirtualScroll] Range change effect triggered", {
1369
- renderingStartIndex: v.renderingStartIndex,
1370
- renderingEndIndex: v.renderingEndIndex,
1371
- visibleStartIndex: v.visibleStartIndex,
1372
- visibleEndIndex: v.visibleEndIndex,
1373
- scrollPosition: d,
1374
- contentSize: z,
1375
- scrollPaneScrollPosition: b
1376
- }), a?.(v.renderingStartIndex, v.renderingEndIndex, v.visibleStartIndex, v.visibleEndIndex, d, z);
1377
- }, [v.renderingStartIndex, v.renderingEndIndex, v.visibleStartIndex, v.visibleEndIndex, a, d, z]);
1378
- const w = y(
1379
- (b) => {
1380
- const { renderingStartIndex: T, renderingEndIndex: V } = v;
1381
- if (ae.debug("[VirtualScroll] Rendering visible items", { currentScrollPosition: b, renderingStartIndex: T, renderingEndIndex: V, fenwickSize: g, viewportSize: n }), g === 0)
1382
- return /* @__PURE__ */ H("div", { className: "absolute w-full", style: { top: 0 }, children: /* @__PURE__ */ H("div", { className: "text-center text-gray-500", children: "No items" }) });
1383
- const J = be(T, g), { cumulative: oe, currentValue: q } = x.prefixSum(J, { materializeOption: { materialize: !1 } }), Q = oe - q, ie = [], j = [];
1384
- for (let D = T; D <= V; D++) {
1385
- const l = t(D);
1386
- ie.push({ item: e(D), height: l, index: D }), x.get(D) !== l && j.push({ index: D, value: l });
1786
+ }), s;
1787
+ }, [At, n, o, A, e, P]), { renderingStartIndex: _t, renderingEndIndex: Ut, visibleStartIndex: vt, visibleEndIndex: Ot } = Tt, at = M(
1788
+ (s, I) => {
1789
+ if (!R || A === 0)
1790
+ return;
1791
+ const y = lt(s, A);
1792
+ if (!(I?.ensureVisible ?? !0)) {
1793
+ const Wt = ft.current.get(y);
1794
+ Wt && (et.current = null, st.current = y, nt(Wt));
1795
+ return;
1796
+ }
1797
+ const B = P.prefixSum(y, { materializeOption: { materialize: !1 } }), K = B.currentValue, Mt = Math.max(B.cumulative - K, 0), zt = Mt + K, Ft = qt(v.current, g.top), Xt = Ft + n;
1798
+ if (Mt < Ft || zt > Xt) {
1799
+ et.current = y, Z(y);
1800
+ return;
1801
+ }
1802
+ const Ht = ft.current.get(y);
1803
+ if (Ht) {
1804
+ et.current = null, st.current = y, nt(Ht);
1805
+ return;
1806
+ }
1807
+ et.current = y;
1808
+ },
1809
+ [R, A, P, g.top, Z, nt, n]
1810
+ ), yt = M(
1811
+ (s, I) => {
1812
+ if (!R || s.defaultPrevented || s.altKey || s.metaKey || s.ctrlKey)
1813
+ return;
1814
+ const y = s.target;
1815
+ if (y) {
1816
+ const F = y.tagName;
1817
+ if (F === "INPUT" || F === "TEXTAREA" || F === "SELECT" || y.isContentEditable)
1818
+ return;
1819
+ }
1820
+ if (s.key === "ArrowDown") {
1821
+ I < A - 1 && (s.preventDefault(), at(I + 1));
1822
+ return;
1823
+ }
1824
+ if (s.key === "ArrowUp") {
1825
+ I > 0 && (s.preventDefault(), at(I - 1));
1826
+ return;
1827
+ }
1828
+ if (s.key === "PageDown") {
1829
+ if (I < A - 1) {
1830
+ s.preventDefault();
1831
+ const F = Math.max(Ot - vt + 1, 1), B = Math.max(F, 1), K = lt(Math.min(I + B, A - 1), A);
1832
+ at(K);
1833
+ }
1834
+ return;
1835
+ }
1836
+ if (s.key === "PageUp" && I > 0) {
1837
+ s.preventDefault();
1838
+ const F = Math.max(Ot - vt + 1, 1), B = Math.max(F, 1), K = lt(I - B, A);
1839
+ at(K);
1840
+ }
1841
+ },
1842
+ [R, A, at, Ot, vt]
1843
+ ), Bt = M(
1844
+ (s) => {
1845
+ if (!R)
1846
+ return;
1847
+ const I = lt(s, A);
1848
+ et.current = null, st.current = I;
1849
+ },
1850
+ [R, A]
1851
+ );
1852
+ L(() => {
1853
+ const s = q.current?.getScrollPosition() ?? 0, I = v.current, y = qt(I, g.top);
1854
+ wt.debug("[VirtualScroll] Range change effect triggered", {
1855
+ renderingStartIndex: _t,
1856
+ renderingEndIndex: Ut,
1857
+ visibleStartIndex: vt,
1858
+ visibleEndIndex: Ot,
1859
+ scrollPositionState: rt,
1860
+ paneScrollPosition: I,
1861
+ logicalScrollPosition: y,
1862
+ contentSize: ot,
1863
+ scrollPaneScrollPosition: s
1864
+ }), mt({
1865
+ renderingStartIndex: _t,
1866
+ renderingEndIndex: Ut,
1867
+ visibleStartIndex: vt,
1868
+ visibleEndIndex: Ot,
1869
+ scrollPosition: y,
1870
+ totalHeight: ot
1871
+ });
1872
+ }, [ot, Ut, _t, g.top, mt, rt, Ot, vt]);
1873
+ const te = M(
1874
+ (s) => {
1875
+ const I = (V ?? 0) > 0, y = Math.abs(s - rt), F = I && y > 0.5 ? rt : s, B = qt(F, g.top);
1876
+ if (wt.debug("[VirtualScroll] Rendering visible items", {
1877
+ currentScrollPosition: s,
1878
+ effectiveScrollPosition: B,
1879
+ renderingStartIndex: _t,
1880
+ renderingEndIndex: Ut,
1881
+ fenwickSize: A,
1882
+ viewportSize: n,
1883
+ callbackThrottleMs: V,
1884
+ diff: y,
1885
+ rawEffectiveScrollPosition: F
1886
+ }), A === 0)
1887
+ return /* @__PURE__ */ Q("div", { className: "absolute w-full", style: { top: 0 }, children: /* @__PURE__ */ Q("div", { className: "text-center text-gray-500", children: "No items" }) });
1888
+ const K = lt(_t, A), Mt = lt(Ut, A), { cumulative: zt, currentValue: Ft } = P.prefixSum(K, { materializeOption: { materialize: !1 } }), Xt = zt - Ft, $t = [], Ht = [];
1889
+ for (let U = K; U <= Mt; U++) {
1890
+ const Kt = e(U);
1891
+ P.get(U) !== Kt && $t.push({ index: U, value: Kt });
1892
+ const { cumulative: ee, currentValue: i } = P.prefixSum(U, { materializeOption: { materialize: !1 } }), x = ee - i, E = (J) => {
1893
+ if (!J) {
1894
+ ft.current.delete(U);
1895
+ return;
1896
+ }
1897
+ R && (ft.current.set(U, J), et.current === U && (et.current = null, st.current = U, nt(J)));
1898
+ };
1899
+ Ht.push(
1900
+ /* @__PURE__ */ Q(
1901
+ "div",
1902
+ {
1903
+ ref: E,
1904
+ "data-index": U,
1905
+ "data-virtualscroll-item": "true",
1906
+ style: {
1907
+ position: "absolute",
1908
+ top: x - Xt + g.top,
1909
+ width: "100%"
1910
+ },
1911
+ tabIndex: R ? -1 : void 0,
1912
+ onKeyDownCapture: R ? (J) => yt(J, U) : void 0,
1913
+ onFocusCapture: R ? () => Bt(U) : void 0,
1914
+ children: l(t(U), U)
1915
+ },
1916
+ U
1917
+ )
1918
+ );
1387
1919
  }
1388
- j.length > 0 && Promise.resolve().then(() => {
1389
- const D = x.updates(j);
1390
- D && (Z(D), ae.debug("[VirtualScroll] Updated heights for items", j, "New total height:", D));
1920
+ $t.length > 0 && Promise.resolve().then(() => {
1921
+ if (!N.current)
1922
+ return;
1923
+ const U = P.updates($t);
1924
+ if (!N.current || typeof U != "number")
1925
+ return;
1926
+ $(U), wt.debug("[VirtualScroll] Updated heights for items", $t, "New total height:", U);
1927
+ const Kt = q.current?.getScrollPosition() ?? v.current;
1928
+ Kt === v.current || !N.current || m(Kt);
1391
1929
  });
1392
- const ge = z < n ? 0 : Q - b;
1393
- return ae.debug("[VirtualScroll] Rendering items", { visibleItems: ie, containerTop: ge }), /* @__PURE__ */ H("div", { className: "absolute w-full", style: { top: ge }, children: ie.map(({ item: D, index: l }) => {
1394
- const B = be(l, g), { cumulative: U, currentValue: N } = x.prefixSum(B, { materializeOption: { materialize: !1 } }), ue = U - N;
1395
- return /* @__PURE__ */ H(
1396
- "div",
1397
- {
1398
- "data-index": l,
1399
- style: {
1400
- position: "absolute",
1401
- top: ue - Q,
1402
- width: "100%"
1930
+ const Wt = Xt - B;
1931
+ if (g.bottom > 0) {
1932
+ const U = P.getTotal() + g.top - Xt;
1933
+ Ht.push(
1934
+ /* @__PURE__ */ Q(
1935
+ "div",
1936
+ {
1937
+ style: {
1938
+ position: "absolute",
1939
+ top: U,
1940
+ height: g.bottom,
1941
+ width: "100%"
1942
+ }
1403
1943
  },
1404
- children: f(D, l)
1405
- },
1406
- l
1944
+ "virtualscroll-bottom-inset"
1945
+ )
1407
1946
  );
1408
- }) });
1947
+ }
1948
+ return wt.debug("[VirtualScroll] Rendering items", {
1949
+ nodeCount: Ht.length,
1950
+ containerTop: Wt,
1951
+ logicalScrollPosition: At,
1952
+ resolvedInsets: g,
1953
+ effectiveScrollPosition: B
1954
+ }), /* @__PURE__ */ Q("div", { className: "absolute w-full", style: { top: Wt }, children: Ht });
1409
1955
  },
1410
- [e, f, z, n, v, x, g, t]
1956
+ [
1957
+ V,
1958
+ l,
1959
+ R,
1960
+ P,
1961
+ A,
1962
+ t,
1963
+ e,
1964
+ Bt,
1965
+ yt,
1966
+ At,
1967
+ Ut,
1968
+ _t,
1969
+ g,
1970
+ rt,
1971
+ nt,
1972
+ m,
1973
+ n
1974
+ ]
1411
1975
  );
1412
- return Ye(G, () => ({
1413
- getScrollPosition: () => C.current?.getScrollPosition() ?? -1,
1414
- getContentSize: () => C.current?.getContentSize() ?? -1,
1415
- getViewportSize: () => C.current?.getViewportSize() ?? -1,
1416
- scrollTo: k,
1417
- scrollToIndex: R,
1418
- getFenwickTreeTotalHeight: () => x.getTotal(),
1419
- getFenwickSize: () => x.getSize()
1420
- }), [k, R, x]), /* @__PURE__ */ H(
1421
- Dt,
1976
+ he(
1977
+ H,
1978
+ () => ({
1979
+ getScrollPosition: () => q.current?.getScrollPosition() ?? -1,
1980
+ getContentSize: () => q.current?.getContentSize() ?? -1,
1981
+ getViewportSize: () => q.current?.getViewportSize() ?? -1,
1982
+ scrollTo: Rt,
1983
+ scrollToIndex: Z,
1984
+ getFenwickTreeTotalHeight: () => P.getTotal(),
1985
+ getFenwickSize: () => P.getSize(),
1986
+ focusItemAtIndex: at
1987
+ }),
1988
+ [Rt, Z, P, at]
1989
+ );
1990
+ const ae = ot + g.top + g.bottom;
1991
+ return /* @__PURE__ */ Q(
1992
+ en,
1422
1993
  {
1423
- ref: C,
1424
- contentSize: z,
1994
+ ref: q,
1995
+ contentSize: ae,
1425
1996
  viewportSize: n,
1426
- className: o,
1427
- onScroll: L,
1997
+ className: a,
1998
+ onScroll: It,
1428
1999
  background: c,
1429
- tapScrollCircleOptions: E,
1430
- inertiaOptions: S,
1431
- itemCount: s,
1432
- scrollBarWidth: A,
1433
- enableThumbDrag: O,
1434
- enableTrackClick: te,
1435
- enableArrowButtons: X,
1436
- enablePointerDrag: ne,
1437
- renderThumbOverlay: ce,
1438
- wheelSpeedMultiplier: le,
1439
- children: w
2000
+ tapScrollCircleOptions: b,
2001
+ inertiaOptions: ut,
2002
+ itemCount: r,
2003
+ scrollBarWidth: T,
2004
+ enableThumbDrag: k,
2005
+ enableTrackClick: _,
2006
+ enableArrowButtons: tt,
2007
+ enablePointerDrag: Y,
2008
+ renderThumbOverlay: D,
2009
+ wheelSpeedMultiplier: X,
2010
+ contentInsets: g,
2011
+ children: te
1440
2012
  }
1441
2013
  );
1442
- }
1443
- const Wt = ke($t);
2014
+ }, bn = me(pn);
1444
2015
  export {
1445
- Nt as FenwickMapTree,
1446
- Lt as ScrollBar,
1447
- Dt as ScrollPane,
1448
- Wt as VirtualScroll,
1449
- W as minmax,
1450
- qt as tapScrollCircleSampleVisual,
1451
- Ot as useFenwickMapTree,
1452
- jt as useHeightCache,
1453
- kt as useLruCache
2016
+ rn as FenwickMapTree,
2017
+ tn as ScrollBar,
2018
+ en as ScrollPane,
2019
+ bn as VirtualScroll,
2020
+ pt as minmax,
2021
+ In as tapScrollCircleSampleVisual,
2022
+ on as useFenwickMapTree,
2023
+ Tn as useHeightCache,
2024
+ an as useLruCache
1454
2025
  };
1455
- //# sourceMappingURL=index.js.map