@rowsncolumns/spreadsheet 10.5.1 → 10.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  2. package/dist/cjs/components/canvas-grid/index.js +103 -71
  3. package/dist/cjs/components/canvas-grid/typings.d.ts +18 -1
  4. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  5. package/dist/cjs/components/cell/cell-text-runs.d.ts +10 -3
  6. package/dist/cjs/components/cell/cell-text-runs.d.ts.map +1 -1
  7. package/dist/cjs/components/cell/cell-text-runs.js +21 -9
  8. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  9. package/dist/cjs/components/cell/index.js +9 -5
  10. package/dist/cjs/components/cell/line-height.d.ts +22 -0
  11. package/dist/cjs/components/cell/line-height.d.ts.map +1 -0
  12. package/dist/cjs/components/cell/line-height.js +32 -0
  13. package/dist/cjs/components/cell/typings.d.ts +8 -2
  14. package/dist/cjs/components/cell/typings.d.ts.map +1 -1
  15. package/dist/cjs/components/formula-input/index.d.ts.map +1 -1
  16. package/dist/cjs/components/formula-input/index.js +28 -1
  17. package/dist/cjs/hooks/export-range-tiles.d.ts +81 -0
  18. package/dist/cjs/hooks/export-range-tiles.d.ts.map +1 -0
  19. package/dist/cjs/hooks/export-range-tiles.js +171 -0
  20. package/dist/cjs/hooks/use-cell-renderer.d.ts +6 -1
  21. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  22. package/dist/cjs/hooks/use-cell-renderer.js +3 -2
  23. package/dist/cjs/hooks/use-copy-paste-cut.d.ts +5 -1
  24. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  25. package/dist/cjs/hooks/use-copy-paste-cut.js +19 -5
  26. package/dist/cjs/hooks/use-editor-submit.d.ts +7 -1
  27. package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
  28. package/dist/cjs/hooks/use-editor-submit.js +36 -16
  29. package/dist/cjs/hooks/use-export-range.d.ts +14 -6
  30. package/dist/cjs/hooks/use-export-range.d.ts.map +1 -1
  31. package/dist/cjs/hooks/use-export-range.js +240 -158
  32. package/dist/cjs/hooks/use-grid-children.d.ts +4 -1
  33. package/dist/cjs/hooks/use-grid-children.d.ts.map +1 -1
  34. package/dist/cjs/hooks/use-grid-children.js +4 -2
  35. package/dist/cjs/hooks/use-navigate-sheet-range.d.ts.map +1 -1
  36. package/dist/cjs/hooks/use-navigate-sheet-range.js +5 -2
  37. package/dist/cjs/hooks/use-sizer.d.ts +8 -2
  38. package/dist/cjs/hooks/use-sizer.d.ts.map +1 -1
  39. package/dist/cjs/hooks/use-sizer.js +54 -33
  40. package/dist/cjs/providers/spreadsheet-provider.d.ts +11 -2
  41. package/dist/cjs/providers/spreadsheet-provider.d.ts.map +1 -1
  42. package/dist/cjs/providers/spreadsheet-provider.js +7 -5
  43. package/dist/cjs/release-date.js +1 -1
  44. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  45. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  46. package/dist/esm/components/canvas-grid/index.js +44 -13
  47. package/dist/esm/components/canvas-grid/typings.d.ts +18 -1
  48. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  49. package/dist/esm/components/cell/cell-text-runs.d.ts +10 -3
  50. package/dist/esm/components/cell/cell-text-runs.d.ts.map +1 -1
  51. package/dist/esm/components/cell/cell-text-runs.js +14 -9
  52. package/dist/esm/components/cell/index.d.ts.map +1 -1
  53. package/dist/esm/components/cell/index.js +7 -3
  54. package/dist/esm/components/cell/line-height.d.ts +22 -0
  55. package/dist/esm/components/cell/line-height.d.ts.map +1 -0
  56. package/dist/esm/components/cell/line-height.js +25 -0
  57. package/dist/esm/components/cell/typings.d.ts +8 -2
  58. package/dist/esm/components/cell/typings.d.ts.map +1 -1
  59. package/dist/esm/components/formula-input/index.d.ts.map +1 -1
  60. package/dist/esm/components/formula-input/index.js +26 -1
  61. package/dist/esm/hooks/export-range-tiles.d.ts +81 -0
  62. package/dist/esm/hooks/export-range-tiles.d.ts.map +1 -0
  63. package/dist/esm/hooks/export-range-tiles.js +126 -0
  64. package/dist/esm/hooks/use-cell-renderer.d.ts +6 -1
  65. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  66. package/dist/esm/hooks/use-cell-renderer.js +3 -2
  67. package/dist/esm/hooks/use-copy-paste-cut.d.ts +5 -1
  68. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  69. package/dist/esm/hooks/use-copy-paste-cut.js +17 -3
  70. package/dist/esm/hooks/use-editor-submit.d.ts +7 -1
  71. package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
  72. package/dist/esm/hooks/use-editor-submit.js +24 -6
  73. package/dist/esm/hooks/use-export-range.d.ts +14 -6
  74. package/dist/esm/hooks/use-export-range.d.ts.map +1 -1
  75. package/dist/esm/hooks/use-export-range.js +158 -120
  76. package/dist/esm/hooks/use-grid-children.d.ts +4 -1
  77. package/dist/esm/hooks/use-grid-children.d.ts.map +1 -1
  78. package/dist/esm/hooks/use-grid-children.js +4 -2
  79. package/dist/esm/hooks/use-navigate-sheet-range.d.ts.map +1 -1
  80. package/dist/esm/hooks/use-navigate-sheet-range.js +5 -2
  81. package/dist/esm/hooks/use-sizer.d.ts +8 -2
  82. package/dist/esm/hooks/use-sizer.d.ts.map +1 -1
  83. package/dist/esm/hooks/use-sizer.js +53 -31
  84. package/dist/esm/providers/spreadsheet-provider.d.ts +11 -2
  85. package/dist/esm/providers/spreadsheet-provider.d.ts.map +1 -1
  86. package/dist/esm/providers/spreadsheet-provider.js +8 -6
  87. package/dist/esm/release-date.js +1 -1
  88. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  89. package/package.json +6 -6
@@ -20,29 +20,38 @@ var defaultGetText = function () { return ""; };
20
20
  * Dynamically resize columns after user has scrolled down/view port changed ?
21
21
  */
22
22
  var useSizer = function (_a) {
23
- var getTextFormat = _a.getTextFormat, getTextFormatRuns = _a.getTextFormatRuns, _b = _a.initialVisibleRows, initialVisibleRows = _b === void 0 ? 20 : _b, _c = _a.initialVisibleColumns, initialVisibleColumns = _c === void 0 ? 20 : _c, _d = _a.cellVerticalSpacing, cellVerticalSpacing = _d === void 0 ? 0 : _d, _e = _a.cellHorizontalSpacing, cellHorizontalSpacing = _e === void 0 ? 10 : _e, _f = _a.minColumnDimension, minColumnDimension = _f === void 0 ? config_1.DEFAULT_COLUMN_WIDTH : _f, _g = _a.minRowDimension, minRowDimension = _g === void 0 ? config_1.DEFAULT_ROW_HEIGHT : _g, _h = _a.resizeStrategy, resizeStrategy = _h === void 0 ? "lazy" : _h, rowCount = _a.rowCount, columnCount = _a.columnCount, getDataRowCount = _a.getDataRowCount, _j = _a.fontFamily, fontFamily = _j === void 0 ? "Arial" : _j, _k = _a.fontSize, fontSize = _k === void 0 ? 12 : _k, _l = _a.fontWeight, fontWeight = _l === void 0 ? "" : _l, _m = _a.fontStyle, fontStyle = _m === void 0 ? "" : _m, _o = _a.frozenRows, frozenRows = _o === void 0 ? 0 : _o, _p = _a.frozenColumns, frozenColumns = _p === void 0 ? 0 : _p, _q = _a.scale, scale = _q === void 0 ? 1 : _q, isHiddenRow = _a.isHiddenRow, isHiddenColumn = _a.isHiddenColumn, _r = _a.getTextValue, getTextValue = _r === void 0 ? defaultGetText : _r, getSpacing = _a.getSpacing, getViewPort = _a.getViewPort, shouldWrapCell = _a.shouldWrapCell, columnWidth = _a.columnWidth, getActualCellWidth = _a.getActualCellWidth;
23
+ var getTextFormat = _a.getTextFormat, getTextFormatRuns = _a.getTextFormatRuns, _b = _a.initialVisibleRows, initialVisibleRows = _b === void 0 ? 20 : _b, _c = _a.initialVisibleColumns, initialVisibleColumns = _c === void 0 ? 20 : _c, _d = _a.cellVerticalSpacing, cellVerticalSpacing = _d === void 0 ? 0 : _d, _e = _a.cellHorizontalSpacing, cellHorizontalSpacing = _e === void 0 ? 10 : _e, _f = _a.minColumnDimension, minColumnDimension = _f === void 0 ? config_1.DEFAULT_COLUMN_WIDTH : _f, _g = _a.minRowDimension, minRowDimension = _g === void 0 ? config_1.DEFAULT_ROW_HEIGHT : _g, _h = _a.resizeStrategy, resizeStrategy = _h === void 0 ? "lazy" : _h, rowCount = _a.rowCount, columnCount = _a.columnCount, getDataRowCount = _a.getDataRowCount, _j = _a.fontFamily, fontFamily = _j === void 0 ? "Arial" : _j, _k = _a.fontSize, fontSize = _k === void 0 ? 12 : _k, _l = _a.fontWeight, fontWeight = _l === void 0 ? "" : _l, _m = _a.fontStyle, fontStyle = _m === void 0 ? "" : _m, _o = _a.lineHeightMode, lineHeightMode = _o === void 0 ? "fontMetrics" : _o, _p = _a.frozenRows, frozenRows = _p === void 0 ? 0 : _p, _q = _a.frozenColumns, frozenColumns = _q === void 0 ? 0 : _q, _r = _a.scale, scale = _r === void 0 ? 1 : _r, isHiddenRow = _a.isHiddenRow, isHiddenColumn = _a.isHiddenColumn, _s = _a.getTextValue, getTextValue = _s === void 0 ? defaultGetText : _s, getSpacing = _a.getSpacing, getViewPort = _a.getViewPort, shouldWrapCell = _a.shouldWrapCell, columnWidth = _a.columnWidth, getActualCellWidth = _a.getActualCellWidth;
24
24
  var autoSizer = (0, react_1.useRef)(grid_1.autoSizerCanvas);
25
25
  var scaleRef = (0, react_1.useRef)(scale);
26
26
  // Keep scale in sync
27
27
  scaleRef.current = scale;
28
28
  /* Update any styles, fonts if necessary */
29
29
  (0, use_isomorphic_layout_effect_1.useIsomorphicLayoutEffect)(function () {
30
- autoSizer.current.setFont({ fontFamily: fontFamily, fontSize: fontSize, fontWeight: fontWeight, fontStyle: fontStyle });
31
- }, [fontFamily, fontSize, fontWeight, fontStyle]);
30
+ autoSizer.current.setFont({
31
+ fontFamily: fontFamily,
32
+ fontSize: fontSize,
33
+ fontWeight: fontWeight,
34
+ fontStyle: fontStyle,
35
+ lineHeightMode: lineHeightMode,
36
+ });
37
+ }, [fontFamily, fontSize, fontWeight, fontStyle, lineHeightMode]);
32
38
  var setAutoSizerTextFormat = (0, react_1.useCallback)(function (textFormat, scale) {
33
39
  var _a, _b;
34
40
  var baseFontSize = (0, helpers_1.pointToPixel)((_a = textFormat.fontSize) !== null && _a !== void 0 ? _a : fontSize);
35
41
  var textFontSize = textFormat.baselineOffset
36
42
  ? baseFontSize * BASELINE_OFFSET_FONT_SCALE
37
43
  : baseFontSize;
44
+ // The sizer is a shared singleton — pin the mode on every measure so a
45
+ // grid in `fixed` mode cannot leak its line box into this one.
38
46
  autoSizer.current.setFont({
39
47
  fontWeight: textFormat.bold ? "bold" : "",
40
48
  fontSize: textFontSize,
41
49
  fontFamily: (_b = textFormat.fontFamily) !== null && _b !== void 0 ? _b : fontFamily,
42
50
  fontStyle: textFormat.italic ? "italic" : "",
43
51
  scale: scale,
52
+ lineHeightMode: lineHeightMode,
44
53
  });
45
- }, [fontFamily, fontSize]);
54
+ }, [fontFamily, fontSize, lineHeightMode]);
46
55
  /**
47
56
  * Measure a single atom under its segment-merged format. We can't
48
57
  * delegate to `autoSizer.measureText` here: that runs the input
@@ -53,11 +62,12 @@ var useSizer = function (_a) {
53
62
  * "Hello world" (with bold "world") produced a width as if the
54
63
  * space didn't exist — auto-fit then sized the column too narrow
55
64
  * and the bold run touched the right edge. Width comes from the
56
- * raw 2D canvas API; height mirrors the autoSizer's
57
- * `fontSize * 1.2 * scale` line-box.
65
+ * raw 2D canvas API; the line box and leading are the autoSizer's
66
+ * for the atom's font, so a run in a taller face grows its line the
67
+ * way the painter's `CellTextRuns` draws it.
58
68
  */
59
69
  var measureAtom = (0, react_1.useCallback)(function (atom, base, currentScale) {
60
- var _a, _b, _c, _d, _e, _f, _g;
70
+ var _a, _b, _c, _d, _e, _f;
61
71
  var merged = {
62
72
  bold: (_a = atom.format.bold) !== null && _a !== void 0 ? _a : base.bold,
63
73
  italic: (_b = atom.format.italic) !== null && _b !== void 0 ? _b : base.italic,
@@ -68,15 +78,14 @@ var useSizer = function (_a) {
68
78
  setAutoSizerTextFormat(merged, currentScale);
69
79
  var ctx = autoSizer.current.context;
70
80
  var width = (_f = ctx === null || ctx === void 0 ? void 0 : ctx.measureText(atom.text).width) !== null && _f !== void 0 ? _f : 0;
71
- var fontPx = (0, helpers_1.pointToPixel)((_g = merged.fontSize) !== null && _g !== void 0 ? _g : fontSize);
72
- var height = fontPx * 1.2 * currentScale;
73
- return { width: width, height: height };
74
- }, [fontSize, setAutoSizerTextFormat]);
81
+ return tslib_1.__assign({ width: width }, autoSizer.current.lineMetrics());
82
+ }, [setAutoSizerTextFormat]);
75
83
  /**
76
84
  * Measure a rich-text cell. Walks segments per line, sets the
77
85
  * autoSizer font per atom, sums widths per line, takes the tallest
78
- * atom's measured height as that line's height (Excel scales rows
79
- * to fit the largest glyph in a mixed-format line). For wrapped
86
+ * atom's line box as that line's box (Excel scales rows to fit the
87
+ * largest glyph in a mixed-format line) and stacks lines with the
88
+ * leading of the tallest atom, as `CellTextRuns` does. For wrapped
80
89
  * cells it applies greedy whitespace-break wrap with per-atom font
81
90
  * metrics, matching what `CellTextRuns` paints. Returns the raw
82
91
  * scaled glyph box — caller adds cell-spacing padding afterwards.
@@ -85,19 +94,22 @@ var useSizer = function (_a) {
85
94
  var e_1, _a;
86
95
  var segments = (0, rich_text_1.buildRichTextSegments)(text, runs);
87
96
  var inputLines = (0, rich_text_1.segmentsToLines)(segments);
88
- // Baseline height for empty lines — single-space measurement
89
- // through the autoSizer so the scale + line-height ratio match.
90
- var baseLineHeight = (function () {
91
- var _a, _b;
97
+ // Line box for empty lines, and the floor of every other line.
98
+ var baseLine = (function () {
92
99
  setAutoSizerTextFormat(base, currentScale);
93
- return (_b = (_a = autoSizer.current.measureText(" ")) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : 0;
100
+ return autoSizer.current.lineMetrics();
94
101
  })();
95
102
  var totalWidth = 0;
96
103
  var totalHeight = 0;
104
+ var lineCount = 0;
105
+ var pushLine = function (box, leading) {
106
+ totalHeight += lineCount === 0 ? box : leading + box;
107
+ lineCount++;
108
+ };
97
109
  var _loop_1 = function (line) {
98
110
  var e_2, _b, e_3, _c, e_4, _d, e_5, _e;
99
111
  if (line.length === 0) {
100
- totalHeight += baseLineHeight;
112
+ pushLine(baseLine.box, baseLine.leading);
101
113
  return "continue";
102
114
  }
103
115
  var atoms = [];
@@ -127,16 +139,19 @@ var useSizer = function (_a) {
127
139
  finally { if (e_2) throw e_2.error; }
128
140
  }
129
141
  if (!shouldWrap) {
130
- // Single-line case: sum widths, max atom height = line height.
142
+ // Single-line case: sum widths, tallest atom's box = line box.
131
143
  var lineWidth_1 = 0;
132
- var lineMaxHeight_1 = baseLineHeight;
144
+ var lineBox_1 = baseLine.box;
145
+ var lineLeading_1 = baseLine.leading;
133
146
  try {
134
147
  for (var atoms_1 = (e_4 = void 0, tslib_1.__values(atoms)), atoms_1_1 = atoms_1.next(); !atoms_1_1.done; atoms_1_1 = atoms_1.next()) {
135
148
  var atom = atoms_1_1.value;
136
- var _h = measureAtom(atom, base, currentScale), width = _h.width, height = _h.height;
149
+ var _h = measureAtom(atom, base, currentScale), width = _h.width, box = _h.box, leading = _h.leading;
137
150
  lineWidth_1 += width;
138
- if (height > lineMaxHeight_1)
139
- lineMaxHeight_1 = height;
151
+ if (box > lineBox_1)
152
+ lineBox_1 = box;
153
+ if (leading > lineLeading_1)
154
+ lineLeading_1 = leading;
140
155
  }
141
156
  }
142
157
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
@@ -148,7 +163,7 @@ var useSizer = function (_a) {
148
163
  }
149
164
  if (lineWidth_1 > totalWidth)
150
165
  totalWidth = lineWidth_1;
151
- totalHeight += lineMaxHeight_1;
166
+ pushLine(lineBox_1, lineLeading_1);
152
167
  return "continue";
153
168
  }
154
169
  // Wrapped case: greedy whitespace-break wrap with per-atom
@@ -156,24 +171,31 @@ var useSizer = function (_a) {
156
171
  // (kept inline because we need running per-line max-height).
157
172
  var cursorX = 0;
158
173
  var lineWidth = 0;
159
- var lineMaxHeight = baseLineHeight;
174
+ var lineBox = baseLine.box;
175
+ var lineLeading = baseLine.leading;
160
176
  var flush = function () {
161
177
  if (lineWidth > totalWidth)
162
178
  totalWidth = lineWidth;
163
- totalHeight += lineMaxHeight;
179
+ pushLine(lineBox, lineLeading);
164
180
  cursorX = 0;
165
181
  lineWidth = 0;
166
- lineMaxHeight = baseLineHeight;
182
+ lineBox = baseLine.box;
183
+ lineLeading = baseLine.leading;
184
+ };
185
+ var grow = function (box, leading) {
186
+ if (box > lineBox)
187
+ lineBox = box;
188
+ if (leading > lineLeading)
189
+ lineLeading = leading;
167
190
  };
168
191
  try {
169
192
  for (var atoms_2 = (e_5 = void 0, tslib_1.__values(atoms)), atoms_2_1 = atoms_2.next(); !atoms_2_1.done; atoms_2_1 = atoms_2.next()) {
170
193
  var atom = atoms_2_1.value;
171
- var _j = measureAtom(atom, base, currentScale), atomWidth = _j.width, atomHeight = _j.height;
194
+ var _j = measureAtom(atom, base, currentScale), atomWidth = _j.width, atomBox = _j.box, atomLeading = _j.leading;
172
195
  if (cursorX + atomWidth <= maxGlyphWidth || cursorX === 0) {
173
196
  cursorX += atomWidth;
174
197
  lineWidth = cursorX;
175
- if (atomHeight > lineMaxHeight)
176
- lineMaxHeight = atomHeight;
198
+ grow(atomBox, atomLeading);
177
199
  }
178
200
  else if (atom.isWhitespace) {
179
201
  flush();
@@ -182,8 +204,7 @@ var useSizer = function (_a) {
182
204
  flush();
183
205
  cursorX = atomWidth;
184
206
  lineWidth = atomWidth;
185
- if (atomHeight > lineMaxHeight)
186
- lineMaxHeight = atomHeight;
207
+ grow(atomBox, atomLeading);
187
208
  }
188
209
  }
189
210
  }
@@ -4,6 +4,15 @@ import type { SpreadsheetApi } from "../api/spreadsheet-api";
4
4
  type Props = {
5
5
  children?: ReactNode;
6
6
  };
7
+ type PortalProps = Props & {
8
+ /**
9
+ * Where every dialog, menu, popover, select, tooltip and editor dropdown
10
+ * under this provider mounts. Defaults to the `document.body` of the
11
+ * window running the JS; a host that renders the grid in a second window
12
+ * (popout, iframe) passes that window's body so they open next to the grid.
13
+ */
14
+ portalContainer?: HTMLElement | null;
15
+ };
7
16
  export declare const multiInstanceStore: {
8
17
  get: <Value>(atom: import("jotai").Atom<Value>) => Value;
9
18
  set: <Value, Args extends unknown[], Result>(atom: import("jotai").WritableAtom<Value, Args, Result>, ...args: Args) => Result;
@@ -17,8 +26,8 @@ export declare const multiInstanceAtom: import("jotai").PrimitiveAtom<Map<string
17
26
  init: Map<string, SpreadsheetApi<import("@rowsncolumns/common-types").CellData>>;
18
27
  };
19
28
  export declare const useSpreadsheetInstances: () => Map<string, SpreadsheetApi<import("@rowsncolumns/common-types").CellData>>;
20
- export declare const SpreadsheetProvider: FC<Props>;
21
- export declare const SpreadsheetStateProvider: FC<Props>;
29
+ export declare const SpreadsheetProvider: FC<PortalProps>;
30
+ export declare const SpreadsheetStateProvider: FC<PortalProps>;
22
31
  export declare const SpreadsheetMultiInstanceProvider: FC<Props>;
23
32
  export declare const SpreadsheetTooltipProvider: FC<Props>;
24
33
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"spreadsheet-provider.d.ts","sourceRoot":"","sources":["../../../providers/spreadsheet-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;0GAqCswE,GAAI;;;;0GAAJ,GAAI;;wDArC1vE,CAAC;AAEhD,eAAO,MAAM,iBAAiB;;CAA+C,CAAC;AAM9E,eAAO,MAAM,uBAAuB,kFAEnC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,KAAK,CAQzC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,EAAE,CAAC,KAAK,CAM9C,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,EAAE,CAAC,KAAK,CAEtD,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,EAAE,CAAC,KAAK,CAEhD,CAAC"}
1
+ {"version":3,"file":"spreadsheet-provider.d.ts","sourceRoot":"","sources":["../../../providers/spreadsheet-provider.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,KAAK,WAAW,GAAG,KAAK,GAAG;IACzB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;0GA+CwmD,GAAI;;;;0GAAJ,GAAI;;wDA/C5lD,CAAC;AAEhD,eAAO,MAAM,iBAAiB;;CAA+C,CAAC;AAM9E,eAAO,MAAM,uBAAuB,kFAEnC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,WAAW,CAa/C,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,EAAE,CAAC,WAAW,CAWpD,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,EAAE,CAAC,KAAK,CAEtD,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,EAAE,CAAC,KAAK,CAEhD,CAAC"}
@@ -16,16 +16,18 @@ var useSpreadsheetInstances = function () {
16
16
  };
17
17
  exports.useSpreadsheetInstances = useSpreadsheetInstances;
18
18
  var SpreadsheetProvider = function (_a) {
19
- var children = _a.children;
19
+ var children = _a.children, portalContainer = _a.portalContainer;
20
20
  return (react_1.default.createElement(jotai_1.Provider, null,
21
- react_1.default.createElement(ui_1.ModalProvider, null,
22
- react_1.default.createElement(ui_1.TooltipProvider, null, children))));
21
+ react_1.default.createElement(ui_1.PortalContainerProvider, { container: portalContainer },
22
+ react_1.default.createElement(ui_1.ModalProvider, null,
23
+ react_1.default.createElement(ui_1.TooltipProvider, null, children)))));
23
24
  };
24
25
  exports.SpreadsheetProvider = SpreadsheetProvider;
25
26
  var SpreadsheetStateProvider = function (_a) {
26
- var children = _a.children;
27
+ var children = _a.children, portalContainer = _a.portalContainer;
27
28
  return (react_1.default.createElement(jotai_1.Provider, null,
28
- react_1.default.createElement(ui_1.ModalProvider, null, children)));
29
+ react_1.default.createElement(ui_1.PortalContainerProvider, { container: portalContainer },
30
+ react_1.default.createElement(ui_1.ModalProvider, null, children))));
29
31
  };
30
32
  exports.SpreadsheetStateProvider = SpreadsheetStateProvider;
31
33
  var SpreadsheetMultiInstanceProvider = function (_a) {
@@ -4,4 +4,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.releaseDate = void 0;
5
5
  exports.releaseDate =
6
6
  // @ts-ignore
7
- (_a = new Date("2026-10-12")) !== null && _a !== void 0 ? _a : new Date("2025-06-18");
7
+ (_a = new Date("2026-10-14")) !== null && _a !== void 0 ? _a : new Date("2025-06-18");
@@ -1 +1 @@
1
- {"root":["../../config.ts","../../helpers.ts","../../index.tsx","../../release-date.ts","../../test-setup.ts","../../themes.ts","../../types.ts","../../vitest.config.ts","../../api/animate.ts","../../api/banded-ranges.ts","../../api/calculated-column-fill.ts","../../api/cf-engine.ts","../../api/cf-overlays.ts","../../api/cf-window.ts","../../api/chart-sheet.ts","../../api/chart-source-ranges.ts","../../api/colors.ts","../../api/copy-paste.ts","../../api/evaluate-formula.ts","../../api/excel-validation-kinds.ts","../../api/fill-patterns.ts","../../api/fill-series.ts","../../api/font-loader.ts","../../api/go-to-special.ts","../../api/go-to.ts","../../api/heatmap.ts","../../api/insert-options.ts","../../api/move-overwrite.ts","../../api/multi-selection.ts","../../api/scheduler.ts","../../api/scroller.ts","../../api/selections.ts","../../api/spreadsheet-api.ts","../../api/table-auto-expansion.ts","../../api/table.ts","../../api/validation-tooltip.tsx","../../api/validation.ts","../../atoms/active-editor.atom.ts","../../atoms/advanced-filter-dialog.atom.ts","../../atoms/calculated-column-fill.atom.ts","../../atoms/cell-input-context.atom.ts","../../atoms/chart-actions.atom.ts","../../atoms/editing-cell.atom.ts","../../atoms/evaluate-formula-dialog.atom.ts","../../atoms/fill-options.atom.ts","../../atoms/fill-series-dialog.atom.ts","../../atoms/formula-bar-editor-value.atom.ts","../../atoms/formula-mode.atom.ts","../../atoms/formula-selection-state.atom.ts","../../atoms/formula-selections.atom.ts","../../atoms/go-to-dialog.atom.ts","../../atoms/goal-seek-dialog.atom.ts","../../atoms/index.ts","../../atoms/insert-cells-dialog.atom.ts","../../atoms/insert-options.atom.ts","../../atoms/loading-indicator.atom.ts","../../atoms/magic-fill-state.atom.ts","../../atoms/move-chart-dialog.atom.ts","../../atoms/move-overwrite-confirm.atom.ts","../../atoms/paste-menu.atom.ts","../../atoms/paste-special-dialog.atom.ts","../../atoms/persistent-tooltip.atom.ts","../../atoms/popover.atom.ts","../../atoms/range-selector.atom.ts","../../atoms/remove-duplicates-dialog.atom.ts","../../atoms/selected-chart-embed.atom.ts","../../atoms/selected-chart-series.atom.ts","../../atoms/sheet-context.atom.ts","../../atoms/sheet-status-display.atom.ts","../../atoms/show-formula-help.atom.ts","../../atoms/sort-dialog.atom.ts","../../atoms/sparkline-dialog.atom.ts","../../atoms/spreadsheet-api.atom.ts","../../atoms/subtotal-dialog.atom.ts","../../atoms/table-auto-expansion.atom.ts","../../atoms/text-to-columns-dialog.atom.ts","../../atoms/validation-alert.atom.ts","../../atoms/watch-window.atom.ts","../../components/advanced-filter-dialog/index.tsx","../../components/bottom-bar/index.tsx","../../components/calculated-column-smart-tag/index.tsx","../../components/calculation-options-dialog/index.tsx","../../components/canvas-grid/helpers.ts","../../components/canvas-grid/index.tsx","../../components/canvas-grid/typings.ts","../../components/cell/alignment.ts","../../components/cell/cell-background.tsx","../../components/cell/cell-text-runs.tsx","../../components/cell/helpers.ts","../../components/cell/index.tsx","../../components/cell/rich-text.ts","../../components/cell/typings.ts","../../components/cell-arrow/index.tsx","../../components/cell-calculated/index.tsx","../../components/cell-checkbox/index.tsx","../../components/cell-diff/index.tsx","../../components/cell-editor/calendar-popup.tsx","../../components/cell-editor/formula-result-preview.tsx","../../components/cell-editor/helpers.ts","../../components/cell-editor/index.tsx","../../components/cell-editor/style.tsx","../../components/cell-error/index.tsx","../../components/cell-expand/index.tsx","../../components/cell-filter/index.tsx","../../components/cell-group/index.tsx","../../components/cell-input/cell-input.tsx","../../components/cell-input/formula-bar-cell-input.tsx","../../components/cell-input/index.tsx","../../components/cell-input/style.tsx","../../components/cell-overlay/index.tsx","../../components/cell-structured/index.tsx","../../components/cell-structured/sparkline-math.ts","../../components/cell-structured/sparkline.tsx","../../components/cell-structured/types.ts","../../components/cell-tooltip/index.tsx","../../components/cell-tooltip/note-editor.tsx","../../components/cell-tooltip/style.tsx","../../components/chart-sheet-view/index.tsx","../../components/context-menu/embed-context-menu.tsx","../../components/context-menu/index.tsx","../../components/context-menu/menu.tsx","../../components/context-menu/style.tsx","../../components/context-menu/total-row-function-menu.tsx","../../components/context-menu/total-row-functions.ts","../../components/embeds/chart-component.tsx","../../components/embeds/embed-component.tsx","../../components/embeds/embed-draggable.tsx","../../components/embeds/index.tsx","../../components/embeds/shape-geometry.ts","../../components/embeds/shape-svg.tsx","../../components/embeds/slicer-component.tsx","../../components/evaluate-formula-dialog/index.tsx","../../components/fill-handle/index.tsx","../../components/fill-series-dialog/index.tsx","../../components/filter-box/date-tree.ts","../../components/filter-box/filter-by-color.tsx","../../components/filter-box/filter-by-condition.tsx","../../components/filter-box/filter-by-value.tsx","../../components/filter-box/index.tsx","../../components/floating-cell-editor/index.tsx","../../components/formula-bar/index.tsx","../../components/formula-bar/style.tsx","../../components/formula-input/index.tsx","../../components/go-to-dialog/index.tsx","../../components/goal-seek-dialog/index.tsx","../../components/grid-footer/index.tsx","../../components/header-cell/index.tsx","../../components/header-menu/index.tsx","../../components/header-move/index.tsx","../../components/header-resizer/index.tsx","../../components/hidden-markers/index.tsx","../../components/hidden-markers/style.tsx","../../components/insert-cells-dialog/index.tsx","../../components/insert-function-dialog/index.tsx","../../components/insert-options-smart-tag/index.tsx","../../components/loading-indicator/index.tsx","../../components/move-chart-dialog/index.tsx","../../components/move-overwrite-confirm-dialog/index.tsx","../../components/outline-gutter/index.tsx","../../components/paste-special-dialog/index.tsx","../../components/pivot-placeholder/index.tsx","../../components/print-preview/cell-styles.ts","../../components/print-preview/index.ts","../../components/print-preview/page-block.tsx","../../components/print-preview/print-preview-dialog.tsx","../../components/print-preview/run-print.ts","../../components/print-preview/settings.ts","../../components/print-preview/use-page-layout.ts","../../components/range-selector/index.tsx","../../components/remove-duplicates-dialog/index.tsx","../../components/resizer/index.tsx","../../components/selection/avatar.tsx","../../components/selection/fill-options-menu.tsx","../../components/selection/index.tsx","../../components/selection/magic-fill.tsx","../../components/selection/paste-menu.tsx","../../components/selection/quick-edit.tsx","../../components/selection/style.tsx","../../components/selection/suggestion-action.tsx","../../components/selection/title.tsx","../../components/selection/types.ts","../../components/selection-input/index.tsx","../../components/selection-input/style.tsx","../../components/sheet-search/index.tsx","../../components/sheet-status/index.tsx","../../components/sheet-status/style.tsx","../../components/sheet-switcher/index.tsx","../../components/sheet-switcher/new-sheet-button.tsx","../../components/sheet-tabs/context-menu.tsx","../../components/sheet-tabs/index.tsx","../../components/sheet-tabs/sheet-tab.tsx","../../components/sheet-tabs/style.tsx","../../components/sheet-tabs/types.ts","../../components/sort-range-dialog/index.tsx","../../components/sparkline-dialog/index.tsx","../../components/subtotal-dialog/index.tsx","../../components/table-auto-expansion-smart-tag/index.tsx","../../components/text-to-columns-dialog/index.tsx","../../components/toolbar/background-color-selector.tsx","../../components/toolbar/border-color-selector.tsx","../../components/toolbar/border-line-style-options.tsx","../../components/toolbar/border-line-style-selector.tsx","../../components/toolbar/border-location-options.tsx","../../components/toolbar/border-selector.tsx","../../components/toolbar/buttons.tsx","../../components/toolbar/cell-style-selector.tsx","../../components/toolbar/color-selector.tsx","../../components/toolbar/fill-selectors.tsx","../../components/toolbar/font-family-selector.tsx","../../components/toolbar/font-size-selector.tsx","../../components/toolbar/index.tsx","../../components/toolbar/insert-menu.tsx","../../components/toolbar/merge-cells-selector.tsx","../../components/toolbar/scale-selector.tsx","../../components/toolbar/sparkline-actions.tsx","../../components/toolbar/style.tsx","../../components/toolbar/table-actions.tsx","../../components/toolbar/table-style-editor.tsx","../../components/toolbar/table-style-selector.tsx","../../components/toolbar/text-color-selector.tsx","../../components/toolbar/text-format-selector.tsx","../../components/toolbar/text-horizontal-align-selector.tsx","../../components/toolbar/text-rotation-selector.tsx","../../components/toolbar/text-vertical-align-selector.tsx","../../components/toolbar/text-wrap-selector.tsx","../../components/toolbar/theme-selector.tsx","../../components/toolbar/toolbar.tsx","../../components/toolbar/types.ts","../../components/toolbar/view-menu.tsx","../../components/validation-alert-dialog/index.tsx","../../components/watch-window/index.tsx","../../helpers/merged-cell-borders.ts","../../hooks/index.ts","../../hooks/show-zeros.ts","../../hooks/use-async.ts","../../hooks/use-border-styles.ts","../../hooks/use-callback-ref.ts","../../hooks/use-cell-diff-highlight.ts","../../hooks/use-cell-popover.tsx","../../hooks/use-cell-renderer.tsx","../../hooks/use-chart-clipboard.ts","../../hooks/use-chart-source-ranges.ts","../../hooks/use-column-color-icons.ts","../../hooks/use-conditional-formatting.ts","../../hooks/use-context-menu.tsx","../../hooks/use-context-setter.ts","../../hooks/use-copy-paste-cut.tsx","../../hooks/use-create-address-from-selection.ts","../../hooks/use-create-formula-tokenizer.ts","../../hooks/use-delayed-value.ts","../../hooks/use-editable.tsx","../../hooks/use-editor-cancel.ts","../../hooks/use-editor-change.ts","../../hooks/use-editor-keydown.ts","../../hooks/use-editor-submit.ts","../../hooks/use-embeds-charts.tsx","../../hooks/use-expand-cell.tsx","../../hooks/use-export-range.ts","../../hooks/use-filter.ts","../../hooks/use-flash.ts","../../hooks/use-fonts.ts","../../hooks/use-formula-range-helpers.ts","../../hooks/use-get-tooltip.tsx","../../hooks/use-get-values-from-range.ts","../../hooks/use-grid-children.tsx","../../hooks/use-header-actions.tsx","../../hooks/use-hidden-dimension-markers.tsx","../../hooks/use-hidden-dimensions.ts","../../hooks/use-hovered-selection-ids.ts","../../hooks/use-isomorphic-layout-effect.ts","../../hooks/use-keyboard-handler.tsx","../../hooks/use-licensekey-validator.tsx","../../hooks/use-memo-compare.ts","../../hooks/use-merge.refs.ts","../../hooks/use-move-columns-rows.tsx","../../hooks/use-navigate-sheet-range.ts","../../hooks/use-previous.ts","../../hooks/use-raf.ts","../../hooks/use-resize-observer.ts","../../hooks/use-reveal-chart-embed.ts","../../hooks/use-scale-listener.ts","../../hooks/use-selected-rows-columns.ts","../../hooks/use-selection-aware-formatting.ts","../../hooks/use-selection-change.ts","../../hooks/use-selection-interceptors.ts","../../hooks/use-selection-move.ts","../../hooks/use-selection-renderer.tsx","../../hooks/use-selection-resize.ts","../../hooks/use-selection.ts","../../hooks/use-sheet-change-handler.ts","../../hooks/use-sizer.ts","../../hooks/use-spreadsheet-theme.ts","../../hooks/use-stable-ref.ts","../../hooks/use-structured-reference-selection.ts","../../hooks/use-table-hit-zones.ts","../../hooks/use-table-resizer.tsx","../../hooks/use-text-dimensions.ts","../../hooks/use-tooltip.ts","../../hooks/use-touch.ts","../../providers/spreadsheet-provider.tsx","../../signals/scroll-subscriber.ts","../../utils/copy-as-picture.ts","../../utils/maybe.ts","../../utils/pivot-chart-field-buttons.ts","../../utils/z-order.ts"],"version":"5.8.3"}
1
+ {"root":["../../config.ts","../../helpers.ts","../../index.tsx","../../release-date.ts","../../test-setup.ts","../../themes.ts","../../types.ts","../../vitest.config.ts","../../api/animate.ts","../../api/banded-ranges.ts","../../api/calculated-column-fill.ts","../../api/cf-engine.ts","../../api/cf-overlays.ts","../../api/cf-window.ts","../../api/chart-sheet.ts","../../api/chart-source-ranges.ts","../../api/colors.ts","../../api/copy-paste.ts","../../api/evaluate-formula.ts","../../api/excel-validation-kinds.ts","../../api/fill-patterns.ts","../../api/fill-series.ts","../../api/font-loader.ts","../../api/go-to-special.ts","../../api/go-to.ts","../../api/heatmap.ts","../../api/insert-options.ts","../../api/move-overwrite.ts","../../api/multi-selection.ts","../../api/scheduler.ts","../../api/scroller.ts","../../api/selections.ts","../../api/spreadsheet-api.ts","../../api/table-auto-expansion.ts","../../api/table.ts","../../api/validation-tooltip.tsx","../../api/validation.ts","../../atoms/active-editor.atom.ts","../../atoms/advanced-filter-dialog.atom.ts","../../atoms/calculated-column-fill.atom.ts","../../atoms/cell-input-context.atom.ts","../../atoms/chart-actions.atom.ts","../../atoms/editing-cell.atom.ts","../../atoms/evaluate-formula-dialog.atom.ts","../../atoms/fill-options.atom.ts","../../atoms/fill-series-dialog.atom.ts","../../atoms/formula-bar-editor-value.atom.ts","../../atoms/formula-mode.atom.ts","../../atoms/formula-selection-state.atom.ts","../../atoms/formula-selections.atom.ts","../../atoms/go-to-dialog.atom.ts","../../atoms/goal-seek-dialog.atom.ts","../../atoms/index.ts","../../atoms/insert-cells-dialog.atom.ts","../../atoms/insert-options.atom.ts","../../atoms/loading-indicator.atom.ts","../../atoms/magic-fill-state.atom.ts","../../atoms/move-chart-dialog.atom.ts","../../atoms/move-overwrite-confirm.atom.ts","../../atoms/paste-menu.atom.ts","../../atoms/paste-special-dialog.atom.ts","../../atoms/persistent-tooltip.atom.ts","../../atoms/popover.atom.ts","../../atoms/range-selector.atom.ts","../../atoms/remove-duplicates-dialog.atom.ts","../../atoms/selected-chart-embed.atom.ts","../../atoms/selected-chart-series.atom.ts","../../atoms/sheet-context.atom.ts","../../atoms/sheet-status-display.atom.ts","../../atoms/show-formula-help.atom.ts","../../atoms/sort-dialog.atom.ts","../../atoms/sparkline-dialog.atom.ts","../../atoms/spreadsheet-api.atom.ts","../../atoms/subtotal-dialog.atom.ts","../../atoms/table-auto-expansion.atom.ts","../../atoms/text-to-columns-dialog.atom.ts","../../atoms/validation-alert.atom.ts","../../atoms/watch-window.atom.ts","../../components/advanced-filter-dialog/index.tsx","../../components/bottom-bar/index.tsx","../../components/calculated-column-smart-tag/index.tsx","../../components/calculation-options-dialog/index.tsx","../../components/canvas-grid/helpers.ts","../../components/canvas-grid/index.tsx","../../components/canvas-grid/typings.ts","../../components/cell/alignment.ts","../../components/cell/cell-background.tsx","../../components/cell/cell-text-runs.tsx","../../components/cell/helpers.ts","../../components/cell/index.tsx","../../components/cell/line-height.ts","../../components/cell/rich-text.ts","../../components/cell/typings.ts","../../components/cell-arrow/index.tsx","../../components/cell-calculated/index.tsx","../../components/cell-checkbox/index.tsx","../../components/cell-diff/index.tsx","../../components/cell-editor/calendar-popup.tsx","../../components/cell-editor/formula-result-preview.tsx","../../components/cell-editor/helpers.ts","../../components/cell-editor/index.tsx","../../components/cell-editor/style.tsx","../../components/cell-error/index.tsx","../../components/cell-expand/index.tsx","../../components/cell-filter/index.tsx","../../components/cell-group/index.tsx","../../components/cell-input/cell-input.tsx","../../components/cell-input/formula-bar-cell-input.tsx","../../components/cell-input/index.tsx","../../components/cell-input/style.tsx","../../components/cell-overlay/index.tsx","../../components/cell-structured/index.tsx","../../components/cell-structured/sparkline-math.ts","../../components/cell-structured/sparkline.tsx","../../components/cell-structured/types.ts","../../components/cell-tooltip/index.tsx","../../components/cell-tooltip/note-editor.tsx","../../components/cell-tooltip/style.tsx","../../components/chart-sheet-view/index.tsx","../../components/context-menu/embed-context-menu.tsx","../../components/context-menu/index.tsx","../../components/context-menu/menu.tsx","../../components/context-menu/style.tsx","../../components/context-menu/total-row-function-menu.tsx","../../components/context-menu/total-row-functions.ts","../../components/embeds/chart-component.tsx","../../components/embeds/embed-component.tsx","../../components/embeds/embed-draggable.tsx","../../components/embeds/index.tsx","../../components/embeds/shape-geometry.ts","../../components/embeds/shape-svg.tsx","../../components/embeds/slicer-component.tsx","../../components/evaluate-formula-dialog/index.tsx","../../components/fill-handle/index.tsx","../../components/fill-series-dialog/index.tsx","../../components/filter-box/date-tree.ts","../../components/filter-box/filter-by-color.tsx","../../components/filter-box/filter-by-condition.tsx","../../components/filter-box/filter-by-value.tsx","../../components/filter-box/index.tsx","../../components/floating-cell-editor/index.tsx","../../components/formula-bar/index.tsx","../../components/formula-bar/style.tsx","../../components/formula-input/index.tsx","../../components/go-to-dialog/index.tsx","../../components/goal-seek-dialog/index.tsx","../../components/grid-footer/index.tsx","../../components/header-cell/index.tsx","../../components/header-menu/index.tsx","../../components/header-move/index.tsx","../../components/header-resizer/index.tsx","../../components/hidden-markers/index.tsx","../../components/hidden-markers/style.tsx","../../components/insert-cells-dialog/index.tsx","../../components/insert-function-dialog/index.tsx","../../components/insert-options-smart-tag/index.tsx","../../components/loading-indicator/index.tsx","../../components/move-chart-dialog/index.tsx","../../components/move-overwrite-confirm-dialog/index.tsx","../../components/outline-gutter/index.tsx","../../components/paste-special-dialog/index.tsx","../../components/pivot-placeholder/index.tsx","../../components/print-preview/cell-styles.ts","../../components/print-preview/index.ts","../../components/print-preview/page-block.tsx","../../components/print-preview/print-preview-dialog.tsx","../../components/print-preview/run-print.ts","../../components/print-preview/settings.ts","../../components/print-preview/use-page-layout.ts","../../components/range-selector/index.tsx","../../components/remove-duplicates-dialog/index.tsx","../../components/resizer/index.tsx","../../components/selection/avatar.tsx","../../components/selection/fill-options-menu.tsx","../../components/selection/index.tsx","../../components/selection/magic-fill.tsx","../../components/selection/paste-menu.tsx","../../components/selection/quick-edit.tsx","../../components/selection/style.tsx","../../components/selection/suggestion-action.tsx","../../components/selection/title.tsx","../../components/selection/types.ts","../../components/selection-input/index.tsx","../../components/selection-input/style.tsx","../../components/sheet-search/index.tsx","../../components/sheet-status/index.tsx","../../components/sheet-status/style.tsx","../../components/sheet-switcher/index.tsx","../../components/sheet-switcher/new-sheet-button.tsx","../../components/sheet-tabs/context-menu.tsx","../../components/sheet-tabs/index.tsx","../../components/sheet-tabs/sheet-tab.tsx","../../components/sheet-tabs/style.tsx","../../components/sheet-tabs/types.ts","../../components/sort-range-dialog/index.tsx","../../components/sparkline-dialog/index.tsx","../../components/subtotal-dialog/index.tsx","../../components/table-auto-expansion-smart-tag/index.tsx","../../components/text-to-columns-dialog/index.tsx","../../components/toolbar/background-color-selector.tsx","../../components/toolbar/border-color-selector.tsx","../../components/toolbar/border-line-style-options.tsx","../../components/toolbar/border-line-style-selector.tsx","../../components/toolbar/border-location-options.tsx","../../components/toolbar/border-selector.tsx","../../components/toolbar/buttons.tsx","../../components/toolbar/cell-style-selector.tsx","../../components/toolbar/color-selector.tsx","../../components/toolbar/fill-selectors.tsx","../../components/toolbar/font-family-selector.tsx","../../components/toolbar/font-size-selector.tsx","../../components/toolbar/index.tsx","../../components/toolbar/insert-menu.tsx","../../components/toolbar/merge-cells-selector.tsx","../../components/toolbar/scale-selector.tsx","../../components/toolbar/sparkline-actions.tsx","../../components/toolbar/style.tsx","../../components/toolbar/table-actions.tsx","../../components/toolbar/table-style-editor.tsx","../../components/toolbar/table-style-selector.tsx","../../components/toolbar/text-color-selector.tsx","../../components/toolbar/text-format-selector.tsx","../../components/toolbar/text-horizontal-align-selector.tsx","../../components/toolbar/text-rotation-selector.tsx","../../components/toolbar/text-vertical-align-selector.tsx","../../components/toolbar/text-wrap-selector.tsx","../../components/toolbar/theme-selector.tsx","../../components/toolbar/toolbar.tsx","../../components/toolbar/types.ts","../../components/toolbar/view-menu.tsx","../../components/validation-alert-dialog/index.tsx","../../components/watch-window/index.tsx","../../helpers/merged-cell-borders.ts","../../hooks/export-range-tiles.ts","../../hooks/index.ts","../../hooks/show-zeros.ts","../../hooks/use-async.ts","../../hooks/use-border-styles.ts","../../hooks/use-callback-ref.ts","../../hooks/use-cell-diff-highlight.ts","../../hooks/use-cell-popover.tsx","../../hooks/use-cell-renderer.tsx","../../hooks/use-chart-clipboard.ts","../../hooks/use-chart-source-ranges.ts","../../hooks/use-column-color-icons.ts","../../hooks/use-conditional-formatting.ts","../../hooks/use-context-menu.tsx","../../hooks/use-context-setter.ts","../../hooks/use-copy-paste-cut.tsx","../../hooks/use-create-address-from-selection.ts","../../hooks/use-create-formula-tokenizer.ts","../../hooks/use-delayed-value.ts","../../hooks/use-editable.tsx","../../hooks/use-editor-cancel.ts","../../hooks/use-editor-change.ts","../../hooks/use-editor-keydown.ts","../../hooks/use-editor-submit.ts","../../hooks/use-embeds-charts.tsx","../../hooks/use-expand-cell.tsx","../../hooks/use-export-range.ts","../../hooks/use-filter.ts","../../hooks/use-flash.ts","../../hooks/use-fonts.ts","../../hooks/use-formula-range-helpers.ts","../../hooks/use-get-tooltip.tsx","../../hooks/use-get-values-from-range.ts","../../hooks/use-grid-children.tsx","../../hooks/use-header-actions.tsx","../../hooks/use-hidden-dimension-markers.tsx","../../hooks/use-hidden-dimensions.ts","../../hooks/use-hovered-selection-ids.ts","../../hooks/use-isomorphic-layout-effect.ts","../../hooks/use-keyboard-handler.tsx","../../hooks/use-licensekey-validator.tsx","../../hooks/use-memo-compare.ts","../../hooks/use-merge.refs.ts","../../hooks/use-move-columns-rows.tsx","../../hooks/use-navigate-sheet-range.ts","../../hooks/use-previous.ts","../../hooks/use-raf.ts","../../hooks/use-resize-observer.ts","../../hooks/use-reveal-chart-embed.ts","../../hooks/use-scale-listener.ts","../../hooks/use-selected-rows-columns.ts","../../hooks/use-selection-aware-formatting.ts","../../hooks/use-selection-change.ts","../../hooks/use-selection-interceptors.ts","../../hooks/use-selection-move.ts","../../hooks/use-selection-renderer.tsx","../../hooks/use-selection-resize.ts","../../hooks/use-selection.ts","../../hooks/use-sheet-change-handler.ts","../../hooks/use-sizer.ts","../../hooks/use-spreadsheet-theme.ts","../../hooks/use-stable-ref.ts","../../hooks/use-structured-reference-selection.ts","../../hooks/use-table-hit-zones.ts","../../hooks/use-table-resizer.tsx","../../hooks/use-text-dimensions.ts","../../hooks/use-tooltip.ts","../../hooks/use-touch.ts","../../providers/spreadsheet-provider.tsx","../../signals/scroll-subscriber.ts","../../utils/copy-as-picture.ts","../../utils/maybe.ts","../../utils/pivot-chart-field-buttons.ts","../../utils/z-order.ts"],"version":"5.8.3"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/canvas-grid/index.tsx"],"names":[],"mappings":"AAoDA,OAAO,KASN,MAAM,OAAO,CAAC;AAqNf,OAAO,KAAK,EAGV,QAAQ,EAWT,MAAM,aAAa,CAAC;AAoBrB,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EAEhB,MAAM,WAAW,CAAC;AAg3LnB,eAAO,MAAM,UAAU,EAA4C,CACjE,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,EAEvB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GACvB,wBAAwB,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAAE,KAChE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/canvas-grid/index.tsx"],"names":[],"mappings":"AAoDA,OAAO,KASN,MAAM,OAAO,CAAC;AAqNf,OAAO,KAAK,EAGV,QAAQ,EAWT,MAAM,aAAa,CAAC;AAoBrB,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EAEhB,MAAM,WAAW,CAAC;AAw5LnB,eAAO,MAAM,UAAU,EAA4C,CACjE,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,EAEvB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GACvB,wBAAwB,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAAE,KAChE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC"}
@@ -116,8 +116,18 @@ import { getNestedPropertyNames } from "./helpers";
116
116
  */
117
117
  /** Where the grid focuses when no cell is given (A1); mirrors spreadsheet-state's `defaultCellCoords` without importing it — that package depends on this one. */
118
118
  const defaultCellCoords = { rowIndex: 1, columnIndex: 1 };
119
+ /**
120
+ * Whether a registered editor's DOM has been removed: an input that unmounted while focused
121
+ * gets no blur from Chromium, so its `activeEditor` registration can outlive it. Such an editor
122
+ * cannot hold focus, so the grid treats it as absent (rowsncolumns/spreadsheet#1131). An editor
123
+ * that exposes no element is trusted as live.
124
+ */
125
+ function isDetachedEditor(editor) {
126
+ const element = editor.el?.();
127
+ return element != null && !element.isConnected;
128
+ }
119
129
  function CanvasGridComponent(props, forwardedRef) {
120
- const { licenseKey, sheetId, sheetType, ChartSheetView: ChartSheetViewComponent = ChartSheetView, instanceId, activeCell = DEFAULT_ACTIVE_CELL, selections = DEFAULT_ARRAY, frozenColumnCount = 0, frozenRowCount = 0, rowCount = DEFAULT_ROW_COUNT, columnCount = DEFAULT_COLUMN_COUNT, autoFocus, basicFilter, tables, namedRanges, bandedRanges = DEFAULT_ARRAY, tableBorderColor = "#008000", filterIconColor = "#008000", conditionalFormats, showFilterIcon = true, showCalculatedColumnIcon = true, showHeaders = true, defaultColumnWidth = DEFAULT_COLUMN_WIDTH, defaultRowHeight = DEFAULT_ROW_HEIGHT, columnHeaderHeight = COLUMN_HEADER_HEIGHT, rowHeaderWidth = ROW_HEADER_WIDTH, gridLineColor = GRIDLINE_COLOR, cellBackgroundColor = DEFAULT_CELL_BACKGROUND_COLOR, cellColor = DEFAULT_CELL_COLOR, headerBorderColor = DEFAULT_HEADER_BORDER_COLOR, headerBackgroundColor = DEFAULT_HEADER_BG, headerColor = DEFAULT_HEADER_COLOR, headerActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_BG, headerSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_BG, headerSelectedColor = "white", headerTableBackgroundColor = DEFAULT_HEADER_TABLE_BG, headerTableActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_TABLE_BG, headerTableSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_TABLE_BG, frozenShadowColor = headerBorderColor, frozenShadowThickness = 1, selectionBackgroundColor = SELECTION_BG, selectionBorderColor = SELECTION_BORDER, selectionDragBorderColor = SELECTION_BORDER, chartSelectedColor, chipBackgroundColor = CHIP_COLOR, merges = DEFAULT_ARRAY, borderStyles, protectedRanges, isWorkbookProtected: isWorkbookProtectedProp = false, getSheetProtection, pivotTables, charts, onUpdateChart, onChangeZOrder, embeds, slicers, rowMetadata = DEFAULT_ARRAY, columnMetadata = DEFAULT_ARRAY, scale = 1, zoomSpeed = 1, overscanCount = 3, enableEditOnEnterKey = true, enableTextOverflow = true, showGridLines: _showGridLines, showFormulas = false, protectFormulas = false, showFrozenSeparator = true, HeaderCell = DefaultHeaderCell, Cell = DefaultCell, SelectionTitleComponent = SelectionTitle, CellEditor = DefaultCellEditor, CellTooltip, ContextMenu = DefaultContextMenu, ContextMenuWrapper = DefaultContextMenuWrapper, FilterBox = DefaultFilterBox, HeaderMoveDragComponent = DefaultHeaderMoveDragComponent, SuggestionsDropdown, stickyEditor = true, scrollSnap = false, scrollThrottleTimeout, preventBrowserDefaultScroll, mouseMoveThrottleTimeout = 60, tooltipIntentInterval = 60, selectionPolicy, users, userId, renderCollaboratorCursor, functionDescriptions, showHeaderMenuButton = true, scrollbarSize = SCROLLBAR_SIZE, theme = defaultSpreadsheetTheme, showNotes = true, showComments = true, locale, formulaLocale: formulaLocaleProp, agentSuggestions, onReviewSuggestion, onShowFormulas, getDataRowCount, getDataRegion, getChartComponent, getEmbedComponent, getSlicerComponent, onChange, onChangeBatch, onExpandCollapse, onPivotDrillDown, onDelete, onChangeEditorValue, onFill, onRequestCalculate, onChangeActiveCell, onChangeActiveSheet, onChangeSelections, getSheetName, getSheetId, getCellData, getNote: getNoteProp, getTextFormatRuns, getDataValidation, getEffectiveFormat, getFormattedValue: getFormattedValueProp, getTooltipContent, errorResolutionComponent, getEffectiveValue: getEffectiveValueProp, getSparklineGroup, getUserEnteredExtendedValue, getEffectiveExtendedValue, getSheetRowCount, getSheetColumnCount, getCellPopoverContent, onScroll, onViewPortChange, windowConditionalFormats = false, engineConditionalFormatResults = false, onResize, onAutoResize, onHideColumn, onHideRow, onShowColumn, onShowRow, onGroupRows, onUngroupRows, onCollapseRowGroup, onExpandRowGroup, onGroupColumns, onUngroupColumns, onCollapseColumnGroup, onExpandColumnGroup, onSetOutlineDepth, onDeleteRow, onDeleteColumn, onInsertRow, onInsertColumn, onChangeAutoExpandTables, onChangeAutoCalculatedColumns, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onClearContents, onMoveColumns, onMoveRows, onSelectNextSheet, onSelectPreviousSheet, onCreateNewSheet, onKeyDown, onChangeFormatting, onRepeatFormatting, onClearFormatting, onRequestEditProtectedRange, onMoveChart, onResizeChart, onDeleteChart, onCutChart, onCopyChart, onMoveEmbed, onResizeEmbed, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFillRange, disableFillRightShortcut, keymap, onCalculateNow, onRequestGoTo, onMoveSelection, onInsertCutCells, onInsertTime, onInsertDate, onInsertDateTime, onInsertAutoSum, onUndo, onRedo, onPaste, onCopy, onCut, onSortColumn, onSortTable, onFilterTable, onFilterPivot, onResizeTable, onUndoTableAutoExpansion, onUndoCalculatedColumn, onOverwriteCalculatedColumn, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onRequestCreatePivotChart, onRemoveTable, onCreateTable, onRequestCreateTable, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onUpdateTable, onRequestResizeTable, onRequestInsertSlicer, onCreateBasicFilter, onRequestDefineNamedRange, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRequestInsertComment, onRequestInsertLink, onFreezeColumn, onFreezeRow, onUpdateNote, onProtectRange, onUnProtectRange, onSortRange, onRequestSearch, onRequestReplace, onRequestResize, getRowHeaderText = getDefaultRowHeader, getColumnHeaderText = getDefaultColumnHeader, getAdditionalCellSpacing, tokenizer: defaultTokenizer = defaultFormulaTokenizer, onChangeScale, onRemoveLink, onSelectLink, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onRequestExpand, cellExpandPredicate, StructuredResult = DefaultStructuredResult, getMentions, getStructuredProperties: getStructuredPropertiesProp, getFunctionParameterSuggestions, shouldFetchFunctionParameters, MentionTagComponent, MentionDropdownItemComponent, showSelectionResizeHandles = true, enableMagicFill, enableQuickEdit = true, MagicFillComponent, MagicFillContent, QuickEdit, PasteMenu, SuggestionAction, HiddenRowMarkers, HiddenColumnMarkers, enableResizerOverflow, className, defaultFontSizePoint = DEFAULT_FONT_SIZE_PT, defaultCellFormat, readonly, isComparing = false, getCellDiff, enableDataBoundaryNavigation, footerHeight, footerComponent, arrowComponents,
130
+ const { licenseKey, sheetId, sheetType, ChartSheetView: ChartSheetViewComponent = ChartSheetView, instanceId, activeCell = DEFAULT_ACTIVE_CELL, selections = DEFAULT_ARRAY, frozenColumnCount = 0, frozenRowCount = 0, rowCount = DEFAULT_ROW_COUNT, columnCount = DEFAULT_COLUMN_COUNT, autoFocus, basicFilter, tables, namedRanges, bandedRanges = DEFAULT_ARRAY, tableBorderColor = "#008000", filterIconColor = "#008000", conditionalFormats, showFilterIcon = true, showCalculatedColumnIcon = true, showHeaders = true, defaultColumnWidth = DEFAULT_COLUMN_WIDTH, defaultRowHeight = DEFAULT_ROW_HEIGHT, lineHeightMode = "fontMetrics", columnHeaderHeight = COLUMN_HEADER_HEIGHT, rowHeaderWidth = ROW_HEADER_WIDTH, gridLineColor = GRIDLINE_COLOR, cellBackgroundColor = DEFAULT_CELL_BACKGROUND_COLOR, cellColor = DEFAULT_CELL_COLOR, headerBorderColor = DEFAULT_HEADER_BORDER_COLOR, headerBackgroundColor = DEFAULT_HEADER_BG, headerColor = DEFAULT_HEADER_COLOR, headerActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_BG, headerSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_BG, headerSelectedColor = "white", headerTableBackgroundColor = DEFAULT_HEADER_TABLE_BG, headerTableActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_TABLE_BG, headerTableSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_TABLE_BG, frozenShadowColor = headerBorderColor, frozenShadowThickness = 1, selectionBackgroundColor = SELECTION_BG, selectionBorderColor = SELECTION_BORDER, selectionDragBorderColor = SELECTION_BORDER, chartSelectedColor, chipBackgroundColor = CHIP_COLOR, merges = DEFAULT_ARRAY, borderStyles, protectedRanges, isWorkbookProtected: isWorkbookProtectedProp = false, getSheetProtection, pivotTables, charts, onUpdateChart, onChangeZOrder, embeds, slicers, rowMetadata = DEFAULT_ARRAY, columnMetadata = DEFAULT_ARRAY, scale = 1, zoomSpeed = 1, overscanCount = 3, enableEditOnEnterKey = true, enableTextOverflow = true, showGridLines: _showGridLines, showFormulas = false, protectFormulas = false, showFrozenSeparator = true, HeaderCell = DefaultHeaderCell, Cell = DefaultCell, SelectionTitleComponent = SelectionTitle, CellEditor = DefaultCellEditor, CellTooltip, ContextMenu = DefaultContextMenu, ContextMenuWrapper = DefaultContextMenuWrapper, FilterBox = DefaultFilterBox, HeaderMoveDragComponent = DefaultHeaderMoveDragComponent, SuggestionsDropdown, stickyEditor = true, scrollSnap = false, scrollThrottleTimeout, preventBrowserDefaultScroll, mouseMoveThrottleTimeout = 60, tooltipIntentInterval = 60, selectionPolicy, users, userId, renderCollaboratorCursor, functionDescriptions, showHeaderMenuButton = true, scrollbarSize = SCROLLBAR_SIZE, theme = defaultSpreadsheetTheme, showNotes = true, showComments = true, locale, formulaLocale: formulaLocaleProp, agentSuggestions, onReviewSuggestion, onShowFormulas, getDataRowCount, getDataRegion, getChartComponent, getEmbedComponent, getSlicerComponent, onChange, onChangeBatch, onExpandCollapse, onPivotDrillDown, onDelete, onChangeEditorValue, onFill, onRequestCalculate, onChangeActiveCell, onChangeActiveSheet, onChangeSelections, getSheetName, getSheetId, getCellData, getNote: getNoteProp, getTextFormatRuns, getDataValidation, getEffectiveFormat, getFormattedValue: getFormattedValueProp, getTooltipContent, errorResolutionComponent, getEffectiveValue: getEffectiveValueProp, getSparklineGroup, getUserEnteredExtendedValue, getEffectiveExtendedValue, getSheetRowCount, getSheetColumnCount, getCellPopoverContent, onScroll, onViewPortChange, windowConditionalFormats = false, engineConditionalFormatResults = false, onResize, onAutoResize, onHideColumn, onHideRow, onShowColumn, onShowRow, onGroupRows, onUngroupRows, onCollapseRowGroup, onExpandRowGroup, onGroupColumns, onUngroupColumns, onCollapseColumnGroup, onExpandColumnGroup, onSetOutlineDepth, onDeleteRow, onDeleteColumn, onInsertRow, onInsertColumn, onChangeAutoExpandTables, onChangeAutoCalculatedColumns, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onClearContents, onMoveColumns, onMoveRows, onSelectNextSheet, onSelectPreviousSheet, onCreateNewSheet, onKeyDown, onChangeFormatting, onRepeatFormatting, onClearFormatting, onRequestEditProtectedRange, onMoveChart, onResizeChart, onDeleteChart, onCutChart, onCopyChart, onMoveEmbed, onResizeEmbed, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFillRange, disableFillRightShortcut, keymap, onCalculateNow, onRequestGoTo, onMoveSelection, onInsertCutCells, onInsertTime, onInsertDate, onInsertDateTime, onInsertAutoSum, onUndo, onRedo, batchHistory, onPaste, onCopy, onCut, onSortColumn, onSortTable, onFilterTable, onFilterPivot, onResizeTable, onUndoTableAutoExpansion, onUndoCalculatedColumn, onOverwriteCalculatedColumn, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onRequestCreatePivotChart, onRemoveTable, onCreateTable, onRequestCreateTable, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onUpdateTable, onRequestResizeTable, onRequestInsertSlicer, onCreateBasicFilter, onRequestDefineNamedRange, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRequestInsertComment, onRequestInsertLink, onFreezeColumn, onFreezeRow, onUpdateNote, onProtectRange, onUnProtectRange, onSortRange, onRequestSearch, onRequestReplace, onRequestResize, getRowHeaderText = getDefaultRowHeader, getColumnHeaderText = getDefaultColumnHeader, getAdditionalCellSpacing, tokenizer: defaultTokenizer = defaultFormulaTokenizer, onChangeScale, onRemoveLink, onSelectLink, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onRequestExpand, cellExpandPredicate, StructuredResult = DefaultStructuredResult, getMentions, getStructuredProperties: getStructuredPropertiesProp, getFunctionParameterSuggestions, shouldFetchFunctionParameters, MentionTagComponent, MentionDropdownItemComponent, showSelectionResizeHandles = true, enableMagicFill, enableQuickEdit = true, MagicFillComponent, MagicFillContent, QuickEdit, PasteMenu, SuggestionAction, HiddenRowMarkers, HiddenColumnMarkers, enableResizerOverflow, className, defaultFontSizePoint = DEFAULT_FONT_SIZE_PT, defaultCellFormat, readonly, isComparing = false, getCellDiff, enableDataBoundaryNavigation, footerHeight, footerComponent, arrowComponents,
121
131
  // Host-driven filter props. `hostHiddenRowRanges`
122
132
  // supplies compact [start, end] hidden-row tuples; `getFilterValues` supplies a
123
133
  // column's distinct values. Both let a million-row filter render without scanning
@@ -696,10 +706,20 @@ function CanvasGridComponent(props, forwardedRef) {
696
706
  !gridContainer.contains(activeElement)) {
697
707
  return;
698
708
  }
699
- if (!activeEditor || activeEditor === cellEditorInstance) {
709
+ // An editor whose DOM is gone cannot be the one holding focus: a host that unmounted an
710
+ // input without a blur (Chromium fires none for a removed focused element) can leave a
711
+ // stale `activeEditor` behind, and honouring it would lock the grid out of keyboard input
712
+ // (rowsncolumns/spreadsheet#1131).
713
+ if (!activeEditor ||
714
+ activeEditor === cellEditorInstance ||
715
+ isDetachedEditor(activeEditor)) {
700
716
  cellEditorInstance?.focus();
701
717
  }
702
718
  }, [activeEditor, cellEditorInstance]);
719
+ /**
720
+ * Container and total size of the grid, as the grid measures them
721
+ */
722
+ const getGridDimensions = useCallback(() => gridRef.current?.getDimensions(), []);
703
723
  /**
704
724
  * Canvas layers
705
725
  */
@@ -1332,19 +1352,19 @@ function CanvasGridComponent(props, forwardedRef) {
1332
1352
  sheetId,
1333
1353
  cellBackgroundColor,
1334
1354
  gridLineWidth,
1355
+ frozenRows,
1356
+ frozenColumns,
1335
1357
  getCanvasLayers,
1336
1358
  getRowHeaderCanvasLayer,
1337
1359
  getColumnHeaderCanvasLayer,
1338
- getCellOffsetFromCoords,
1339
1360
  getR1C1AddressFromSelection,
1340
1361
  getSheetName,
1341
1362
  getScrollPosition,
1342
- getViewPort,
1343
1363
  getRowOffset,
1344
1364
  getColumnOffset,
1345
1365
  getSheetDimensions,
1366
+ getGridDimensions,
1346
1367
  scrollTo,
1347
- scrollToCell,
1348
1368
  scale,
1349
1369
  onChangeScale,
1350
1370
  });
@@ -1877,6 +1897,7 @@ function CanvasGridComponent(props, forwardedRef) {
1877
1897
  // Measure with the same font the painter draws with (#1117).
1878
1898
  fontFamily: defaultFontFamily,
1879
1899
  fontSize: defaultFontSize,
1900
+ lineHeightMode,
1880
1901
  resizeStrategy: "full",
1881
1902
  });
1882
1903
  /**
@@ -2400,10 +2421,12 @@ function CanvasGridComponent(props, forwardedRef) {
2400
2421
  focus: focusSheet,
2401
2422
  scrollToCell,
2402
2423
  isMergedCell,
2403
- onFill,
2424
+ // A readonly grid gets no write handler: a fill-handle drag or a
2425
+ // selection drag-move then changes nothing, whatever started the gesture.
2426
+ onFill: readonly ? undefined : onFill,
2404
2427
  onFillHandleRelease: handleFillHandleRelease,
2405
- onFillShrink: handleFillShrink,
2406
- onMoveSelection,
2428
+ onFillShrink: readonly ? undefined : handleFillShrink,
2429
+ onMoveSelection: readonly ? undefined : onMoveSelection,
2407
2430
  onInsertCutCells,
2408
2431
  confirmMoveOverwrite,
2409
2432
  isHiddenColumn,
@@ -2422,6 +2445,7 @@ function CanvasGridComponent(props, forwardedRef) {
2422
2445
  activeCell,
2423
2446
  selections,
2424
2447
  sheetId,
2448
+ readonly,
2425
2449
  focusSheet,
2426
2450
  onPaste,
2427
2451
  onCopy,
@@ -2662,6 +2686,7 @@ function CanvasGridComponent(props, forwardedRef) {
2662
2686
  showValidationAlert,
2663
2687
  selections,
2664
2688
  onChangeBatch,
2689
+ batchHistory,
2665
2690
  formulaLocale,
2666
2691
  });
2667
2692
  /**
@@ -3065,14 +3090,15 @@ function CanvasGridComponent(props, forwardedRef) {
3065
3090
  selectionTopBound,
3066
3091
  showHeaderMenuButton,
3067
3092
  scale,
3068
- onResize,
3093
+ // Column widths and row heights are sheet writes too
3094
+ onResize: readonly ? undefined : onResize,
3069
3095
  focusSheet,
3070
3096
  isRowHeader,
3071
3097
  isColumnHeader,
3072
3098
  isHiddenColumn,
3073
3099
  containerWidth: width - scrollbarSize,
3074
3100
  containerHeight: height - scrollbarSize,
3075
- onAutoFit: handleAutoFit,
3101
+ onAutoFit: readonly ? undefined : handleAutoFit,
3076
3102
  backgroundColor: selectionBorderColor,
3077
3103
  sheetId,
3078
3104
  selectedRowHeadersIds,
@@ -3580,6 +3606,7 @@ function CanvasGridComponent(props, forwardedRef) {
3580
3606
  onCheckboxClick: handleCheckboxClick,
3581
3607
  onExpandCollapse: handleExpandCollapse,
3582
3608
  defaultFontSizePoint: defaultFontSize,
3609
+ lineHeightMode,
3583
3610
  Cell,
3584
3611
  HeaderCell,
3585
3612
  theme,
@@ -3653,8 +3680,10 @@ function CanvasGridComponent(props, forwardedRef) {
3653
3680
  * Hide fill handle
3654
3681
  * 1. When user is in edit mode
3655
3682
  * 2. When user is in formula mode and user has made selections
3683
+ * 3. When the grid is readonly — a fill is a write
3656
3684
  */
3657
- const showFillHandle = !isSelectionInProgress &&
3685
+ const showFillHandle = !readonly &&
3686
+ !isSelectionInProgress &&
3658
3687
  !isEditInProgress &&
3659
3688
  !isResizingTable &&
3660
3689
  !(formulaMode && formulaSelections.length);
@@ -4108,12 +4137,14 @@ function CanvasGridComponent(props, forwardedRef) {
4108
4137
  popoverComponent,
4109
4138
  popoverRange,
4110
4139
  cellExpandComponent,
4140
+ arrowComponents,
4111
4141
  });
4112
4142
  /**
4113
4143
  * Only enable selection drag if user is not editing and not
4114
- * in formula mode
4144
+ * in formula mode. A readonly grid has nothing to move, so the
4145
+ * gesture does not start at all (no move cursor, no selection jump).
4115
4146
  */
4116
- const enableSelectionDrag = !isSelectionInProgress && !isEditInProgress && !formulaMode;
4147
+ const enableSelectionDrag = !readonly && !isSelectionInProgress && !isEditInProgress && !formulaMode;
4117
4148
  // A chartsheet IS its chart: no grid, headers, editor or cell menus — only the chart and its
4118
4149
  // context menu (Excel).
4119
4150
  if (sheetType === "chartsheet") {
@@ -1,6 +1,6 @@
1
1
  import type { CalculatorFunction } from "@rowsncolumns/common-types";
2
2
  import type { FormulaResult } from "@rowsncolumns/fast-formula-parser";
3
- import type { Align, AreaStyle, CellInterface, CellPosition, Direction, GridProps, GridRange, GridRef, OptionalCellInterface, ScrollCoords, SelectionArea, Style, ViewPortProps } from "@rowsncolumns/grid";
3
+ import type { Align, AreaStyle, CellInterface, CellPosition, Direction, GridProps, GridRange, GridRef, LineHeightMode, OptionalCellInterface, ScrollCoords, SelectionArea, Style, ViewPortProps } from "@rowsncolumns/grid";
4
4
  import type { Mention, MentionTagComponentProps, OptionItem, ProseMirrorEditorProps, TextFormatRun } from "@rowsncolumns/ui";
5
5
  import type { FormulaLocale, FormulaLocaleInput } from "@rowsncolumns/utils";
6
6
  import type { CellDiff } from "@rowsncolumns/version-comparison";
@@ -231,6 +231,14 @@ export type CanvasGridProps<T extends CellData = CellData<any, any>> = {
231
231
  * Default row height
232
232
  */
233
233
  defaultRowHeight?: number;
234
+ /**
235
+ * Where the height of one line of cell text comes from, for both the
236
+ * painter and row auto-fit. `fontMetrics` (default) measures each font's
237
+ * bounding box (`fontBoundingBoxAscent + fontBoundingBoxDescent`) once
238
+ * and stacks lines with Excel's 2px leading, so wrapped rows fit like
239
+ * Excel's; `fixed` keeps the pre-#1141 `fontSize * 1.2` line box.
240
+ */
241
+ lineHeightMode?: LineHeightMode;
234
242
  /**
235
243
  * Default column width
236
244
  */
@@ -1277,6 +1285,15 @@ export type CanvasGridProps<T extends CellData = CellData<any, any>> = {
1277
1285
  * User tries to redo an action
1278
1286
  */
1279
1287
  onRedo?(): void;
1288
+ /**
1289
+ * Run `action` with every write it issues recorded as ONE undo entry — the `batchHistory` of
1290
+ * `useSpreadsheetState` / `useSpreadsheetEngine`, so a host spreading its state into the grid
1291
+ * passes it for free. The grid uses it for gestures that are one step in Excel but several writes
1292
+ * here: Ctrl+Enter commits the active cell through `onChange` and spreads the entry into the rest
1293
+ * of the selection through `onChangeBatch`, one call per rectangle. Without it each write is its
1294
+ * own undo entry.
1295
+ */
1296
+ batchHistory?<R>(action: () => R): R;
1280
1297
  /**
1281
1298
  * Callback when user paste a set of cells
1282
1299
  * @param e Browser event