@aiquants/virtualscroll 1.20.0 → 1.22.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +5 -3
  3. package/dist/ScrollBar.d.cts +123 -0
  4. package/dist/ScrollBar.d.ts +123 -0
  5. package/dist/ScrollBar.d.ts.map +1 -1
  6. package/dist/ScrollPane.d.cts +16 -0
  7. package/dist/ScrollPane.d.ts +16 -0
  8. package/dist/ScrollPane.d.ts.map +1 -1
  9. package/dist/VirtualScroll.d.cts +9 -0
  10. package/dist/VirtualScroll.d.ts +9 -0
  11. package/dist/VirtualScroll.d.ts.map +1 -1
  12. package/dist/_headFenwick.d.cts +450 -0
  13. package/dist/_headFenwick.d.ts +451 -0
  14. package/dist/_headFenwick.d.ts.map +1 -0
  15. package/dist/index.cjs +1 -1
  16. package/dist/index.d.cts +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1468 -1360
  20. package/dist/styles/virtualscroll.css +1 -1
  21. package/dist/styles/virtualscroll.standalone.css +1 -1
  22. package/dist/tapScrollCircleSampleVisual.d.ts.map +1 -1
  23. package/dist/useFenwickMapTree.d.cts +43 -0
  24. package/dist/useFenwickMapTree.d.ts +43 -0
  25. package/dist/useFenwickMapTree.d.ts.map +1 -1
  26. package/package.json +4 -1
  27. package/src/ScrollBar.tsx +211 -33
  28. package/src/ScrollPane.tsx +232 -19
  29. package/src/VirtualScroll.tsx +11 -1
  30. package/src/index.ts +1 -1
  31. package/src/styles/virtualscroll.css +3 -3
  32. package/src/tapScrollCircleSampleVisual.tsx +22 -5
  33. package/src/useFenwickMapTree.ts +95 -13
  34. package/src/ScrollBar.spec.tsx +0 -620
  35. package/src/ScrollPane.spec.tsx +0 -496
  36. package/src/TapScrollCircle.spec.tsx +0 -275
  37. package/src/VirtualScroll.spec.ts +0 -641
  38. package/src/cli.server.spec.ts +0 -137
  39. package/src/logger.spec.ts +0 -128
  40. package/src/useFenwickMapTree.huge.spec.ts +0 -388
  41. package/src/useFenwickMapTree.spec.ts +0 -1518
  42. package/src/useLruCache.spec.ts +0 -382
  43. package/src/utils.spec.ts +0 -39
package/CHANGELOG.md ADDED
@@ -0,0 +1,73 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@aiquants/virtualscroll` are documented here.
4
+
5
+ ## 1.21.0 — Unreleased
6
+
7
+ ### Breaking
8
+
9
+ - **`maxSpeedCurve` now shapes the ramp instead of capping the ceiling.** Previously the
10
+ exponential curve was applied to `maxSpeed` and an easing was applied on top of that
11
+ (double application), so wherever the exponential ceiling fell below `minSpeed` the mapping
12
+ collapsed to `maxSpeed === minSpeed` — a **dead zone where pulling the circle changed nothing**.
13
+ Its width was governed by `exponentialSteepness`: with `minSpeedMultiplier: 0.2` and
14
+ `exponentialScale: 14`, a steepness of `1` wasted 2.43% of the pull, `3` wasted 8.0%,
15
+ `7.5` wasted 43.85% and `12` wasted 64.60%. The curve is now applied to the shape only and the
16
+ ceiling is distance-independent, so speed is strictly monotonic over the whole pull.
17
+ - **Consumers that pass `maxSpeedCurve` will feel different speeds.** Re-tune rather than
18
+ carrying old values over. Consumers that do **not** pass `maxSpeedCurve` are unaffected —
19
+ verified point-by-point against the previous implementation.
20
+ - **`easedOffset` changed meaning.** It is now a fraction of the whole `[minSpeed, maxSpeed]`
21
+ range applied at zero drag, re-mapped as `offset + (1 - offset) * shape` (the old additive
22
+ `min(1, shape + offset)` created a *flat region at the top* instead). With a large
23
+ `maxSpeedMultiplier` — including the automatic `itemCount`-derived one — even `0.1` starts the
24
+ list at several viewports per second. Raise `minSpeedMultiplier` instead when you only want a
25
+ faster floor. The bundled demo and the README example dropped `easedOffset` for this reason.
26
+ - **The `aqvs-sample-visual-*` class names were rotated to match their roles.** They were off by
27
+ one: the pupil carried `-rod`, the highlight carried `-pupil` and the tail carried `-highlight`,
28
+ so editing `.aqvs-sample-visual-highlight` restyled the tail. The CSS rule bodies were rotated
29
+ with them, so **every element renders exactly as before** — but a consumer that overrides these
30
+ class names must follow the rename (`-rod` → `-pupil`, `-pupil` → `-highlight`,
31
+ `-highlight` → `-rod`).
32
+ - **`FenwickMapTree.calculateAccumulatedError()` now only sums deltas inside `[0, size)`.**
33
+ `changeSize(0)` keeps deltas so a list that briefly empties during loading can reuse its measured
34
+ row heights; counting the out-of-range ones made the method report a non-zero error for a
35
+ perfectly healthy tree the whole time the list was empty (and `rebuildTree()` did not clear it).
36
+
37
+ ### Added
38
+
39
+ - `pointerDragInputs` on `ScrollPane` / `VirtualScrollBehaviorOptions` restricts content
40
+ drag-scrolling to specific pointer types, e.g. `["pen", "touch"]` to keep touch scrolling while
41
+ freeing the mouse for text selection. ⚠️ Do **not** use `enablePointerDrag: false` for that —
42
+ the pane is transform-based with no native scroller, so disabling drag removes the only way to
43
+ scroll on touch devices. `touch-action: none` is applied only when `"touch"` or `"pen"` is
44
+ allowed (`touch-action` affects pen input too).
45
+ - `computeTapScrollSpeed()` and `TapScrollSpeedInput` are exported so consumers can reproduce the
46
+ tap-circle speed mapping (for tuning tables, tests or alternative UIs).
47
+ - `FenwickMapTree.base` getter, used by `useFenwickMapTree` to decide whether a `0 → N` growth
48
+ re-samples or reuses preserved deltas. It is the base height, **not** a "has the tree warmed up"
49
+ flag — `0` is a legitimate base value.
50
+ - `data-testid="aqvs-scrollbar-thumb"` on the scrollbar thumb, so DOM hooks no longer need a class
51
+ selector.
52
+
53
+ ### Fixed
54
+
55
+ - Tap-scroll and inertia no longer fight over the scroll position. Inertia is cancelled both when a
56
+ pointer touches anywhere in the pane and whenever a scrollbar-originated scroll arrives, so the
57
+ exclusion holds regardless of order (and on paths with no `pointerdown`, such as the arrow-button
58
+ keyboard repeat). Position used to oscillate — measured 140 → 100 → 30 → 184.
59
+ - The inertia RAF loop reads the scroll seam through a ref, so a consumer swapping `onScroll`
60
+ mid-flick no longer keeps getting position updates on the discarded callback.
61
+ - An in-flight drag is now torn down when **any** of its three continuation conditions
62
+ (`enablePointerDrag`, `pointerDragInputs`, `isScrollable`) turns false. Previously a mid-drag
63
+ scrollability flip parked the pointer capture and replayed the dropped travel as a single jump
64
+ (measured: 190px of finger travel came back as 0 → 210).
65
+ - That teardown now carries the click suppression through to the end of the gesture, so scrolling
66
+ no longer activates the row under the finger.
67
+ - `FenwickMapTree.changeSize()` growing from `0` with preserved deltas rebuilds the tree instead of
68
+ taking the incremental path (which propagated no deltas at all and left `get()` and `getTotal()`
69
+ permanently disagreeing), and prunes deltas outside the new size so they cannot reappear as
70
+ another dataset's row heights.
71
+ - `computeTapScrollSpeed()` sanitizes every numeric input against `NaN` / `±Infinity` and clamps
72
+ `exponentialSteepness` to `700`. A non-finite speed used to poison the scroll position itself,
73
+ leaving the pane permanently unscrollable.
package/README.md CHANGED
@@ -195,7 +195,8 @@ A runnable version lives in the demo at **`/horizontal`** (`pnpm demo:dev`), and
195
195
 
196
196
  | Property | Type | Description |
197
197
  | --- | --- | --- |
198
- | `enablePointerDrag` | `boolean` | Enable dragging the content area to scroll |
198
+ | `enablePointerDrag` | `boolean` | Enable dragging the content area to scroll (default: true). ⚠️ Setting this to `false` removes the only way to scroll on touch devices — the pane is transform-based and has no native scroller. Use `pointerDragInputs` to exclude a single pointer type instead. |
199
+ | `pointerDragInputs` | `readonly ("mouse" \| "pen" \| "touch")[]` | Pointer types allowed to drag-scroll the content area (default: all three). `touch-action: none` is applied only when `"touch"` or `"pen"` is included. |
199
200
  | `enableKeyboardNavigation` | `boolean` | Enable keyboard navigation (default: true) |
200
201
  | `wheelSpeedMultiplier` | `number` | Multiplier for mouse wheel scrolling speed |
201
202
  | `inertiaOptions` | `ScrollPaneInertiaOptions` | Physics tuning for drag inertia |
@@ -339,7 +340,9 @@ The auxiliary tap scroll circle can replace the native scrollbar for large datas
339
340
 
340
341
  - **Adaptive speed scaling** automatically ramps up to a `120×` multiplier as `itemCount` grows (trillions supported).
341
342
  - **Manual overrides** let you clamp or extend speed via `maxSpeedMultiplier` when you need deterministic behavior.
342
- - **Exponential capping** enables distance-sensitive ceilings with `maxSpeedCurve`, blending gentle near-threshold drag with high-speed travel at extended distances. Use `easedOffset` to slightly raise the entry-level speed without changing the ceiling.
343
+ - **Speed shaping** with `maxSpeedCurve` controls how quickly the speed ramps up as you pull the circle, blending gentle near-threshold drag with high-speed travel at extended distances. The ceiling itself does not depend on the drag distance: `exponentialSteepness` shapes the ramp, and `exponentialScale` caps the ceiling (its effective value is `min(exponentialScale, maxSpeedMultiplier)`).
344
+ - ⚠️ `easedOffset` is **a fraction of the whole `[minSpeed, maxSpeed]` range applied at zero drag**, not a small nudge. With a large `maxSpeedMultiplier` (including the automatic `itemCount`-derived one) even `0.1` starts the list at several viewports per second and costs you the low-speed resolution. Raise `minSpeedMultiplier` instead when you only want a faster floor.
345
+ - **Per-pointer drag control**: `behaviorOptions.pointerDragInputs` restricts content drag-scrolling to specific pointer types, e.g. `["pen", "touch"]` to keep touch scrolling while freeing the mouse for text selection. Do **not** use `enablePointerDrag: false` for that — the pane has no native scroller, so disabling drag removes the only way to scroll on touch devices.
343
346
  - **Full layout control** (`size`, `offsetX`, `offsetY`) keeps the circle accessible on both desktop and touch devices.
344
347
  - **Visibility tuning** exposes an `opacity` knob so you can match subdued or high-contrast UI themes.
345
348
 
@@ -365,7 +368,6 @@ export function UltraFastExample() {
365
368
  maxSpeedCurve: {
366
369
  exponentialSteepness: 6,
367
370
  exponentialScale: 80,
368
- easedOffset: 0.1,
369
371
  },
370
372
  offsetX: -96,
371
373
  opacity: 0.85,
@@ -92,6 +92,129 @@ export type ScrollBarProps = {
92
92
  /** The index of the last visible item. / 最後の可視アイテムのインデックス。 */
93
93
  visibleEndIndex?: number;
94
94
  };
95
+ /**
96
+ * Defaults `computeTapScrollSpeed` callers need to reproduce the shipped speed mapping.
97
+ * `computeTapScrollSpeed` の呼び出し側が出荷時の速度写像を再現するために必要な既定値。
98
+ *
99
+ * ❗ これらは `ScrollBar` が `tapScrollCircleOptions` を解決するときに使う値そのもの。
100
+ * 公開しないと、`computeTapScrollSpeed` を渡された消費側が「自分の設定で実際に何 px/s 出るか」を
101
+ * 事前に検証できない (必須フィールドの大半が内部リゾルバの出力になってしまう)。
102
+ */
103
+ export declare const TAP_SCROLL_SPEED_DEFAULTS: {
104
+ /** 速度が最大に達する引き距離 (px)。`maxVisualDistance` の既定値。 */
105
+ readonly maxDistance: 240;
106
+ /** 最小速度倍率 (ビューポート比)。 */
107
+ readonly minSpeedMultiplier: 0.2;
108
+ };
109
+ /**
110
+ * Input for `computeTapScrollSpeed`.
111
+ * `computeTapScrollSpeed` の入力。
112
+ */
113
+ export type TapScrollSpeedInput = {
114
+ /** サークルを引いた距離 (px)。 */
115
+ distance: number;
116
+ /** 速度が最大に達する引き距離 (px)。 */
117
+ maxDistance: number;
118
+ /** ビューポートの長さ (px)。速度倍率の基準。 */
119
+ viewportSize: number;
120
+ /** 最小速度倍率 (ビューポート比)。 */
121
+ minSpeedMultiplier: number;
122
+ /** 最大速度倍率 (ビューポート比)。 */
123
+ maxSpeedMultiplier: number;
124
+ /** `maxSpeedMultiplier` が消費側から明示されたか (件数由来の自動値ではないか)。 */
125
+ hasCustomMaxSpeedMultiplier: boolean;
126
+ /** 速度の立ち上がり形状。未指定なら `normalized ** 1.1` の既定形状。 */
127
+ curve?: {
128
+ exponentialSteepness: number;
129
+ exponentialScale?: number;
130
+ easedOffset?: number;
131
+ };
132
+ };
133
+ /**
134
+ * Maps the tap-circle drag distance onto a scroll speed (px/s).
135
+ * タップサークルの引き距離をスクロール速度 (px/s) へ写像する処理。
136
+ *
137
+ * ❗ **曲線は「速度の上限」ではなく「立ち上がりの形状」を決める。**
138
+ * かつては指数カーブを上限 (`maxSpeed`) 側へ適用し、その `maxSpeed` へさらに
139
+ * イージングを掛けていた (二重適用)。その結果、指数側の上限が最小速度を下回る区間で
140
+ * `maxSpeed === minSpeed` へ潰れ、**引いても速度がまったく変わらない死角**が生まれていた。
141
+ * 死角の境界は `shape(n) = minSpeed / (viewportSize × exponentialScale)` を満たす点で、
142
+ * その**幅を支配するのは `exponentialSteepness`** である (比が同じ 0.2/14 でも
143
+ * steepness 1 なら引き幅の 2.4%、3 なら 8.0%、7.5 なら 43.9%、12 なら 64.6%)。
144
+ * `easedOffset` も同区間では完全に無効化されていた。
145
+ *
146
+ * そこで曲線は形状にのみ適用し、上限は距離に依存しない定数として扱う。
147
+ * これにより**縮退設定を除いて**速度は引き距離に対して狭義単調になり、平坦域が発生しない。
148
+ *
149
+ * 縮退設定 (意図的に定速へ倒す設定であり、欠陥ではない)。いずれも `maxSpeed === minSpeed`
150
+ * または `offset === 1` に潰れるため、引き距離に依らず定速になる:
151
+ *
152
+ * 1. `minSpeedMultiplier >= maxSpeedMultiplier` → 全域で最小速度に固定。
153
+ * `ScrollBar.spec.tsx` の `FIXED_SPEED_OPTIONS` がこれを利用している。
154
+ * 2. `easedOffset === 1` → 全域で最高速に固定。
155
+ * 3. `exponentialScale <= max(minSpeedMultiplier, 40 / viewportSize)` → 曲線側の上限が
156
+ * 最小速度以下に潰れるため全域で最小速度に固定。**旧実装の死角と同種の現象**だが、
157
+ * こちらは距離に依存しないので「一部区間だけ平坦」にはならず、全域が定速になる。
158
+ * 曲線を使うなら `exponentialScale > minSpeedMultiplier` を満たすこと。
159
+ *
160
+ * 各パラメータ:
161
+ *
162
+ * - `exponentialSteepness`: 立ち上がりの鋭さ。大きいほど低速域が長い。0 で線形。
163
+ * 内部で `[0, 700]` へ丸める (`Math.expm1` が `Infinity` になるのを避けるため)。
164
+ * - `exponentialScale`: 曲線側の上限 (ビューポート比)。省略時は `maxSpeedMultiplier`。
165
+ * 実効上限は `min(viewportSize × exponentialScale, linearMaxSpeed)` (いずれも `minSpeed` で下支え)。
166
+ * ❗ `maxSpeedMultiplier` を**明示した**場合は `linearMaxSpeed = viewportSize × maxSpeedMultiplier`
167
+ * なので「実効上限は `min(exponentialScale, maxSpeedMultiplier)` 倍」と読んでよいが、
168
+ * **省略した場合はそうならない**。自動倍率には 1,200 px/s の下限が掛かるため、
169
+ * 実効上限は `min(viewportSize × exponentialScale, max(viewportSize × 自動倍率, 1200))` になる
170
+ * (例: ビューポート 200・自動倍率 0.1・scale 0.5 なら、倍率比では 0.1 倍のはずが実際は 100 px/s)。
171
+ * - `easedOffset`: **速度レンジ全体 `[minSpeed, maxSpeed]` に対する比率**として、
172
+ * 引き距離 0 の時点で履かせる下駄 (0〜1)。
173
+ * ❗ **「微速の下駄」ではない。** `maxSpeedMultiplier` (特に件数由来の自動値) が
174
+ * 大きいほど絶対速度も比例して大きくなる。例: ビューポート 800px・実効上限 8 倍で
175
+ * `easedOffset: 0.18` なら引き距離 0 の時点で 1,283 px/s (160px 行なら毎秒 8 行) 出る。
176
+ * 低速域の分解能をその分だけ失うので、微速の下限を上げたいだけなら
177
+ * `minSpeedMultiplier` を上げる方が意図に忠実。
178
+ * ❗ 旧実装では下駄が `shape` への加算だったうえ、低速域は死角に飲まれて実質無効だった。
179
+ * 同じ値でも意味と絶対速度が変わるため、旧実装から値を持ち越さないこと。
180
+ *
181
+ * `maxSpeedMultiplier` を省略した場合の下限 1,200 px/s はビューポート非依存の絶対値で、
182
+ * 小さいビューポートほどビューポート比では速くなる (200px なら 6 vp/s、800px なら 1.5 vp/s)。
183
+ * 既存挙動との互換のため意図的に据え置いている。
184
+ *
185
+ * すべての数値入力は非有限 (NaN / ±Infinity) を代替値へ落として消毒する。
186
+ * 速度が NaN になると `scrollTo` を経てスクロール位置そのものが NaN で汚染され、
187
+ * 以後の相対移動が連鎖的に壊れて「スクロールが完全に効かなくなる」復旧不能な状態になるため。
188
+ *
189
+ * 外部から呼ぶときは `TAP_SCROLL_SPEED_DEFAULTS` と `computeAutoTapScrollMaxSpeedMultiplier()` を
190
+ * 併せて使うと、`ScrollBar` が実際に解決する値を再現できる:
191
+ *
192
+ * ```ts
193
+ * const options = { maxSpeedCurve: { exponentialSteepness: 3, exponentialScale: 8 } }
194
+ * const speed = computeTapScrollSpeed({
195
+ * distance,
196
+ * maxDistance: options.maxVisualDistance ?? TAP_SCROLL_SPEED_DEFAULTS.maxDistance,
197
+ * viewportSize,
198
+ * minSpeedMultiplier: options.minSpeedMultiplier ?? TAP_SCROLL_SPEED_DEFAULTS.minSpeedMultiplier,
199
+ * maxSpeedMultiplier: options.maxSpeedMultiplier ?? computeAutoTapScrollMaxSpeedMultiplier(itemCount),
200
+ * hasCustomMaxSpeedMultiplier: options.maxSpeedMultiplier !== undefined,
201
+ * curve: options.maxSpeedCurve,
202
+ * })
203
+ * ```
204
+ *
205
+ * @param input Drag distance and the resolved speed options. 引き距離と解決済みの速度設定。
206
+ * @returns Scroll speed in px/s (always finite, >= 40). px/s 単位のスクロール速度 (常に有限かつ 40 以上)。
207
+ */
208
+ export declare const computeTapScrollSpeed: ({ distance, maxDistance, viewportSize, minSpeedMultiplier, maxSpeedMultiplier, hasCustomMaxSpeedMultiplier, curve }: TapScrollSpeedInput) => number;
209
+ /**
210
+ * Computes the auto-scroll speed multiplier based on item count.
211
+ *
212
+ * アイテム数に応じた自動スクロール速度倍率を算出。
213
+ *
214
+ * @param itemCount Total number of items. アイテムの総数。
215
+ * @returns Speed multiplier relative to the viewport size. ビューポート比の速度倍率。
216
+ */
217
+ export declare const computeAutoTapScrollMaxSpeedMultiplier: (itemCount?: number) => number;
95
218
  /**
96
219
  * A custom scrollbar component.
97
220
  *
@@ -92,6 +92,129 @@ export type ScrollBarProps = {
92
92
  /** The index of the last visible item. / 最後の可視アイテムのインデックス。 */
93
93
  visibleEndIndex?: number;
94
94
  };
95
+ /**
96
+ * Defaults `computeTapScrollSpeed` callers need to reproduce the shipped speed mapping.
97
+ * `computeTapScrollSpeed` の呼び出し側が出荷時の速度写像を再現するために必要な既定値。
98
+ *
99
+ * ❗ これらは `ScrollBar` が `tapScrollCircleOptions` を解決するときに使う値そのもの。
100
+ * 公開しないと、`computeTapScrollSpeed` を渡された消費側が「自分の設定で実際に何 px/s 出るか」を
101
+ * 事前に検証できない (必須フィールドの大半が内部リゾルバの出力になってしまう)。
102
+ */
103
+ export declare const TAP_SCROLL_SPEED_DEFAULTS: {
104
+ /** 速度が最大に達する引き距離 (px)。`maxVisualDistance` の既定値。 */
105
+ readonly maxDistance: 240;
106
+ /** 最小速度倍率 (ビューポート比)。 */
107
+ readonly minSpeedMultiplier: 0.2;
108
+ };
109
+ /**
110
+ * Input for `computeTapScrollSpeed`.
111
+ * `computeTapScrollSpeed` の入力。
112
+ */
113
+ export type TapScrollSpeedInput = {
114
+ /** サークルを引いた距離 (px)。 */
115
+ distance: number;
116
+ /** 速度が最大に達する引き距離 (px)。 */
117
+ maxDistance: number;
118
+ /** ビューポートの長さ (px)。速度倍率の基準。 */
119
+ viewportSize: number;
120
+ /** 最小速度倍率 (ビューポート比)。 */
121
+ minSpeedMultiplier: number;
122
+ /** 最大速度倍率 (ビューポート比)。 */
123
+ maxSpeedMultiplier: number;
124
+ /** `maxSpeedMultiplier` が消費側から明示されたか (件数由来の自動値ではないか)。 */
125
+ hasCustomMaxSpeedMultiplier: boolean;
126
+ /** 速度の立ち上がり形状。未指定なら `normalized ** 1.1` の既定形状。 */
127
+ curve?: {
128
+ exponentialSteepness: number;
129
+ exponentialScale?: number;
130
+ easedOffset?: number;
131
+ };
132
+ };
133
+ /**
134
+ * Maps the tap-circle drag distance onto a scroll speed (px/s).
135
+ * タップサークルの引き距離をスクロール速度 (px/s) へ写像する処理。
136
+ *
137
+ * ❗ **曲線は「速度の上限」ではなく「立ち上がりの形状」を決める。**
138
+ * かつては指数カーブを上限 (`maxSpeed`) 側へ適用し、その `maxSpeed` へさらに
139
+ * イージングを掛けていた (二重適用)。その結果、指数側の上限が最小速度を下回る区間で
140
+ * `maxSpeed === minSpeed` へ潰れ、**引いても速度がまったく変わらない死角**が生まれていた。
141
+ * 死角の境界は `shape(n) = minSpeed / (viewportSize × exponentialScale)` を満たす点で、
142
+ * その**幅を支配するのは `exponentialSteepness`** である (比が同じ 0.2/14 でも
143
+ * steepness 1 なら引き幅の 2.4%、3 なら 8.0%、7.5 なら 43.9%、12 なら 64.6%)。
144
+ * `easedOffset` も同区間では完全に無効化されていた。
145
+ *
146
+ * そこで曲線は形状にのみ適用し、上限は距離に依存しない定数として扱う。
147
+ * これにより**縮退設定を除いて**速度は引き距離に対して狭義単調になり、平坦域が発生しない。
148
+ *
149
+ * 縮退設定 (意図的に定速へ倒す設定であり、欠陥ではない)。いずれも `maxSpeed === minSpeed`
150
+ * または `offset === 1` に潰れるため、引き距離に依らず定速になる:
151
+ *
152
+ * 1. `minSpeedMultiplier >= maxSpeedMultiplier` → 全域で最小速度に固定。
153
+ * `ScrollBar.spec.tsx` の `FIXED_SPEED_OPTIONS` がこれを利用している。
154
+ * 2. `easedOffset === 1` → 全域で最高速に固定。
155
+ * 3. `exponentialScale <= max(minSpeedMultiplier, 40 / viewportSize)` → 曲線側の上限が
156
+ * 最小速度以下に潰れるため全域で最小速度に固定。**旧実装の死角と同種の現象**だが、
157
+ * こちらは距離に依存しないので「一部区間だけ平坦」にはならず、全域が定速になる。
158
+ * 曲線を使うなら `exponentialScale > minSpeedMultiplier` を満たすこと。
159
+ *
160
+ * 各パラメータ:
161
+ *
162
+ * - `exponentialSteepness`: 立ち上がりの鋭さ。大きいほど低速域が長い。0 で線形。
163
+ * 内部で `[0, 700]` へ丸める (`Math.expm1` が `Infinity` になるのを避けるため)。
164
+ * - `exponentialScale`: 曲線側の上限 (ビューポート比)。省略時は `maxSpeedMultiplier`。
165
+ * 実効上限は `min(viewportSize × exponentialScale, linearMaxSpeed)` (いずれも `minSpeed` で下支え)。
166
+ * ❗ `maxSpeedMultiplier` を**明示した**場合は `linearMaxSpeed = viewportSize × maxSpeedMultiplier`
167
+ * なので「実効上限は `min(exponentialScale, maxSpeedMultiplier)` 倍」と読んでよいが、
168
+ * **省略した場合はそうならない**。自動倍率には 1,200 px/s の下限が掛かるため、
169
+ * 実効上限は `min(viewportSize × exponentialScale, max(viewportSize × 自動倍率, 1200))` になる
170
+ * (例: ビューポート 200・自動倍率 0.1・scale 0.5 なら、倍率比では 0.1 倍のはずが実際は 100 px/s)。
171
+ * - `easedOffset`: **速度レンジ全体 `[minSpeed, maxSpeed]` に対する比率**として、
172
+ * 引き距離 0 の時点で履かせる下駄 (0〜1)。
173
+ * ❗ **「微速の下駄」ではない。** `maxSpeedMultiplier` (特に件数由来の自動値) が
174
+ * 大きいほど絶対速度も比例して大きくなる。例: ビューポート 800px・実効上限 8 倍で
175
+ * `easedOffset: 0.18` なら引き距離 0 の時点で 1,283 px/s (160px 行なら毎秒 8 行) 出る。
176
+ * 低速域の分解能をその分だけ失うので、微速の下限を上げたいだけなら
177
+ * `minSpeedMultiplier` を上げる方が意図に忠実。
178
+ * ❗ 旧実装では下駄が `shape` への加算だったうえ、低速域は死角に飲まれて実質無効だった。
179
+ * 同じ値でも意味と絶対速度が変わるため、旧実装から値を持ち越さないこと。
180
+ *
181
+ * `maxSpeedMultiplier` を省略した場合の下限 1,200 px/s はビューポート非依存の絶対値で、
182
+ * 小さいビューポートほどビューポート比では速くなる (200px なら 6 vp/s、800px なら 1.5 vp/s)。
183
+ * 既存挙動との互換のため意図的に据え置いている。
184
+ *
185
+ * すべての数値入力は非有限 (NaN / ±Infinity) を代替値へ落として消毒する。
186
+ * 速度が NaN になると `scrollTo` を経てスクロール位置そのものが NaN で汚染され、
187
+ * 以後の相対移動が連鎖的に壊れて「スクロールが完全に効かなくなる」復旧不能な状態になるため。
188
+ *
189
+ * 外部から呼ぶときは `TAP_SCROLL_SPEED_DEFAULTS` と `computeAutoTapScrollMaxSpeedMultiplier()` を
190
+ * 併せて使うと、`ScrollBar` が実際に解決する値を再現できる:
191
+ *
192
+ * ```ts
193
+ * const options = { maxSpeedCurve: { exponentialSteepness: 3, exponentialScale: 8 } }
194
+ * const speed = computeTapScrollSpeed({
195
+ * distance,
196
+ * maxDistance: options.maxVisualDistance ?? TAP_SCROLL_SPEED_DEFAULTS.maxDistance,
197
+ * viewportSize,
198
+ * minSpeedMultiplier: options.minSpeedMultiplier ?? TAP_SCROLL_SPEED_DEFAULTS.minSpeedMultiplier,
199
+ * maxSpeedMultiplier: options.maxSpeedMultiplier ?? computeAutoTapScrollMaxSpeedMultiplier(itemCount),
200
+ * hasCustomMaxSpeedMultiplier: options.maxSpeedMultiplier !== undefined,
201
+ * curve: options.maxSpeedCurve,
202
+ * })
203
+ * ```
204
+ *
205
+ * @param input Drag distance and the resolved speed options. 引き距離と解決済みの速度設定。
206
+ * @returns Scroll speed in px/s (always finite, >= 40). px/s 単位のスクロール速度 (常に有限かつ 40 以上)。
207
+ */
208
+ export declare const computeTapScrollSpeed: ({ distance, maxDistance, viewportSize, minSpeedMultiplier, maxSpeedMultiplier, hasCustomMaxSpeedMultiplier, curve }: TapScrollSpeedInput) => number;
209
+ /**
210
+ * Computes the auto-scroll speed multiplier based on item count.
211
+ *
212
+ * アイテム数に応じた自動スクロール速度倍率を算出。
213
+ *
214
+ * @param itemCount Total number of items. アイテムの総数。
215
+ * @returns Speed multiplier relative to the viewport size. ビューポート比の速度倍率。
216
+ */
217
+ export declare const computeAutoTapScrollMaxSpeedMultiplier: (itemCount?: number) => number;
95
218
  /**
96
219
  * A custom scrollbar component.
97
220
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollBar.d.ts","sourceRoot":"","sources":["../src/ScrollBar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScrollBar.d.ts","sourceRoot":"","sources":["../src/ScrollBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAA;AAIrD,OAAO,EAA8E,KAAK,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAiEnJ;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACpC,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAA;IAC/D,4FAA4F;IAC5F,aAAa,CAAC,EAAE;QACZ,qEAAqE;QACrE,oBAAoB,EAAE,MAAM,CAAA;QAC5B,gEAAgE;QAChE,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,4EAA4E;QAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;CACJ,CAAA;AAaD,qIAAqI;AACrI,eAAO,MAAM,uBAAuB,oCAAoC,CAAA;AAExE;;;;GAIG;AACH,MAAM,MAAM,gCAAgC,GAAG;IAC3C,WAAW,EAAE,UAAU,GAAG,YAAY,CAAA;IACtC,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAA;IACnB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAA;IACpB,iDAAiD;IACjD,cAAc,EAAE,MAAM,CAAA;IACtB,wIAAwI;IACxI,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IACrH,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6DAA6D;IAC7D,sBAAsB,CAAC,EAAE,yBAAyB,CAAA;IAClD,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,SAAS,CAAA;IAC3E,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAQD;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB;IAClC,mDAAmD;;IAEnD,wBAAwB;;CAElB,CAAA;AAsNV;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,wBAAwB;IACxB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,wBAAwB;IACxB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,yDAAyD;IACzD,2BAA2B,EAAE,OAAO,CAAA;IACpC,kDAAkD;IAClD,KAAK,CAAC,EAAE;QAAE,oBAAoB,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5F,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,eAAO,MAAM,qBAAqB,GAAI,qHAAqH,mBAAmB,KAAG,MAuChL,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sCAAsC,GAAI,YAAY,MAAM,WASxE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,iQAiBvB,cAAc,gCAs9BhB,CAAA"}
@@ -47,6 +47,22 @@ export type ScrollPaneProps = {
47
47
  enableArrowButtons?: boolean;
48
48
  /** Whether dragging the content area scrolls the pane. / コンテンツ領域のドラッグでスクロールさせるかどうか。 */
49
49
  enablePointerDrag?: boolean;
50
+ /**
51
+ * Pointer types allowed to drag-scroll the content area.
52
+ * コンテンツ領域のドラッグスクロールを許可するポインタ種別。
53
+ *
54
+ * 既定は全種別 (`["mouse", "pen", "touch"]`)。
55
+ *
56
+ * ❗ **`enablePointerDrag` を丸ごと切ってはならない。** このペインはコンテンツを transform で
57
+ * 動かしておりネイティブのスクロール領域を持たない (`.aqvs-scroll-pane-content` は
58
+ * `overflow: hidden`)。ドラッグを無効にするとタッチ端末からスクロール手段が消える。
59
+ * マウスドラッグだけが困る (テキスト選択やクリック判定と競合する) 場合は、
60
+ * ここを `["pen", "touch"]` にして**入力種別ごとに**切ること。
61
+ *
62
+ * `touch-action: none` は `"touch"` が含まれるときだけ付与する。マウス専用に絞った場合に
63
+ * タッチのパンまで奪うと、スクロール手段が無いのに操作も奪う最悪の状態になるため。
64
+ */
65
+ pointerDragInputs?: readonly ("mouse" | "pen" | "touch")[];
50
66
  /** Optional renderer for thumb overlays. / サム付近に表示するオーバーレイのレンダラー。 */
51
67
  renderThumbOverlay?: (props: ScrollBarThumbOverlayRenderProps) => React.ReactNode;
52
68
  /** Multiplier applied to wheel delta for faster or slower scrolling. / スクロール速度を調整するためのホイールデルタの倍率。 */
@@ -47,6 +47,22 @@ export type ScrollPaneProps = {
47
47
  enableArrowButtons?: boolean;
48
48
  /** Whether dragging the content area scrolls the pane. / コンテンツ領域のドラッグでスクロールさせるかどうか。 */
49
49
  enablePointerDrag?: boolean;
50
+ /**
51
+ * Pointer types allowed to drag-scroll the content area.
52
+ * コンテンツ領域のドラッグスクロールを許可するポインタ種別。
53
+ *
54
+ * 既定は全種別 (`["mouse", "pen", "touch"]`)。
55
+ *
56
+ * ❗ **`enablePointerDrag` を丸ごと切ってはならない。** このペインはコンテンツを transform で
57
+ * 動かしておりネイティブのスクロール領域を持たない (`.aqvs-scroll-pane-content` は
58
+ * `overflow: hidden`)。ドラッグを無効にするとタッチ端末からスクロール手段が消える。
59
+ * マウスドラッグだけが困る (テキスト選択やクリック判定と競合する) 場合は、
60
+ * ここを `["pen", "touch"]` にして**入力種別ごとに**切ること。
61
+ *
62
+ * `touch-action: none` は `"touch"` が含まれるときだけ付与する。マウス専用に絞った場合に
63
+ * タッチのパンまで奪うと、スクロール手段が無いのに操作も奪う最悪の状態になるため。
64
+ */
65
+ pointerDragInputs?: readonly ("mouse" | "pen" | "touch")[];
50
66
  /** Optional renderer for thumb overlays. / サム付近に表示するオーバーレイのレンダラー。 */
51
67
  renderThumbOverlay?: (props: ScrollBarThumbOverlayRenderProps) => React.ReactNode;
52
68
  /** Multiplier applied to wheel delta for faster or slower scrolling. / スクロール速度を調整するためのホイールデルタの倍率。 */
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollPane.d.ts","sourceRoot":"","sources":["../src/ScrollPane.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScrollPane.d.ts","sourceRoot":"","sources":["../src/ScrollPane.tsx"],"names":[],"mappings":"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"}
@@ -64,6 +64,15 @@ export type VirtualScrollScrollBarOptions = {
64
64
  };
65
65
  export type VirtualScrollBehaviorOptions = {
66
66
  enablePointerDrag?: boolean;
67
+ /**
68
+ * Pointer types allowed to drag-scroll the content area (default: all).
69
+ * コンテンツ領域のドラッグスクロールを許可するポインタ種別 (既定: 全種別)。
70
+ *
71
+ * マウスドラッグだけが困る場合に `["pen", "touch"]` を指定する。
72
+ * `enablePointerDrag` を丸ごと切るとタッチ端末からスクロール手段が消えるため、
73
+ * 種別で絞れるならこちらを使うこと (`ScrollPaneProps["pointerDragInputs"]` 参照)。
74
+ */
75
+ pointerDragInputs?: ScrollPaneProps["pointerDragInputs"];
67
76
  enableKeyboardNavigation?: boolean;
68
77
  wheelSpeedMultiplier?: number;
69
78
  inertiaOptions?: ScrollPaneProps["inertiaOptions"];
@@ -64,6 +64,15 @@ export type VirtualScrollScrollBarOptions = {
64
64
  };
65
65
  export type VirtualScrollBehaviorOptions = {
66
66
  enablePointerDrag?: boolean;
67
+ /**
68
+ * Pointer types allowed to drag-scroll the content area (default: all).
69
+ * コンテンツ領域のドラッグスクロールを許可するポインタ種別 (既定: 全種別)。
70
+ *
71
+ * マウスドラッグだけが困る場合に `["pen", "touch"]` を指定する。
72
+ * `enablePointerDrag` を丸ごと切るとタッチ端末からスクロール手段が消えるため、
73
+ * 種別で絞れるならこちらを使うこと (`ScrollPaneProps["pointerDragInputs"]` 参照)。
74
+ */
75
+ pointerDragInputs?: ScrollPaneProps["pointerDragInputs"];
67
76
  enableKeyboardNavigation?: boolean;
68
77
  wheelSpeedMultiplier?: number;
69
78
  inertiaOptions?: ScrollPaneProps["inertiaOptions"];
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualScroll.d.ts","sourceRoot":"","sources":["../src/VirtualScroll.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VirtualScroll.d.ts","sourceRoot":"","sources":["../src/VirtualScroll.tsx"],"names":[],"mappings":"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"}