@rowsncolumns/spreadsheet 10.3.0 → 10.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  2. package/dist/cjs/components/canvas-grid/index.js +14 -5
  3. package/dist/cjs/components/embeds/embed-draggable.d.ts.map +1 -1
  4. package/dist/cjs/components/embeds/embed-draggable.js +4 -3
  5. package/dist/cjs/components/resizer/index.d.ts.map +1 -1
  6. package/dist/cjs/components/resizer/index.js +10 -5
  7. package/dist/cjs/components/sheet-search/index.d.ts.map +1 -1
  8. package/dist/cjs/components/sheet-search/index.js +6 -2
  9. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  10. package/dist/cjs/hooks/use-copy-paste-cut.js +6 -3
  11. package/dist/cjs/hooks/use-header-actions.d.ts.map +1 -1
  12. package/dist/cjs/hooks/use-header-actions.js +17 -10
  13. package/dist/cjs/hooks/use-move-columns-rows.d.ts.map +1 -1
  14. package/dist/cjs/hooks/use-move-columns-rows.js +21 -15
  15. package/dist/cjs/hooks/use-selection-move.d.ts.map +1 -1
  16. package/dist/cjs/hooks/use-selection-move.js +14 -6
  17. package/dist/cjs/hooks/use-selection-resize.d.ts.map +1 -1
  18. package/dist/cjs/hooks/use-selection-resize.js +13 -6
  19. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  20. package/dist/cjs/hooks/use-selection.js +59 -25
  21. package/dist/cjs/hooks/use-table-resizer.d.ts.map +1 -1
  22. package/dist/cjs/hooks/use-table-resizer.js +16 -8
  23. package/dist/cjs/hooks/use-touch.d.ts.map +1 -1
  24. package/dist/cjs/hooks/use-touch.js +16 -8
  25. package/dist/cjs/release-date.js +1 -1
  26. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  27. package/dist/esm/components/canvas-grid/index.js +14 -5
  28. package/dist/esm/components/embeds/embed-draggable.d.ts.map +1 -1
  29. package/dist/esm/components/embeds/embed-draggable.js +3 -2
  30. package/dist/esm/components/resizer/index.d.ts.map +1 -1
  31. package/dist/esm/components/resizer/index.js +8 -4
  32. package/dist/esm/components/sheet-search/index.d.ts.map +1 -1
  33. package/dist/esm/components/sheet-search/index.js +5 -2
  34. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  35. package/dist/esm/hooks/use-copy-paste-cut.js +6 -4
  36. package/dist/esm/hooks/use-header-actions.d.ts.map +1 -1
  37. package/dist/esm/hooks/use-header-actions.js +11 -4
  38. package/dist/esm/hooks/use-move-columns-rows.d.ts.map +1 -1
  39. package/dist/esm/hooks/use-move-columns-rows.js +12 -6
  40. package/dist/esm/hooks/use-selection-move.d.ts.map +1 -1
  41. package/dist/esm/hooks/use-selection-move.js +11 -4
  42. package/dist/esm/hooks/use-selection-resize.d.ts.map +1 -1
  43. package/dist/esm/hooks/use-selection-resize.js +11 -5
  44. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  45. package/dist/esm/hooks/use-selection.js +50 -24
  46. package/dist/esm/hooks/use-table-resizer.d.ts.map +1 -1
  47. package/dist/esm/hooks/use-table-resizer.js +15 -9
  48. package/dist/esm/hooks/use-touch.d.ts.map +1 -1
  49. package/dist/esm/hooks/use-touch.js +15 -7
  50. package/dist/esm/release-date.js +1 -1
  51. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { Direction } from "@rowsncolumns/grid";
2
- import { MouseButtonCodes } from "@rowsncolumns/grid";
2
+ import { getOwnerDocument, MouseButtonCodes } from "@rowsncolumns/grid";
3
3
  import { getMinMaxArray, isNil, selectionBoundsFromCells, } from "@rowsncolumns/utils";
4
4
  import React, { useCallback, useMemo, useRef, useState } from "react";
5
5
  import { HeaderMoveDragComponent as DefaultHeaderMoveDragComponent, } from "../components/header-move";
@@ -14,6 +14,8 @@ export const useMoveColumnsAndRows = ({ getCellOffsetFromCoords, getCellCoordsFr
14
14
  const [offset, setOffset] = useState(0);
15
15
  const [dragOffset, setDragOffset] = useState(0);
16
16
  const gapRef = useRef(0);
17
+ /** Document the in-flight gesture listens on (the grid may live in a popout window) */
18
+ const gestureDocumentRef = useRef(null);
17
19
  const startCellRef = useRef(undefined);
18
20
  const startRef = useRef(0);
19
21
  const endRef = useRef(0);
@@ -83,8 +85,10 @@ export const useMoveColumnsAndRows = ({ getCellOffsetFromCoords, getCellCoordsFr
83
85
  */
84
86
  const handleMouseUp = useCallback((e) => {
85
87
  setIsDragging(false);
86
- document.removeEventListener("mousemove", handleMouseMove);
87
- document.removeEventListener("mouseup", handleMouseUp);
88
+ const ownerDocument = gestureDocumentRef.current ?? document;
89
+ gestureDocumentRef.current = null;
90
+ ownerDocument.removeEventListener("mousemove", handleMouseMove);
91
+ ownerDocument.removeEventListener("mouseup", handleMouseUp);
88
92
  const dimensions = dragDimensions.current;
89
93
  if (!dragAxis.current || !dimensions) {
90
94
  return;
@@ -226,10 +230,12 @@ export const useMoveColumnsAndRows = ({ getCellOffsetFromCoords, getCellCoordsFr
226
230
  setOffset(offset);
227
231
  setDragOffset(dragOffset);
228
232
  /**
229
- * Add mousemove and up listeners
233
+ * Add mousemove and up listeners on the document the gesture started on
230
234
  */
231
- document.addEventListener("mousemove", handleMouseMove);
232
- document.addEventListener("mouseup", handleMouseUp);
235
+ const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
236
+ gestureDocumentRef.current = ownerDocument;
237
+ ownerDocument.addEventListener("mousemove", handleMouseMove);
238
+ ownerDocument.addEventListener("mouseup", handleMouseUp);
233
239
  }, [
234
240
  columns,
235
241
  rows,
@@ -1 +1 @@
1
- {"version":3,"file":"use-selection-move.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection-move.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EAEb,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAGhF,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACxD;;;;;OAKG;IACH,uBAAuB,CACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAClC,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC;;;;OAIG;IACH,YAAY,CACV,IAAI,EAAE,qBAAqB,EAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GACxB,IAAI,GAAG,SAAS,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,uDAI9B,qBAAqB;kCA2HhB,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC;;CAyCzC,CAAC"}
1
+ {"version":3,"file":"use-selection-move.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection-move.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EAEb,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAGhF,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACxD;;;;;OAKG;IACH,uBAAuB,CACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAClC,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC;;;;OAIG;IACH,YAAY,CACV,IAAI,EAAE,qBAAqB,EAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GACxB,IAAI,GAAG,SAAS,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,uDAI9B,qBAAqB;kCA+HhB,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC;;CA2CzC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import isNil from "lodash/isNil";
2
+ import { getOwnerDocument } from "@rowsncolumns/grid";
2
3
  import { useCallback, useRef, useState } from "react";
3
4
  import { useActiveEditor, useEditingCellCoordinate, useGetAddressFromSelection, useGetSelectionsFromFormula, } from "../atoms";
4
5
  import { detokenize } from "./use-selection-resize";
@@ -12,6 +13,8 @@ export const useSelectionMove = ({ tokenizer, getCellCoordsFromOffset, scrollToC
12
13
  const selectionIndexRef = useRef(undefined);
13
14
  const isDraggingRef = useRef(false);
14
15
  const startCell = useRef(undefined);
16
+ /** Document the in-flight gesture listens on (the grid may live in a popout window) */
17
+ const gestureDocumentRef = useRef(null);
15
18
  const initialRange = useRef(undefined);
16
19
  const activeEditor = useActiveEditor();
17
20
  const getSelectionToAddress = useGetAddressFromSelection();
@@ -95,8 +98,10 @@ export const useSelectionMove = ({ tokenizer, getCellCoordsFromOffset, scrollToC
95
98
  startCell.current = undefined;
96
99
  initialRange.current = undefined;
97
100
  setIsDragging(false);
98
- document.removeEventListener("pointermove", onMouseMove);
99
- document.removeEventListener("pointerup", onMouseUp);
101
+ const ownerDocument = gestureDocumentRef.current ?? document;
102
+ gestureDocumentRef.current = null;
103
+ ownerDocument.removeEventListener("pointermove", onMouseMove);
104
+ ownerDocument.removeEventListener("pointerup", onMouseUp);
100
105
  }, [activeEditor, onMouseMove]);
101
106
  // Mousedown
102
107
  const onMouseDownMoveSelection = useCallback((e) => {
@@ -126,8 +131,10 @@ export const useSelectionMove = ({ tokenizer, getCellCoordsFromOffset, scrollToC
126
131
  // jsdom / older browsers without pointer capture
127
132
  }
128
133
  setIsDragging(true);
129
- document.addEventListener("pointermove", onMouseMove);
130
- document.addEventListener("pointerup", onMouseUp);
134
+ const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
135
+ gestureDocumentRef.current = ownerDocument;
136
+ ownerDocument.addEventListener("pointermove", onMouseMove);
137
+ ownerDocument.addEventListener("pointerup", onMouseUp);
131
138
  }
132
139
  // Focus
133
140
  activeEditor?.focus();
@@ -1 +1 @@
1
- {"version":3,"file":"use-selection-resize.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection-resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,SAAS,EACT,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAIhF,KAAK,uBAAuB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACxD;;;;;OAKG;IACH,uBAAuB,CACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAClC,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAC9C;;;;OAIG;IACH,YAAY,CACV,IAAI,EAAE,qBAAqB,EAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GACxB,IAAI,GAAG,SAAS,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,WAAW,EAAE,WAU/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,wFAMhC,uBAAuB,SA+HlB,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,SAiDzC,CAAC"}
1
+ {"version":3,"file":"use-selection-resize.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection-resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,SAAS,EACT,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAIhF,KAAK,uBAAuB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACxD;;;;;OAKG;IACH,uBAAuB,CACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAClC,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAC9C;;;;OAIG;IACH,YAAY,CACV,IAAI,EAAE,qBAAqB,EAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GACxB,IAAI,GAAG,SAAS,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,WAAW,EAAE,WAU/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,wFAMhC,uBAAuB,SAmIlB,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,SAmDzC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { cellRangeToBounds } from "@rowsncolumns/grid";
1
+ import { cellRangeToBounds, getOwnerDocument } from "@rowsncolumns/grid";
2
2
  import isNil from "lodash/isNil";
3
3
  import { useCallback, useRef } from "react";
4
4
  import { useActiveEditor, useEditingCellCoordinate, useGetAddressFromSelection, useGetSelectionsFromFormula, } from "../atoms";
@@ -22,6 +22,8 @@ export const useSelectionResize = ({ resizeHandleSize = 6, tokenizer, getCellCoo
22
22
  const selectionIndexRef = useRef(undefined);
23
23
  const isDraggingRef = useRef(false);
24
24
  const anchorCell = useRef(undefined);
25
+ /** Document the in-flight gesture listens on (the grid may live in a popout window) */
26
+ const gestureDocumentRef = useRef(null);
25
27
  const activeEditor = useActiveEditor();
26
28
  const getSelectionToAddress = useGetAddressFromSelection();
27
29
  const getSelectionsFromFormula = useGetSelectionsFromFormula();
@@ -115,8 +117,10 @@ export const useSelectionResize = ({ resizeHandleSize = 6, tokenizer, getCellCoo
115
117
  activeEditor?.focus();
116
118
  isDraggingRef.current = false;
117
119
  anchorCell.current = undefined;
118
- document.removeEventListener("pointermove", onMouseMove);
119
- document.removeEventListener("pointerup", onMouseUp);
120
+ const ownerDocument = gestureDocumentRef.current ?? document;
121
+ gestureDocumentRef.current = null;
122
+ ownerDocument.removeEventListener("pointermove", onMouseMove);
123
+ ownerDocument.removeEventListener("pointerup", onMouseUp);
120
124
  }, [activeEditor, onMouseMove]);
121
125
  // Mousedown
122
126
  const onMouseDownResizeHandle = useCallback((e) => {
@@ -144,8 +148,10 @@ export const useSelectionResize = ({ resizeHandleSize = 6, tokenizer, getCellCoo
144
148
  catch {
145
149
  // jsdom / older browsers without pointer capture
146
150
  }
147
- document.addEventListener("pointermove", onMouseMove);
148
- document.addEventListener("pointerup", onMouseUp);
151
+ const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
152
+ gestureDocumentRef.current = ownerDocument;
153
+ ownerDocument.addEventListener("pointermove", onMouseMove);
154
+ ownerDocument.addEventListener("pointerup", onMouseUp);
149
155
  }
150
156
  // Focus
151
157
  activeEditor?.focus();
@@ -1 +1 @@
1
- {"version":3,"file":"use-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { findLastContentfulCell, isNull } from "@rowsncolumns/grid";
2
2
  import { cellToArea } from "@rowsncolumns/grid";
3
- import { useIsomorphicLayoutEffect } from "@rowsncolumns/grid";
3
+ import { getOwnerDocument, useIsomorphicLayoutEffect } from "@rowsncolumns/grid";
4
4
  import { Align, cellIdentifier, cellRangeToBounds, clampCellCoords, clampIndex, Direction, findNextCellInDataRegion, findNextCellWithinBounds, getBoundedCells, isAreasEqual, isEqualCells, MouseButtonCodes, newSelectionFromDrag, selectionSpansCells, } from "@rowsncolumns/grid";
5
5
  import { useCallback, useReducer, useRef, useState } from "react";
6
6
  import { scheduleImmediatePriorityCallback, scheduleNormalPriorityCallback, } from "../api/scheduler";
@@ -105,24 +105,35 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
105
105
  * release always fires `contextmenu`; neither may reach the grid's cell
106
106
  * context menu while the user is dragging the fill handle.
107
107
  */
108
+ /**
109
+ * Documents the in-flight gestures listen on. The grid may render into a
110
+ * popout window, whose document is not the bundle's global `document`; a
111
+ * gesture binds its move/up listeners to the document of the element it
112
+ * started on and unbinds from that same document.
113
+ */
114
+ const selectionDocumentRef = useRef(null);
115
+ const fillDocumentRef = useRef(null);
116
+ const dragSelectionDocumentRef = useRef(null);
117
+ const tapDocumentRef = useRef(null);
108
118
  const contextMenuSuppressorRef = useRef(null);
109
119
  const releaseContextMenuSuppressor = useCallback(() => {
110
- const handler = contextMenuSuppressorRef.current;
111
- if (!handler)
120
+ const suppressor = contextMenuSuppressorRef.current;
121
+ if (!suppressor)
112
122
  return;
113
123
  contextMenuSuppressorRef.current = null;
114
- document.removeEventListener("contextmenu", handler, true);
124
+ suppressor.ownerDocument.removeEventListener("contextmenu", suppressor.handler, true);
115
125
  }, []);
116
126
  const suppressNextContextMenu = useCallback(() => {
117
127
  if (contextMenuSuppressorRef.current)
118
128
  return;
129
+ const ownerDocument = fillDocumentRef.current ?? document;
119
130
  const handler = (e) => {
120
131
  e.preventDefault();
121
132
  e.stopPropagation();
122
133
  releaseContextMenuSuppressor();
123
134
  };
124
- contextMenuSuppressorRef.current = handler;
125
- document.addEventListener("contextmenu", handler, true);
135
+ contextMenuSuppressorRef.current = { handler, ownerDocument };
136
+ ownerDocument.addEventListener("contextmenu", handler, true);
126
137
  }, [releaseContextMenuSuppressor]);
127
138
  const selectionsRef = useRef([]);
128
139
  const fillSelectionRef = useRef(undefined);
@@ -349,9 +360,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
349
360
  const handleMouseUp = useCallback(() => {
350
361
  /* Reset selection mode */
351
362
  isSelecting.current = false;
352
- /* Remove listener */
353
- document.removeEventListener("mousemove", handleMouseMove);
354
- document.removeEventListener("mouseup", handleMouseUp);
363
+ /* Remove listener from the document the gesture started on */
364
+ const ownerDocument = selectionDocumentRef.current ?? document;
365
+ selectionDocumentRef.current = null;
366
+ ownerDocument.removeEventListener("mousemove", handleMouseMove);
367
+ ownerDocument.removeEventListener("mouseup", handleMouseUp);
355
368
  /* Update last selection */
356
369
  const curSelections = selectionsRef.current;
357
370
  const len = curSelections.length;
@@ -881,8 +894,10 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
881
894
  const hasSelections = selectionsRef.current.length > 0;
882
895
  const isDeselecting = isMetaKey && allowDeselect;
883
896
  if (!isContextMenuClick && selectionPolicy !== "single") {
884
- document.addEventListener("mouseup", handleMouseUp);
885
- document.addEventListener("mousemove", handleMouseMove);
897
+ const ownerDocument = getOwnerDocument(e.currentTarget ?? e.target) ?? document;
898
+ selectionDocumentRef.current = ownerDocument;
899
+ ownerDocument.addEventListener("mouseup", handleMouseUp);
900
+ ownerDocument.addEventListener("mousemove", handleMouseMove);
886
901
  }
887
902
  /* Activate selection mode */
888
903
  // Disable flag for context menu
@@ -1245,9 +1260,10 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1245
1260
  isFilling.current = false;
1246
1261
  const toggle = isFillToggleModifier(e);
1247
1262
  const button = fillButtonRef.current;
1248
- /* Remove listener */
1249
- document.removeEventListener("mousemove", handleFillMouseMove);
1250
- document.removeEventListener("mouseup", handleFillMouseUp);
1263
+ /* Remove listener from the document the gesture started on */
1264
+ const ownerDocument = fillDocumentRef.current ?? document;
1265
+ ownerDocument.removeEventListener("mousemove", handleFillMouseMove);
1266
+ ownerDocument.removeEventListener("mouseup", handleFillMouseUp);
1251
1267
  // The right-button (or macOS Ctrl+click) `contextmenu` event follows this
1252
1268
  // mouseup; keep swallowing it for one tick, then drop the suppressor so a
1253
1269
  // later, unrelated right-click still opens the cell context menu.
@@ -1341,6 +1357,8 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1341
1357
  const handleFillMouseDown = useCallback((e) => {
1342
1358
  e.stopPropagation();
1343
1359
  e.preventDefault();
1360
+ const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
1361
+ fillDocumentRef.current = ownerDocument;
1344
1362
  const isRightButton = e.button === MouseButtonCodes.right;
1345
1363
  fillButtonRef.current = isRightButton ? "right" : "left";
1346
1364
  // Ctrl+drag on the handle must never become the macOS Ctrl+click
@@ -1350,8 +1368,8 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1350
1368
  suppressNextContextMenu();
1351
1369
  }
1352
1370
  isFilling.current = true;
1353
- document.addEventListener("mousemove", handleFillMouseMove);
1354
- document.addEventListener("mouseup", handleFillMouseUp);
1371
+ ownerDocument.addEventListener("mousemove", handleFillMouseMove);
1372
+ ownerDocument.addEventListener("mouseup", handleFillMouseUp);
1355
1373
  }, [handleFillMouseMove, handleFillMouseUp, suppressNextContextMenu]);
1356
1374
  /**
1357
1375
  * Remove the last selection from state
@@ -1478,9 +1496,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1478
1496
  draggedSelection.current = void 0;
1479
1497
  draggedSelectionIndex.current = void 0;
1480
1498
  hasUserMovedSelection.current = false;
1481
- /* Remove event handlers */
1482
- document.removeEventListener("mouseup", handleSelectionMouseUp);
1483
- document.removeEventListener("mousemove", handleSelectionMouseMove);
1499
+ /* Remove event handlers from the document the gesture started on */
1500
+ const ownerDocument = dragSelectionDocumentRef.current ?? document;
1501
+ dragSelectionDocumentRef.current = null;
1502
+ ownerDocument.removeEventListener("mouseup", handleSelectionMouseUp);
1503
+ ownerDocument.removeEventListener("mousemove", handleSelectionMouseMove);
1484
1504
  /* Force render */
1485
1505
  forceRender();
1486
1506
  }, [
@@ -1528,9 +1548,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1528
1548
  }
1529
1549
  /* Set dragging flag */
1530
1550
  isDragging.current = true;
1531
- /* Listen to mousemove and mousedown events */
1532
- document.addEventListener("mouseup", handleSelectionMouseUp);
1533
- document.addEventListener("mousemove", handleSelectionMouseMove);
1551
+ /* Listen on the document the gesture started on */
1552
+ const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
1553
+ dragSelectionDocumentRef.current = ownerDocument;
1554
+ ownerDocument.addEventListener("mouseup", handleSelectionMouseUp);
1555
+ ownerDocument.addEventListener("mousemove", handleSelectionMouseMove);
1534
1556
  /* Force a re-render */
1535
1557
  forceRender();
1536
1558
  }, [
@@ -1619,12 +1641,16 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1619
1641
  handleMouseDown(event);
1620
1642
  handleMouseUp();
1621
1643
  }
1622
- document.removeEventListener("pointerup", onPointerUp);
1644
+ const ownerDocument = tapDocumentRef.current ?? document;
1645
+ tapDocumentRef.current = null;
1646
+ ownerDocument.removeEventListener("pointerup", onPointerUp);
1623
1647
  }, [handleMouseDown, handleMouseUp]);
1624
1648
  const onPointerDown = useCallback((event) => {
1625
1649
  startTimeRef.current = Date.now();
1626
1650
  startPosRef.current = { x: event.clientX, y: event.clientY };
1627
- document.addEventListener("pointerup", onPointerUp);
1651
+ const ownerDocument = getOwnerDocument(event.currentTarget) ?? document;
1652
+ tapDocumentRef.current = ownerDocument;
1653
+ ownerDocument.addEventListener("pointerup", onPointerUp);
1628
1654
  }, [onPointerUp]);
1629
1655
  // Add a ref. makeEditable renders way too often
1630
1656
  const handleKeyDownRef = useCallbackRef(handleKeyDown);
@@ -1 +1 @@
1
- {"version":3,"file":"use-table-resizer.d.ts","sourceRoot":"","sources":["../../../hooks/use-table-resizer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,KAAK,oBAAoB,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAClE,eAAe,EAAE,CACf,MAAM,EAAE,aAAa,EACrB,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,KAChC,IAAI,CAAC;IACV,eAAe,IAAI,IAAI,CAAC;IACxB,uBAAuB,EAAE,CACvB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,aAAa,CAAC,EAAE,OAAO,KACpB,aAAa,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACjD,YAAY,EAAE,CACZ,IAAI,EAAE,qBAAqB,EAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,KACtB,IAAI,GAAG,SAAS,CAAC;IACtB,UAAU,IAAI,IAAI,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,+IAW7B,oBAAoB;;;CAyHtB,CAAC;AAYF,eAAO,MAAM,kBAAkB,wKAa7B,CAAC"}
1
+ {"version":3,"file":"use-table-resizer.d.ts","sourceRoot":"","sources":["../../../hooks/use-table-resizer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,KAAK,oBAAoB,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAClE,eAAe,EAAE,CACf,MAAM,EAAE,aAAa,EACrB,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,KAChC,IAAI,CAAC;IACV,eAAe,IAAI,IAAI,CAAC;IACxB,uBAAuB,EAAE,CACvB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,aAAa,CAAC,EAAE,OAAO,KACpB,aAAa,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACjD,YAAY,EAAE,CACZ,IAAI,EAAE,qBAAqB,EAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,KACtB,IAAI,GAAG,SAAS,CAAC;IACtB,UAAU,IAAI,IAAI,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,+IAW7B,oBAAoB;;;CA+HtB,CAAC;AAYF,eAAO,MAAM,kBAAkB,wKAa7B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { useGridContext } from "@rowsncolumns/grid";
1
+ import { getOwnerDocument, useGridContext } from "@rowsncolumns/grid";
2
2
  import { Button, cn } from "@rowsncolumns/ui";
3
3
  import { isNil } from "@rowsncolumns/utils";
4
4
  import React, { useCallback, useMemo, useRef, useState } from "react";
@@ -37,9 +37,11 @@ export const useTableResizer = ({ sheetId, tables, theme, newSelection, modifySe
37
37
  }
38
38
  // Switch focus to sheet
39
39
  focusSheet();
40
- // Unbind
41
- document.removeEventListener("pointermove", onMouseMove);
42
- document.removeEventListener("pointerup", onMouseUp);
40
+ // Unbind from the document the gesture started on
41
+ const ownerDocument = gestureDocumentRef.current ?? document;
42
+ gestureDocumentRef.current = null;
43
+ ownerDocument.removeEventListener("pointermove", onMouseMove);
44
+ ownerDocument.removeEventListener("pointerup", onMouseUp);
43
45
  }, [
44
46
  onMouseMove,
45
47
  onResizeTable,
@@ -48,7 +50,9 @@ export const useTableResizer = ({ sheetId, tables, theme, newSelection, modifySe
48
50
  getCellCoordsFromOffset,
49
51
  sheetId,
50
52
  ]);
51
- const onMouseDown = useCallback((table) => {
53
+ /** Document the in-flight gesture listens on (the grid may live in a popout window) */
54
+ const gestureDocumentRef = useRef(null);
55
+ const onMouseDown = useCallback((table, e) => {
52
56
  const { range } = table;
53
57
  // Create a new selection
54
58
  const start = {
@@ -67,9 +71,11 @@ export const useTableResizer = ({ sheetId, tables, theme, newSelection, modifySe
67
71
  modifySelection(end);
68
72
  // Setter
69
73
  setIsResizingTable(true);
70
- // Bind
71
- document.addEventListener("pointermove", onMouseMove);
72
- document.addEventListener("pointerup", onMouseUp);
74
+ // Bind on the document the gesture started on
75
+ const ownerDocument = getOwnerDocument(e?.currentTarget) ?? document;
76
+ gestureDocumentRef.current = ownerDocument;
77
+ ownerDocument.addEventListener("pointermove", onMouseMove);
78
+ ownerDocument.addEventListener("pointerup", onMouseUp);
73
79
  }, [newSelection, modifySelection, onMouseMove, onMouseUp]);
74
80
  // Resizer components
75
81
  const tableResizers = useMemo(() => {
@@ -81,7 +87,7 @@ export const useTableResizer = ({ sheetId, tables, theme, newSelection, modifySe
81
87
  rowIndex: range.endRowIndex,
82
88
  columnIndex: range.endColumnIndex,
83
89
  };
84
- return (React.createElement(TableResizer, { key: table.id, cornerCell: cornerCell, onPointerDown: () => onMouseDown(table), backgroundColor: theme.themeColors.accent1 }));
90
+ return (React.createElement(TableResizer, { key: table.id, cornerCell: cornerCell, onPointerDown: (e) => onMouseDown(table, e), backgroundColor: theme.themeColors.accent1 }));
85
91
  });
86
92
  }, [tables, sheetId, theme, onMouseDown]);
87
93
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"use-touch.d.ts","sourceRoot":"","sources":["../../../hooks/use-touch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUvE,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAoCF,eAAO,MAAM,QAAQ,GAAI,yDAMtB,aAAa;0BAsKJ,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;iCA1J/B,cAAc,KAAK,IAAI;qDA6CJ,YAAY;sCAQ3B,MAAM,GAAG,SAAS,aAAa,MAAM,GAAG,SAAS;CAqMjE,CAAC"}
1
+ {"version":3,"file":"use-touch.d.ts","sourceRoot":"","sources":["../../../hooks/use-touch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUvE,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAoCF,eAAO,MAAM,QAAQ,GAAI,yDAMtB,aAAa;0BA0KJ,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;iCA5J/B,cAAc,KAAK,IAAI;qDA6CJ,YAAY;sCAQ3B,MAAM,GAAG,SAAS,aAAa,MAAM,GAAG,SAAS;CA2MjE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { useIsomorphicLayoutEffect } from "@rowsncolumns/grid";
2
- import { throttle } from "@rowsncolumns/grid";
2
+ import { getOwnerDocument, throttle } from "@rowsncolumns/grid";
3
3
  import { canUseDOM, isFocusable } from "@rowsncolumns/utils";
4
4
  import { isNil } from "@rowsncolumns/utils";
5
5
  import { useCallback, useRef } from "react";
@@ -26,6 +26,8 @@ const getTouchCenter = (touches) => {
26
26
  export const useTouch = ({ scrollTo, scale = 1, onChangeScale, minScale = 0.25, maxScale = 4, }) => {
27
27
  const scrollerRef = useRef(null);
28
28
  const isImmediateRef = useRef(false);
29
+ /** Document the in-flight gesture listens on (the grid may live in a popout window) */
30
+ const gestureDocumentRef = useRef(null);
29
31
  const scaleRef = useRef(scale);
30
32
  const prevScaleRef = useRef(scale);
31
33
  const pinchStartDistanceRef = useRef(null);
@@ -151,9 +153,11 @@ export const useTouch = ({ scrollTo, scale = 1, onChangeScale, minScale = 0.25,
151
153
  pinchActivatedRef.current = false;
152
154
  pinchCenterRef.current = null;
153
155
  // Remove listeners
154
- document.removeEventListener("touchmove", onTouchMove, false);
155
- document.removeEventListener("touchend", onTouchEnd, false);
156
- document.removeEventListener("touchcancel", onTouchEnd, false);
156
+ const ownerDocument = gestureDocumentRef.current ?? document;
157
+ gestureDocumentRef.current = null;
158
+ ownerDocument.removeEventListener("touchmove", onTouchMove, false);
159
+ ownerDocument.removeEventListener("touchend", onTouchEnd, false);
160
+ ownerDocument.removeEventListener("touchcancel", onTouchEnd, false);
157
161
  }, [getScroller, onTouchMove]);
158
162
  // Touch start
159
163
  const onTouchStart = useCallback((event) => {
@@ -179,9 +183,13 @@ export const useTouch = ({ scrollTo, scale = 1, onChangeScale, minScale = 0.25,
179
183
  scaleRef.current;
180
184
  getScroller()?.doTouchStart(event.touches, event.timeStamp);
181
185
  // event.preventDefault();
182
- document.addEventListener("touchmove", onTouchMove, { passive: false });
183
- document.addEventListener("touchend", onTouchEnd, false);
184
- document.addEventListener("touchcancel", onTouchEnd, false);
186
+ const ownerDocument = getOwnerDocument(event.currentTarget) ?? document;
187
+ gestureDocumentRef.current = ownerDocument;
188
+ ownerDocument.addEventListener("touchmove", onTouchMove, {
189
+ passive: false,
190
+ });
191
+ ownerDocument.addEventListener("touchend", onTouchEnd, false);
192
+ ownerDocument.addEventListener("touchcancel", onTouchEnd, false);
185
193
  }, [getScroller, onTouchMove, onTouchEnd]);
186
194
  // Callback when grid dimensions change
187
195
  const onDimensionsChange = useCallback(({ containerWidth, containerHeight, estimatedTotalWidth, estimatedTotalHeight, }) => {
@@ -1,3 +1,3 @@
1
1
  export const releaseDate =
2
2
  // @ts-ignore
3
- new Date("2026-09-17") ?? new Date("2025-06-18");
3
+ new Date("2026-09-22") ?? new Date("2025-06-18");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rowsncolumns/spreadsheet",
3
- "version": "10.3.0",
3
+ "version": "10.3.1",
4
4
  "author": "Vinay M",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "main": "./dist/cjs/index.js",