@rowsncolumns/spreadsheet 10.5.2 → 10.5.5

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 (115) hide show
  1. package/dist/cjs/api/selections.d.ts +15 -1
  2. package/dist/cjs/api/selections.d.ts.map +1 -1
  3. package/dist/cjs/api/selections.js +12 -2
  4. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  5. package/dist/cjs/components/canvas-grid/index.js +88 -70
  6. package/dist/cjs/components/canvas-grid/typings.d.ts +40 -1
  7. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  8. package/dist/cjs/components/cell/cell-text-runs.d.ts +10 -3
  9. package/dist/cjs/components/cell/cell-text-runs.d.ts.map +1 -1
  10. package/dist/cjs/components/cell/cell-text-runs.js +21 -9
  11. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  12. package/dist/cjs/components/cell/index.js +9 -5
  13. package/dist/cjs/components/cell/line-height.d.ts +22 -0
  14. package/dist/cjs/components/cell/line-height.d.ts.map +1 -0
  15. package/dist/cjs/components/cell/line-height.js +32 -0
  16. package/dist/cjs/components/cell/typings.d.ts +8 -2
  17. package/dist/cjs/components/cell/typings.d.ts.map +1 -1
  18. package/dist/cjs/hooks/export-range-tiles.d.ts +81 -0
  19. package/dist/cjs/hooks/export-range-tiles.d.ts.map +1 -0
  20. package/dist/cjs/hooks/export-range-tiles.js +171 -0
  21. package/dist/cjs/hooks/use-cell-renderer.d.ts +6 -1
  22. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  23. package/dist/cjs/hooks/use-cell-renderer.js +3 -2
  24. package/dist/cjs/hooks/use-copy-paste-cut.d.ts +5 -1
  25. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  26. package/dist/cjs/hooks/use-copy-paste-cut.js +19 -5
  27. package/dist/cjs/hooks/use-editable.d.ts +8 -1
  28. package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
  29. package/dist/cjs/hooks/use-editable.js +6 -1
  30. package/dist/cjs/hooks/use-editor-submit.d.ts +7 -1
  31. package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
  32. package/dist/cjs/hooks/use-editor-submit.js +36 -16
  33. package/dist/cjs/hooks/use-export-range.d.ts +14 -6
  34. package/dist/cjs/hooks/use-export-range.d.ts.map +1 -1
  35. package/dist/cjs/hooks/use-export-range.js +240 -158
  36. package/dist/cjs/hooks/use-grid-children.d.ts +4 -1
  37. package/dist/cjs/hooks/use-grid-children.d.ts.map +1 -1
  38. package/dist/cjs/hooks/use-grid-children.js +4 -2
  39. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  40. package/dist/cjs/hooks/use-keyboard-handler.js +13 -6
  41. package/dist/cjs/hooks/use-navigate-sheet-range.d.ts.map +1 -1
  42. package/dist/cjs/hooks/use-navigate-sheet-range.js +5 -2
  43. package/dist/cjs/hooks/use-resize-observer.d.ts.map +1 -1
  44. package/dist/cjs/hooks/use-resize-observer.js +43 -11
  45. package/dist/cjs/hooks/use-selection-renderer.d.ts +5 -1
  46. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  47. package/dist/cjs/hooks/use-selection-renderer.js +8 -2
  48. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  49. package/dist/cjs/hooks/use-selection.js +4 -2
  50. package/dist/cjs/hooks/use-sizer.d.ts +8 -2
  51. package/dist/cjs/hooks/use-sizer.d.ts.map +1 -1
  52. package/dist/cjs/hooks/use-sizer.js +54 -33
  53. package/dist/cjs/providers/spreadsheet-provider.d.ts +11 -2
  54. package/dist/cjs/providers/spreadsheet-provider.d.ts.map +1 -1
  55. package/dist/cjs/providers/spreadsheet-provider.js +7 -5
  56. package/dist/cjs/release-date.js +1 -1
  57. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  58. package/dist/esm/api/selections.d.ts +15 -1
  59. package/dist/esm/api/selections.d.ts.map +1 -1
  60. package/dist/esm/api/selections.js +11 -2
  61. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  62. package/dist/esm/components/canvas-grid/index.js +30 -12
  63. package/dist/esm/components/canvas-grid/typings.d.ts +40 -1
  64. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  65. package/dist/esm/components/cell/cell-text-runs.d.ts +10 -3
  66. package/dist/esm/components/cell/cell-text-runs.d.ts.map +1 -1
  67. package/dist/esm/components/cell/cell-text-runs.js +14 -9
  68. package/dist/esm/components/cell/index.d.ts.map +1 -1
  69. package/dist/esm/components/cell/index.js +7 -3
  70. package/dist/esm/components/cell/line-height.d.ts +22 -0
  71. package/dist/esm/components/cell/line-height.d.ts.map +1 -0
  72. package/dist/esm/components/cell/line-height.js +25 -0
  73. package/dist/esm/components/cell/typings.d.ts +8 -2
  74. package/dist/esm/components/cell/typings.d.ts.map +1 -1
  75. package/dist/esm/hooks/export-range-tiles.d.ts +81 -0
  76. package/dist/esm/hooks/export-range-tiles.d.ts.map +1 -0
  77. package/dist/esm/hooks/export-range-tiles.js +126 -0
  78. package/dist/esm/hooks/use-cell-renderer.d.ts +6 -1
  79. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  80. package/dist/esm/hooks/use-cell-renderer.js +3 -2
  81. package/dist/esm/hooks/use-copy-paste-cut.d.ts +5 -1
  82. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  83. package/dist/esm/hooks/use-copy-paste-cut.js +17 -3
  84. package/dist/esm/hooks/use-editable.d.ts +8 -1
  85. package/dist/esm/hooks/use-editable.d.ts.map +1 -1
  86. package/dist/esm/hooks/use-editable.js +6 -1
  87. package/dist/esm/hooks/use-editor-submit.d.ts +7 -1
  88. package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
  89. package/dist/esm/hooks/use-editor-submit.js +24 -6
  90. package/dist/esm/hooks/use-export-range.d.ts +14 -6
  91. package/dist/esm/hooks/use-export-range.d.ts.map +1 -1
  92. package/dist/esm/hooks/use-export-range.js +158 -120
  93. package/dist/esm/hooks/use-grid-children.d.ts +4 -1
  94. package/dist/esm/hooks/use-grid-children.d.ts.map +1 -1
  95. package/dist/esm/hooks/use-grid-children.js +4 -2
  96. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  97. package/dist/esm/hooks/use-keyboard-handler.js +13 -6
  98. package/dist/esm/hooks/use-navigate-sheet-range.d.ts.map +1 -1
  99. package/dist/esm/hooks/use-navigate-sheet-range.js +5 -2
  100. package/dist/esm/hooks/use-resize-observer.d.ts.map +1 -1
  101. package/dist/esm/hooks/use-resize-observer.js +38 -9
  102. package/dist/esm/hooks/use-selection-renderer.d.ts +5 -1
  103. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  104. package/dist/esm/hooks/use-selection-renderer.js +8 -2
  105. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  106. package/dist/esm/hooks/use-selection.js +4 -2
  107. package/dist/esm/hooks/use-sizer.d.ts +8 -2
  108. package/dist/esm/hooks/use-sizer.d.ts.map +1 -1
  109. package/dist/esm/hooks/use-sizer.js +53 -31
  110. package/dist/esm/providers/spreadsheet-provider.d.ts +11 -2
  111. package/dist/esm/providers/spreadsheet-provider.d.ts.map +1 -1
  112. package/dist/esm/providers/spreadsheet-provider.js +8 -6
  113. package/dist/esm/release-date.js +1 -1
  114. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  115. package/package.json +6 -6
@@ -1,44 +1,98 @@
1
- import { Align } from "@rowsncolumns/grid";
2
1
  import { getDevicePixelRatio } from "@rowsncolumns/grid";
3
2
  import { useCallback } from "react";
3
+ import { planExportStops, sourceOffset, } from "./export-range-tiles";
4
4
  import { useCallbackRef } from "./use-callback-ref";
5
- export const useExportRange = ({ sheetId, gridLineWidth, cellBackgroundColor, getCanvasLayers, getColumnHeaderCanvasLayer, getRowHeaderCanvasLayer, getSheetName, getCellOffsetFromCoords, getR1C1AddressFromSelection, getScrollPosition, getViewPort, getRowOffset, getColumnOffset, getSheetDimensions, scrollTo, scrollToCell, scale, onChangeScale, }) => {
5
+ import { useStableRef } from "./use-stable-ref";
6
+ /** The export zooms out this far to fit a range in the viewport before it tiles. */
7
+ const MIN_EXPORT_SCALE = 0.25;
8
+ /**
9
+ * Frames to keep waiting for a repaint that never comes (a host that ignores
10
+ * `onChangeScale`, a scroll the grid clamped elsewhere). The capture then goes
11
+ * on from whatever the grid did land on, so the output stays right.
12
+ */
13
+ const PAINT_WAIT_FRAME_BUDGET = 120;
14
+ /** A scrollbar-driven scroll can settle a hair off the requested offset on sheets taller than the scrollbar can address. */
15
+ const SCROLL_TOLERANCE = 2;
16
+ /**
17
+ * Resolves once the layer has repainted with `ready()` holding and a whole
18
+ * animation frame has then passed without another paint. The grid's canvas is
19
+ * drawn by react-konva's batched draw on the frame after a React commit, and a
20
+ * windowed engine folds the rows of a freshly scrolled-to viewport in a second
21
+ * commit right behind the first — the quiet frame is what lets that second
22
+ * paint land before the copy, instead of a fixed number of frames that may or
23
+ * may not cover it. Paints from before `ready()` held do not count.
24
+ */
25
+ const waitForPaint = (layer, ready) => new Promise((resolve) => {
26
+ let paintedThisFrame = false;
27
+ let paintedWhileReady = false;
28
+ let frames = 0;
29
+ const onDraw = () => {
30
+ paintedThisFrame = true;
31
+ };
32
+ layer.on("draw", onDraw);
33
+ const finish = () => {
34
+ layer.off("draw", onDraw);
35
+ resolve();
36
+ };
37
+ const tick = () => {
38
+ frames += 1;
39
+ if (!ready()) {
40
+ paintedThisFrame = false;
41
+ paintedWhileReady = false;
42
+ }
43
+ else if (paintedThisFrame) {
44
+ paintedThisFrame = false;
45
+ paintedWhileReady = true;
46
+ }
47
+ else if (paintedWhileReady) {
48
+ finish();
49
+ return;
50
+ }
51
+ if (frames >= PAINT_WAIT_FRAME_BUDGET) {
52
+ finish();
53
+ return;
54
+ }
55
+ requestAnimationFrame(tick);
56
+ };
57
+ requestAnimationFrame(tick);
58
+ });
59
+ const isAtScroll = (position, target) => Math.abs(position.scrollTop - target.scrollTop) <= SCROLL_TOLERANCE &&
60
+ Math.abs(position.scrollLeft - target.scrollLeft) <= SCROLL_TOLERANCE;
61
+ const getFileExtension = (fmt) => {
62
+ switch (fmt) {
63
+ case "image/jpeg":
64
+ case "image/jpg":
65
+ return ".jpg";
66
+ case "image/webp":
67
+ return ".webp";
68
+ case "image/png":
69
+ default:
70
+ return ".png";
71
+ }
72
+ };
73
+ export const useExportRange = ({ sheetId, gridLineWidth, cellBackgroundColor, frozenRows, frozenColumns, getCanvasLayers, getColumnHeaderCanvasLayer, getRowHeaderCanvasLayer, getSheetName, getR1C1AddressFromSelection, getScrollPosition, getRowOffset, getColumnOffset, getSheetDimensions, getGridDimensions, scrollTo, scale, onChangeScale, }) => {
74
+ // The capture spans renders; this is how it sees the scale the host applied.
75
+ const scaleRef = useStableRef(scale);
6
76
  return useCallbackRef(useCallback((range, options) => {
7
77
  const layers = getCanvasLayers();
8
- if (!layers?.length)
78
+ const layer = layers?.[0];
79
+ if (!layer)
9
80
  return undefined;
10
81
  const { filename, format, includeHeaders } = options || {};
11
82
  const baseScale = scale ?? 1;
12
- const minExportScale = 0.25;
13
- const waitForPaint = () => new Promise((resolve) => {
14
- requestAnimationFrame(() => {
15
- requestAnimationFrame(() => resolve());
16
- });
17
- });
18
- const normalizeRangeStart = (rangeValue) => ({
19
- ...rangeValue,
20
- startRowIndex: Math.max(1, rangeValue.startRowIndex),
21
- startColumnIndex: Math.max(1, rangeValue.startColumnIndex),
22
- });
23
- const isStartInViewport = (viewport, normalizedRange) => normalizedRange.startRowIndex >= viewport.visibleRowStartIndex &&
24
- normalizedRange.startRowIndex <= viewport.visibleRowStopIndex &&
25
- normalizedRange.startColumnIndex >=
26
- viewport.visibleColumnStartIndex &&
27
- normalizedRange.startColumnIndex <= viewport.visibleColumnStopIndex;
28
- const isRangeInViewport = (viewport, normalizedRange) => normalizedRange.startRowIndex >= viewport.visibleRowStartIndex &&
29
- normalizedRange.endRowIndex <= viewport.visibleRowStopIndex &&
30
- normalizedRange.startColumnIndex >=
31
- viewport.visibleColumnStartIndex &&
32
- normalizedRange.endColumnIndex <= viewport.visibleColumnStopIndex;
83
+ const normalizedRange = {
84
+ ...range,
85
+ startRowIndex: Math.max(1, range.startRowIndex),
86
+ startColumnIndex: Math.max(1, range.startColumnIndex),
87
+ };
33
88
  const exportRangeAsync = async () => {
34
89
  const initialScrollCoords = getScrollPosition();
35
90
  let nextScale = baseScale;
36
- let didScroll = false;
37
91
  if (onChangeScale) {
38
- const startX = getColumnOffset(range.startColumnIndex);
39
- const endX = getColumnOffset(range.endColumnIndex + 1);
40
- const startY = getRowOffset(range.startRowIndex);
41
- const endY = getRowOffset(range.endRowIndex + 1);
92
+ const startX = getColumnOffset(normalizedRange.startColumnIndex);
93
+ const endX = getColumnOffset(normalizedRange.endColumnIndex + 1);
94
+ const startY = getRowOffset(normalizedRange.startRowIndex);
95
+ const endY = getRowOffset(normalizedRange.endRowIndex + 1);
42
96
  const currentWidth = Math.max(endX - startX, 0);
43
97
  const currentHeight = Math.max(endY - startY, 0);
44
98
  const [viewWidth, viewHeight] = getSheetDimensions();
@@ -46,112 +100,93 @@ export const useExportRange = ({ sheetId, gridLineWidth, cellBackgroundColor, ge
46
100
  const unscaledWidth = currentWidth / baseScale;
47
101
  const unscaledHeight = currentHeight / baseScale;
48
102
  const fitScale = Math.min(viewWidth / unscaledWidth, viewHeight / unscaledHeight, baseScale);
49
- const minScale = Math.min(minExportScale, baseScale);
103
+ const minScale = Math.min(MIN_EXPORT_SCALE, baseScale);
50
104
  nextScale = Math.min(Math.max(fitScale, minScale), baseScale);
51
105
  }
52
106
  }
53
107
  try {
54
108
  if (onChangeScale && nextScale !== baseScale) {
55
109
  onChangeScale(nextScale);
56
- await waitForPaint();
57
- }
58
- const normalizedRange = normalizeRangeStart(range);
59
- const viewport = getViewPort();
60
- if (!isStartInViewport(viewport, normalizedRange)) {
61
- scrollToCell?.({
62
- rowIndex: normalizedRange.startRowIndex,
63
- columnIndex: normalizedRange.startColumnIndex,
64
- }, Align.start);
65
- didScroll = true;
66
- await waitForPaint();
67
- }
68
- const viewportAfterStart = getViewPort();
69
- if (!isRangeInViewport(viewportAfterStart, normalizedRange)) {
70
- scrollToCell?.({
71
- rowIndex: normalizedRange.endRowIndex,
72
- columnIndex: normalizedRange.endColumnIndex,
73
- }, Align.end);
74
- didScroll = true;
75
- await waitForPaint();
110
+ await waitForPaint(layer, () => scaleRef.current === nextScale);
76
111
  }
77
- const scrollCoords = getScrollPosition();
78
- const tl = getCellOffsetFromCoords({
79
- rowIndex: normalizedRange.startRowIndex,
80
- columnIndex: normalizedRange.startColumnIndex,
81
- });
82
- const br = getCellOffsetFromCoords({
83
- rowIndex: normalizedRange.endRowIndex,
84
- columnIndex: normalizedRange.endColumnIndex,
112
+ // Measured after the zoom so every offset is at the export scale.
113
+ const dimensions = getGridDimensions();
114
+ if (!dimensions)
115
+ return undefined;
116
+ const headerWidth = includeHeaders ? getColumnOffset(1) : 0;
117
+ const headerHeight = includeHeaders ? getRowOffset(1) : 0;
118
+ const rangeLeft = getColumnOffset(normalizedRange.startColumnIndex);
119
+ const rangeRight = getColumnOffset(normalizedRange.endColumnIndex + 1) +
120
+ gridLineWidth;
121
+ const rangeTop = getRowOffset(normalizedRange.startRowIndex);
122
+ const rangeBottom = getRowOffset(normalizedRange.endRowIndex + 1) + gridLineWidth;
123
+ const scrollAtPlan = getScrollPosition();
124
+ const stops = planExportStops({
125
+ x: {
126
+ rangeStart: rangeLeft,
127
+ rangeEnd: rangeRight,
128
+ frozenSize: getColumnOffset(frozenColumns),
129
+ viewportSize: dimensions.containerWidth,
130
+ maxScroll: Math.max(0, dimensions.estimatedTotalWidth - dimensions.containerWidth),
131
+ currentScroll: scrollAtPlan.scrollLeft,
132
+ headerSize: headerWidth,
133
+ },
134
+ y: {
135
+ rangeStart: rangeTop,
136
+ rangeEnd: rangeBottom,
137
+ frozenSize: getRowOffset(frozenRows),
138
+ viewportSize: dimensions.containerHeight,
139
+ maxScroll: Math.max(0, dimensions.estimatedTotalHeight - dimensions.containerHeight),
140
+ currentScroll: scrollAtPlan.scrollTop,
141
+ headerSize: headerHeight,
142
+ },
85
143
  });
86
- // @ts-ignore
87
- tl.x -= scrollCoords.scrollLeft;
88
- // @ts-ignore
89
- tl.y -= scrollCoords.scrollTop;
90
- // @ts-ignore
91
- br.x -= scrollCoords.scrollLeft;
92
- // @ts-ignore
93
- br.y -= scrollCoords.scrollTop;
94
144
  const sheetName = getSheetName?.(range.sheetId ?? sheetId);
95
145
  const dpr = getDevicePixelRatio();
96
- const baseX = tl?.x ?? 0;
97
- const baseY = tl?.y ?? 0;
98
- const baseWidth = (br?.x ?? 0) - baseX + (br?.width ?? 0) + gridLineWidth;
99
- const baseHeight = (br?.y ?? 0) - baseY + (br?.height ?? 0) + gridLineWidth;
100
- const headerWidth = includeHeaders ? getColumnOffset(1) : 0;
101
- const headerHeight = includeHeaders ? getRowOffset(1) : 0;
102
- const destX = headerWidth;
103
- const destY = headerHeight;
104
- const width = baseWidth + headerWidth;
105
- const height = baseHeight + headerHeight;
146
+ const width = rangeRight - rangeLeft + headerWidth;
147
+ const height = rangeBottom - rangeTop + headerHeight;
106
148
  const finalFileName = filename ??
107
149
  getR1C1AddressFromSelection?.(normalizedRange, sheetName)?.substring(1);
108
- const getFileExtension = (fmt) => {
109
- switch (fmt) {
110
- case "image/jpeg":
111
- case "image/jpg":
112
- return ".jpg";
113
- case "image/webp":
114
- return ".webp";
115
- case "image/png":
116
- default:
117
- return ".png";
118
- }
150
+ const canvases = {
151
+ body: layer.getCanvas()._canvas,
152
+ rowHeader: includeHeaders
153
+ ? getRowHeaderCanvasLayer()?.[0]?.getCanvas()._canvas
154
+ : null,
155
+ columnHeader: includeHeaders
156
+ ? getColumnHeaderCanvasLayer()?.[0]?.getCanvas()._canvas
157
+ : null,
119
158
  };
120
- const bodyCanvas = layers[0]?.getCanvas()._canvas;
121
- const rowHeaderCanvas = includeHeaders
122
- ? getRowHeaderCanvasLayer()?.[0]?.getCanvas()._canvas
123
- : null;
124
- const columnHeaderCanvas = includeHeaders
125
- ? getColumnHeaderCanvasLayer()?.[0]?.getCanvas()._canvas
126
- : null;
127
- if (!bodyCanvas)
159
+ if (!canvases.body)
128
160
  return undefined;
129
- const canvas = bodyCanvas;
130
161
  const tempCanvas = document.createElement("canvas");
131
162
  tempCanvas.width = width * dpr;
132
163
  tempCanvas.height = height * dpr;
133
164
  const tempCtx = tempCanvas.getContext("2d");
134
- const intermediateCanvas = document.createElement("canvas");
135
- intermediateCanvas.width = width * dpr;
136
- intermediateCanvas.height = height * dpr;
137
- const intermediateCtx = intermediateCanvas.getContext("2d");
138
- const bodySourceX = baseX;
139
- const bodySourceY = baseY;
140
- if (intermediateCtx) {
141
- intermediateCtx.drawImage(canvas, bodySourceX * dpr, bodySourceY * dpr, baseWidth * dpr, baseHeight * dpr, destX * dpr, destY * dpr, baseWidth * dpr, baseHeight * dpr);
142
- }
143
165
  if (tempCtx) {
144
166
  tempCtx.fillStyle = cellBackgroundColor;
145
167
  tempCtx.fillRect(0, 0, tempCanvas.width, tempCanvas.height);
146
- tempCtx.drawImage(intermediateCanvas, 0, 0);
147
- if (includeHeaders) {
148
- if (columnHeaderCanvas) {
149
- tempCtx.drawImage(columnHeaderCanvas, baseX * dpr, 0, baseWidth * dpr, headerHeight * dpr, destX * dpr, 0, baseWidth * dpr, headerHeight * dpr);
150
- }
151
- if (rowHeaderCanvas) {
152
- tempCtx.drawImage(rowHeaderCanvas, 0, baseY * dpr, headerWidth * dpr, baseHeight * dpr, 0, destY * dpr, headerWidth * dpr, baseHeight * dpr);
153
- }
168
+ }
169
+ const copyPiece = (piece, landed) => {
170
+ const source = canvases[piece.canvas];
171
+ if (!tempCtx || !source)
172
+ return;
173
+ const sx = sourceOffset(piece.x, landed.scrollLeft);
174
+ const sy = sourceOffset(piece.y, landed.scrollTop);
175
+ tempCtx.drawImage(source, sx * dpr, sy * dpr, piece.x.size * dpr, piece.y.size * dpr, piece.x.dest * dpr, piece.y.dest * dpr, piece.x.size * dpr, piece.y.size * dpr);
176
+ };
177
+ for (const stop of stops) {
178
+ const target = {
179
+ scrollTop: stop.scrollTop,
180
+ scrollLeft: stop.scrollLeft,
181
+ };
182
+ if (!isAtScroll(getScrollPosition(), target)) {
183
+ scrollTo(target, true);
184
+ await waitForPaint(layer, () => isAtScroll(getScrollPosition(), target));
154
185
  }
186
+ // Copy from where the grid actually landed, not where it was sent.
187
+ const landed = getScrollPosition();
188
+ for (const piece of stop.pieces)
189
+ copyPiece(piece, landed);
155
190
  }
156
191
  if (format === "clipboard") {
157
192
  await new Promise((resolve, reject) => {
@@ -195,11 +230,13 @@ export const useExportRange = ({ sheetId, gridLineWidth, cellBackgroundColor, ge
195
230
  const shouldRestoreScale = onChangeScale && nextScale !== baseScale;
196
231
  if (shouldRestoreScale) {
197
232
  onChangeScale(baseScale);
198
- await waitForPaint();
233
+ await waitForPaint(layer, () => scaleRef.current === baseScale);
199
234
  }
200
- if (didScroll || shouldRestoreScale) {
201
- scrollTo?.(initialScrollCoords, true);
202
- await waitForPaint();
235
+ const current = getScrollPosition();
236
+ if (current.scrollTop !== initialScrollCoords.scrollTop ||
237
+ current.scrollLeft !== initialScrollCoords.scrollLeft) {
238
+ scrollTo(initialScrollCoords, true);
239
+ await waitForPaint(layer, () => isAtScroll(getScrollPosition(), initialScrollCoords));
203
240
  }
204
241
  }
205
242
  };
@@ -208,20 +245,21 @@ export const useExportRange = ({ sheetId, gridLineWidth, cellBackgroundColor, ge
208
245
  sheetId,
209
246
  gridLineWidth,
210
247
  cellBackgroundColor,
248
+ frozenRows,
249
+ frozenColumns,
211
250
  getCanvasLayers,
212
- getCellOffsetFromCoords,
213
251
  getSheetName,
214
252
  getR1C1AddressFromSelection,
215
253
  getScrollPosition,
216
- getViewPort,
217
254
  getColumnHeaderCanvasLayer,
218
255
  getRowHeaderCanvasLayer,
219
256
  getRowOffset,
220
257
  getColumnOffset,
221
258
  getSheetDimensions,
259
+ getGridDimensions,
222
260
  scrollTo,
223
- scrollToCell,
224
261
  scale,
225
262
  onChangeScale,
263
+ scaleRef,
226
264
  ]));
227
265
  };
@@ -1,5 +1,6 @@
1
1
  import type { GridChildrenProps } from "@rowsncolumns/grid";
2
2
  import React from "react";
3
+ import type { CanvasGridProps } from "../components/canvas-grid/typings";
3
4
  import type { SheetCoordinate, SheetRange } from "../types";
4
5
  import type { useEmbedsCharts } from "./use-embeds-charts";
5
6
  type UseGridChildrenProps = {
@@ -18,12 +19,14 @@ type UseGridChildrenProps = {
18
19
  isHeaderMenuInFrozenColumn?: boolean;
19
20
  popoverComponent: React.JSX.Element | null | undefined;
20
21
  cellExpandComponent: React.JSX.Element | null | undefined;
22
+ /** Trace precedents / dependents arrows; they scroll with the body. */
23
+ arrowComponents?: CanvasGridProps["arrowComponents"];
21
24
  popoverRange?: SheetRange | SheetCoordinate;
22
25
  gridLineWidth?: number;
23
26
  frozenColumns: number;
24
27
  frozenRows: number;
25
28
  };
26
- export declare const useGridChildren: ({ stickyEditor, editorComponent, chartComponents, embedComponents, slicerComponents, pivotPlaceholders, tableResizers, hiddenColumnMarkers, frozenHiddenColumnMarkers, hiddenRowMarkers, frozenHiddenRowMarkers, gridLineWidth, frozenColumns, frozenRows, headerMenuComponent, isHeaderMenuInFrozenColumn, popoverRange, popoverComponent, cellExpandComponent, }: UseGridChildrenProps) => (props: GridChildrenProps) => React.JSX.Element;
29
+ export declare const useGridChildren: ({ stickyEditor, editorComponent, chartComponents, embedComponents, slicerComponents, pivotPlaceholders, tableResizers, hiddenColumnMarkers, frozenHiddenColumnMarkers, hiddenRowMarkers, frozenHiddenRowMarkers, gridLineWidth, frozenColumns, frozenRows, headerMenuComponent, isHeaderMenuInFrozenColumn, popoverRange, popoverComponent, cellExpandComponent, arrowComponents, }: UseGridChildrenProps) => (props: GridChildrenProps) => React.JSX.Element;
27
30
  export declare const StyledGridChildren: ({ className, elevate, ...props }: React.HTMLAttributes<HTMLDivElement> & {
28
31
  elevate?: boolean;
29
32
  }) => React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"use-grid-children.d.ts","sourceRoot":"","sources":["../../../hooks/use-grid-children.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAsB,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,KAAK,oBAAoB,GAAG;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3C,eAAe,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACvE,eAAe,EACX,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,iBAAiB,CAAC,GACrD,IAAI,GACJ,SAAS,CAAC;IACd,gBAAgB,EACZ,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,kBAAkB,CAAC,GACtD,IAAI,GACJ,SAAS,CAAC;IACd,iBAAiB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACtD,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,yBAAyB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,sBAAsB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7D,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,YAAY,CAAC,EAAE,UAAU,GAAG,eAAe,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,oWAoB7B,oBAAoB,aAiBX,iBAAiB,sBAyI5B,CAAC;AA+BF,eAAO,MAAM,kBAAkB,GAAI,kCAIhC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,sBAS9D,CAAC"}
1
+ {"version":3,"file":"use-grid-children.d.ts","sourceRoot":"","sources":["../../../hooks/use-grid-children.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAsB,MAAM,OAAO,CAAC;AAG3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,KAAK,oBAAoB,GAAG;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3C,eAAe,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACvE,eAAe,EACX,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,iBAAiB,CAAC,GACrD,IAAI,GACJ,SAAS,CAAC;IACd,gBAAgB,EACZ,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,kBAAkB,CAAC,GACtD,IAAI,GACJ,SAAS,CAAC;IACd,iBAAiB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACtD,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,yBAAyB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,sBAAsB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7D,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,uEAAuE;IACvE,eAAe,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,UAAU,GAAG,eAAe,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,qXAqB7B,oBAAoB,aAiBX,iBAAiB,sBA2I5B,CAAC;AA+BF,eAAO,MAAM,kBAAkB,GAAI,kCAIhC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,sBAS9D,CAAC"}
@@ -2,7 +2,7 @@ import { cn } from "@rowsncolumns/ui";
2
2
  import React, { useCallback } from "react";
3
3
  import { useEditingCellCoordinate } from "../atoms";
4
4
  import { isSheetRange } from "../helpers";
5
- export const useGridChildren = ({ stickyEditor, editorComponent, chartComponents, embedComponents, slicerComponents, pivotPlaceholders, tableResizers, hiddenColumnMarkers, frozenHiddenColumnMarkers, hiddenRowMarkers, frozenHiddenRowMarkers, gridLineWidth = 1, frozenColumns, frozenRows, headerMenuComponent, isHeaderMenuInFrozenColumn, popoverRange, popoverComponent, cellExpandComponent, }) => {
5
+ export const useGridChildren = ({ stickyEditor, editorComponent, chartComponents, embedComponents, slicerComponents, pivotPlaceholders, tableResizers, hiddenColumnMarkers, frozenHiddenColumnMarkers, hiddenRowMarkers, frozenHiddenRowMarkers, gridLineWidth = 1, frozenColumns, frozenRows, headerMenuComponent, isHeaderMenuInFrozenColumn, popoverRange, popoverComponent, cellExpandComponent, arrowComponents, }) => {
6
6
  const editingCellCoordinate = useEditingCellCoordinate();
7
7
  // Quite a bit of logic for non sticky editor
8
8
  // Remove if majority dont use this
@@ -42,7 +42,8 @@ export const useGridChildren = ({ stickyEditor, editorComponent, chartComponents
42
42
  slicerComponents?.body,
43
43
  pivotPlaceholders,
44
44
  popoverPlacement === "body" ? popoverComponent : null,
45
- cellExpandComponent)),
45
+ cellExpandComponent,
46
+ arrowComponents)),
46
47
  React.createElement(StyledGridChildren, { style: {
47
48
  left: frozenColumnWidth + gridLineWidth,
48
49
  } },
@@ -104,6 +105,7 @@ export const useGridChildren = ({ stickyEditor, editorComponent, chartComponents
104
105
  popoverComponent,
105
106
  popoverPlacement,
106
107
  cellExpandComponent,
108
+ arrowComponents,
107
109
  ]);
108
110
  };
109
111
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"use-keyboard-handler.d.ts","sourceRoot":"","sources":["../../../hooks/use-keyboard-handler.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-keyboard-handler.d.ts","sourceRoot":"","sources":["../../../hooks/use-keyboard-handler.tsx"],"names":[],"mappings":"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"}
@@ -136,17 +136,23 @@ onCalculateNow, onRequestGoTo, onRequestPasteSpecial, onChangeBatch, getUserEnte
136
136
  onRedo?.();
137
137
  e.preventDefault();
138
138
  return;
139
- // Cmd/Ctrl + F
139
+ // Cmd/Ctrl + F. Claimed only when the host handles it so the
140
+ // browser's find keeps working otherwise. Cmd/Ctrl + Shift + F
141
+ // (filter) is matched by code further down.
140
142
  case "f":
141
- if (!isShift) {
142
- onRequestSearch?.();
143
+ if (isShift)
144
+ break;
145
+ if (onRequestSearch) {
146
+ onRequestSearch();
143
147
  e.preventDefault();
144
148
  }
145
149
  return;
146
- // Cmd/Ctrl + H — Find & Replace
150
+ // Cmd/Ctrl + H — Find & Replace. Claimed only when the host
151
+ // handles it: on macOS Cmd+H hides the app (an Electron menu only
152
+ // gets the keys the page leaves alone).
147
153
  case "h":
148
- if (!isShift) {
149
- onRequestReplace?.();
154
+ if (!isShift && onRequestReplace) {
155
+ onRequestReplace();
150
156
  e.preventDefault();
151
157
  }
152
158
  return;
@@ -516,6 +522,7 @@ onCalculateNow, onRequestGoTo, onRequestPasteSpecial, onChangeBatch, getUserEnte
516
522
  case "KeyF":
517
523
  if (isMeta) {
518
524
  onCreateBasicFilter?.(sheetId, activeCell, selections);
525
+ e.preventDefault();
519
526
  }
520
527
  break;
521
528
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-navigate-sheet-range.d.ts","sourceRoot":"","sources":["../../../hooks/use-navigate-sheet-range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EACV,eAAe,EACf,KAAK,EACL,UAAU,EACX,MAAM,2BAA2B,CAAC;AAMnC,MAAM,MAAM,uBAAuB,GAAG;IACpC,mBAAmB,EAAE,eAAe,CAAC,qBAAqB,CAAC,CAAC;IAC5D,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC1D,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,EACrB,YAAY,CAAC,EAAE,OAAO,EACtB,KAAK,CAAC,EAAE,KAAK,KACV,IAAI,CAAC;IACV,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,oEAKrC,uBAAuB,kBAGP,UAAU,YAAY,eAAe,SAsCvD,CAAC"}
1
+ {"version":3,"file":"use-navigate-sheet-range.d.ts","sourceRoot":"","sources":["../../../hooks/use-navigate-sheet-range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EACV,eAAe,EACf,KAAK,EACL,UAAU,EACX,MAAM,2BAA2B,CAAC;AAMnC,MAAM,MAAM,uBAAuB,GAAG;IACpC,mBAAmB,EAAE,eAAe,CAAC,qBAAqB,CAAC,CAAC;IAC5D,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC1D,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,EACrB,YAAY,CAAC,EAAE,OAAO,EACtB,KAAK,CAAC,EAAE,KAAK,KACV,IAAI,CAAC;IACV,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,oEAKrC,uBAAuB,kBAGP,UAAU,YAAY,eAAe,SA4CvD,CAAC"}
@@ -14,8 +14,11 @@ export const useNavigateToSheetRange = ({ onChangeActiveSheet, onChangeSelection
14
14
  };
15
15
  // Switch to new sheet
16
16
  onChangeActiveSheet?.(sheetRange.sheetId);
17
- if (allowSelection && !isSheetRangeACell(sheetRange)) {
18
- onChangeSelections?.(sheetRange.sheetId, [{ range: sheetRange }]);
17
+ // A single-cell target clears the selection, as a click on that cell
18
+ // does; leaving the previous range selected would send the next
19
+ // paste there instead of to the cell the user navigated to.
20
+ if (allowSelection) {
21
+ onChangeSelections?.(sheetRange.sheetId, isSheetRangeACell(sheetRange) ? [] : [{ range: sheetRange }]);
19
22
  }
20
23
  // Set active cell
21
24
  if (allowSelection) {
@@ -1 +1 @@
1
- {"version":3,"file":"use-resize-observer.d.ts","sourceRoot":"","sources":["../../../hooks/use-resize-observer.ts"],"names":[],"mappings":"AAIA,KAAK,gBAAgB,GAAG,WAAW,GAAG,UAAU,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEnD,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AAE3D,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,gBAAgB,OAAK,MAAM,CAAC,CAAC,CAwCxE,CAAC"}
1
+ {"version":3,"file":"use-resize-observer.d.ts","sourceRoot":"","sources":["../../../hooks/use-resize-observer.ts"],"names":[],"mappings":"AAIA,KAAK,gBAAgB,GAAG,WAAW,GAAG,UAAU,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEnD,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AAE3D,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,gBAAgB,OAAK,MAAM,CAAC,CAAC,CA4ExE,CAAC"}
@@ -12,10 +12,29 @@ export const useResizeObserver = () => {
12
12
  y: 0,
13
13
  });
14
14
  const node = useRef(null);
15
- const observer = useRef(undefined);
16
- const disconnect = useCallback(() => observer.current?.disconnect(), []);
15
+ const binding = useRef(null);
16
+ const disconnect = useCallback(() => {
17
+ binding.current?.resize.disconnect();
18
+ binding.current?.adoption.disconnect();
19
+ binding.current = null;
20
+ }, []);
17
21
  const observe = useCallback(() => {
18
- observer.current = new ResizeObserver(([entry]) => {
22
+ const target = node.current;
23
+ if (!target)
24
+ return;
25
+ const ownerDocument = target.ownerDocument;
26
+ if (binding.current?.node === target &&
27
+ binding.current.document === ownerDocument)
28
+ return;
29
+ disconnect();
30
+ const ownerWindow = ownerDocument.defaultView;
31
+ if (!ownerWindow)
32
+ return;
33
+ const resize = new ownerWindow.ResizeObserver(([entry]) => {
34
+ // An already queued notification from the old document must not restore its old dimensions.
35
+ if (target.ownerDocument !== ownerDocument ||
36
+ binding.current?.resize !== resize)
37
+ return;
19
38
  const { left, top, width, height, bottom, right, x, y } = entry.contentRect;
20
39
  setObserverEntry({
21
40
  left,
@@ -28,13 +47,23 @@ export const useResizeObserver = () => {
28
47
  y,
29
48
  });
30
49
  });
31
- if (node.current) {
32
- observer.current.observe(node.current);
33
- }
34
- }, [node]);
50
+ // A retained grid can be adopted into a pop-out without rendering again. Chromium's original
51
+ // document keeps the observation, so bind anew in the destination when the DOM moves. Observing
52
+ // child-list changes also catches an adopted ancestor (the grid's own parent need not change).
53
+ const adoption = new ownerWindow.MutationObserver(() => observe());
54
+ binding.current = {
55
+ node: target,
56
+ document: ownerDocument,
57
+ resize,
58
+ adoption,
59
+ };
60
+ resize.observe(target);
61
+ adoption.observe(ownerDocument, { childList: true, subtree: true });
62
+ }, [disconnect]);
63
+ // Also follow a ref assigned to a replacement element in an ordinary React commit.
35
64
  useIsomorphicLayoutEffect(() => {
36
65
  observe();
37
- return () => disconnect();
38
- }, [disconnect, observe]);
66
+ });
67
+ useIsomorphicLayoutEffect(() => disconnect, [disconnect]);
39
68
  return [node, observerEntry];
40
69
  };
@@ -16,6 +16,10 @@ export type UseSelectionRendererProps = {
16
16
  sheetId: number;
17
17
  selectionBackgroundColor: string;
18
18
  selectionBorderColor: string;
19
+ /** Border width of a range selection outside formula mode (`CanvasGrid`'s prop). */
20
+ selectionStrokeWidth?: number;
21
+ /** Whether the active cell draws its own border while a range is selected (`CanvasGrid`'s prop). */
22
+ showActiveCellBorderInSelection?: boolean;
19
23
  scale?: number;
20
24
  getSheetName?(sheetId: number): string | undefined;
21
25
  onChangeActiveCell: CanvasGridProps["onChangeActiveCell"];
@@ -73,5 +77,5 @@ export type UseSelectionRendererProps = {
73
77
  */
74
78
  isFillShrink?: boolean;
75
79
  };
76
- export declare const useSelectionRenderer: ({ sheetId, selectionCount, selectionBackgroundColor, selectionBorderColor, onSelectionMouseDown, onChangeActiveCell, onChangeSelections, onRequestEditTable, onRequestEditPivotTable, onMouseDownResizeHandle, onMouseDownChartSourceResizeHandle, onMouseDownMoveSelection, isDraggingMoveSelection, onFlashEnd, getSheetName, resizeHandleSize, showSelectionResizeHandles, resizeHandleBorderColor, SelectionTitleComponent, isResizingTable, fillHandleSize, showFillHandle, enableMagicFill, MagicFillComponent, MagicFillContent, readonly, showPasteMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, insertOptions, onChooseInsertOption, tableAutoExpansion, canStopAutoExpandingTables, onChooseTableAutoExpansionOption, calculatedColumnFill, canStopAutoCalculatedColumns, onChooseCalculatedColumnOption, hoveredCell, onSplitTextToColumns, onRemoveQuickEdit, onAddQuickEdit, QuickEdit, PasteMenu, SuggestionAction, cachedHoveredSelectionIds, isFillShrink, }: UseSelectionRendererProps) => (props: SelectionProps<SelectionAttributes>) => React.JSX.Element | null;
80
+ export declare const useSelectionRenderer: ({ sheetId, selectionCount, selectionBackgroundColor, selectionBorderColor, selectionStrokeWidth, showActiveCellBorderInSelection, onSelectionMouseDown, onChangeActiveCell, onChangeSelections, onRequestEditTable, onRequestEditPivotTable, onMouseDownResizeHandle, onMouseDownChartSourceResizeHandle, onMouseDownMoveSelection, isDraggingMoveSelection, onFlashEnd, getSheetName, resizeHandleSize, showSelectionResizeHandles, resizeHandleBorderColor, SelectionTitleComponent, isResizingTable, fillHandleSize, showFillHandle, enableMagicFill, MagicFillComponent, MagicFillContent, readonly, showPasteMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, insertOptions, onChooseInsertOption, tableAutoExpansion, canStopAutoExpandingTables, onChooseTableAutoExpansionOption, calculatedColumnFill, canStopAutoCalculatedColumns, onChooseCalculatedColumnOption, hoveredCell, onSplitTextToColumns, onRemoveQuickEdit, onAddQuickEdit, QuickEdit, PasteMenu, SuggestionAction, cachedHoveredSelectionIds, isFillShrink, }: UseSelectionRendererProps) => (props: SelectionProps<SelectionAttributes>) => React.JSX.Element | null;
77
81
  //# sourceMappingURL=use-selection-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-selection-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAKlB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAShE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAE5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM5C,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB,EAAE,MAAM,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC1D,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC1D,oBAAoB,CAAC,CACnB,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,EAC/C,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,SAAS,EAAE,aAAa,GAAG,SAAS,EACpC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,GAChC,IAAI,CAAC;IACR,uBAAuB,EAAE,KAAK,CAAC,WAAW,CAAC;IAC3C,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC1D,uBAAuB,EAAE,eAAe,CAAC,yBAAyB,CAAC,CAAC;IACpE,uBAAuB,EAAE,iBAAiB,CAAC,yBAAyB,CAAC,CAAC;IACtE,oEAAoE;IACpE,kCAAkC,CAAC,EAAE,iBAAiB,CAAC,yBAAyB,CAAC,CAAC;IAClF,wBAAwB,EAAE,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;IACrE,sEAAsE;IACtE,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,UAAU,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;IACtD,eAAe,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACrD,kBAAkB,CAAC,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC3D,gBAAgB,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACvD,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gGAAgG;IAChG,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAChD,sBAAsB,CAAC,IAAI,IAAI,CAAC;IAChC,kBAAkB,CAAC,IAAI,IAAI,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,oBAAoB,CAAC,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxD,uGAAuG;IACvG,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,gCAAgC,CAAC,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC1E,sGAAsG;IACtG,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnD,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,8BAA8B,CAAC,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtE,oBAAoB,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAC;IAC9D,WAAW,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3C,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,yBAAyB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAChD;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAyBF,eAAO,MAAM,oBAAoB,GAAI,i9BAiDlC,yBAAyB,aAOhB,cAAc,CAAC,mBAAmB,CAAC,6BA6R9C,CAAC"}
1
+ {"version":3,"file":"use-selection-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection-renderer.tsx"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@ const anchorsInsertOptions = (insertOptions, range, type, index, isEmptySelectio
28
28
  : range.startColumnIndex <= bandEnd &&
29
29
  range.endColumnIndex >= insertOptions.start;
30
30
  };
31
- export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgroundColor, selectionBorderColor, onSelectionMouseDown, onChangeActiveCell, onChangeSelections, onRequestEditTable, onRequestEditPivotTable, onMouseDownResizeHandle, onMouseDownChartSourceResizeHandle, onMouseDownMoveSelection, isDraggingMoveSelection, onFlashEnd, getSheetName, resizeHandleSize = 6, showSelectionResizeHandles, resizeHandleBorderColor, SelectionTitleComponent, isResizingTable, fillHandleSize, showFillHandle, enableMagicFill, MagicFillComponent, MagicFillContent, readonly, showPasteMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, insertOptions, onChooseInsertOption, tableAutoExpansion, canStopAutoExpandingTables = false, onChooseTableAutoExpansionOption, calculatedColumnFill, canStopAutoCalculatedColumns = false, onChooseCalculatedColumnOption, hoveredCell, onSplitTextToColumns, onRemoveQuickEdit, onAddQuickEdit, QuickEdit, PasteMenu, SuggestionAction, cachedHoveredSelectionIds, isFillShrink = false, }) => {
31
+ export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgroundColor, selectionBorderColor, selectionStrokeWidth, showActiveCellBorderInSelection, onSelectionMouseDown, onChangeActiveCell, onChangeSelections, onRequestEditTable, onRequestEditPivotTable, onMouseDownResizeHandle, onMouseDownChartSourceResizeHandle, onMouseDownMoveSelection, isDraggingMoveSelection, onFlashEnd, getSheetName, resizeHandleSize = 6, showSelectionResizeHandles, resizeHandleBorderColor, SelectionTitleComponent, isResizingTable, fillHandleSize, showFillHandle, enableMagicFill, MagicFillComponent, MagicFillContent, readonly, showPasteMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, insertOptions, onChooseInsertOption, tableAutoExpansion, canStopAutoExpandingTables = false, onChooseTableAutoExpansionOption, calculatedColumnFill, canStopAutoCalculatedColumns = false, onChooseCalculatedColumnOption, hoveredCell, onSplitTextToColumns, onRemoveQuickEdit, onAddQuickEdit, QuickEdit, PasteMenu, SuggestionAction, cachedHoveredSelectionIds, isFillShrink = false, }) => {
32
32
  const formulaMode = useFormulaModeValue();
33
33
  const selectionIndex = useFormulaSelectionIndex();
34
34
  const hoveredCellRef = useRef(hoveredCell);
@@ -71,7 +71,11 @@ export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgro
71
71
  : getSelectionStrokeStyle(formulaMode, isFill, isActiveCell, isEmptySelections);
72
72
  const strokeWidth = isBorder
73
73
  ? props.strokeWidth
74
- : getSelectionStrokeWidth(formulaMode, isFill, isActiveCell, isResizingTable);
74
+ : getSelectionStrokeWidth(formulaMode, isFill, isActiveCell, isResizingTable, {
75
+ selectionStrokeWidth,
76
+ showActiveCellBorderInSelection,
77
+ hasSelections: !isEmptySelections,
78
+ });
75
79
  const fillOpacity = isBorder
76
80
  ? props.fillOpacity
77
81
  : isFill && isFillShrink
@@ -179,6 +183,8 @@ export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgro
179
183
  selectionCount,
180
184
  selectionBackgroundColor,
181
185
  selectionBorderColor,
186
+ selectionStrokeWidth,
187
+ showActiveCellBorderInSelection,
182
188
  selectionIndex,
183
189
  isResizingTable,
184
190
  resizeHandleBorderColor,