@ishibashi0112/spreadsheet-grid 0.33.0 → 0.35.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.
@@ -1,13 +1,14 @@
1
1
  import type { RefObject } from 'react';
2
- import type { GridContextMenuItem } from '../model/gridTypes';
2
+ import type { GridContextMenuItem, GridResolvedSlots } from '../model/gridTypes';
3
3
  import type { CellContextMenuLayout } from '../hooks/useCellContextMenuController';
4
4
  type CellContextMenuPopoverProps = {
5
5
  isOpen: boolean;
6
6
  themeClassName?: string;
7
+ slots?: GridResolvedSlots;
7
8
  items: GridContextMenuItem[];
8
9
  layout: CellContextMenuLayout | null;
9
10
  popoverRef: RefObject<HTMLDivElement | null>;
10
11
  onRequestClose: () => void;
11
12
  };
12
- export declare function CellContextMenuPopover({ isOpen, themeClassName, items, layout, popoverRef, onRequestClose, }: CellContextMenuPopoverProps): import("react").ReactPortal | null;
13
+ export declare function CellContextMenuPopover({ isOpen, themeClassName, slots, items, layout, popoverRef, onRequestClose, }: CellContextMenuPopoverProps): import("react").ReactPortal | null;
13
14
  export default CellContextMenuPopover;
@@ -6,6 +6,7 @@ import { type NumberFilterConditionDraft } from '../logic/numberFilterCondition'
6
6
  import { type TextFilterConditionDraft } from '../logic/textFilterCondition';
7
7
  import { type DateFilterConditionDraft } from '../logic/dateFilterCondition';
8
8
  import { type NormalizedDateFilterPreset } from '../logic/dateFilterPresets';
9
+ import type { GridResolvedSlot } from '../model/gridTypes';
9
10
  export type ColumnFilterPopoverLayout = {
10
11
  top: number;
11
12
  left: number;
@@ -19,6 +20,7 @@ export type ColumnFilterPopoverOption = {
19
20
  type ColumnFilterPopoverProps = {
20
21
  isOpen: boolean;
21
22
  themeClassName?: string;
23
+ popoverSlot?: GridResolvedSlot;
22
24
  title: string;
23
25
  filterType: ColumnFilterUiType;
24
26
  draftValue: string;
@@ -52,5 +54,5 @@ type ColumnFilterPopoverProps = {
52
54
  onSetReplaceSelection: (values: string[]) => void;
53
55
  isServerSide?: boolean;
54
56
  };
55
- export declare function ColumnFilterPopover({ isOpen, themeClassName, title, filterType, draftValue, numberConditionDraft, onNumberConditionDraftChange, textConditionDraft, onTextConditionDraftChange, dateConditionDraft, onDateConditionDraftChange, datePresets, renderDateInput, onComboConditionClear, onComboSelectionClear, comboSummaryText, currentValueText, layout, selectOptions, optionsStatus, optionsProgress, setSelection, popoverRef, textInputRef, selectRef, onRequestClose, onDraftChange, onApply, onClear, onSetValueToggle, onSetSelectAllChange, onSetClear, onSetReplaceSelection, isServerSide, }: ColumnFilterPopoverProps): import("react").ReactPortal | null;
57
+ export declare function ColumnFilterPopover({ isOpen, themeClassName, popoverSlot, title, filterType, draftValue, numberConditionDraft, onNumberConditionDraftChange, textConditionDraft, onTextConditionDraftChange, dateConditionDraft, onDateConditionDraftChange, datePresets, renderDateInput, onComboConditionClear, onComboSelectionClear, comboSummaryText, currentValueText, layout, selectOptions, optionsStatus, optionsProgress, setSelection, popoverRef, textInputRef, selectRef, onRequestClose, onDraftChange, onApply, onClear, onSetValueToggle, onSetSelectAllChange, onSetClear, onSetReplaceSelection, isServerSide, }: ColumnFilterPopoverProps): import("react").ReactPortal | null;
56
58
  export default ColumnFilterPopover;
@@ -1,9 +1,11 @@
1
1
  import type { RefObject } from 'react';
2
2
  import type { GridColumnPinned, GridSortDirection } from '../model/gridTypes';
3
3
  import type { ColumnMenuLayout } from '../hooks/useColumnMenuController';
4
+ import type { GridResolvedSlots } from '../model/gridTypes';
4
5
  type ColumnMenuPopoverProps = {
5
6
  isOpen: boolean;
6
7
  themeClassName?: string;
8
+ slots?: GridResolvedSlots;
7
9
  title: string;
8
10
  columnKey: string;
9
11
  canFilter: boolean;
@@ -26,5 +28,5 @@ type ColumnMenuPopoverProps = {
26
28
  onResetColumns: () => void;
27
29
  onRequestClose: () => void;
28
30
  };
29
- export declare function ColumnMenuPopover({ isOpen, themeClassName, title, columnKey, canFilter, onOpenFilter, canSort, sortDirection, onSortChange, onOpenSortManager, canManageFilters, onOpenFilterManager, pinned, canChangePinned, layout, popoverRef, onPinnedChange, onAutosizeColumn, onAutosizeAllColumns, onOpenColumnChooser, canResetColumns, onResetColumns, onRequestClose, }: ColumnMenuPopoverProps): import("react").ReactPortal | null;
31
+ export declare function ColumnMenuPopover({ isOpen, themeClassName, slots, title, columnKey, canFilter, onOpenFilter, canSort, sortDirection, onSortChange, onOpenSortManager, canManageFilters, onOpenFilterManager, pinned, canChangePinned, layout, popoverRef, onPinnedChange, onAutosizeColumn, onAutosizeAllColumns, onOpenColumnChooser, canResetColumns, onResetColumns, onRequestClose, }: ColumnMenuPopoverProps): import("react").ReactPortal | null;
30
32
  export default ColumnMenuPopover;
@@ -1,7 +1,9 @@
1
1
  import type { SpreadsheetGridSlotContext } from '../model/gridTypes';
2
+ import type { GridResolvedSlot } from '../model/gridTypes';
2
3
  type DefaultGridBottomBarProps<T> = {
3
4
  context: SpreadsheetGridSlotContext<T>;
4
5
  showCounts?: boolean;
6
+ slot?: GridResolvedSlot;
5
7
  };
6
- export declare function DefaultGridBottomBar<T>({ context, showCounts, }: DefaultGridBottomBarProps<T>): import("react").JSX.Element;
8
+ export declare function DefaultGridBottomBar<T>({ context, showCounts, slot, }: DefaultGridBottomBarProps<T>): import("react").JSX.Element;
7
9
  export default DefaultGridBottomBar;
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { SpreadsheetGridSlotContext } from '../model/gridTypes';
3
+ import type { GridResolvedSlot } from '../model/gridTypes';
3
4
  type DefaultGridTopBarProps<T> = {
4
5
  context: SpreadsheetGridSlotContext<T>;
5
6
  showSummary?: boolean;
@@ -8,6 +9,7 @@ type DefaultGridTopBarProps<T> = {
8
9
  globalFilterPlaceholder?: string;
9
10
  globalFilterIcon?: ReactNode;
10
11
  onFilterSummaryClick?: () => void;
12
+ slot?: GridResolvedSlot;
11
13
  };
12
- export declare function DefaultGridTopBar<T>({ context, showSummary, showFilter, showCounts, globalFilterPlaceholder, globalFilterIcon, onFilterSummaryClick, }: DefaultGridTopBarProps<T>): import("react").JSX.Element;
14
+ export declare function DefaultGridTopBar<T>({ context, showSummary, showFilter, showCounts, globalFilterPlaceholder, globalFilterIcon, onFilterSummaryClick, slot, }: DefaultGridTopBarProps<T>): import("react").JSX.Element;
13
15
  export default DefaultGridTopBar;
@@ -3,6 +3,7 @@ import type { SelectionSnapshot } from '../model/gridSelectors';
3
3
  import type { CellCoord, CellRenderState, GridColumn, RowModel, RowSelectionState, RowStyleContext, SpreadsheetGridProps } from '../model/gridTypes';
4
4
  import type { PaneColumnEntry } from '../logic/geometry';
5
5
  import type { GridPaneKind } from './GridHeaderRow';
6
+ import type { GridResolvedSlots, GridSlotProps } from '../model/gridTypes';
6
7
  type VirtualRowLike = {
7
8
  index: number;
8
9
  start: number;
@@ -40,10 +41,8 @@ type GridBodyLayerProps<T> = {
40
41
  onCellPointerEnter: (cell: CellCoord, event: PointerEvent<HTMLDivElement>) => void;
41
42
  onCellDoubleClick: (cell: CellCoord) => void;
42
43
  renderCellContent: (row: T, rowIndex: number, column: GridColumn<T>, colIndex: number, cellState: CellRenderState) => ReactNode;
43
- getRowClassName?: (row: T, rowIndex: number, ctx: RowStyleContext<T>) => string | undefined;
44
- bodyCellClassName?: string;
45
- bodyRowClassName?: string;
46
- rowHeaderCellClassName?: string;
44
+ getRowClassName?: (row: T, rowIndex: number, ctx: RowStyleContext<T>) => GridSlotProps | undefined;
45
+ slots?: GridResolvedSlots;
47
46
  };
48
- export declare function GridBodyLayer<T>({ pane, ownsRowHeader, leadingWidth, rowModel, virtualRows, virtualRowIndexes, renderEntries, rowHeight, autoHeight, showCellOverflowTooltip, showValidationMarks, isServerSide, collapsedGroupKeys, onGroupToggle, rowHeaderCellStyle, hoveredRowIndex, isWholeGridSelected, enableRowSelection, rowSelectionState, activeCell, editingCell, selectionSnapshot, readOnly, canEditCell, onRowHeaderPointerDown, onRowHeaderPointerEnter, onRowHeaderPointerLeave, onCellPointerDown, onCellPointerEnter, onCellDoubleClick, renderCellContent, getRowClassName, bodyCellClassName, bodyRowClassName, rowHeaderCellClassName, }: GridBodyLayerProps<T>): import("react").JSX.Element;
47
+ export declare function GridBodyLayer<T>({ pane, ownsRowHeader, leadingWidth, rowModel, virtualRows, virtualRowIndexes, renderEntries, rowHeight, autoHeight, showCellOverflowTooltip, showValidationMarks, isServerSide, collapsedGroupKeys, onGroupToggle, rowHeaderCellStyle, hoveredRowIndex, isWholeGridSelected, enableRowSelection, rowSelectionState, activeCell, editingCell, selectionSnapshot, readOnly, canEditCell, onRowHeaderPointerDown, onRowHeaderPointerEnter, onRowHeaderPointerLeave, onCellPointerDown, onCellPointerEnter, onCellDoubleClick, renderCellContent, getRowClassName, slots, }: GridBodyLayerProps<T>): import("react").JSX.Element;
49
48
  export default GridBodyLayer;
@@ -1,5 +1,6 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import type { VerticalRow } from '../logic/verticalGeometry';
3
+ import type { GridResolvedSlot, GridResolvedSlots } from '../model/gridTypes';
3
4
  export type GridDetailLayerEntry = {
4
5
  rowKey: string | number;
5
6
  virtualRow: VerticalRow;
@@ -11,9 +12,10 @@ type GridDetailLayerProps = {
11
12
  baseOffset: number;
12
13
  cardStickyLeft: number;
13
14
  cardWidth: number;
14
- cardClassName?: string;
15
+ cardSlot?: GridResolvedSlot;
16
+ slots?: GridResolvedSlots;
15
17
  renderCard: (entry: GridDetailLayerEntry) => ReactNode;
16
18
  };
17
- declare function GridDetailLayerInner({ entries, mode, paneWidth, baseOffset, cardStickyLeft, cardWidth, cardClassName, renderCard, }: GridDetailLayerProps): import("react").JSX.Element | null;
19
+ declare function GridDetailLayerInner({ entries, mode, paneWidth, baseOffset, cardStickyLeft, cardWidth, cardSlot, slots, renderCard, }: GridDetailLayerProps): import("react").JSX.Element | null;
18
20
  export declare const GridDetailLayer: import("react").MemoExoticComponent<typeof GridDetailLayerInner>;
19
21
  export default GridDetailLayer;
@@ -1,10 +1,12 @@
1
1
  import type { FilterManagementEntry } from './FilterManagementPanel';
2
+ import type { GridResolvedSlot } from '../model/gridTypes';
2
3
  type GridFilterChipBarProps = {
3
4
  entries: FilterManagementEntry[];
4
5
  canFilter: boolean;
5
6
  onEditFilter: (columnKey: string) => void;
6
7
  onClearFilter: (columnKey: string) => void;
7
8
  onClearAllFilters: () => void;
9
+ slot?: GridResolvedSlot;
8
10
  };
9
- export declare function GridFilterChipBar({ entries, canFilter, onEditFilter, onClearFilter, onClearAllFilters, }: GridFilterChipBarProps): import("react").JSX.Element | null;
11
+ export declare function GridFilterChipBar({ entries, canFilter, onEditFilter, onClearFilter, onClearAllFilters, slot, }: GridFilterChipBarProps): import("react").JSX.Element | null;
10
12
  export default GridFilterChipBar;
@@ -2,6 +2,7 @@ import { type CSSProperties, type MouseEvent, type PointerEvent } from 'react';
2
2
  import type { SelectionSnapshot } from '../model/gridSelectors';
3
3
  import type { ColumnFilterValue, GridColumn, GridSortState, SelectAllState } from '../model/gridTypes';
4
4
  import type { PaneColumnEntry } from '../logic/geometry';
5
+ import type { GridResolvedSlots } from '../model/gridTypes';
5
6
  export type GridPaneKind = 'left' | 'center' | 'right';
6
7
  type GridHeaderRowProps<T> = {
7
8
  pane: GridPaneKind;
@@ -9,9 +10,7 @@ type GridHeaderRowProps<T> = {
9
10
  leadingWidth: number;
10
11
  headerHeight: number;
11
12
  rowHeaderCellStyle: CSSProperties;
12
- headerRowClassName?: string;
13
- headerCellClassName?: string;
14
- rowHeaderCellClassName?: string;
13
+ slots?: GridResolvedSlots;
15
14
  isCornerHovered: boolean;
16
15
  isWholeGridSelected: boolean;
17
16
  showSelectAllCheckbox: boolean;
@@ -23,7 +22,6 @@ type GridHeaderRowProps<T> = {
23
22
  selectionSnapshot: SelectionSnapshot;
24
23
  columnFilterValues: Record<string, ColumnFilterValue>;
25
24
  sortState: GridSortState;
26
- iconButtonClassName?: string;
27
25
  onCornerPointerDown: (event: PointerEvent<HTMLDivElement>) => void;
28
26
  onCornerPointerEnter: () => void;
29
27
  onCornerPointerLeave: () => void;
@@ -39,6 +37,6 @@ type GridHeaderRowProps<T> = {
39
37
  onColumnHeaderContextMenu: (column: GridColumn<T>, event: MouseEvent<HTMLDivElement>) => void;
40
38
  onColumnDragHandlePointerDown?: (column: GridColumn<T>, event: PointerEvent<HTMLSpanElement>) => void;
41
39
  };
42
- declare function GridHeaderRowInner<T>({ pane, ownsRowHeader, leadingWidth, headerHeight, rowHeaderCellStyle, headerRowClassName, headerCellClassName, rowHeaderCellClassName, isCornerHovered, isWholeGridSelected, showSelectAllCheckbox, selectAllState, filteredRowsLength, visibleColumnsLength, renderEntries, hoveredColumnIndex, selectionSnapshot, columnFilterValues, sortState, iconButtonClassName, onCornerPointerDown, onCornerPointerEnter, onCornerPointerLeave, onColumnHeaderPointerDown, onColumnHeaderPointerEnter, onColumnHeaderPointerLeave, onColumnResizePointerDown, enableColumnResize, enableColumnMenu, openedMenuColumnKey, onColumnMenuButtonPointerDown, onColumnMenuButtonClick, onColumnHeaderContextMenu, onColumnDragHandlePointerDown, }: GridHeaderRowProps<T>): import("react").JSX.Element;
40
+ declare function GridHeaderRowInner<T>({ pane, ownsRowHeader, leadingWidth, headerHeight, rowHeaderCellStyle, slots, isCornerHovered, isWholeGridSelected, showSelectAllCheckbox, selectAllState, filteredRowsLength, visibleColumnsLength, renderEntries, hoveredColumnIndex, selectionSnapshot, columnFilterValues, sortState, onCornerPointerDown, onCornerPointerEnter, onCornerPointerLeave, onColumnHeaderPointerDown, onColumnHeaderPointerEnter, onColumnHeaderPointerLeave, onColumnResizePointerDown, enableColumnResize, enableColumnMenu, openedMenuColumnKey, onColumnMenuButtonPointerDown, onColumnMenuButtonClick, onColumnHeaderContextMenu, onColumnDragHandlePointerDown, }: GridHeaderRowProps<T>): import("react").JSX.Element;
43
41
  export declare const GridHeaderRow: typeof GridHeaderRowInner;
44
42
  export default GridHeaderRow;
@@ -2,9 +2,11 @@ import type { RefObject } from 'react';
2
2
  import type { RowModel } from '../model/gridTypes';
3
3
  import type { RowMetrics } from '../logic/verticalGeometry';
4
4
  import type { ResolvedScrollHintOptions } from '../logic/scrollHint';
5
+ import type { GridResolvedSlot } from '../model/gridTypes';
6
+ import type { ReactGridTypes } from '../model/gridTypes';
5
7
  export declare const SCROLL_HINT_GUTTER_WIDTH_PX = 14;
6
8
  export type GridScrollHintProps<T> = {
7
- options: ResolvedScrollHintOptions<T>;
9
+ options: ResolvedScrollHintOptions<T, ReactGridTypes>;
8
10
  scrollContainerRef: RefObject<HTMLDivElement | null>;
9
11
  scrollTop: number;
10
12
  viewportHeight: number;
@@ -13,5 +15,6 @@ export type GridScrollHintProps<T> = {
13
15
  verticalScaleFactor: number;
14
16
  rowMetrics: RowMetrics;
15
17
  rowModel: RowModel<T>;
18
+ slot?: GridResolvedSlot;
16
19
  };
17
- export declare function GridScrollHint<T>({ options, scrollContainerRef, scrollTop, viewportHeight, headerHeight, physicalBodyHeight, verticalScaleFactor, rowMetrics, rowModel, }: GridScrollHintProps<T>): import("react").JSX.Element | null;
20
+ export declare function GridScrollHint<T>({ options, scrollContainerRef, scrollTop, viewportHeight, headerHeight, physicalBodyHeight, verticalScaleFactor, rowMetrics, rowModel, slot, }: GridScrollHintProps<T>): import("react").JSX.Element | null;
@@ -1,8 +1,10 @@
1
+ import type { GridResolvedSlot } from '../model/gridTypes';
1
2
  export type RowCheckboxState = 'unchecked' | 'checked' | 'indeterminate';
2
3
  type RowSelectionCheckboxProps = {
3
4
  state: RowCheckboxState;
4
5
  disabled?: boolean;
6
+ slot?: GridResolvedSlot;
5
7
  };
6
- declare function RowSelectionCheckboxInner({ state, disabled, }: RowSelectionCheckboxProps): import("react").JSX.Element;
8
+ declare function RowSelectionCheckboxInner({ state, disabled, slot, }: RowSelectionCheckboxProps): import("react").JSX.Element;
7
9
  export declare const RowSelectionCheckbox: import("react").MemoExoticComponent<typeof RowSelectionCheckboxInner>;
8
10
  export default RowSelectionCheckbox;
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode, RefObject } from 'react';
2
2
  import type { ToolPanelLayout, ToolPanelTab } from '../hooks/useToolPanelController';
3
+ import type { GridResolvedSlot } from '../model/gridTypes';
3
4
  export type ToolPanelTabDescriptor = {
4
5
  tab: ToolPanelTab;
5
6
  label: string;
@@ -7,6 +8,7 @@ export type ToolPanelTabDescriptor = {
7
8
  };
8
9
  type ToolPanelProps = {
9
10
  themeClassName?: string;
11
+ popoverSlot?: GridResolvedSlot;
10
12
  activeTab: ToolPanelTab | null;
11
13
  flashTick: number;
12
14
  tabs: ToolPanelTabDescriptor[];
@@ -17,5 +19,5 @@ type ToolPanelProps = {
17
19
  onPanelMove: (top: number, left: number) => void;
18
20
  children: ReactNode;
19
21
  };
20
- export declare function ToolPanel({ themeClassName, activeTab, flashTick, tabs, layout, panelRef, onSelectTab, onRequestClose, onPanelMove, children, }: ToolPanelProps): import("react").ReactPortal | null;
22
+ export declare function ToolPanel({ themeClassName, popoverSlot, activeTab, flashTick, tabs, layout, panelRef, onSelectTab, onRequestClose, onPanelMove, children, }: ToolPanelProps): import("react").ReactPortal | null;
21
23
  export default ToolPanel;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ishibashi0112/spreadsheet-grid",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "description": "React 19 製のカスタム仮想化データグリッド。100 万行対応の仮想化・3 ペイン固定列・ソート/フィルター・クライアント/サーバーサイド行モデル対応。",
5
5
  "keywords": [
6
6
  "react",
@@ -59,23 +59,23 @@
59
59
  "react-dom": "^19.0.0"
60
60
  },
61
61
  "dependencies": {
62
- "@tanstack/react-virtual": "^3.14.2"
62
+ "@tanstack/virtual-core": "^3.17.0"
63
63
  },
64
64
  "devDependencies": {
65
65
  "@eslint/js": "^10.0.1",
66
66
  "@testing-library/dom": "^10.4.1",
67
67
  "@testing-library/react": "^16.3.2",
68
68
  "@types/node": "^24.12.3",
69
- "@types/react": "^19.2.14",
70
- "@types/react-dom": "^19.2.3",
69
+ "@types/react": "^19.3.0",
70
+ "@types/react-dom": "^19.3.0",
71
71
  "@vitejs/plugin-react": "^6.0.1",
72
72
  "eslint": "^10.3.0",
73
73
  "eslint-plugin-react-hooks": "^7.1.1",
74
74
  "eslint-plugin-react-refresh": "^0.5.2",
75
75
  "globals": "^17.6.0",
76
76
  "jsdom": "^29.1.1",
77
- "react": "^19.2.6",
78
- "react-dom": "^19.2.6",
77
+ "react": "^19.3.0",
78
+ "react-dom": "^19.3.0",
79
79
  "typescript": "~6.0.2",
80
80
  "typescript-eslint": "^8.59.2",
81
81
  "vite": "^8.0.12",