@rowsncolumns/spreadsheet 10.3.0 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/dist/cjs/api/banded-ranges.d.ts.map +1 -1
  2. package/dist/cjs/api/banded-ranges.js +40 -14
  3. package/dist/cjs/api/calculated-column-fill.d.ts +43 -0
  4. package/dist/cjs/api/calculated-column-fill.d.ts.map +1 -0
  5. package/dist/cjs/api/calculated-column-fill.js +16 -0
  6. package/dist/cjs/api/chart-sheet.d.ts +8 -0
  7. package/dist/cjs/api/chart-sheet.d.ts.map +1 -0
  8. package/dist/cjs/api/chart-sheet.js +20 -0
  9. package/dist/cjs/api/chart-source-ranges.d.ts +64 -0
  10. package/dist/cjs/api/chart-source-ranges.d.ts.map +1 -0
  11. package/dist/cjs/api/chart-source-ranges.js +175 -0
  12. package/dist/cjs/api/selections.d.ts +3 -3
  13. package/dist/cjs/api/selections.d.ts.map +1 -1
  14. package/dist/cjs/api/selections.js +28 -2
  15. package/dist/cjs/api/spreadsheet-api.d.ts +16 -3
  16. package/dist/cjs/api/spreadsheet-api.d.ts.map +1 -1
  17. package/dist/cjs/api/spreadsheet-api.js +22 -2
  18. package/dist/cjs/api/table-auto-expansion.d.ts +37 -0
  19. package/dist/cjs/api/table-auto-expansion.d.ts.map +1 -0
  20. package/dist/cjs/api/table-auto-expansion.js +16 -0
  21. package/dist/cjs/api/table.d.ts +49 -1
  22. package/dist/cjs/api/table.d.ts.map +1 -1
  23. package/dist/cjs/api/table.js +145 -1
  24. package/dist/cjs/api/validation.d.ts +26 -1
  25. package/dist/cjs/api/validation.d.ts.map +1 -1
  26. package/dist/cjs/api/validation.js +127 -9
  27. package/dist/cjs/atoms/calculated-column-fill.atom.d.ts +15 -0
  28. package/dist/cjs/atoms/calculated-column-fill.atom.d.ts.map +1 -0
  29. package/dist/cjs/atoms/calculated-column-fill.atom.js +18 -0
  30. package/dist/cjs/atoms/chart-actions.atom.d.ts +40 -0
  31. package/dist/cjs/atoms/chart-actions.atom.d.ts.map +1 -0
  32. package/dist/cjs/atoms/chart-actions.atom.js +66 -0
  33. package/dist/cjs/atoms/index.d.ts +5 -0
  34. package/dist/cjs/atoms/index.d.ts.map +1 -1
  35. package/dist/cjs/atoms/index.js +5 -0
  36. package/dist/cjs/atoms/move-chart-dialog.atom.d.ts +28 -0
  37. package/dist/cjs/atoms/move-chart-dialog.atom.d.ts.map +1 -0
  38. package/dist/cjs/atoms/move-chart-dialog.atom.js +34 -0
  39. package/dist/cjs/atoms/selected-chart-embed.atom.d.ts +9 -1
  40. package/dist/cjs/atoms/selected-chart-embed.atom.d.ts.map +1 -1
  41. package/dist/cjs/atoms/selected-chart-embed.atom.js +18 -1
  42. package/dist/cjs/atoms/selected-chart-series.atom.d.ts +24 -0
  43. package/dist/cjs/atoms/selected-chart-series.atom.d.ts.map +1 -0
  44. package/dist/cjs/atoms/selected-chart-series.atom.js +11 -0
  45. package/dist/cjs/atoms/sheet-context.atom.d.ts +2 -0
  46. package/dist/cjs/atoms/sheet-context.atom.d.ts.map +1 -1
  47. package/dist/cjs/atoms/sheet-context.atom.js +5 -2
  48. package/dist/cjs/atoms/sparkline-dialog.atom.d.ts +34 -0
  49. package/dist/cjs/atoms/sparkline-dialog.atom.d.ts.map +1 -0
  50. package/dist/cjs/atoms/sparkline-dialog.atom.js +30 -0
  51. package/dist/cjs/atoms/table-auto-expansion.atom.d.ts +14 -0
  52. package/dist/cjs/atoms/table-auto-expansion.atom.d.ts.map +1 -0
  53. package/dist/cjs/atoms/table-auto-expansion.atom.js +17 -0
  54. package/dist/cjs/components/calculated-column-smart-tag/index.d.ts +25 -0
  55. package/dist/cjs/components/calculated-column-smart-tag/index.d.ts.map +1 -0
  56. package/dist/cjs/components/calculated-column-smart-tag/index.js +31 -0
  57. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  58. package/dist/cjs/components/canvas-grid/index.js +407 -77
  59. package/dist/cjs/components/canvas-grid/typings.d.ts +127 -14
  60. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  61. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  62. package/dist/cjs/components/cell/index.js +3 -3
  63. package/dist/cjs/components/cell/typings.d.ts +13 -0
  64. package/dist/cjs/components/cell/typings.d.ts.map +1 -1
  65. package/dist/cjs/components/cell-filter/index.d.ts.map +1 -1
  66. package/dist/cjs/components/cell-filter/index.js +13 -2
  67. package/dist/cjs/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  68. package/dist/cjs/components/cell-input/formula-bar-cell-input.js +4 -1
  69. package/dist/cjs/components/cell-structured/sparkline-math.d.ts +28 -5
  70. package/dist/cjs/components/cell-structured/sparkline-math.d.ts.map +1 -1
  71. package/dist/cjs/components/cell-structured/sparkline-math.js +93 -5
  72. package/dist/cjs/components/cell-structured/sparkline.d.ts +1 -1
  73. package/dist/cjs/components/cell-structured/sparkline.d.ts.map +1 -1
  74. package/dist/cjs/components/cell-structured/sparkline.js +3 -3
  75. package/dist/cjs/components/cell-structured/types.d.ts +1 -1
  76. package/dist/cjs/components/cell-structured/types.d.ts.map +1 -1
  77. package/dist/cjs/components/chart-sheet-view/index.d.ts +27 -0
  78. package/dist/cjs/components/chart-sheet-view/index.d.ts.map +1 -0
  79. package/dist/cjs/components/chart-sheet-view/index.js +35 -0
  80. package/dist/cjs/components/context-menu/embed-context-menu.d.ts +48 -0
  81. package/dist/cjs/components/context-menu/embed-context-menu.d.ts.map +1 -0
  82. package/dist/cjs/components/context-menu/embed-context-menu.js +123 -0
  83. package/dist/cjs/components/context-menu/index.d.ts +23 -2
  84. package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
  85. package/dist/cjs/components/context-menu/index.js +217 -39
  86. package/dist/cjs/components/context-menu/total-row-function-menu.d.ts +33 -0
  87. package/dist/cjs/components/context-menu/total-row-function-menu.d.ts.map +1 -0
  88. package/dist/cjs/components/context-menu/total-row-function-menu.js +58 -0
  89. package/dist/cjs/components/context-menu/total-row-functions.d.ts +12 -12
  90. package/dist/cjs/components/context-menu/total-row-functions.d.ts.map +1 -1
  91. package/dist/cjs/components/context-menu/total-row-functions.js +39 -39
  92. package/dist/cjs/components/embeds/chart-component.d.ts +17 -0
  93. package/dist/cjs/components/embeds/chart-component.d.ts.map +1 -1
  94. package/dist/cjs/components/embeds/embed-draggable.d.ts +61 -4
  95. package/dist/cjs/components/embeds/embed-draggable.d.ts.map +1 -1
  96. package/dist/cjs/components/embeds/embed-draggable.js +218 -42
  97. package/dist/cjs/components/filter-box/date-tree.d.ts +28 -0
  98. package/dist/cjs/components/filter-box/date-tree.d.ts.map +1 -0
  99. package/dist/cjs/components/filter-box/date-tree.js +147 -0
  100. package/dist/cjs/components/filter-box/filter-by-condition.d.ts +14 -2
  101. package/dist/cjs/components/filter-box/filter-by-condition.d.ts.map +1 -1
  102. package/dist/cjs/components/filter-box/filter-by-condition.js +95 -19
  103. package/dist/cjs/components/filter-box/filter-by-value.d.ts.map +1 -1
  104. package/dist/cjs/components/filter-box/filter-by-value.js +126 -40
  105. package/dist/cjs/components/filter-box/index.d.ts +7 -1
  106. package/dist/cjs/components/filter-box/index.d.ts.map +1 -1
  107. package/dist/cjs/components/filter-box/index.js +102 -11
  108. package/dist/cjs/components/move-chart-dialog/index.d.ts +34 -0
  109. package/dist/cjs/components/move-chart-dialog/index.d.ts.map +1 -0
  110. package/dist/cjs/components/move-chart-dialog/index.js +96 -0
  111. package/dist/cjs/components/print-preview/page-block.d.ts +9 -1
  112. package/dist/cjs/components/print-preview/page-block.d.ts.map +1 -1
  113. package/dist/cjs/components/print-preview/page-block.js +28 -2
  114. package/dist/cjs/components/print-preview/print-preview-dialog.d.ts +8 -1
  115. package/dist/cjs/components/print-preview/print-preview-dialog.d.ts.map +1 -1
  116. package/dist/cjs/components/print-preview/print-preview-dialog.js +144 -3
  117. package/dist/cjs/components/print-preview/run-print.d.ts.map +1 -1
  118. package/dist/cjs/components/print-preview/run-print.js +19 -7
  119. package/dist/cjs/components/print-preview/use-page-layout.d.ts +47 -0
  120. package/dist/cjs/components/print-preview/use-page-layout.d.ts.map +1 -1
  121. package/dist/cjs/components/print-preview/use-page-layout.js +81 -7
  122. package/dist/cjs/components/resizer/index.d.ts.map +1 -1
  123. package/dist/cjs/components/resizer/index.js +10 -5
  124. package/dist/cjs/components/selection/index.d.ts +1 -1
  125. package/dist/cjs/components/selection/index.d.ts.map +1 -1
  126. package/dist/cjs/components/selection/index.js +6 -2
  127. package/dist/cjs/components/selection/types.d.ts +15 -0
  128. package/dist/cjs/components/selection/types.d.ts.map +1 -1
  129. package/dist/cjs/components/sheet-search/index.d.ts.map +1 -1
  130. package/dist/cjs/components/sheet-search/index.js +6 -2
  131. package/dist/cjs/components/sheet-tabs/index.d.ts.map +1 -1
  132. package/dist/cjs/components/sheet-tabs/index.js +2 -2
  133. package/dist/cjs/components/sheet-tabs/sheet-tab.d.ts +1 -1
  134. package/dist/cjs/components/sheet-tabs/sheet-tab.d.ts.map +1 -1
  135. package/dist/cjs/components/sheet-tabs/sheet-tab.js +3 -1
  136. package/dist/cjs/components/sparkline-dialog/index.d.ts +43 -0
  137. package/dist/cjs/components/sparkline-dialog/index.d.ts.map +1 -0
  138. package/dist/cjs/components/sparkline-dialog/index.js +127 -0
  139. package/dist/cjs/components/subtotal-dialog/index.d.ts.map +1 -1
  140. package/dist/cjs/components/subtotal-dialog/index.js +10 -1
  141. package/dist/cjs/components/table-auto-expansion-smart-tag/index.d.ts +24 -0
  142. package/dist/cjs/components/table-auto-expansion-smart-tag/index.d.ts.map +1 -0
  143. package/dist/cjs/components/table-auto-expansion-smart-tag/index.js +31 -0
  144. package/dist/cjs/components/toolbar/index.d.ts +1 -0
  145. package/dist/cjs/components/toolbar/index.d.ts.map +1 -1
  146. package/dist/cjs/components/toolbar/index.js +1 -0
  147. package/dist/cjs/components/toolbar/insert-menu.d.ts +2 -1
  148. package/dist/cjs/components/toolbar/insert-menu.d.ts.map +1 -1
  149. package/dist/cjs/components/toolbar/insert-menu.js +24 -1
  150. package/dist/cjs/components/toolbar/merge-cells-selector.d.ts +4 -1
  151. package/dist/cjs/components/toolbar/merge-cells-selector.d.ts.map +1 -1
  152. package/dist/cjs/components/toolbar/merge-cells-selector.js +11 -5
  153. package/dist/cjs/components/toolbar/sparkline-actions.d.ts +31 -0
  154. package/dist/cjs/components/toolbar/sparkline-actions.d.ts.map +1 -0
  155. package/dist/cjs/components/toolbar/sparkline-actions.js +273 -0
  156. package/dist/cjs/components/toolbar/table-actions.d.ts +9 -1
  157. package/dist/cjs/components/toolbar/table-actions.d.ts.map +1 -1
  158. package/dist/cjs/components/toolbar/table-actions.js +17 -7
  159. package/dist/cjs/components/toolbar/table-style-selector.d.ts +38 -2
  160. package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
  161. package/dist/cjs/components/toolbar/table-style-selector.js +241 -389
  162. package/dist/cjs/config.d.ts +2 -0
  163. package/dist/cjs/config.d.ts.map +1 -1
  164. package/dist/cjs/config.js +31 -1
  165. package/dist/cjs/helpers.d.ts +1 -1
  166. package/dist/cjs/helpers.d.ts.map +1 -1
  167. package/dist/cjs/helpers.js +13 -2
  168. package/dist/cjs/hooks/use-cell-renderer.d.ts +16 -1
  169. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  170. package/dist/cjs/hooks/use-cell-renderer.js +20 -8
  171. package/dist/cjs/hooks/use-chart-clipboard.d.ts +55 -0
  172. package/dist/cjs/hooks/use-chart-clipboard.d.ts.map +1 -0
  173. package/dist/cjs/hooks/use-chart-clipboard.js +231 -0
  174. package/dist/cjs/hooks/use-chart-source-ranges.d.ts +27 -0
  175. package/dist/cjs/hooks/use-chart-source-ranges.d.ts.map +1 -0
  176. package/dist/cjs/hooks/use-chart-source-ranges.js +211 -0
  177. package/dist/cjs/hooks/use-context-setter.d.ts.map +1 -1
  178. package/dist/cjs/hooks/use-context-setter.js +3 -1
  179. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  180. package/dist/cjs/hooks/use-copy-paste-cut.js +6 -3
  181. package/dist/cjs/hooks/use-editable.d.ts +9 -1
  182. package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
  183. package/dist/cjs/hooks/use-editable.js +25 -1
  184. package/dist/cjs/hooks/use-embeds-charts.d.ts +64 -4
  185. package/dist/cjs/hooks/use-embeds-charts.d.ts.map +1 -1
  186. package/dist/cjs/hooks/use-embeds-charts.js +412 -41
  187. package/dist/cjs/hooks/use-grid-children.d.ts +2 -2
  188. package/dist/cjs/hooks/use-grid-children.d.ts.map +1 -1
  189. package/dist/cjs/hooks/use-grid-children.js +12 -6
  190. package/dist/cjs/hooks/use-header-actions.d.ts.map +1 -1
  191. package/dist/cjs/hooks/use-header-actions.js +17 -10
  192. package/dist/cjs/hooks/use-isomorphic-layout-effect.d.ts +2 -2
  193. package/dist/cjs/hooks/use-isomorphic-layout-effect.d.ts.map +1 -1
  194. package/dist/cjs/hooks/use-keyboard-handler.d.ts +2 -1
  195. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  196. package/dist/cjs/hooks/use-keyboard-handler.js +8 -2
  197. package/dist/cjs/hooks/use-move-columns-rows.d.ts.map +1 -1
  198. package/dist/cjs/hooks/use-move-columns-rows.js +21 -15
  199. package/dist/cjs/hooks/use-reveal-chart-embed.d.ts +17 -0
  200. package/dist/cjs/hooks/use-reveal-chart-embed.d.ts.map +1 -0
  201. package/dist/cjs/hooks/use-reveal-chart-embed.js +40 -0
  202. package/dist/cjs/hooks/use-selection-move.d.ts.map +1 -1
  203. package/dist/cjs/hooks/use-selection-move.js +14 -6
  204. package/dist/cjs/hooks/use-selection-renderer.d.ts +13 -1
  205. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  206. package/dist/cjs/hooks/use-selection-renderer.js +37 -7
  207. package/dist/cjs/hooks/use-selection-resize.d.ts.map +1 -1
  208. package/dist/cjs/hooks/use-selection-resize.js +13 -6
  209. package/dist/cjs/hooks/use-selection.d.ts +9 -1
  210. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  211. package/dist/cjs/hooks/use-selection.js +177 -55
  212. package/dist/cjs/hooks/use-structured-reference-selection.d.ts +1 -1
  213. package/dist/cjs/hooks/use-structured-reference-selection.d.ts.map +1 -1
  214. package/dist/cjs/hooks/use-structured-reference-selection.js +10 -0
  215. package/dist/cjs/hooks/use-table-hit-zones.d.ts +61 -0
  216. package/dist/cjs/hooks/use-table-hit-zones.d.ts.map +1 -0
  217. package/dist/cjs/hooks/use-table-hit-zones.js +157 -0
  218. package/dist/cjs/hooks/use-table-resizer.d.ts +7 -0
  219. package/dist/cjs/hooks/use-table-resizer.d.ts.map +1 -1
  220. package/dist/cjs/hooks/use-table-resizer.js +38 -18
  221. package/dist/cjs/hooks/use-touch.d.ts.map +1 -1
  222. package/dist/cjs/hooks/use-touch.js +16 -8
  223. package/dist/cjs/index.d.ts +13 -0
  224. package/dist/cjs/index.d.ts.map +1 -1
  225. package/dist/cjs/index.js +17 -1
  226. package/dist/cjs/release-date.js +1 -1
  227. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  228. package/dist/cjs/types.d.ts +289 -4
  229. package/dist/cjs/types.d.ts.map +1 -1
  230. package/dist/cjs/utils/copy-as-picture.d.ts +13 -0
  231. package/dist/cjs/utils/copy-as-picture.d.ts.map +1 -0
  232. package/dist/cjs/utils/copy-as-picture.js +70 -0
  233. package/dist/cjs/utils/pivot-chart-field-buttons.d.ts +19 -0
  234. package/dist/cjs/utils/pivot-chart-field-buttons.d.ts.map +1 -0
  235. package/dist/cjs/utils/pivot-chart-field-buttons.js +25 -0
  236. package/dist/cjs/utils/z-order.d.ts +47 -0
  237. package/dist/cjs/utils/z-order.d.ts.map +1 -0
  238. package/dist/cjs/utils/z-order.js +124 -0
  239. package/dist/esm/api/banded-ranges.d.ts.map +1 -1
  240. package/dist/esm/api/banded-ranges.js +39 -12
  241. package/dist/esm/api/calculated-column-fill.d.ts +43 -0
  242. package/dist/esm/api/calculated-column-fill.d.ts.map +1 -0
  243. package/dist/esm/api/calculated-column-fill.js +10 -0
  244. package/dist/esm/api/chart-sheet.d.ts +8 -0
  245. package/dist/esm/api/chart-sheet.d.ts.map +1 -0
  246. package/dist/esm/api/chart-sheet.js +15 -0
  247. package/dist/esm/api/chart-source-ranges.d.ts +64 -0
  248. package/dist/esm/api/chart-source-ranges.d.ts.map +1 -0
  249. package/dist/esm/api/chart-source-ranges.js +168 -0
  250. package/dist/esm/api/selections.d.ts +3 -3
  251. package/dist/esm/api/selections.d.ts.map +1 -1
  252. package/dist/esm/api/selections.js +26 -2
  253. package/dist/esm/api/spreadsheet-api.d.ts +16 -3
  254. package/dist/esm/api/spreadsheet-api.d.ts.map +1 -1
  255. package/dist/esm/api/spreadsheet-api.js +18 -2
  256. package/dist/esm/api/table-auto-expansion.d.ts +37 -0
  257. package/dist/esm/api/table-auto-expansion.d.ts.map +1 -0
  258. package/dist/esm/api/table-auto-expansion.js +10 -0
  259. package/dist/esm/api/table.d.ts +49 -1
  260. package/dist/esm/api/table.d.ts.map +1 -1
  261. package/dist/esm/api/table.js +138 -1
  262. package/dist/esm/api/validation.d.ts +26 -1
  263. package/dist/esm/api/validation.d.ts.map +1 -1
  264. package/dist/esm/api/validation.js +119 -9
  265. package/dist/esm/atoms/calculated-column-fill.atom.d.ts +15 -0
  266. package/dist/esm/atoms/calculated-column-fill.atom.d.ts.map +1 -0
  267. package/dist/esm/atoms/calculated-column-fill.atom.js +12 -0
  268. package/dist/esm/atoms/chart-actions.atom.d.ts +40 -0
  269. package/dist/esm/atoms/chart-actions.atom.d.ts.map +1 -0
  270. package/dist/esm/atoms/chart-actions.atom.js +58 -0
  271. package/dist/esm/atoms/index.d.ts +5 -0
  272. package/dist/esm/atoms/index.d.ts.map +1 -1
  273. package/dist/esm/atoms/index.js +5 -0
  274. package/dist/esm/atoms/move-chart-dialog.atom.d.ts +28 -0
  275. package/dist/esm/atoms/move-chart-dialog.atom.d.ts.map +1 -0
  276. package/dist/esm/atoms/move-chart-dialog.atom.js +25 -0
  277. package/dist/esm/atoms/selected-chart-embed.atom.d.ts +9 -1
  278. package/dist/esm/atoms/selected-chart-embed.atom.d.ts.map +1 -1
  279. package/dist/esm/atoms/selected-chart-embed.atom.js +19 -2
  280. package/dist/esm/atoms/selected-chart-series.atom.d.ts +24 -0
  281. package/dist/esm/atoms/selected-chart-series.atom.d.ts.map +1 -0
  282. package/dist/esm/atoms/selected-chart-series.atom.js +4 -0
  283. package/dist/esm/atoms/sheet-context.atom.d.ts +2 -0
  284. package/dist/esm/atoms/sheet-context.atom.d.ts.map +1 -1
  285. package/dist/esm/atoms/sheet-context.atom.js +2 -0
  286. package/dist/esm/atoms/sparkline-dialog.atom.d.ts +34 -0
  287. package/dist/esm/atoms/sparkline-dialog.atom.d.ts.map +1 -0
  288. package/dist/esm/atoms/sparkline-dialog.atom.js +21 -0
  289. package/dist/esm/atoms/table-auto-expansion.atom.d.ts +14 -0
  290. package/dist/esm/atoms/table-auto-expansion.atom.d.ts.map +1 -0
  291. package/dist/esm/atoms/table-auto-expansion.atom.js +11 -0
  292. package/dist/esm/components/calculated-column-smart-tag/index.d.ts +25 -0
  293. package/dist/esm/components/calculated-column-smart-tag/index.d.ts.map +1 -0
  294. package/dist/esm/components/calculated-column-smart-tag/index.js +25 -0
  295. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  296. package/dist/esm/components/canvas-grid/index.js +346 -26
  297. package/dist/esm/components/canvas-grid/typings.d.ts +127 -14
  298. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  299. package/dist/esm/components/cell/index.d.ts.map +1 -1
  300. package/dist/esm/components/cell/index.js +3 -3
  301. package/dist/esm/components/cell/typings.d.ts +13 -0
  302. package/dist/esm/components/cell/typings.d.ts.map +1 -1
  303. package/dist/esm/components/cell-filter/index.d.ts.map +1 -1
  304. package/dist/esm/components/cell-filter/index.js +14 -3
  305. package/dist/esm/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  306. package/dist/esm/components/cell-input/formula-bar-cell-input.js +4 -1
  307. package/dist/esm/components/cell-structured/sparkline-math.d.ts +28 -5
  308. package/dist/esm/components/cell-structured/sparkline-math.d.ts.map +1 -1
  309. package/dist/esm/components/cell-structured/sparkline-math.js +58 -4
  310. package/dist/esm/components/cell-structured/sparkline.d.ts +1 -1
  311. package/dist/esm/components/cell-structured/sparkline.d.ts.map +1 -1
  312. package/dist/esm/components/cell-structured/sparkline.js +3 -3
  313. package/dist/esm/components/cell-structured/types.d.ts +1 -1
  314. package/dist/esm/components/cell-structured/types.d.ts.map +1 -1
  315. package/dist/esm/components/chart-sheet-view/index.d.ts +27 -0
  316. package/dist/esm/components/chart-sheet-view/index.d.ts.map +1 -0
  317. package/dist/esm/components/chart-sheet-view/index.js +30 -0
  318. package/dist/esm/components/context-menu/embed-context-menu.d.ts +48 -0
  319. package/dist/esm/components/context-menu/embed-context-menu.d.ts.map +1 -0
  320. package/dist/esm/components/context-menu/embed-context-menu.js +112 -0
  321. package/dist/esm/components/context-menu/index.d.ts +23 -2
  322. package/dist/esm/components/context-menu/index.d.ts.map +1 -1
  323. package/dist/esm/components/context-menu/index.js +174 -38
  324. package/dist/esm/components/context-menu/total-row-function-menu.d.ts +33 -0
  325. package/dist/esm/components/context-menu/total-row-function-menu.d.ts.map +1 -0
  326. package/dist/esm/components/context-menu/total-row-function-menu.js +50 -0
  327. package/dist/esm/components/context-menu/total-row-functions.d.ts +12 -12
  328. package/dist/esm/components/context-menu/total-row-functions.d.ts.map +1 -1
  329. package/dist/esm/components/context-menu/total-row-functions.js +29 -31
  330. package/dist/esm/components/embeds/chart-component.d.ts +17 -0
  331. package/dist/esm/components/embeds/chart-component.d.ts.map +1 -1
  332. package/dist/esm/components/embeds/embed-draggable.d.ts +61 -4
  333. package/dist/esm/components/embeds/embed-draggable.d.ts.map +1 -1
  334. package/dist/esm/components/embeds/embed-draggable.js +207 -47
  335. package/dist/esm/components/filter-box/date-tree.d.ts +28 -0
  336. package/dist/esm/components/filter-box/date-tree.d.ts.map +1 -0
  337. package/dist/esm/components/filter-box/date-tree.js +107 -0
  338. package/dist/esm/components/filter-box/filter-by-condition.d.ts +14 -2
  339. package/dist/esm/components/filter-box/filter-by-condition.d.ts.map +1 -1
  340. package/dist/esm/components/filter-box/filter-by-condition.js +72 -16
  341. package/dist/esm/components/filter-box/filter-by-value.d.ts.map +1 -1
  342. package/dist/esm/components/filter-box/filter-by-value.js +110 -39
  343. package/dist/esm/components/filter-box/index.d.ts +7 -1
  344. package/dist/esm/components/filter-box/index.d.ts.map +1 -1
  345. package/dist/esm/components/filter-box/index.js +88 -2
  346. package/dist/esm/components/move-chart-dialog/index.d.ts +34 -0
  347. package/dist/esm/components/move-chart-dialog/index.d.ts.map +1 -0
  348. package/dist/esm/components/move-chart-dialog/index.js +88 -0
  349. package/dist/esm/components/print-preview/page-block.d.ts +9 -1
  350. package/dist/esm/components/print-preview/page-block.d.ts.map +1 -1
  351. package/dist/esm/components/print-preview/page-block.js +27 -2
  352. package/dist/esm/components/print-preview/print-preview-dialog.d.ts +8 -1
  353. package/dist/esm/components/print-preview/print-preview-dialog.d.ts.map +1 -1
  354. package/dist/esm/components/print-preview/print-preview-dialog.js +92 -4
  355. package/dist/esm/components/print-preview/run-print.d.ts.map +1 -1
  356. package/dist/esm/components/print-preview/run-print.js +17 -7
  357. package/dist/esm/components/print-preview/use-page-layout.d.ts +47 -0
  358. package/dist/esm/components/print-preview/use-page-layout.d.ts.map +1 -1
  359. package/dist/esm/components/print-preview/use-page-layout.js +55 -0
  360. package/dist/esm/components/resizer/index.d.ts.map +1 -1
  361. package/dist/esm/components/resizer/index.js +8 -4
  362. package/dist/esm/components/selection/index.d.ts +1 -1
  363. package/dist/esm/components/selection/index.d.ts.map +1 -1
  364. package/dist/esm/components/selection/index.js +6 -2
  365. package/dist/esm/components/selection/types.d.ts +15 -0
  366. package/dist/esm/components/selection/types.d.ts.map +1 -1
  367. package/dist/esm/components/sheet-search/index.d.ts.map +1 -1
  368. package/dist/esm/components/sheet-search/index.js +5 -2
  369. package/dist/esm/components/sheet-tabs/index.d.ts.map +1 -1
  370. package/dist/esm/components/sheet-tabs/index.js +2 -2
  371. package/dist/esm/components/sheet-tabs/sheet-tab.d.ts +1 -1
  372. package/dist/esm/components/sheet-tabs/sheet-tab.d.ts.map +1 -1
  373. package/dist/esm/components/sheet-tabs/sheet-tab.js +4 -2
  374. package/dist/esm/components/sparkline-dialog/index.d.ts +43 -0
  375. package/dist/esm/components/sparkline-dialog/index.d.ts.map +1 -0
  376. package/dist/esm/components/sparkline-dialog/index.js +123 -0
  377. package/dist/esm/components/subtotal-dialog/index.d.ts.map +1 -1
  378. package/dist/esm/components/subtotal-dialog/index.js +10 -1
  379. package/dist/esm/components/table-auto-expansion-smart-tag/index.d.ts +24 -0
  380. package/dist/esm/components/table-auto-expansion-smart-tag/index.d.ts.map +1 -0
  381. package/dist/esm/components/table-auto-expansion-smart-tag/index.js +25 -0
  382. package/dist/esm/components/toolbar/index.d.ts +1 -0
  383. package/dist/esm/components/toolbar/index.d.ts.map +1 -1
  384. package/dist/esm/components/toolbar/index.js +1 -0
  385. package/dist/esm/components/toolbar/insert-menu.d.ts +2 -1
  386. package/dist/esm/components/toolbar/insert-menu.d.ts.map +1 -1
  387. package/dist/esm/components/toolbar/insert-menu.js +24 -1
  388. package/dist/esm/components/toolbar/merge-cells-selector.d.ts +4 -1
  389. package/dist/esm/components/toolbar/merge-cells-selector.d.ts.map +1 -1
  390. package/dist/esm/components/toolbar/merge-cells-selector.js +10 -6
  391. package/dist/esm/components/toolbar/sparkline-actions.d.ts +31 -0
  392. package/dist/esm/components/toolbar/sparkline-actions.d.ts.map +1 -0
  393. package/dist/esm/components/toolbar/sparkline-actions.js +238 -0
  394. package/dist/esm/components/toolbar/table-actions.d.ts +9 -1
  395. package/dist/esm/components/toolbar/table-actions.d.ts.map +1 -1
  396. package/dist/esm/components/toolbar/table-actions.js +15 -7
  397. package/dist/esm/components/toolbar/table-style-selector.d.ts +38 -2
  398. package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
  399. package/dist/esm/components/toolbar/table-style-selector.js +210 -399
  400. package/dist/esm/config.d.ts +2 -0
  401. package/dist/esm/config.d.ts.map +1 -1
  402. package/dist/esm/config.js +30 -0
  403. package/dist/esm/helpers.d.ts +1 -1
  404. package/dist/esm/helpers.d.ts.map +1 -1
  405. package/dist/esm/helpers.js +12 -1
  406. package/dist/esm/hooks/use-cell-renderer.d.ts +16 -1
  407. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  408. package/dist/esm/hooks/use-cell-renderer.js +14 -4
  409. package/dist/esm/hooks/use-chart-clipboard.d.ts +55 -0
  410. package/dist/esm/hooks/use-chart-clipboard.d.ts.map +1 -0
  411. package/dist/esm/hooks/use-chart-clipboard.js +213 -0
  412. package/dist/esm/hooks/use-chart-source-ranges.d.ts +27 -0
  413. package/dist/esm/hooks/use-chart-source-ranges.d.ts.map +1 -0
  414. package/dist/esm/hooks/use-chart-source-ranges.js +186 -0
  415. package/dist/esm/hooks/use-context-setter.d.ts.map +1 -1
  416. package/dist/esm/hooks/use-context-setter.js +3 -1
  417. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  418. package/dist/esm/hooks/use-copy-paste-cut.js +6 -4
  419. package/dist/esm/hooks/use-editable.d.ts +9 -1
  420. package/dist/esm/hooks/use-editable.d.ts.map +1 -1
  421. package/dist/esm/hooks/use-editable.js +25 -1
  422. package/dist/esm/hooks/use-embeds-charts.d.ts +64 -4
  423. package/dist/esm/hooks/use-embeds-charts.d.ts.map +1 -1
  424. package/dist/esm/hooks/use-embeds-charts.js +394 -39
  425. package/dist/esm/hooks/use-grid-children.d.ts +2 -2
  426. package/dist/esm/hooks/use-grid-children.d.ts.map +1 -1
  427. package/dist/esm/hooks/use-grid-children.js +8 -2
  428. package/dist/esm/hooks/use-header-actions.d.ts.map +1 -1
  429. package/dist/esm/hooks/use-header-actions.js +11 -4
  430. package/dist/esm/hooks/use-isomorphic-layout-effect.d.ts +2 -2
  431. package/dist/esm/hooks/use-isomorphic-layout-effect.d.ts.map +1 -1
  432. package/dist/esm/hooks/use-keyboard-handler.d.ts +2 -1
  433. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  434. package/dist/esm/hooks/use-keyboard-handler.js +8 -2
  435. package/dist/esm/hooks/use-move-columns-rows.d.ts.map +1 -1
  436. package/dist/esm/hooks/use-move-columns-rows.js +12 -6
  437. package/dist/esm/hooks/use-reveal-chart-embed.d.ts +17 -0
  438. package/dist/esm/hooks/use-reveal-chart-embed.d.ts.map +1 -0
  439. package/dist/esm/hooks/use-reveal-chart-embed.js +35 -0
  440. package/dist/esm/hooks/use-selection-move.d.ts.map +1 -1
  441. package/dist/esm/hooks/use-selection-move.js +11 -4
  442. package/dist/esm/hooks/use-selection-renderer.d.ts +13 -1
  443. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  444. package/dist/esm/hooks/use-selection-renderer.js +35 -6
  445. package/dist/esm/hooks/use-selection-resize.d.ts.map +1 -1
  446. package/dist/esm/hooks/use-selection-resize.js +11 -5
  447. package/dist/esm/hooks/use-selection.d.ts +9 -1
  448. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  449. package/dist/esm/hooks/use-selection.js +172 -54
  450. package/dist/esm/hooks/use-structured-reference-selection.d.ts +1 -1
  451. package/dist/esm/hooks/use-structured-reference-selection.d.ts.map +1 -1
  452. package/dist/esm/hooks/use-structured-reference-selection.js +16 -0
  453. package/dist/esm/hooks/use-table-hit-zones.d.ts +61 -0
  454. package/dist/esm/hooks/use-table-hit-zones.d.ts.map +1 -0
  455. package/dist/esm/hooks/use-table-hit-zones.js +146 -0
  456. package/dist/esm/hooks/use-table-resizer.d.ts +7 -0
  457. package/dist/esm/hooks/use-table-resizer.d.ts.map +1 -1
  458. package/dist/esm/hooks/use-table-resizer.js +36 -19
  459. package/dist/esm/hooks/use-touch.d.ts.map +1 -1
  460. package/dist/esm/hooks/use-touch.js +15 -7
  461. package/dist/esm/index.d.ts +13 -0
  462. package/dist/esm/index.d.ts.map +1 -1
  463. package/dist/esm/index.js +13 -0
  464. package/dist/esm/release-date.js +1 -1
  465. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  466. package/dist/esm/types.d.ts +289 -4
  467. package/dist/esm/types.d.ts.map +1 -1
  468. package/dist/esm/utils/copy-as-picture.d.ts +13 -0
  469. package/dist/esm/utils/copy-as-picture.d.ts.map +1 -0
  470. package/dist/esm/utils/copy-as-picture.js +45 -0
  471. package/dist/esm/utils/pivot-chart-field-buttons.d.ts +19 -0
  472. package/dist/esm/utils/pivot-chart-field-buttons.d.ts.map +1 -0
  473. package/dist/esm/utils/pivot-chart-field-buttons.js +18 -0
  474. package/dist/esm/utils/z-order.d.ts +47 -0
  475. package/dist/esm/utils/z-order.d.ts.map +1 -0
  476. package/dist/esm/utils/z-order.js +111 -0
  477. package/dist/spreadsheet.min.css +1 -1
  478. package/package.json +8 -6
  479. package/dist/cjs/components/cell-editor/helpers.spec.d.ts +0 -2
  480. package/dist/cjs/components/cell-editor/helpers.spec.d.ts.map +0 -1
  481. package/dist/cjs/components/cell-editor/helpers.spec.js +0 -32
  482. package/dist/esm/components/cell-editor/helpers.spec.d.ts +0 -2
  483. package/dist/esm/components/cell-editor/helpers.spec.d.ts.map +0 -1
  484. package/dist/esm/components/cell-editor/helpers.spec.js +0 -30
@@ -1,10 +1,11 @@
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";
7
7
  import { MOVE_OVERWRITE_PROMPT, needsOverwritePrompt } from "../api/move-overwrite";
8
+ import { findActiveTableWithinCell, getNextCellInTable, getTableColumnSelectRange, getTableRowSelectRange, getTableSelectAllRange, } from "../api/table";
8
9
  import { DEFAULT_ARRAY } from "../config";
9
10
  import { isMac } from "../helpers";
10
11
  import { useCallbackRef } from "./use-callback-ref";
@@ -85,7 +86,7 @@ const fillShrinkFor = (selection, coords) => {
85
86
  const defaultConfirmMoveOverwrite = (message) => typeof window === "undefined" || typeof window.confirm !== "function"
86
87
  ? true
87
88
  : window.confirm(message);
88
- export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount = 0, rowCount = 0, selectionPolicy = "multiple", newSelectionMode = "clear", allowDeselectSelection = true, onFill, onFillHandleRelease, onFillShrink, onInsertCutCells, confirmMoveOverwrite = defaultConfirmMoveOverwrite, isHiddenRow = defaultIsHidden, isHiddenColumn = defaultIsHidden, alwaysScrollToActiveCell = true, selectionTopBound = 0, selectionBottomBound = rowCount, selectionLeftBound = 0, selectionRightBound = columnCount, mouseDownInterceptor, mouseMoveInterceptor, mergedCells = DEFAULT_ARRAY, canSelectionSpanMergedCells = defaultSelectionSpan, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, isRowHeader, isColumnHeader, enableDataBoundaryNavigation = false, }) => {
89
+ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount = 0, rowCount = 0, selectionPolicy = "multiple", newSelectionMode = "clear", allowDeselectSelection = true, onFill, onFillHandleRelease, onFillShrink, onInsertCutCells, confirmMoveOverwrite = defaultConfirmMoveOverwrite, isHiddenRow = defaultIsHidden, isHiddenColumn = defaultIsHidden, alwaysScrollToActiveCell = true, selectionTopBound = 0, selectionBottomBound = rowCount, selectionLeftBound = 0, selectionRightBound = columnCount, mouseDownInterceptor, mouseMoveInterceptor, mergedCells = DEFAULT_ARRAY, canSelectionSpanMergedCells = defaultSelectionSpan, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, isRowHeader, isColumnHeader, enableDataBoundaryNavigation = false, tables, onInsertTableRow, }) => {
89
90
  const [fillSelection, setFillSelection] = useState();
90
91
  const [fillShrink, setFillShrink] = useState();
91
92
  const fillShrinkRef = useRef(undefined);
@@ -105,24 +106,35 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
105
106
  * release always fires `contextmenu`; neither may reach the grid's cell
106
107
  * context menu while the user is dragging the fill handle.
107
108
  */
109
+ /**
110
+ * Documents the in-flight gestures listen on. The grid may render into a
111
+ * popout window, whose document is not the bundle's global `document`; a
112
+ * gesture binds its move/up listeners to the document of the element it
113
+ * started on and unbinds from that same document.
114
+ */
115
+ const selectionDocumentRef = useRef(null);
116
+ const fillDocumentRef = useRef(null);
117
+ const dragSelectionDocumentRef = useRef(null);
118
+ const tapDocumentRef = useRef(null);
108
119
  const contextMenuSuppressorRef = useRef(null);
109
120
  const releaseContextMenuSuppressor = useCallback(() => {
110
- const handler = contextMenuSuppressorRef.current;
111
- if (!handler)
121
+ const suppressor = contextMenuSuppressorRef.current;
122
+ if (!suppressor)
112
123
  return;
113
124
  contextMenuSuppressorRef.current = null;
114
- document.removeEventListener("contextmenu", handler, true);
125
+ suppressor.ownerDocument.removeEventListener("contextmenu", suppressor.handler, true);
115
126
  }, []);
116
127
  const suppressNextContextMenu = useCallback(() => {
117
128
  if (contextMenuSuppressorRef.current)
118
129
  return;
130
+ const ownerDocument = fillDocumentRef.current ?? document;
119
131
  const handler = (e) => {
120
132
  e.preventDefault();
121
133
  e.stopPropagation();
122
134
  releaseContextMenuSuppressor();
123
135
  };
124
- contextMenuSuppressorRef.current = handler;
125
- document.addEventListener("contextmenu", handler, true);
136
+ contextMenuSuppressorRef.current = { handler, ownerDocument };
137
+ ownerDocument.addEventListener("contextmenu", handler, true);
126
138
  }, [releaseContextMenuSuppressor]);
127
139
  const selectionsRef = useRef([]);
128
140
  const fillSelectionRef = useRef(undefined);
@@ -349,9 +361,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
349
361
  const handleMouseUp = useCallback(() => {
350
362
  /* Reset selection mode */
351
363
  isSelecting.current = false;
352
- /* Remove listener */
353
- document.removeEventListener("mousemove", handleMouseMove);
354
- document.removeEventListener("mouseup", handleMouseUp);
364
+ /* Remove listener from the document the gesture started on */
365
+ const ownerDocument = selectionDocumentRef.current ?? document;
366
+ selectionDocumentRef.current = null;
367
+ ownerDocument.removeEventListener("mousemove", handleMouseMove);
368
+ ownerDocument.removeEventListener("mouseup", handleMouseUp);
355
369
  /* Update last selection */
356
370
  const curSelections = selectionsRef.current;
357
371
  const len = curSelections.length;
@@ -572,12 +586,62 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
572
586
  selectionLeftBound,
573
587
  selectionRightBound,
574
588
  ]);
589
+ // Select all
590
+ const selectAll = useCallback(() => {
591
+ selectionStart.current = {
592
+ rowIndex: selectionTopBound,
593
+ columnIndex: selectionLeftBound,
594
+ };
595
+ modifySelection({
596
+ rowIndex: selectionBottomBound,
597
+ columnIndex: selectionRightBound,
598
+ });
599
+ }, [
600
+ selectionTopBound,
601
+ selectionLeftBound,
602
+ selectionRightBound,
603
+ selectionBottomBound,
604
+ modifySelection,
605
+ ]);
606
+ /**
607
+ * Inside a table Ctrl+A / Ctrl+Space / Shift+Space walk Excel's table
608
+ * cycle before falling back to the sheet-wide behaviour. Applies `range`
609
+ * (keeping the active cell) and reports whether a table handled the key;
610
+ * a `null` cycle step means "the sheet-wide step" and returns false.
611
+ */
612
+ const currentSingleArea = () => selections.length === 1 ? selections[0].range : undefined;
613
+ const applyTableRange = useCallback((range) => {
614
+ if (!range) {
615
+ return false;
616
+ }
617
+ selectionStart.current = {
618
+ rowIndex: range.startRowIndex,
619
+ columnIndex: range.startColumnIndex,
620
+ };
621
+ modifySelection({
622
+ rowIndex: range.endRowIndex,
623
+ columnIndex: range.endColumnIndex,
624
+ });
625
+ return true;
626
+ }, [modifySelection]);
627
+ const activeTable = activeCell
628
+ ? findActiveTableWithinCell(sheetId, activeCell, tables)
629
+ : undefined;
575
630
  // ⌘A or ⌘+Shift+Space
576
631
  // Select all cells in bounding area
577
632
  const selectAllBoundedCells = useCallback(() => {
578
633
  if (!selectionEnd.current || !selectionStart.current) {
579
634
  return;
580
635
  }
636
+ if (activeTable) {
637
+ const step = getTableSelectAllRange(activeTable, currentSingleArea());
638
+ if (step === null) {
639
+ selectAll();
640
+ return;
641
+ }
642
+ applyTableRange(step);
643
+ return;
644
+ }
581
645
  let topBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Up);
582
646
  let bottomBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Down);
583
647
  let leftBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Left);
@@ -608,30 +672,44 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
608
672
  selectionTopBound,
609
673
  selectionLeftBound,
610
674
  selectionRightBound,
675
+ activeTable,
676
+ selections,
677
+ applyTableRange,
678
+ selectAll,
611
679
  ]);
612
- // Select all
613
- const selectAll = useCallback(() => {
680
+ // Select entire column
681
+ const selectEntireColumn = useCallback((columnIndex) => {
682
+ if (!selectionEnd.current ||
683
+ !selectionStart.current ||
684
+ columnIndex === void 0)
685
+ return;
614
686
  selectionStart.current = {
687
+ ...selectionStart.current,
615
688
  rowIndex: selectionTopBound,
616
- columnIndex: selectionLeftBound,
617
689
  };
618
690
  modifySelection({
691
+ ...selectionEnd.current,
619
692
  rowIndex: selectionBottomBound,
620
- columnIndex: selectionRightBound,
621
693
  });
622
- }, [
623
- selectionTopBound,
624
- selectionLeftBound,
625
- selectionRightBound,
626
- selectionBottomBound,
627
- modifySelection,
628
- ]);
694
+ }, [modifySelection, selectionBottomBound, selectionTopBound]);
629
695
  // Ctrl+Space
630
696
  const selectColumn = useCallback((columnIndex) => {
631
697
  if (!selectionEnd.current ||
632
698
  !selectionStart.current ||
633
699
  columnIndex === void 0)
634
700
  return;
701
+ if (activeTable) {
702
+ const step = getTableColumnSelectRange(activeTable, {
703
+ start: selectionStart.current.columnIndex,
704
+ end: selectionEnd.current.columnIndex,
705
+ }, currentSingleArea());
706
+ if (step === null) {
707
+ selectEntireColumn(columnIndex);
708
+ return;
709
+ }
710
+ applyTableRange(step);
711
+ return;
712
+ }
635
713
  let topBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Up);
636
714
  let bottomBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Down);
637
715
  const isSameVerticalBounds = topBound === bottomBound;
@@ -653,22 +731,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
653
731
  sheetId,
654
732
  selectionTopBound,
655
733
  selectionBottomBound,
734
+ activeTable,
735
+ selections,
736
+ applyTableRange,
737
+ selectEntireColumn,
656
738
  ]);
657
- // Select entire column
658
- const selectEntireColumn = useCallback((columnIndex) => {
659
- if (!selectionEnd.current ||
660
- !selectionStart.current ||
661
- columnIndex === void 0)
662
- return;
663
- selectionStart.current = {
664
- ...selectionStart.current,
665
- rowIndex: selectionTopBound,
666
- };
667
- modifySelection({
668
- ...selectionEnd.current,
669
- rowIndex: selectionBottomBound,
670
- });
671
- }, [modifySelection, selectionBottomBound, selectionTopBound]);
672
739
  // Shift+Space
673
740
  const selectRow = useCallback((rowIndex) => {
674
741
  if (!selectionEnd.current ||
@@ -676,6 +743,25 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
676
743
  rowIndex === void 0) {
677
744
  return;
678
745
  }
746
+ if (activeTable) {
747
+ const step = getTableRowSelectRange(activeTable, {
748
+ start: selectionStart.current.rowIndex,
749
+ end: selectionEnd.current.rowIndex,
750
+ }, currentSingleArea());
751
+ if (step !== null) {
752
+ applyTableRange(step);
753
+ return;
754
+ }
755
+ selectionStart.current = {
756
+ ...selectionStart.current,
757
+ columnIndex: selectionLeftBound,
758
+ };
759
+ modifySelection({
760
+ ...selectionEnd.current,
761
+ columnIndex: selectionRightBound,
762
+ });
763
+ return;
764
+ }
679
765
  let leftBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Left);
680
766
  let rightBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Right);
681
767
  const isSameHorizontalBounds = leftBound === rightBound;
@@ -695,6 +781,9 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
695
781
  findLastContentfulCellInDirection,
696
782
  modifySelection,
697
783
  sheetId,
784
+ activeTable,
785
+ selections,
786
+ applyTableRange,
698
787
  selectionRightBound,
699
788
  selectionLeftBound,
700
789
  ]);
@@ -881,8 +970,10 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
881
970
  const hasSelections = selectionsRef.current.length > 0;
882
971
  const isDeselecting = isMetaKey && allowDeselect;
883
972
  if (!isContextMenuClick && selectionPolicy !== "single") {
884
- document.addEventListener("mouseup", handleMouseUp);
885
- document.addEventListener("mousemove", handleMouseMove);
973
+ const ownerDocument = getOwnerDocument(e.currentTarget ?? e.target) ?? document;
974
+ selectionDocumentRef.current = ownerDocument;
975
+ ownerDocument.addEventListener("mouseup", handleMouseUp);
976
+ ownerDocument.addEventListener("mousemove", handleMouseMove);
886
977
  }
887
978
  /* Activate selection mode */
888
979
  // Disable flag for context menu
@@ -1096,11 +1187,22 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1096
1187
  }
1097
1188
  }
1098
1189
  else {
1099
- if (isShiftKey) {
1100
- keyNavigate(Direction.Left);
1190
+ const direction = isShiftKey ? Direction.Left : Direction.Right;
1191
+ const table = activeCell
1192
+ ? findActiveTableWithinCell(sheetId, activeCell, tables)
1193
+ : undefined;
1194
+ const tableTarget = table
1195
+ ? getNextCellInTable(table, activeCell, direction, isHiddenRow, isHiddenColumn)
1196
+ : null;
1197
+ if (table && tableTarget) {
1198
+ if (tableTarget.insertRow) {
1199
+ onInsertTableRow?.(table);
1200
+ }
1201
+ newSelection(tableTarget.cell);
1202
+ scrollToCell(tableTarget.cell);
1101
1203
  }
1102
1204
  else {
1103
- keyNavigate(Direction.Right);
1205
+ keyNavigate(direction);
1104
1206
  }
1105
1207
  }
1106
1208
  e.preventDefault();
@@ -1147,6 +1249,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1147
1249
  selectFirstCellInSheet,
1148
1250
  selectLastCellInSheet,
1149
1251
  enableSelectOnEnterKey,
1252
+ newSelection,
1253
+ isHiddenRow,
1254
+ isHiddenColumn,
1255
+ tables,
1256
+ onInsertTableRow,
1150
1257
  ]);
1151
1258
  /**
1152
1259
  * TODO
@@ -1245,9 +1352,10 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1245
1352
  isFilling.current = false;
1246
1353
  const toggle = isFillToggleModifier(e);
1247
1354
  const button = fillButtonRef.current;
1248
- /* Remove listener */
1249
- document.removeEventListener("mousemove", handleFillMouseMove);
1250
- document.removeEventListener("mouseup", handleFillMouseUp);
1355
+ /* Remove listener from the document the gesture started on */
1356
+ const ownerDocument = fillDocumentRef.current ?? document;
1357
+ ownerDocument.removeEventListener("mousemove", handleFillMouseMove);
1358
+ ownerDocument.removeEventListener("mouseup", handleFillMouseUp);
1251
1359
  // The right-button (or macOS Ctrl+click) `contextmenu` event follows this
1252
1360
  // mouseup; keep swallowing it for one tick, then drop the suppressor so a
1253
1361
  // later, unrelated right-click still opens the cell context menu.
@@ -1341,6 +1449,8 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1341
1449
  const handleFillMouseDown = useCallback((e) => {
1342
1450
  e.stopPropagation();
1343
1451
  e.preventDefault();
1452
+ const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
1453
+ fillDocumentRef.current = ownerDocument;
1344
1454
  const isRightButton = e.button === MouseButtonCodes.right;
1345
1455
  fillButtonRef.current = isRightButton ? "right" : "left";
1346
1456
  // Ctrl+drag on the handle must never become the macOS Ctrl+click
@@ -1350,8 +1460,8 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1350
1460
  suppressNextContextMenu();
1351
1461
  }
1352
1462
  isFilling.current = true;
1353
- document.addEventListener("mousemove", handleFillMouseMove);
1354
- document.addEventListener("mouseup", handleFillMouseUp);
1463
+ ownerDocument.addEventListener("mousemove", handleFillMouseMove);
1464
+ ownerDocument.addEventListener("mouseup", handleFillMouseUp);
1355
1465
  }, [handleFillMouseMove, handleFillMouseUp, suppressNextContextMenu]);
1356
1466
  /**
1357
1467
  * Remove the last selection from state
@@ -1478,9 +1588,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1478
1588
  draggedSelection.current = void 0;
1479
1589
  draggedSelectionIndex.current = void 0;
1480
1590
  hasUserMovedSelection.current = false;
1481
- /* Remove event handlers */
1482
- document.removeEventListener("mouseup", handleSelectionMouseUp);
1483
- document.removeEventListener("mousemove", handleSelectionMouseMove);
1591
+ /* Remove event handlers from the document the gesture started on */
1592
+ const ownerDocument = dragSelectionDocumentRef.current ?? document;
1593
+ dragSelectionDocumentRef.current = null;
1594
+ ownerDocument.removeEventListener("mouseup", handleSelectionMouseUp);
1595
+ ownerDocument.removeEventListener("mousemove", handleSelectionMouseMove);
1484
1596
  /* Force render */
1485
1597
  forceRender();
1486
1598
  }, [
@@ -1528,9 +1640,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1528
1640
  }
1529
1641
  /* Set dragging flag */
1530
1642
  isDragging.current = true;
1531
- /* Listen to mousemove and mousedown events */
1532
- document.addEventListener("mouseup", handleSelectionMouseUp);
1533
- document.addEventListener("mousemove", handleSelectionMouseMove);
1643
+ /* Listen on the document the gesture started on */
1644
+ const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
1645
+ dragSelectionDocumentRef.current = ownerDocument;
1646
+ ownerDocument.addEventListener("mouseup", handleSelectionMouseUp);
1647
+ ownerDocument.addEventListener("mousemove", handleSelectionMouseMove);
1534
1648
  /* Force a re-render */
1535
1649
  forceRender();
1536
1650
  }, [
@@ -1619,12 +1733,16 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
1619
1733
  handleMouseDown(event);
1620
1734
  handleMouseUp();
1621
1735
  }
1622
- document.removeEventListener("pointerup", onPointerUp);
1736
+ const ownerDocument = tapDocumentRef.current ?? document;
1737
+ tapDocumentRef.current = null;
1738
+ ownerDocument.removeEventListener("pointerup", onPointerUp);
1623
1739
  }, [handleMouseDown, handleMouseUp]);
1624
1740
  const onPointerDown = useCallback((event) => {
1625
1741
  startTimeRef.current = Date.now();
1626
1742
  startPosRef.current = { x: event.clientX, y: event.clientY };
1627
- document.addEventListener("pointerup", onPointerUp);
1743
+ const ownerDocument = getOwnerDocument(event.currentTarget) ?? document;
1744
+ tapDocumentRef.current = ownerDocument;
1745
+ ownerDocument.addEventListener("pointerup", onPointerUp);
1628
1746
  }, [onPointerUp]);
1629
1747
  // Add a ref. makeEditable renders way too often
1630
1748
  const handleKeyDownRef = useCallbackRef(handleKeyDown);
@@ -11,12 +11,12 @@ export declare const useOnStructuredReferenceSelection: ({ tables, getSheetName,
11
11
  endColumnIndex: number;
12
12
  startRowIndex: number;
13
13
  endRowIndex: number;
14
- sheetId: number;
15
14
  } | {
16
15
  startColumnIndex: number;
17
16
  endColumnIndex: number;
18
17
  startRowIndex: number;
19
18
  endRowIndex: number;
19
+ sheetId: number;
20
20
  };
21
21
  sheetName: string | undefined;
22
22
  } | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"use-structured-reference-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-structured-reference-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,iCAAiC,GAAI,2BAG/C;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;CAC/C,eAGc,MAAM,QACT,aAAa,GAAG,SAAS,aACpB,MAAM,GAAG,SAAS,eAChB,MAAM,EAAE,GAAG,SAAS,WACxB,OAAO,GAAG,SAAS,gBACd,WAAW,CAAC,aAAa,CAAC;;;;;;;;;;;;;;aA6H7C,CAAC"}
1
+ {"version":3,"file":"use-structured-reference-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-structured-reference-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,iCAAiC,GAAI,2BAG/C;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;CAC/C,eAGc,MAAM,QACT,aAAa,GAAG,SAAS,aACpB,MAAM,GAAG,SAAS,eAChB,MAAM,EAAE,GAAG,SAAS,WACxB,OAAO,GAAG,SAAS,gBACd,WAAW,CAAC,aAAa,CAAC;;;;;;;;;;;;;;aA8I7C,CAAC"}
@@ -51,6 +51,22 @@ export const useOnStructuredReferenceSelection = ({ tables, getSheetName, }) =>
51
51
  sheetName,
52
52
  };
53
53
  }
54
+ // Totals row only (the table's last row); nothing to highlight while it is off.
55
+ if (specialItem === "#Totals") {
56
+ if (!totalRow) {
57
+ return undefined;
58
+ }
59
+ return {
60
+ range: {
61
+ ...range,
62
+ startColumnIndex,
63
+ endColumnIndex,
64
+ startRowIndex: range.endRowIndex,
65
+ endRowIndex: range.endRowIndex,
66
+ },
67
+ sheetName,
68
+ };
69
+ }
54
70
  // All
55
71
  if (specialItem === "#All") {
56
72
  return {
@@ -0,0 +1,61 @@
1
+ import type { CellInterface, CellPosition, GridRange, PosXYRequired, ScrollCoords, SelectionArea } from "@rowsncolumns/grid";
2
+ import type React from "react";
3
+ import type { CanvasGridProps } from "../components/canvas-grid/typings";
4
+ import type { TableView } from "../types";
5
+ /** Width of the edge bands (px, in grid coordinates) that count as a table hit zone. */
6
+ export declare const TABLE_HIT_BAND = 4;
7
+ export type TableHitZone = {
8
+ /**
9
+ * `column`: the top edge of a header cell (selects the column data, then
10
+ * the entire table column). `corner`: the header's top-left corner (selects
11
+ * the data body, then the whole table). `row`: the left edge of the first
12
+ * column (selects the table row).
13
+ */
14
+ kind: "column" | "corner" | "row";
15
+ table: TableView;
16
+ cell: CellInterface;
17
+ };
18
+ /** Excel's black selection arrows: down on a header edge, right on a row edge, diagonal on the corner. */
19
+ export declare const TABLE_HIT_CURSORS: Record<TableHitZone["kind"], string>;
20
+ /**
21
+ * Classify a pointer position inside `cell` against the table it belongs to.
22
+ * `offset` is the pointer's position relative to the cell's top-left corner.
23
+ */
24
+ export declare const getTableHitZone: (table: TableView | undefined, cell: CellInterface, offset: {
25
+ x: number;
26
+ y: number;
27
+ }, band?: number) => TableHitZone | undefined;
28
+ /**
29
+ * The range a click on `zone` selects, given the single selected area (if
30
+ * any): a header edge selects the column data first and the entire table
31
+ * column on the next click; the corner toggles data body ↔ whole table; a row
32
+ * edge selects the table row.
33
+ */
34
+ export declare const getTableHitZoneRange: (zone: TableHitZone, current: GridRange | undefined) => GridRange;
35
+ export type UseTableHitZonesOptions = {
36
+ sheetId: number;
37
+ tables: CanvasGridProps["tables"];
38
+ selections: SelectionArea[];
39
+ frozenRows: number;
40
+ frozenColumns: number;
41
+ getCellCoordsFromOffset: (x: number, y: number) => CellInterface | undefined;
42
+ getRelativePositionFromOffset: (x: number, y: number) => PosXYRequired | null | undefined;
43
+ getCellOffsetFromCoords: (cell: CellInterface) => CellPosition | undefined;
44
+ getScrollPosition: () => ScrollCoords | undefined;
45
+ /** Replaces the selection with `range`, active cell at its top-left. */
46
+ onSelectRange: (sheetId: number, range: GridRange) => void;
47
+ };
48
+ /**
49
+ * Excel's table hit zones: hovering the top edge of a header cell, the
50
+ * header's top-left corner or the left edge of a row shows the black
51
+ * selection arrow; a click there selects the table column data / body / row
52
+ * instead of starting a cell selection.
53
+ */
54
+ export declare const useTableHitZones: ({ sheetId, tables, selections, frozenRows, frozenColumns, getCellCoordsFromOffset, getRelativePositionFromOffset, getCellOffsetFromCoords, getScrollPosition, onSelectRange, }: UseTableHitZonesOptions) => {
55
+ hitZone: TableHitZone | undefined;
56
+ cursor: string | undefined;
57
+ onMouseMove: (e: React.MouseEvent<HTMLElement>) => void;
58
+ onMouseDown: (e: React.MouseEvent<HTMLElement>) => boolean;
59
+ clearHitZone: () => void;
60
+ };
61
+ //# sourceMappingURL=use-table-hit-zones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-table-hit-zones.d.ts","sourceRoot":"","sources":["../../../hooks/use-table-hit-zones.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,aAAa,EACb,YAAY,EACZ,aAAa,EACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,wFAAwF;AACxF,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;OAKG;IACH,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAOF,0GAA0G;AAC1G,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,CAIlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,SAAS,GAAG,SAAS,EAC5B,MAAM,aAAa,EACnB,QAAQ;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAChC,aAAqB,KACpB,YAAY,GAAG,SA0BjB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,YAAY,EAClB,SAAS,SAAS,GAAG,SAAS,KAC7B,SA+BF,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IAC7E,6BAA6B,EAAE,CAC7B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,KACN,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,uBAAuB,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,YAAY,GAAG,SAAS,CAAC;IAC3E,iBAAiB,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;IAClD,wEAAwE;IACxE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,gLAW9B,uBAAuB;;;qBAyClB,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;qBAqB7B,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;;CA4BpC,CAAC"}
@@ -0,0 +1,146 @@
1
+ import { useCallback, useState } from "react";
2
+ import { findActiveTableWithinCell, getTableBodyRange, getTableColumnSelectRange, getTableRowSelectRange, } from "../api/table";
3
+ /** Width of the edge bands (px, in grid coordinates) that count as a table hit zone. */
4
+ export const TABLE_HIT_BAND = 4;
5
+ const arrowCursor = (rotate, fallback) => `url("data:image/svg+xml;utf8,${encodeURIComponent(`<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><g transform='rotate(${rotate} 8 8)'><path d='M8 1v10.5M4 8l4 4 4-4' fill='none' stroke='#fff' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'/><path d='M8 1v10.5M4 8l4 4 4-4' fill='none' stroke='#000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></g></svg>`)}") 8 8, ${fallback}`;
6
+ /** Excel's black selection arrows: down on a header edge, right on a row edge, diagonal on the corner. */
7
+ export const TABLE_HIT_CURSORS = {
8
+ column: arrowCursor(0, "default"),
9
+ row: arrowCursor(-90, "default"),
10
+ corner: arrowCursor(-45, "default"),
11
+ };
12
+ /**
13
+ * Classify a pointer position inside `cell` against the table it belongs to.
14
+ * `offset` is the pointer's position relative to the cell's top-left corner.
15
+ */
16
+ export const getTableHitZone = (table, cell, offset, band = TABLE_HIT_BAND) => {
17
+ if (!table) {
18
+ return undefined;
19
+ }
20
+ const { range } = table;
21
+ const isFirstRow = cell.rowIndex === range.startRowIndex;
22
+ const isFirstColumn = cell.columnIndex === range.startColumnIndex;
23
+ const nearTop = offset.y >= 0 && offset.y < band;
24
+ const nearLeft = offset.x >= 0 && offset.x < band;
25
+ if (isFirstRow &&
26
+ isFirstColumn &&
27
+ offset.x >= 0 &&
28
+ offset.y >= 0 &&
29
+ offset.x < band * 2 &&
30
+ offset.y < band * 2) {
31
+ return { kind: "corner", table, cell };
32
+ }
33
+ if (isFirstRow && nearTop) {
34
+ return { kind: "column", table, cell };
35
+ }
36
+ if (isFirstColumn && nearLeft) {
37
+ return { kind: "row", table, cell };
38
+ }
39
+ return undefined;
40
+ };
41
+ /**
42
+ * The range a click on `zone` selects, given the single selected area (if
43
+ * any): a header edge selects the column data first and the entire table
44
+ * column on the next click; the corner toggles data body ↔ whole table; a row
45
+ * edge selects the table row.
46
+ */
47
+ export const getTableHitZoneRange = (zone, current) => {
48
+ const { table, cell } = zone;
49
+ const columns = { start: cell.columnIndex, end: cell.columnIndex };
50
+ switch (zone.kind) {
51
+ case "column":
52
+ return (getTableColumnSelectRange(table, columns, current) ?? {
53
+ ...table.range,
54
+ startColumnIndex: cell.columnIndex,
55
+ endColumnIndex: cell.columnIndex,
56
+ });
57
+ case "corner": {
58
+ const body = getTableBodyRange(table);
59
+ const isBody = !!current &&
60
+ current.startRowIndex === body.startRowIndex &&
61
+ current.endRowIndex === body.endRowIndex &&
62
+ current.startColumnIndex === body.startColumnIndex &&
63
+ current.endColumnIndex === body.endColumnIndex;
64
+ return isBody ? { ...table.range } : body;
65
+ }
66
+ case "row":
67
+ return (getTableRowSelectRange(table, { start: cell.rowIndex, end: cell.rowIndex }, undefined) ?? { ...table.range });
68
+ }
69
+ };
70
+ /**
71
+ * Excel's table hit zones: hovering the top edge of a header cell, the
72
+ * header's top-left corner or the left edge of a row shows the black
73
+ * selection arrow; a click there selects the table column data / body / row
74
+ * instead of starting a cell selection.
75
+ */
76
+ export const useTableHitZones = ({ sheetId, tables, selections, frozenRows, frozenColumns, getCellCoordsFromOffset, getRelativePositionFromOffset, getCellOffsetFromCoords, getScrollPosition, onSelectRange, }) => {
77
+ const [hitZone, setHitZone] = useState();
78
+ const hitZoneAt = useCallback((clientX, clientY) => {
79
+ const cell = getCellCoordsFromOffset(clientX, clientY);
80
+ if (!cell) {
81
+ return undefined;
82
+ }
83
+ const table = findActiveTableWithinCell(sheetId, cell, tables);
84
+ if (!table) {
85
+ return undefined;
86
+ }
87
+ const position = getRelativePositionFromOffset(clientX, clientY);
88
+ const cellPosition = getCellOffsetFromCoords(cell);
89
+ if (!position || !cellPosition) {
90
+ return undefined;
91
+ }
92
+ const { scrollLeft = 0, scrollTop = 0 } = getScrollPosition() ?? {};
93
+ // Frozen rows / columns do not scroll.
94
+ const x = position.x +
95
+ (cell.columnIndex < frozenColumns ? 0 : scrollLeft) -
96
+ cellPosition.x;
97
+ const y = position.y + (cell.rowIndex < frozenRows ? 0 : scrollTop) - cellPosition.y;
98
+ return getTableHitZone(table, cell, { x, y });
99
+ }, [
100
+ sheetId,
101
+ tables,
102
+ frozenRows,
103
+ frozenColumns,
104
+ getCellCoordsFromOffset,
105
+ getRelativePositionFromOffset,
106
+ getCellOffsetFromCoords,
107
+ getScrollPosition,
108
+ ]);
109
+ const onMouseMove = useCallback((e) => {
110
+ const next = tables?.length ? hitZoneAt(e.clientX, e.clientY) : undefined;
111
+ setHitZone((prev) => prev?.kind === next?.kind &&
112
+ prev?.table.id === next?.table.id &&
113
+ prev?.cell.rowIndex === next?.cell.rowIndex &&
114
+ prev?.cell.columnIndex === next?.cell.columnIndex
115
+ ? prev
116
+ : next);
117
+ }, [tables, hitZoneAt]);
118
+ const clearHitZone = useCallback(() => setHitZone(undefined), []);
119
+ /**
120
+ * Returns true when the mousedown landed on a hit zone and selected the
121
+ * table part — the caller then skips the regular cell selection.
122
+ */
123
+ const onMouseDown = useCallback((e) => {
124
+ if (!tables?.length ||
125
+ e.button !== 0 ||
126
+ e.shiftKey ||
127
+ e.ctrlKey ||
128
+ e.metaKey) {
129
+ return false;
130
+ }
131
+ const zone = hitZoneAt(e.clientX, e.clientY);
132
+ if (!zone) {
133
+ return false;
134
+ }
135
+ const current = selections.length === 1 ? selections[0].range : undefined;
136
+ onSelectRange(sheetId, getTableHitZoneRange(zone, current));
137
+ return true;
138
+ }, [tables, hitZoneAt, selections, onSelectRange, sheetId]);
139
+ return {
140
+ hitZone,
141
+ cursor: hitZone ? TABLE_HIT_CURSORS[hitZone.kind] : undefined,
142
+ onMouseMove,
143
+ onMouseDown,
144
+ clearHitZone,
145
+ };
146
+ };
@@ -14,6 +14,13 @@ type UseTableResizerProps = {
14
14
  scrollToCell: (cell: OptionalCellInterface, align?: Align | undefined) => void | undefined;
15
15
  focusSheet(): void;
16
16
  };
17
+ /**
18
+ * The smallest table Excel's resize handle allows: the header row (when shown) plus one data row
19
+ * plus the totals row (when shown), and one column. The pointer may travel above / left of that
20
+ * while dragging, so the drop point is clamped the same way the drag preview is — releasing above
21
+ * the header must not produce a headerless or inverted range.
22
+ */
23
+ export declare const clampTableCornerCell: (cell: CellInterface, table: Pick<TableView, "range" | "headerRow" | "totalRow">) => CellInterface;
17
24
  export declare const useTableResizer: ({ sheetId, tables, theme, newSelection, modifySelection, clearSelections, onResizeTable, getCellCoordsFromOffset, scrollToCell, focusSheet, }: UseTableResizerProps) => {
18
25
  tableResizers: React.JSX.Element[] | undefined;
19
26
  isResizingTable: boolean;