@ricsam/react-spreadsheets 0.0.9 → 0.0.11

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,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/react-spreadsheets",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "type": "module"
5
5
  }
@@ -10,8 +10,8 @@
10
10
  */
11
11
  export { Spreadsheet, type SpreadsheetProps, type SpreadsheetRef, type SpreadsheetScrollAlignment, type SpreadsheetScrollToCellOptions, type SpreadsheetScrollToRangeOptions, type SpreadsheetChild, type SpreadsheetChildInitial, type SpreadsheetChildState, type SpreadsheetComponent, } from "./spreadsheet/spreadsheet";
12
12
  export type { SelectionNavigationModel } from "@ricsam/selection-manager";
13
- export { FormulaSheet, FormulaWorkbook, WorkbookClipboardManager, WorkbookSelectionManager, } from "./workbook/workbook";
14
- export type { WorkbookRangeFocusOptions } from "./workbook/workbook-selection-manager";
13
+ export { FormulaSheet, FormulaWorkbook, WorkbookClipboardManager, WorkbookSelectionManager, type FormulaSheetProps, type FormulaWorkbookProps, } from "./workbook/workbook";
14
+ export type { WorkbookRangeFocusOptions, WorkbookSelectionContext, } from "./workbook/workbook-selection-manager";
15
15
  export { coerceCellInput, getCellDisplayText, getCellDisplayValue, } from "./workbook/cell-data-type";
16
16
  export { normalizeBorderSides, hasAnyBorderSide, type BorderSides, type NormalizedBorderSides, } from "./workbook/border-sides";
17
17
  export { onCellEditError, queueCellEditError, type CellEditErrorListener, } from "./workbook/cell-edit-error";
@@ -1,22 +1,36 @@
1
1
  import type { RangeAddress } from '@ricsam/formula-engine';
2
2
  import type { SelectionManager, ViewportAlignment } from '@ricsam/selection-manager';
3
- interface ManagerContext {
3
+ export interface WorkbookSelectionContext {
4
4
  workbookName: string;
5
5
  sheetName: string;
6
+ /**
7
+ * Stable identity for this rendered workbook view. Supply this when the same
8
+ * workbook/sheet can be mounted more than once, such as in split-screen panes.
9
+ */
10
+ viewId?: string;
6
11
  }
7
12
  export interface WorkbookRangeFocusOptions {
8
13
  /** How the target range should be positioned in the spreadsheet viewport. */
9
14
  align?: ViewportAlignment;
15
+ /** Target one mounted copy when the workbook/sheet is rendered more than once. */
16
+ viewId?: string;
10
17
  }
11
18
  export declare class WorkbookSelectionManager {
12
19
  private managers;
13
20
  private lastFocusedManager;
21
+ private lastSelections;
22
+ private selectionsByView;
14
23
  private listeners;
15
24
  private cleanupFunctions;
16
25
  private pendingRangeFocus;
26
+ private applyingRangeFocus;
27
+ private getViewKey;
28
+ private cloneSmArea;
17
29
  private smAreaToSpreadsheetRange;
18
30
  private spreadsheetRangeToSmArea;
19
31
  private cloneRangeAddress;
32
+ private areasToRangeAddresses;
33
+ private rememberSelections;
20
34
  private matchesContext;
21
35
  private applyRangeFocus;
22
36
  private applyPendingRangeFocusOnMount;
@@ -24,13 +38,13 @@ export declare class WorkbookSelectionManager {
24
38
  * Register a SelectionManager with its workbook/sheet context
25
39
  * Returns a cleanup function to unregister
26
40
  */
27
- add(manager: SelectionManager, context: ManagerContext): () => void;
41
+ add(manager: SelectionManager, context: WorkbookSelectionContext): () => void;
28
42
  /**
29
43
  * Get the SelectionManager that was last focused or had selection activity
30
44
  */
31
45
  getLastFocusedSelectionManager(): {
32
46
  sm: SelectionManager;
33
- context: ManagerContext;
47
+ context: WorkbookSelectionContext;
34
48
  } | null;
35
49
  /**
36
50
  * Get all current selections from the last focused manager.
@@ -59,11 +73,11 @@ export declare class WorkbookSelectionManager {
59
73
  * Focus the selection manager for a specific workbook (first sheet found).
60
74
  * This is useful when programmatically switching focus, e.g., after maximizing a window.
61
75
  */
62
- focusWorkbook(workbookName: string): void;
76
+ focusWorkbook(workbookName: string, viewId?: string): void;
63
77
  /**
64
78
  * Focus the selection manager for a specific sheet without changing the cell selection.
65
79
  */
66
- focusSheet(workbookName: string, sheetName: string): boolean;
80
+ focusSheet(workbookName: string, sheetName: string, viewId?: string): boolean;
67
81
  /**
68
82
  * Focus a specific cell in a specific workbook and sheet.
69
83
  * Finds the matching SelectionManager, sets its selection to the given cell,
@@ -72,7 +86,7 @@ export declare class WorkbookSelectionManager {
72
86
  * @returns true when focused immediately, false when queued until the target
73
87
  * sheet mounts.
74
88
  */
75
- focusCell(workbookName: string, sheetName: string, row: number, col: number): boolean;
89
+ focusCell(workbookName: string, sheetName: string, row: number, col: number, options?: WorkbookRangeFocusOptions): boolean;
76
90
  /**
77
91
  * Focus, select and reveal a range in its workbook/sheet.
78
92
  *
@@ -83,9 +97,10 @@ export declare class WorkbookSelectionManager {
83
97
  * @returns true when applied immediately, false when queued for a future mount.
84
98
  */
85
99
  focusRange(address: RangeAddress, options?: WorkbookRangeFocusOptions): boolean;
100
+ /** Cancel the latest queued range focus before its target view mounts. */
101
+ cancelPendingFocusRange(): void;
86
102
  /**
87
103
  * Notify all listeners of selection change
88
104
  */
89
105
  private emitChange;
90
106
  }
91
- export {};
@@ -9,7 +9,7 @@ type SpreadsheetLayout = {
9
9
  columnWidths?: SpreadsheetColumnWidths;
10
10
  rowHeights?: SpreadsheetRowHeights;
11
11
  };
12
- interface FormulaSheetProps extends Omit<SpreadsheetProps, 'selection' | 'customCellStyle' | 'customCellRenderer' | 'components' | 'overlayChildren' | 'selectedOverlayId' | 'onOverlaySelect' | 'onOverlayChildrenChange' | 'overlayPlaceholder' | 'parentSelected'> {
12
+ export interface FormulaSheetProps extends Omit<SpreadsheetProps, 'selection' | 'customCellStyle' | 'customCellRenderer' | 'components' | 'overlayChildren' | 'selectedOverlayId' | 'onOverlaySelect' | 'onOverlayChildrenChange' | 'overlayPlaceholder' | 'parentSelected'> {
13
13
  clipboardManager?: WorkbookClipboardManager;
14
14
  sheetName: string;
15
15
  workbookName: string;
@@ -17,6 +17,8 @@ interface FormulaSheetProps extends Omit<SpreadsheetProps, 'selection' | 'custom
17
17
  verboseErrors?: boolean;
18
18
  selection?: SpreadsheetProps['selection'];
19
19
  selectionManager?: WorkbookSelectionManager;
20
+ /** Stable identity used to distinguish duplicate mounted views of this sheet. */
21
+ viewId?: string;
20
22
  customCellStyle?: (cell: CellRenderContext, internalStyle: React.CSSProperties) => React.CSSProperties;
21
23
  customCellRenderer?: (cell: CellRenderContext, internalElement: React.ReactNode) => React.ReactNode;
22
24
  components?: SpreadsheetProps['components'];
@@ -54,8 +56,8 @@ export declare class WorkbookClipboardManager extends ClipboardUtils {
54
56
  pasteType: 'value' | 'formula';
55
57
  }): void;
56
58
  }
57
- export declare function FormulaSheet({ sheetName, workbookName, engine, verboseErrors, selection, selectionManager, customCellStyle, customCellRenderer, onCellDataChangeError, components, overlayChildren, selectedOverlayId, onOverlaySelect, onOverlayChildrenChange, overlayPlaceholder, clipboardManager: controlledClipboardManager, isSelected, toolbar, showFormulas, ...rest }: FormulaSheetProps): React.JSX.Element;
58
- interface FormulaWorkbookProps extends Omit<SpreadsheetProps, 'cellData' | 'onCellDataChange' | 'selection' | 'customCellStyle' | 'customCellRenderer' | 'components' | 'overlayChildren' | 'selectedOverlayId' | 'onOverlaySelect' | 'onOverlayChildrenChange' | 'overlayPlaceholder' | 'parentSelected' | 'columnWidths' | 'onColumnWidthsChange' | 'rowHeights' | 'onRowHeightsChange'> {
59
+ export declare function FormulaSheet({ sheetName, workbookName, engine, verboseErrors, selection, selectionManager, viewId, customCellStyle, customCellRenderer, onCellDataChangeError, components, overlayChildren, selectedOverlayId, onOverlaySelect, onOverlayChildrenChange, overlayPlaceholder, clipboardManager: controlledClipboardManager, isSelected, toolbar, showFormulas, ...rest }: FormulaSheetProps): React.JSX.Element;
60
+ export interface FormulaWorkbookProps extends Omit<SpreadsheetProps, 'cellData' | 'onCellDataChange' | 'selection' | 'customCellStyle' | 'customCellRenderer' | 'components' | 'overlayChildren' | 'selectedOverlayId' | 'onOverlaySelect' | 'onOverlayChildrenChange' | 'overlayPlaceholder' | 'parentSelected' | 'columnWidths' | 'onColumnWidthsChange' | 'rowHeights' | 'onRowHeightsChange'> {
59
61
  workbookName: string;
60
62
  clipboardManager?: WorkbookClipboardManager;
61
63
  engine: FormulaEngine;
@@ -64,6 +66,8 @@ interface FormulaWorkbookProps extends Omit<SpreadsheetProps, 'cellData' | 'onCe
64
66
  verboseErrors?: boolean;
65
67
  selection?: SpreadsheetProps['selection'];
66
68
  selectionManager?: WorkbookSelectionManager;
69
+ /** Stable identity used to distinguish duplicate mounted views of this workbook. */
70
+ viewId?: string;
67
71
  customCellStyle?: (cell: CellRenderContext, internalStyle: React.CSSProperties) => React.CSSProperties;
68
72
  customCellRenderer?: (cell: CellRenderContext, internalElement: React.ReactNode) => React.ReactNode;
69
73
  components?: SpreadsheetProps['components'];
@@ -82,5 +86,5 @@ interface FormulaWorkbookProps extends Omit<SpreadsheetProps, 'cellData' | 'onCe
82
86
  /** When true, cells display raw formulas instead of computed values */
83
87
  showFormulas?: boolean;
84
88
  }
85
- export declare function FormulaWorkbook({ clipboardManager: controlledClipboardManager, workbookName, engine, activeSheet: controlledActiveSheet, onActiveSheetChange, verboseErrors, selectionManager, components, sheetOverlayChildren, sheetSelectedOverlayIds, sheetLayouts, onSheetColumnWidthsChange, onSheetRowHeightsChange, onOverlaySelect, onOverlayChildrenChange, overlayPlaceholder, isSelected, toolbar, showFormulas, ...rest }: FormulaWorkbookProps): React.JSX.Element;
89
+ export declare function FormulaWorkbook({ clipboardManager: controlledClipboardManager, workbookName, engine, activeSheet: controlledActiveSheet, onActiveSheetChange, verboseErrors, selectionManager, viewId, components, sheetOverlayChildren, sheetSelectedOverlayIds, sheetLayouts, onSheetColumnWidthsChange, onSheetRowHeightsChange, onOverlaySelect, onOverlayChildrenChange, overlayPlaceholder, isSelected, toolbar, showFormulas, ...rest }: FormulaWorkbookProps): React.JSX.Element;
86
90
  export { WorkbookSelectionManager } from './workbook-selection-manager';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/react-spreadsheets",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "Headless-friendly React spreadsheet and workbook components: infinite virtualized grid, zoom, resizing, clipboard, fill handles and formula-engine bindings.",
5
5
  "type": "module",
6
6
  "module": "./dist/mjs/lib.mjs",
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "peerDependencies": {
45
45
  "@ricsam/formula-engine": ">=0.2.0",
46
- "@ricsam/selection-manager": ">=0.0.31",
46
+ "@ricsam/selection-manager": ">=0.0.32",
47
47
  "react": "^18 || ^19",
48
48
  "react-dom": "^18 || ^19"
49
49
  },
@@ -55,7 +55,7 @@
55
55
  "devDependencies": {
56
56
  "@happy-dom/global-registrator": "^18.0.1",
57
57
  "@ricsam/formula-engine": "^0.2.15",
58
- "@ricsam/selection-manager": "^0.0.31",
58
+ "@ricsam/selection-manager": "^0.0.32",
59
59
  "@testing-library/react": "^16.3.0",
60
60
  "@types/bun": "latest",
61
61
  "@types/react": "^19",