@svgrid/enterprise 3.0.1 → 3.0.3

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 (445) hide show
  1. package/LICENSE +94 -24
  2. package/README.md +36 -4
  3. package/dist/SvAdvancedFilter.svelte +1 -1
  4. package/dist/SvAlertsManager.svelte +2 -1
  5. package/dist/SvBoard.svelte +2 -1
  6. package/dist/SvExportMenu.svelte +4 -1
  7. package/dist/SvExportMenu.svelte.d.ts +0 -13
  8. package/dist/SvExpressionEditor.svelte +3 -3
  9. package/dist/SvFormulaBar.svelte +680 -0
  10. package/dist/SvFormulaBar.svelte.d.ts +69 -0
  11. package/dist/SvGridAlerts.svelte +49 -9
  12. package/dist/SvGridBoard.svelte +13 -8
  13. package/dist/SvGridBulkEditDrawer.svelte +26 -2
  14. package/dist/SvGridEditPanel.svelte +3 -0
  15. package/dist/SvGridScheduler.svelte +69 -40
  16. package/dist/SvGridSelectionBar.svelte +10 -3
  17. package/dist/SvPivotDesigner.svelte +263 -54
  18. package/dist/SvPivotDesigner.svelte.d.ts +27 -20
  19. package/dist/SvRibbonIcon.svelte +46 -0
  20. package/dist/SvRibbonIcon.svelte.d.ts +17 -0
  21. package/dist/SvSchemaChart.svelte +4 -2
  22. package/dist/SvSheet.svelte +7914 -0
  23. package/dist/SvSheet.svelte.d.ts +215 -0
  24. package/dist/SvSheetChartSetup.svelte +151 -0
  25. package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
  26. package/dist/SvSheetComment.svelte +283 -0
  27. package/dist/SvSheetComment.svelte.d.ts +22 -0
  28. package/dist/SvSheetConditionalFormat.svelte +159 -0
  29. package/dist/SvSheetConditionalFormat.svelte.d.ts +14 -0
  30. package/dist/SvSheetDataValidation.svelte +273 -0
  31. package/dist/SvSheetDataValidation.svelte.d.ts +14 -0
  32. package/dist/SvSheetEditRanges.svelte +217 -0
  33. package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
  34. package/dist/SvSheetErrors.svelte +125 -0
  35. package/dist/SvSheetErrors.svelte.d.ts +20 -0
  36. package/dist/SvSheetEvaluate.svelte +133 -0
  37. package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
  38. package/dist/SvSheetFilterMenu.svelte +320 -0
  39. package/dist/SvSheetFilterMenu.svelte.d.ts +22 -0
  40. package/dist/SvSheetFindReplace.svelte +132 -0
  41. package/dist/SvSheetFindReplace.svelte.d.ts +10 -0
  42. package/dist/SvSheetFormatCells.svelte +465 -0
  43. package/dist/SvSheetFormatCells.svelte.d.ts +17 -0
  44. package/dist/SvSheetGoalSeek.svelte +145 -0
  45. package/dist/SvSheetGoalSeek.svelte.d.ts +12 -0
  46. package/dist/SvSheetInsertFunction.svelte +149 -0
  47. package/dist/SvSheetInsertFunction.svelte.d.ts +8 -0
  48. package/dist/SvSheetIteration.svelte +81 -0
  49. package/dist/SvSheetIteration.svelte.d.ts +10 -0
  50. package/dist/SvSheetLink.svelte +99 -0
  51. package/dist/SvSheetLink.svelte.d.ts +17 -0
  52. package/dist/SvSheetListPicker.svelte +91 -0
  53. package/dist/SvSheetListPicker.svelte.d.ts +10 -0
  54. package/dist/SvSheetManageRules.svelte +187 -0
  55. package/dist/SvSheetManageRules.svelte.d.ts +16 -0
  56. package/dist/SvSheetNameManager.svelte +227 -0
  57. package/dist/SvSheetNameManager.svelte.d.ts +11 -0
  58. package/dist/SvSheetPageSetup.svelte +159 -0
  59. package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
  60. package/dist/SvSheetPasteSpecial.svelte +107 -0
  61. package/dist/SvSheetPasteSpecial.svelte.d.ts +12 -0
  62. package/dist/SvSheetPivot.svelte +220 -0
  63. package/dist/SvSheetPivot.svelte.d.ts +21 -0
  64. package/dist/SvSheetProtectSheet.svelte +81 -0
  65. package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
  66. package/dist/SvSheetRemoveDuplicates.svelte +152 -0
  67. package/dist/SvSheetRemoveDuplicates.svelte.d.ts +12 -0
  68. package/dist/SvSheetRibbon.svelte +1254 -0
  69. package/dist/SvSheetRibbon.svelte.d.ts +34 -0
  70. package/dist/SvSheetSizeDialog.svelte +60 -0
  71. package/dist/SvSheetSizeDialog.svelte.d.ts +11 -0
  72. package/dist/SvSheetSort.svelte +218 -0
  73. package/dist/SvSheetSort.svelte.d.ts +28 -0
  74. package/dist/SvSheetSparklines.svelte +135 -0
  75. package/dist/SvSheetSparklines.svelte.d.ts +14 -0
  76. package/dist/SvSheetTable.svelte +160 -0
  77. package/dist/SvSheetTable.svelte.d.ts +24 -0
  78. package/dist/SvSheetTabs.svelte +571 -0
  79. package/dist/SvSheetTabs.svelte.d.ts +50 -0
  80. package/dist/SvSheetTabs.test-harness.svelte.d.ts +17 -0
  81. package/dist/SvSheetTabs.test-harness.svelte.js +22 -0
  82. package/dist/SvSheetTextToColumns.svelte +172 -0
  83. package/dist/SvSheetTextToColumns.svelte.d.ts +13 -0
  84. package/dist/SvSheetValidationAlert.svelte +85 -0
  85. package/dist/SvSheetValidationAlert.svelte.d.ts +15 -0
  86. package/dist/advanced-filter-enable.js +1 -1
  87. package/dist/alerts/alert-engine.d.ts +6 -0
  88. package/dist/alerts/alert-engine.js +21 -4
  89. package/dist/alerts/alert-formats.js +2 -0
  90. package/dist/alerts/alert-types.d.ts +1 -1
  91. package/dist/alerts.d.ts +1 -1
  92. package/dist/alerts.js +2 -2
  93. package/dist/board.js +2 -2
  94. package/dist/bulk-edit.d.ts +3 -1
  95. package/dist/bulk-edit.js +1 -1
  96. package/dist/cdn/svgrid-enterprise.svelte-external.js +43538 -6539
  97. package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
  98. package/dist/designer/assets/SvChartMenu-BDoeqGz6.js +1 -0
  99. package/dist/designer/assets/SvChartMenu-BYO9cYdy.css +1 -0
  100. package/dist/designer/assets/SvDateRangeInput-BBRzrQeg.js +1 -0
  101. package/dist/designer/assets/SvDateTimePicker-DCPg7WGN.js +1 -0
  102. package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
  103. package/dist/designer/assets/SvGridChart-BgLuPO7I.css +1 -0
  104. package/dist/designer/assets/SvGridChart-Cy1ATrWh.js +3 -0
  105. package/dist/designer/assets/SvGridChartBuilder-08YWWeqY.css +1 -0
  106. package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
  107. package/dist/designer/assets/SvGridChartPanel-4Pc8y5yO.css +1 -0
  108. package/dist/designer/assets/SvGridChartPanel-CATdVc9X.js +4 -0
  109. package/dist/designer/assets/{SvGridChartView-DUc-1RUf.css → SvGridChartView-7msfnWZT.css} +1 -1
  110. package/dist/designer/assets/SvGridChartView-CmsZtCED.js +1 -0
  111. package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
  112. package/dist/designer/assets/SvListBox-BDS66lmZ.js +110 -0
  113. package/dist/designer/assets/SvMenuList-DJ47ba1h.css +1 -0
  114. package/dist/designer/assets/SvMenuList-Dgq2D5VN.js +1 -0
  115. package/dist/designer/assets/SvTabs-2mHC6oaz.js +1 -0
  116. package/dist/designer/assets/SvTabs-DKmwb5p1.css +1 -0
  117. package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
  118. package/dist/designer/assets/chart-Cn7MnNqA.js +1 -0
  119. package/dist/designer/assets/chart-export-B6bkQ3X8.js +11 -0
  120. package/dist/designer/assets/chart-export-pdf-BbA28-gt.js +11 -0
  121. package/dist/designer/assets/chart-panel-messages-Dz7PTIqT.js +1 -0
  122. package/dist/designer/assets/chart-summary-BD1qYB2R.js +1 -0
  123. package/dist/designer/assets/chart-trend-B8xr5LuD.js +1 -0
  124. package/dist/designer/assets/chart-validate-BMqM-qkF.js +1 -0
  125. package/dist/designer/assets/column-resize-BYDzR1Ve.js +1 -0
  126. package/dist/designer/assets/date-format-B8JbEtIG.js +1 -0
  127. package/dist/designer/assets/date-format-DKS-z0xS.css +1 -0
  128. package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
  129. package/dist/designer/assets/editor-contract-Bpoa7A5g.js +1 -0
  130. package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
  131. package/dist/designer/assets/focus-trap-V2-6Fy9I.js +1 -0
  132. package/dist/designer/assets/{index-C_a9Cj8Y.js → index-D5bVbuzI.js} +318 -315
  133. package/dist/designer/assets/index-_JVFxt02.css +1 -0
  134. package/dist/designer/assets/list-option-BP_dWS66.js +1 -0
  135. package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
  136. package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
  137. package/dist/designer/assets/src-CITpcm6b.js +1 -0
  138. package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
  139. package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
  140. package/dist/designer/index.html +29 -19
  141. package/dist/export-pdf.d.ts +164 -0
  142. package/dist/export-pdf.js +346 -15
  143. package/dist/export.js +25 -10
  144. package/dist/gantt/SvGridGantt.svelte +2890 -0
  145. package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
  146. package/dist/gantt/gantt-config.d.ts +73 -0
  147. package/dist/gantt/gantt-config.js +1 -0
  148. package/dist/gantt/gantt-critical-path.d.ts +67 -0
  149. package/dist/gantt/gantt-critical-path.js +207 -0
  150. package/dist/gantt/gantt-model.d.ts +257 -0
  151. package/dist/gantt/gantt-model.js +651 -0
  152. package/dist/gantt/gantt-resources.d.ts +59 -0
  153. package/dist/gantt/gantt-resources.js +71 -0
  154. package/dist/gantt/gantt.d.ts +7 -0
  155. package/dist/gantt/gantt.js +36 -0
  156. package/dist/gantt/index.d.ts +15 -0
  157. package/dist/gantt/index.js +22 -0
  158. package/dist/gantt/timeline-arrows.d.ts +102 -0
  159. package/dist/gantt/timeline-arrows.js +181 -0
  160. package/dist/import.d.ts +2 -2
  161. package/dist/import.js +1 -1
  162. package/dist/index.d.ts +93 -3
  163. package/dist/index.js +107 -3
  164. package/dist/install.js +13 -1
  165. package/dist/license-core.d.ts +17 -1
  166. package/dist/license-core.js +16 -5
  167. package/dist/license.d.ts +18 -2
  168. package/dist/license.js +71 -6
  169. package/dist/node/studio.js +203 -9
  170. package/dist/pivot-chart.d.ts +25 -1
  171. package/dist/pivot-chart.js +25 -69
  172. package/dist/pivot-enable.js +2 -2
  173. package/dist/scheduler-dependencies.d.ts +35 -0
  174. package/dist/scheduler-dependencies.js +36 -1
  175. package/dist/scheduler.js +2 -2
  176. package/dist/selection-bar.js +2 -2
  177. package/dist/server/SvGroupCell.svelte +213 -0
  178. package/dist/server/SvGroupCell.svelte.d.ts +62 -0
  179. package/dist/server/SvRowGroupPanel.svelte +322 -0
  180. package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
  181. package/dist/server/enable.d.ts +17 -0
  182. package/dist/server/enable.js +49 -0
  183. package/dist/server/index.d.ts +22 -0
  184. package/dist/server/index.js +24 -0
  185. package/dist/server/messages.d.ts +45 -0
  186. package/dist/server/messages.js +35 -0
  187. package/dist/server/server-group-model.d.ts +104 -0
  188. package/dist/server/server-group-model.js +272 -0
  189. package/dist/server/server-pivot.d.ts +46 -0
  190. package/dist/server/server-pivot.js +57 -0
  191. package/dist/server/server-row-model.d.ts +547 -0
  192. package/dist/server/server-row-model.js +1551 -0
  193. package/dist/server/server-selection.d.ts +99 -0
  194. package/dist/server/server-selection.js +215 -0
  195. package/dist/server/svgrid-adapter.d.ts +155 -0
  196. package/dist/server/svgrid-adapter.js +202 -0
  197. package/dist/sheet/address.d.ts +43 -0
  198. package/dist/sheet/address.js +81 -0
  199. package/dist/sheet/ast.d.ts +138 -0
  200. package/dist/sheet/ast.js +70 -0
  201. package/dist/sheet/auto-filter.d.ts +120 -0
  202. package/dist/sheet/auto-filter.js +295 -0
  203. package/dist/sheet/autocomplete.d.ts +51 -0
  204. package/dist/sheet/autocomplete.js +248 -0
  205. package/dist/sheet/cell-images.d.ts +39 -0
  206. package/dist/sheet/cell-images.js +90 -0
  207. package/dist/sheet/cell-types.d.ts +58 -0
  208. package/dist/sheet/cell-types.js +96 -0
  209. package/dist/sheet/coerce.d.ts +71 -0
  210. package/dist/sheet/coerce.js +289 -0
  211. package/dist/sheet/commands.d.ts +89 -0
  212. package/dist/sheet/commands.js +230 -0
  213. package/dist/sheet/comments.d.ts +63 -0
  214. package/dist/sheet/comments.js +131 -0
  215. package/dist/sheet/conditional-formats.d.ts +167 -0
  216. package/dist/sheet/conditional-formats.js +341 -0
  217. package/dist/sheet/csv.d.ts +32 -0
  218. package/dist/sheet/csv.js +158 -0
  219. package/dist/sheet/culture.d.ts +87 -0
  220. package/dist/sheet/culture.js +247 -0
  221. package/dist/sheet/delta.d.ts +102 -0
  222. package/dist/sheet/delta.js +203 -0
  223. package/dist/sheet/deps.d.ts +104 -0
  224. package/dist/sheet/deps.js +274 -0
  225. package/dist/sheet/document.d.ts +252 -0
  226. package/dist/sheet/document.js +465 -0
  227. package/dist/sheet/edit-keys.d.ts +14 -0
  228. package/dist/sheet/edit-keys.js +40 -0
  229. package/dist/sheet/engine.d.ts +67 -0
  230. package/dist/sheet/engine.js +19 -0
  231. package/dist/sheet/entry.d.ts +35 -0
  232. package/dist/sheet/entry.js +226 -0
  233. package/dist/sheet/error-check.d.ts +49 -0
  234. package/dist/sheet/error-check.js +83 -0
  235. package/dist/sheet/evaluate-steps.d.ts +48 -0
  236. package/dist/sheet/evaluate-steps.js +196 -0
  237. package/dist/sheet/evaluate.d.ts +128 -0
  238. package/dist/sheet/evaluate.js +1049 -0
  239. package/dist/sheet/filter-files.d.ts +37 -0
  240. package/dist/sheet/filter-files.js +465 -0
  241. package/dist/sheet/find-replace.d.ts +62 -0
  242. package/dist/sheet/find-replace.js +152 -0
  243. package/dist/sheet/format-store.d.ts +114 -0
  244. package/dist/sheet/format-store.js +243 -0
  245. package/dist/sheet/freeze.d.ts +54 -0
  246. package/dist/sheet/freeze.js +58 -0
  247. package/dist/sheet/from-rows.d.ts +14 -0
  248. package/dist/sheet/from-rows.js +50 -0
  249. package/dist/sheet/function-catalog.d.ts +10 -0
  250. package/dist/sheet/function-catalog.js +385 -0
  251. package/dist/sheet/functions.d.ts +28 -0
  252. package/dist/sheet/functions.js +634 -0
  253. package/dist/sheet/goal-seek.d.ts +73 -0
  254. package/dist/sheet/goal-seek.js +153 -0
  255. package/dist/sheet/index.d.ts +80 -0
  256. package/dist/sheet/index.js +80 -0
  257. package/dist/sheet/links.d.ts +57 -0
  258. package/dist/sheet/links.js +174 -0
  259. package/dist/sheet/merges.d.ts +71 -0
  260. package/dist/sheet/merges.js +137 -0
  261. package/dist/sheet/messages.d.ts +778 -0
  262. package/dist/sheet/messages.js +806 -0
  263. package/dist/sheet/names.d.ts +31 -0
  264. package/dist/sheet/names.js +87 -0
  265. package/dist/sheet/navigate.d.ts +52 -0
  266. package/dist/sheet/navigate.js +135 -0
  267. package/dist/sheet/number-format.d.ts +110 -0
  268. package/dist/sheet/number-format.js +905 -0
  269. package/dist/sheet/objects.d.ts +106 -0
  270. package/dist/sheet/objects.js +149 -0
  271. package/dist/sheet/ods-document.d.ts +44 -0
  272. package/dist/sheet/ods-document.js +1275 -0
  273. package/dist/sheet/open-file.d.ts +26 -0
  274. package/dist/sheet/open-file.js +56 -0
  275. package/dist/sheet/outline.d.ts +82 -0
  276. package/dist/sheet/outline.js +228 -0
  277. package/dist/sheet/packs/array.d.ts +16 -0
  278. package/dist/sheet/packs/array.js +172 -0
  279. package/dist/sheet/packs/database.d.ts +42 -0
  280. package/dist/sheet/packs/database.js +142 -0
  281. package/dist/sheet/packs/engineering.d.ts +2 -0
  282. package/dist/sheet/packs/engineering.js +296 -0
  283. package/dist/sheet/packs/financial.d.ts +5 -0
  284. package/dist/sheet/packs/financial.js +220 -0
  285. package/dist/sheet/packs/math-stats.d.ts +2 -0
  286. package/dist/sheet/packs/math-stats.js +372 -0
  287. package/dist/sheet/packs/special.d.ts +44 -0
  288. package/dist/sheet/packs/special.js +187 -0
  289. package/dist/sheet/packs/stats-dist.d.ts +2 -0
  290. package/dist/sheet/packs/stats-dist.js +785 -0
  291. package/dist/sheet/packs/text-date.d.ts +2 -0
  292. package/dist/sheet/packs/text-date.js +332 -0
  293. package/dist/sheet/packs/trig.d.ts +2 -0
  294. package/dist/sheet/packs/trig.js +73 -0
  295. package/dist/sheet/page-setup.d.ts +73 -0
  296. package/dist/sheet/page-setup.js +73 -0
  297. package/dist/sheet/palette.d.ts +19 -0
  298. package/dist/sheet/palette.js +84 -0
  299. package/dist/sheet/parse.d.ts +13 -0
  300. package/dist/sheet/parse.js +140 -0
  301. package/dist/sheet/paste-special.d.ts +186 -0
  302. package/dist/sheet/paste-special.js +601 -0
  303. package/dist/sheet/pivot-range.d.ts +160 -0
  304. package/dist/sheet/pivot-range.js +333 -0
  305. package/dist/sheet/presence.d.ts +73 -0
  306. package/dist/sheet/presence.js +79 -0
  307. package/dist/sheet/print.d.ts +104 -0
  308. package/dist/sheet/print.js +169 -0
  309. package/dist/sheet/protection.d.ts +75 -0
  310. package/dist/sheet/protection.js +101 -0
  311. package/dist/sheet/rects.d.ts +45 -0
  312. package/dist/sheet/rects.js +112 -0
  313. package/dist/sheet/refs.d.ts +130 -0
  314. package/dist/sheet/refs.js +413 -0
  315. package/dist/sheet/ribbon-icons.d.ts +31 -0
  316. package/dist/sheet/ribbon-icons.js +536 -0
  317. package/dist/sheet/ribbon.d.ts +173 -0
  318. package/dist/sheet/ribbon.js +1054 -0
  319. package/dist/sheet/sheet-kinds.d.ts +74 -0
  320. package/dist/sheet/sheet-kinds.js +91 -0
  321. package/dist/sheet/shortcuts.d.ts +174 -0
  322. package/dist/sheet/shortcuts.js +674 -0
  323. package/dist/sheet/sort.d.ts +51 -0
  324. package/dist/sheet/sort.js +107 -0
  325. package/dist/sheet/sparklines.d.ts +111 -0
  326. package/dist/sheet/sparklines.js +204 -0
  327. package/dist/sheet/structure.d.ts +87 -0
  328. package/dist/sheet/structure.js +166 -0
  329. package/dist/sheet/table-styles.d.ts +74 -0
  330. package/dist/sheet/table-styles.js +152 -0
  331. package/dist/sheet/tables.d.ts +89 -0
  332. package/dist/sheet/tables.js +178 -0
  333. package/dist/sheet/tokenize.d.ts +71 -0
  334. package/dist/sheet/tokenize.js +355 -0
  335. package/dist/sheet/transforms.d.ts +76 -0
  336. package/dist/sheet/transforms.js +154 -0
  337. package/dist/sheet/validation.d.ts +108 -0
  338. package/dist/sheet/validation.js +278 -0
  339. package/dist/sheet/workbook.d.ts +217 -0
  340. package/dist/sheet/workbook.js +1120 -0
  341. package/dist/sheet/xls-cfb.d.ts +32 -0
  342. package/dist/sheet/xls-cfb.js +290 -0
  343. package/dist/sheet/xls-document.d.ts +10 -0
  344. package/dist/sheet/xls-document.js +1243 -0
  345. package/dist/sheet/xls-formula.d.ts +40 -0
  346. package/dist/sheet/xls-formula.js +569 -0
  347. package/dist/sheet/xlsx-document.d.ts +108 -0
  348. package/dist/sheet/xlsx-document.js +1849 -0
  349. package/dist/sheet/xlsx-drawing.d.ts +99 -0
  350. package/dist/sheet/xlsx-drawing.js +420 -0
  351. package/dist/sheet-enable.d.ts +6 -0
  352. package/dist/sheet-enable.js +45 -0
  353. package/dist/sheet-text.d.ts +7 -0
  354. package/dist/sheet-text.js +29 -0
  355. package/dist/sources/auth-supabase.js +2 -2
  356. package/dist/sources/realtime-supabase.js +2 -2
  357. package/dist/sources/rest.d.ts +6 -2
  358. package/dist/sources/rest.js +42 -7
  359. package/dist/sources/supabase.d.ts +10 -1
  360. package/dist/sources/supabase.js +73 -40
  361. package/dist/studio/emit-project.js +14 -1
  362. package/dist/studio/index.js +1 -1
  363. package/dist/studio/project.d.ts +11 -2
  364. package/dist/studio/project.js +5 -2
  365. package/dist/studio/ui-components.generated.js +170 -3
  366. package/dist/sveltekit/in-memory.d.ts +2 -2
  367. package/dist/sveltekit/in-memory.js +125 -4
  368. package/dist/sveltekit/index.d.ts +1 -1
  369. package/dist/sveltekit/index.js +1 -1
  370. package/dist/sveltekit/query-plan.d.ts +50 -4
  371. package/dist/sveltekit/query-plan.js +25 -3
  372. package/dist/sveltekit/sql-source.d.ts +6 -0
  373. package/dist/sveltekit/sql-source.js +34 -6
  374. package/dist/sveltekit/sql.d.ts +31 -0
  375. package/dist/sveltekit/sql.js +135 -25
  376. package/dist/sveltekit/transport.d.ts +10 -2
  377. package/dist/sveltekit/transport.js +30 -6
  378. package/dist/upgrade-prompt.d.ts +1 -1
  379. package/dist/version.d.ts +1 -1
  380. package/dist/version.js +1 -1
  381. package/dist/watermark.js +35 -2
  382. package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
  383. package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
  384. package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
  385. package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
  386. package/dist/wc/SvField-B_kurx_P.js +149 -0
  387. package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
  388. package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
  389. package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
  390. package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
  391. package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
  392. package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
  393. package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
  394. package/dist/wc/SvModal-DrfOYYyX.js +189 -0
  395. package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
  396. package/dist/wc/chart-6OXlybVT.js +4341 -0
  397. package/dist/wc/chart-export-CeSADGfi.js +135 -0
  398. package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
  399. package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
  400. package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
  401. package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
  402. package/dist/wc/client-DQIzjDBG.js +3064 -0
  403. package/dist/wc/column-resize-DUPgynvc.js +101 -0
  404. package/dist/wc/date-format-DS-z_h9v.js +1130 -0
  405. package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
  406. package/dist/wc/editor-contract-peBDxir_.js +22 -0
  407. package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
  408. package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
  409. package/dist/wc/list-option-DrRyivWp.js +82 -0
  410. package/dist/wc/popover-WsGlvtQv.js +69 -0
  411. package/dist/wc/positioning-BiKLfu1E.js +112 -0
  412. package/dist/wc/react.d.ts +41 -0
  413. package/dist/wc/react.js +90 -0
  414. package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
  415. package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
  416. package/dist/wc/row-resize-limG_N1z.js +111 -0
  417. package/dist/wc/sv-sheet-element.d.ts +97 -0
  418. package/dist/wc/sv-sheet-element.js +44213 -0
  419. package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
  420. package/dist/wc/validate-BqDthkNr.js +88 -0
  421. package/dist/wc/vue.d.ts +31 -0
  422. package/dist/wc/vue.js +75 -0
  423. package/package.json +36 -6
  424. package/dist/designer/assets/GridMenus-B1JtIN21.js +0 -8
  425. package/dist/designer/assets/SvDateRangeInput-CjO7nn_x.js +0 -1
  426. package/dist/designer/assets/SvDateTimePicker-ByBD_ov6.js +0 -1
  427. package/dist/designer/assets/SvField-YDLipR6O.css +0 -1
  428. package/dist/designer/assets/SvField-cj1PFNgZ.js +0 -1
  429. package/dist/designer/assets/SvGridCellEditor-0W1L2hJ1.js +0 -2
  430. package/dist/designer/assets/SvGridChart-DBOR4xcz.js +0 -2
  431. package/dist/designer/assets/SvGridChart-fkMWeh1J.css +0 -1
  432. package/dist/designer/assets/SvGridChartPanel-symrhNnR.js +0 -11
  433. package/dist/designer/assets/SvGridChartView-BmRxq6mU.js +0 -1
  434. package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
  435. package/dist/designer/assets/SvListBox-1oUF6Iav.js +0 -110
  436. package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
  437. package/dist/designer/assets/chart-DXFganU8.js +0 -1
  438. package/dist/designer/assets/column-resize-C_inr5zT.js +0 -1
  439. package/dist/designer/assets/date-format-DGagAqRc.css +0 -1
  440. package/dist/designer/assets/date-format-onlYDsrY.js +0 -1
  441. package/dist/designer/assets/easing-zaypKrr0.js +0 -3
  442. package/dist/designer/assets/index-k2stW6L8.css +0 -1
  443. package/dist/designer/assets/row-resize-B0FWHcNr.js +0 -1
  444. package/dist/designer/assets/src-D9p27OGC.js +0 -58
  445. package/dist/designer/assets/validate-h-aslRV9.js +0 -1
@@ -0,0 +1,674 @@
1
+ import { edgeOfRegion, currentRegion, isWholeSheet, wholeSheet, isBlankValue, } from './navigate.js';
2
+ import { fillDown, fillRight, stampDate, copyFromAbove, copyValueFromAbove, targetRect, guessSumRange, looksNumeric, } from './commands.js';
3
+ import { FORMAT_PRESETS } from './number-format.js';
4
+ import { formatA1 } from './address.js';
5
+ import { insertRows, deleteRows, insertColumns, deleteColumns, axisForSelection, getStructureTarget, } from './structure.js';
6
+ import { getFindTarget } from './find-replace.js';
7
+ import { cycleReference } from './edit-keys.js';
8
+ /** The guard's answer, with the refusal reported when it is no. */
9
+ export function formatAllowed(target, rects) {
10
+ if (target.guard?.(rects) === false) {
11
+ target.refused?.();
12
+ return false;
13
+ }
14
+ return true;
15
+ }
16
+ let formatTarget = null;
17
+ /** Attach the store the formatting shortcuts write to. */
18
+ export function setFormatTarget(target) {
19
+ formatTarget = target;
20
+ }
21
+ export function getFormatTarget() {
22
+ return formatTarget;
23
+ }
24
+ /**
25
+ * The workbook the sheet-switching keys act on.
26
+ *
27
+ * Optional, like everything else here: a single-sheet grid never sets one and
28
+ * Ctrl+PageDown falls through to the browser's own tab switching, which is
29
+ * what someone with one sheet expects it to do.
30
+ */
31
+ let workbook = null;
32
+ let onWorkbookChange = null;
33
+ /** Which sheets are hidden, so Ctrl+PageUp and PageDown step over them. */
34
+ let sheetHidden = null;
35
+ export function setWorkbook(next, onChange, isHidden) {
36
+ workbook = next;
37
+ onWorkbookChange = onChange ?? null;
38
+ sheetHidden = isHidden ?? null;
39
+ }
40
+ export function getWorkbook() {
41
+ return workbook;
42
+ }
43
+ /** Move `delta` sheets from the active one. Excel does NOT wrap at the ends,
44
+ * so neither does this: hitting the last sheet and pressing again should
45
+ * leave you there rather than teleport you to the first. */
46
+ export function switchSheet(delta) {
47
+ const wb = workbook;
48
+ if (!wb)
49
+ return false;
50
+ const sheets = wb.sheets;
51
+ const at = sheets.indexOf(wb.active);
52
+ if (at < 0)
53
+ return false;
54
+ // The next sheet that shows; a hidden one is stepped over, as in Excel.
55
+ let next = at + delta;
56
+ while (next >= 0 && next < sheets.length && sheetHidden?.(sheets[next]))
57
+ next += delta;
58
+ if (next < 0 || next >= sheets.length)
59
+ return false;
60
+ wb.setActive(sheets[next]);
61
+ onWorkbookChange?.();
62
+ return true;
63
+ }
64
+ /** Called when Ctrl+Shift+V fires, so a consumer can open its own Paste
65
+ * Special dialog. Same reasoning as the other two: the keyboard layer owns
66
+ * the key, the consumer owns the chrome. */
67
+ let onPasteSpecial = null;
68
+ export function setPasteSpecialHandler(fn) {
69
+ onPasteSpecial = fn;
70
+ }
71
+ /** Called when Ctrl+H fires, so a consumer can open its own Find and Replace
72
+ * panel. Same reasoning as the Format Cells dialog: the keyboard layer owns
73
+ * the key, the consumer owns the chrome. */
74
+ let onFindReplace = null;
75
+ export function setFindReplaceHandler(fn) {
76
+ onFindReplace = fn;
77
+ }
78
+ let onRibbonAction = null;
79
+ export function setRibbonActionHandler(fn) {
80
+ onRibbonAction = fn;
81
+ }
82
+ const raise = (action) => (cmd) => onRibbonAction?.(action, cmd) ?? false;
83
+ /** Raise a ribbon action from a button whose face is not an entry of its own. */
84
+ export function raiseRibbonAction(action, cmd) {
85
+ return onRibbonAction?.(action, cmd) ?? false;
86
+ }
87
+ /** Excel's size ladder. Pixels here, since that is what the cell renders. */
88
+ export const FONT_SIZES = [8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72];
89
+ /** A cell with no size of its own renders at the grid's 13px. */
90
+ export const DEFAULT_FONT_SIZE = 13;
91
+ /** The format entry under the active cell, or undefined. */
92
+ export function activeEntry(cmd) {
93
+ const target = formatTarget;
94
+ const active = cmd.activeCell;
95
+ if (!target || !active)
96
+ return undefined;
97
+ const rowId = target.lookup.rowIdAt(active.rowIndex);
98
+ const columnId = target.lookup.columnIdAt(active.colIndex);
99
+ return rowId != null && columnId != null ? target.store.get(rowId, columnId) : undefined;
100
+ }
101
+ /** Excel's Increase / Decrease Font Size: the next rung of the ladder. */
102
+ export function nudgeFontSize(direction) {
103
+ return (cmd) => {
104
+ const current = activeEntry(cmd)?.fontSize ?? DEFAULT_FONT_SIZE;
105
+ const larger = FONT_SIZES.filter((s) => s > current);
106
+ const smaller = FONT_SIZES.filter((s) => s < current);
107
+ const next = direction > 0 ? larger[0] : smaller[smaller.length - 1];
108
+ if (next === undefined)
109
+ return false;
110
+ return applyFormat(cmd, { fontSize: next === DEFAULT_FONT_SIZE ? undefined : next });
111
+ };
112
+ }
113
+ let onFormatDialog = null;
114
+ export function setFormatDialogHandler(fn) {
115
+ onFormatDialog = fn;
116
+ }
117
+ /**
118
+ * Which component the targets above belong to. Every one of them is a
119
+ * module-level singleton, so with two sheets on a page (a collaboration
120
+ * demo, a docs page with an example per section) the keys, the ribbon's
121
+ * buttons and its pressed states all went to whichever sheet mounted last:
122
+ * Ctrl+B bolded a cell three examples down. A sheet claims the targets when
123
+ * the pointer or the focus lands in it, and on unmount lets go only of what
124
+ * is still its own, so tearing one sheet down cannot disarm another.
125
+ */
126
+ let owner = null;
127
+ export function setShortcutOwner(token) {
128
+ owner = token;
129
+ }
130
+ export function getShortcutOwner() {
131
+ return owner;
132
+ }
133
+ /** Read the grid through the command context as a blank-aware matrix. */
134
+ export function gridOf(cmd) {
135
+ return {
136
+ rowCount: cmd.rowCount,
137
+ colCount: cmd.colCount,
138
+ isBlank: (r, c) => isBlankValue(cmd.getCellValue(r, c)),
139
+ };
140
+ }
141
+ /**
142
+ * Ctrl+End: the bottom-right corner of what has been typed, as in Excel,
143
+ * rather than the grid's last cell. A sheet has thousands of empty rows
144
+ * below the data, and the last of them is never where the user wanted to
145
+ * go. Ctrl+Home is the grid's own and already lands on A1.
146
+ */
147
+ export function lastUsedCell(cmd) {
148
+ let row = -1;
149
+ let col = -1;
150
+ for (let r = 0; r < cmd.rowCount; r += 1) {
151
+ for (let c = 0; c < cmd.colCount; c += 1) {
152
+ if (isBlankValue(cmd.getCellValue(r, c)))
153
+ continue;
154
+ if (r > row)
155
+ row = r;
156
+ if (c > col)
157
+ col = c;
158
+ }
159
+ }
160
+ return row < 0 ? { row: 0, col: 0 } : { row, col };
161
+ }
162
+ export const goToLastUsed = (cmd) => {
163
+ const { row, col } = lastUsedCell(cmd);
164
+ cmd.setActiveCell(row, col);
165
+ cmd.setSelection(row, col);
166
+ cmd.scrollIntoView(row, col);
167
+ return true;
168
+ };
169
+ /** Ctrl+Shift+End / Home: extend the selection to the last used cell, or to A1. */
170
+ function extendTo(where) {
171
+ return (cmd) => {
172
+ if (!cmd.activeCell)
173
+ return false;
174
+ const { row, col } = where === 'end' ? lastUsedCell(cmd) : { row: 0, col: 0 };
175
+ cmd.extendSelection(row, col);
176
+ cmd.scrollIntoView(row, col);
177
+ return true;
178
+ };
179
+ }
180
+ /** F4 while editing: turn the reference at the caret through its anchorings. */
181
+ export const pinReference = (cmd) => {
182
+ const el = cmd.editor;
183
+ if (!el)
184
+ return false;
185
+ const edit = cycleReference(el.value, el.selectionStart ?? el.value.length);
186
+ if (!edit)
187
+ return false;
188
+ el.value = edit.text;
189
+ el.setSelectionRange(edit.caret, edit.caret);
190
+ // The grid keeps its own copy of the draft and reads it from input events.
191
+ el.dispatchEvent(new Event('input', { bubbles: true }));
192
+ return true;
193
+ };
194
+ export function move(dir, extend) {
195
+ return (cmd) => {
196
+ const active = cmd.activeCell;
197
+ if (!active)
198
+ return false;
199
+ if (extend) {
200
+ // The range grows from its far corner and the active cell stays put,
201
+ // as in Excel; stepping from the active cell would reach the same
202
+ // edge on every press.
203
+ const from = cmd.selectionFocus ?? { rowIndex: active.rowIndex, colIndex: active.colIndex };
204
+ const to = pastHidden(cmd, { row: from.rowIndex, col: from.colIndex }, edgeOfRegion(gridOf(cmd), { row: from.rowIndex, col: from.colIndex }, dir), dir);
205
+ cmd.extendSelection(to.row, to.col);
206
+ // Along the axis of the key only, as Excel scrolls: a sideways jump
207
+ // keeps the rows where they are.
208
+ const sideways = dir === 'left' || dir === 'right';
209
+ cmd.scrollIntoView(sideways ? active.rowIndex : to.row, sideways ? to.col : active.colIndex);
210
+ return true;
211
+ }
212
+ const to = pastHidden(cmd, { row: active.rowIndex, col: active.colIndex }, edgeOfRegion(gridOf(cmd), { row: active.rowIndex, col: active.colIndex }, dir), dir);
213
+ cmd.setActiveCell(to.row, to.col);
214
+ cmd.scrollIntoView(to.row, to.col);
215
+ cmd.setSelection(to.row, to.col);
216
+ return true;
217
+ };
218
+ }
219
+ /**
220
+ * A jump never rests on a hidden row or column, as Excel's does not. The
221
+ * edge it found is the end of a run of data, or the first cell of the next
222
+ * run; a hidden edge stands in for the nearest cell of the same run that
223
+ * shows, which lies back toward the start when the run continues behind
224
+ * the landing, and further on when the landing began a new run. With no
225
+ * such cell the cursor goes on to the next line that shows at all. Only the
226
+ * grid's api knows what is hidden; a context without one (a test's fake)
227
+ * hides nothing.
228
+ */
229
+ function pastHidden(cmd, from, to, dir) {
230
+ const api = cmd.api;
231
+ const vertical = dir === 'up' || dir === 'down';
232
+ const hidden = vertical
233
+ ? (i) => api?.isRowCollapsed?.(i) ?? false
234
+ : (i) => { const id = cmd.columnIdAt(i); return id != null && (api?.isColumnCollapsed?.(id) ?? false); };
235
+ const at = vertical ? to.row : to.col;
236
+ if (!hidden(at))
237
+ return to;
238
+ const grid = gridOf(cmd);
239
+ const count = vertical ? cmd.rowCount : cmd.colCount;
240
+ const step = dir === 'down' || dir === 'right' ? 1 : -1;
241
+ const cell = (i) => (vertical ? { row: i, col: to.col } : { row: to.row, col: i });
242
+ const blank = (i) => i < 0 || i >= count || grid.isBlank(cell(i).row, cell(i).col);
243
+ const origin = vertical ? from.row : from.col;
244
+ // The run continues back toward the start: the last of it that shows,
245
+ // unless that is where the jump began, in which case the run is done and
246
+ // the jump goes on from its hidden end to the next run.
247
+ if (!blank(at - step)) {
248
+ for (let i = at - step; i !== origin && i >= 0 && i < count; i -= step) {
249
+ if (blank(i))
250
+ break;
251
+ if (!hidden(i))
252
+ return cell(i);
253
+ }
254
+ const next = edgeOfRegion(grid, to, dir);
255
+ if (next.row !== to.row || next.col !== to.col)
256
+ return pastHidden(cmd, to, next, dir);
257
+ }
258
+ // The landing began a run: the first of it that shows.
259
+ for (let i = at + step; i >= 0 && i < count && !blank(i); i += step) {
260
+ if (!hidden(i))
261
+ return cell(i);
262
+ }
263
+ // Nothing of the run shows: the next line that shows at all, else stay.
264
+ for (let i = at + step; i >= 0 && i < count; i += step)
265
+ if (!hidden(i))
266
+ return cell(i);
267
+ for (let i = at - step; i !== origin - step && i >= 0 && i < count; i -= step)
268
+ if (!hidden(i))
269
+ return cell(i);
270
+ return to;
271
+ }
272
+ /** Ctrl+A: the current region, then the whole sheet on a second press. */
273
+ export const selectRegion = (cmd) => {
274
+ const active = cmd.activeCell;
275
+ if (!active)
276
+ return false;
277
+ const g = gridOf(cmd);
278
+ const current = targetRect(cmd);
279
+ const region = currentRegion(g, { row: active.rowIndex, col: active.colIndex });
280
+ const already = current !== null &&
281
+ current[0] === region[0] && current[1] === region[1] &&
282
+ current[2] === region[2] && current[3] === region[3];
283
+ const next = already && !isWholeSheet(g, region) ? wholeSheet(g) : region;
284
+ cmd.setSelection(next[0], next[1]);
285
+ cmd.extendSelection(next[2], next[3]);
286
+ return true;
287
+ };
288
+ /**
289
+ * Ctrl+Space / Shift+Space: the whole columns or rows the selection
290
+ * touches (B2:C3 gives rows 2:3), as in Excel; the active cell stays.
291
+ */
292
+ export function selectLine(axis) {
293
+ return (cmd) => {
294
+ const rect = targetRect(cmd);
295
+ if (!rect)
296
+ return false;
297
+ const [r1, c1, r2, c2] = rect;
298
+ if (axis === 'column') {
299
+ cmd.setSelection(0, c1);
300
+ cmd.extendSelection(Math.max(cmd.rowCount - 1, 0), c2);
301
+ }
302
+ else {
303
+ cmd.setSelection(r1, 0);
304
+ cmd.extendSelection(r2, Math.max(cmd.colCount - 1, 0));
305
+ }
306
+ return true;
307
+ };
308
+ }
309
+ /** Ctrl+Shift+8 (Ctrl+*): the current region, and only that. */
310
+ export const selectCurrentRegion = (cmd) => {
311
+ const active = cmd.activeCell;
312
+ if (!active)
313
+ return false;
314
+ const region = currentRegion(gridOf(cmd), { row: active.rowIndex, col: active.colIndex });
315
+ cmd.setSelection(region[0], region[1]);
316
+ cmd.extendSelection(region[2], region[3]);
317
+ return true;
318
+ };
319
+ /**
320
+ * Run a format change over `rects` as ONE undo step.
321
+ *
322
+ * The format store is not the grid's data, so a write to it is invisible
323
+ * to Ctrl+Z on its own: Bold would land and the Undo button would stay
324
+ * grey, which is not how a spreadsheet behaves. This snapshots every cell
325
+ * the change touches before and after, and hands the grid a step that puts
326
+ * either snapshot back. A cell's whole entry is restored rather than the
327
+ * one field, so undoing "bold" on a cell that was also made red does not
328
+ * have to know which of the two the press was about.
329
+ */
330
+ export function withFormatUndo(cmd, target, rects, mutate) {
331
+ const snapshot = () => {
332
+ const cells = [];
333
+ for (const [minRow, minCol, maxRow, maxCol] of rects) {
334
+ for (let r = minRow; r <= maxRow; r += 1) {
335
+ for (let c = minCol; c <= maxCol; c += 1) {
336
+ const rowId = target.lookup.rowIdAt(r);
337
+ const columnId = target.lookup.columnIdAt(c);
338
+ if (rowId == null || columnId == null)
339
+ continue;
340
+ const entry = target.store.get(rowId, columnId);
341
+ cells.push({ r, c, entry: entry ? { ...entry, border: entry.border ? { ...entry.border } : undefined } : undefined });
342
+ }
343
+ }
344
+ }
345
+ return cells;
346
+ };
347
+ const restore = (cells) => () => {
348
+ for (const { r, c, entry } of cells) {
349
+ target.store.clear([[r, c, r, c]], target.lookup);
350
+ if (entry)
351
+ target.store.set([[r, c, r, c]], entry, target.lookup);
352
+ }
353
+ target.onChange?.();
354
+ };
355
+ const before = snapshot();
356
+ mutate();
357
+ const after = snapshot();
358
+ // Optional at runtime: a context built by hand (a demo, an older integration)
359
+ // may predate the seam, and a format that cannot be undone is still a
360
+ // format that landed.
361
+ cmd.recordUndo?.(restore(before), restore(after));
362
+ }
363
+ /** Apply a patch to the selection through the attached store. */
364
+ export function applyFormat(cmd, patch) {
365
+ const target = formatTarget;
366
+ if (!target)
367
+ return false;
368
+ const rects = cmd.ranges.length ? cmd.ranges : rectOfActive(cmd);
369
+ if (!rects.length)
370
+ return false;
371
+ if (!formatAllowed(target, rects))
372
+ return false;
373
+ withFormatUndo(cmd, target, rects, () => target.store.set(rects, patch, target.lookup));
374
+ target.onChange?.();
375
+ return true;
376
+ }
377
+ export function toggleFormat(cmd, field) {
378
+ const target = formatTarget;
379
+ if (!target)
380
+ return false;
381
+ const rects = cmd.ranges.length ? cmd.ranges : rectOfActive(cmd);
382
+ if (!rects.length)
383
+ return false;
384
+ if (!formatAllowed(target, rects))
385
+ return false;
386
+ withFormatUndo(cmd, target, rects, () => target.store.toggle(rects, field, target.lookup));
387
+ target.onChange?.();
388
+ return true;
389
+ }
390
+ /**
391
+ * Excel's Borders menu, applied the way Excel applies it: "Bottom Border"
392
+ * puts a line under the bottom edge of the SELECTION, not under every
393
+ * cell; "All Borders" lines every cell; "Outside" frames the block. Sides
394
+ * merge with what a cell already has, so a top border does not erase a
395
+ * bottom one, and "No Border" clears all four.
396
+ */
397
+ export function applyBorders(cmd, preset) {
398
+ const target = formatTarget;
399
+ if (!target)
400
+ return false;
401
+ const rects = cmd.ranges.length ? cmd.ranges : rectOfActive(cmd);
402
+ if (!rects.length)
403
+ return false;
404
+ if (!formatAllowed(target, rects))
405
+ return false;
406
+ const line = { width: preset === 'thick-bottom' ? 2 : 1 };
407
+ const { store, lookup } = target;
408
+ withFormatUndo(cmd, target, rects, () => {
409
+ for (const [minRow, minCol, maxRow, maxCol] of rects) {
410
+ for (let r = minRow; r <= maxRow; r += 1) {
411
+ for (let c = minCol; c <= maxCol; c += 1) {
412
+ const rowId = lookup.rowIdAt(r);
413
+ const columnId = lookup.columnIdAt(c);
414
+ if (rowId == null || columnId == null)
415
+ continue;
416
+ const sides = new Set();
417
+ if (preset === 'all') {
418
+ sides.add('top');
419
+ sides.add('right');
420
+ sides.add('bottom');
421
+ sides.add('left');
422
+ }
423
+ if (preset === 'outside' || preset === 'top') {
424
+ if (r === minRow)
425
+ sides.add('top');
426
+ }
427
+ if (preset === 'outside' || preset === 'bottom' || preset === 'thick-bottom') {
428
+ if (r === maxRow)
429
+ sides.add('bottom');
430
+ }
431
+ if (preset === 'outside' || preset === 'left') {
432
+ if (c === minCol)
433
+ sides.add('left');
434
+ }
435
+ if (preset === 'outside' || preset === 'right') {
436
+ if (c === maxCol)
437
+ sides.add('right');
438
+ }
439
+ if (preset === 'none') {
440
+ store.set([[r, c, r, c]], { border: undefined }, lookup);
441
+ continue;
442
+ }
443
+ if (sides.size === 0)
444
+ continue;
445
+ const border = { ...(store.get(rowId, columnId)?.border ?? {}) };
446
+ for (const side of sides)
447
+ border[side] = line;
448
+ store.set([[r, c, r, c]], { border }, lookup);
449
+ }
450
+ }
451
+ }
452
+ });
453
+ target.onChange?.();
454
+ return true;
455
+ }
456
+ /** Excel's Clear Formats: drop every format on the selection, keep the values. */
457
+ export function clearFormats(cmd) {
458
+ const target = formatTarget;
459
+ if (!target)
460
+ return false;
461
+ const rects = cmd.ranges.length ? cmd.ranges : rectOfActive(cmd);
462
+ if (!rects.length)
463
+ return false;
464
+ if (!formatAllowed(target, rects))
465
+ return false;
466
+ withFormatUndo(cmd, target, rects, () => target.store.clear(rects, target.lookup));
467
+ target.onChange?.();
468
+ return true;
469
+ }
470
+ function rectOfActive(cmd) {
471
+ const rect = targetRect(cmd);
472
+ return rect ? [rect] : [];
473
+ }
474
+ export function preset(name) {
475
+ return (cmd) => applyFormat(cmd, { numFmt: FORMAT_PRESETS[name] });
476
+ }
477
+ /**
478
+ * Alt+=. Proposes =SUM(range) over the run Excel would guess. With one cell
479
+ * selected the formula is opened in the cell's editor rather than written,
480
+ * as Excel's AutoSum does: the guess is often a row short, and the editor is
481
+ * where it gets corrected before Enter takes it. A wider selection has the
482
+ * sum written into the active cell outright.
483
+ */
484
+ export const autoSum = (cmd) => {
485
+ const active = cmd.activeCell;
486
+ if (!active)
487
+ return false;
488
+ const range = guessSumRange(cmd, looksNumeric);
489
+ if (!range)
490
+ return false;
491
+ if (cmd.canEdit?.(active.rowIndex, active.colIndex) === false)
492
+ return false;
493
+ const [minRow, minCol, maxRow, maxCol] = range;
494
+ const ref = (r, c) => formatA1({ col: c, colAbs: false, row: r, rowAbs: false, sheet: null });
495
+ const formula = `=SUM(${ref(minRow, minCol)}:${ref(maxRow, maxCol)})`;
496
+ const last = cmd.ranges[cmd.ranges.length - 1];
497
+ const oneCell = !last || (last[0] === last[2] && last[1] === last[3]);
498
+ if (oneCell && cmd.startEditing(active.rowIndex, active.colIndex, formula))
499
+ return true;
500
+ cmd.setCellValue(active.rowIndex, active.colIndex, formula);
501
+ return true;
502
+ };
503
+ export const SHEET_BINDINGS = [
504
+ // Navigation
505
+ { key: 'ArrowUp', mod: true, run: move('up', false), label: 'Jump to the edge of the data region' },
506
+ { key: 'ArrowDown', mod: true, run: move('down', false), label: 'Jump to the edge of the data region' },
507
+ { key: 'ArrowLeft', mod: true, run: move('left', false), label: 'Jump to the edge of the data region' },
508
+ { key: 'ArrowRight', mod: true, run: move('right', false), label: 'Jump to the edge of the data region' },
509
+ { key: 'ArrowUp', mod: true, shift: true, run: move('up', true), label: 'Extend the selection to the edge' },
510
+ { key: 'ArrowDown', mod: true, shift: true, run: move('down', true), label: 'Extend the selection to the edge' },
511
+ { key: 'ArrowLeft', mod: true, shift: true, run: move('left', true), label: 'Extend the selection to the edge' },
512
+ { key: 'ArrowRight', mod: true, shift: true, run: move('right', true), label: 'Extend the selection to the edge' },
513
+ { key: 'End', mod: true, run: goToLastUsed, label: 'Go to the last used cell' },
514
+ { key: 'End', mod: true, shift: true, run: extendTo('end'), label: 'Extend the selection to the last used cell' },
515
+ { key: 'Home', mod: true, shift: true, run: extendTo('home'), label: 'Extend the selection to A1' },
516
+ // While editing
517
+ { key: 'F4', editing: true, run: pinReference, label: 'Pin the reference at the caret ($A$1, A$1, $A1)' },
518
+ // Selection
519
+ { key: 'a', mod: true, run: selectRegion, label: 'Select the current region, then the sheet' },
520
+ { key: ' ', mod: true, shift: true, run: selectRegion, label: 'Select the current region, then the sheet' },
521
+ { key: '*', code: 'Digit8', mod: true, shift: true, run: selectCurrentRegion, label: 'Select the current region' },
522
+ { key: ' ', mod: true, run: selectLine('column'), label: 'Select the column' },
523
+ { key: ' ', shift: true, run: selectLine('row'), label: 'Select the row' },
524
+ // Fill and entry
525
+ { key: 'd', mod: true, run: (cmd) => fillDown(cmd), label: 'Fill down' },
526
+ { key: 'r', mod: true, run: (cmd) => fillRight(cmd), label: 'Fill right' },
527
+ { key: ';', mod: true, run: (cmd) => stampDate(cmd, 'date'), label: "Insert today's date" },
528
+ { key: ';', code: 'Semicolon', mod: true, shift: true, run: (cmd) => stampDate(cmd, 'time'), label: 'Insert the current time' },
529
+ { key: "'", mod: true, run: (cmd) => copyFromAbove(cmd), label: 'Copy the cell above, unchanged' },
530
+ { key: '"', code: 'Quote', mod: true, shift: true, run: (cmd) => copyValueFromAbove(cmd), label: 'Copy the value of the cell above' },
531
+ { key: '&', code: 'Digit7', mod: true, shift: true, run: (cmd) => applyBorders(cmd, 'outside'), label: 'Outline border' },
532
+ { key: '_', code: 'Minus', mod: true, shift: true, run: (cmd) => applyBorders(cmd, 'none'), label: 'Remove borders' },
533
+ { key: '=', alt: true, run: autoSum, label: 'AutoSum the run above or to the left' },
534
+ // Formatting. These decline when no format store is attached, so the key
535
+ // falls through instead of looking broken.
536
+ { key: 'b', mod: true, run: (cmd) => toggleFormat(cmd, 'bold'), label: 'Bold' },
537
+ { key: 'i', mod: true, run: (cmd) => toggleFormat(cmd, 'italic'), label: 'Italic' },
538
+ { key: 'u', mod: true, run: (cmd) => toggleFormat(cmd, 'underline'), label: 'Underline' },
539
+ { key: '5', mod: true, run: (cmd) => toggleFormat(cmd, 'strike'), label: 'Strikethrough' },
540
+ { key: '1', mod: true, run: (cmd) => {
541
+ if (!onFormatDialog)
542
+ return false;
543
+ onFormatDialog(cmd);
544
+ return true;
545
+ }, label: 'Open Format Cells' },
546
+ { key: '1', code: 'Digit1', mod: true, shift: true, run: preset('number'), label: 'Number format' },
547
+ { key: '2', code: 'Digit2', mod: true, shift: true, run: preset('time'), label: 'Time format' },
548
+ { key: '3', code: 'Digit3', mod: true, shift: true, run: preset('date'), label: 'Date format' },
549
+ { key: '4', code: 'Digit4', mod: true, shift: true, run: preset('currency'), label: 'Currency format' },
550
+ { key: '5', code: 'Digit5', mod: true, shift: true, run: preset('percent'), label: 'Percent format' },
551
+ { key: '6', code: 'Digit6', mod: true, shift: true, run: preset('scientific'), label: 'Scientific format' },
552
+ { key: '`', code: 'Backquote', mod: true, shift: true, run: preset('general'), label: 'General format' },
553
+ { key: '>', code: 'Period', mod: true, shift: true, run: nudgeFontSize(1), label: 'Increase font size' },
554
+ { key: '<', code: 'Comma', mod: true, shift: true, run: nudgeFontSize(-1), label: 'Decrease font size' },
555
+ // What the ribbon's tooltips promise: the same actions from the keyboard.
556
+ { key: 'F9', run: raise('recalculate'), label: 'Recalculate' },
557
+ { key: '`', code: 'Backquote', mod: true, run: raise('toggle-formulas'), label: 'Show formulas' },
558
+ { key: 'l', mod: true, shift: true, run: raise('toggle-filter'), label: 'Filter' },
559
+ { key: 'F3', shift: true, run: raise('insert-function'), label: 'Insert Function' },
560
+ { key: 'F2', shift: true, run: raise('edit-comment'), label: 'Insert or edit the comment on the active cell' },
561
+ { key: 'k', mod: true, run: raise('insert-link'), label: 'Insert or edit the link on the active cell' },
562
+ { key: 'ArrowDown', alt: true, run: raise('open-list'), label: 'Open the list a validated cell offers' },
563
+ { key: 'F1', mod: true, run: raise('toggle-ribbon'), label: 'Collapse or expand the ribbon' },
564
+ { key: 'F3', mod: true, run: raise('name-manager'), label: 'Name Manager' },
565
+ { key: 't', mod: true, run: raise('insert-table'), label: 'Format as Table' },
566
+ // The File tab's keys. The browser's own Open and Save are what they
567
+ // replace, as in Excel; with no shell to answer them they fall through.
568
+ { key: 'o', mod: true, run: raise('file-open'), label: 'Open' },
569
+ { key: 's', mod: true, run: raise('file-save-xlsx'), label: 'Save As' },
570
+ { key: 'p', mod: true, run: raise('file-print'), label: 'Print' },
571
+ // Structure. Like the format bindings, these decline when nothing is
572
+ // attached. Excel opens a dialog for an ambiguous selection; deciding what
573
+ // that looks like is the consumer's, so an ambiguous selection declines and
574
+ // the consumer can bind its own dialog.
575
+ { key: '+', code: 'Equal', mod: true, shift: true, run: (cmd) => structural(cmd, 'insert'), label: 'Insert rows or columns' },
576
+ { key: '-', mod: true, run: (cmd) => structural(cmd, 'delete'), label: 'Delete rows or columns' },
577
+ // Hide and Unhide are raised, as Freeze is: the sheet shell keeps what
578
+ // is hidden per sheet and moves it with an insert or delete.
579
+ { key: '9', code: 'Digit9', mod: true, run: raise('hide-rows'), label: 'Hide the selected rows' },
580
+ { key: '0', code: 'Digit0', mod: true, run: raise('hide-columns'), label: 'Hide the selected columns' },
581
+ { key: '(', code: 'Digit9', mod: true, shift: true, run: raise('unhide-rows'), label: 'Unhide rows in the selection' },
582
+ { key: ')', code: 'Digit0', mod: true, shift: true, run: raise('unhide-columns'), label: 'Unhide columns in the selection' },
583
+ // Ctrl+H is Excel's Replace and Ctrl+F its Find; the shell has one dialog
584
+ // for both, so both open it. Ctrl+F is the browser's find otherwise, and a
585
+ // spreadsheet user who presses it wants the cells searched, as in Excel
586
+ // and Sheets; the browser's is a keystroke away with the sheet unfocused.
587
+ { key: 'h', mod: true, run: (cmd) => {
588
+ if (!onFindReplace || !getFindTarget())
589
+ return false;
590
+ onFindReplace(cmd);
591
+ return true;
592
+ }, label: 'Find and Replace' },
593
+ { key: 'f', mod: true, run: (cmd) => {
594
+ if (!onFindReplace || !getFindTarget())
595
+ return false;
596
+ onFindReplace(cmd);
597
+ return true;
598
+ }, label: 'Find' },
599
+ { key: 'v', mod: true, shift: true, run: (cmd) => {
600
+ if (!onPasteSpecial)
601
+ return false;
602
+ onPasteSpecial(cmd);
603
+ return true;
604
+ }, label: 'Paste Special' },
605
+ // Workbook. These decline without a workbook attached, so a single-sheet
606
+ // grid leaves Ctrl+PageDown to the browser.
607
+ { key: 'PageDown', mod: true, run: () => switchSheet(1), label: 'Next sheet' },
608
+ { key: 'PageUp', mod: true, run: () => switchSheet(-1), label: 'Previous sheet' },
609
+ { key: 'F11', shift: true, run: () => newSheet(), label: 'New sheet' },
610
+ ];
611
+ /** Shift+F11 and the ribbon's Insert Sheet: a new sheet after the last, made active. */
612
+ export function newSheet() {
613
+ const wb = workbook;
614
+ if (!wb)
615
+ return false;
616
+ wb.addSheet();
617
+ onWorkbookChange?.();
618
+ return true;
619
+ }
620
+ export function structural(cmd, kind) {
621
+ if (!getStructureTarget())
622
+ return false;
623
+ const axis = axisForSelection(cmd);
624
+ if (axis === 'ambiguous')
625
+ return false;
626
+ if (kind === 'insert') {
627
+ return axis === 'rows' ? insertRows(cmd) : insertColumns(cmd);
628
+ }
629
+ return axis === 'rows' ? deleteRows(cmd) : deleteColumns(cmd);
630
+ }
631
+ function matches(binding, event) {
632
+ if (binding.code) {
633
+ // Fall back to `key` when `code` is absent, which is how synthesized
634
+ // events in tests and some assistive tech behave.
635
+ const seen = event.code || '';
636
+ if (seen ? seen !== binding.code : event.key.toLowerCase() !== binding.key.toLowerCase()) {
637
+ return false;
638
+ }
639
+ }
640
+ else if (event.key.toLowerCase() !== binding.key.toLowerCase()) {
641
+ return false;
642
+ }
643
+ const mod = event.ctrlKey || event.metaKey;
644
+ if (mod !== (binding.mod ?? false))
645
+ return false;
646
+ if (event.shiftKey !== (binding.shift ?? false))
647
+ return false;
648
+ if (event.altKey !== (binding.alt ?? false))
649
+ return false;
650
+ return true;
651
+ }
652
+ /**
653
+ * The handler registered with the grid. Returns true when a binding ran, which
654
+ * is what tells the grid to stop and not interpret the key itself.
655
+ *
656
+ * A binding marked `editing` runs only inside the editor and the others
657
+ * only outside it: Ctrl+D while someone is typing in a cell is a keystroke
658
+ * they meant for the text, and F4 on the grid root has nothing to pin.
659
+ * Alt+Enter needs no binding: the grid's multiline text editor takes it as
660
+ * a line break itself.
661
+ */
662
+ export function handleSheetKey(event, cmd) {
663
+ for (const binding of SHEET_BINDINGS) {
664
+ if ((binding.editing ?? false) !== cmd.editing)
665
+ continue;
666
+ if (!matches(binding, event))
667
+ continue;
668
+ if (!binding.run(cmd, event))
669
+ return false;
670
+ event.preventDefault();
671
+ return true;
672
+ }
673
+ return false;
674
+ }