@rowsncolumns/spreadsheet 10.2.74 → 10.2.76

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 (280) hide show
  1. package/dist/cjs/api/excel-validation-kinds.d.ts +71 -0
  2. package/dist/cjs/api/excel-validation-kinds.d.ts.map +1 -0
  3. package/dist/cjs/api/excel-validation-kinds.js +304 -0
  4. package/dist/cjs/api/fill-series.d.ts +38 -0
  5. package/dist/cjs/api/fill-series.d.ts.map +1 -0
  6. package/dist/cjs/api/fill-series.js +89 -0
  7. package/dist/cjs/api/go-to-special.d.ts +32 -0
  8. package/dist/cjs/api/go-to-special.d.ts.map +1 -0
  9. package/dist/cjs/api/go-to-special.js +111 -0
  10. package/dist/cjs/api/spreadsheet-api.d.ts +6 -2
  11. package/dist/cjs/api/spreadsheet-api.d.ts.map +1 -1
  12. package/dist/cjs/api/spreadsheet-api.js +9 -3
  13. package/dist/cjs/api/validation-tooltip.d.ts +17 -0
  14. package/dist/cjs/api/validation-tooltip.d.ts.map +1 -0
  15. package/dist/cjs/api/validation-tooltip.js +42 -0
  16. package/dist/cjs/atoms/advanced-filter-dialog.atom.d.ts +28 -0
  17. package/dist/cjs/atoms/advanced-filter-dialog.atom.d.ts.map +1 -0
  18. package/dist/cjs/atoms/advanced-filter-dialog.atom.js +32 -0
  19. package/dist/cjs/atoms/fill-options.atom.d.ts +36 -0
  20. package/dist/cjs/atoms/fill-options.atom.d.ts.map +1 -0
  21. package/dist/cjs/atoms/fill-options.atom.js +11 -0
  22. package/dist/cjs/atoms/fill-series-dialog.atom.d.ts +26 -0
  23. package/dist/cjs/atoms/fill-series-dialog.atom.d.ts.map +1 -0
  24. package/dist/cjs/atoms/fill-series-dialog.atom.js +14 -0
  25. package/dist/cjs/atoms/go-to-dialog.atom.d.ts +11 -1
  26. package/dist/cjs/atoms/go-to-dialog.atom.d.ts.map +1 -1
  27. package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts +29 -0
  28. package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts.map +1 -0
  29. package/dist/cjs/atoms/goal-seek-dialog.atom.js +30 -0
  30. package/dist/cjs/atoms/index.d.ts +3 -0
  31. package/dist/cjs/atoms/index.d.ts.map +1 -1
  32. package/dist/cjs/atoms/index.js +3 -0
  33. package/dist/cjs/atoms/subtotal-dialog.atom.d.ts +39 -0
  34. package/dist/cjs/atoms/subtotal-dialog.atom.d.ts.map +1 -0
  35. package/dist/cjs/atoms/subtotal-dialog.atom.js +30 -0
  36. package/dist/cjs/atoms/text-to-columns-dialog.atom.d.ts +34 -0
  37. package/dist/cjs/atoms/text-to-columns-dialog.atom.d.ts.map +1 -0
  38. package/dist/cjs/atoms/text-to-columns-dialog.atom.js +36 -0
  39. package/dist/cjs/atoms/watch-window.atom.d.ts +37 -0
  40. package/dist/cjs/atoms/watch-window.atom.d.ts.map +1 -0
  41. package/dist/cjs/atoms/watch-window.atom.js +61 -0
  42. package/dist/cjs/components/advanced-filter-dialog/index.d.ts +28 -0
  43. package/dist/cjs/components/advanced-filter-dialog/index.d.ts.map +1 -0
  44. package/dist/cjs/components/advanced-filter-dialog/index.js +134 -0
  45. package/dist/cjs/components/calculation-options-dialog/index.d.ts +33 -0
  46. package/dist/cjs/components/calculation-options-dialog/index.d.ts.map +1 -0
  47. package/dist/cjs/components/calculation-options-dialog/index.js +69 -0
  48. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  49. package/dist/cjs/components/canvas-grid/index.js +328 -71
  50. package/dist/cjs/components/canvas-grid/typings.d.ts +31 -5
  51. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  52. package/dist/cjs/components/cell/alignment.d.ts +30 -0
  53. package/dist/cjs/components/cell/alignment.d.ts.map +1 -1
  54. package/dist/cjs/components/cell/alignment.js +56 -1
  55. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  56. package/dist/cjs/components/cell/index.js +15 -7
  57. package/dist/cjs/components/cell-diff/index.d.ts +3 -2
  58. package/dist/cjs/components/cell-diff/index.d.ts.map +1 -1
  59. package/dist/cjs/components/cell-editor/helpers.d.ts +9 -0
  60. package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
  61. package/dist/cjs/components/cell-editor/helpers.js +8 -1
  62. package/dist/cjs/components/cell-editor/helpers.spec.js +14 -0
  63. package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
  64. package/dist/cjs/components/cell-editor/index.js +7 -3
  65. package/dist/cjs/components/context-menu/index.d.ts +6 -1
  66. package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
  67. package/dist/cjs/components/context-menu/index.js +146 -3
  68. package/dist/cjs/components/embeds/embed-component.d.ts.map +1 -1
  69. package/dist/cjs/components/embeds/embed-component.js +16 -1
  70. package/dist/cjs/components/fill-series-dialog/index.d.ts +29 -0
  71. package/dist/cjs/components/fill-series-dialog/index.d.ts.map +1 -0
  72. package/dist/cjs/components/fill-series-dialog/index.js +156 -0
  73. package/dist/cjs/components/go-to-dialog/index.d.ts +11 -1
  74. package/dist/cjs/components/go-to-dialog/index.d.ts.map +1 -1
  75. package/dist/cjs/components/go-to-dialog/index.js +67 -24
  76. package/dist/cjs/components/goal-seek-dialog/index.d.ts +32 -0
  77. package/dist/cjs/components/goal-seek-dialog/index.d.ts.map +1 -0
  78. package/dist/cjs/components/goal-seek-dialog/index.js +149 -0
  79. package/dist/cjs/components/selection/fill-options-menu.d.ts +32 -0
  80. package/dist/cjs/components/selection/fill-options-menu.d.ts.map +1 -0
  81. package/dist/cjs/components/selection/fill-options-menu.js +65 -0
  82. package/dist/cjs/components/selection/index.d.ts +1 -1
  83. package/dist/cjs/components/selection/index.d.ts.map +1 -1
  84. package/dist/cjs/components/selection/index.js +4 -2
  85. package/dist/cjs/components/selection/types.d.ts +11 -1
  86. package/dist/cjs/components/selection/types.d.ts.map +1 -1
  87. package/dist/cjs/components/subtotal-dialog/index.d.ts +30 -0
  88. package/dist/cjs/components/subtotal-dialog/index.d.ts.map +1 -0
  89. package/dist/cjs/components/subtotal-dialog/index.js +126 -0
  90. package/dist/cjs/components/text-to-columns-dialog/index.d.ts +37 -0
  91. package/dist/cjs/components/text-to-columns-dialog/index.d.ts.map +1 -0
  92. package/dist/cjs/components/text-to-columns-dialog/index.js +166 -0
  93. package/dist/cjs/components/toolbar/background-color-selector.d.ts +13 -1
  94. package/dist/cjs/components/toolbar/background-color-selector.d.ts.map +1 -1
  95. package/dist/cjs/components/toolbar/background-color-selector.js +57 -11
  96. package/dist/cjs/components/toolbar/cell-style-selector.d.ts +15 -2
  97. package/dist/cjs/components/toolbar/cell-style-selector.d.ts.map +1 -1
  98. package/dist/cjs/components/toolbar/cell-style-selector.js +56 -3
  99. package/dist/cjs/components/toolbar/fill-selectors.d.ts +49 -0
  100. package/dist/cjs/components/toolbar/fill-selectors.d.ts.map +1 -0
  101. package/dist/cjs/components/toolbar/fill-selectors.js +196 -0
  102. package/dist/cjs/components/toolbar/index.d.ts +1 -0
  103. package/dist/cjs/components/toolbar/index.d.ts.map +1 -1
  104. package/dist/cjs/components/toolbar/index.js +1 -0
  105. package/dist/cjs/components/toolbar/text-format-selector.d.ts +9 -0
  106. package/dist/cjs/components/toolbar/text-format-selector.d.ts.map +1 -1
  107. package/dist/cjs/components/toolbar/text-format-selector.js +15 -3
  108. package/dist/cjs/components/toolbar/text-horizontal-align-selector.d.ts +8 -0
  109. package/dist/cjs/components/toolbar/text-horizontal-align-selector.d.ts.map +1 -1
  110. package/dist/cjs/components/toolbar/text-horizontal-align-selector.js +23 -4
  111. package/dist/cjs/components/watch-window/index.d.ts +25 -0
  112. package/dist/cjs/components/watch-window/index.d.ts.map +1 -0
  113. package/dist/cjs/components/watch-window/index.js +63 -0
  114. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  115. package/dist/cjs/hooks/use-cell-renderer.js +17 -6
  116. package/dist/cjs/hooks/use-editable.d.ts +11 -2
  117. package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
  118. package/dist/cjs/hooks/use-editable.js +8 -0
  119. package/dist/cjs/hooks/use-editor-submit.d.ts +32 -3
  120. package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
  121. package/dist/cjs/hooks/use-editor-submit.js +111 -2
  122. package/dist/cjs/hooks/use-get-tooltip.d.ts.map +1 -1
  123. package/dist/cjs/hooks/use-get-tooltip.js +7 -2
  124. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  125. package/dist/cjs/hooks/use-keyboard-handler.js +27 -14
  126. package/dist/cjs/hooks/use-selection-renderer.d.ts +13 -2
  127. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  128. package/dist/cjs/hooks/use-selection-renderer.js +21 -4
  129. package/dist/cjs/hooks/use-selection.d.ts +54 -4
  130. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  131. package/dist/cjs/hooks/use-selection.js +232 -37
  132. package/dist/cjs/index.d.ts +12 -0
  133. package/dist/cjs/index.d.ts.map +1 -1
  134. package/dist/cjs/index.js +11 -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 +156 -5
  138. package/dist/cjs/types.d.ts.map +1 -1
  139. package/dist/cjs/types.js +19 -1
  140. package/dist/esm/api/excel-validation-kinds.d.ts +71 -0
  141. package/dist/esm/api/excel-validation-kinds.d.ts.map +1 -0
  142. package/dist/esm/api/excel-validation-kinds.js +287 -0
  143. package/dist/esm/api/fill-series.d.ts +38 -0
  144. package/dist/esm/api/fill-series.d.ts.map +1 -0
  145. package/dist/esm/api/fill-series.js +78 -0
  146. package/dist/esm/api/go-to-special.d.ts +32 -0
  147. package/dist/esm/api/go-to-special.d.ts.map +1 -0
  148. package/dist/esm/api/go-to-special.js +96 -0
  149. package/dist/esm/api/spreadsheet-api.d.ts +6 -2
  150. package/dist/esm/api/spreadsheet-api.d.ts.map +1 -1
  151. package/dist/esm/api/spreadsheet-api.js +8 -3
  152. package/dist/esm/api/validation-tooltip.d.ts +17 -0
  153. package/dist/esm/api/validation-tooltip.d.ts.map +1 -0
  154. package/dist/esm/api/validation-tooltip.js +34 -0
  155. package/dist/esm/atoms/advanced-filter-dialog.atom.d.ts +28 -0
  156. package/dist/esm/atoms/advanced-filter-dialog.atom.d.ts.map +1 -0
  157. package/dist/esm/atoms/advanced-filter-dialog.atom.js +21 -0
  158. package/dist/esm/atoms/fill-options.atom.d.ts +36 -0
  159. package/dist/esm/atoms/fill-options.atom.d.ts.map +1 -0
  160. package/dist/esm/atoms/fill-options.atom.js +5 -0
  161. package/dist/esm/atoms/fill-series-dialog.atom.d.ts +26 -0
  162. package/dist/esm/atoms/fill-series-dialog.atom.d.ts.map +1 -0
  163. package/dist/esm/atoms/fill-series-dialog.atom.js +9 -0
  164. package/dist/esm/atoms/go-to-dialog.atom.d.ts +11 -1
  165. package/dist/esm/atoms/go-to-dialog.atom.d.ts.map +1 -1
  166. package/dist/esm/atoms/goal-seek-dialog.atom.d.ts +29 -0
  167. package/dist/esm/atoms/goal-seek-dialog.atom.d.ts.map +1 -0
  168. package/dist/esm/atoms/goal-seek-dialog.atom.js +21 -0
  169. package/dist/esm/atoms/index.d.ts +3 -0
  170. package/dist/esm/atoms/index.d.ts.map +1 -1
  171. package/dist/esm/atoms/index.js +3 -0
  172. package/dist/esm/atoms/subtotal-dialog.atom.d.ts +39 -0
  173. package/dist/esm/atoms/subtotal-dialog.atom.d.ts.map +1 -0
  174. package/dist/esm/atoms/subtotal-dialog.atom.js +21 -0
  175. package/dist/esm/atoms/text-to-columns-dialog.atom.d.ts +34 -0
  176. package/dist/esm/atoms/text-to-columns-dialog.atom.d.ts.map +1 -0
  177. package/dist/esm/atoms/text-to-columns-dialog.atom.js +25 -0
  178. package/dist/esm/atoms/watch-window.atom.d.ts +37 -0
  179. package/dist/esm/atoms/watch-window.atom.d.ts.map +1 -0
  180. package/dist/esm/atoms/watch-window.atom.js +37 -0
  181. package/dist/esm/components/advanced-filter-dialog/index.d.ts +28 -0
  182. package/dist/esm/components/advanced-filter-dialog/index.d.ts.map +1 -0
  183. package/dist/esm/components/advanced-filter-dialog/index.js +125 -0
  184. package/dist/esm/components/calculation-options-dialog/index.d.ts +33 -0
  185. package/dist/esm/components/calculation-options-dialog/index.d.ts.map +1 -0
  186. package/dist/esm/components/calculation-options-dialog/index.js +61 -0
  187. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  188. package/dist/esm/components/canvas-grid/index.js +266 -26
  189. package/dist/esm/components/canvas-grid/typings.d.ts +31 -5
  190. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  191. package/dist/esm/components/cell/alignment.d.ts +30 -0
  192. package/dist/esm/components/cell/alignment.d.ts.map +1 -1
  193. package/dist/esm/components/cell/alignment.js +51 -0
  194. package/dist/esm/components/cell/index.d.ts.map +1 -1
  195. package/dist/esm/components/cell/index.js +16 -8
  196. package/dist/esm/components/cell-diff/index.d.ts +3 -2
  197. package/dist/esm/components/cell-diff/index.d.ts.map +1 -1
  198. package/dist/esm/components/cell-editor/helpers.d.ts +9 -0
  199. package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
  200. package/dist/esm/components/cell-editor/helpers.js +6 -0
  201. package/dist/esm/components/cell-editor/helpers.spec.js +15 -1
  202. package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
  203. package/dist/esm/components/cell-editor/index.js +8 -4
  204. package/dist/esm/components/context-menu/index.d.ts +6 -1
  205. package/dist/esm/components/context-menu/index.d.ts.map +1 -1
  206. package/dist/esm/components/context-menu/index.js +139 -4
  207. package/dist/esm/components/embeds/embed-component.d.ts.map +1 -1
  208. package/dist/esm/components/embeds/embed-component.js +17 -1
  209. package/dist/esm/components/fill-series-dialog/index.d.ts +29 -0
  210. package/dist/esm/components/fill-series-dialog/index.d.ts.map +1 -0
  211. package/dist/esm/components/fill-series-dialog/index.js +151 -0
  212. package/dist/esm/components/go-to-dialog/index.d.ts +11 -1
  213. package/dist/esm/components/go-to-dialog/index.d.ts.map +1 -1
  214. package/dist/esm/components/go-to-dialog/index.js +63 -23
  215. package/dist/esm/components/goal-seek-dialog/index.d.ts +32 -0
  216. package/dist/esm/components/goal-seek-dialog/index.d.ts.map +1 -0
  217. package/dist/esm/components/goal-seek-dialog/index.js +125 -0
  218. package/dist/esm/components/selection/fill-options-menu.d.ts +32 -0
  219. package/dist/esm/components/selection/fill-options-menu.d.ts.map +1 -0
  220. package/dist/esm/components/selection/fill-options-menu.js +63 -0
  221. package/dist/esm/components/selection/index.d.ts +1 -1
  222. package/dist/esm/components/selection/index.d.ts.map +1 -1
  223. package/dist/esm/components/selection/index.js +4 -2
  224. package/dist/esm/components/selection/types.d.ts +11 -1
  225. package/dist/esm/components/selection/types.d.ts.map +1 -1
  226. package/dist/esm/components/subtotal-dialog/index.d.ts +30 -0
  227. package/dist/esm/components/subtotal-dialog/index.d.ts.map +1 -0
  228. package/dist/esm/components/subtotal-dialog/index.js +115 -0
  229. package/dist/esm/components/text-to-columns-dialog/index.d.ts +37 -0
  230. package/dist/esm/components/text-to-columns-dialog/index.d.ts.map +1 -0
  231. package/dist/esm/components/text-to-columns-dialog/index.js +147 -0
  232. package/dist/esm/components/toolbar/background-color-selector.d.ts +13 -1
  233. package/dist/esm/components/toolbar/background-color-selector.d.ts.map +1 -1
  234. package/dist/esm/components/toolbar/background-color-selector.js +61 -11
  235. package/dist/esm/components/toolbar/cell-style-selector.d.ts +15 -2
  236. package/dist/esm/components/toolbar/cell-style-selector.d.ts.map +1 -1
  237. package/dist/esm/components/toolbar/cell-style-selector.js +46 -2
  238. package/dist/esm/components/toolbar/fill-selectors.d.ts +49 -0
  239. package/dist/esm/components/toolbar/fill-selectors.d.ts.map +1 -0
  240. package/dist/esm/components/toolbar/fill-selectors.js +162 -0
  241. package/dist/esm/components/toolbar/index.d.ts +1 -0
  242. package/dist/esm/components/toolbar/index.d.ts.map +1 -1
  243. package/dist/esm/components/toolbar/index.js +1 -0
  244. package/dist/esm/components/toolbar/text-format-selector.d.ts +9 -0
  245. package/dist/esm/components/toolbar/text-format-selector.d.ts.map +1 -1
  246. package/dist/esm/components/toolbar/text-format-selector.js +14 -2
  247. package/dist/esm/components/toolbar/text-horizontal-align-selector.d.ts +8 -0
  248. package/dist/esm/components/toolbar/text-horizontal-align-selector.d.ts.map +1 -1
  249. package/dist/esm/components/toolbar/text-horizontal-align-selector.js +21 -5
  250. package/dist/esm/components/watch-window/index.d.ts +25 -0
  251. package/dist/esm/components/watch-window/index.d.ts.map +1 -0
  252. package/dist/esm/components/watch-window/index.js +54 -0
  253. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  254. package/dist/esm/hooks/use-cell-renderer.js +17 -6
  255. package/dist/esm/hooks/use-editable.d.ts +11 -2
  256. package/dist/esm/hooks/use-editable.d.ts.map +1 -1
  257. package/dist/esm/hooks/use-editable.js +8 -0
  258. package/dist/esm/hooks/use-editor-submit.d.ts +32 -3
  259. package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
  260. package/dist/esm/hooks/use-editor-submit.js +82 -3
  261. package/dist/esm/hooks/use-get-tooltip.d.ts.map +1 -1
  262. package/dist/esm/hooks/use-get-tooltip.js +7 -2
  263. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  264. package/dist/esm/hooks/use-keyboard-handler.js +27 -14
  265. package/dist/esm/hooks/use-selection-renderer.d.ts +13 -2
  266. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  267. package/dist/esm/hooks/use-selection-renderer.js +22 -5
  268. package/dist/esm/hooks/use-selection.d.ts +54 -4
  269. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  270. package/dist/esm/hooks/use-selection.js +220 -36
  271. package/dist/esm/index.d.ts +12 -0
  272. package/dist/esm/index.d.ts.map +1 -1
  273. package/dist/esm/index.js +11 -0
  274. package/dist/esm/release-date.js +1 -1
  275. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  276. package/dist/esm/types.d.ts +156 -5
  277. package/dist/esm/types.d.ts.map +1 -1
  278. package/dist/esm/types.js +18 -0
  279. package/dist/spreadsheet.min.css +1 -1
  280. package/package.json +7 -7
@@ -0,0 +1,49 @@
1
+ import React from "react";
2
+ import type { CellFormat, FillPattern, GradientFill } from "../../types";
3
+ import type { SpreadsheetTheme } from "../canvas-grid/typings";
4
+ /** The fill-related slice of a cell format the fill popover authors. */
5
+ export type CellFill = Pick<CellFormat, "backgroundColor" | "fillPattern" | "foregroundColor" | "gradient">;
6
+ /** Excel's Format Cells → Fill → Pattern Style menu, in Excel's order. */
7
+ export declare const FILL_PATTERN_OPTIONS: ReadonlyArray<{
8
+ pattern: FillPattern;
9
+ label: string;
10
+ }>;
11
+ /**
12
+ * Excel's Fill Effects → Shading styles. `degree` follows OOXML
13
+ * `<gradientFill degree>`: 0 runs left → right, 90 top → bottom.
14
+ */
15
+ export declare const GRADIENT_PRESETS: ReadonlyArray<{
16
+ label: string;
17
+ gradient: Omit<GradientFill, "stops">;
18
+ }>;
19
+ /** Two-stop gradient from a preset and two colours. */
20
+ export declare const buildGradientFill: (preset: Omit<GradientFill, "stops">, color1: string, color2: string) => GradientFill;
21
+ /**
22
+ * CSS preview of a gradient fill. OOXML measures the linear angle from the
23
+ * left→right axis; CSS from the bottom→top axis, so CSS = degree + 90.
24
+ */
25
+ export declare const gradientToCss: (gradient: GradientFill) => string;
26
+ export type PatternFillPickerProps = {
27
+ fill?: CellFill | null;
28
+ theme: SpreadsheetTheme;
29
+ onChangeFill(fill: CellFill): void;
30
+ };
31
+ /**
32
+ * Pattern fill authoring (Excel: Format Cells → Fill → Pattern Color /
33
+ * Pattern Style). The pattern paints in `foregroundColor` over the solid
34
+ * `backgroundColor`; a gradient on the cell is cleared, as Excel treats the
35
+ * two as exclusive.
36
+ */
37
+ export declare const PatternFillPicker: ({ fill, theme, onChangeFill, }: PatternFillPickerProps) => React.JSX.Element;
38
+ export type GradientFillPickerProps = {
39
+ fill?: CellFill | null;
40
+ theme: SpreadsheetTheme;
41
+ onChangeFill(fill: CellFill): void;
42
+ };
43
+ /**
44
+ * Gradient fill authoring (Excel: Fill Effects → Gradient, two colours +
45
+ * shading style). Picking a style applies immediately with the two colours;
46
+ * changing a colour re-applies when the cell already has a gradient.
47
+ */
48
+ export declare const GradientFillPicker: ({ fill, theme, onChangeFill, }: GradientFillPickerProps) => React.JSX.Element;
49
+ //# sourceMappingURL=fill-selectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill-selectors.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/fill-selectors.tsx"],"names":[],"mappings":"AACA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAIjD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,wEAAwE;AACxE,MAAM,MAAM,QAAQ,GAAG,IAAI,CACzB,UAAU,EACV,iBAAiB,GAAG,aAAa,GAAG,iBAAiB,GAAG,UAAU,CACnE,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC;IAC/C,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf,CAkBA,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;CACvC,CASA,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,EACnC,QAAQ,MAAM,EACd,QAAQ,MAAM,KACb,YAMD,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,UAAU,YAAY,KAAG,MAUtD,CAAC;AAqCF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,gCAI/B,sBAAsB,sBA+ExB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,gCAIhC,uBAAuB,sBA8FzB,CAAC"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GradientFillPicker = exports.PatternFillPicker = exports.gradientToCss = exports.buildGradientFill = exports.GRADIENT_PRESETS = exports.FILL_PATTERN_OPTIONS = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var ui_1 = require("@rowsncolumns/ui");
6
+ var react_1 = tslib_1.__importStar(require("react"));
7
+ var fill_patterns_1 = require("../../api/fill-patterns");
8
+ var themes_1 = require("../../themes");
9
+ /** Excel's Format Cells → Fill → Pattern Style menu, in Excel's order. */
10
+ exports.FILL_PATTERN_OPTIONS = [
11
+ { pattern: "gray0625", label: "6.25% Gray" },
12
+ { pattern: "gray125", label: "12.5% Gray" },
13
+ { pattern: "lightGray", label: "25% Gray" },
14
+ { pattern: "mediumGray", label: "50% Gray" },
15
+ { pattern: "darkGray", label: "75% Gray" },
16
+ { pattern: "darkHorizontal", label: "Horizontal Stripe" },
17
+ { pattern: "darkVertical", label: "Vertical Stripe" },
18
+ { pattern: "darkDown", label: "Reverse Diagonal Stripe" },
19
+ { pattern: "darkUp", label: "Diagonal Stripe" },
20
+ { pattern: "darkGrid", label: "Diagonal Crosshatch" },
21
+ { pattern: "darkTrellis", label: "Thick Diagonal Crosshatch" },
22
+ { pattern: "lightHorizontal", label: "Thin Horizontal Stripe" },
23
+ { pattern: "lightVertical", label: "Thin Vertical Stripe" },
24
+ { pattern: "lightDown", label: "Thin Reverse Diagonal Stripe" },
25
+ { pattern: "lightUp", label: "Thin Diagonal Stripe" },
26
+ { pattern: "lightGrid", label: "Thin Horizontal Crosshatch" },
27
+ { pattern: "lightTrellis", label: "Thin Diagonal Crosshatch" },
28
+ ];
29
+ /**
30
+ * Excel's Fill Effects → Shading styles. `degree` follows OOXML
31
+ * `<gradientFill degree>`: 0 runs left → right, 90 top → bottom.
32
+ */
33
+ exports.GRADIENT_PRESETS = [
34
+ { label: "Horizontal", gradient: { type: "linear", degree: 90 } },
35
+ { label: "Vertical", gradient: { type: "linear", degree: 0 } },
36
+ { label: "Diagonal up", gradient: { type: "linear", degree: 45 } },
37
+ { label: "Diagonal down", gradient: { type: "linear", degree: 135 } },
38
+ {
39
+ label: "From center",
40
+ gradient: { type: "path", left: 0.5, right: 0.5, top: 0.5, bottom: 0.5 },
41
+ },
42
+ ];
43
+ /** Two-stop gradient from a preset and two colours. */
44
+ var buildGradientFill = function (preset, color1, color2) { return (tslib_1.__assign(tslib_1.__assign({}, preset), { stops: [
45
+ { position: 0, color: color1 },
46
+ { position: 1, color: color2 },
47
+ ] })); };
48
+ exports.buildGradientFill = buildGradientFill;
49
+ /**
50
+ * CSS preview of a gradient fill. OOXML measures the linear angle from the
51
+ * left→right axis; CSS from the bottom→top axis, so CSS = degree + 90.
52
+ */
53
+ var gradientToCss = function (gradient) {
54
+ var _a;
55
+ var stops = gradient.stops
56
+ .slice()
57
+ .sort(function (a, b) { return a.position - b.position; })
58
+ .map(function (stop) { return "".concat(stop.color, " ").concat(Math.round(stop.position * 100), "%"); })
59
+ .join(", ");
60
+ if (gradient.type === "path") {
61
+ return "radial-gradient(circle, ".concat(stops, ")");
62
+ }
63
+ return "linear-gradient(".concat((((_a = gradient.degree) !== null && _a !== void 0 ? _a : 0) + 90) % 360, "deg, ").concat(stops, ")");
64
+ };
65
+ exports.gradientToCss = gradientToCss;
66
+ var DEFAULT_PATTERN_COLOR = "#000000";
67
+ var PatternSwatch = function (_a) {
68
+ var pattern = _a.pattern, foregroundColor = _a.foregroundColor, backgroundColor = _a.backgroundColor, label = _a.label;
69
+ var url = (0, react_1.useMemo)(function () {
70
+ var _a;
71
+ var canvas = (0, fill_patterns_1.getPatternCanvas)(pattern, foregroundColor, backgroundColor);
72
+ try {
73
+ return (_a = canvas === null || canvas === void 0 ? void 0 : canvas.toDataURL()) !== null && _a !== void 0 ? _a : undefined;
74
+ }
75
+ catch (_b) {
76
+ return undefined;
77
+ }
78
+ }, [pattern, foregroundColor, backgroundColor]);
79
+ return (react_1.default.createElement("span", { "aria-hidden": "true", className: "block w-full h-full border border-solid border-rnc-border", style: url
80
+ ? { backgroundImage: "url(".concat(url, ")"), backgroundRepeat: "repeat" }
81
+ : { backgroundColor: backgroundColor }, title: label }));
82
+ };
83
+ /**
84
+ * Pattern fill authoring (Excel: Format Cells → Fill → Pattern Color /
85
+ * Pattern Style). The pattern paints in `foregroundColor` over the solid
86
+ * `backgroundColor`; a gradient on the cell is cleared, as Excel treats the
87
+ * two as exclusive.
88
+ */
89
+ var PatternFillPicker = function (_a) {
90
+ var fill = _a.fill, theme = _a.theme, onChangeFill = _a.onChangeFill;
91
+ var background = (fill === null || fill === void 0 ? void 0 : fill.backgroundColor)
92
+ ? (0, themes_1.getStringifiedColor)(fill.backgroundColor, theme)
93
+ : undefined;
94
+ var patternColor = (fill === null || fill === void 0 ? void 0 : fill.foregroundColor)
95
+ ? (0, themes_1.getStringifiedColor)(fill.foregroundColor, theme)
96
+ : DEFAULT_PATTERN_COLOR;
97
+ var activePattern = (fill === null || fill === void 0 ? void 0 : fill.fillPattern) &&
98
+ fill.fillPattern !== "none" &&
99
+ fill.fillPattern !== "solid"
100
+ ? fill.fillPattern
101
+ : undefined;
102
+ var apply = function (pattern, foregroundColor) {
103
+ var _a;
104
+ return onChangeFill({
105
+ backgroundColor: (_a = fill === null || fill === void 0 ? void 0 : fill.backgroundColor) !== null && _a !== void 0 ? _a : undefined,
106
+ fillPattern: pattern,
107
+ foregroundColor: pattern ? foregroundColor : undefined,
108
+ gradient: undefined,
109
+ });
110
+ };
111
+ return (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1" },
112
+ react_1.default.createElement(ui_1.Button, { variant: "outline", size: "xs", tabIndex: -1, className: "justify-center py-1", onClick: function () { return apply(undefined, undefined); } }, "No pattern"),
113
+ react_1.default.createElement("div", { className: "pt-2 text-xs text-left" }, "Pattern style"),
114
+ react_1.default.createElement("div", { role: "group", "aria-label": "Pattern style", className: "grid grid-cols-6 gap-1" }, exports.FILL_PATTERN_OPTIONS.map(function (_a) {
115
+ var pattern = _a.pattern, label = _a.label;
116
+ return (react_1.default.createElement("button", { type: "button", key: pattern, "aria-label": label, "aria-pressed": activePattern === pattern, className: "w-6 h-6 p-0 border-2 border-solid rounded-sm bg-transparent cursor-pointer ".concat(activePattern === pattern
117
+ ? "border-rnc-primary"
118
+ : "border-transparent"), onClick: function () {
119
+ return apply(pattern, (fill === null || fill === void 0 ? void 0 : fill.foregroundColor) ? patternColor : undefined);
120
+ } },
121
+ react_1.default.createElement(PatternSwatch, { pattern: pattern, foregroundColor: patternColor, backgroundColor: background, label: label })));
122
+ })),
123
+ react_1.default.createElement("div", { className: "pt-2 text-xs text-left" }, "Pattern color"),
124
+ react_1.default.createElement(ui_1.ColorPicker, { value: patternColor, colors: themes_1.STANDARD_COLORS, onChange: function (color) { return apply(activePattern !== null && activePattern !== void 0 ? activePattern : "darkGray", color); }, className: "gap-1" }),
125
+ react_1.default.createElement("div", { className: "flex items-center gap-1" },
126
+ react_1.default.createElement(ui_1.HexColorPicker, { value: patternColor, onChange: function (color) { return apply(activePattern !== null && activePattern !== void 0 ? activePattern : "darkGray", color); } }))));
127
+ };
128
+ exports.PatternFillPicker = PatternFillPicker;
129
+ /**
130
+ * Gradient fill authoring (Excel: Fill Effects → Gradient, two colours +
131
+ * shading style). Picking a style applies immediately with the two colours;
132
+ * changing a colour re-applies when the cell already has a gradient.
133
+ */
134
+ var GradientFillPicker = function (_a) {
135
+ var _b;
136
+ var fill = _a.fill, theme = _a.theme, onChangeFill = _a.onChangeFill;
137
+ var existing = (_b = fill === null || fill === void 0 ? void 0 : fill.gradient) !== null && _b !== void 0 ? _b : undefined;
138
+ var _c = tslib_1.__read((0, react_1.useState)(function () {
139
+ var _a, _b, _c;
140
+ return (_c = (_b = (_a = existing === null || existing === void 0 ? void 0 : existing.stops) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.color) !== null && _c !== void 0 ? _c : ((fill === null || fill === void 0 ? void 0 : fill.backgroundColor)
141
+ ? (0, themes_1.getStringifiedColor)(fill.backgroundColor, theme)
142
+ : "#FFFFFF");
143
+ }), 2), color1 = _c[0], setColor1 = _c[1];
144
+ var _d = tslib_1.__read((0, react_1.useState)(function () { var _a, _b, _c; return (_c = (_b = (_a = existing === null || existing === void 0 ? void 0 : existing.stops) === null || _a === void 0 ? void 0 : _a[existing.stops.length - 1]) === null || _b === void 0 ? void 0 : _b.color) !== null && _c !== void 0 ? _c : "#4472C4"; }), 2), color2 = _d[0], setColor2 = _d[1];
145
+ var apply = function (preset, c1, c2) {
146
+ if (c1 === void 0) { c1 = color1; }
147
+ if (c2 === void 0) { c2 = color2; }
148
+ return onChangeFill({
149
+ backgroundColor: undefined,
150
+ fillPattern: undefined,
151
+ foregroundColor: undefined,
152
+ gradient: (0, exports.buildGradientFill)(preset, c1, c2),
153
+ });
154
+ };
155
+ var reapply = function (c1, c2) {
156
+ if (!existing)
157
+ return;
158
+ var _stops = existing.stops, preset = tslib_1.__rest(existing, ["stops"]);
159
+ apply(preset, c1, c2);
160
+ };
161
+ var isActive = function (preset) {
162
+ var _a, _b;
163
+ return !!existing &&
164
+ existing.type === preset.type &&
165
+ (preset.type === "path" || ((_a = existing.degree) !== null && _a !== void 0 ? _a : 0) === ((_b = preset.degree) !== null && _b !== void 0 ? _b : 0));
166
+ };
167
+ return (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1" },
168
+ react_1.default.createElement(ui_1.Button, { variant: "outline", size: "xs", tabIndex: -1, className: "justify-center py-1", onClick: function () {
169
+ var _a, _b, _c;
170
+ return onChangeFill({
171
+ backgroundColor: (_a = fill === null || fill === void 0 ? void 0 : fill.backgroundColor) !== null && _a !== void 0 ? _a : undefined,
172
+ fillPattern: (_b = fill === null || fill === void 0 ? void 0 : fill.fillPattern) !== null && _b !== void 0 ? _b : undefined,
173
+ foregroundColor: (_c = fill === null || fill === void 0 ? void 0 : fill.foregroundColor) !== null && _c !== void 0 ? _c : undefined,
174
+ gradient: undefined,
175
+ });
176
+ } }, "No gradient"),
177
+ react_1.default.createElement("div", { className: "grid grid-cols-[auto_1fr] items-center gap-2 pt-2 text-xs" },
178
+ react_1.default.createElement("span", null, "Color 1"),
179
+ react_1.default.createElement(ui_1.HexColorPicker, { value: color1, onChange: function (color) {
180
+ setColor1(color);
181
+ reapply(color, color2);
182
+ } }),
183
+ react_1.default.createElement("span", null, "Color 2"),
184
+ react_1.default.createElement(ui_1.HexColorPicker, { value: color2, onChange: function (color) {
185
+ setColor2(color);
186
+ reapply(color1, color);
187
+ } })),
188
+ react_1.default.createElement("div", { className: "pt-2 text-xs text-left" }, "Shading style"),
189
+ react_1.default.createElement("div", { role: "group", "aria-label": "Shading style", className: "grid grid-cols-5 gap-1" }, exports.GRADIENT_PRESETS.map(function (_a) {
190
+ var label = _a.label, gradient = _a.gradient;
191
+ return (react_1.default.createElement("button", { type: "button", key: label, "aria-label": label, "aria-pressed": isActive(gradient), className: "w-8 h-6 p-0 border-2 border-solid rounded-sm cursor-pointer ".concat(isActive(gradient) ? "border-rnc-primary" : "border-rnc-border"), style: {
192
+ backgroundImage: (0, exports.gradientToCss)((0, exports.buildGradientFill)(gradient, color1, color2)),
193
+ }, onClick: function () { return apply(gradient); } }));
194
+ }))));
195
+ };
196
+ exports.GradientFillPicker = GradientFillPicker;
@@ -4,6 +4,7 @@ export * from "./scale-selector";
4
4
  export * from "./font-size-selector";
5
5
  export * from "./text-color-selector";
6
6
  export * from "./background-color-selector";
7
+ export * from "./fill-selectors";
7
8
  export * from "./merge-cells-selector";
8
9
  export * from "./border-selector";
9
10
  export * from "./font-family-selector";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/index.tsx"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/index.tsx"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
@@ -7,6 +7,7 @@ tslib_1.__exportStar(require("./scale-selector"), exports);
7
7
  tslib_1.__exportStar(require("./font-size-selector"), exports);
8
8
  tslib_1.__exportStar(require("./text-color-selector"), exports);
9
9
  tslib_1.__exportStar(require("./background-color-selector"), exports);
10
+ tslib_1.__exportStar(require("./fill-selectors"), exports);
10
11
  tslib_1.__exportStar(require("./merge-cells-selector"), exports);
11
12
  tslib_1.__exportStar(require("./border-selector"), exports);
12
13
  tslib_1.__exportStar(require("./font-family-selector"), exports);
@@ -1,5 +1,14 @@
1
1
  import React from "react";
2
2
  import type { CellFormat } from "../../types";
3
+ /**
4
+ * What the toolbar's "General" item writes to the cell. "General" must be an
5
+ * EXPLICIT format, not the absence of one: a `=DATE()` cell with no
6
+ * `numberFormat` derives a date format at paint time in both engines, so
7
+ * emitting `undefined` here left the cell showing `2/29/1900` after the user
8
+ * chose General (rowsncolumns/spreadsheet#642 B-05). Excel stamps numFmtId 0
9
+ * and shows the serial.
10
+ */
11
+ export declare const GENERAL_NUMBER_FORMAT: NonNullable<CellFormat["numberFormat"]>;
3
12
  export type TextFormatSelectorProps = {
4
13
  /**
5
14
  * Current cell format
@@ -1 +1 @@
1
- {"version":3,"file":"text-format-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/text-format-selector.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAe,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,CAAC,CAAC,SAAS,MAAM,UAAU,EAC7C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;IACV,oBAAoB,CAAC,IAAI,IAAI,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,0GAO1B,uBAAuB,uBAqY3B,CAAC"}
1
+ {"version":3,"file":"text-format-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/text-format-selector.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAe,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAIvE,CAAC;AAEJ,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,CAAC,CAAC,SAAS,MAAM,UAAU,EAC7C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;IACV,oBAAoB,CAAC,IAAI,IAAI,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,0GAO1B,uBAAuB,uBAqY3B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TextFormatSelector = void 0;
3
+ exports.TextFormatSelector = exports.GENERAL_NUMBER_FORMAT = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var icons_1 = require("@rowsncolumns/icons");
6
6
  var ui_1 = require("@rowsncolumns/ui");
@@ -8,6 +8,18 @@ var utils_1 = require("@rowsncolumns/utils");
8
8
  var react_1 = tslib_1.__importStar(require("react"));
9
9
  var atoms_1 = require("../../atoms");
10
10
  var helpers_1 = require("../../helpers");
11
+ /**
12
+ * What the toolbar's "General" item writes to the cell. "General" must be an
13
+ * EXPLICIT format, not the absence of one: a `=DATE()` cell with no
14
+ * `numberFormat` derives a date format at paint time in both engines, so
15
+ * emitting `undefined` here left the cell showing `2/29/1900` after the user
16
+ * chose General (rowsncolumns/spreadsheet#642 B-05). Excel stamps numFmtId 0
17
+ * and shows the serial.
18
+ */
19
+ exports.GENERAL_NUMBER_FORMAT = {
20
+ type: "GENERAL",
21
+ pattern: "General",
22
+ };
11
23
  exports.TextFormatSelector = (0, react_1.memo)(function (_a) {
12
24
  var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
13
25
  var _t = _a.locale, locale = _t === void 0 ? "en-US" : _t, _u = _a.currency, currency = _u === void 0 ? "USD" : _u, cellFormat = _a.cellFormat, onChangeFormatting = _a.onChangeFormatting, onRequestFormatCells = _a.onRequestFormatCells;
@@ -42,14 +54,14 @@ exports.TextFormatSelector = (0, react_1.memo)(function (_a) {
42
54
  var isCurrencyRounded = ((_k = cellFormat === null || cellFormat === void 0 ? void 0 : cellFormat.numberFormat) === null || _k === void 0 ? void 0 : _k.pattern) === currencyRoundedPattern;
43
55
  return (react_1.default.createElement(ui_1.DropdownMenu, { modal: false },
44
56
  react_1.default.createElement(ui_1.DropdownMenuTrigger, { asChild: true },
45
- react_1.default.createElement(ui_1.IconButton, { tooltip: "More formats" },
57
+ react_1.default.createElement(ui_1.IconButton, { tooltip: "More formats", "aria-label": "More formats" },
46
58
  react_1.default.createElement("div", { className: "text-xs" }, "123"),
47
59
  react_1.default.createElement(icons_1.MdOutlineArrowDropDown, null))),
48
60
  react_1.default.createElement(ui_1.DropdownMenuPortal, null,
49
61
  react_1.default.createElement(ui_1.DropdownMenuContent, { align: "start" },
50
62
  react_1.default.createElement(ui_1.DropdownMenuCheckboxItem, { checked: !((_l = cellFormat === null || cellFormat === void 0 ? void 0 : cellFormat.numberFormat) === null || _l === void 0 ? void 0 : _l.type) ||
51
63
  ((_m = cellFormat === null || cellFormat === void 0 ? void 0 : cellFormat.numberFormat) === null || _m === void 0 ? void 0 : _m.type) === "GENERAL", onCheckedChange: function () {
52
- onChangeFormatting("numberFormat", undefined);
64
+ onChangeFormatting("numberFormat", exports.GENERAL_NUMBER_FORMAT);
53
65
  focusSheet === null || focusSheet === void 0 ? void 0 : focusSheet();
54
66
  } },
55
67
  react_1.default.createElement(ui_1.DropdownMenuItemIndicator, null,
@@ -5,6 +5,14 @@ type TextHorizontalAlignSelectorProps = {
5
5
  value: HorizontalAlign | undefined | null;
6
6
  onChange(value: HorizontalAlign): void;
7
7
  };
8
+ /**
9
+ * Excel's remaining Format Cells → Alignment → Horizontal entries. They have
10
+ * no toolbar glyph, so they render as labelled buttons under the icon row.
11
+ */
12
+ export declare const EXTENDED_HORIZONTAL_ALIGNMENTS: ReadonlyArray<{
13
+ value: HorizontalAlign;
14
+ label: string;
15
+ }>;
8
16
  export declare const TextHorizontalAlignSelector: ({ value, onChange, disabled, }: TextHorizontalAlignSelectorProps) => React.JSX.Element;
9
17
  export {};
10
18
  //# sourceMappingURL=text-horizontal-align-selector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-horizontal-align-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/text-horizontal-align-selector.tsx"],"names":[],"mappings":"AASA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,KAAK,gCAAgC,GAAG;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,gCAIzC,gCAAgC,sBA0DlC,CAAC"}
1
+ {"version":3,"file":"text-horizontal-align-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/text-horizontal-align-selector.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,KAAK,gCAAgC,GAAG;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,aAAa,CAAC;IACzD,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,CAGA,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,gCAIzC,gCAAgC,sBA6FlC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TextHorizontalAlignSelector = void 0;
3
+ exports.TextHorizontalAlignSelector = exports.EXTENDED_HORIZONTAL_ALIGNMENTS = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var icons_1 = require("@rowsncolumns/icons");
6
6
  var ui_1 = require("@rowsncolumns/ui");
@@ -8,15 +8,28 @@ var ui_2 = require("@rowsncolumns/ui");
8
8
  var ui_3 = require("@rowsncolumns/ui");
9
9
  var react_1 = tslib_1.__importStar(require("react"));
10
10
  var atoms_1 = require("../../atoms");
11
+ /**
12
+ * Excel's remaining Format Cells → Alignment → Horizontal entries. They have
13
+ * no toolbar glyph, so they render as labelled buttons under the icon row.
14
+ */
15
+ exports.EXTENDED_HORIZONTAL_ALIGNMENTS = [
16
+ { value: "distributed", label: "Distributed" },
17
+ { value: "fill", label: "Fill" },
18
+ ];
11
19
  var TextHorizontalAlignSelector = function (_a) {
12
20
  var _b = _a.value, value = _b === void 0 ? "left" : _b, onChange = _a.onChange, disabled = _a.disabled;
13
21
  var focusSheet = (0, atoms_1.useFocusSheet)();
14
22
  var _c = tslib_1.__read((0, react_1.useState)(false), 2), isOpen = _c[0], onOpenChange = _c[1];
15
23
  var close = function () { return onOpenChange(false); };
24
+ var select = function (next) {
25
+ onChange(next);
26
+ focusSheet === null || focusSheet === void 0 ? void 0 : focusSheet();
27
+ close();
28
+ };
16
29
  return (react_1.default.createElement(ui_2.Popover, { open: isOpen, onOpenChange: onOpenChange },
17
30
  react_1.default.createElement(ui_2.PopoverTrigger, { asChild: true },
18
- react_1.default.createElement(ui_1.IconButton, { size: "lg", tooltip: "Horizontal align", disabled: disabled },
19
- value === "right" ? (react_1.default.createElement(icons_1.MdFormatAlignRight, null)) : value === "center" ? (react_1.default.createElement(icons_1.MdFormatAlignCenter, null)) : (react_1.default.createElement(icons_1.MdFormatAlignLeft, null)),
31
+ react_1.default.createElement(ui_1.IconButton, { size: "lg", tooltip: "Horizontal align", "aria-label": "Horizontal align", disabled: disabled },
32
+ value === "right" ? (react_1.default.createElement(icons_1.MdFormatAlignRight, null)) : value === "center" || value === "centerContinuous" ? (react_1.default.createElement(icons_1.MdFormatAlignCenter, null)) : value === "justify" || value === "distributed" ? (react_1.default.createElement(icons_1.MdFormatAlignJustify, null)) : (react_1.default.createElement(icons_1.MdFormatAlignLeft, null)),
20
33
  react_1.default.createElement(icons_1.MdOutlineArrowDropDown, null))),
21
34
  react_1.default.createElement(ui_2.PopoverContent, { align: "start" },
22
35
  react_1.default.createElement(ui_3.Stack, { direction: "horizontal", className: "gap-1 max-w-[140px] flex-wrap" },
@@ -37,6 +50,12 @@ var TextHorizontalAlignSelector = function (_a) {
37
50
  focusSheet === null || focusSheet === void 0 ? void 0 : focusSheet();
38
51
  close();
39
52
  } },
40
- react_1.default.createElement(icons_1.MdFormatAlignRight, null))))));
53
+ react_1.default.createElement(icons_1.MdFormatAlignRight, null)),
54
+ react_1.default.createElement(ui_1.IconButton, { size: "lg", tooltip: "Justify", "aria-label": "Justify", isActive: value === "justify", onClick: function () { return select("justify"); } },
55
+ react_1.default.createElement(icons_1.MdFormatAlignJustify, null))),
56
+ react_1.default.createElement(ui_3.Stack, { direction: "horizontal", className: "gap-1 pt-1 max-w-[140px]" }, exports.EXTENDED_HORIZONTAL_ALIGNMENTS.map(function (_a) {
57
+ var option = _a.value, label = _a.label;
58
+ return (react_1.default.createElement(ui_1.Button, { key: option, type: "button", variant: value === option ? "secondary" : "ghost", size: "xs", "aria-pressed": value === option, onClick: function () { return select(option); } }, label));
59
+ })))));
41
60
  };
42
61
  exports.TextHorizontalAlignSelector = TextHorizontalAlignSelector;
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import { type WatchWindowContext, type WatchWindowEntry } from "../../atoms/watch-window.atom";
3
+ import type { SheetCoordinate } from "../../types";
4
+ export type WatchWindowProps = {
5
+ entries: WatchWindowEntry[];
6
+ context: WatchWindowContext | null;
7
+ onRemove(cell: SheetCoordinate): void;
8
+ onClose(): void;
9
+ };
10
+ /**
11
+ * Excel's Watch Window: a floating list of cells with their sheet, address,
12
+ * current value and formula, refreshed with the grid. Double-click a row to
13
+ * jump to the cell. Presentational; {@link WatchWindowHost} wires the atoms.
14
+ */
15
+ export declare const WatchWindow: React.MemoExoticComponent<({ entries, context, onRemove, onClose }: WatchWindowProps) => React.JSX.Element>;
16
+ /**
17
+ * Host-mounted, atom-driven Watch Window. Mount once alongside the other
18
+ * dialogs; the grid's context menu offers "Add to Watch Window" while a
19
+ * host is mounted and republishes live getters on each render.
20
+ */
21
+ export declare const WatchWindowHost: {
22
+ (): React.JSX.Element | null;
23
+ displayName: string;
24
+ };
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/watch-window/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,EAML,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,sEACoB,gBAAgB,uBA6E3D,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;CAgB3B,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WatchWindowHost = exports.WatchWindow = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var ui_1 = require("@rowsncolumns/ui");
6
+ var icons_1 = require("@rowsncolumns/icons");
7
+ var utils_1 = require("@rowsncolumns/utils");
8
+ var react_1 = tslib_1.__importStar(require("react"));
9
+ var watch_window_atom_1 = require("../../atoms/watch-window.atom");
10
+ /**
11
+ * Excel's Watch Window: a floating list of cells with their sheet, address,
12
+ * current value and formula, refreshed with the grid. Double-click a row to
13
+ * jump to the cell. Presentational; {@link WatchWindowHost} wires the atoms.
14
+ */
15
+ exports.WatchWindow = (0, react_1.memo)(function (_a) {
16
+ var entries = _a.entries, context = _a.context, onRemove = _a.onRemove, onClose = _a.onClose;
17
+ return (react_1.default.createElement("div", { role: "dialog", "aria-label": "Watch Window", className: "fixed bottom-4 right-4 z-50 w-[420px] max-w-[92vw] rounded-md border border-rnc-border bg-rnc-background text-rnc-foreground shadow-lg pointer-events-auto" },
18
+ react_1.default.createElement("div", { className: "flex items-center justify-between px-3 py-2 border-b border-rnc-border" },
19
+ react_1.default.createElement("span", { className: "text-sm font-medium" }, "Watch Window"),
20
+ react_1.default.createElement(ui_1.IconButton, { "aria-label": "Close Watch Window", onClick: onClose },
21
+ react_1.default.createElement(icons_1.Cross1Icon, null))),
22
+ entries.length === 0 ? (react_1.default.createElement("div", { className: "px-3 py-4 text-xs text-rnc-foreground/60" }, "No cells are being watched. Right-click a cell \u2192 Add to Watch Window.")) : (react_1.default.createElement("table", { className: "w-full text-xs border-collapse" },
23
+ react_1.default.createElement("thead", null,
24
+ react_1.default.createElement("tr", { className: "text-left text-rnc-foreground/70" },
25
+ react_1.default.createElement("th", { className: "px-3 py-1 font-medium" }, "Sheet"),
26
+ react_1.default.createElement("th", { className: "px-2 py-1 font-medium" }, "Cell"),
27
+ react_1.default.createElement("th", { className: "px-2 py-1 font-medium" }, "Value"),
28
+ react_1.default.createElement("th", { className: "px-2 py-1 font-medium" }, "Formula"),
29
+ react_1.default.createElement("th", { className: "px-2 py-1" }))),
30
+ react_1.default.createElement("tbody", null, entries.map(function (entry) {
31
+ var _a, _b, _c;
32
+ var address = (_a = (0, utils_1.cellToAddress)(entry)) !== null && _a !== void 0 ? _a : "";
33
+ var sheetName = (_c = (_b = context === null || context === void 0 ? void 0 : context.getSheetName) === null || _b === void 0 ? void 0 : _b.call(context, entry.sheetId)) !== null && _c !== void 0 ? _c : String(entry.sheetId);
34
+ var value = context === null || context === void 0 ? void 0 : context.getFormattedValue(entry.sheetId, entry.rowIndex, entry.columnIndex);
35
+ var formula = context === null || context === void 0 ? void 0 : context.getFormula(entry.sheetId, entry.rowIndex, entry.columnIndex);
36
+ return (react_1.default.createElement("tr", { key: "".concat(entry.sheetId, ":").concat(entry.rowIndex, ":").concat(entry.columnIndex), className: "cursor-default hover:bg-rnc-accent", onDoubleClick: function () { return context === null || context === void 0 ? void 0 : context.onNavigate(entry); }, "data-testid": "watch-row" },
37
+ react_1.default.createElement("td", { className: "px-3 py-1 truncate max-w-[110px]" }, sheetName),
38
+ react_1.default.createElement("td", { className: "px-2 py-1 font-mono" }, address),
39
+ react_1.default.createElement("td", { className: "px-2 py-1 truncate max-w-[120px]" }, value !== null && value !== void 0 ? value : ""),
40
+ react_1.default.createElement("td", { className: "px-2 py-1 font-mono truncate max-w-[140px]" }, formula !== null && formula !== void 0 ? formula : ""),
41
+ react_1.default.createElement("td", { className: "px-2 py-1 text-right" },
42
+ react_1.default.createElement(ui_1.Button, { variant: "ghost", size: "xs", "aria-label": "Remove watch ".concat(sheetName, "!").concat(address), onClick: function () { return onRemove(entry); } }, "Delete"))));
43
+ }))))));
44
+ });
45
+ exports.WatchWindow.displayName = "WatchWindow";
46
+ /**
47
+ * Host-mounted, atom-driven Watch Window. Mount once alongside the other
48
+ * dialogs; the grid's context menu offers "Add to Watch Window" while a
49
+ * host is mounted and republishes live getters on each render.
50
+ */
51
+ var WatchWindowHost = function () {
52
+ (0, watch_window_atom_1.useRegisterWatchWindowHost)();
53
+ var _a = tslib_1.__read((0, watch_window_atom_1.useWatchWindowEntries)(), 1), entries = _a[0];
54
+ var _b = tslib_1.__read((0, watch_window_atom_1.useWatchWindowOpen)(), 2), open = _b[0], setOpen = _b[1];
55
+ var context = (0, watch_window_atom_1.useWatchWindowContext)();
56
+ var removeWatch = (0, watch_window_atom_1.useRemoveWatch)();
57
+ var close = (0, react_1.useCallback)(function () { return setOpen(false); }, [setOpen]);
58
+ if (!open)
59
+ return null;
60
+ return (react_1.default.createElement(exports.WatchWindow, { entries: entries, context: context, onRemove: removeWatch, onClose: close }));
61
+ };
62
+ exports.WatchWindowHost = WatchWindowHost;
63
+ exports.WatchWindowHost.displayName = "WatchWindowHost";
@@ -1 +1 @@
1
- {"version":3,"file":"use-cell-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-cell-renderer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-cell-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-cell-renderer.tsx"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ var utils_1 = require("@rowsncolumns/utils");
7
7
  var react_1 = tslib_1.__importStar(require("react"));
8
8
  var colors_1 = require("../api/colors");
9
9
  var validation_1 = require("../api/validation");
10
+ var alignment_1 = require("../components/cell/alignment");
10
11
  var cell_background_1 = require("../components/cell/cell-background");
11
12
  var cell_diff_1 = require("../components/cell-diff");
12
13
  var cell_overlay_1 = require("../components/cell-overlay");
@@ -56,10 +57,17 @@ var useCellRenderer = function (_a) {
56
57
  // Calculated column
57
58
  var isCalculatedColumn = isTableHeader(rowIndex, columnIndex) &&
58
59
  isCalculatedColumnHeader(rowIndex, columnIndex);
59
- // Cell overflow
60
+ // Cell overflow. Excel's justify / distributed alignments wrap inside
61
+ // the cell's own width even without `wrapStrategy: "wrap"`, and fill
62
+ // repeats the text to the cell edge — none of them ever spill into
63
+ // the neighbouring cells.
60
64
  var wrapStrategy = effectiveCellFormat === null || effectiveCellFormat === void 0 ? void 0 : effectiveCellFormat.wrapStrategy;
61
- var shouldWrap = wrapStrategy === "wrap";
62
- var isWrapEnabled = (wrapStrategy !== null && wrapStrategy !== void 0 ? wrapStrategy : "overflow") === "overflow";
65
+ var wrapsByAlignment = (0, alignment_1.alignmentImpliesWrap)(horizontalAlignment);
66
+ var fillsCell = (0, alignment_1.isFillAlignment)(horizontalAlignment);
67
+ var shouldWrap = wrapStrategy === "wrap" || wrapsByAlignment;
68
+ var isWrapEnabled = (wrapStrategy !== null && wrapStrategy !== void 0 ? wrapStrategy : "overflow") === "overflow" &&
69
+ !wrapsByAlignment &&
70
+ !fillsCell;
63
71
  // Normalize display value for both rendering and overflow calculation
64
72
  var displayFormattedValue = (0, helpers_1.normalizeDisplayText)(formattedValue, shouldWrap);
65
73
  var shouldRecalcTextWidth = isWrapEnabled || wrapStrategy === "clip";
@@ -111,9 +119,12 @@ var useCellRenderer = function (_a) {
111
119
  }
112
120
  // shrinkToFit needs the natural text width to compare against the
113
121
  // cell's available width; rotated text uses it to size the (unrotated)
114
- // text box that gets pivoted around the cell edge. Without this, the
115
- // Konva Text renders with width 0 and the text disappears.
116
- var textWidth = (overflowRight && shouldRecalcTextWidth) || containsTextInside
122
+ // text box that gets pivoted around the cell edge; fill alignment
123
+ // repeats the text `floor(cell / natural)` times. Without this, the
124
+ // Konva Text renders with width 0 (rotation) or a single unfilled copy.
125
+ var textWidth = (overflowRight && shouldRecalcTextWidth) ||
126
+ containsTextInside ||
127
+ fillsCell
117
128
  ? getTextDimension(sheetId, rowIndex, columnIndex, displayFormattedValue).width
118
129
  : 0;
119
130
  var enableOverflow = shouldOverflow && cellWidth > props.width;
@@ -33,6 +33,13 @@ export type EditorSubmitOptions = {
33
33
  * there would undo the switch they just made.
34
34
  */
35
35
  preserveActiveSheet?: boolean;
36
+ /**
37
+ * Ctrl+Enter (Excel): commit the entry into EVERY cell of the current
38
+ * selection — relative references shift per cell, as a copy-fill would —
39
+ * and keep both the active cell and the selection where they are. On a
40
+ * single cell this is a plain in-place commit (no move down).
41
+ */
42
+ fillSelection?: boolean;
36
43
  };
37
44
  export type UseEditableOptions<T extends CellData> = {
38
45
  /**
@@ -260,9 +267,11 @@ export type SharedEditorProps = {
260
267
  */
261
268
  onChange?: (value: string, textFormatRuns: TextFormatRun[] | undefined, editingSheetId: number, activeCell: CellInterface) => void;
262
269
  /**
263
- * Callback to submit the value back to data store
270
+ * Callback to submit the value back to data store. `shouldFocusGrid`
271
+ * defaults to true; `options` carries commit intent the editor derived from
272
+ * the keystroke (e.g. Ctrl+Enter → `fillSelection`).
264
273
  */
265
- onSubmit?: (value: string, textFormatRuns: TextFormatRun[] | undefined, editingSheetId: number, activeCell: CellInterface, nextActiveCell?: CellInterface | null) => void;
274
+ onSubmit?: (value: string, textFormatRuns: TextFormatRun[] | undefined, editingSheetId: number, activeCell: CellInterface, nextActiveCell?: CellInterface | null, shouldFocusGrid?: boolean, options?: EditorSubmitOptions) => void;
266
275
  /**
267
276
  * On Cancel callbacks. Hides the editor
268
277
  */