@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,11 +1,10 @@
1
1
  import { tokenize as defaultFormulaTokenizer } from "@rowsncolumns/calculator";
2
2
  import { cellToArea, Direction, isAreasEqual } from "@rowsncolumns/grid";
3
- import { canUseDOM } from "@rowsncolumns/grid";
3
+ import { canUseDOM, getOwnerDocument } from "@rowsncolumns/grid";
4
4
  import { getBoundedCells, MouseButtonCodes } from "@rowsncolumns/grid";
5
5
  import { isCellWithinBounds } from "@rowsncolumns/grid";
6
6
  import { cellIdentifier, Grid as BaseGrid, isEqualCells, } from "@rowsncolumns/grid";
7
- import { defaultCellCoords } from "@rowsncolumns/spreadsheet-state";
8
- import { cn, Skeleton, tryParseRichText } from "@rowsncolumns/ui";
7
+ import { cn, DropdownMenuContent, DropdownMenuPortal, Skeleton, tryParseRichText, } from "@rowsncolumns/ui";
9
8
  import { cellToAddress, getCellEffectiveFormat, getContrastColor, getFormulaLocale, isConditionalFormatFormulaRule, isDataValidationFormulaRule, isNil, isNilOrBlank, iterateCellsInRange, localizeCellInput, localizeFormula, localizeFunctionDescriptions, log, resolveDefaultHorizontalAlignment, ssfFormatColor, uuid, } from "@rowsncolumns/utils";
10
9
  import { useStore } from "jotai";
11
10
  import merge from "lodash/merge";
@@ -13,6 +12,8 @@ import throttle from "lodash/throttle";
13
12
  import React, { forwardRef, memo, startTransition, useCallback, useEffect, useMemo, useRef, useState, } from "react";
14
13
  import { getBandedCells } from "../../api/banded-ranges";
15
14
  import { clearRangeForInsertedBand, formatsForInsertOption, insertedBandHasValues, } from "../../api/insert-options";
15
+ import { keepsCalculatedColumnTag, } from "../../api/calculated-column-fill";
16
+ import { keepsTableAutoExpansionTag, } from "../../api/table-auto-expansion";
16
17
  import { CF_INITIAL_WINDOW, cfWindowForViewport, isSameCfWindow, } from "../../api/cf-window";
17
18
  import { generateSelectionsFromFormula } from "../../api/selections";
18
19
  import { SpreadsheetApi } from "../../api/spreadsheet-api";
@@ -21,7 +22,7 @@ import { getDataValidationTooltipContent } from "../../api/validation-tooltip";
21
22
  import { resolveGoToSpecial } from "../../api/go-to-special";
22
23
  import { checkExcelValidationValue, isFormulaEntry, } from "../../api/excel-validation-kinds";
23
24
  import { checkBooleanRule, decideValidationCommit, isCellLockedUnderProtection, isProtectedCell, isProtectedSheet, showValidationDropdownArrow, } from "../../api/validation";
24
- import { useFormulaModeValue, useIsEvaluateFormulaDialogMounted, useIsGoToDialogMounted, useIsMoveOverwriteConfirmMounted, useIsPasteSpecialDialogMounted, useOpenEvaluateFormulaDialog, useOpenGoToDialog, useOpenMoveOverwriteConfirm, useOpenPasteSpecialDialog, useSetNoteEditorCell, useSetPinnedTooltip, useFillOptionsState, useInsertOptionsState, useOpenFillSeriesDialog, useShowPasteMenu, useShowValidationAlert, } from "../../atoms";
25
+ import { useFormulaModeValue, useIsEvaluateFormulaDialogMounted, useIsGoToDialogMounted, useIsMoveOverwriteConfirmMounted, useIsPasteSpecialDialogMounted, useOpenEvaluateFormulaDialog, useOpenGoToDialog, useOpenMoveOverwriteConfirm, useOpenPasteSpecialDialog, useSetNoteEditorCell, useSetPinnedTooltip, useFillOptionsState, useInsertOptionsState, useTableAutoExpansionState, useCalculatedColumnFillState, useOpenFillSeriesDialog, useShowPasteMenu, useShowValidationAlert, } from "../../atoms";
25
26
  import { useActiveEditor } from "../../atoms/active-editor.atom";
26
27
  import { useAddWatch, useIsWatchWindowMounted, useSetWatchWindowContext, } from "../../atoms/watch-window.atom";
27
28
  import { useEditingCell } from "../../atoms/editing-cell.atom";
@@ -37,9 +38,12 @@ import { useBorderStyles } from "../../hooks/use-border-styles";
37
38
  import { useCallbackRef } from "../../hooks/use-callback-ref";
38
39
  import { useCellPopover } from "../../hooks/use-cell-popover";
39
40
  import { useCellRenderer } from "../../hooks/use-cell-renderer";
41
+ import { useChartSourceRanges } from "../../hooks/use-chart-source-ranges";
40
42
  import { useConditionalFormatting } from "../../hooks/use-conditional-formatting";
41
43
  import { DefaultContextMenuWrapper, useContextMenu, } from "../../hooks/use-context-menu";
42
44
  import { useContextSetter } from "../../hooks/use-context-setter";
45
+ import { useRevealChartEmbed } from "../../hooks/use-reveal-chart-embed";
46
+ import { useChartClipboard } from "../../hooks/use-chart-clipboard";
43
47
  import { useCopyPasteCut } from "../../hooks/use-copy-paste-cut";
44
48
  import { useCreateAddressFromSelection } from "../../hooks/use-create-address-from-selection";
45
49
  import { useCreateFormulaTokenizer } from "../../hooks/use-create-formula-tokenizer";
@@ -49,6 +53,7 @@ import { useEditorChange } from "../../hooks/use-editor-change";
49
53
  import { useEditorKeydown } from "../../hooks/use-editor-keydown";
50
54
  import { useEditorSubmit } from "../../hooks/use-editor-submit";
51
55
  import { useEmbedsCharts } from "../../hooks/use-embeds-charts";
56
+ import { ChartSheetView } from "../chart-sheet-view";
52
57
  import { useExpandCell } from "../../hooks/use-expand-cell";
53
58
  import { useExportRange } from "../../hooks/use-export-range";
54
59
  import { useFilter } from "../../hooks/use-filter";
@@ -80,6 +85,7 @@ import { useSheetChangeHandler } from "../../hooks/use-sheet-change-handler";
80
85
  import { useSizer } from "../../hooks/use-sizer";
81
86
  import { useStableRef } from "../../hooks/use-stable-ref";
82
87
  import { useOnStructuredReferenceSelection } from "../../hooks/use-structured-reference-selection";
88
+ import { useTableHitZones } from "../../hooks/use-table-hit-zones";
83
89
  import { useTableResizer } from "../../hooks/use-table-resizer";
84
90
  import { useDelayedValue } from "../../hooks/use-delayed-value";
85
91
  import { useTooltip } from "../../hooks/use-tooltip";
@@ -91,6 +97,9 @@ import { fillRangeForSeriesSpec, seedRangeForSeriesSpec } from "../../api/fill-s
91
97
  import { Cell as DefaultCell } from "../cell";
92
98
  import { CellEditor as DefaultCellEditor } from "../cell-editor";
93
99
  import { ContextMenu as DefaultContextMenu } from "../context-menu";
100
+ import { ContextMenuDropdown } from "../context-menu/menu";
101
+ import { StyledContextMenuWrapper } from "../context-menu/style";
102
+ import { TotalRowFunctionMenuItems } from "../context-menu/total-row-function-menu";
94
103
  import { FillHandle } from "../fill-handle";
95
104
  import { FilterBox as DefaultFilterBox } from "../filter-box";
96
105
  import { HeaderCell as DefaultHeaderCell } from "../header-cell";
@@ -105,8 +114,10 @@ import { getNestedPropertyNames } from "./helpers";
105
114
  * @param CanvasGridMethods
106
115
  * @returns
107
116
  */
117
+ /** Where the grid focuses when no cell is given (A1); mirrors spreadsheet-state's `defaultCellCoords` without importing it — that package depends on this one. */
118
+ const defaultCellCoords = { rowIndex: 1, columnIndex: 1 };
108
119
  function CanvasGridComponent(props, forwardedRef) {
109
- const { licenseKey, sheetId, instanceId, activeCell = DEFAULT_ACTIVE_CELL, selections = DEFAULT_ARRAY, frozenColumnCount = 0, frozenRowCount = 0, rowCount = DEFAULT_ROW_COUNT, columnCount = DEFAULT_COLUMN_COUNT, autoFocus, basicFilter, tables, namedRanges, bandedRanges = DEFAULT_ARRAY, tableBorderColor = "#008000", filterIconColor = "#008000", conditionalFormats, showFilterIcon = true, showCalculatedColumnIcon = true, showHeaders = true, defaultColumnWidth = DEFAULT_COLUMN_WIDTH, defaultRowHeight = DEFAULT_ROW_HEIGHT, columnHeaderHeight = COLUMN_HEADER_HEIGHT, rowHeaderWidth = ROW_HEADER_WIDTH, gridLineColor = GRIDLINE_COLOR, cellBackgroundColor = DEFAULT_CELL_BACKGROUND_COLOR, cellColor = DEFAULT_CELL_COLOR, headerBorderColor = DEFAULT_HEADER_BORDER_COLOR, headerBackgroundColor = DEFAULT_HEADER_BG, headerColor = DEFAULT_HEADER_COLOR, headerActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_BG, headerSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_BG, headerSelectedColor = "white", headerTableBackgroundColor = DEFAULT_HEADER_TABLE_BG, headerTableActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_TABLE_BG, headerTableSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_TABLE_BG, frozenShadowColor = headerBorderColor, frozenShadowThickness = 1, selectionBackgroundColor = SELECTION_BG, selectionBorderColor = SELECTION_BORDER, selectionDragBorderColor = SELECTION_BORDER, chartSelectedColor, chipBackgroundColor = CHIP_COLOR, merges = DEFAULT_ARRAY, borderStyles, protectedRanges, isWorkbookProtected: isWorkbookProtectedProp = false, getSheetProtection, pivotTables, charts, embeds, slicers, rowMetadata = DEFAULT_ARRAY, columnMetadata = DEFAULT_ARRAY, scale = 1, zoomSpeed = 1, overscanCount = 3, enableEditOnEnterKey = true, enableTextOverflow = true, showGridLines: _showGridLines, showFormulas = false, protectFormulas = false, showFrozenSeparator = true, HeaderCell = DefaultHeaderCell, Cell = DefaultCell, SelectionTitleComponent = SelectionTitle, CellEditor = DefaultCellEditor, CellTooltip, ContextMenu = DefaultContextMenu, ContextMenuWrapper = DefaultContextMenuWrapper, FilterBox = DefaultFilterBox, HeaderMoveDragComponent = DefaultHeaderMoveDragComponent, SuggestionsDropdown, stickyEditor = true, scrollSnap = false, scrollThrottleTimeout, preventBrowserDefaultScroll, mouseMoveThrottleTimeout = 60, tooltipIntentInterval = 60, selectionPolicy, users, userId, renderCollaboratorCursor, functionDescriptions, showHeaderMenuButton = true, scrollbarSize = SCROLLBAR_SIZE, theme = defaultSpreadsheetTheme, showNotes = true, showComments = true, locale, formulaLocale: formulaLocaleProp, agentSuggestions, onReviewSuggestion, onShowFormulas, getDataRowCount, getChartComponent, getEmbedComponent, getSlicerComponent, onChange, onChangeBatch, onExpandCollapse, onPivotDrillDown, onDelete, onChangeEditorValue, onFill, onRequestCalculate, onChangeActiveCell, onChangeActiveSheet, onChangeSelections, getSheetName, getSheetId, getCellData, getNote: getNoteProp, getTextFormatRuns, getDataValidation, getEffectiveFormat, getFormattedValue: getFormattedValueProp, getTooltipContent, errorResolutionComponent, getEffectiveValue: getEffectiveValueProp, getUserEnteredExtendedValue, getEffectiveExtendedValue, getSheetRowCount, getSheetColumnCount, getCellPopoverContent, onScroll, onViewPortChange, windowConditionalFormats = false, engineConditionalFormatResults = false, onResize, onAutoResize, onHideColumn, onHideRow, onShowColumn, onShowRow, onGroupRows, onUngroupRows, onCollapseRowGroup, onExpandRowGroup, onGroupColumns, onUngroupColumns, onCollapseColumnGroup, onExpandColumnGroup, onSetOutlineDepth, onDeleteRow, onDeleteColumn, onInsertRow, onInsertColumn, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onClearContents, onMoveColumns, onMoveRows, onSelectNextSheet, onSelectPreviousSheet, onCreateNewSheet, onKeyDown, onChangeFormatting, onRepeatFormatting, onClearFormatting, onRequestEditProtectedRange, onMoveChart, onResizeChart, onDeleteChart, onMoveEmbed, onResizeEmbed, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFillRange, disableFillRightShortcut, keymap, onCalculateNow, onRequestGoTo, onMoveSelection, onInsertCutCells, onInsertTime, onInsertDate, onInsertDateTime, onInsertAutoSum, onUndo, onRedo, onPaste, onCopy, onCut, onSortColumn, onSortTable, onFilterTable, onFilterPivot, onResizeTable, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onRemoveTable, onCreateTable, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onCreateBasicFilter, onRequestDefineNamedRange, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRequestInsertComment, onRequestInsertLink, onFreezeColumn, onFreezeRow, onUpdateNote, onProtectRange, onUnProtectRange, onSortRange, onRequestSearch, onRequestReplace, onRequestResize, getRowHeaderText = getDefaultRowHeader, getColumnHeaderText = getDefaultColumnHeader, getAdditionalCellSpacing, tokenizer: defaultTokenizer = defaultFormulaTokenizer, onChangeScale, onRemoveLink, onSelectLink, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onRequestExpand, cellExpandPredicate, StructuredResult = DefaultStructuredResult, getMentions, getStructuredProperties: getStructuredPropertiesProp, getFunctionParameterSuggestions, shouldFetchFunctionParameters, MentionTagComponent, MentionDropdownItemComponent, showSelectionResizeHandles = true, enableMagicFill, enableQuickEdit = true, MagicFillComponent, MagicFillContent, QuickEdit, PasteMenu, SuggestionAction, HiddenRowMarkers, HiddenColumnMarkers, enableResizerOverflow, className, defaultFontSizePoint = DEFAULT_FONT_SIZE_PT, readonly, isComparing = false, getCellDiff, enableDataBoundaryNavigation, footerHeight, footerComponent, arrowComponents,
120
+ const { licenseKey, sheetId, sheetType, ChartSheetView: ChartSheetViewComponent = ChartSheetView, instanceId, activeCell = DEFAULT_ACTIVE_CELL, selections = DEFAULT_ARRAY, frozenColumnCount = 0, frozenRowCount = 0, rowCount = DEFAULT_ROW_COUNT, columnCount = DEFAULT_COLUMN_COUNT, autoFocus, basicFilter, tables, namedRanges, bandedRanges = DEFAULT_ARRAY, tableBorderColor = "#008000", filterIconColor = "#008000", conditionalFormats, showFilterIcon = true, showCalculatedColumnIcon = true, showHeaders = true, defaultColumnWidth = DEFAULT_COLUMN_WIDTH, defaultRowHeight = DEFAULT_ROW_HEIGHT, columnHeaderHeight = COLUMN_HEADER_HEIGHT, rowHeaderWidth = ROW_HEADER_WIDTH, gridLineColor = GRIDLINE_COLOR, cellBackgroundColor = DEFAULT_CELL_BACKGROUND_COLOR, cellColor = DEFAULT_CELL_COLOR, headerBorderColor = DEFAULT_HEADER_BORDER_COLOR, headerBackgroundColor = DEFAULT_HEADER_BG, headerColor = DEFAULT_HEADER_COLOR, headerActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_BG, headerSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_BG, headerSelectedColor = "white", headerTableBackgroundColor = DEFAULT_HEADER_TABLE_BG, headerTableActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_TABLE_BG, headerTableSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_TABLE_BG, frozenShadowColor = headerBorderColor, frozenShadowThickness = 1, selectionBackgroundColor = SELECTION_BG, selectionBorderColor = SELECTION_BORDER, selectionDragBorderColor = SELECTION_BORDER, chartSelectedColor, chipBackgroundColor = CHIP_COLOR, merges = DEFAULT_ARRAY, borderStyles, protectedRanges, isWorkbookProtected: isWorkbookProtectedProp = false, getSheetProtection, pivotTables, charts, onUpdateChart, onChangeZOrder, embeds, slicers, rowMetadata = DEFAULT_ARRAY, columnMetadata = DEFAULT_ARRAY, scale = 1, zoomSpeed = 1, overscanCount = 3, enableEditOnEnterKey = true, enableTextOverflow = true, showGridLines: _showGridLines, showFormulas = false, protectFormulas = false, showFrozenSeparator = true, HeaderCell = DefaultHeaderCell, Cell = DefaultCell, SelectionTitleComponent = SelectionTitle, CellEditor = DefaultCellEditor, CellTooltip, ContextMenu = DefaultContextMenu, ContextMenuWrapper = DefaultContextMenuWrapper, FilterBox = DefaultFilterBox, HeaderMoveDragComponent = DefaultHeaderMoveDragComponent, SuggestionsDropdown, stickyEditor = true, scrollSnap = false, scrollThrottleTimeout, preventBrowserDefaultScroll, mouseMoveThrottleTimeout = 60, tooltipIntentInterval = 60, selectionPolicy, users, userId, renderCollaboratorCursor, functionDescriptions, showHeaderMenuButton = true, scrollbarSize = SCROLLBAR_SIZE, theme = defaultSpreadsheetTheme, showNotes = true, showComments = true, locale, formulaLocale: formulaLocaleProp, agentSuggestions, onReviewSuggestion, onShowFormulas, getDataRowCount, getChartComponent, getEmbedComponent, getSlicerComponent, onChange, onChangeBatch, onExpandCollapse, onPivotDrillDown, onDelete, onChangeEditorValue, onFill, onRequestCalculate, onChangeActiveCell, onChangeActiveSheet, onChangeSelections, getSheetName, getSheetId, getCellData, getNote: getNoteProp, getTextFormatRuns, getDataValidation, getEffectiveFormat, getFormattedValue: getFormattedValueProp, getTooltipContent, errorResolutionComponent, getEffectiveValue: getEffectiveValueProp, getSparklineGroup, getUserEnteredExtendedValue, getEffectiveExtendedValue, getSheetRowCount, getSheetColumnCount, getCellPopoverContent, onScroll, onViewPortChange, windowConditionalFormats = false, engineConditionalFormatResults = false, onResize, onAutoResize, onHideColumn, onHideRow, onShowColumn, onShowRow, onGroupRows, onUngroupRows, onCollapseRowGroup, onExpandRowGroup, onGroupColumns, onUngroupColumns, onCollapseColumnGroup, onExpandColumnGroup, onSetOutlineDepth, onDeleteRow, onDeleteColumn, onInsertRow, onInsertColumn, onChangeAutoExpandTables, onChangeAutoCalculatedColumns, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onClearContents, onMoveColumns, onMoveRows, onSelectNextSheet, onSelectPreviousSheet, onCreateNewSheet, onKeyDown, onChangeFormatting, onRepeatFormatting, onClearFormatting, onRequestEditProtectedRange, onMoveChart, onResizeChart, onDeleteChart, onCutChart, onCopyChart, onMoveEmbed, onResizeEmbed, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFillRange, disableFillRightShortcut, keymap, onCalculateNow, onRequestGoTo, onMoveSelection, onInsertCutCells, onInsertTime, onInsertDate, onInsertDateTime, onInsertAutoSum, onUndo, onRedo, onPaste, onCopy, onCut, onSortColumn, onSortTable, onFilterTable, onFilterPivot, onResizeTable, onUndoTableAutoExpansion, onUndoCalculatedColumn, onOverwriteCalculatedColumn, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onRequestCreatePivotChart, onRemoveTable, onCreateTable, onRequestCreateTable, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onUpdateTable, onRequestResizeTable, onRequestInsertSlicer, onCreateBasicFilter, onRequestDefineNamedRange, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRequestInsertComment, onRequestInsertLink, onFreezeColumn, onFreezeRow, onUpdateNote, onProtectRange, onUnProtectRange, onSortRange, onRequestSearch, onRequestReplace, onRequestResize, getRowHeaderText = getDefaultRowHeader, getColumnHeaderText = getDefaultColumnHeader, getAdditionalCellSpacing, tokenizer: defaultTokenizer = defaultFormulaTokenizer, onChangeScale, onRemoveLink, onSelectLink, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onRequestExpand, cellExpandPredicate, StructuredResult = DefaultStructuredResult, getMentions, getStructuredProperties: getStructuredPropertiesProp, getFunctionParameterSuggestions, shouldFetchFunctionParameters, MentionTagComponent, MentionDropdownItemComponent, showSelectionResizeHandles = true, enableMagicFill, enableQuickEdit = true, MagicFillComponent, MagicFillContent, QuickEdit, PasteMenu, SuggestionAction, HiddenRowMarkers, HiddenColumnMarkers, enableResizerOverflow, className, defaultFontSizePoint = DEFAULT_FONT_SIZE_PT, readonly, isComparing = false, getCellDiff, enableDataBoundaryNavigation, footerHeight, footerComponent, arrowComponents,
110
121
  // Host-driven filter props. `hostHiddenRowRanges`
111
122
  // supplies compact [start, end] hidden-row tuples; `getFilterValues` supplies a
112
123
  // column's distinct values. Both let a million-row filter render without scanning
@@ -197,6 +208,8 @@ function CanvasGridComponent(props, forwardedRef) {
197
208
  // Auto Fill Options smart tag / right-drag fill menu + Series dialog
198
209
  const [fillOptions, setFillOptions] = useFillOptionsState();
199
210
  const [insertOptions, setInsertOptions] = useInsertOptionsState();
211
+ const [tableAutoExpansion, setTableAutoExpansion] = useTableAutoExpansionState();
212
+ const [calculatedColumnFill, setCalculatedColumnFill] = useCalculatedColumnFillState();
200
213
  const openFillSeriesDialog = useOpenFillSeriesDialog();
201
214
  // Shared state
202
215
  const formulaMode = useFormulaModeValue();
@@ -502,6 +515,11 @@ function CanvasGridComponent(props, forwardedRef) {
502
515
  const tableHeaderCells = useMemo(() => {
503
516
  return getTableHeaderCells(activeTables, basicFilter);
504
517
  }, [activeTables, basicFilter]);
518
+ /** A cell on a table's totals row (its in-cell arrow opens the function picker). */
519
+ const isTableTotalsCell = useCallback((rowIndex, columnIndex) => !!activeTables?.some((table) => table.totalRow &&
520
+ rowIndex === table.range.endRowIndex &&
521
+ columnIndex >= table.range.startColumnIndex &&
522
+ columnIndex <= table.range.endColumnIndex), [activeTables]);
505
523
  /**
506
524
  * Retrieve banded cells
507
525
  */
@@ -528,6 +546,13 @@ function CanvasGridComponent(props, forwardedRef) {
528
546
  lastScheduledScrollRef.current = Date.now();
529
547
  gridRef.current?.scrollToCell(cell, align);
530
548
  }, []);
549
+ // Excel scrolls to a chart / picture it has just inserted or restored.
550
+ const scrollToChart = useRevealChartEmbed({
551
+ charts,
552
+ embeds,
553
+ sheetId,
554
+ scrollToCell,
555
+ });
531
556
  /**
532
557
  * Scroll to bottom of the sheet
533
558
  */
@@ -660,10 +685,13 @@ function CanvasGridComponent(props, forwardedRef) {
660
685
  // user gesture on the grid focuses the tabIndex=0 container first, so
661
686
  // this only suppresses render-driven refocus; a null container ref
662
687
  // (mid mount/unmount) falls through to the original focus behavior.
663
- const activeElement = canUseDOM ? document.activeElement : null;
688
+ // The grid may render into a popout window: read focus from its own
689
+ // document, never from the bundle's global one.
690
+ const ownerDocument = getOwnerDocument(gridContainerRef.current);
691
+ const activeElement = ownerDocument?.activeElement ?? null;
664
692
  const gridContainer = gridContainerRef.current;
665
693
  if (activeElement &&
666
- activeElement !== document.body &&
694
+ activeElement !== ownerDocument?.body &&
667
695
  gridContainer &&
668
696
  !gridContainer.contains(activeElement)) {
669
697
  return;
@@ -689,7 +717,13 @@ function CanvasGridComponent(props, forwardedRef) {
689
717
  * position offset
690
718
  */
691
719
  const getRelativePositionFromOffset = useCallback((x, y) => {
692
- return gridRef.current?.getRelativePositionFromOffset(x, y);
720
+ const grid = gridRef.current;
721
+ if (grid) {
722
+ return grid.getRelativePositionFromOffset(x, y);
723
+ }
724
+ // A chartsheet mounts no grid; overlays position against the wrapper itself.
725
+ const rect = gridContainerRef.current?.getBoundingClientRect();
726
+ return rect ? { x: x - rect.left, y: y - rect.top } : undefined;
693
727
  }, []);
694
728
  /**
695
729
  * Get scroll position
@@ -1112,10 +1146,11 @@ function CanvasGridComponent(props, forwardedRef) {
1112
1146
  // time — `uf.textFormat.underline` is merged on top below, so a user
1113
1147
  // who explicitly sets underline=false still wins.
1114
1148
  const defaultTextFormat = {
1115
- bold: isTableHeader(rowIndex, columnIndex) &&
1116
- isTableHeaderThemed(rowIndex, columnIndex)
1117
- ? true
1118
- : undefined,
1149
+ bold: bandedCellFormat?.textFormat?.bold ??
1150
+ (isTableHeader(rowIndex, columnIndex) &&
1151
+ isTableHeaderThemed(rowIndex, columnIndex)
1152
+ ? true
1153
+ : undefined),
1119
1154
  fontFamily: theme.primaryFontFamily,
1120
1155
  color: isHyperlink
1121
1156
  ? theme.themeColors.hyperlink
@@ -1736,7 +1771,8 @@ function CanvasGridComponent(props, forwardedRef) {
1736
1771
  /* Data validation arrow */
1737
1772
  const dataValidation = getDataValidationRule(sheetId, rowIndex, columnIndex);
1738
1773
  const additionalCellSpacing = getAdditionalCellSpacing?.(sheetId, rowIndex, columnIndex) ?? 0;
1739
- const showArrow = showValidationDropdownArrow(dataValidation);
1774
+ const showArrow = showValidationDropdownArrow(dataValidation) ||
1775
+ isTableTotalsCell(rowIndex, columnIndex);
1740
1776
  const showChip = getCellMetaType(sheetId, rowIndex, columnIndex) === "people";
1741
1777
  const [expandable] = getCellGroupingInfo(sheetId, rowIndex, columnIndex);
1742
1778
  const iconSpacing = DEFAULT_CELL_SPACING;
@@ -1786,6 +1822,7 @@ function CanvasGridComponent(props, forwardedRef) {
1786
1822
  getCellGroupingInfo,
1787
1823
  getAdditionalCellSpacing,
1788
1824
  getEffectiveCellFormat,
1825
+ isTableTotalsCell,
1789
1826
  ]);
1790
1827
  /**
1791
1828
  * Column resizer
@@ -1834,7 +1871,13 @@ function CanvasGridComponent(props, forwardedRef) {
1834
1871
  sheetId,
1835
1872
  ]);
1836
1873
  /* Check if sheet is focused */
1837
- const isSheetFocused = useCallback(() => canUseDOM ? document.activeElement === cellEditorInstance?.el() : false, [cellEditorInstance]);
1874
+ const isSheetFocused = useCallback(() => {
1875
+ const editorElement = cellEditorInstance?.el();
1876
+ if (!editorElement) {
1877
+ return false;
1878
+ }
1879
+ return getOwnerDocument(editorElement)?.activeElement === editorElement;
1880
+ }, [cellEditorInstance]);
1838
1881
  /**
1839
1882
  * Get Cell Editor
1840
1883
  */
@@ -2112,6 +2155,101 @@ function CanvasGridComponent(props, forwardedRef) {
2112
2155
  useEffect(() => {
2113
2156
  setInsertOptions(null);
2114
2157
  }, [activeCell.rowIndex, activeCell.columnIndex, sheetId, setInsertOptions]);
2158
+ /**
2159
+ * Excel's AutoCorrect smart tag after a table auto-expanded. "Undo Table
2160
+ * AutoExpansion" resizes the table back to its pre-growth range and clears
2161
+ * what the growth wrote (calculated-column formulas, generated headers,
2162
+ * inherited formats) in one undo step — the user's own value stays, like
2163
+ * Excel; "Stop Automatically Expanding Tables" hands the option to the host.
2164
+ */
2165
+ const handleChooseTableAutoExpansionOption = useCallback((option) => {
2166
+ if (!tableAutoExpansion)
2167
+ return;
2168
+ if (option === "undo") {
2169
+ if (onUndoTableAutoExpansion) {
2170
+ onUndoTableAutoExpansion(tableAutoExpansion);
2171
+ }
2172
+ else {
2173
+ const table = tables?.find((candidate) => candidate.id === tableAutoExpansion.tableId &&
2174
+ candidate.sheetId === tableAutoExpansion.sheetId);
2175
+ if (table) {
2176
+ onResizeTable?.(tableAutoExpansion.sheetId, table, tableAutoExpansion.previousRange);
2177
+ }
2178
+ }
2179
+ }
2180
+ else {
2181
+ onChangeAutoExpandTables?.(false);
2182
+ }
2183
+ setTableAutoExpansion(null);
2184
+ focusSheet();
2185
+ }, [
2186
+ tableAutoExpansion,
2187
+ tables,
2188
+ onResizeTable,
2189
+ onUndoTableAutoExpansion,
2190
+ onChangeAutoExpandTables,
2191
+ setTableAutoExpansion,
2192
+ focusSheet,
2193
+ ]);
2194
+ // The tag survives the commit's own cursor advance (Enter / Tab) and any cell
2195
+ // of the grown table; moving anywhere else, or switching sheet, drops it.
2196
+ useEffect(() => {
2197
+ if (tableAutoExpansion &&
2198
+ !keepsTableAutoExpansionTag(tableAutoExpansion, sheetId, activeCell)) {
2199
+ setTableAutoExpansion(null);
2200
+ }
2201
+ }, [
2202
+ tableAutoExpansion,
2203
+ activeCell.rowIndex,
2204
+ activeCell.columnIndex,
2205
+ activeCell,
2206
+ sheetId,
2207
+ setTableAutoExpansion,
2208
+ ]);
2209
+ /**
2210
+ * Excel's AutoCorrect smart tag after a formula typed into a table column.
2211
+ * "Undo Calculated Column" reverts the fill alone (the typed cell keeps its
2212
+ * formula); "Overwrite all cells in this column with this formula" fills the
2213
+ * column over the cells that kept it from filling; "Stop automatically
2214
+ * creating calculated columns" hands the option to the host.
2215
+ */
2216
+ const handleChooseCalculatedColumnOption = useCallback((option) => {
2217
+ if (!calculatedColumnFill)
2218
+ return;
2219
+ if (option === "undo") {
2220
+ onUndoCalculatedColumn?.(calculatedColumnFill);
2221
+ }
2222
+ else if (option === "overwrite") {
2223
+ onOverwriteCalculatedColumn?.(calculatedColumnFill);
2224
+ }
2225
+ else {
2226
+ onChangeAutoCalculatedColumns?.(false);
2227
+ }
2228
+ setCalculatedColumnFill(null);
2229
+ focusSheet();
2230
+ }, [
2231
+ calculatedColumnFill,
2232
+ onUndoCalculatedColumn,
2233
+ onOverwriteCalculatedColumn,
2234
+ onChangeAutoCalculatedColumns,
2235
+ setCalculatedColumnFill,
2236
+ focusSheet,
2237
+ ]);
2238
+ // The tag survives the commit's own cursor advance and any cell of the
2239
+ // column; moving anywhere else, or switching sheet, drops it.
2240
+ useEffect(() => {
2241
+ if (calculatedColumnFill &&
2242
+ !keepsCalculatedColumnTag(calculatedColumnFill, sheetId, activeCell)) {
2243
+ setCalculatedColumnFill(null);
2244
+ }
2245
+ }, [
2246
+ calculatedColumnFill,
2247
+ activeCell.rowIndex,
2248
+ activeCell.columnIndex,
2249
+ activeCell,
2250
+ sheetId,
2251
+ setCalculatedColumnFill,
2252
+ ]);
2115
2253
  /**
2116
2254
  * Run Excel's Series dialog result: the target range's first row (Series
2117
2255
  * in Columns) / first column (Rows) is the seed line; `stop` may shrink or
@@ -2241,6 +2379,8 @@ function CanvasGridComponent(props, forwardedRef) {
2241
2379
  isColumnHeader,
2242
2380
  isTouchDevice,
2243
2381
  dataRegionBoundaries,
2382
+ tables,
2383
+ onInsertTableRow,
2244
2384
  });
2245
2385
  /**
2246
2386
  * Copy, Paste and Cut hook
@@ -2254,6 +2394,37 @@ function CanvasGridComponent(props, forwardedRef) {
2254
2394
  onCopy,
2255
2395
  onCut,
2256
2396
  });
2397
+ /**
2398
+ * Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+D on a selected chart. The focused chart is
2399
+ * the target of those events (see `EmbedDraggable`); a paste that lands in the
2400
+ * cell editor while a chart is on the clipboard is claimed here first.
2401
+ */
2402
+ const chartClipboard = useChartClipboard({
2403
+ sheetId,
2404
+ activeCell,
2405
+ charts,
2406
+ readonly,
2407
+ onCreateChart,
2408
+ onDeleteChart,
2409
+ onCopyChart,
2410
+ onCutChart,
2411
+ focusSheet,
2412
+ });
2413
+ const { copyChart, cutChart, pasteChart, duplicateChart, clearChartClipboard } = chartClipboard;
2414
+ const handleEditorCopy = useCallback((e) => {
2415
+ clearChartClipboard();
2416
+ onInternalCopy(e);
2417
+ }, [clearChartClipboard, onInternalCopy]);
2418
+ const handleEditorCut = useCallback((e) => {
2419
+ clearChartClipboard();
2420
+ onInternalCut(e);
2421
+ }, [clearChartClipboard, onInternalCut]);
2422
+ const handleEditorPaste = useCallback((e) => {
2423
+ if (pasteChart(e)) {
2424
+ return;
2425
+ }
2426
+ onInternalPaste(e);
2427
+ }, [pasteChart, onInternalPaste]);
2257
2428
  /**
2258
2429
  * Context menu "Insert Cut Cells" (Excel: Ctrl+X, right-click the destination). A cut of
2259
2430
  * whole rows / columns dropped on a row / column header inserts them BEFORE the clicked
@@ -2490,14 +2661,18 @@ function CanvasGridComponent(props, forwardedRef) {
2490
2661
  });
2491
2662
  /**
2492
2663
  * Get bounds of chart overlay
2493
- * Within the grid body
2664
+ * Within the grid body: from the first cell's top-left corner to the last
2665
+ * row's bottom edge and last column's right edge, so an object can never be
2666
+ * dragged or resized past the sheet (Excel snaps it back inside).
2494
2667
  */
2495
2668
  const getChartBounds = useCallback(() => {
2496
2669
  return {
2497
2670
  left: getColumnOffset(1),
2498
2671
  top: getRowOffset(1),
2672
+ right: getColumnOffset(columnCount + 1),
2673
+ bottom: getRowOffset(rowCount + 1),
2499
2674
  };
2500
- }, [getRowOffset, getColumnOffset]);
2675
+ }, [getRowOffset, getColumnOffset, rowCount, columnCount]);
2501
2676
  // Show notes editor
2502
2677
  const onInsertNote = useCallback((sheetId, cell) => {
2503
2678
  setNoteEditorCell({
@@ -2542,11 +2717,38 @@ function CanvasGridComponent(props, forwardedRef) {
2542
2717
  });
2543
2718
  focusSheet();
2544
2719
  }, [setQuickEditState, enableQuickEdit, focusSheet]);
2720
+ /**
2721
+ * Opens the cell editor pre-filled (the totals row's "More Functions…").
2722
+ * `editCell` comes from `useEditable` below; this stable wrapper lets the
2723
+ * context menu reach it.
2724
+ */
2725
+ const requestEditCell = useCallbackRef((targetSheetId, cell, initialValue) => editCell(targetSheetId, cell, initialValue));
2726
+ /**
2727
+ * The context menu's table Select items: replace the selection with a
2728
+ * range and park the active cell at its top-left, without scrolling.
2729
+ */
2730
+ const selectRangeFromMenu = useCallback((targetSheetId, range) => {
2731
+ setActiveCell(targetSheetId, { rowIndex: range.startRowIndex, columnIndex: range.startColumnIndex }, false);
2732
+ onChangeSelections?.(targetSheetId, [{ range }]);
2733
+ }, [setActiveCell, onChangeSelections]);
2734
+ // Excel's table hit zones (header top edge / corner / row left edge).
2735
+ const { cursor: tableHitCursor, onMouseMove: onMouseMoveTableHitZones, onMouseDown: onMouseDownTableHitZones, clearHitZone: clearTableHitZone, } = useTableHitZones({
2736
+ sheetId,
2737
+ tables: activeTables,
2738
+ selections,
2739
+ frozenRows,
2740
+ frozenColumns,
2741
+ getCellCoordsFromOffset,
2742
+ getRelativePositionFromOffset,
2743
+ getCellOffsetFromCoords,
2744
+ getScrollPosition,
2745
+ onSelectRange: selectRangeFromMenu,
2746
+ });
2545
2747
  /**
2546
2748
  * Get context Menu component
2547
2749
  */
2548
2750
  const getContextMenu = useCallback((cell) => {
2549
- return (React.createElement(ContextMenu, { activeCell: activeCell, selections: selections, sheetId: sheetId, frozenRows: frozenRows, frozenColumns: frozenColumns, onHideColumn: isRestricted ? undefined : onHideColumn, onShowColumn: isRestricted ? undefined : onShowColumn, onShowRow: isRestricted ? undefined : onShowRow, onHideRow: isRestricted ? undefined : onHideRow, onGroupRows: isRestricted ? undefined : onGroupRows, onUngroupRows: isRestricted ? undefined : onUngroupRows, onGroupColumns: isRestricted ? undefined : onGroupColumns, onUngroupColumns: isRestricted ? undefined : onUngroupColumns, isHiddenColumn: isHiddenColumn, isHiddenRow: isHiddenRow, onDeleteColumn: onDeleteColumn, onDeleteRow: onDeleteRow, onInsertRow: insertRowWithOptions, onInsertColumn: insertColumnWithOptions, rowCount: rowCount, columnCount: columnCount, onInsertCellsShiftDown: onInsertCellsShiftDown, onInsertCellsShiftRight: onInsertCellsShiftRight, onDeleteCellsShiftLeft: onDeleteCellsShiftLeft, onDeleteCellsShiftUp: onDeleteCellsShiftUp, onClearContents: onClearContents, onFreezeColumn: onFreezeColumn, onFreezeRow: onFreezeRow, focusSheet: focusSheet, onSortColumn: onSortColumn, onInsertNote: onInsertNote, onProtectRange: onProtectRange, onUnProtectRange: onUnProtectRange, onSortRange: onSortRange, onRequestDefineNamedRange: onRequestDefineNamedRange, protectedRanges: protectedRanges, isRowHeader: isRowHeader(cell.columnIndex), isColumnHeader: isColumnHeader(cell.rowIndex), selectedRowHeadersIds: selectedRowHeadersIds, selectedColumnHeadersIds: selectedColumnHeadersIds, onCopy: copy, onCut: cut, hasCutSelection: isCutPending && copiedSheetId === sheetId, onInsertCutCells: insertCutCellsFromMenu, onPaste: paste, onRequestPasteSpecial: requestPasteSpecial, onRequestEvaluateFormula: requestEvaluateFormula, onRequestAddWatch: requestAddWatch, isActiveCellFormula: Boolean(getFormulaValue(sheetId, activeCell.rowIndex, activeCell.columnIndex)), onRequestResize: onRequestResize, isSheetFocused: isSheetFocused, tables: activeTables, pivotTables: pivotTables, basicFilter: basicFilter, onRequestEditTable: onRequestEditTable, onRequestEditPivotTable: onRequestEditPivotTable, onRemoveTable: onRemoveTable, onRequestDeletePivotTable: onRequestDeletePivotTable, onPivotDrillDown: onPivotDrillDown, onRequestFormatCells: onRequestFormatCells, onRequestConditionalFormat: onRequestConditionalFormat, onRequestDataValidation: onRequestDataValidation, onClearFormatting: onClearFormatting, onCreateTable: onCreateTable, onCreateBasicFilter: onCreateBasicFilter, onInsertTableColumn: onInsertTableColumn, onDeleteTableColumn: onDeleteTableColumn, onInsertTableRow: onInsertTableRow, onDeleteTableRow: onDeleteTableRow, onFilterTable: onFilterTable, onSortTable: onSortTable, getFormattedValue: getFormattedValue, getFormattedValuesFromRange: getFormattedValuesFromRange, isTableHeader: isTableHeader, readonly: readonly, onSplitTextToColumns: onSplitTextToColumns, onRemoveDuplicates: onRemoveDuplicates, onGoalSeek: onGoalSeek, onSubtotal: onSubtotal, onAdvancedFilter: onAdvancedFilter, onChange: onChange, getCellData: getCellData, onAddQuickEdit: onAddQuickEdit, enableMagicFill: enableMagicFill }));
2751
+ return (React.createElement(ContextMenu, { activeCell: activeCell, selections: selections, sheetId: sheetId, frozenRows: frozenRows, frozenColumns: frozenColumns, onHideColumn: isRestricted ? undefined : onHideColumn, onShowColumn: isRestricted ? undefined : onShowColumn, onShowRow: isRestricted ? undefined : onShowRow, onHideRow: isRestricted ? undefined : onHideRow, onGroupRows: isRestricted ? undefined : onGroupRows, onUngroupRows: isRestricted ? undefined : onUngroupRows, onGroupColumns: isRestricted ? undefined : onGroupColumns, onUngroupColumns: isRestricted ? undefined : onUngroupColumns, isHiddenColumn: isHiddenColumn, isHiddenRow: isHiddenRow, onDeleteColumn: onDeleteColumn, onDeleteRow: onDeleteRow, onInsertRow: insertRowWithOptions, onInsertColumn: insertColumnWithOptions, rowCount: rowCount, columnCount: columnCount, onInsertCellsShiftDown: onInsertCellsShiftDown, onInsertCellsShiftRight: onInsertCellsShiftRight, onDeleteCellsShiftLeft: onDeleteCellsShiftLeft, onDeleteCellsShiftUp: onDeleteCellsShiftUp, onClearContents: onClearContents, onFreezeColumn: onFreezeColumn, onFreezeRow: onFreezeRow, focusSheet: focusSheet, onSortColumn: onSortColumn, onInsertNote: onInsertNote, onProtectRange: onProtectRange, onUnProtectRange: onUnProtectRange, onSortRange: onSortRange, onRequestDefineNamedRange: onRequestDefineNamedRange, protectedRanges: protectedRanges, isRowHeader: isRowHeader(cell.columnIndex), isColumnHeader: isColumnHeader(cell.rowIndex), selectedRowHeadersIds: selectedRowHeadersIds, selectedColumnHeadersIds: selectedColumnHeadersIds, onCopy: copy, onCut: cut, hasCutSelection: isCutPending && copiedSheetId === sheetId, onInsertCutCells: insertCutCellsFromMenu, onPaste: paste, onRequestPasteSpecial: requestPasteSpecial, onRequestEvaluateFormula: requestEvaluateFormula, onRequestAddWatch: requestAddWatch, isActiveCellFormula: Boolean(getFormulaValue(sheetId, activeCell.rowIndex, activeCell.columnIndex)), onRequestResize: onRequestResize, isSheetFocused: isSheetFocused, tables: activeTables, pivotTables: pivotTables, basicFilter: basicFilter, onRequestEditTable: onRequestEditTable, onRequestResizeTable: onRequestResizeTable, onRequestInsertSlicer: onRequestInsertSlicer, onRequestEditPivotTable: onRequestEditPivotTable, onRemoveTable: onRemoveTable, onRequestDeletePivotTable: onRequestDeletePivotTable, onRequestCreatePivotChart: onRequestCreatePivotChart, onPivotDrillDown: onPivotDrillDown, onRequestFormatCells: onRequestFormatCells, onRequestConditionalFormat: onRequestConditionalFormat, onRequestDataValidation: onRequestDataValidation, onClearFormatting: onClearFormatting, onCreateTable: onCreateTable, onRequestCreateTable: onRequestCreateTable, onCreateBasicFilter: onCreateBasicFilter, onInsertTableColumn: onInsertTableColumn, onDeleteTableColumn: onDeleteTableColumn, onInsertTableRow: onInsertTableRow, onDeleteTableRow: onDeleteTableRow, onUpdateTable: onUpdateTable, onRequestEditCell: requestEditCell, onSelectRange: selectRangeFromMenu, onFilterTable: onFilterTable, onSortTable: onSortTable, getFormattedValue: getFormattedValue, getFormattedValuesFromRange: getFormattedValuesFromRange, isTableHeader: isTableHeader, readonly: readonly, onSplitTextToColumns: onSplitTextToColumns, onRemoveDuplicates: onRemoveDuplicates, onGoalSeek: onGoalSeek, onSubtotal: onSubtotal, onAdvancedFilter: onAdvancedFilter, onChange: onChange, getCellData: getCellData, onAddQuickEdit: onAddQuickEdit, enableMagicFill: enableMagicFill }));
2550
2752
  }, [
2551
2753
  isRestricted,
2552
2754
  activeCell,
@@ -2597,6 +2799,8 @@ function CanvasGridComponent(props, forwardedRef) {
2597
2799
  onFilterTable,
2598
2800
  onSortTable,
2599
2801
  onRequestEditTable,
2802
+ onRequestResizeTable,
2803
+ onRequestInsertSlicer,
2600
2804
  onRequestEditPivotTable,
2601
2805
  onRemoveTable,
2602
2806
  onRequestFormatCells,
@@ -2605,8 +2809,12 @@ function CanvasGridComponent(props, forwardedRef) {
2605
2809
  onRequestDataValidation,
2606
2810
  onCreateBasicFilter,
2607
2811
  onCreateTable,
2812
+ onRequestCreateTable,
2608
2813
  onDeleteTableColumn,
2609
2814
  onInsertTableRow,
2815
+ onUpdateTable,
2816
+ requestEditCell,
2817
+ selectRangeFromMenu,
2610
2818
  getFormattedValue,
2611
2819
  getFormattedValuesFromRange,
2612
2820
  onInsertTableColumn,
@@ -2622,6 +2830,7 @@ function CanvasGridComponent(props, forwardedRef) {
2622
2830
  onChange,
2623
2831
  getCellData,
2624
2832
  onRequestDeletePivotTable,
2833
+ onRequestCreatePivotChart,
2625
2834
  isHiddenColumn,
2626
2835
  isHiddenRow,
2627
2836
  onShowColumn,
@@ -2685,6 +2894,7 @@ function CanvasGridComponent(props, forwardedRef) {
2685
2894
  onUndo,
2686
2895
  onRedo,
2687
2896
  onCreateTable,
2897
+ onRequestCreateTable,
2688
2898
  onCreateBasicFilter,
2689
2899
  clearCopiedSelections,
2690
2900
  onRequestSearch,
@@ -2771,9 +2981,11 @@ function CanvasGridComponent(props, forwardedRef) {
2771
2981
  scrollToCell,
2772
2982
  containerWidth: width,
2773
2983
  containerHeight: height,
2774
- onCopy: onInternalCopy,
2775
- onPaste: onInternalPaste,
2776
- onCut: onInternalCut,
2984
+ onCopy: handleEditorCopy,
2985
+ onPaste: handleEditorPaste,
2986
+ onCut: handleEditorCut,
2987
+ tables,
2988
+ onInsertTableRow,
2777
2989
  });
2778
2990
  /**
2779
2991
  * Move rows and columns
@@ -2916,7 +3128,7 @@ function CanvasGridComponent(props, forwardedRef) {
2916
3128
  /**
2917
3129
  * Displays resizable/draggable charts
2918
3130
  */
2919
- const { chartComponents, embedComponents, slicerComponents, onMouseDown: onMouseDownCharts, } = useEmbedsCharts({
3131
+ const { chartComponents, embedComponents, slicerComponents, contextMenuComponent: embedContextMenuComponent, onMouseDown: onMouseDownCharts, requestChartContextMenu, } = useEmbedsCharts({
2920
3132
  charts,
2921
3133
  embeds,
2922
3134
  slicers,
@@ -2927,14 +3139,20 @@ function CanvasGridComponent(props, forwardedRef) {
2927
3139
  getCellOffsetFromCoords,
2928
3140
  getAbsolutePositionFromOffset,
2929
3141
  getCellCoordsFromOffset,
3142
+ getRelativePositionFromOffset,
2930
3143
  getScrollPosition,
3144
+ ContextMenuWrapper,
3145
+ focusSheet,
2931
3146
  selectedColor: chartSelectedColor,
2932
3147
  onMoveChart,
2933
3148
  onResizeChart,
3149
+ chartClipboard,
2934
3150
  onMoveEmbed,
2935
3151
  onResizeEmbed,
2936
3152
  onDeleteEmbed,
2937
3153
  onDeleteChart,
3154
+ onUpdateChart,
3155
+ onChangeZOrder,
2938
3156
  onRequestEditEmbed,
2939
3157
  onMoveSlicer,
2940
3158
  onResizeSlicer,
@@ -3004,6 +3222,55 @@ function CanvasGridComponent(props, forwardedRef) {
3004
3222
  onExpandCollapse?.(sheetId, cell, groupKeys, newExpandedState, childrenCount);
3005
3223
  }
3006
3224
  }, [onExpandCollapse, getCellGroupKeys, getChildrenCount]);
3225
+ /**
3226
+ * The totals-function picker a totals cell's in-cell arrow opens (Excel):
3227
+ * anchored at the cell's bottom-right corner like the filter dropdown.
3228
+ */
3229
+ const [totalsPicker, setTotalsPicker] = useState(null);
3230
+ const closeTotalsPicker = useCallback(() => setTotalsPicker(null), []);
3231
+ const handleTotalsArrowClick = useCallback((cell) => {
3232
+ const table = activeTables?.find((candidate) => candidate.totalRow &&
3233
+ cell.rowIndex === candidate.range.endRowIndex &&
3234
+ isCellWithinBounds(cell, candidate.range));
3235
+ const cellPosition = getCellOffsetFromCoords(cell);
3236
+ const scrollPosition = getScrollPosition();
3237
+ if (!table || !cellPosition) {
3238
+ return;
3239
+ }
3240
+ const { x = 0, y = 0, width = 0, height = 0 } = cellPosition;
3241
+ const scrollX = isFrozenColumn(cell.columnIndex)
3242
+ ? 0
3243
+ : scrollPosition.scrollLeft;
3244
+ const scrollY = isFrozenRow(cell.rowIndex) ? 0 : scrollPosition.scrollTop;
3245
+ setActiveCell(sheetId, cell, false);
3246
+ setTotalsPicker({
3247
+ table,
3248
+ cell,
3249
+ left: x + width - scrollX,
3250
+ top: y + height - scrollY,
3251
+ });
3252
+ }, [
3253
+ activeTables,
3254
+ getCellOffsetFromCoords,
3255
+ getScrollPosition,
3256
+ isFrozenColumn,
3257
+ isFrozenRow,
3258
+ setActiveCell,
3259
+ sheetId,
3260
+ ]);
3261
+ const totalsPickerComponent = totalsPicker ? (React.createElement(StyledContextMenuWrapper, { style: {
3262
+ transform: `translate3d(${totalsPicker.left}px, ${totalsPicker.top}px, 0)`,
3263
+ } },
3264
+ React.createElement(ContextMenuDropdown, { isOpen: true, onOpenChange: (open) => {
3265
+ if (!open)
3266
+ closeTotalsPicker();
3267
+ } },
3268
+ React.createElement(DropdownMenuPortal, null,
3269
+ React.createElement(DropdownMenuContent, { align: "end", sideOffset: 0, onCloseAutoFocus: (event) => {
3270
+ event.preventDefault();
3271
+ focusSheet();
3272
+ }, onMouseMove: (e) => e.stopPropagation() },
3273
+ React.createElement(TotalRowFunctionMenuItems, { sheetId: sheetId, table: totalsPicker.table, cell: totalsPicker.cell, readonly: readonly, getCellData: getCellData, onChange: onChange, onClearContents: onClearContents, onUpdateTable: onUpdateTable, onRequestEditCell: requestEditCell })))))) : null;
3007
3274
  /**
3008
3275
  * Capture mouse move events
3009
3276
  */
@@ -3014,8 +3281,10 @@ function CanvasGridComponent(props, forwardedRef) {
3014
3281
  isDraggingHeader ||
3015
3282
  isSelectionInProgress ||
3016
3283
  isFilling) {
3284
+ clearTableHitZone();
3017
3285
  return;
3018
3286
  }
3287
+ onMouseMoveTableHitZones(e);
3019
3288
  const coords = getCellCoordsFromOffset(e.clientX, e.clientY);
3020
3289
  if (!coords || isEqualCells(hoveredCellRef.current, coords)) {
3021
3290
  return;
@@ -3029,6 +3298,8 @@ function CanvasGridComponent(props, forwardedRef) {
3029
3298
  isSelectionInProgress,
3030
3299
  isFilling,
3031
3300
  hoveredCellRef,
3301
+ onMouseMoveTableHitZones,
3302
+ clearTableHitZone,
3032
3303
  ]);
3033
3304
  // Mouse move throttler
3034
3305
  const mouseMoveThrottler = useCallbackRef(throttle(handleMouseMove, mouseMoveThrottleTimeout, {
@@ -3065,8 +3336,12 @@ function CanvasGridComponent(props, forwardedRef) {
3065
3336
  selectionMode: "append",
3066
3337
  }));
3067
3338
  }
3068
- // Pass it on to use selection hook
3069
- onMouseDownSelection(e);
3339
+ // A table hit zone (header edge / corner / row edge) selects the table
3340
+ // part instead of starting a cell selection.
3341
+ if (!onMouseDownTableHitZones(e)) {
3342
+ // Pass it on to use selection hook
3343
+ onMouseDownSelection(e);
3344
+ }
3070
3345
  // Charts
3071
3346
  onMouseDownCharts?.();
3072
3347
  /**
@@ -3078,6 +3353,7 @@ function CanvasGridComponent(props, forwardedRef) {
3078
3353
  }
3079
3354
  // Hide filter
3080
3355
  hideFilter();
3356
+ closeTotalsPicker();
3081
3357
  // Hide popover
3082
3358
  hideCellPopover();
3083
3359
  // Hide paste mnenu
@@ -3088,8 +3364,10 @@ function CanvasGridComponent(props, forwardedRef) {
3088
3364
  onUnpinTooltip();
3089
3365
  }, [
3090
3366
  onMouseDownSelection,
3367
+ onMouseDownTableHitZones,
3091
3368
  onRequestCloseContextMenu,
3092
3369
  hideFilter,
3370
+ closeTotalsPicker,
3093
3371
  onMouseDownCharts,
3094
3372
  formulaMode,
3095
3373
  setFormulaState,
@@ -3215,6 +3493,8 @@ function CanvasGridComponent(props, forwardedRef) {
3215
3493
  */
3216
3494
  const [cellBackgroundRenderer, cellRenderer, cellOverlayRenderer, headerCellRenderer,] = useCellRenderer({
3217
3495
  sheetId,
3496
+ isTableTotalsCell,
3497
+ onTotalsArrowClick: handleTotalsArrowClick,
3218
3498
  formulaLocale,
3219
3499
  showGridLines,
3220
3500
  scale,
@@ -3253,6 +3533,7 @@ function CanvasGridComponent(props, forwardedRef) {
3253
3533
  getNote,
3254
3534
  getComment,
3255
3535
  getEffectiveValue,
3536
+ getSparklineGroup,
3256
3537
  getFormattedValue,
3257
3538
  getCellImageUrl,
3258
3539
  getEffectiveCellFormat,
@@ -3324,6 +3605,20 @@ function CanvasGridComponent(props, forwardedRef) {
3324
3605
  scrollToCell,
3325
3606
  tokenizer: localeTokenizer,
3326
3607
  });
3608
+ /**
3609
+ * Selected chart: outline its source ranges on this sheet and re-bind
3610
+ * them when a corner handle is dragged (Excel's chart data highlight).
3611
+ */
3612
+ const { chartSourceBorderStyles, onMouseDownChartSourceResizeHandle } = useChartSourceRanges({
3613
+ charts,
3614
+ sheetId,
3615
+ getSheetName,
3616
+ readonly,
3617
+ onUpdateChart,
3618
+ getCellBounds,
3619
+ getCellCoordsFromOffset,
3620
+ scrollToCell,
3621
+ });
3327
3622
  /**
3328
3623
  * Hide fill handle
3329
3624
  * 1. When user is in edit mode
@@ -3356,6 +3651,7 @@ function CanvasGridComponent(props, forwardedRef) {
3356
3651
  isFillShrink: fillShrink !== undefined,
3357
3652
  onSelectionMouseDown: onSelectionElementMouseDown,
3358
3653
  onMouseDownResizeHandle: onMouseDownResizeHandle,
3654
+ onMouseDownChartSourceResizeHandle,
3359
3655
  onMouseDownMoveSelection: onMouseDownMoveSelection,
3360
3656
  isDraggingMoveSelection: isDraggingMoveSelection,
3361
3657
  onChangeActiveCell,
@@ -3388,6 +3684,12 @@ function CanvasGridComponent(props, forwardedRef) {
3388
3684
  onCloseFillOptions: handleCloseFillOptions,
3389
3685
  insertOptions,
3390
3686
  onChooseInsertOption: handleChooseInsertOption,
3687
+ tableAutoExpansion,
3688
+ canStopAutoExpandingTables: !!onChangeAutoExpandTables,
3689
+ onChooseTableAutoExpansionOption: handleChooseTableAutoExpansionOption,
3690
+ calculatedColumnFill,
3691
+ canStopAutoCalculatedColumns: !!onChangeAutoCalculatedColumns,
3692
+ onChooseCalculatedColumnOption: handleChooseCalculatedColumnOption,
3391
3693
  hoveredCell: delayedHoveredCell,
3392
3694
  onRemoveQuickEdit,
3393
3695
  onAddQuickEdit,
@@ -3422,6 +3724,10 @@ function CanvasGridComponent(props, forwardedRef) {
3422
3724
  agentSuggestions,
3423
3725
  quickEditValues,
3424
3726
  });
3727
+ // A selected chart's source outlines draw on top of the other range borders.
3728
+ const gridBorderStyles = useMemo(() => chartSourceBorderStyles.length
3729
+ ? [...finalBorderStyles, ...chartSourceBorderStyles]
3730
+ : finalBorderStyles, [finalBorderStyles, chartSourceBorderStyles]);
3425
3731
  // Hidden column markers
3426
3732
  const [hiddenColumnMarkers, frozenHiddenColumnMarkers, hiddenRowMarkers, frozenHiddenRowMarkers,] = useHiddenDimensionMarkers({
3427
3733
  sheetId,
@@ -3549,6 +3855,7 @@ function CanvasGridComponent(props, forwardedRef) {
3549
3855
  getNextFocusableCell,
3550
3856
  onEditorKeyDown,
3551
3857
  scrollToCell,
3858
+ scrollToChart,
3552
3859
  scrollToBottom,
3553
3860
  focusSheet,
3554
3861
  canEditCell,
@@ -3692,7 +3999,7 @@ function CanvasGridComponent(props, forwardedRef) {
3692
3999
  // Keep focus back on sheet
3693
4000
  // Check if user is focused on the context menu
3694
4001
  if (canUseDOM &&
3695
- document.activeElement?.getAttribute("role") !== "menu") {
4002
+ getOwnerDocument(gridContainerRef.current)?.activeElement?.getAttribute("role") !== "menu") {
3696
4003
  focusSheet();
3697
4004
  }
3698
4005
  }
@@ -3708,6 +4015,10 @@ function CanvasGridComponent(props, forwardedRef) {
3708
4015
  scrollToCell,
3709
4016
  commit,
3710
4017
  openFillSeriesDialog: () => openFillSeriesDialogForRef.current?.(),
4018
+ copyChart,
4019
+ cutChart,
4020
+ pasteChart,
4021
+ duplicateChart,
3711
4022
  };
3712
4023
  setSpreadsheetApi(new SpreadsheetApi(propsReferenceRef, stableMethods, store, instanceStore, instanceId));
3713
4024
  }, []);
@@ -3772,6 +4083,13 @@ function CanvasGridComponent(props, forwardedRef) {
3772
4083
  * in formula mode
3773
4084
  */
3774
4085
  const enableSelectionDrag = !isSelectionInProgress && !isEditInProgress && !formulaMode;
4086
+ // A chartsheet IS its chart: no grid, headers, editor or cell menus — only the chart and its
4087
+ // context menu (Excel).
4088
+ if (sheetType === "chartsheet") {
4089
+ return (React.createElement("div", { className: cn("rnc-canvas-wrapper after:box-border before:box-border [&_*]:box-border flex min-h-0 min-w-0 relative z-[1] flex-1 bg-rnc-background", className), ref: gridContainerRef, role: "application", "aria-label": "Chart sheet", ...rest },
4090
+ React.createElement(ChartSheetViewComponent, { sheetId: sheetId, chart: charts?.find((chart) => chart.position?.sheetId === sheetId), width: width, height: height, theme: theme, backgroundColor: cellBackgroundColor, readonly: readonly, getChartComponent: getChartComponent, onDeleteChart: onDeleteChart, onUpdateChart: onUpdateChart, onRequestContextMenu: requestChartContextMenu }),
4091
+ embedContextMenuComponent));
4092
+ }
3775
4093
  return (React.createElement("div", { className: cn("rnc-canvas-wrapper after:box-border before:box-border [&_*]:box-border flex min-h-0 min-w-0 relative z-[1] flex-1 bg-rnc-background", className), ref: gridContainerRef,
3776
4094
  // The grid paints to <canvas>, so there is no per-cell DOM for a screen
3777
4095
  // reader to traverse. role="application" passes keystrokes through to our
@@ -3786,11 +4104,11 @@ function CanvasGridComponent(props, forwardedRef) {
3786
4104
  // Bind to outer container, so it always takes
3787
4105
  // priority over other components
3788
4106
  // generated by hooks
3789
- onMouseMove: mouseMoveThrottler, onWheel: onMouseWheel, ...rest },
4107
+ onMouseMove: mouseMoveThrottler, onWheel: onMouseWheel, ...rest, style: tableHitCursor ? { ...rest.style, cursor: tableHitCursor } : rest.style },
3790
4108
  width === 0 || height === 0 ? (React.createElement("div", { className: "flex border-solid border-rnc-border border border-t border-b flex-1 justify-center items-center" },
3791
4109
  React.createElement("div", { className: "space-y-2" },
3792
4110
  React.createElement(Skeleton, { className: "h-4 w-[250px]" }),
3793
- React.createElement(Skeleton, { className: "h-4 w-[250px]" })))) : (React.createElement(BaseGrid, { ref: gridRef, overscanCount: overscanCount, rowCount: sheetRowCount, columnCount: sheetColumnCount, rowHeight: rowHeight, columnWidth: columnWidth, itemRenderer: cellRenderer, headerRenderer: headerCellRenderer, selectionRenderer: selectionRenderer, gridLineColor: gridLineColor, gridLineWidth: gridLineWidth, borderStyles: finalBorderStyles, mergedCells: merges, scale: scale, width: width, height: height, frozenColumns: frozenColumns, frozenRows: frozenRows, activeCell: activeCell, selections: formulaMode ? formulaSelections : selections, FillHandle: FillHandle, showFillHandle: showFillHandle, fillHandleSize: fillHandleSize, showGridLines: showGridLines, enableCellOverlay: true, enableCellBackground: true, enableSelectionDrag: enableSelectionDrag, showFrozenColumnShadow: showFrozenSeparator, showFrozenRowShadow: showFrozenSeparator, selectionBorderColor: selectionBorderColor, selectionBackgroundColor: selectionBackgroundColor, fillhandleBorderColor: cellBackgroundColor, isDraggingSelection: isDragging, fillSelection: fillShrinkOverlay ?? fillSelection, onPointerDown: handlePointerDown, onPointerUp: handlePointerUp, onMouseDown: handleMouseDown, onDoubleClick: handleDoubleClick, onFillHandleMouseDown: onFillHandleMouseDown, onFillHandleDoubleClick: onFillHandleDoubleClick,
4111
+ React.createElement(Skeleton, { className: "h-4 w-[250px]" })))) : (React.createElement(BaseGrid, { ref: gridRef, overscanCount: overscanCount, rowCount: sheetRowCount, columnCount: sheetColumnCount, rowHeight: rowHeight, columnWidth: columnWidth, itemRenderer: cellRenderer, headerRenderer: headerCellRenderer, selectionRenderer: selectionRenderer, gridLineColor: gridLineColor, gridLineWidth: gridLineWidth, borderStyles: gridBorderStyles, mergedCells: merges, scale: scale, width: width, height: height, frozenColumns: frozenColumns, frozenRows: frozenRows, activeCell: activeCell, selections: formulaMode ? formulaSelections : selections, FillHandle: FillHandle, showFillHandle: showFillHandle, fillHandleSize: fillHandleSize, showGridLines: showGridLines, enableCellOverlay: true, enableCellBackground: true, enableSelectionDrag: enableSelectionDrag, showFrozenColumnShadow: showFrozenSeparator, showFrozenRowShadow: showFrozenSeparator, selectionBorderColor: selectionBorderColor, selectionBackgroundColor: selectionBackgroundColor, fillhandleBorderColor: cellBackgroundColor, isDraggingSelection: isDragging, fillSelection: fillShrinkOverlay ?? fillSelection, onPointerDown: handlePointerDown, onPointerUp: handlePointerUp, onMouseDown: handleMouseDown, onDoubleClick: handleDoubleClick, onFillHandleMouseDown: onFillHandleMouseDown, onFillHandleDoubleClick: onFillHandleDoubleClick,
3794
4112
  // Dimension of fill handle
3795
4113
  scrollToCellOffset: 4, scrollbarSize: scrollbarSize, isHiddenCell: isHiddenCell, isHiddenColumn: isHiddenColumn, isHiddenRow: isHiddenRow, visibleRowRanges: visibleRowRanges, isHiddenOverlay: isHiddenOverlay, isHiddenBackground: isHiddenBackground, overlayRenderer: cellOverlayRenderer, backgroundRenderer: cellBackgroundRenderer, shadowSettings: shadowSettings, onScroll: handleScroll, onViewPortChange: handleViewPortChange, autoFocus: autoFocus, snap: scrollSnap, scrollThrottleTimeout: scrollThrottleTimeout, preventBrowserDefaultScroll: preventBrowserDefaultScroll, showHeaders: showHeaders, gridChildren: gridChildren, onTouchStart: onTouchStart, onDimensionsChange: onDimensionsChange, extendScrollSize: isTouchDevice || isFirefox, isTouchDevice: isTouchDevice, frozenShadowThickness: frozenShadowThickness, onAfterScrollToCell: onAfterScrollToCell, estimatedRowHeight: defaultRowHeight, estimatedColumnWidth: defaultColumnWidth, footerHeight: footerHeight, footerComponent: footerComponent, getOverflowBuffer: getOverflowBuffer, getFrozenColumnOverflowCells: getFrozenColumnOverflowCells })),
3796
4114
  tooltipComponent,
@@ -3798,7 +4116,9 @@ function CanvasGridComponent(props, forwardedRef) {
3798
4116
  draggableColumns,
3799
4117
  draggableRows,
3800
4118
  contextMenuComponent,
4119
+ embedContextMenuComponent,
3801
4120
  filterComponent,
4121
+ totalsPickerComponent,
3802
4122
  headerResizer,
3803
4123
  validatorResult,
3804
4124
  React.createElement("div", { "aria-live": "polite", "aria-atomic": "true", style: {