@aiquants/virtualscroll 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -36,11 +36,54 @@ export type VirtualScrollRange = {
36
36
  */
37
37
  export type VirtualScrollHandle = {
38
38
  /**
39
- * Scrolls to a LOGICAL position (updater form receives the current logical position).
39
+ * Jumps to a LOGICAL position (updater form receives the current logical position).
40
40
  * Returns the applied (clamped) LOGICAL position.
41
- * 論理位置へスクロール (updater は現在の論理位置を受け取る)。適用後 (クランプ後) の論理位置を返す。
41
+ * 論理位置へ**ジャンプ**する (updater は現在の論理位置を受け取る)。適用後 (クランプ後) の論理位置を返す。
42
+ *
43
+ * ❗ **連続的なスクロール入力 (ホイール等) の橋渡しには使わないこと。`scrollBy` を使う。**
44
+ * これは「行を狙って飛ぶ」ための API であり、ペイン自身のホイール処理とは意味が 2 点異なる:
45
+ *
46
+ * 1. **絶対位置を `Math.floor` する** (行解決のため)。デルタを足して渡すと 1px 未満の移動が
47
+ * 毎回消えるため、精密トラックパッドでは**一切動かない**。
48
+ * 2. **スクロールアンカーを張る** (`scrollToIndex` 経由)。狙った行に留まり続けるための仕様だが、
49
+ * 以後 `contentSize` / `itemCount` / `viewportSize` / インセットが変わるたびにドリフト補正が
50
+ * その行へ**再ピン留め**するため、絞り込みなどで一覧が過去の位置へ戻って見える。
51
+ *
52
+ * ❗ `scrollTo(handle.getScrollPosition() + delta)` と書かないこと。ペイン未接続時の
53
+ * `getScrollPosition()` は番兵 `-1` を返すため `-1 + delta` が混入する。相対移動は `scrollBy`
54
+ * (推奨) か updater 形式 `scrollTo(prev => prev + delta)` を使う (updater の `prev` は内部の
55
+ * 最新位置から取るため番兵が混入しない)。
42
56
  */
43
57
  scrollTo: (position: number | ((prev: number) => number)) => number;
58
+ /**
59
+ * Scrolls by a delta using the exact semantics of the pane's own wheel handling.
60
+ * ペイン自身のホイール処理と**同一の意味**でデルタ分スクロールする。
61
+ *
62
+ * ペインの外に置いた要素 (列ヘッダー帯・固定フッター・横スクロールバー行など) の上での
63
+ * ホイールを一覧へ橋渡しするための API。ホイールリスナーは `.aqvs-scroll-pane` にしか付かないため、
64
+ * ペイン外はホイールの死角になる。この口はその死角を埋める。
65
+ *
66
+ * `scrollTo` との違い (どちらもペイン自身のホイールと同じ扱いにするための選択):
67
+ *
68
+ * - **float のまま相対加算する** (丸めない)。1px 未満のデルタも積み上がって動く。
69
+ * - **アンカーを張らない**。手動スクロールとして扱われるため、保留アンカーはむしろ**解除される**
70
+ * (ペイン上でホイールを回したときと同じ)。以後のサイズ変化で位置が巻き戻ることがない。
71
+ * - 慣性は停止する (ペイン上のホイールと同じ)。
72
+ *
73
+ * @param delta - Signed pixels to scroll (positive scrolls down) / 符号付きの移動量 (正で下方向)
74
+ * @returns The applied (clamped) LOGICAL position / 適用後 (クランプ後) の論理位置
75
+ */
76
+ scrollBy: (delta: number) => number;
77
+ /**
78
+ * Applies one wheel event with the pane's own rules; returns whether it was consumed.
79
+ * ペイン自身の規則で 1 つのホイールイベントを適用し、消費したかどうかを返す。
80
+ *
81
+ * 一覧の**外**に置いた要素 (列ヘッダー帯・固定フッター・空表示など) のホイールを、ペイン内と
82
+ * 寸分違わぬ意味論で流し込むための唯一の口。軸分解・速度倍率・スクロール可否・横成分の委譲先・
83
+ * 慣性停止のすべてがペイン側の 1 箇所で決まるため、消費側が規則を書き直したり食い違わせたりできない。
84
+ * 直接呼ぶより `useWheelBridge` (passive:false 登録と後始末込み) を使うこと。
85
+ */
86
+ applyWheel: (event: WheelEvent) => boolean;
44
87
  /**
45
88
  * Current LOGICAL scroll position. -1 when the pane is not connected.
46
89
  * 現在の論理スクロール位置。ペイン未接続時は -1。
@@ -152,7 +195,21 @@ export type VirtualScrollProps<T> = {
152
195
  * さもないとキャッシュ済み高さが別のアイテムを指すインデックスに残る。
153
196
  */
154
197
  getItemHeight: (index: number) => number;
155
- viewportSize: number;
198
+ /**
199
+ * Size of the visible band (px). Omit it to let the component measure its own band.
200
+ * 可視帯の高さ (px)。省略するとコンポーネントが自分の帯を計測する。
201
+ *
202
+ * ❗ **省略が既定の使い方である。** この値は帯のクリップ窓・最大スクロール位置・つまみ写像・
203
+ * 描画枚数・スクロール可否のすべての基準であり、実際の帯と食い違うと 5 通りの壊れ方が
204
+ * **例外も警告も出さずに**発生する。自分で測れるものを消費側に渡させると、同じ正解を各画面で
205
+ * 書き直すことになり、実際に推測値や定数が代入される (詳細は `ScrollPaneProps.viewportSize`)。
206
+ *
207
+ * 省略時はホスト要素が高さを確定させていること (`h-full` / `flex-1` + `min-h-0` / 明示 px など)
208
+ * が前提で、高さが auto のホストでは帯が 0 のままになる (`Logger.warn` で警告する)。
209
+ * 明示する正当なケースは「帯の高さを計測ではなく算出で知っている」場合のみである
210
+ * (例: ドロップダウンが件数 × 行高から高さを決める)。
211
+ */
212
+ viewportSize?: number;
156
213
  overscanCount?: number;
157
214
  className?: string;
158
215
  /** Test id emitted as data-testid on the scroll root (DOM hooks must use data-* attributes, never class selectors). / スクロールルートに data-testid として出力されるテスト ID (DOM フックはクラスセレクタでなく data-* 属性を使う)。 */
@@ -184,8 +241,71 @@ export type VirtualScrollProps<T> = {
184
241
  onItemFocus?: (index: number) => void;
185
242
  scrollBarOptions?: VirtualScrollScrollBarOptions;
186
243
  behaviorOptions?: VirtualScrollBehaviorOptions;
187
- /** Delegates horizontal wheel/trackpad delta to an upstream owner (e.g. a frozen-column grid). / 横ホイール量を上流へ委譲する。 */
244
+ /** Delegates horizontal wheel/trackpad delta to an upstream owner (e.g. a frozen-column grid). / 横ホイール量を上流へ委譲する。
245
+ *
246
+ * ❗ **ホイール由来だけの口ではない。** `horizontalKeyInputs` を指定すると**キーボード由来の横量**も
247
+ * ここへ流れる。名前は 2.x で公開済みのため据え置くが、意味は「横軸が N px 動いた。横軸はあなたの所有物である」。
248
+ */
188
249
  onWheelHorizontal?: (deltaX: number) => void;
250
+ /**
251
+ * Keyboard gestures that emit a horizontal scroll delta through `onWheelHorizontal` (default: none).
252
+ * `onWheelHorizontal` へ横スクロール量を流すキーボード操作の種別 (既定: 無効)。
253
+ *
254
+ * - `[]` / 未指定 (既定): 横キーボードスクロールを行わない。
255
+ * - `["shift-arrow"]`: `Shift + ←/→` のみ。木の展開/折りたたみ (`←/→`) やグリッドのセル移動と
256
+ * 衝突しないため、既存の行 UI を持つ消費側でも安全に有効化できる。
257
+ * - `["arrow"]`: 素の `←/→` のみ。`Shift + ←/→` を選択範囲の拡張に使うグリッド向け。
258
+ * - `["arrow", "shift-arrow"]`: 両方。
259
+ *
260
+ * ❗ **配列なのは 4 状態が独立に必要だからである。** `"none" | "shift-arrows" | "arrows"` のような
261
+ * 段階的な文字列にすると `"arrows"` が `"shift-arrows"` を含んでしまい、「素の矢印だけ横スクロール、
262
+ * `Shift + ←/→` は消費側の範囲選択に残す」(Excel / データグリッドの標準) が**表現できない**。
263
+ * 同じ理由で種別配列を採るのが `pointerDragInputs` であり、本パッケージの既存の作法に揃えてある。
264
+ *
265
+ * ❗ **既定が無効なのは、行ハンドラを奪わないためである。** 本パッケージの行キーハンドラは
266
+ * capture フェーズに付くため、消費側の行 (bubble) より先に走る。既定で `←/→` を消費すると
267
+ * ツリーの展開/折りたたみのような既存操作を奪ってしまう。消費するのは `preventDefault()` のみで
268
+ * **伝播は止めない** (縦の矢印キーと同じ契約)。`stopPropagation()` は行ハンドラだけでなく
269
+ * `document` / `window` の bubble リスナーごとイベントを消し、ホットキーライブラリや
270
+ * キー入力のテレメトリまで巻き添えにするため採らない。消費側が二重動作を避ける手段は
271
+ * `defaultPrevented` の確認である。
272
+ *
273
+ * 前提: 横軸を所有するのは消費側なので、`onWheelHorizontal` が未指定なら何も起きない
274
+ * (キーイベントも消費しない)。行にフォーカスがあるときだけ働くため
275
+ * `behaviorOptions.enableKeyboardNavigation` も必要。
276
+ *
277
+ * ❗ **符号は物理キー基準** (`→` が正、`←` が負) である。横軸の向きを知っているのは消費側だけなので、
278
+ * RTL (`direction: rtl`) の一覧では消費側が受け取った値を反転すること。パッケージ側で
279
+ * `direction` を推測すると、横スクロールの実体 (CSS 変数・`scrollLeft`・transform) がどの要素の
280
+ * どの座標系かを知らないまま符号を決めることになり、当たらない前提を増やすだけになる。
281
+ *
282
+ * ❗ **働くのは行そのものにフォーカスがあるときだけである** (`event.target === event.currentTarget`)。
283
+ * 行の**中**の要素 (自作のタブ・ラジオ相当・スライダー相当など `role` だけで矢印キー操作を実装した
284
+ * ウィジェット、リンク、ネイティブの横スクロール領域) にフォーカスがある間は奪わない。
285
+ * 入力要素の allowlist だけでは `role` 実装のウィジェットを守れないため、対象そのもので判定する。
286
+ *
287
+ * 長押しの連続スクロールは **OS のキーリピート**に委ねる (`keydown` が繰り返し届く)。スクロールバーの
288
+ * 矢印ボタンが明示的なリピートタイマーを持つ (`ARROW_HOLD_DELAY` / `ARROW_HOLD_INTERVAL`) のは
289
+ * ポインタ押下にリピートが存在しないためで、キーボードとの非対称は入力機構の差に由来する。
290
+ *
291
+ * ❗ **`onWheelHorizontal` と同じ「横軸のシーム」に属するため、意図的にトップレベルに置いてある。**
292
+ * `behaviorOptions` の中へ入れると、横軸を自前で所有するラッパー (例: `@aiquants/directory-tree` は
293
+ * `Omit<VirtualScrollProps, "onWheelHorizontal">` で横軸を封じている) が `behaviorOptions` を
294
+ * そのまま素通しするため、封じたはずのシームへ横から到達できてしまう。
295
+ */
296
+ horizontalKeyInputs?: readonly ("arrow" | "shift-arrow")[];
297
+ /**
298
+ * Pixels emitted per horizontal arrow key press (default: 40, matching browser arrow scrolling).
299
+ * 横矢印キー 1 回あたりの移動量 (px。既定 40 = ブラウザの矢印スクロール相当)。
300
+ *
301
+ * ❗ **有限かつ正の値のみを受け付ける。** `0` / 負値 / `NaN` / `Infinity` を渡すと
302
+ * **キーを消費しない** (既定値へ黙って読み替えることはしない)。0 を既定へ差し替えると
303
+ * 呼び出し側の明示的な指定を握り潰し、0 のまま通すと「キーを食うのに 1px も動かない」
304
+ * 死んだ操作になる。
305
+ * 警告は `keydown` ではなく **prop の変化時に 1 回だけ**出す (キーリピート中に
306
+ * コンソールが溢れるため)。
307
+ */
308
+ horizontalKeyStep?: number;
189
309
  /**
190
310
  * ARIA / identity attributes applied to the scrollable CONTENT element — the element that
191
311
  * directly owns the rendered rows and excludes the scrollbar and overlay chrome.
@@ -36,11 +36,54 @@ export type VirtualScrollRange = {
36
36
  */
37
37
  export type VirtualScrollHandle = {
38
38
  /**
39
- * Scrolls to a LOGICAL position (updater form receives the current logical position).
39
+ * Jumps to a LOGICAL position (updater form receives the current logical position).
40
40
  * Returns the applied (clamped) LOGICAL position.
41
- * 論理位置へスクロール (updater は現在の論理位置を受け取る)。適用後 (クランプ後) の論理位置を返す。
41
+ * 論理位置へ**ジャンプ**する (updater は現在の論理位置を受け取る)。適用後 (クランプ後) の論理位置を返す。
42
+ *
43
+ * ❗ **連続的なスクロール入力 (ホイール等) の橋渡しには使わないこと。`scrollBy` を使う。**
44
+ * これは「行を狙って飛ぶ」ための API であり、ペイン自身のホイール処理とは意味が 2 点異なる:
45
+ *
46
+ * 1. **絶対位置を `Math.floor` する** (行解決のため)。デルタを足して渡すと 1px 未満の移動が
47
+ * 毎回消えるため、精密トラックパッドでは**一切動かない**。
48
+ * 2. **スクロールアンカーを張る** (`scrollToIndex` 経由)。狙った行に留まり続けるための仕様だが、
49
+ * 以後 `contentSize` / `itemCount` / `viewportSize` / インセットが変わるたびにドリフト補正が
50
+ * その行へ**再ピン留め**するため、絞り込みなどで一覧が過去の位置へ戻って見える。
51
+ *
52
+ * ❗ `scrollTo(handle.getScrollPosition() + delta)` と書かないこと。ペイン未接続時の
53
+ * `getScrollPosition()` は番兵 `-1` を返すため `-1 + delta` が混入する。相対移動は `scrollBy`
54
+ * (推奨) か updater 形式 `scrollTo(prev => prev + delta)` を使う (updater の `prev` は内部の
55
+ * 最新位置から取るため番兵が混入しない)。
42
56
  */
43
57
  scrollTo: (position: number | ((prev: number) => number)) => number;
58
+ /**
59
+ * Scrolls by a delta using the exact semantics of the pane's own wheel handling.
60
+ * ペイン自身のホイール処理と**同一の意味**でデルタ分スクロールする。
61
+ *
62
+ * ペインの外に置いた要素 (列ヘッダー帯・固定フッター・横スクロールバー行など) の上での
63
+ * ホイールを一覧へ橋渡しするための API。ホイールリスナーは `.aqvs-scroll-pane` にしか付かないため、
64
+ * ペイン外はホイールの死角になる。この口はその死角を埋める。
65
+ *
66
+ * `scrollTo` との違い (どちらもペイン自身のホイールと同じ扱いにするための選択):
67
+ *
68
+ * - **float のまま相対加算する** (丸めない)。1px 未満のデルタも積み上がって動く。
69
+ * - **アンカーを張らない**。手動スクロールとして扱われるため、保留アンカーはむしろ**解除される**
70
+ * (ペイン上でホイールを回したときと同じ)。以後のサイズ変化で位置が巻き戻ることがない。
71
+ * - 慣性は停止する (ペイン上のホイールと同じ)。
72
+ *
73
+ * @param delta - Signed pixels to scroll (positive scrolls down) / 符号付きの移動量 (正で下方向)
74
+ * @returns The applied (clamped) LOGICAL position / 適用後 (クランプ後) の論理位置
75
+ */
76
+ scrollBy: (delta: number) => number;
77
+ /**
78
+ * Applies one wheel event with the pane's own rules; returns whether it was consumed.
79
+ * ペイン自身の規則で 1 つのホイールイベントを適用し、消費したかどうかを返す。
80
+ *
81
+ * 一覧の**外**に置いた要素 (列ヘッダー帯・固定フッター・空表示など) のホイールを、ペイン内と
82
+ * 寸分違わぬ意味論で流し込むための唯一の口。軸分解・速度倍率・スクロール可否・横成分の委譲先・
83
+ * 慣性停止のすべてがペイン側の 1 箇所で決まるため、消費側が規則を書き直したり食い違わせたりできない。
84
+ * 直接呼ぶより `useWheelBridge` (passive:false 登録と後始末込み) を使うこと。
85
+ */
86
+ applyWheel: (event: WheelEvent) => boolean;
44
87
  /**
45
88
  * Current LOGICAL scroll position. -1 when the pane is not connected.
46
89
  * 現在の論理スクロール位置。ペイン未接続時は -1。
@@ -152,7 +195,21 @@ export type VirtualScrollProps<T> = {
152
195
  * さもないとキャッシュ済み高さが別のアイテムを指すインデックスに残る。
153
196
  */
154
197
  getItemHeight: (index: number) => number;
155
- viewportSize: number;
198
+ /**
199
+ * Size of the visible band (px). Omit it to let the component measure its own band.
200
+ * 可視帯の高さ (px)。省略するとコンポーネントが自分の帯を計測する。
201
+ *
202
+ * ❗ **省略が既定の使い方である。** この値は帯のクリップ窓・最大スクロール位置・つまみ写像・
203
+ * 描画枚数・スクロール可否のすべての基準であり、実際の帯と食い違うと 5 通りの壊れ方が
204
+ * **例外も警告も出さずに**発生する。自分で測れるものを消費側に渡させると、同じ正解を各画面で
205
+ * 書き直すことになり、実際に推測値や定数が代入される (詳細は `ScrollPaneProps.viewportSize`)。
206
+ *
207
+ * 省略時はホスト要素が高さを確定させていること (`h-full` / `flex-1` + `min-h-0` / 明示 px など)
208
+ * が前提で、高さが auto のホストでは帯が 0 のままになる (`Logger.warn` で警告する)。
209
+ * 明示する正当なケースは「帯の高さを計測ではなく算出で知っている」場合のみである
210
+ * (例: ドロップダウンが件数 × 行高から高さを決める)。
211
+ */
212
+ viewportSize?: number;
156
213
  overscanCount?: number;
157
214
  className?: string;
158
215
  /** Test id emitted as data-testid on the scroll root (DOM hooks must use data-* attributes, never class selectors). / スクロールルートに data-testid として出力されるテスト ID (DOM フックはクラスセレクタでなく data-* 属性を使う)。 */
@@ -184,8 +241,71 @@ export type VirtualScrollProps<T> = {
184
241
  onItemFocus?: (index: number) => void;
185
242
  scrollBarOptions?: VirtualScrollScrollBarOptions;
186
243
  behaviorOptions?: VirtualScrollBehaviorOptions;
187
- /** Delegates horizontal wheel/trackpad delta to an upstream owner (e.g. a frozen-column grid). / 横ホイール量を上流へ委譲する。 */
244
+ /** Delegates horizontal wheel/trackpad delta to an upstream owner (e.g. a frozen-column grid). / 横ホイール量を上流へ委譲する。
245
+ *
246
+ * ❗ **ホイール由来だけの口ではない。** `horizontalKeyInputs` を指定すると**キーボード由来の横量**も
247
+ * ここへ流れる。名前は 2.x で公開済みのため据え置くが、意味は「横軸が N px 動いた。横軸はあなたの所有物である」。
248
+ */
188
249
  onWheelHorizontal?: (deltaX: number) => void;
250
+ /**
251
+ * Keyboard gestures that emit a horizontal scroll delta through `onWheelHorizontal` (default: none).
252
+ * `onWheelHorizontal` へ横スクロール量を流すキーボード操作の種別 (既定: 無効)。
253
+ *
254
+ * - `[]` / 未指定 (既定): 横キーボードスクロールを行わない。
255
+ * - `["shift-arrow"]`: `Shift + ←/→` のみ。木の展開/折りたたみ (`←/→`) やグリッドのセル移動と
256
+ * 衝突しないため、既存の行 UI を持つ消費側でも安全に有効化できる。
257
+ * - `["arrow"]`: 素の `←/→` のみ。`Shift + ←/→` を選択範囲の拡張に使うグリッド向け。
258
+ * - `["arrow", "shift-arrow"]`: 両方。
259
+ *
260
+ * ❗ **配列なのは 4 状態が独立に必要だからである。** `"none" | "shift-arrows" | "arrows"` のような
261
+ * 段階的な文字列にすると `"arrows"` が `"shift-arrows"` を含んでしまい、「素の矢印だけ横スクロール、
262
+ * `Shift + ←/→` は消費側の範囲選択に残す」(Excel / データグリッドの標準) が**表現できない**。
263
+ * 同じ理由で種別配列を採るのが `pointerDragInputs` であり、本パッケージの既存の作法に揃えてある。
264
+ *
265
+ * ❗ **既定が無効なのは、行ハンドラを奪わないためである。** 本パッケージの行キーハンドラは
266
+ * capture フェーズに付くため、消費側の行 (bubble) より先に走る。既定で `←/→` を消費すると
267
+ * ツリーの展開/折りたたみのような既存操作を奪ってしまう。消費するのは `preventDefault()` のみで
268
+ * **伝播は止めない** (縦の矢印キーと同じ契約)。`stopPropagation()` は行ハンドラだけでなく
269
+ * `document` / `window` の bubble リスナーごとイベントを消し、ホットキーライブラリや
270
+ * キー入力のテレメトリまで巻き添えにするため採らない。消費側が二重動作を避ける手段は
271
+ * `defaultPrevented` の確認である。
272
+ *
273
+ * 前提: 横軸を所有するのは消費側なので、`onWheelHorizontal` が未指定なら何も起きない
274
+ * (キーイベントも消費しない)。行にフォーカスがあるときだけ働くため
275
+ * `behaviorOptions.enableKeyboardNavigation` も必要。
276
+ *
277
+ * ❗ **符号は物理キー基準** (`→` が正、`←` が負) である。横軸の向きを知っているのは消費側だけなので、
278
+ * RTL (`direction: rtl`) の一覧では消費側が受け取った値を反転すること。パッケージ側で
279
+ * `direction` を推測すると、横スクロールの実体 (CSS 変数・`scrollLeft`・transform) がどの要素の
280
+ * どの座標系かを知らないまま符号を決めることになり、当たらない前提を増やすだけになる。
281
+ *
282
+ * ❗ **働くのは行そのものにフォーカスがあるときだけである** (`event.target === event.currentTarget`)。
283
+ * 行の**中**の要素 (自作のタブ・ラジオ相当・スライダー相当など `role` だけで矢印キー操作を実装した
284
+ * ウィジェット、リンク、ネイティブの横スクロール領域) にフォーカスがある間は奪わない。
285
+ * 入力要素の allowlist だけでは `role` 実装のウィジェットを守れないため、対象そのもので判定する。
286
+ *
287
+ * 長押しの連続スクロールは **OS のキーリピート**に委ねる (`keydown` が繰り返し届く)。スクロールバーの
288
+ * 矢印ボタンが明示的なリピートタイマーを持つ (`ARROW_HOLD_DELAY` / `ARROW_HOLD_INTERVAL`) のは
289
+ * ポインタ押下にリピートが存在しないためで、キーボードとの非対称は入力機構の差に由来する。
290
+ *
291
+ * ❗ **`onWheelHorizontal` と同じ「横軸のシーム」に属するため、意図的にトップレベルに置いてある。**
292
+ * `behaviorOptions` の中へ入れると、横軸を自前で所有するラッパー (例: `@aiquants/directory-tree` は
293
+ * `Omit<VirtualScrollProps, "onWheelHorizontal">` で横軸を封じている) が `behaviorOptions` を
294
+ * そのまま素通しするため、封じたはずのシームへ横から到達できてしまう。
295
+ */
296
+ horizontalKeyInputs?: readonly ("arrow" | "shift-arrow")[];
297
+ /**
298
+ * Pixels emitted per horizontal arrow key press (default: 40, matching browser arrow scrolling).
299
+ * 横矢印キー 1 回あたりの移動量 (px。既定 40 = ブラウザの矢印スクロール相当)。
300
+ *
301
+ * ❗ **有限かつ正の値のみを受け付ける。** `0` / 負値 / `NaN` / `Infinity` を渡すと
302
+ * **キーを消費しない** (既定値へ黙って読み替えることはしない)。0 を既定へ差し替えると
303
+ * 呼び出し側の明示的な指定を握り潰し、0 のまま通すと「キーを食うのに 1px も動かない」
304
+ * 死んだ操作になる。
305
+ * 警告は `keydown` ではなく **prop の変化時に 1 回だけ**出す (キーリピート中に
306
+ * コンソールが溢れるため)。
307
+ */
308
+ horizontalKeyStep?: number;
189
309
  /**
190
310
  * ARIA / identity attributes applied to the scrollable CONTENT element — the element that
191
311
  * directly owns the rendered rows and excludes the scrollbar and overlay chrome.
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualScroll.d.ts","sourceRoot":"","sources":["../src/VirtualScroll.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VirtualScroll.d.ts","sourceRoot":"","sources":["../src/VirtualScroll.tsx"],"names":[],"mappings":"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"}