@rowsncolumns/spreadsheet 10.6.5 → 10.7.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 (284) hide show
  1. package/dist/cjs/api/autocomplete.d.ts +42 -0
  2. package/dist/cjs/api/autocomplete.d.ts.map +1 -0
  3. package/dist/cjs/api/autocomplete.js +114 -0
  4. package/dist/cjs/api/banded-ranges.d.ts.map +1 -1
  5. package/dist/cjs/api/banded-ranges.js +51 -1
  6. package/dist/cjs/api/error-checking.d.ts +82 -0
  7. package/dist/cjs/api/error-checking.d.ts.map +1 -0
  8. package/dist/cjs/api/error-checking.js +207 -0
  9. package/dist/cjs/api/move-overwrite.d.ts +8 -2
  10. package/dist/cjs/api/move-overwrite.d.ts.map +1 -1
  11. package/dist/cjs/api/move-overwrite.js +19 -3
  12. package/dist/cjs/api/selections.d.ts +2 -2
  13. package/dist/cjs/api/validation.d.ts +39 -1
  14. package/dist/cjs/api/validation.d.ts.map +1 -1
  15. package/dist/cjs/api/validation.js +87 -1
  16. package/dist/cjs/atoms/cell-input-context.atom.d.ts +4 -1
  17. package/dist/cjs/atoms/cell-input-context.atom.d.ts.map +1 -1
  18. package/dist/cjs/atoms/enter-key-direction.atom.d.ts +11 -0
  19. package/dist/cjs/atoms/enter-key-direction.atom.d.ts.map +1 -0
  20. package/dist/cjs/atoms/enter-key-direction.atom.js +13 -0
  21. package/dist/cjs/atoms/index.d.ts +1 -0
  22. package/dist/cjs/atoms/index.d.ts.map +1 -1
  23. package/dist/cjs/atoms/index.js +1 -0
  24. package/dist/cjs/atoms/paste-menu.atom.d.ts +22 -0
  25. package/dist/cjs/atoms/paste-menu.atom.d.ts.map +1 -1
  26. package/dist/cjs/atoms/paste-menu.atom.js +13 -1
  27. package/dist/cjs/atoms/pick-list.atom.d.ts +15 -0
  28. package/dist/cjs/atoms/pick-list.atom.d.ts.map +1 -0
  29. package/dist/cjs/atoms/pick-list.atom.js +7 -0
  30. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  31. package/dist/cjs/components/canvas-grid/index.js +305 -70
  32. package/dist/cjs/components/canvas-grid/typings.d.ts +96 -11
  33. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  34. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  35. package/dist/cjs/components/cell/index.js +7 -8
  36. package/dist/cjs/components/cell/typings.d.ts +9 -0
  37. package/dist/cjs/components/cell/typings.d.ts.map +1 -1
  38. package/dist/cjs/components/cell-editor/helpers.d.ts +22 -2
  39. package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
  40. package/dist/cjs/components/cell-editor/helpers.js +32 -8
  41. package/dist/cjs/components/cell-editor/index.d.ts +7 -1
  42. package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
  43. package/dist/cjs/components/cell-editor/index.js +85 -13
  44. package/dist/cjs/components/cell-indicator/index.d.ts +41 -0
  45. package/dist/cjs/components/cell-indicator/index.d.ts.map +1 -0
  46. package/dist/cjs/components/cell-indicator/index.js +90 -0
  47. package/dist/cjs/components/cell-input/cell-input.d.ts +10 -2
  48. package/dist/cjs/components/cell-input/cell-input.d.ts.map +1 -1
  49. package/dist/cjs/components/cell-input/cell-input.js +5 -3
  50. package/dist/cjs/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  51. package/dist/cjs/components/cell-input/formula-bar-cell-input.js +9 -2
  52. package/dist/cjs/components/cell-structured/sparkline-math.d.ts +27 -1
  53. package/dist/cjs/components/cell-structured/sparkline-math.d.ts.map +1 -1
  54. package/dist/cjs/components/cell-structured/sparkline-math.js +48 -1
  55. package/dist/cjs/components/cell-structured/sparkline.d.ts +1 -1
  56. package/dist/cjs/components/cell-structured/sparkline.d.ts.map +1 -1
  57. package/dist/cjs/components/cell-structured/sparkline.js +36 -92
  58. package/dist/cjs/components/cell-structured/types.d.ts +6 -0
  59. package/dist/cjs/components/cell-structured/types.d.ts.map +1 -1
  60. package/dist/cjs/components/data-table-dialog/index.d.ts +22 -0
  61. package/dist/cjs/components/data-table-dialog/index.d.ts.map +1 -0
  62. package/dist/cjs/components/data-table-dialog/index.js +93 -0
  63. package/dist/cjs/components/error-check-smart-tag/index.d.ts +27 -0
  64. package/dist/cjs/components/error-check-smart-tag/index.d.ts.map +1 -0
  65. package/dist/cjs/components/error-check-smart-tag/index.js +39 -0
  66. package/dist/cjs/components/forecast-sheet-dialog/index.d.ts +26 -0
  67. package/dist/cjs/components/forecast-sheet-dialog/index.d.ts.map +1 -0
  68. package/dist/cjs/components/forecast-sheet-dialog/index.js +92 -0
  69. package/dist/cjs/components/paste-special-dialog/index.d.ts +3 -3
  70. package/dist/cjs/components/paste-special-dialog/index.d.ts.map +1 -1
  71. package/dist/cjs/components/paste-special-dialog/index.js +61 -23
  72. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
  73. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
  74. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +196 -0
  75. package/dist/cjs/components/protect-sheet-dialog/constants.d.ts +3 -0
  76. package/dist/cjs/components/protect-sheet-dialog/constants.d.ts.map +1 -0
  77. package/dist/cjs/components/protect-sheet-dialog/constants.js +5 -0
  78. package/dist/cjs/components/protect-sheet-dialog/index.d.ts +2 -2
  79. package/dist/cjs/components/protect-sheet-dialog/index.d.ts.map +1 -1
  80. package/dist/cjs/components/protect-sheet-dialog/index.js +5 -3
  81. package/dist/cjs/components/scenario-manager-dialog/index.d.ts +51 -0
  82. package/dist/cjs/components/scenario-manager-dialog/index.d.ts.map +1 -0
  83. package/dist/cjs/components/scenario-manager-dialog/index.js +257 -0
  84. package/dist/cjs/components/selection/index.d.ts +1 -1
  85. package/dist/cjs/components/selection/index.d.ts.map +1 -1
  86. package/dist/cjs/components/selection/index.js +9 -4
  87. package/dist/cjs/components/selection/paste-menu.d.ts +14 -1
  88. package/dist/cjs/components/selection/paste-menu.d.ts.map +1 -1
  89. package/dist/cjs/components/selection/paste-menu.js +78 -6
  90. package/dist/cjs/components/selection/paste-options.d.ts +28 -0
  91. package/dist/cjs/components/selection/paste-options.d.ts.map +1 -0
  92. package/dist/cjs/components/selection/paste-options.js +70 -0
  93. package/dist/cjs/components/selection/types.d.ts +12 -1
  94. package/dist/cjs/components/selection/types.d.ts.map +1 -1
  95. package/dist/cjs/components/selection-drop-menu/index.d.ts +18 -0
  96. package/dist/cjs/components/selection-drop-menu/index.d.ts.map +1 -0
  97. package/dist/cjs/components/selection-drop-menu/index.js +62 -0
  98. package/dist/cjs/components/solver-dialog/index.d.ts +57 -0
  99. package/dist/cjs/components/solver-dialog/index.d.ts.map +1 -0
  100. package/dist/cjs/components/solver-dialog/index.js +204 -0
  101. package/dist/cjs/components/toolbar/sparkline-actions.d.ts +3 -2
  102. package/dist/cjs/components/toolbar/sparkline-actions.d.ts.map +1 -1
  103. package/dist/cjs/components/toolbar/sparkline-actions.js +6 -2
  104. package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
  105. package/dist/cjs/components/toolbar/table-style-selector.js +33 -2
  106. package/dist/cjs/config.d.ts +5 -4
  107. package/dist/cjs/config.d.ts.map +1 -1
  108. package/dist/cjs/config.js +13 -9
  109. package/dist/cjs/hooks/use-cell-renderer.d.ts +12 -1
  110. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  111. package/dist/cjs/hooks/use-cell-renderer.js +6 -3
  112. package/dist/cjs/hooks/use-copy-paste-cut.d.ts +36 -2
  113. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  114. package/dist/cjs/hooks/use-copy-paste-cut.js +131 -5
  115. package/dist/cjs/hooks/use-editable.d.ts +6 -0
  116. package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
  117. package/dist/cjs/hooks/use-editor-submit.d.ts +45 -3
  118. package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
  119. package/dist/cjs/hooks/use-editor-submit.js +91 -7
  120. package/dist/cjs/hooks/use-keyboard-handler.d.ts +5 -1
  121. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  122. package/dist/cjs/hooks/use-keyboard-handler.js +10 -1
  123. package/dist/cjs/hooks/use-selection-drag-copy.d.ts +55 -0
  124. package/dist/cjs/hooks/use-selection-drag-copy.d.ts.map +1 -0
  125. package/dist/cjs/hooks/use-selection-drag-copy.js +274 -0
  126. package/dist/cjs/hooks/use-selection-renderer.d.ts +8 -1
  127. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  128. package/dist/cjs/hooks/use-selection-renderer.js +7 -2
  129. package/dist/cjs/hooks/use-selection.d.ts +59 -1
  130. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  131. package/dist/cjs/hooks/use-selection.js +270 -61
  132. package/dist/cjs/index.d.ts +6 -1
  133. package/dist/cjs/index.d.ts.map +1 -1
  134. package/dist/cjs/index.js +5 -0
  135. package/dist/cjs/release-date.js +1 -1
  136. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  137. package/dist/cjs/types.d.ts +50 -1
  138. package/dist/cjs/types.d.ts.map +1 -1
  139. package/dist/esm/api/autocomplete.d.ts +42 -0
  140. package/dist/esm/api/autocomplete.d.ts.map +1 -0
  141. package/dist/esm/api/autocomplete.js +91 -0
  142. package/dist/esm/api/banded-ranges.d.ts.map +1 -1
  143. package/dist/esm/api/banded-ranges.js +52 -2
  144. package/dist/esm/api/error-checking.d.ts +82 -0
  145. package/dist/esm/api/error-checking.d.ts.map +1 -0
  146. package/dist/esm/api/error-checking.js +156 -0
  147. package/dist/esm/api/move-overwrite.d.ts +8 -2
  148. package/dist/esm/api/move-overwrite.d.ts.map +1 -1
  149. package/dist/esm/api/move-overwrite.js +17 -2
  150. package/dist/esm/api/selections.d.ts +2 -2
  151. package/dist/esm/api/validation.d.ts +39 -1
  152. package/dist/esm/api/validation.d.ts.map +1 -1
  153. package/dist/esm/api/validation.js +70 -0
  154. package/dist/esm/atoms/cell-input-context.atom.d.ts +4 -1
  155. package/dist/esm/atoms/cell-input-context.atom.d.ts.map +1 -1
  156. package/dist/esm/atoms/enter-key-direction.atom.d.ts +11 -0
  157. package/dist/esm/atoms/enter-key-direction.atom.d.ts.map +1 -0
  158. package/dist/esm/atoms/enter-key-direction.atom.js +8 -0
  159. package/dist/esm/atoms/index.d.ts +1 -0
  160. package/dist/esm/atoms/index.d.ts.map +1 -1
  161. package/dist/esm/atoms/index.js +1 -0
  162. package/dist/esm/atoms/paste-menu.atom.d.ts +22 -0
  163. package/dist/esm/atoms/paste-menu.atom.d.ts.map +1 -1
  164. package/dist/esm/atoms/paste-menu.atom.js +10 -1
  165. package/dist/esm/atoms/pick-list.atom.d.ts +15 -0
  166. package/dist/esm/atoms/pick-list.atom.d.ts.map +1 -0
  167. package/dist/esm/atoms/pick-list.atom.js +3 -0
  168. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  169. package/dist/esm/components/canvas-grid/index.js +239 -13
  170. package/dist/esm/components/canvas-grid/typings.d.ts +96 -11
  171. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  172. package/dist/esm/components/cell/index.d.ts.map +1 -1
  173. package/dist/esm/components/cell/index.js +8 -9
  174. package/dist/esm/components/cell/typings.d.ts +9 -0
  175. package/dist/esm/components/cell/typings.d.ts.map +1 -1
  176. package/dist/esm/components/cell-editor/helpers.d.ts +22 -2
  177. package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
  178. package/dist/esm/components/cell-editor/helpers.js +25 -7
  179. package/dist/esm/components/cell-editor/index.d.ts +7 -1
  180. package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
  181. package/dist/esm/components/cell-editor/index.js +80 -9
  182. package/dist/esm/components/cell-indicator/index.d.ts +41 -0
  183. package/dist/esm/components/cell-indicator/index.d.ts.map +1 -0
  184. package/dist/esm/components/cell-indicator/index.js +76 -0
  185. package/dist/esm/components/cell-input/cell-input.d.ts +10 -2
  186. package/dist/esm/components/cell-input/cell-input.d.ts.map +1 -1
  187. package/dist/esm/components/cell-input/cell-input.js +5 -3
  188. package/dist/esm/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  189. package/dist/esm/components/cell-input/formula-bar-cell-input.js +9 -2
  190. package/dist/esm/components/cell-structured/sparkline-math.d.ts +27 -1
  191. package/dist/esm/components/cell-structured/sparkline-math.d.ts.map +1 -1
  192. package/dist/esm/components/cell-structured/sparkline-math.js +35 -0
  193. package/dist/esm/components/cell-structured/sparkline.d.ts +1 -1
  194. package/dist/esm/components/cell-structured/sparkline.d.ts.map +1 -1
  195. package/dist/esm/components/cell-structured/sparkline.js +34 -88
  196. package/dist/esm/components/cell-structured/types.d.ts +6 -0
  197. package/dist/esm/components/cell-structured/types.d.ts.map +1 -1
  198. package/dist/esm/components/data-table-dialog/index.d.ts +22 -0
  199. package/dist/esm/components/data-table-dialog/index.d.ts.map +1 -0
  200. package/dist/esm/components/data-table-dialog/index.js +75 -0
  201. package/dist/esm/components/error-check-smart-tag/index.d.ts +27 -0
  202. package/dist/esm/components/error-check-smart-tag/index.d.ts.map +1 -0
  203. package/dist/esm/components/error-check-smart-tag/index.js +33 -0
  204. package/dist/esm/components/forecast-sheet-dialog/index.d.ts +26 -0
  205. package/dist/esm/components/forecast-sheet-dialog/index.d.ts.map +1 -0
  206. package/dist/esm/components/forecast-sheet-dialog/index.js +83 -0
  207. package/dist/esm/components/paste-special-dialog/index.d.ts +3 -3
  208. package/dist/esm/components/paste-special-dialog/index.d.ts.map +1 -1
  209. package/dist/esm/components/paste-special-dialog/index.js +58 -23
  210. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
  211. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
  212. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +177 -0
  213. package/dist/esm/components/protect-sheet-dialog/constants.d.ts +3 -0
  214. package/dist/esm/components/protect-sheet-dialog/constants.d.ts.map +1 -0
  215. package/dist/esm/components/protect-sheet-dialog/constants.js +2 -0
  216. package/dist/esm/components/protect-sheet-dialog/index.d.ts +2 -2
  217. package/dist/esm/components/protect-sheet-dialog/index.d.ts.map +1 -1
  218. package/dist/esm/components/protect-sheet-dialog/index.js +3 -2
  219. package/dist/esm/components/scenario-manager-dialog/index.d.ts +51 -0
  220. package/dist/esm/components/scenario-manager-dialog/index.d.ts.map +1 -0
  221. package/dist/esm/components/scenario-manager-dialog/index.js +213 -0
  222. package/dist/esm/components/selection/index.d.ts +1 -1
  223. package/dist/esm/components/selection/index.d.ts.map +1 -1
  224. package/dist/esm/components/selection/index.js +9 -4
  225. package/dist/esm/components/selection/paste-menu.d.ts +14 -1
  226. package/dist/esm/components/selection/paste-menu.d.ts.map +1 -1
  227. package/dist/esm/components/selection/paste-menu.js +76 -8
  228. package/dist/esm/components/selection/paste-options.d.ts +28 -0
  229. package/dist/esm/components/selection/paste-options.d.ts.map +1 -0
  230. package/dist/esm/components/selection/paste-options.js +62 -0
  231. package/dist/esm/components/selection/types.d.ts +12 -1
  232. package/dist/esm/components/selection/types.d.ts.map +1 -1
  233. package/dist/esm/components/selection-drop-menu/index.d.ts +18 -0
  234. package/dist/esm/components/selection-drop-menu/index.d.ts.map +1 -0
  235. package/dist/esm/components/selection-drop-menu/index.js +56 -0
  236. package/dist/esm/components/solver-dialog/index.d.ts +57 -0
  237. package/dist/esm/components/solver-dialog/index.d.ts.map +1 -0
  238. package/dist/esm/components/solver-dialog/index.js +176 -0
  239. package/dist/esm/components/toolbar/sparkline-actions.d.ts +3 -2
  240. package/dist/esm/components/toolbar/sparkline-actions.d.ts.map +1 -1
  241. package/dist/esm/components/toolbar/sparkline-actions.js +6 -2
  242. package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
  243. package/dist/esm/components/toolbar/table-style-selector.js +29 -3
  244. package/dist/esm/config.d.ts +5 -4
  245. package/dist/esm/config.d.ts.map +1 -1
  246. package/dist/esm/config.js +12 -8
  247. package/dist/esm/hooks/use-cell-renderer.d.ts +12 -1
  248. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  249. package/dist/esm/hooks/use-cell-renderer.js +5 -2
  250. package/dist/esm/hooks/use-copy-paste-cut.d.ts +36 -2
  251. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  252. package/dist/esm/hooks/use-copy-paste-cut.js +117 -6
  253. package/dist/esm/hooks/use-editable.d.ts +6 -0
  254. package/dist/esm/hooks/use-editable.d.ts.map +1 -1
  255. package/dist/esm/hooks/use-editor-submit.d.ts +45 -3
  256. package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
  257. package/dist/esm/hooks/use-editor-submit.js +81 -6
  258. package/dist/esm/hooks/use-keyboard-handler.d.ts +5 -1
  259. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  260. package/dist/esm/hooks/use-keyboard-handler.js +10 -1
  261. package/dist/esm/hooks/use-selection-drag-copy.d.ts +55 -0
  262. package/dist/esm/hooks/use-selection-drag-copy.d.ts.map +1 -0
  263. package/dist/esm/hooks/use-selection-drag-copy.js +245 -0
  264. package/dist/esm/hooks/use-selection-renderer.d.ts +8 -1
  265. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  266. package/dist/esm/hooks/use-selection-renderer.js +7 -2
  267. package/dist/esm/hooks/use-selection.d.ts +59 -1
  268. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  269. package/dist/esm/hooks/use-selection.js +245 -52
  270. package/dist/esm/index.d.ts +6 -1
  271. package/dist/esm/index.d.ts.map +1 -1
  272. package/dist/esm/index.js +5 -0
  273. package/dist/esm/release-date.js +1 -1
  274. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  275. package/dist/esm/types.d.ts +50 -1
  276. package/dist/esm/types.d.ts.map +1 -1
  277. package/dist/spreadsheet.min.css +1 -1
  278. package/package.json +6 -5
  279. package/dist/cjs/components/cell-error/index.d.ts +0 -14
  280. package/dist/cjs/components/cell-error/index.d.ts.map +0 -1
  281. package/dist/cjs/components/cell-error/index.js +0 -24
  282. package/dist/esm/components/cell-error/index.d.ts +0 -14
  283. package/dist/esm/components/cell-error/index.d.ts.map +0 -1
  284. package/dist/esm/components/cell-error/index.js +0 -18
@@ -0,0 +1,56 @@
1
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuTrigger, } from "@rowsncolumns/ui";
2
+ import React, { useRef, useState } from "react";
3
+ import { StyledFakeTriggerButton } from "../context-menu/style";
4
+ export const SELECTION_DROP_ACTION_LABELS = {
5
+ move: "Move Here",
6
+ copy: "Copy Here",
7
+ "copy-values": "Copy Here as Values Only",
8
+ "copy-formats": "Copy Here as Formats Only",
9
+ link: "Link Here",
10
+ "shift-down-copy": "Shift Down and Copy",
11
+ "shift-right-copy": "Shift Right and Copy",
12
+ "shift-down-move": "Shift Down and Move",
13
+ "shift-right-move": "Shift Right and Move",
14
+ };
15
+ /** Excel's grouping: plain drops, then the inserting ones, then Cancel. */
16
+ const INSERT_ACTIONS = new Set([
17
+ "shift-down-copy",
18
+ "shift-right-copy",
19
+ "shift-down-move",
20
+ "shift-right-move",
21
+ ]);
22
+ /**
23
+ * The menu a right-button drag of the selection border opens at the release point
24
+ * (Excel: Move Here, Copy Here, … Cancel). Opens immediately; any dismissal cancels.
25
+ */
26
+ export const SelectionDropMenu = ({ x, y, actions, onSelectAction, onCancel, }) => {
27
+ const [open, setOpen] = useState(true);
28
+ // Radix fires `onSelect` and then closes; a close that follows a choice is not a cancel.
29
+ const choseRef = useRef(false);
30
+ const plain = actions.filter((action) => !INSERT_ACTIONS.has(action));
31
+ const inserting = actions.filter((action) => INSERT_ACTIONS.has(action));
32
+ const item = (action) => (React.createElement(DropdownMenuItem, { key: action, onSelect: () => {
33
+ choseRef.current = true;
34
+ onSelectAction(action);
35
+ } }, SELECTION_DROP_ACTION_LABELS[action]));
36
+ return (React.createElement("div", { className: "absolute pointer-events-auto z-10", style: { left: x, top: y }, onMouseDown: (e) => e.stopPropagation(), "data-testid": "selection-drop-menu" },
37
+ React.createElement(DropdownMenu, { modal: false, open: open, onOpenChange: (next) => {
38
+ setOpen(next);
39
+ if (!next && !choseRef.current)
40
+ onCancel();
41
+ if (!next)
42
+ choseRef.current = false;
43
+ } },
44
+ React.createElement(DropdownMenuTrigger, { asChild: true },
45
+ React.createElement(StyledFakeTriggerButton, { "aria-label": "Drop options" })),
46
+ React.createElement(DropdownMenuPortal, null,
47
+ React.createElement(DropdownMenuContent, { align: "start", onCloseAutoFocus: (event) => event.preventDefault() },
48
+ plain.map(item),
49
+ inserting.length ? React.createElement(DropdownMenuSeparator, null) : null,
50
+ inserting.map(item),
51
+ React.createElement(DropdownMenuSeparator, null),
52
+ React.createElement(DropdownMenuItem, { onSelect: () => {
53
+ choseRef.current = true;
54
+ onCancel();
55
+ } }, "Cancel"))))));
56
+ };
@@ -0,0 +1,57 @@
1
+ import React from "react";
2
+ type Range = {
3
+ startRowIndex: number;
4
+ endRowIndex: number;
5
+ startColumnIndex: number;
6
+ endColumnIndex: number;
7
+ };
8
+ export type SolverDialogConstraint = {
9
+ cells: Range;
10
+ operator: "<=" | "=" | ">=" | "int" | "bin";
11
+ rhs?: number | Range;
12
+ };
13
+ /** What the dialog asks the engine to solve (the `solve` command's fields). */
14
+ export type SolverDialogParameters = {
15
+ objective: {
16
+ rowIndex: number;
17
+ columnIndex: number;
18
+ };
19
+ goal: "max" | "min" | "value";
20
+ targetValue?: number;
21
+ changingCells: Range[];
22
+ constraints: SolverDialogConstraint[];
23
+ method: "grgNonlinear" | "simplexLp";
24
+ assumeNonNegative: boolean;
25
+ };
26
+ /** The engine's `CommitResult.solver`, as far as the dialog reads it. */
27
+ export type SolverDialogResult = {
28
+ status: string;
29
+ message: string;
30
+ values: {
31
+ rowIndex: number;
32
+ columnIndex: number;
33
+ value: number;
34
+ }[];
35
+ };
36
+ export type SolverDialogProps = {
37
+ open: boolean;
38
+ onOpenChange(open: boolean): void;
39
+ /** Default "Set Objective" (the active cell as A1). */
40
+ initialObjective: string;
41
+ /** Runs the solve without keeping it (`preview`), resolving to the outcome. */
42
+ onSolve(parameters: SolverDialogParameters): Promise<SolverDialogResult | undefined>;
43
+ /** "Keep Solver Solution": write the solution into the variable cells. */
44
+ onKeep(result: SolverDialogResult): void;
45
+ };
46
+ /** `B1`, `B1:C3` (`$` allowed) → a range; `null` otherwise. */
47
+ export declare const parseSolverRange: (text: string) => Range | null;
48
+ /**
49
+ * Excel's Solver Parameters dialog (the Solver add-in): Set Objective, To
50
+ * Max / Min / Value Of, By Changing Variable Cells, Subject to the
51
+ * Constraints, Make Unconstrained Variables Non-Negative and the solving
52
+ * method; then Solver Results with Keep Solver Solution / Restore Original
53
+ * Values. Evolutionary is not offered.
54
+ */
55
+ export declare const SolverDialog: React.MemoExoticComponent<({ open, onOpenChange, initialObjective, onSolve, onKeep }: SolverDialogProps) => React.JSX.Element>;
56
+ export {};
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/solver-dialog/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,KAAK,KAAK,GAAG;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5C,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,KAAK,EAAE,CAAC;IACvB,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,MAAM,EAAE,cAAc,GAAG,WAAW,CAAC;IACrC,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,OAAO,CAAC,UAAU,EAAE,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IACrF,0EAA0E;IAC1E,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC1C,CAAC;AAIF,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,KAAK,GAAG,IAYvD,CAAC;AAIF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,wFACqC,iBAAiB,uBA6Q9E,CAAC"}
@@ -0,0 +1,176 @@
1
+ import { Cross1Icon } from "@rowsncolumns/icons";
2
+ import { Button, Dialog, DialogBody, DialogCloseButton, DialogContent, DialogDescription, DialogTitle, Input, Separator, } from "@rowsncolumns/ui";
3
+ import { addressToCell } from "@rowsncolumns/utils";
4
+ import React, { memo, useCallback, useEffect, useState } from "react";
5
+ const OPERATORS = ["<=", "=", ">=", "int", "bin"];
6
+ /** `B1`, `B1:C3` (`$` allowed) → a range; `null` otherwise. */
7
+ export const parseSolverRange = (text) => {
8
+ const [a, b = a] = text.trim().replace(/\$/g, "").split(":");
9
+ if (!/^[A-Za-z]{1,3}\d+$/.test(a ?? "") || !/^[A-Za-z]{1,3}\d+$/.test(b))
10
+ return null;
11
+ const start = addressToCell(a);
12
+ const end = addressToCell(b);
13
+ if (!start || !end)
14
+ return null;
15
+ return {
16
+ startRowIndex: Math.min(start.rowIndex, end.rowIndex),
17
+ endRowIndex: Math.max(start.rowIndex, end.rowIndex),
18
+ startColumnIndex: Math.min(start.columnIndex, end.columnIndex),
19
+ endColumnIndex: Math.max(start.columnIndex, end.columnIndex),
20
+ };
21
+ };
22
+ /**
23
+ * Excel's Solver Parameters dialog (the Solver add-in): Set Objective, To
24
+ * Max / Min / Value Of, By Changing Variable Cells, Subject to the
25
+ * Constraints, Make Unconstrained Variables Non-Negative and the solving
26
+ * method; then Solver Results with Keep Solver Solution / Restore Original
27
+ * Values. Evolutionary is not offered.
28
+ */
29
+ export const SolverDialog = memo(({ open, onOpenChange, initialObjective, onSolve, onKeep }) => {
30
+ const [objective, setObjective] = useState(initialObjective);
31
+ const [goal, setGoal] = useState("max");
32
+ const [target, setTarget] = useState("0");
33
+ const [changing, setChanging] = useState("");
34
+ const [constraints, setConstraints] = useState([]);
35
+ const [nonNegative, setNonNegative] = useState(true);
36
+ const [method, setMethod] = useState("grgNonlinear");
37
+ const [error, setError] = useState(undefined);
38
+ const [busy, setBusy] = useState(false);
39
+ const [result, setResult] = useState(undefined);
40
+ const [keep, setKeep] = useState(true);
41
+ useEffect(() => {
42
+ if (open) {
43
+ setObjective(initialObjective);
44
+ setError(undefined);
45
+ setBusy(false);
46
+ setResult(undefined);
47
+ setKeep(true);
48
+ }
49
+ // Only reset on open; the model's fields stay as last entered, as in Excel.
50
+ // eslint-disable-next-line react-hooks/exhaustive-deps
51
+ }, [open]);
52
+ const solve = useCallback(async (event) => {
53
+ event.preventDefault();
54
+ const objectiveRange = parseSolverRange(objective);
55
+ if (!objectiveRange ||
56
+ objectiveRange.startRowIndex !== objectiveRange.endRowIndex ||
57
+ objectiveRange.startColumnIndex !== objectiveRange.endColumnIndex) {
58
+ setError("Set Objective must be a single cell reference.");
59
+ return;
60
+ }
61
+ const changingCells = changing.split(",").map((t) => parseSolverRange(t));
62
+ if (changingCells.length === 0 || changingCells.some((r) => r === null)) {
63
+ setError("By Changing Variable Cells must be cell references, e.g. B1:B3.");
64
+ return;
65
+ }
66
+ const targetValue = Number(target);
67
+ if (goal === "value" && !Number.isFinite(targetValue)) {
68
+ setError("Value Of must be a number.");
69
+ return;
70
+ }
71
+ const specs = [];
72
+ for (const row of constraints) {
73
+ const cells = parseSolverRange(row.cells);
74
+ if (!cells) {
75
+ setError(`Constraint cell reference ${row.cells || "(empty)"} is not valid.`);
76
+ return;
77
+ }
78
+ if (row.operator === "int" || row.operator === "bin") {
79
+ specs.push({ cells, operator: row.operator });
80
+ continue;
81
+ }
82
+ const n = Number(row.rhs);
83
+ const rhs = row.rhs.trim() !== "" && Number.isFinite(n) ? n : parseSolverRange(row.rhs);
84
+ if (rhs === null) {
85
+ setError("Constraint must be a number or a cell reference.");
86
+ return;
87
+ }
88
+ specs.push({ cells, operator: row.operator, rhs });
89
+ }
90
+ setError(undefined);
91
+ setBusy(true);
92
+ try {
93
+ const outcome = await onSolve({
94
+ objective: {
95
+ rowIndex: objectiveRange.startRowIndex,
96
+ columnIndex: objectiveRange.startColumnIndex,
97
+ },
98
+ goal,
99
+ ...(goal === "value" ? { targetValue } : {}),
100
+ changingCells: changingCells,
101
+ constraints: specs,
102
+ method,
103
+ assumeNonNegative: nonNegative,
104
+ });
105
+ if (!outcome) {
106
+ setError("Solver could not run this model.");
107
+ return;
108
+ }
109
+ setResult(outcome);
110
+ setKeep(true);
111
+ }
112
+ finally {
113
+ setBusy(false);
114
+ }
115
+ }, [objective, changing, target, goal, constraints, method, nonNegative, onSolve]);
116
+ const finish = () => {
117
+ if (result && keep && result.values.length > 0)
118
+ onKeep(result);
119
+ onOpenChange(false);
120
+ };
121
+ const solved = result ? ["found", "integer-found", "converged"].includes(result.status) : false;
122
+ return (React.createElement(Dialog, { open: open, onOpenChange: onOpenChange },
123
+ React.createElement(DialogContent, { className: "w-[460px] max-w-[92vw] pointer-events-auto" },
124
+ React.createElement(DialogTitle, null, result ? "Solver Results" : "Solver Parameters"),
125
+ React.createElement(DialogDescription, null, "Find the variable cell values that optimize the objective under the constraints."),
126
+ React.createElement(DialogCloseButton, { onClick: () => onOpenChange(false) },
127
+ React.createElement(Cross1Icon, null)),
128
+ React.createElement(DialogBody, { className: "flex flex-col gap-3 font-system text-sm" }, result ? (React.createElement("div", { className: "flex flex-col gap-3" },
129
+ React.createElement("p", { role: "status", className: "text-xs" }, result.message),
130
+ solved ? (React.createElement("div", { className: "flex flex-col gap-1 text-xs" },
131
+ React.createElement("label", { className: "flex items-center gap-2" },
132
+ React.createElement("input", { type: "radio", checked: keep, onChange: () => setKeep(true) }),
133
+ "Keep Solver Solution"),
134
+ React.createElement("label", { className: "flex items-center gap-2" },
135
+ React.createElement("input", { type: "radio", checked: !keep, onChange: () => setKeep(false) }),
136
+ "Restore Original Values"))) : null,
137
+ React.createElement(Separator, null),
138
+ React.createElement("div", { className: "flex justify-end gap-2" },
139
+ React.createElement(Button, { type: "button", size: "sm", variant: "outline", onClick: () => setResult(undefined) }, "Return to Solver Parameters"),
140
+ React.createElement(Button, { type: "button", size: "sm", onClick: () => (solved ? finish() : onOpenChange(false)) }, "OK")))) : (React.createElement("form", { className: "flex flex-col gap-3", onSubmit: solve },
141
+ React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
142
+ "Set Objective:",
143
+ React.createElement(Input, { autoFocus: true, "aria-label": "Set Objective", value: objective, onChange: (e) => setObjective(e.target.value) })),
144
+ React.createElement("div", { className: "flex items-center gap-3 text-xs" },
145
+ "To:",
146
+ ["max", "min", "value"].map((g) => (React.createElement("label", { key: g, className: "flex items-center gap-1" },
147
+ React.createElement("input", { type: "radio", checked: goal === g, onChange: () => setGoal(g) }),
148
+ g === "max" ? "Max" : g === "min" ? "Min" : "Value Of:"))),
149
+ React.createElement(Input, { className: "w-20", "aria-label": "Value Of", value: target, disabled: goal !== "value", onChange: (e) => setTarget(e.target.value) })),
150
+ React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
151
+ "By Changing Variable Cells:",
152
+ React.createElement(Input, { "aria-label": "By Changing Variable Cells", value: changing, onChange: (e) => setChanging(e.target.value) })),
153
+ React.createElement("div", { className: "flex flex-col gap-1 text-xs font-medium" },
154
+ "Subject to the Constraints:",
155
+ constraints.map((row, i) => (React.createElement("div", { key: i, className: "flex items-center gap-1" },
156
+ React.createElement(Input, { "aria-label": `Constraint ${i + 1} cell reference`, value: row.cells, onChange: (e) => setConstraints(constraints.map((r, k) => (k === i ? { ...r, cells: e.target.value } : r))) }),
157
+ React.createElement("select", { "aria-label": `Constraint ${i + 1} relation`, className: "h-8 rounded border border-rnc-border bg-transparent px-1 text-sm", value: row.operator, onChange: (e) => setConstraints(constraints.map((r, k) => k === i ? { ...r, operator: e.target.value } : r)) }, OPERATORS.map((op) => (React.createElement("option", { key: op, value: op }, op)))),
158
+ React.createElement(Input, { "aria-label": `Constraint ${i + 1} value`, value: row.operator === "int" ? "integer" : row.operator === "bin" ? "binary" : row.rhs, disabled: row.operator === "int" || row.operator === "bin", onChange: (e) => setConstraints(constraints.map((r, k) => (k === i ? { ...r, rhs: e.target.value } : r))) }),
159
+ React.createElement(Button, { type: "button", size: "sm", variant: "outline", "aria-label": `Delete constraint ${i + 1}`, onClick: () => setConstraints(constraints.filter((_, k) => k !== i)) }, "Delete")))),
160
+ React.createElement("div", null,
161
+ React.createElement(Button, { type: "button", size: "sm", variant: "outline", onClick: () => setConstraints([...constraints, { cells: "", operator: "<=", rhs: "" }]) }, "Add"))),
162
+ React.createElement("label", { className: "flex items-center gap-2 text-xs" },
163
+ React.createElement("input", { type: "checkbox", checked: nonNegative, onChange: (e) => setNonNegative(e.target.checked) }),
164
+ "Make Unconstrained Variables Non-Negative"),
165
+ React.createElement("label", { className: "flex items-center gap-2 text-xs font-medium" },
166
+ "Select a Solving Method:",
167
+ React.createElement("select", { "aria-label": "Select a Solving Method", className: "h-8 rounded border border-rnc-border bg-transparent px-2 text-sm", value: method, onChange: (e) => setMethod(e.target.value) },
168
+ React.createElement("option", { value: "grgNonlinear" }, "GRG Nonlinear"),
169
+ React.createElement("option", { value: "simplexLp" }, "Simplex LP"))),
170
+ error ? (React.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
171
+ React.createElement(Separator, null),
172
+ React.createElement("div", { className: "flex justify-end gap-2" },
173
+ React.createElement(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onOpenChange(false) }, "Close"),
174
+ React.createElement(Button, { type: "submit", size: "sm", disabled: busy }, busy ? "Solving…" : "Solve"))))))));
175
+ });
176
+ SolverDialog.displayName = "SolverDialog";
@@ -19,13 +19,14 @@ export type SparklineActionsProps = {
19
19
  onDeleteSparklineGroup?(group: SparklineGroup): void;
20
20
  onClearSparklines?(sheetId: number, cells: CellInterface[]): void;
21
21
  onGroupSparklines?(sheetId: number, activeCell: CellInterface, cells: CellInterface[]): void;
22
+ onUngroupSparklines?(group: SparklineGroup): void;
22
23
  readonly?: boolean;
23
24
  };
24
25
  /**
25
26
  * Excel's Sparklines ribbon: Insert → Sparklines (Line / Column / Win-Loss → the Create
26
27
  * Sparklines dialog) and, when the active cell is in a sparkline group, the Sparkline Design tab —
27
28
  * Edit Data & Location, Type, Show (points + markers), Sparkline / marker colours, Axis (show
28
- * axis, right-to-left, hidden data, empty cells, vertical min/max) and Group / Clear.
29
+ * axis, right-to-left, hidden data, empty cells, vertical min/max) and Group / Ungroup / Clear.
29
30
  */
30
- export declare const SparklineActions: ({ sheetId, activeCell, selections, getSparklineGroup, onUpdateSparklineGroup, onDeleteSparklineGroup, onClearSparklines, onGroupSparklines, readonly, }: SparklineActionsProps) => React.JSX.Element;
31
+ export declare const SparklineActions: ({ sheetId, activeCell, selections, getSparklineGroup, onUpdateSparklineGroup, onDeleteSparklineGroup, onClearSparklines, onGroupSparklines, onUngroupSparklines, readonly, }: SparklineActionsProps) => React.JSX.Element;
31
32
  //# sourceMappingURL=sparkline-actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sparkline-actions.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/sparkline-actions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAmBvE,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,eAAO,MAAM,eAAe,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAIzE,CAAC;AA6CF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACjD,8FAA8F;IAC9F,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAAC;IACrF,sBAAsB,CAAC,CACrB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,kBAAkB,CAAC;QAAC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAAE,GACpE,OAAO,CAAC;IACX,sBAAsB,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IACrD,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAClE,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,yJAU9B,qBAAqB,sBAyXvB,CAAC"}
1
+ {"version":3,"file":"sparkline-actions.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/sparkline-actions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAmBvE,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,eAAO,MAAM,eAAe,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAIzE,CAAC;AA6CF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACjD,8FAA8F;IAC9F,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAAC;IACrF,sBAAsB,CAAC,CACrB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,kBAAkB,CAAC;QAAC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAAE,GACpE,OAAO,CAAC;IACX,sBAAsB,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IACrD,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAClE,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC7F,mBAAmB,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,8KAW9B,qBAAqB,sBAiYvB,CAAC"}
@@ -37,9 +37,9 @@ const Check = () => (React.createElement(DropdownMenuItemIndicator, null,
37
37
  * Excel's Sparklines ribbon: Insert → Sparklines (Line / Column / Win-Loss → the Create
38
38
  * Sparklines dialog) and, when the active cell is in a sparkline group, the Sparkline Design tab —
39
39
  * Edit Data & Location, Type, Show (points + markers), Sparkline / marker colours, Axis (show
40
- * axis, right-to-left, hidden data, empty cells, vertical min/max) and Group / Clear.
40
+ * axis, right-to-left, hidden data, empty cells, vertical min/max) and Group / Ungroup / Clear.
41
41
  */
42
- export const SparklineActions = ({ sheetId, activeCell, selections, getSparklineGroup, onUpdateSparklineGroup, onDeleteSparklineGroup, onClearSparklines, onGroupSparklines, readonly, }) => {
42
+ export const SparklineActions = ({ sheetId, activeCell, selections, getSparklineGroup, onUpdateSparklineGroup, onDeleteSparklineGroup, onClearSparklines, onGroupSparklines, onUngroupSparklines, readonly, }) => {
43
43
  const focusSheet = useFocusSheet();
44
44
  const openDialog = useOpenSparklineDialog();
45
45
  const shouldFocusSheetRef = useRef(true);
@@ -224,6 +224,10 @@ export const SparklineActions = ({ sheetId, activeCell, selections, getSparkline
224
224
  axisBoundSubmenu("Vertical Axis Maximum", "maxaxistype", "max"))),
225
225
  React.createElement(DropdownMenuSeparator, null),
226
226
  React.createElement(DropdownMenuItem, { disabled: !sparklineCellsSelected || readonly, onSelect: () => onGroupSparklines?.(sheetId, activeCell, selectedCells) }, "Group"),
227
+ React.createElement(DropdownMenuItem, { disabled: !group || group.members.length < 2 || readonly, onSelect: () => {
228
+ if (group)
229
+ onUngroupSparklines?.(group);
230
+ } }, "Ungroup"),
227
231
  React.createElement(DropdownMenuSub, null,
228
232
  React.createElement(DropdownMenuSubTrigger, { disabled: !hasGroup || readonly },
229
233
  "Clear",
@@ -1 +1 @@
1
- {"version":3,"file":"table-style-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/table-style-selector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAevE,OAAO,EACL,wBAAwB,EAGzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAuD,MAAM,OAAO,CAAC;AAG5E,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,OAAO,KAAK,EACV,gBAAgB,EAEhB,gBAAgB,EAEhB,iBAAiB,EACjB,UAAU,EACV,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACjD,UAAU,EAAE,aAAa,CAAC;IAC1B,aAAa,CAAC,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EACxB,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,GAC/B,IAAI,CAAC;IACR,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAC;IAC/D;;;OAGG;IACH,mBAAmB,CAAC,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;IAC9D,uFAAuF;IACvF,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC;;;OAGG;IACH,wBAAwB,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzD;;;OAGG;IACH,wBAAwB,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1D,CAAC;AAEF,uEAAuE;AACvE,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC;IACzB,GAAG,EACC,WAAW,GACX,UAAU,GACV,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;CACvB,CAQA,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,SAAS,EAChB,KAAK,CAAC,OAAO,aAAa,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,EAC1C,SAAS,OAAO,KACf,OAAO,CAAC,SAAS,CAqBnB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,UAAU;IACjB,kBAAkB,EAAE,MAAM,GAAG,SAAS;IACtC,cAAc,EAAE,MAAM,GAAG,SAAS;IAClC,cAAc,EAAE,gBAAgB,GAAG,SAAS;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa;CAC5B,CAAC;AAKF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAC/B,gBAAgB,OAAO,GAAG,SAAS,EACnC,mBAAmB,OAAO,GAAG,SAAS,EACtC,QAAQ,gBAAgB,kCAoBzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,kOAc1B,uBAAuB,uBA+W3B,CAAC"}
1
+ {"version":3,"file":"table-style-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/table-style-selector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAevE,OAAO,EAEL,wBAAwB,EAKzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAuD,MAAM,OAAO,CAAC;AAG5E,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,OAAO,KAAK,EACV,gBAAgB,EAEhB,gBAAgB,EAEhB,iBAAiB,EACjB,UAAU,EACV,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACjD,UAAU,EAAE,aAAa,CAAC;IAC1B,aAAa,CAAC,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EACxB,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,GAC/B,IAAI,CAAC;IACR,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAC;IAC/D;;;OAGG;IACH,mBAAmB,CAAC,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;IAC9D,uFAAuF;IACvF,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC;;;OAGG;IACH,wBAAwB,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzD;;;OAGG;IACH,wBAAwB,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1D,CAAC;AAEF,uEAAuE;AACvE,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC;IACzB,GAAG,EACC,WAAW,GACX,UAAU,GACV,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;CACvB,CAQA,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,SAAS,EAChB,KAAK,CAAC,OAAO,aAAa,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,EAC1C,SAAS,OAAO,KACf,OAAO,CAAC,SAAS,CAqBnB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,UAAU;IACjB,kBAAkB,EAAE,MAAM,GAAG,SAAS;IACtC,cAAc,EAAE,MAAM,GAAG,SAAS;IAClC,cAAc,EAAE,gBAAgB,GAAG,SAAS;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa;CAC5B,CAAC;AAKF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAC/B,gBAAgB,OAAO,GAAG,SAAS,EACnC,mBAAmB,OAAO,GAAG,SAAS,EACtC,QAAQ,gBAAgB,kCAoBzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,kOAc1B,uBAAuB,uBAuX3B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { isCellWithinBounds } from "@rowsncolumns/grid";
2
2
  import { CheckIcon, MdOutlineArrowDropDown, TableIcon } from "@rowsncolumns/icons";
3
3
  import { cn, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIndicator, DropdownMenuPortal, DropdownMenuTrigger, IconButton, Separator, } from "@rowsncolumns/ui";
4
- import { findMatchingBandProperty, getContrastColor, getTableBorderStyles as getSharedTableStyles, } from "@rowsncolumns/utils";
4
+ import { findMatchingBandProperty, getContrastColor, getTableBorderStyles as getSharedTableStyles, resolveTableStyleCell, } from "@rowsncolumns/utils";
5
5
  import React, { memo, useCallback, useMemo, useRef, useState } from "react";
6
6
  // Re-export the shared function for backwards compatibility
7
7
  export { findMatchingBandProperty };
@@ -183,8 +183,7 @@ export const TableStyleSelector = memo(({ tables, sheetId, theme, activeCell, se
183
183
  const tableBorderstyles = useMemo(() => [
184
184
  ...getTableBorderStyles(showRowStripes, showColumnStripes, theme).entries(),
185
185
  ], [showRowStripes, showColumnStripes, theme]);
186
- const swatch = (key, tableTheme, bandProperties, style, onContextMenu) => (React.createElement(DropdownMenuItem, { key: key, onClick: () => onSelectStyle(tableTheme, bandProperties), onContextMenu: onContextMenu, onPointerEnter: () => previewStyle(tableTheme, bandProperties), onPointerLeave: clearPreview, onFocus: () => previewStyle(tableTheme, bandProperties), onBlur: clearPreview, className: hoverClass, title: tableTheme },
187
- React.createElement(TableSkeleton, { rowProperties: bandProperties?.rowProperties, columnProperties: bandProperties?.columnProperties, theme: theme, style: style })));
186
+ const swatch = (key, tableTheme, bandProperties, style, onContextMenu) => (React.createElement(DropdownMenuItem, { key: key, onClick: () => onSelectStyle(tableTheme, bandProperties), onContextMenu: onContextMenu, onPointerEnter: () => previewStyle(tableTheme, bandProperties), onPointerLeave: clearPreview, onFocus: () => previewStyle(tableTheme, bandProperties), onBlur: clearPreview, className: hoverClass, title: tableTheme }, bandProperties?.tableStyleElements ? (React.createElement(TableStyleElementsSkeleton, { elements: bandProperties.tableStyleElements, theme: theme, style: style })) : (React.createElement(TableSkeleton, { rowProperties: bandProperties?.rowProperties, columnProperties: bandProperties?.columnProperties, theme: theme, style: style }))));
188
187
  return (React.createElement(DropdownMenu, { modal: false, onOpenChange: (open) => {
189
188
  if (!open) {
190
189
  clearPreview();
@@ -258,6 +257,33 @@ export const TableStyleSelector = memo(({ tables, sheetId, theme, activeCell, se
258
257
  // the editor is open its footer ends the panel.
259
258
  React.createElement(DropdownMenuItem, { className: "text-xs", onClick: () => onSelectStyle("None", undefined), onPointerEnter: () => previewStyle("None", undefined), onPointerLeave: clearPreview, onFocus: () => previewStyle("None", undefined), onBlur: clearPreview }, "Clear")))))));
260
259
  });
260
+ const swatchEdge = (border, theme) => border
261
+ ? `${Math.min(border.width, 2)}px solid ${getStringifiedColor(border.color, theme)}`
262
+ : undefined;
263
+ /**
264
+ * A built-in style's swatch: a header row over four body rows, five columns, each cell painted
265
+ * with the format the table style elements give it in the grid (`resolveTableStyleCell`).
266
+ */
267
+ const TableStyleElementsSkeleton = ({ elements, theme, style, }) => (React.createElement("div", { className: "table border-collapse table-fixed w-20 md:w-16", style: style }, [...Array(5)].map((_, rowIndex) => (React.createElement("div", { className: "table-row", key: rowIndex }, [...Array(5)].map((_, columnIndex) => {
268
+ const { fill, color, borders } = resolveTableStyleCell(elements, {
269
+ rowIndex,
270
+ columnIndex,
271
+ rowCount: 5,
272
+ columnCount: 5,
273
+ headerRow: true,
274
+ totalRow: false,
275
+ showFirstColumn: false,
276
+ showLastColumn: false,
277
+ });
278
+ return (React.createElement("div", { key: columnIndex, className: cn("table-cell leading-none text-center", rowIndex === 0 ? "h-1" : ""), style: {
279
+ backgroundColor: getStringifiedColor(fill, theme),
280
+ color: getStringifiedColor(color, theme),
281
+ borderTop: swatchEdge(borders?.top, theme),
282
+ borderBottom: swatchEdge(borders?.bottom, theme),
283
+ borderLeft: swatchEdge(borders?.left, theme),
284
+ borderRight: swatchEdge(borders?.right, theme),
285
+ } }, "-"));
286
+ }))))));
261
287
  /**
262
288
  * Table skeleton
263
289
  * @param param0
@@ -100,10 +100,11 @@ export declare const EXPAND_COLLAPSE_ICON_WIDTH = 12;
100
100
  export declare const CF_ICON_WIDTH = 14;
101
101
  export declare const CF_ICON_SPACING = 4;
102
102
  export declare const HEADER_MENU_DIM = 15;
103
- export declare const INVALID_COLOR = "#FF5621";
104
- export declare const ERROR_COLOR = "#ff0000";
105
- export declare const NOTE_COLOR = "#E68500";
106
- export declare const COMMENT_COLOR = "#FAB00B";
103
+ export declare const INDICATOR_SIZE = 6.5;
104
+ export declare const INVALID_COLOR = "#FF0000";
105
+ export declare const ERROR_COLOR = "#008000";
106
+ export declare const NOTE_COLOR = "#FF0000";
107
+ export declare const COMMENT_COLOR = "#7719AA";
107
108
  export declare const DEFAULT_CELL_INPUT_LINE_HEIGHT = "23px";
108
109
  export declare const FORMULA_BAR_HEIGHT = 23;
109
110
  export declare const SCROLLBAR_SIZE = 13;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"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"}
@@ -128,14 +128,18 @@ export const CF_ICON_WIDTH = 14;
128
128
  export const CF_ICON_SPACING = 4;
129
129
  // Header menu
130
130
  export const HEADER_MENU_DIM = 15;
131
- // Invalid cell
132
- export const INVALID_COLOR = "#FF5621";
133
- // Error cell
134
- export const ERROR_COLOR = "#ff0000";
135
- // Note cell
136
- export const NOTE_COLOR = "#E68500";
137
- // Comment cell
138
- export const COMMENT_COLOR = "#FAB00B";
131
+ // Cell indicators (Excel's places and colours). Sizes are at 100 % zoom; the grid multiplies by
132
+ // the zoom scale.
133
+ export const INDICATOR_SIZE = 6.5;
134
+ // Invalid cell: Data → Data Validation → Circle Invalid Data draws a red circle. Excel does not
135
+ // mark an invalid cell otherwise.
136
+ export const INVALID_COLOR = "#FF0000";
137
+ // Error-checking indicator: green ◤ in the top-left corner (Excel's "Automatic" indicator colour).
138
+ export const ERROR_COLOR = "#008000";
139
+ // Note: red ◥ in the top-right corner.
140
+ export const NOTE_COLOR = "#FF0000";
141
+ // Threaded comment: purple marker in the top-right corner.
142
+ export const COMMENT_COLOR = "#7719AA";
139
143
  // CellInput
140
144
  export const DEFAULT_CELL_INPUT_LINE_HEIGHT = "23px";
141
145
  // Formula bar
@@ -4,6 +4,7 @@ import { Direction } from "@rowsncolumns/grid";
4
4
  import type { FormulaLocale } from "@rowsncolumns/utils";
5
5
  import type { CellDiff } from "@rowsncolumns/version-comparison";
6
6
  import React from "react";
7
+ import type { ErrorCheckKind } from "../api/error-checking";
7
8
  import type { CanvasGridProps, SpreadsheetTheme } from "../components/canvas-grid/typings";
8
9
  import type { CellData, CellFormat, Color, DataValidationRule, ErrorValue, SortOrder, TextFormat } from "../types";
9
10
  import type { useSizer } from "./use-sizer";
@@ -222,6 +223,16 @@ export type CellRendererProps<T extends CellData = CellData> = {
222
223
  * Width of grid line
223
224
  */
224
225
  gridLineWidth: number;
226
+ /**
227
+ * Excel's background error checking: which rule flags this cell (formula error, number stored
228
+ * as text), or `undefined`. Flagged cells get the green ◤ indicator.
229
+ */
230
+ getErrorCheck?(sheetId: number, rowIndex: number, columnIndex: number): ErrorCheckKind | undefined;
231
+ /**
232
+ * Data → Data Validation → Circle Invalid Data: circle every cell that fails its validation.
233
+ * Off by default — Excel does not mark invalid cells otherwise.
234
+ */
235
+ circleInvalidData?: boolean;
225
236
  /**
226
237
  * Display notes indicator
227
238
  */
@@ -280,5 +291,5 @@ export type CellRendererProps<T extends CellData = CellData> = {
280
291
  */
281
292
  getDefaultHorizontalAlignment(sheetId: number, rowIndex: number, columnIndex: number): HorizontalAlign | undefined;
282
293
  };
283
- export declare const useCellRenderer: <T extends CellData = CellData>({ sheetId, scale, showGridLines, showZeros, isRowHeader, isColumnHeader, selectedRows, selectedColumns, selectedRowHeaders, selectedColumnHeaders, cellBackgroundColor, headerBorderColor, headerBackgroundColor, headerColor, headerActiveBackgroundColor, headerSelectedBackgroundColor, headerSelectedColor, headerTableBackgroundColor, headerTableActiveBackgroundColor, headerTableSelectedBackgroundColor, chipBackgroundColor, filterIconColor, showCalculatedColumnIcon, enableTextOverflow, showHeaders, theme, getDefaultHorizontalAlignment, isTableFilterVisible, columnContainsTable, rowsContainsTable, canOverflowToNextCell, getTableHeaderSortOrder, getDataValidation, getErrorValue, formulaLocale, locale, getEffectiveValue, getSparklineGroup, getFormattedValue, getNote, getComment, getEffectiveCellFormat, getCellBounds, getCellImageUrl, getCellMetaType, getRowHeaderText, getColumnHeaderText, getMaximumOverflowTextWidth, getCenterAcrossSelectionSpan, activeCell, getTextDimension, getCellGroupingInfo, getTextFormatRuns, onRequestEdit, onFilterClick, onCheckboxClick, isTableHeader, isTableTotalsCell, onTotalsArrowClick, isCalculatedColumnHeader, isTableHeaderFilterActive, HeaderCell, Cell, StructuredResult, gridLineWidth, showNotes, showComments, defaultFontSizePoint, lineHeightMode, readonly, onExpandCollapse, onOverflow, isComparing, getCellDiff, }: CellRendererProps<T>) => readonly [(props: RendererProps) => React.JSX.Element | null, (props: RendererProps) => React.JSX.Element, (props: RendererProps) => React.JSX.Element | null, (props: RendererProps) => React.JSX.Element | null | undefined, (cells: RendererProps[]) => React.JSX.Element];
294
+ export declare const useCellRenderer: <T extends CellData = CellData>({ sheetId, scale, showGridLines, showZeros, isRowHeader, isColumnHeader, selectedRows, selectedColumns, selectedRowHeaders, selectedColumnHeaders, cellBackgroundColor, headerBorderColor, headerBackgroundColor, headerColor, headerActiveBackgroundColor, headerSelectedBackgroundColor, headerSelectedColor, headerTableBackgroundColor, headerTableActiveBackgroundColor, headerTableSelectedBackgroundColor, chipBackgroundColor, filterIconColor, showCalculatedColumnIcon, enableTextOverflow, showHeaders, theme, getDefaultHorizontalAlignment, isTableFilterVisible, columnContainsTable, rowsContainsTable, canOverflowToNextCell, getTableHeaderSortOrder, getDataValidation, getErrorValue, formulaLocale, locale, getEffectiveValue, getSparklineGroup, getFormattedValue, getNote, getComment, getEffectiveCellFormat, getCellBounds, getCellImageUrl, getCellMetaType, getRowHeaderText, getColumnHeaderText, getMaximumOverflowTextWidth, getCenterAcrossSelectionSpan, activeCell, getTextDimension, getCellGroupingInfo, getTextFormatRuns, onRequestEdit, onFilterClick, onCheckboxClick, isTableHeader, isTableTotalsCell, onTotalsArrowClick, isCalculatedColumnHeader, isTableHeaderFilterActive, HeaderCell, Cell, StructuredResult, gridLineWidth, getErrorCheck, circleInvalidData, showNotes, showComments, defaultFontSizePoint, lineHeightMode, readonly, onExpandCollapse, onOverflow, isComparing, getCellDiff, }: CellRendererProps<T>) => readonly [(props: RendererProps) => React.JSX.Element | null, (props: RendererProps) => React.JSX.Element, (props: RendererProps) => React.JSX.Element | null, (props: RendererProps) => React.JSX.Element | null | undefined, (cells: RendererProps[]) => React.JSX.Element];
284
295
  //# sourceMappingURL=use-cell-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-cell-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-cell-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,4BAA4B,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAsB,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AAoB3C,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,UAAU,EACX,MAAM,UAAU,CAAC;AAGlB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1C,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B,EAAE,MAAM,CAAC;IACpC,6BAA6B,EAAE,MAAM,CAAC;IACtC,gCAAgC,EAAE,MAAM,CAAC;IACzC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;IACnC,kCAAkC,EAAE,MAAM,CAAC;IAC3C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,OAAO,CAAC;IAClC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9D;;;OAGG;IACH,iBAAiB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,kBAAkB,CAAC,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/C,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9D,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACzD,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACzE,yBAAyB,CACvB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,uBAAuB,EAAE,CACvB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;IAClC,oBAAoB,CAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,qBAAqB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC;IACxD,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,kBAAkB,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACvB;;;OAGG;IACH,iBAAiB,CAAC,CAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,GAClB;QAAE,OAAO,EAAE,aAAa,CAAC;YAAE,IAAI,EAAE,aAAa,CAAA;SAAE,CAAC,CAAA;KAAE,GAAG,SAAS,CAAC;IACnE,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,UAAU,GAAG,SAAS,CAAC;IAC1B;;;;OAIG;IACH,sBAAsB,CACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG;QAClC,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF;;;;OAIG;IACH,eAAe,CACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAAC;IACtB;;;;OAIG;IACH,eAAe,CACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,CAAC,CAAC,UAAU,CAAC,CAAC;IACjB;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3C;;;OAGG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IACjD;;;;OAIG;IACH,OAAO,CACL,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAAC;IACtB;;;;OAIG;IACH,UAAU,CACR,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,CAAC,CAAC,iBAAiB,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;IAC3C;;;;;OAKG;IACH;;;;OAIG;IACH,iBAAiB,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC;IACxD;;;;OAIG;IACH,2BAA2B,CACzB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,qBAAqB,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,EACvD,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,EACzC,UAAU,EAAE,OAAO,GAAG,SAAS,EAC/B,SAAS,EAAE,SAAS;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,GACjB;QACD,MAAM;QACN;YACE,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,MAAM;YACnB,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI;SAC9B,EAAE;QACH,MAAM,CAAC;KACR,CAAC;IACF;;;;;OAKG;IACH;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAClC,4BAA4B,CAAC,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAEjB;QACE,MAAM;QACN;YACE,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,MAAM;YACnB,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI;SAC9B,EAAE;QACH,MAAM;KACP,GACD,SAAS,CAAC;IACd;;;;;;OAMG;IACH,gBAAgB,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClE;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1D;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IACzC;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7D;;;;OAIG;IACH,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,SAAS,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7E;;OAEG;IACH,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C;;OAEG;IACH,UAAU,EAAE,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;IACvD;;OAEG;IACH,gBAAgB,EAAE,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnE;;OAEG;IACH,KAAK,EAAE,gBAAgB,CAAC;IACxB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B;;OAEG;IACH,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC3E;;;OAGG;IACH,cAAc,EAAE,WAAW,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/D;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE,OAAO,GACrB,IAAI,CAAC;IACR,UAAU,CAAC,EAAE,CACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;IACV;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,QAAQ,GAAG,IAAI,CAAC;IAErB;;;;;OAKG;IACH,6BAA6B,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,eAAe,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,g1CA2E5D,iBAAiB,CAAC,CAAC,CAAC,uBAgnBX,aAAa,uCAnmBb,aAAa,gCAkfb,aAAa,uCApFb,aAAa,mDAoRb,aAAa,EAAE,uBA0B1B,CAAC"}
1
+ {"version":3,"file":"use-cell-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-cell-renderer.tsx"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ import { getCellBordersForRendering } from "../helpers/merged-cell-borders";
16
16
  import { getStringifiedColor } from "../themes";
17
17
  import { applyShowZeros } from "./show-zeros";
18
18
  import { useCellDiffHighlight } from "./use-cell-diff-highlight";
19
- export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRowHeader, isColumnHeader, selectedRows, selectedColumns, selectedRowHeaders, selectedColumnHeaders, cellBackgroundColor, headerBorderColor, headerBackgroundColor, headerColor, headerActiveBackgroundColor, headerSelectedBackgroundColor, headerSelectedColor, headerTableBackgroundColor, headerTableActiveBackgroundColor, headerTableSelectedBackgroundColor, chipBackgroundColor, filterIconColor, showCalculatedColumnIcon, enableTextOverflow, showHeaders, theme, getDefaultHorizontalAlignment, isTableFilterVisible, columnContainsTable, rowsContainsTable, canOverflowToNextCell, getTableHeaderSortOrder, getDataValidation, getErrorValue, formulaLocale, locale, getEffectiveValue, getSparklineGroup, getFormattedValue, getNote, getComment, getEffectiveCellFormat, getCellBounds, getCellImageUrl, getCellMetaType, getRowHeaderText, getColumnHeaderText, getMaximumOverflowTextWidth, getCenterAcrossSelectionSpan, activeCell, getTextDimension, getCellGroupingInfo, getTextFormatRuns, onRequestEdit, onFilterClick, onCheckboxClick, isTableHeader, isTableTotalsCell, onTotalsArrowClick, isCalculatedColumnHeader, isTableHeaderFilterActive, HeaderCell, Cell, StructuredResult, gridLineWidth, showNotes, showComments, defaultFontSizePoint, lineHeightMode, readonly, onExpandCollapse, onOverflow, isComparing = false, getCellDiff, }) => {
19
+ export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRowHeader, isColumnHeader, selectedRows, selectedColumns, selectedRowHeaders, selectedColumnHeaders, cellBackgroundColor, headerBorderColor, headerBackgroundColor, headerColor, headerActiveBackgroundColor, headerSelectedBackgroundColor, headerSelectedColor, headerTableBackgroundColor, headerTableActiveBackgroundColor, headerTableSelectedBackgroundColor, chipBackgroundColor, filterIconColor, showCalculatedColumnIcon, enableTextOverflow, showHeaders, theme, getDefaultHorizontalAlignment, isTableFilterVisible, columnContainsTable, rowsContainsTable, canOverflowToNextCell, getTableHeaderSortOrder, getDataValidation, getErrorValue, formulaLocale, locale, getEffectiveValue, getSparklineGroup, getFormattedValue, getNote, getComment, getEffectiveCellFormat, getCellBounds, getCellImageUrl, getCellMetaType, getRowHeaderText, getColumnHeaderText, getMaximumOverflowTextWidth, getCenterAcrossSelectionSpan, activeCell, getTextDimension, getCellGroupingInfo, getTextFormatRuns, onRequestEdit, onFilterClick, onCheckboxClick, isTableHeader, isTableTotalsCell, onTotalsArrowClick, isCalculatedColumnHeader, isTableHeaderFilterActive, HeaderCell, Cell, StructuredResult, gridLineWidth, getErrorCheck, circleInvalidData = false, showNotes, showComments, defaultFontSizePoint, lineHeightMode, readonly, onExpandCollapse, onOverflow, isComparing = false, getCellDiff, }) => {
20
20
  // Version comparison diff highlighting - only active when isComparing is true
21
21
  const { mergeCellFormatWithDiff, getDiffHighlight } = useCellDiffHighlight(isComparing ? getCellDiff : undefined);
22
22
  // Edit
@@ -171,6 +171,7 @@ export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRo
171
171
  // Error from formula calculation (Error icon). Both engines store the canonical spelling
172
172
  // (`#VALUE!`); the grid paints the formula locale's (`#ЗНАЧ!`).
173
173
  const isError = errorValue?.type === "Error";
174
+ const showErrorIndicator = !!getErrorCheck?.(sheetId, rowIndex, columnIndex);
174
175
  const displayValue = isError
175
176
  ? localizeErrorValue(displayFormattedValue, formulaLocale)
176
177
  : displayFormattedValue;
@@ -199,7 +200,7 @@ export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRo
199
200
  ? undefined
200
201
  : getCellNumberFormatLayout(effectiveCellFormat?.numberFormat?.pattern, getExtendedValueNumber(effectiveValue) ??
201
202
  getExtendedValueString(effectiveValue), displayValue, locale);
202
- return (React.createElement(Cell, { value: displayValue, numberFormatLayout: numberFormatLayout, cellFormat: effectiveCellFormat, scale: scale, defaultBackgroundColor: cellBackgroundColor, onRequestEdit: onRequestEditCell, onArrowClick: showTotalsArrow ? onTotalsArrowClick : undefined, showArrow: showArrow, arrowOutside: showValidationArrow, showFilter: showFilter, isCalculatedColumn: isCalculatedColumn, showCheckbox: showCheckbox, showChip: showChip, chipBackgroundColor: chipBackgroundColor, filterIconColor: filterIconColor, onFilterClick: onFilterClick, onCheckboxClick: onCheckboxClick, isChecked: isChecked, isInvalid: isInvalid, isError: isError, imageUrl: imageUrl, isFilterActive: isFilterActive, enableOverflow: enableOverflow, cellWidth: cellWidth, showNote: showNote, showComment: showComment, showCalculatedColumnIcon: showCalculatedColumnIcon, theme: theme, expandable: expandable, expanded: expanded, textWidth: textWidth, columnSpans: columnSpans, overflowRight: overflowRight, overflowLeft: enableOverflow && (isCentered || centerAcrossSpan)
203
+ return (React.createElement(Cell, { value: displayValue, numberFormatLayout: numberFormatLayout, cellFormat: effectiveCellFormat, scale: scale, defaultBackgroundColor: cellBackgroundColor, onRequestEdit: onRequestEditCell, onArrowClick: showTotalsArrow ? onTotalsArrowClick : undefined, showArrow: showArrow, arrowOutside: showValidationArrow, showFilter: showFilter, isCalculatedColumn: isCalculatedColumn, showCheckbox: showCheckbox, showChip: showChip, chipBackgroundColor: chipBackgroundColor, filterIconColor: filterIconColor, onFilterClick: onFilterClick, onCheckboxClick: onCheckboxClick, isChecked: isChecked, isInvalid: isInvalid, isError: isError, showErrorIndicator: showErrorIndicator, circleInvalid: circleInvalidData && isInvalid, imageUrl: imageUrl, isFilterActive: isFilterActive, enableOverflow: enableOverflow, cellWidth: cellWidth, showNote: showNote, showComment: showComment, showCalculatedColumnIcon: showCalculatedColumnIcon, theme: theme, expandable: expandable, expanded: expanded, textWidth: textWidth, columnSpans: columnSpans, overflowRight: overflowRight, overflowLeft: enableOverflow && (isCentered || centerAcrossSpan)
203
204
  ? overflowLeft ?? 0
204
205
  : undefined, centerOnSpan: !!centerAcrossSpan, showGridLines: showGridLines, structuredValue: effectiveValue?.structuredValue, sparklineGroupAxis: effectiveValue?.structuredValue?.kind === "sparkline" &&
205
206
  getSparklineGroup
@@ -215,6 +216,8 @@ export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRo
215
216
  theme,
216
217
  showNotes,
217
218
  showComments,
219
+ getErrorCheck,
220
+ circleInvalidData,
218
221
  defaultFontSizePoint,
219
222
  lineHeightMode,
220
223
  cellBackgroundColor,