@ishibashi0112/spreadsheet-grid-core 0.41.0 → 0.41.1

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.
@@ -255,14 +255,47 @@ export type DetailRowRenderContext<T> = {
255
255
  sourceRowIndex: number;
256
256
  collapse: () => void;
257
257
  };
258
+ /**
259
+ * 展開行(Master/Detail)の設定です(`detailRow` prop)。指定したときだけ機能が有効になります。
260
+ *
261
+ * 各フィールドの説明は React 版パッケージ `@ishibashi0112/spreadsheet-grid` に同梱の `API_REFERENCE.md`
262
+ * の「展開行(Master/Detail)」節と同じ内容です。
263
+ */
258
264
  export type DetailRowOptions<T, F extends GridFrameworkTypes = GridFrameworkTypes> = {
265
+ /**
266
+ * 展開行の中身。`ctx = { row, rowKey, rowIndex, sourceRowIndex, collapse }`(`rowIndex` はビュー行
267
+ * index、`collapse()` はその展開行を閉じる)。帯の内側のカード要素(`.ssg-detail-card`、
268
+ * `data-ssg-detail` 属性つき)に描画される。
269
+ */
259
270
  render: (ctx: DetailRowRenderContext<T>) => F['node'];
271
+ /**
272
+ * 帯の高さ(px)。**固定高**で、中身が超えるとカード内でスクロールする(auto 高は非対応)。
273
+ *
274
+ * @defaultValue `200`
275
+ */
260
276
  height?: number;
277
+ /**
278
+ * 行ごとの展開可否。`false` の行はトグルが描画されず、命令的 API / `ctx.detail.toggle()`
279
+ * からの展開も no-op。
280
+ *
281
+ * @defaultValue 全行展開可
282
+ */
261
283
  isExpandable?: (row: T, ctx: {
262
284
  rowKey: GridRowKey;
263
285
  sourceRowIndex: number;
264
286
  }) => boolean;
287
+ /**
288
+ * 専用トグル列(幅 28px・タイトル無し、行ヘッダーの右隣 = 先頭列。左固定列があるときは左固定側)
289
+ * を自動挿入する。`false` にすると列は挿入されず、任意の列の `renderCell` から
290
+ * `ctx.detail.toggle()` でトグルを自前配置する(下記)。
291
+ *
292
+ * @defaultValue `true`
293
+ */
265
294
  showToggleColumn?: boolean;
295
+ /**
296
+ * カード要素へ追加する class(または `{ className, style }`。`classNames.detailCard`
297
+ * に加えて付与)。
298
+ */
266
299
  className?: GridSlotProps<F>;
267
300
  };
268
301
  export type LabelRowSortMode = 'section' | 'follow' | 'hide';
@@ -281,15 +314,58 @@ export type LabelRowRenderContext<T> = {
281
314
  label: string;
282
315
  sectionRowCount: number | undefined;
283
316
  };
317
+ /**
318
+ * ラベル行(見出し / 区切り行)の設定です(`labelRow` prop)。指定したときだけ機能が有効になります。
319
+ *
320
+ * 各フィールドの説明は React 版パッケージ `@ishibashi0112/spreadsheet-grid` に同梱の `API_REFERENCE.md`
321
+ * の「ラベル行(見出し / 区切り行)」節と同じ内容です。
322
+ */
284
323
  export type LabelRowOptions<T, F extends GridFrameworkTypes = GridFrameworkTypes> = {
324
+ /**
325
+ * ラベル行の識別。`rows` / 本関数が変わったときに全行を 1 パス評価するため純粋・軽量であること。
326
+ */
285
327
  isLabelRow: (row: T, sourceIndex: number) => boolean;
328
+ /** 表示文字列。既定描画(`render` 未指定時)/ エクスポート / `aria-label` に使う。 */
286
329
  getLabel: (row: T) => string;
330
+ /**
331
+ * 中身の React 描画(装飾)。
332
+ * `ctx = { row, rowKey, rowIndex, sourceRowIndex, label, sectionRowCount }`(`sectionRowCount`
333
+ * はフィルター後のセクション内データ行数。serverSide では `undefined`)。
334
+ */
287
335
  render?: (ctx: LabelRowRenderContext<T>) => F['node'];
336
+ /**
337
+ * ラベル行の高さ(px)。行ごとに変えるときは関数。
338
+ *
339
+ * @defaultValue `rowHeight`
340
+ */
288
341
  height?: number | ((row: T) => number);
342
+ /** 行要素へ追加する class(または `{ className, style }`)。`classNames.labelRow` に加えて付与。 */
289
343
  className?: GridSlotProps<F> | ((row: T) => GridSlotProps<F> | undefined);
344
+ /**
345
+ * 縦スクロール中、現在セクションのラベル行を列ヘッダー直下に固定する。
346
+ * 次のラベル行が到達すると押し上げられて交代する(clientSide のみ)。
347
+ *
348
+ * @defaultValue `false`
349
+ */
290
350
  sticky?: boolean;
351
+ /**
352
+ * ソート / フィルター適用時の扱い(下記)。
353
+ *
354
+ * @defaultValue `'section'`
355
+ */
291
356
  sortMode?: LabelRowSortMode;
357
+ /**
358
+ * フィルターで中身が 0 件になったセクションのラベル行を残す。
359
+ *
360
+ * @defaultValue `false`
361
+ */
292
362
  keepEmptySections?: boolean;
363
+ /**
364
+ * エクスポート(`includeLabelRows: true`)時の出力値。文字列は先頭列(他列は空)、
365
+ * 配列は列順にそのまま。
366
+ *
367
+ * @defaultValue `getLabel` を先頭列へ
368
+ */
293
369
  exportText?: (row: T) => string | ReadonlyArray<string | number | null | undefined>;
294
370
  };
295
371
  export type RowDragContext = {
@@ -418,41 +494,200 @@ export type GridGroupRow = {
418
494
  leafCount: number;
419
495
  aggregates: Record<string, unknown>;
420
496
  };
497
+ /**
498
+ * 列定義です(`columns` prop の要素)。
499
+ *
500
+ * 各フィールドの説明は React 版パッケージ `@ishibashi0112/spreadsheet-grid` に同梱の `API_REFERENCE.md`
501
+ * の「GridColumn props」表と同じ内容です。
502
+ * 説明中の「〜節」「下記」は同ファイル内の節を指します。
503
+ */
421
504
  export type GridColumn<T, F extends GridFrameworkTypes = GridFrameworkTypes> = {
505
+ /** 型推論用の内部マーカーです(実行時には存在しません)。指定しないでください。 */
422
506
  readonly __framework?: F;
507
+ /** 列の一意キー。 */
423
508
  key: string;
509
+ /**
510
+ * ヘッダーの表示ラベル。**未指定 / 空文字(`''`)のときは `key` を表示**(列メニュー /
511
+ * フィルターパネル / CSV ヘッダー等の列名表示も同じフォールバック)。
512
+ * ボタン専用列などで見出しを空にしたい場合は空白 1 文字(`' '`)等を指定する。
513
+ */
424
514
  title?: string;
515
+ /** 列幅(px)。 */
425
516
  width: number;
517
+ /** リサイズ時の下限幅。flex 配分時の下限クランプにも使用(flex 列で未指定なら内部既定 50px)。 */
426
518
  minWidth?: number;
519
+ /**
520
+ * 上限幅。**未指定なら上限なし**(autoSize は内容にぴったり合わせ、
521
+ * 手動リサイズも自由に広げられます。既定の上限は設けません)。指定すると autoSize / 手動リサイズ /
522
+ * flex 配分の上限クランプに使われます。
523
+ */
427
524
  maxWidth?: number;
525
+ /**
526
+ * 折り返し時(= `autoHeight` 列)の CSS `word-break`。`'auto-phrase'` は Chromium(Chrome / Edge)で
527
+ * BudouX による文節折り返し(Firefox / 一部 Safari 未対応)。**nowrap(非 `autoHeight`)
528
+ * 列では折り返し自体が起きないため効果なし**。既定(未指定)はブラウザ標準=禁則つき文字折り返し。
529
+ * 詳細は「日本語テキストの折り返し」節。
530
+ */
428
531
  wordBreak?: 'normal' | 'break-all' | 'keep-all' | 'break-word' | 'auto-phrase';
532
+ /**
533
+ * 折り返し時の CSS `line-break`(禁則処理の強さ)。`'strict'` で禁則を厳格化。`wordBreak` 同様、
534
+ * 折り返す列でのみ効果あり。
535
+ */
429
536
  lineBreak?: 'auto' | 'loose' | 'normal' | 'strict' | 'anywhere';
537
+ /**
538
+ * center 列(非 pinned)の伸縮比。余り幅(コンテナ幅 − 行ヘッダー − pinned 合計 − `width`
539
+ * 固定列の合計)を flex 比で配分し `minWidth`/`maxWidth` でクランプ。
540
+ * コンテナ追従でリアクティブに伸縮。手動リサイズで固定 px へ変化(`columns` 変化まで固定 → 以後
541
+ * flex 復帰)。pinned 列では無視。詳細は下記「flex と autoSize」節。
542
+ */
430
543
  flex?: number;
544
+ /**
545
+ * この列の手動リサイズ可否。`false` でヘッダーのリサイズハンドルを非表示。
546
+ * リサイズハンドルの**ダブルクリック**でその列を内容幅へ autoSize(`false`
547
+ * 時はハンドルが無いため不可。列メニューからの autoSize は引き続き可能)。
548
+ *
549
+ * @defaultValue グリッドの `enableColumnResize` を継承
550
+ */
431
551
  resizable?: boolean;
552
+ /**
553
+ * `true` で autoSize の対象外(列メニュー / 境界ダブルクリック /
554
+ * すべての列の自動調整すべてでスキップ)。consumer 指定の `width` を維持(固定幅優先)。
555
+ * テキストで測れないカスタムUI列や固定で見せたい列向けの per-column opt-in。
556
+ *
557
+ * @defaultValue `false`
558
+ */
432
559
  suppressAutoSize?: boolean;
560
+ /**
561
+ * autoSize の幅見積もり。指定列は「セル内容の content 幅(px・セルの padding/border を除く)」
562
+ * をこの関数から得て、**全行の最大 + セル枠**で確定します(テキスト/候補/実 DOM 計測を使わず、
563
+ * React mount もしません)。テキスト長が実描画幅と相関しない renderCell
564
+ * カスタムUI列(横並びバッジ等)向けの opt-in。返す値は `renderCell` の実描画幅と一致させること。
565
+ */
433
566
  estimateCellWidth?: (row: T, column: GridColumn<T, F>) => number;
567
+ /**
568
+ * この列が auto-height 行の高さを駆動(グリッドの `autoHeight` 有効時のみ)。**autoSize
569
+ * の対象外**(折り返し前提のため。下記「flex と autoSize」の制約を参照)。
570
+ */
434
571
  autoHeight?: boolean;
572
+ /** 列の表示/非表示。 */
435
573
  visible?: boolean;
574
+ /** この列の編集を許可。 */
436
575
  editable?: boolean;
576
+ /** この列を読み取り専用にする。 */
437
577
  readOnly?: boolean;
578
+ /**
579
+ * 列固定の方向。
580
+ *
581
+ * @defaultValue undefined = 中央スクロール
582
+ */
438
583
  pinned?: GridColumnPinned;
584
+ /**
585
+ * `true` でこの列を行グルーピングの対象にする(複数指定時は `columns` 配列の出現順が階層順)。
586
+ * 有効時はグループ元列が表示から外れ、先頭に自動グループ列(ツリー表示)が注入される。**clientSide
587
+ * 限定**(serverSide では無視 + 開発時警告)。詳細は「行グルーピング + 集計」節。
588
+ */
439
589
  rowGroup?: boolean;
590
+ /**
591
+ * グルーピング時のこの列の集計。組み込みは値駆動の数値集計(`Number()`
592
+ * で有限になる値のみ対象・空値除外、`count` は配下 leaf 行数)。
593
+ * 関数でカスタム集計可(返り値がグループ行に表示)。`rowGroup` 列がないときは無視。
594
+ */
440
595
  aggFunc?: GridAggFuncName | GridAggFunc<T, F>;
596
+ /**
597
+ * 値アクセサ。
598
+ *
599
+ * @defaultValue `row[key]`
600
+ */
441
601
  getValue?: (row: T) => unknown;
602
+ /** 値ライター(新しい行を返す)。 */
442
603
  setValue?: (row: T, value: unknown) => T;
604
+ /**
605
+ * カスタムセル描画。
606
+ *
607
+ * @defaultValue プレーン `<span>`
608
+ */
443
609
  renderCell?: (ctx: CellRenderContext<T, F>) => F['node'];
610
+ /**
611
+ * セルへ付与する追加 class(条件付きスタイル)。`GridSlotProps` = `string | { className?, style? }`
612
+ * で、StyleX の `stylex.props(...)` をそのまま返せる(`style` はセルへインライン付与。座標 /
613
+ * 寸法はグリッドが後勝ち)。関数版は値 / 状態に応じて返せる。`ctx` には view の `rowIndex` に加え
614
+ * source 基準の `sourceRowIndex` / `rowKey` が入る(ソート / フィルター ON でも source
615
+ * 行基準のデータと突き合わせ可能。「補助型」節参照)。基底 `.ssg-body-cell` は未レイヤー・特異度
616
+ * (0,1,0)。確実な上書きは `.ssg-body-cell.my-class` の連結を推奨。
617
+ */
444
618
  cellClassName?: GridSlotProps<F> | ((ctx: CellStyleContext<T, F>) => GridSlotProps<F> | undefined);
619
+ /**
620
+ * セル内容の水平寄せ(UI 表示のみ・元の値は不変)。セル表示と編集 input に反映。
621
+ *
622
+ * @defaultValue `'left'`
623
+ */
445
624
  align?: 'left' | 'center' | 'right';
625
+ /**
626
+ * セル表示値の整形(UI 表示のみ)。`renderCell` 未指定の既定セルが返り値を表示。組み込み
627
+ * `numberFormatter` 等を渡せる。元の値/編集/コピー/ソート/フィルターには影響しない。
628
+ */
446
629
  valueFormatter?: CellValueFormatter<T, F>;
630
+ /** カスタムヘッダー描画。 */
447
631
  renderHeader?: (ctx: HeaderRenderContext<T, F>) => F['node'];
632
+ /**
633
+ * フィルター UI の種別。`'auto'` は列の値から `numberSet` / `textSet` / `dateSet` を自動判定する
634
+ * opt-in(下記「filterType: 'auto'(自動判定)」節)。`'numberSet'` / `'textSet'` / `'dateSet'`
635
+ * は条件(演算子 + 値)と Set 一覧を 1 つの popover に縦に並べて **AND
636
+ * 結合**する複合フィルター(条件を適用すると Set 候補が連動して絞られる。
637
+ * 候補外になった値の選択は破棄せず保持)。numberSet の演算子は 以上 / より大きい / 以下 / 未満 /
638
+ * に等しい / に等しくない / 範囲 / 空白 / 空白でない、textSet は を含む / に等しい / で始まる /
639
+ * で終わる / 空白 / 空白でない(判定は大文字小文字無視)。dateSet は 範囲 / 以降 / 以前 / に等しい
640
+ * / に等しくない / 空白 / 空白でない + 相対プリセット(今日 / 今月 / 過去 30
641
+ * 日。**相対のまま保存され評価のたびに解決**)で、Set 部分は年 / 月 / 日の 3 階層ツリー(親は 3
642
+ * 状態チェック)になる。
643
+ */
448
644
  filterType?: ColumnFilterTypeOption;
645
+ /**
646
+ * select / set / numberSet / textSet / dateSet の候補(readonly / `as const` 配列も可)。
647
+ *
648
+ * @defaultValue rows から自動収集
649
+ */
449
650
  filterOptions?: readonly GridSelectFilterOption[];
651
+ /**
652
+ * dateSet の相対プリセットチップの構成。`false` / `[]` でチップ行を非表示(オプトアウト)。
653
+ * 配列はビルトイン ID(`'today'` / `'thisMonth'` / `'last30days'`)の再利用とカスタム定義
654
+ * `{ id, label, resolve }` を表示順のまま混在可。詳細は下記「dateSet
655
+ * の相対プリセット(dateFilterPresets)」節。
656
+ *
657
+ * @defaultValue ビルトイン 3 種
658
+ */
450
659
  dateFilterPresets?: false | readonly DateFilterPresetOption[];
660
+ /** カスタムフィルター述語。 */
451
661
  filterFn?: (row: T, filterValue: unknown) => boolean;
662
+ /**
663
+ * セルエディタ種別(判別共用体)。
664
+ * `{ type: 'text' | 'number' | 'select' | 'date' | 'checkbox' | 'custom', ... }`。
665
+ * 詳細は「セルエディタ」節。
666
+ *
667
+ * @defaultValue text 相当
668
+ */
452
669
  editor?: GridColumnEditor<T, F>;
670
+ /**
671
+ * セル値の検証。`true`=有効 / `false`=無効(既定メッセージ)/
672
+ * `string`・`{ message }`=無効+メッセージ。**純粋・軽量であること**(描画中の可視セルごとに毎レンダー評価。
673
+ * `cellClassName` 関数と同コスト階級)。詳細は「バリデーション」節。
674
+ */
453
675
  validate?: (ctx: CellValidationContext<T, F>) => CellValidationResult;
676
+ /**
677
+ * 検証 NG 時の動作。`'mark'`=値は入るがセルに invalid 表示 / `'reject'`=書き込み自体を拒否。
678
+ *
679
+ * @defaultValue `'mark'`
680
+ */
454
681
  validationMode?: GridValidationMode;
682
+ /**
683
+ * 「文字列 → セル値」のパーサ(貼り付け / クリア / エディタ commit
684
+ * で共通)。**明示指定が常に優先**。未指定で `editor` が number / date / checkbox
685
+ * のときは種別の既定パーサが自動供給されます(「セルエディタ」節の表参照)。
686
+ *
687
+ * @defaultValue editor 既定パーサ
688
+ */
455
689
  parseClipboardValue?: (raw: string, row: T) => unknown;
690
+ /** コピー時のフォーマッタ。 */
456
691
  formatClipboardValue?: (value: unknown, row: T) => string;
457
692
  };
458
693
  export type ColumnResizeDragState = {
@@ -541,12 +776,37 @@ export type GridContextMenuTarget<T, F extends GridFrameworkTypes = GridFramewor
541
776
  rowKey: GridRowKey;
542
777
  row: T;
543
778
  };
779
+ /**
780
+ * `getContextMenuItems` / `onContextMenuOpen` へ渡る右クリックの文脈です。
781
+ *
782
+ * 各フィールドの説明は React 版パッケージ `@ishibashi0112/spreadsheet-grid` に同梱の `API_REFERENCE.md`
783
+ * の「コンテキストメニュー」節と同じ内容です。
784
+ */
544
785
  export type GridContextMenuParams<T, F extends GridFrameworkTypes = GridFrameworkTypes> = {
786
+ /**
787
+ * 右クリック対象。`{ type:'cell', rowIndex, colIndex, rowKey, row, column, value }` か
788
+ * `{ type:'rowHeader', rowIndex, rowKey, row }`(行NO ガター)。`rowIndex` はビュー行 index、
789
+ * `colIndex` は論理列 index(視覚順 左→中央→右 = `handle.selectCell` と同一空間)。
790
+ */
545
791
  target: GridContextMenuTarget<T, F>;
792
+ /**
793
+ * `clientX` / `clientY`: 右クリックのビューポート座標(メニュー配置に使用済み。
794
+ * 分岐の判断材料にも)。
795
+ */
546
796
  clientX: number;
797
+ /**
798
+ * `clientX` / `clientY`: 右クリックのビューポート座標(メニュー配置に使用済み。
799
+ * 分岐の判断材料にも)。
800
+ */
547
801
  clientY: number;
802
+ /** 現在のセル範囲選択。チェックボックス行選択は `handle.getRowSelection()` で別途取得。 */
548
803
  selection: GridSelection;
804
+ /** 現在のアクティブセル。 */
549
805
  activeCell: CellCoord | null;
806
+ /**
807
+ * 対象(cell はそのセル / rowHeader はその行)が `selection` に含まれるか。「選択範囲への操作」
808
+ * か「単一対象への操作」かを分岐する簡便値。
809
+ */
550
810
  isTargetSelected: boolean;
551
811
  };
552
812
  export type GridContextMenuActionItem<F extends GridFrameworkTypes = GridFrameworkTypes> = {
@@ -584,34 +844,110 @@ export type GridResolvedSlot<F extends GridFrameworkTypes = GridFrameworkTypes>
584
844
  style?: F['style'];
585
845
  };
586
846
  export type GridResolvedSlots<F extends GridFrameworkTypes = GridFrameworkTypes> = Partial<Record<keyof GridClassNames<F>, GridResolvedSlot<F>>>;
847
+ /**
848
+ * パーツ別スロット(`classNames` prop)です。各値は class 文字列か `{ className, style }` です。
849
+ *
850
+ * 各スロットの付与先は React 版パッケージ `@ishibashi0112/spreadsheet-grid` に同梱の `API_REFERENCE.md`
851
+ * の「パーツ別スロット」節と同じ内容です。
852
+ */
587
853
  export type GridClassNames<F extends GridFrameworkTypes = GridFrameworkTypes> = {
854
+ /** 付与先: ルート要素 `.ssg-root`(`className` / `style` prop と同じ要素) */
588
855
  root?: GridSlotProps<F>;
856
+ /**
857
+ * `toolbar` / `statusBar`: 付与先: 既定トップバー `.ssg-bar--top` / 既定ボトムバー
858
+ * `.ssg-bar--bottom`(`renderTopBar` / `renderBottomBar` 指定時は対象外)
859
+ */
589
860
  toolbar?: GridSlotProps<F>;
861
+ /**
862
+ * `toolbar` / `statusBar`: 付与先: 既定トップバー `.ssg-bar--top` / 既定ボトムバー
863
+ * `.ssg-bar--bottom`(`renderTopBar` / `renderBottomBar` 指定時は対象外)
864
+ */
590
865
  statusBar?: GridSlotProps<F>;
866
+ /**
867
+ * `headerRow` / `headerCell`: 付与先: ヘッダー行 /
868
+ * 列ヘッダーセル(コーナー・行ヘッダーセルは含まない)
869
+ */
591
870
  headerRow?: GridSlotProps<F>;
871
+ /**
872
+ * `headerRow` / `headerCell`: 付与先: ヘッダー行 /
873
+ * 列ヘッダーセル(コーナー・行ヘッダーセルは含まない)
874
+ */
592
875
  headerCell?: GridSlotProps<F>;
876
+ /** `bodyRow` / `bodyCell`: 付与先: 本体行(データ / スケルトン / グループ行)/ データセル */
593
877
  bodyRow?: GridSlotProps<F>;
878
+ /** `bodyRow` / `bodyCell`: 付与先: 本体行(データ / スケルトン / グループ行)/ データセル */
594
879
  bodyCell?: GridSlotProps<F>;
880
+ /**
881
+ * `rowHeaderCell` / `cornerCell`: 付与先: 行ヘッダー「#」セルとコーナーセル(`rowHeaderCell`
882
+ * は両方、`cornerCell` はコーナーのみ)
883
+ */
595
884
  rowHeaderCell?: GridSlotProps<F>;
885
+ /** 付与先: ヘッダーのアイコンボタン `.ssg-icon-btn` */
596
886
  iconButton?: GridSlotProps<F>;
887
+ /**
888
+ * `rowHeaderCell` / `cornerCell`: 付与先: 行ヘッダー「#」セルとコーナーセル(`rowHeaderCell`
889
+ * は両方、`cornerCell` はコーナーのみ)
890
+ */
597
891
  cornerCell?: GridSlotProps<F>;
892
+ /**
893
+ * `groupRow` / `groupCell`: 付与先: グループ行 / グループ行のセル(`bodyRow` / `bodyCell`
894
+ * に加えて付与)
895
+ */
598
896
  groupRow?: GridSlotProps<F>;
897
+ /**
898
+ * `groupRow` / `groupCell`: 付与先: グループ行 / グループ行のセル(`bodyRow` / `bodyCell`
899
+ * に加えて付与)
900
+ */
599
901
  groupCell?: GridSlotProps<F>;
902
+ /**
903
+ * `detailBand` / `detailCard`: 付与先: 展開行の帯 / カード(`detailRow.className` に加えて付与)
904
+ */
600
905
  detailBand?: GridSlotProps<F>;
906
+ /**
907
+ * `detailBand` / `detailCard`: 付与先: 展開行の帯 / カード(`detailRow.className` に加えて付与)
908
+ */
601
909
  detailCard?: GridSlotProps<F>;
910
+ /**
911
+ * `labelRow` / `labelRowContent`: 付与先: ラベル行(見出し / 区切り行)の行要素
912
+ * `.ssg-body-row[data-ssg-label-row]`(`bodyRow` / `labelRow.className` に加えて付与。
913
+ * 縦固定の複製にも付く)/ 中身の器 `.ssg-label-row-content`
914
+ */
602
915
  labelRow?: GridSlotProps<F>;
916
+ /**
917
+ * `labelRow` / `labelRowContent`: 付与先: ラベル行(見出し / 区切り行)の行要素
918
+ * `.ssg-body-row[data-ssg-label-row]`(`bodyRow` / `labelRow.className` に加えて付与。
919
+ * 縦固定の複製にも付く)/ 中身の器 `.ssg-label-row-content`
920
+ */
603
921
  labelRowContent?: GridSlotProps<F>;
922
+ /**
923
+ * 付与先: ポータル系パネルの root(列メニュー / フィルター / コンテキストメニュー / select
924
+ * エディタ候補 / ツールパネル。`document.body` 直下)
925
+ */
604
926
  popover?: GridSlotProps<F>;
927
+ /** 付与先: メニュー項目 `.ssg-menu-item`(列メニュー / コンテキストメニュー) */
605
928
  menuItem?: GridSlotProps<F>;
929
+ /**
930
+ * 付与先: カスタムツールチップ `.ssg-tooltip`(body 直下のシングルトン。
931
+ * 複数グリッド同居時は最後に更新したグリッドの値)
932
+ */
606
933
  tooltip?: GridSlotProps<F>;
934
+ /** 付与先: 列 / 行ドラッグのゴースト `[data-grid-drag-ghost]` */
607
935
  dragGhost?: GridSlotProps<F>;
936
+ /** 付与先: 行選択 / checkbox 列のチェックボックス glyph `.ssg-row-checkbox` */
608
937
  checkbox?: GridSlotProps<F>;
938
+ /** 付与先: セルエディタの枠 `.ssg-cell-editor` */
609
939
  cellEditor?: GridSlotProps<F>;
940
+ /** 付与先: 0 行時の空状態 `.ssg-empty-state` */
610
941
  emptyState?: GridSlotProps<F>;
942
+ /** 付与先: フィルターチップバー `.ssg-filter-chip-bar` */
611
943
  filterChipBar?: GridSlotProps<F>;
944
+ /** 付与先: SSRM のエラーバー `.ssg-ssrm-error-bar` */
612
945
  errorBar?: GridSlotProps<F>;
946
+ /** 付与先: スクロール位置インジケーター `.ssg-scroll-hint` */
613
947
  scrollHint?: GridSlotProps<F>;
948
+ /** `activeCellOverlay` / `selectionOverlay`: 付与先: アクティブセル枠 / 範囲選択の塗り */
614
949
  activeCellOverlay?: GridSlotProps<F>;
950
+ /** `activeCellOverlay` / `selectionOverlay`: 付与先: アクティブセル枠 / 範囲選択の塗り */
615
951
  selectionOverlay?: GridSlotProps<F>;
616
952
  };
617
953
  export type ScrollAlign = 'auto' | 'start' | 'center' | 'end';
@@ -674,68 +1010,192 @@ export type GridState = {
674
1010
  sort: GridSortState;
675
1011
  columns?: GridColumnState[];
676
1012
  };
1013
+ /**
1014
+ * 命令的 API です(`ref` prop で受け取るハンドル)。状態は props で controlled のまま、props で表現しづらい
1015
+ * 一発操作(スクロール / 選択 / エクスポート / 状態の保存・復元など)だけを提供します。
1016
+ * `viewRowIndex` / `colIndex` はビュー座標(フィルター / ソート適用後の表示 index。`colIndex` は固定列を含む
1017
+ * 左→中央→右の視覚順)です。
1018
+ *
1019
+ * 各メソッドの説明は React 版パッケージ `@ishibashi0112/spreadsheet-grid` に同梱の `API_REFERENCE.md`
1020
+ * の「命令的 API」節の表と同じ内容です。
1021
+ */
677
1022
  export type SpreadsheetGridHandle<T> = {
1023
+ /**
1024
+ * 指定行を可視域へ。`align`(既定 `'auto'`): `'auto'`(最小スクロール) / `'start'` / `'center'` /
1025
+ * `'end'`。
1026
+ */
678
1027
  scrollToRow: (viewRowIndex: number, options?: {
679
1028
  align?: ScrollAlign;
680
1029
  }) => void;
1030
+ /** 指定セルを縦横とも可視域へ。固定列(左右ピン)は常に可視のため横スクロールしない。 */
681
1031
  scrollToCell: (viewRowIndex: number, colIndex: number, options?: {
682
1032
  align?: ScrollAlign;
683
1033
  }) => void;
1034
+ /** `scrollToTop()` / `scrollToBottom()`: 先頭 / 末尾へ。 */
684
1035
  scrollToTop: () => void;
1036
+ /** `scrollToTop()` / `scrollToBottom()`: 先頭 / 末尾へ。 */
685
1037
  scrollToBottom: () => void;
1038
+ /** 現在描画中の行ウィンドウ `{ startIndex, endIndex }`(end 排他)。空は `null`。 */
686
1039
  getVisibleRowRange: () => {
687
1040
  startIndex: number;
688
1041
  endIndex: number;
689
1042
  } | null;
1043
+ /**
1044
+ * 現在のスクロール位置 `{ top, left }`(px)。値はスクロールコンテナの生の `scrollTop` /
1045
+ * `scrollLeft` で、`setScrollPosition` / `onScroll` と同一基準(往復で一貫)。未マウント時は
1046
+ * `null`。
1047
+ */
690
1048
  getScrollPosition: () => GridScrollPosition | null;
1049
+ /**
1050
+ * スクロール位置の設定(px)。省略側は現状維持・スクロール可能範囲へクランプ。`behavior` は
1051
+ * `'auto'`(既定・即時)/ `'smooth'`。2 グリッドの双方向同期では `'auto'` を推奨(`'smooth'`
1052
+ * は途中フレームの `onScroll` が `source:'user'` になり得る)。
1053
+ */
691
1054
  setScrollPosition: (position: {
692
1055
  top?: number;
693
1056
  left?: number;
694
1057
  }, options?: {
695
1058
  behavior?: 'auto' | 'smooth';
696
1059
  }) => void;
1060
+ /** 現在のアクティブセル `{ row, col }`(なければ `null`)。 */
697
1061
  getActiveCell: () => CellCoord | null;
1062
+ /** アクティブセル設定(`null` で解除)。`scrollIntoView` で可視化も行う。 */
698
1063
  setActiveCell: (cell: CellCoord | null, options?: {
699
1064
  scrollIntoView?: boolean;
700
1065
  }) => void;
1066
+ /** 現在の選択状態(`GridSelection`)。 */
701
1067
  getSelection: () => GridSelection;
1068
+ /** 単一セル選択(クリック相当)。 */
702
1069
  selectCell: (viewRowIndex: number, colIndex: number, options?: {
703
1070
  scrollIntoView?: boolean;
704
1071
  }) => void;
1072
+ /** セル範囲選択(ドラッグ相当)。アンカーは `range.start`。 */
705
1073
  selectRange: (range: CellRange, options?: {
706
1074
  scrollIntoView?: boolean;
707
1075
  }) => void;
1076
+ /** 選択解除。 */
708
1077
  clearSelection: () => void;
1078
+ /** 選択に交差する行(distinct)を返す。serverSide はロード済み行のみ。 */
709
1079
  getSelectedRows: () => T[];
1080
+ /** CSV 文字列を返す(純粋・副作用なし)。 */
710
1081
  exportCsv: (options?: CsvExportOptions) => string;
1082
+ /**
1083
+ * `exportCsv` の結果を `.csv` としてダウンロード(`filename` 既定 `'export.csv'`、`bom` 既定
1084
+ * `true`)。
1085
+ */
711
1086
  downloadCsv: (filename?: string, options?: CsvExportOptions) => void;
1087
+ /** 列メタ + 2 次元セルの、シリアライズ非依存な整形済みデータを返す(純粋・副作用なし)。 */
712
1088
  getExportData: (options?: GridExportOptions) => GridExportData;
1089
+ /**
1090
+ * 永続化対象(手動リサイズ幅 / フィルター / ソート)のスナップショット `GridState`
1091
+ * を返す(純粋・副作用なし)。新規オブジェクトなのでそのまま `JSON.stringify` して保存できる。
1092
+ */
713
1093
  getState: () => GridState;
1094
+ /**
1095
+ * `getState()` の値(または互換な部分形)を適用する。外部入力は内部で防御的に正規化され、幅 reset /
1096
+ * フィルター一括 / ソート set の 3 dispatch(1 イベント = 1 再レンダー)で反映。clientSide /
1097
+ * serverSide 双方に効く(SSRM は `filters`/`sort` 変化がクエリへ載り再取得)。
1098
+ */
714
1099
  applyState: (state: GridState) => void;
1100
+ /** 現在の行選択記述子(`RowSelectionModel`)。 */
715
1101
  getRowSelection: () => RowSelectionModel;
1102
+ /**
1103
+ * 行選択記述子を設定。controlled 時は `onRowSelectionChange` 経由で親へ委譲(内部 state
1104
+ * は書かない)。
1105
+ */
716
1106
  setRowSelection: (model: RowSelectionModel) => void;
1107
+ /**
1108
+ * 選択中の行キー配列。`include` はそのまま O(選択数)、`exclude`
1109
+ * は現在の全行から除外を差し引いて列挙(O(行数))。serverSide はロード済みキーのみ。
1110
+ */
717
1111
  getSelectedRowKeys: () => GridRowKey[];
1112
+ /**
1113
+ * 選択中の行データ。行の探索が要るため O(行数)。キーで足りるなら `getSelectedRowKeys()` を推奨。
1114
+ * serverSide はロード済み行のみ。
1115
+ */
718
1116
  getSelectedRowData: () => T[];
1117
+ /** 選択件数。`exclude` は 総行数 − 除外数 で一定コスト。 */
719
1118
  getSelectedRowCount: () => number;
1119
+ /** 指定キーが選択中かを O(1) 判定。 */
720
1120
  isRowSelected: (rowKey: GridRowKey) => boolean;
1121
+ /** 全行を選択(exclude モード=キーを列挙しない)。 */
721
1122
  selectAllRows: () => void;
1123
+ /** 行選択をすべて解除。 */
722
1124
  clearRowSelection: () => void;
1125
+ /** 直近のグリッド編集を取り消す(`Ctrl/Cmd+Z` 相当)。無効条件下・履歴が空のときは no-op。 */
723
1126
  undo: () => void;
1127
+ /**
1128
+ * undo で取り消した編集をやり直す(`Ctrl/Cmd+Shift+Z` / `Ctrl/Cmd+Y` 相当)。undo
1129
+ * 後に新しい編集が入った時点で redo 系譜は破棄される。
1130
+ */
724
1131
  redo: () => void;
1132
+ /** `canUndo()` / `canRedo()`: undo / redo 可能かを返す(無効条件下では常に `false`)。 */
725
1133
  canUndo: () => boolean;
1134
+ /** `canUndo()` / `canRedo()`: undo / redo 可能かを返す(無効条件下では常に `false`)。 */
726
1135
  canRedo: () => boolean;
1136
+ /**
1137
+ * 編集履歴を破棄する(rows は変更しない)。rows
1138
+ * の外部差し替えはグリッド側でも自動検知して破棄するため、通常は呼ばなくてよい。
1139
+ */
727
1140
  clearUndoHistory: () => void;
1141
+ /**
1142
+ * 指定グループを開閉する(`collapsed: true` = 折りたたみ)。`groupKey` は `getGroupRows()`
1143
+ * の記述子から取得。同一イベント内の連続呼び出しも正しく積み重なる。
1144
+ */
728
1145
  setGroupCollapsed: (groupKey: string, collapsed: boolean) => void;
1146
+ /** `expandAllGroups()` / `collapseAllGroups()`: すべてのグループを展開 / 折りたたむ。 */
729
1147
  expandAllGroups: () => void;
1148
+ /** `expandAllGroups()` / `collapseAllGroups()`: すべてのグループを展開 / 折りたたむ。 */
730
1149
  collapseAllGroups: () => void;
1150
+ /** 全グループ行の記述子(`GridGroupRow[]`)を DFS 順(表示順)で返す。開閉状態に関わらず全件。 */
731
1151
  getGroupRows: () => GridGroupRow[];
1152
+ /**
1153
+ * 指定行キー(`rowKeyGetter` の値)の展開行を開閉する。`isExpandable` が `false` の行は no-op。
1154
+ * 行がまだロードされていない / フィルターで除外中でもキーは保持され、
1155
+ * 表示可能になった時点で帯が出る。同一イベント内の連続呼び出しも正しく積み重なる。
1156
+ */
732
1157
  setDetailRowExpanded: (rowKey: GridRowKey, expanded: boolean) => void;
1158
+ /** 展開中の行キーを返す(`GridRowKey[]`)。 */
733
1159
  getExpandedDetailRowKeys: () => GridRowKey[];
1160
+ /**
1161
+ * すべての展開行を閉じる。「すべて開く」
1162
+ * は提供しない(表示中の全行をまとめて開くと帯の合計高が大きくなりやすいため。必要なら
1163
+ * `setDetailRowExpanded` を行ごとに呼ぶ)。
1164
+ */
734
1165
  collapseAllDetailRows: () => void;
1166
+ /**
1167
+ * 指定行キーの行を元 `rows` 配列の `toIndex` へ移動する(clientSide + `onRowsChange` 指定時のみ。
1168
+ * `enableRowDrag` / ソート / フィルターの状態には依存しない)。`onRowsChange`(履歴ラッパ経由 =
1169
+ * undo 対象)→ `onRowMove` の順に呼ばれる。未知のキー / 同一位置 / 範囲外は no-op。serverSide
1170
+ * では開発時警告 + no-op。
1171
+ */
735
1172
  moveRow: (rowKey: GridRowKey, toIndex: number) => void;
1173
+ /**
1174
+ * `validate` 指定列 × 全ソース行をオンデマンドで全走査し、invalid セルの一覧(`GridInvalidCell[]`
1175
+ * = `{ rowKey, sourceRowIndex, columnKey, message }`)を返す。保存前チェック用。invalid
1176
+ * 表示は表示時導出のため状態を持たず、**呼ばれた時だけ計算**する(明示的な呼び出し =
1177
+ * 明示的なコスト)。**`showValidationMarks`
1178
+ * の表示状態と無関係に常に動作する**(マーク非表示中の送信前チェックに使える)。
1179
+ * 非表示列も対象(見えない列の不正値も検出)。clientSide 専用で、serverSide
1180
+ * は全行を保持しないため空配列 + `console.warn`。
1181
+ */
736
1182
  getInvalidCells: () => GridInvalidCell[];
1183
+ /**
1184
+ * serverSide(`dataSource`)のソフトリフレッシュ。クエリ(フィルター/ソート/グローバル)
1185
+ * を変えずにキャッシュを破棄し、**スクロール位置を保ったまま現在の可視レンジを即時**(debounce
1186
+ * なし)取り直す。件数は到着ブロックの `totalRowCount` で追従。宣言的に扱いたい場合は同挙動の
1187
+ * `serverSideRefreshToken` prop もある(「serverSide モード」の節を参照)。clientSide(`rows`)
1188
+ * では警告付き no-op。
1189
+ */
737
1190
  refreshServerSide: () => void;
1191
+ /**
1192
+ * フィルター管理パネル(適用中の列フィルターの一覧 / 該当列へジャンプして編集 / 個別・全クリア /
1193
+ * 追加)を開く。`enableColumnFilter=false` のときは何もしない。列メニューの「フィルターを管理…」/
1194
+ * 既定トップバーの **Filters chip クリック**(`enableColumnFilter=true` 時にクリック可能)
1195
+ * と同じパネル。
1196
+ */
738
1197
  openFilterManager: () => void;
1198
+ /** フィルター管理パネルを閉じる(開いていなければ何もしない)。 */
739
1199
  closeFilterManager: () => void;
740
1200
  };
741
1201
  export type GridDensity = 'compact' | 'standard' | 'comfortable';
@@ -746,102 +1206,650 @@ export type ScrollHintRenderArgs<T> = {
746
1206
  rowIndex: number;
747
1207
  rowData: T | undefined;
748
1208
  };
1209
+ /**
1210
+ * スクロール位置インジケーターの設定です(`scrollHint` prop。`true` は全項目既定値と同義)。
1211
+ *
1212
+ * 各フィールドの説明は React 版パッケージ `@ishibashi0112/spreadsheet-grid` に同梱の `API_REFERENCE.md`
1213
+ * の「スクロール位置インジケーター」節と同じ内容です。
1214
+ */
749
1215
  export type ScrollHintOptions<T = unknown, F extends GridFrameworkTypes = GridFrameworkTypes> = {
1216
+ /**
1217
+ * 行番号バブルの表示。
1218
+ *
1219
+ * @defaultValue `true`
1220
+ */
750
1221
  bubble?: boolean;
1222
+ /**
1223
+ * ルーラー + ジャンプ先プレビューの表示。
1224
+ *
1225
+ * @defaultValue `true`
1226
+ */
751
1227
  ruler?: boolean;
1228
+ /**
1229
+ * カスタム縦スクロールバー(専用ガター・常時表示)。`false`
1230
+ * でネイティブバーのまま(バブル等は疑似サム位置に表示)。
1231
+ *
1232
+ * @defaultValue `true`
1233
+ */
752
1234
  scrollbar?: boolean;
1235
+ /**
1236
+ * バブル / ルーラーの表示トリガー(スクロールバー自体は常時表示)。`'scroll'` =
1237
+ * スクロール中のみ(停止約 1 秒でフェードアウト)/ `'hover'` = グリッドホバー中 + スクロール中 /
1238
+ * `'always'` = 常時。
1239
+ *
1240
+ * @defaultValue `'scroll'`
1241
+ */
753
1242
  trigger?: ScrollHintTrigger;
1243
+ /**
1244
+ * **データ量ゲート**。表示行数(フィルター / グルーピング適用後のビュー行数。SSRM
1245
+ * はサーバー総行数)がこの値未満のあいだ、scrollHint 全体(カスタムスクロールバー含む)を自動 OFF
1246
+ * にしてネイティブスクロールバー表示のままにする。`0` = 常時有効(従来挙動)。
1247
+ *
1248
+ * @defaultValue `0`
1249
+ */
754
1250
  minRows?: number;
1251
+ /** 行番号に添えて表示する列 key(= 行オブジェクトのフィールド名)。 */
755
1252
  hintColumn?: string;
1253
+ /**
1254
+ * 表示内容の完全カスタム(`hintColumn` より優先)。`null` / `undefined`
1255
+ * を返すと行番号のみの既定表示。
1256
+ */
756
1257
  renderHint?: (args: ScrollHintRenderArgs<T>) => F['node'];
757
1258
  };
1259
+ /**
1260
+ * `SpreadsheetGrid` の props です(React 版では `ref` prop が加わります)。
1261
+ *
1262
+ * 各フィールドの説明は React 版パッケージ `@ishibashi0112/spreadsheet-grid` に同梱の `API_REFERENCE.md`
1263
+ * の「SpreadsheetGrid props」表と同じ内容です。
1264
+ * 説明中の「〜節」「下記」は同ファイル内の節を指します。
1265
+ */
758
1266
  export type SpreadsheetGridProps<T, F extends GridFrameworkTypes = GridFrameworkTypes> = {
1267
+ /**
1268
+ * 永続スライス(手動リサイズ幅 / フィルター / ソート)が**実際に変化したとき**に最新 `GridState`
1269
+ * を渡して呼ばれる。保存タイミングの signal(例: localStorage 自動保存)。発火規約は「状態の保存 /
1270
+ * 復元」節を参照。
1271
+ */
759
1272
  onStateChange?: (state: GridState) => void;
1273
+ /**
1274
+ * フィルター状態(`globalText` + `columnFilters`)が**実際に変化したとき**だけ、
1275
+ * そのスライスの複製を渡して呼ばれる。`onStateChange` は列幅 / 列メタでも呼ばれるため、記述子から
1276
+ * WHERE を組み立てるなどフィルターだけを追いたい用途向け。規約は `onStateChange`
1277
+ * と同じ(初回非発火 / 同値非発火 / `applyState` でも発火)。
1278
+ */
760
1279
  onFiltersChange?: (filters: GridFilterState) => void;
1280
+ /**
1281
+ * ソート状態が**実際に変化したとき**だけ、その複製を渡して呼ばれる(ORDER BY の組み立てなど)。
1282
+ * 規約は `onFiltersChange` と同じ。
1283
+ */
761
1284
  onSortChange?: (sort: GridSortState) => void;
1285
+ /**
1286
+ * スクロール位置の変化通知(rAF で 1 フレーム 1 回に間引き・縦横どちらの変化でも発火)。`params` は
1287
+ * `{ top, left, source }`(px)。`source: 'api'` は `setScrollPosition` / `scrollTo*` 系由来、
1288
+ * `'user'` はそれ以外。2 グリッドの双方向スクロール同期は `source === 'user'`
1289
+ * のときだけ相手へ反映することでループを止められる。インライン関数可(latest-ref 経由)。
1290
+ */
762
1291
  onScroll?: (params: GridScrollEventParams) => void;
1292
+ /**
1293
+ * clientSide モードの行データ。readonly 配列も受け付ける(グリッドは入力配列を破壊的に変更しない。
1294
+ * 編集結果は `onRowsChange` が新配列で返す)。`dataSource` を指定した場合は無視され serverSide
1295
+ * モードになる(両者は排他)。
1296
+ */
763
1297
  rows?: readonly T[];
1298
+ /**
1299
+ * serverSide(SSRM)モードのデータ供給口。指定すると可視窓近傍のブロックだけを `getRows`
1300
+ * で都度取得し、`rows` 系の clientSide パイプラインをバイパスする。`updateRows`(任意)
1301
+ * を持たせるとセル編集の書き戻し(楽観更新つき)が有効になる(「セル編集の書き戻し」節)。
1302
+ */
764
1303
  dataSource?: ServerSideDataSource<T>;
1304
+ /**
1305
+ * serverSide のソフトリフレッシュ用トークン。値を増やすと、クエリ(フィルター/ソート/グローバル)
1306
+ * を変えずにキャッシュを破棄して現在の可視レンジをサーバから取り直す。スクロール位置は保持し、
1307
+ * 件数は到着ブロックの `totalRowCount` で追従する(clientSide では無視)。
1308
+ * 命令的に呼びたい場合は同挙動のハンドル `refreshServerSide()` を使う。
1309
+ */
765
1310
  serverSideRefreshToken?: number;
1311
+ /**
1312
+ * serverSide の `getRows` が reject したときの通知(abort は正常キャンセルのため通知しない)。
1313
+ * `params` は失敗した要求の view 空間レンジ `{ startIndex, endIndex }`。
1314
+ * グリッド内蔵のエラーバー(再試行 UI)とは独立に呼ばれる(利用側トースト / ログ用)。
1315
+ * インライン関数可(latest-ref 経由で読む)。
1316
+ */
766
1317
  onServerSideLoadError?: (error: unknown, params: ServerSideLoadErrorParams) => void;
1318
+ /**
1319
+ * serverSide の `dataSource.updateRows` が reject したときの通知。
1320
+ * グリッド側は楽観更新をロールバック済みで、`params.updates` に失敗した行更新(`rowKey` /
1321
+ * `changes` / `previousRow`)が入る(利用側トースト / リトライ導線用)。
1322
+ * グリッド内蔵の保存失敗バーとは独立に呼ばれる。インライン関数可(latest-ref 経由で読む)。
1323
+ * 詳細は「セル編集の書き戻し」節。
1324
+ */
767
1325
  onServerSideWriteError?: (error: unknown, params: ServerSideWriteErrorParams<T>) => void;
1326
+ /** 列定義の配列。readonly 配列も受け付ける。 */
768
1327
  columns: readonly GridColumn<T, F>[];
1328
+ /** 行が変化したとき呼ばれる(rows を controlled にする)。 */
769
1329
  onRowsChange?: (nextRows: T[]) => void;
1330
+ /** 列が変化したとき呼ばれる。列メニューの固定切替はこれが指定されている場合のみ反映。 */
770
1331
  onColumnsChange?: (nextColumns: GridColumn<T, F>[]) => void;
1332
+ /**
1333
+ * 安定した行キーを返す。
1334
+ *
1335
+ * @defaultValue index ベース
1336
+ */
771
1337
  rowKeyGetter?: (row: T, index: number) => GridRowKey;
1338
+ /**
1339
+ * コピー(`Ctrl/Cmd+C` の TSV)/ `exportCsv` / `getExportData` の対象行フィルタ。`false`
1340
+ * の行は出力から**行ごと**除く(行単位のみ。全体選択かの判定と貼り付けには影響しない)。
1341
+ * `ctx.viewRowIndex` はフィルター / ソート適用後のビュー行 index(scope `'raw'` のみ rows
1342
+ * 配列のソース index)、`ctx.rowKey` は `rowKeyGetter` の値。用途:
1343
+ * プレースホルダ行など表示上の詰め物を出力から除く。
1344
+ *
1345
+ * @defaultValue 全行 true
1346
+ */
772
1347
  isRowExportable?: (row: T, ctx: {
773
1348
  viewRowIndex: number;
774
1349
  rowKey: GridRowKey;
775
1350
  }) => boolean;
1351
+ /** 行追加時に使う新規行ファクトリ。 */
776
1352
  createRow?: () => T;
1353
+ /** 列追加時に使う列ファクトリ。 */
777
1354
  createOverflowColumn?: (columnIndex: number) => GridColumn<T, F>;
1355
+ /**
1356
+ * uniform 行の行高(px)。未指定時は density プリセット(compact: `28` / comfortable: `44`)
1357
+ * から解決。明示指定が常に優先。
1358
+ *
1359
+ * @defaultValue density 依存(standard: `36`)
1360
+ */
778
1361
  rowHeight?: number;
1362
+ /**
1363
+ * auto-height 行(可変行高)を有効化する**大本のスイッチ**。これに加えて**少なくとも1列に
1364
+ * `column.autoHeight: true`** が必要(その列が折り返して行高を駆動)。両方 true かつ**行数 ≤ 50,
1365
+ * 000**のとき有効(超過時は uniform `rowHeight` へフォールバック)。詳細は「auto-height 行」節。
1366
+ *
1367
+ * @defaultValue `false`
1368
+ */
779
1369
  autoHeight?: boolean;
1370
+ /**
1371
+ * 未測定行の推定行高(px)。
1372
+ *
1373
+ * @defaultValue `rowHeight`
1374
+ */
780
1375
  estimateRowHeight?: number;
1376
+ /**
1377
+ * ヘッダー行の高さ(px)。未指定時は density プリセット(compact: `32` / comfortable: `48`)
1378
+ * から解決。明示指定が常に優先。
1379
+ *
1380
+ * @defaultValue density 依存(standard: `40`)
1381
+ */
781
1382
  headerHeight?: number;
1383
+ /**
1384
+ * 密度プリセット。rowHeight / headerHeight の既定値と寸法トークン(セル横 padding / バー padding /
1385
+ * アイコンボタン寸法 / セル文字の相対拡縮)を一括切替。`'standard'` は従来と同値。
1386
+ * 個別調整はトークン(`--ssg-cell-pad-x` 等)の上書きで可能。popover / menu 等のポータルは対象外。
1387
+ *
1388
+ * @defaultValue `'standard'`
1389
+ */
782
1390
  density?: GridDensity;
1391
+ /**
1392
+ * カラーテーマ。`'dark'` でダークプリセット(`.ssg-theme-dark` のトークン一括上書き。Mantine dark
1393
+ * 系パレット)をグリッド本体・全ポータル(popover / menu / panel)
1394
+ * ・ドラッグゴースト・ツールチップへ適用。`'auto'` は `prefers-color-scheme` へ追従(Mantine /
1395
+ * HeroUI 等クラスベース dark 運用では、利用側カラースキームの解決値を `'light' | 'dark'`
1396
+ * で渡す使い方を推奨)。個別の色調整はトークン(`--ssg-*`)の上書きで可能。
1397
+ *
1398
+ * @defaultValue `'light'`
1399
+ */
783
1400
  theme?: GridTheme;
1401
+ /**
1402
+ * 行番号列の幅(px)。
1403
+ *
1404
+ * @defaultValue `56`
1405
+ */
784
1406
  rowHeaderWidth?: number;
1407
+ /**
1408
+ * グリッドの明示高さ。**値の種類で何の高さかが変わる**。① `%` を含む文字列(`'100%'` / `'50%'` /
1409
+ * `'calc(100% - 40px)'`):
1410
+ * トップバー・フィルターチップバー・ボトムバーを含む**グリッド全体**の高さ。`'100%'`
1411
+ * でグリッドが親要素に収まり、バーを除いた残りがスクロール領域になる(ルートに
1412
+ * `ssg-root--fill-height` が付く)。親要素が確定高さを持つ前提で、親が高さ `auto`
1413
+ * だと全行分まで伸びて仮想化が効かない。② `number`(px)/ `%` を含まない文字列(`'400px'` / `'50vh'`
1414
+ * / `'calc(100vh - 120px)'`): **スクロール領域だけ**の高さ(グリッド全体はバーの分だけ高くなる)。③
1415
+ * 未指定: スクロール領域は内容の高さで `maxHeight` によりクリップ。ルートへの
1416
+ * `style={{ height }}` だけではスクロール領域は決まらないため、高さはこの prop で指定する。
1417
+ */
785
1418
  height?: number | string;
1419
+ /**
1420
+ * **スクロール領域**の高さ上限(バーは含まない。`height` の種類に関わらず同じ)。
1421
+ * `height`・`maxHeight` が**共に未指定のときのみ**既定の 480px が効く(従来挙動)。数値の
1422
+ * `height` と併用するとスクロール領域 = `min(height, maxHeight)`、`%` の `height` と併用すると
1423
+ * `min(maxHeight, 親の高さ − バー)`(親が大きければグリッド全体はバー + `maxHeight` に縮む)。
1424
+ *
1425
+ * @defaultValue `—`(既定 480px)
1426
+ */
786
1427
  maxHeight?: number | string;
1428
+ /**
1429
+ * グリッド全体の編集を無効化。
1430
+ *
1431
+ * @defaultValue `false`
1432
+ */
787
1433
  readOnly?: boolean;
1434
+ /**
1435
+ * readonly セルの組み込み淡色表示(背景 + 文字色)を有効化。`false` でもセマンティッククラス
1436
+ * `.ssg-body-cell--readonly` は常時付与され、利用側 CSS のフックに使える。
1437
+ *
1438
+ * @defaultValue `false`
1439
+ */
788
1440
  dimReadOnlyCells?: boolean;
1441
+ /** セル単位の編集可否ゲート。 */
789
1442
  canEditCell?: (rowIndex: number, colIndex: number, row: T, column: GridColumn<T, F>) => boolean;
1443
+ /**
1444
+ * グリッド編集(セル編集 / ペースト / `renderCell` の `setValue`)の取り消し/やり直し。`Ctrl/Cmd+Z`
1445
+ * = undo、`Ctrl/Cmd+Shift+Z` / `Ctrl/Cmd+Y` = redo(ハンドルの `undo()` / `redo()` でも可)。
1446
+ * clientSide(`rows` + `onRowsChange`)専用で、serverSide(`dataSource`)/ `readOnly` /
1447
+ * `onRowsChange` 未指定時は無効。履歴は「変更前 rows 配列」
1448
+ * の参照スナップショット(未変更行は構造共有されるため低コスト)。**`onRowsChange`
1449
+ * で受け取った配列は参照そのまま `rows` へ戻すのが前提**(map 等で作り直すと毎回「外部変更」
1450
+ * と見なされ履歴が消える)。rows が grid 起点以外(親の直接 setState 等)
1451
+ * で差し替わると履歴は自動破棄。エディタ内の文字入力の取り消しは input のネイティブ undo
1452
+ * に委譲(グリッドの undo は**確定済みの編集**が対象)。
1453
+ *
1454
+ * @defaultValue `true`
1455
+ */
790
1456
  enableUndoRedo?: boolean;
1457
+ /**
1458
+ * `Delete` / `Backspace` キーによる選択セル(なければアクティブセル)の値クリア。`false`
1459
+ * でキーは何もしない(素通し)。ペースト・エディタでの上書き・undo/redo
1460
+ * には影響しない(クリアのキーボード操作だけの opt-out)。
1461
+ *
1462
+ * @defaultValue `true`
1463
+ */
791
1464
  enableClearOnDelete?: boolean;
1465
+ /**
1466
+ * 組み込みエディタ(text / number / select / date)の `Enter`
1467
+ * 確定後にアクティブセルをどこへ移すか(`'down'` | `'up'` | `'right'` | `'left'` | `'none'`。Excel
1468
+ * の「Enter キーを押したら、セルを移動する(方向)」相当)。`'none'` は移動せずその場に留まる。`Tab`
1469
+ * / `Shift+Tab`(右 / 左)と `Escape` には影響しない。custom エディタはキーバインドが consumer
1470
+ * 責務のため対象外(`ctx.commit(value, direction)` の direction で指定)。
1471
+ *
1472
+ * @defaultValue `'down'`
1473
+ */
792
1474
  editorEnterMove?: EditorEnterMove;
1475
+ /**
1476
+ * 保持する undo ステップ数の上限。超過分は古い順に破棄。
1477
+ *
1478
+ * @defaultValue `100`
1479
+ */
793
1480
  undoHistoryLimit?: number;
1481
+ /**
1482
+ * undo / redo 可能状態が**変化したとき**に呼ばれる(ツールバーの undo/redo ボタンの disabled
1483
+ * 表示などリアクティブな UI 用)。初回マウントでは発火せず、同値では再発火しない。
1484
+ * 毎レンダーのインライン関数でも問題ない。
1485
+ */
794
1486
  onUndoRedoStateChange?: (state: UndoRedoState) => void;
1487
+ /**
1488
+ * 複数セル範囲選択。
1489
+ *
1490
+ * @defaultValue `true`
1491
+ */
795
1492
  enableRangeSelection?: boolean;
1493
+ /**
1494
+ * チェックボックス行選択の有効化(マスタースイッチ)。`true` で行ヘッダ(行NO)
1495
+ * ガターが行選択のヒット領域になり、Excel 風のガター起点セル範囲選択は
1496
+ * off(ボディ側セルのドラッグ範囲選択は不変)。判定は O(1)・全選択は除外集合でキーを列挙しない(1M
1497
+ * 行でも一定コスト)。
1498
+ *
1499
+ * @defaultValue `false`
1500
+ */
796
1501
  enableRowSelection?: boolean;
1502
+ /**
1503
+ * 単一/複数の選択モード。single は常に 1 行。multiple はクリックでトグル、
1504
+ * shift+クリック/ガタードラッグで範囲選択。
1505
+ *
1506
+ * @defaultValue `'multiple'`
1507
+ */
797
1508
  rowSelectionMode?: RowSelectionMode;
1509
+ /**
1510
+ * ヘッダ左上コーナーの全選択チェック(tri-state: none/some/all)の有効化。
1511
+ *
1512
+ * @defaultValue `enableRowSelection && multiple`
1513
+ */
798
1514
  enableSelectAllRows?: boolean;
1515
+ /**
1516
+ * **controlled** の行選択記述子。`{ type:'include', rowKeys }`=これらを選択 /
1517
+ * `{ type:'exclude', rowKeys }`=全選択のうち除外。全選択をキー列挙せず表現できる。指定時は
1518
+ * controlled(内部 state を使わない)。
1519
+ */
799
1520
  rowSelection?: RowSelectionModel;
1521
+ /**
1522
+ * controlled 簡易版(`{ type:'include', rowKeys }` の糖衣)。`rowSelection` と併用時は
1523
+ * `rowSelection` を優先。全選択(exclude)は表現不可。
1524
+ */
800
1525
  selectedRowKeys?: GridRowKey[];
1526
+ /** 行選択変化の通知(controlled/uncontrolled いずれでも発火)。 */
801
1527
  onRowSelectionChange?: (model: RowSelectionModel) => void;
1528
+ /**
1529
+ * グローバルフィルター**機能**の有効化。`false` で機能が無効になり、
1530
+ * 既定トップバーのフィルター入力欄も出ない(summary は `showTopBarSummary` に従う。
1531
+ * トップバー自体を消すには `showTopBar=false`)。
1532
+ *
1533
+ * @defaultValue `true`
1534
+ */
802
1535
  enableGlobalFilter?: boolean;
1536
+ /**
1537
+ * 列ごとのフィルター。
1538
+ *
1539
+ * @defaultValue `true`
1540
+ */
803
1541
  enableColumnFilter?: boolean;
1542
+ /**
1543
+ * dateSet フィルター条件の日付入力を利用側コンポーネント(Mantine `DatePickerInput` 等)
1544
+ * へ差し替えるスロット。既定は内製フィールド(自由入力 + ドリルアップカレンダー。下記「dateSet
1545
+ * の日付入力(既定 UI)」節)。詳細は「日付入力の差し替え(renderFilterDateInput)」節。
1546
+ *
1547
+ * @defaultValue 内製の日付フィールド
1548
+ */
804
1549
  renderFilterDateInput?: (ctx: FilterDateInputContext) => F['node'];
1550
+ /**
1551
+ * set / select / 複合(numberSet / textSet / dateSet)列の候補を**非同期に供給**する(DB の DISTINCT
1552
+ * など)。popover を開くたびに
1553
+ * `{ columnKey, column, columnFilters(自列を除く他列の有効フィルター), globalText, signal }`
1554
+ * で呼ばれ、閉じる / 列切替で `signal` が abort される(ライブラリはキャッシュしない)。読み込み中
1555
+ * / 失敗(再試行)/ 打ち切り(`truncated`)の表示は popover が持つ。優先順位は
1556
+ * `column.filterOptions`(静的)> `getFilterOptions` > rows 自動収集。非同期候補の列は反転(exclude)
1557
+ * 可。clientSide / serverSide 両対応。詳細は「ソートとフィルター」ガイド。
1558
+ */
805
1559
  getFilterOptions?: (params: GetFilterOptionsParams<T, F>) => Promise<GetFilterOptionsResult>;
1560
+ /**
1561
+ * ヘッダークリックでのソート。
1562
+ *
1563
+ * @defaultValue `true`
1564
+ */
806
1565
  enableSorting?: boolean;
1566
+ /**
1567
+ * 列 / グローバルフィルターの**絞り込みをグリッドで行わない**(手動フィルターモード)。フィルター
1568
+ * UI(popover / チップバー / フィルター管理 / フィルター中の印)と状態(`GridState.filters` /
1569
+ * `onStateChange`)は従来どおり動き、`rows` は渡した件数・順のまま表示される(絞り込みはサーバ側
1570
+ * WHERE 等の外部責務)。`rows` が 0 件でフィルターが載っているときは `noMatchingRowsText` を表示。
1571
+ * serverSide(`dataSource`)では無視。詳細は「ソートとフィルター」ガイド。
1572
+ *
1573
+ * @defaultValue `false`
1574
+ */
807
1575
  manualFiltering?: boolean;
1576
+ /**
1577
+ * ソートの**並べ替えをグリッドで行わない**(手動ソートモード)。ソート UI と状態(`GridState.sort` /
1578
+ * `onStateChange`)は従来どおり動き、`rows` は渡した順のまま。再マウントなしで切り替え可(`false`
1579
+ * へ戻すと即座にクライアントソートが適用)。手動ソート中はラベル行の `sortMode` 連動 /
1580
+ * 行ドラッグの無効化は起きない(並べ替えていない扱い)。serverSide では無視。
1581
+ *
1582
+ * @defaultValue `false`
1583
+ */
808
1584
  manualSorting?: boolean;
1585
+ /**
1586
+ * 列幅の手動リサイズ可否のグリッド既定。各列 `resizable`
1587
+ * 未指定時に継承(`column.resizable ?? enableColumnResize`)。
1588
+ *
1589
+ * @defaultValue `true`
1590
+ */
809
1591
  enableColumnResize?: boolean;
1592
+ /**
1593
+ * データ投入時に全列幅を内容へ自動フィット。`'onMount'`=初回にデータが載った一度きり /
1594
+ * `'onDataChange'`=`rows`(参照)が変わるたび(= データ差し替えのたび。手動リサイズは上書き) /
1595
+ * `false`=無効。計測は列メニュー「すべての列の幅を自動調整」と同一エンジン(`suppressAutoSize` /
1596
+ * `autoHeight` 列は除外)。フィルター / ソート / 列並べ替えでは再フィットしません。
1597
+ * serverSide(`dataSource`)では無効。詳細は「flex と autoSize」節。
1598
+ *
1599
+ * @defaultValue `false`
1600
+ */
810
1601
  autoSizeColumns?: AutoSizeColumnsMode;
1602
+ /**
1603
+ * セル内容が省略(…)される列で、ホバー時に全文ツールチップを表示。
1604
+ * 対象は既定テキストセルのみ(`renderCell` 列 / `autoHeight` 折り返し列は対象外)。表示はホバー時に
1605
+ * `scrollWidth > clientWidth` を判定し、実際にクリップされているセルのみ。
1606
+ * 既存のカスタムツールチップ(`data-ssg-tooltip`)を共有。詳細は「ツールチップ」節。
1607
+ *
1608
+ * @defaultValue `false`
1609
+ */
811
1610
  showCellOverflowTooltip?: boolean;
1611
+ /**
1612
+ * invalid マーク(背景 + 右上マーカー + ホバーツールチップ)の表示可否。`false` で非表示 +
1613
+ * 可視セルの `validate` 評価スキップ。`getInvalidCells()` と `validationMode: 'reject'`
1614
+ * の書き込み拒否には影響しない(独立経路)。「送信時にだけマークを出す」UX は利用側 state で本 prop
1615
+ * を切り替えて実現(「バリデーション」節のレシピ参照)。
1616
+ *
1617
+ * @defaultValue `true`
1618
+ */
812
1619
  showValidationMarks?: boolean;
1620
+ /**
1621
+ * 行ホバー時に行全体を薄くハイライト。
1622
+ *
1623
+ * @defaultValue `true`
1624
+ */
813
1625
  enableRowHover?: boolean;
1626
+ /**
1627
+ * 行ホバーの controlled 値(ビュー行 index / `null` = ホバーなし)。指定時は内部 state
1628
+ * を使わずこの値でハイライトし、pointer 由来の変化は `onHoveredRowChange` で通知のみ(optionally
1629
+ * controlled)。`enableRowHover: false` のときは無視(ハイライトも通知もしない)。一時的な UI
1630
+ * 状態のため `GridState` / ハンドルには載らない。
1631
+ */
814
1632
  hoveredRowIndex?: number | null;
1633
+ /**
1634
+ * 行ホバーが変わったときの通知(uncontrolled でも呼ばれる)。`viewRowIndex` はフィルター /
1635
+ * ソート適用後のビュー行 index。同値では発火しない(pointerenter
1636
+ * は同一行内のセル跨ぎでも来るため)。用途: 複数グリッド間のホバー同期など。
1637
+ */
815
1638
  onHoveredRowChange?: (viewRowIndex: number | null, ctx: {
816
1639
  source: 'pointer';
817
1640
  }) => void;
1641
+ /**
1642
+ * 列ヘッダーのホバー時にヘッダーセルを薄くハイライト。
1643
+ *
1644
+ * @defaultValue `true`
1645
+ */
818
1646
  enableColumnHeaderHover?: boolean;
1647
+ /**
1648
+ * 列メニュー(⋮ + ヘッダー右クリック)。
1649
+ *
1650
+ * @defaultValue `true`
1651
+ */
819
1652
  enableColumnMenu?: boolean;
1653
+ /**
1654
+ * フィルター結果 0 行時のオーバーレイ文言。
1655
+ *
1656
+ * @defaultValue `'一致する行がありません'`
1657
+ */
820
1658
  noMatchingRowsText?: string;
1659
+ /**
1660
+ * rows が 0 件のときの文言。
1661
+ *
1662
+ * @defaultValue `'表示する行がありません'`
1663
+ */
821
1664
  noRowsText?: string;
1665
+ /**
1666
+ * 上部バー(ツールバー)の表示有無。`false` で `renderTopBar` / `enableGlobalFilter`
1667
+ * に関わらず一切描画しない(表示のマスタースイッチ。矛盾指定時は `renderTopBar` より優先)。
1668
+ *
1669
+ * @defaultValue `true`
1670
+ */
822
1671
  showTopBar?: boolean;
1672
+ /**
1673
+ * 既定トップバーの summary chips(件数/フィルター/ソート)の表示有無。`renderTopBar`
1674
+ * 未指定時のみ有効。これと `showTopBarFilter`
1675
+ * がともに非表示なら既定トップバーは描画されない(空バーを出さない)。
1676
+ *
1677
+ * @defaultValue `true`
1678
+ */
823
1679
  showTopBarSummary?: boolean;
1680
+ /**
1681
+ * 既定トップバーの Rows / Columns 件数 chips の表示有無。`showTopBarSummary=true`(かつ
1682
+ * `renderTopBar` 未指定)のときのみ有効。Filter / Sort chips は対象外。
1683
+ *
1684
+ * @defaultValue `true`
1685
+ */
824
1686
  showTopBarCounts?: boolean;
1687
+ /**
1688
+ * 既定トップバーのグローバルフィルター入力欄の表示有無。`renderTopBar` 未指定時のみ有効。
1689
+ * `enableGlobalFilter=false` のときは本値に関わらず非表示。
1690
+ *
1691
+ * @defaultValue `true`
1692
+ */
825
1693
  showTopBarFilter?: boolean;
1694
+ /**
1695
+ * 既定トップバーのグローバルフィルター入力の placeholder。`renderTopBar` 未指定時のみ有効。
1696
+ *
1697
+ * @defaultValue `'グローバルフィルター'`
1698
+ */
826
1699
  globalFilterPlaceholder?: string;
1700
+ /**
1701
+ * 既定トップバーのグローバルフィルター入力の左アイコン。`renderTopBar` 未指定時のみ有効。
1702
+ * `undefined`=組み込みの検索(虫眼鏡)アイコン / `null`(など falsy)=アイコン無し / 任意
1703
+ * `ReactNode`=差し替え。クリアボタンは入力枠の内側右に `×` で表示され、入力が空のときは出ない。
1704
+ *
1705
+ * @defaultValue 組み込み検索アイコン
1706
+ */
827
1707
  globalFilterIcon?: F['node'];
1708
+ /**
1709
+ * 下部バー(ステータスバー)の表示有無。`false` で `renderBottomBar`
1710
+ * に関わらず一切描画しない(表示のマスタースイッチ。矛盾指定時は `renderBottomBar` より優先)。
1711
+ *
1712
+ * @defaultValue `true`
1713
+ */
828
1714
  showBottomBar?: boolean;
1715
+ /**
1716
+ * 既定ボトムバーの Rows / Columns 件数 chips(左側)の表示有無。`renderBottomBar`
1717
+ * 未指定時のみ有効。右側の Active / Selection / 選択統計 / Cols は対象外。
1718
+ *
1719
+ * @defaultValue `true`
1720
+ */
829
1721
  showBottomBarCounts?: boolean;
1722
+ /**
1723
+ * フィルターチップバー(適用中の列フィルターをトップバー直下にチップで常時表示)
1724
+ * の表示有無(opt-in)。有効フィルター 0 件時はバーごと非表示(空バーは出さない)。`showTopBar`
1725
+ * とは独立。チップ本体クリックで対象列へジャンプしてフィルター popover を開き、× で個別クリア、
1726
+ * 「すべてクリア」は列フィルターのみ対象(グローバルフィルターは対象外)。
1727
+ *
1728
+ * @defaultValue `false`
1729
+ */
830
1730
  showFilterChipBar?: boolean;
1731
+ /**
1732
+ * 上部バーの差し替え。未指定時は内蔵トップバー(summary chips + フィルター入力。内訳は
1733
+ * `showTopBarSummary` / `showTopBarFilter` で制御。フィルター入力は `enableGlobalFilter=true`
1734
+ * が前提)。`showTopBar=false` 時は本指定に関わらず描画されない。
1735
+ *
1736
+ * @defaultValue 内蔵トップバー
1737
+ */
831
1738
  renderTopBar?: (context: SpreadsheetGridSlotContext<T, F>) => F['node'];
1739
+ /**
1740
+ * 下部バーの差し替え。未指定時は内蔵ステータスバー。`showBottomBar=false`
1741
+ * 時は本指定に関わらず描画されない。
1742
+ *
1743
+ * @defaultValue 内蔵ボトムバー
1744
+ */
832
1745
  renderBottomBar?: (context: SpreadsheetGridSlotContext<T, F>) => F['node'];
1746
+ /** ルート要素の class。 */
833
1747
  className?: string;
1748
+ /**
1749
+ * ルート要素(`.ssg-root`)のインライン style。`classNames.root` の style とマージされ、
1750
+ * こちらが後勝ち。
1751
+ */
834
1752
  style?: F['style'];
1753
+ /**
1754
+ * パーツ別の追加スロット。各値は `GridSlotProps`(`string | { className?, style? }`)で、StyleX の
1755
+ * `stylex.props(...)` の戻り値をそのまま渡せる。全 25
1756
+ * スロット配線済み(一覧と規則は「パーツ別スロット」節)。
1757
+ * レンダー毎に新しいオブジェクトを渡してもよい(内容の署名で memo)。基底 class
1758
+ * は未レイヤー・特異度 (0,1,0)
1759
+ * のため同特異度のクラスは読み込み順で決まる(確実な上書きは連結セレクタか `style.layer.css`)。
1760
+ */
835
1761
  classNames?: GridClassNames<F>;
1762
+ /**
1763
+ * 行ごとの追加 class(または `{ className, style }`)。行コンテナ + 行ヘッダー「#」セル +
1764
+ * 各データセルに付与され、Tailwind / StyleX での行ハイライトに使える。`style`
1765
+ * はインラインで付与され、座標 / 寸法はグリッドが後勝ち(返した style は内容比較で memo される)。
1766
+ * 第 3 引数 `ctx` は `{ row, rowIndex, sourceRowIndex, rowKey, isSelected }`(「補助型」節参照)。
1767
+ * 既存の 2 引数関数もそのまま動く(後方互換)。グループ行は対象外。
1768
+ */
836
1769
  getRowClassName?: (row: T, rowIndex: number, ctx: RowStyleContext<T>) => GridSlotProps<F> | undefined;
1770
+ /**
1771
+ * **展開行(Master/Detail)**。マスター行の直下に、行順(view index)を変えずに全幅の帯を差し込み、
1772
+ * その中(カード)へ `render` の返す任意の React 要素(自前のサブグリッド / フォーム / 集計パネル等)
1773
+ * を描画する。指定時のみ有効で、未指定なら既存の描画・状態・イベント経路は一切変わらない。
1774
+ * `{ render, height?, isExpandable?, showToggleColumn?, className? }`。clientSide / serverSide
1775
+ * の両方で使える(serverSide の制約は節内)。詳細は「展開行(Master/Detail)」節を参照。
1776
+ *
1777
+ * @defaultValue —(無効)
1778
+ */
837
1779
  detailRow?: DetailRowOptions<T, F>;
1780
+ /**
1781
+ * 展開中の展開行のマスター行キー集合が**変化したとき**に呼ばれる(開閉の永続化・外部同期用)。
1782
+ * 初回マウントでは発火しない。インライン関数可(latest-ref 経由)。
1783
+ */
838
1784
  onExpandedDetailRowKeysChange?: (keys: GridRowKey[]) => void;
1785
+ /**
1786
+ * **ラベル行(見出し / 区切り行)**。`rows` の中で `isLabelRow(row)` が true
1787
+ * の行を「行数に数えない見出し」として、3 ペインを跨ぐ全幅の帯で描画する(中身は `render` で任意の
1788
+ * React 要素に差し替え可。横スクロールしても左端に留まる)。編集 / 選択 / コピー /
1789
+ * エクスポートの既定対象外で、行番号も消費しない。ソート /
1790
+ * フィルターは既定でラベル行から次のラベル行までの区間(セクション)に閉じる(`sortMode`)。
1791
+ * `sticky: true` で現在セクションのラベルを列ヘッダー直下に固定。
1792
+ * `{ isLabelRow, getLabel, render?, height?, className?, sticky?, sortMode?, keepEmptySections?, exportText? }`。
1793
+ * 行グルーピング(`rowGroup`)とは別機能で併用不可。詳細は「ラベル行(見出し / 区切り行)」節。
1794
+ *
1795
+ * @defaultValue —(無効)
1796
+ */
839
1797
  labelRow?: LabelRowOptions<T, F>;
1798
+ /**
1799
+ * **行ドラッグ並び替え**。先頭にドラッグハンドル列(幅 28px・タイトル無しの合成列。
1800
+ * 左固定列があれば左固定側)を挿入し、ハンドル(⋮⋮)を掴んで行を上下へ動かせる。確定時は
1801
+ * `onRowsChange` へ移動後の**新配列**を渡し(履歴ラッパ経由 = undo/redo 対象)、続けて `onRowMove`
1802
+ * を呼ぶ。clientSide(`rows` + `onRowsChange`)専用で、`dataSource`(serverSide)/ 行グルーピング中 /
1803
+ * `onRowsChange` 未指定ではハンドル列を出さない。ソート / フィルター適用中はハンドルを淡色 +
1804
+ * 理由ツールチップにして操作を無効化する(列は残る)。詳細は「行ドラッグ並び替え」節。
1805
+ *
1806
+ * @defaultValue `false`
1807
+ */
840
1808
  enableRowDrag?: boolean;
1809
+ /**
1810
+ * 行ごとのドラッグ可否。`false` の行にはハンドルを描画しない。
1811
+ * `ctx = { rowKey, sourceRowIndex }`。
1812
+ *
1813
+ * @defaultValue 全行可
1814
+ */
841
1815
  isRowDraggable?: (row: T, ctx: RowDragContext) => boolean;
1816
+ /**
1817
+ * 行移動の確定後(`onRowsChange` の直後)に呼ばれる。
1818
+ * `params = { rowKey, fromIndex, toIndex, rows }`(index は元 `rows` 配列基準、`rows` は
1819
+ * `onRowsChange` と同じ新配列参照)。ハンドルの `moveRow()` による移動でも呼ばれる。
1820
+ */
842
1821
  onRowMove?: (params: RowMoveParams<T>) => void;
1822
+ /**
1823
+ * コンテキストメニュー機能の有効化(マスタースイッチ)。他機能の `enable*` と同じく**既定 OFF**。
1824
+ * `false` のあいだは `getContextMenuItems` を渡しても発火せず、
1825
+ * 右クリックはブラウザ標準メニューのまま。現状はまだ機能 / UI に改善余地があるため既定 OFF
1826
+ * で提供する(利用側で明示 opt-in)。
1827
+ *
1828
+ * @defaultValue `false`
1829
+ */
843
1830
  enableContextMenu?: boolean;
1831
+ /**
1832
+ * セル/行の**完全カスタム**コンテキストメニュー。右クリック時のみ呼ばれ、
1833
+ * 返した項目でメニューを描画する(ライブラリは固定の既定項目を持たない)。opt-in は
1834
+ * `enableContextMenu={true}` かつ本コールバックの指定の両方。**未指定、または `[]`
1835
+ * を返したときはブラウザ標準の右クリックメニューへフォールスルー**(空パネルは出さない)。SSRM
1836
+ * 未ロード行では開かない。ヘッダー右クリックは列メニュー(`enableColumnMenu`)が担当し、
1837
+ * 本メニューはボディ(セル / 行NO ガター)専用。詳細は「コンテキストメニュー」節を参照。
1838
+ */
844
1839
  getContextMenuItems?: (params: GridContextMenuParams<T, F>) => GridContextMenuItem<F>[];
1840
+ /** */
845
1841
  onContextMenuOpen?: (params: GridContextMenuParams<T, F>) => void;
1842
+ /**
1843
+ * **スクロール位置インジケーター**。スクロール中にスクロールバー脇へ行番号バブル(「行 N /
1844
+ * 総行数」+ 任意の列値)と行目盛りルーラーを表示し、スクロールバー帯のホバーで「行 N へ」
1845
+ * のジャンプ先プレビューを出す。`true`
1846
+ * は全既定(`{ bubble: true, ruler: true, scrollbar: true, trigger: 'scroll', minRows: 0 }`)
1847
+ * と同義。`minRows` で「表示行数がしきい値以上のときだけ有効」のデータ量ゲートも掛けられる。
1848
+ * 表示は総行数とスクロール位置のみで駆動されるため **clientSide / SSRM の全構成で動作**。
1849
+ * オーバーレイは `pointer-events: none` で既存操作へ一切干渉しない。
1850
+ * 詳細は「スクロール位置インジケーター」節を参照。
1851
+ *
1852
+ * @defaultValue —(無効)
1853
+ */
846
1854
  scrollHint?: boolean | ScrollHintOptions<T, F>;
847
1855
  };