@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,166 @@
1
+ import { fixupReferences } from './refs.js';
2
+ let target = null;
3
+ /** Attach what the insert / delete commands operate on. */
4
+ export function setStructureTarget(next) {
5
+ target = next;
6
+ }
7
+ export function getStructureTarget() {
8
+ return target;
9
+ }
10
+ /**
11
+ * Rewrite every formula on the sheet for one structural edit.
12
+ *
13
+ * Walks the whole grid rather than consulting the dependency graph, because
14
+ * the graph indexes what a formula READS and this needs every formula that
15
+ * MENTIONS a moved coordinate, including ones whose precedents were never
16
+ * resolved (a `#REF!` today may become valid after an insert).
17
+ */
18
+ export function rewriteFormulas(cmd, t, edit) {
19
+ let changed = 0;
20
+ for (let r = 0; r < cmd.rowCount; r += 1) {
21
+ for (let c = 0; c < cmd.colCount; c += 1) {
22
+ const text = t.getRaw(r, c);
23
+ if (!text.startsWith('='))
24
+ continue;
25
+ const next = fixupReferences(text, edit);
26
+ if (typeof next === 'string' && next !== text) {
27
+ t.setRaw(r, c, next);
28
+ changed += 1;
29
+ }
30
+ }
31
+ }
32
+ if (t.names) {
33
+ for (const entry of t.names.list()) {
34
+ const next = fixupReferences(entry.refersTo, edit);
35
+ if (typeof next === 'string' && next !== entry.refersTo) {
36
+ t.names.define(entry.name, next);
37
+ changed += 1;
38
+ }
39
+ }
40
+ }
41
+ return changed;
42
+ }
43
+ /**
44
+ * Drop format entries for rows or columns the edit removes.
45
+ *
46
+ * Nothing needs SHIFTING. The store keys on row and column IDS, and an id
47
+ * travels with the thing it names: inserting a column at B does not rename
48
+ * what was B, it just puts a new id before it, so every existing entry still
49
+ * points at the right cell. That is the payoff for keying on ids instead of
50
+ * indices, and it is the same property that makes the store survive a sort.
51
+ *
52
+ * A DELETE is different: those ids are gone, and their entries would sit in
53
+ * the map for the life of the session. Hence this.
54
+ */
55
+ function forgetDeleted(t, edit, cmd) {
56
+ const format = t.format;
57
+ if (!format)
58
+ return;
59
+ const rows = edit.kind === 'deleteRows';
60
+ const cols = edit.kind === 'deleteCols';
61
+ if (!rows && !cols)
62
+ return;
63
+ const limit = rows ? cmd.rowCount : cmd.colCount;
64
+ for (let i = edit.at; i < Math.min(edit.at + edit.count, limit); i += 1) {
65
+ const id = rows ? format.lookup.rowIdAt(i) : format.lookup.columnIdAt(i);
66
+ if (id === null)
67
+ continue;
68
+ if (rows)
69
+ format.store.forgetRow(id);
70
+ else
71
+ format.store.forgetColumn(id);
72
+ }
73
+ }
74
+ function run(cmd, edit) {
75
+ const t = target;
76
+ if (!t)
77
+ return false;
78
+ if (edit.count <= 0)
79
+ return false;
80
+ if (t.canApply?.(edit) === false) {
81
+ t.refused?.();
82
+ return false;
83
+ }
84
+ return cmd.batch(() => {
85
+ const before = t.snapshot?.();
86
+ // Order matters: the rewrite and the cleanup both read the OLD geometry.
87
+ if (!t.rewritesReferences)
88
+ rewriteFormulas(cmd, t, edit);
89
+ forgetDeleted(t, edit, cmd);
90
+ t.apply(edit);
91
+ t.onChange?.();
92
+ // Recorded LAST, so undo runs it first: the whole state comes back, and
93
+ // the rewrite steps recorded above then re-apply their own "before"
94
+ // texts, which the snapshot already holds. Redo runs them the other way
95
+ // round to the same end.
96
+ const restore = t.restore;
97
+ if (before !== undefined && restore) {
98
+ const after = t.snapshot?.();
99
+ cmd.recordUndo?.(() => { restore(before); t.onChange?.(); }, () => { restore(after); t.onChange?.(); });
100
+ }
101
+ return true;
102
+ });
103
+ }
104
+ /** The span the active selection covers, as whole rows or whole columns. */
105
+ function spanOf(cmd, axis) {
106
+ const rect = cmd.ranges[cmd.ranges.length - 1];
107
+ if (rect) {
108
+ const [minRow, minCol, maxRow, maxCol] = rect;
109
+ return axis === 'rows'
110
+ ? { at: minRow, count: maxRow - minRow + 1 }
111
+ : { at: minCol, count: maxCol - minCol + 1 };
112
+ }
113
+ const active = cmd.activeCell;
114
+ if (!active)
115
+ return null;
116
+ return axis === 'rows'
117
+ ? { at: active.rowIndex, count: 1 }
118
+ : { at: active.colIndex, count: 1 };
119
+ }
120
+ export function insertRows(cmd, at, count = 1) {
121
+ const span = at === undefined ? spanOf(cmd, 'rows') : { at, count };
122
+ if (!span)
123
+ return false;
124
+ return run(cmd, { kind: 'insertRows', at: span.at, count: span.count });
125
+ }
126
+ export function deleteRows(cmd, at, count = 1) {
127
+ const span = at === undefined ? spanOf(cmd, 'rows') : { at, count };
128
+ if (!span)
129
+ return false;
130
+ return run(cmd, { kind: 'deleteRows', at: span.at, count: span.count });
131
+ }
132
+ export function insertColumns(cmd, at, count = 1) {
133
+ const span = at === undefined ? spanOf(cmd, 'cols') : { at, count };
134
+ if (!span)
135
+ return false;
136
+ return run(cmd, { kind: 'insertCols', at: span.at, count: span.count });
137
+ }
138
+ export function deleteColumns(cmd, at, count = 1) {
139
+ const span = at === undefined ? spanOf(cmd, 'cols') : { at, count };
140
+ if (!span)
141
+ return false;
142
+ return run(cmd, { kind: 'deleteCols', at: span.at, count: span.count });
143
+ }
144
+ /**
145
+ * Which axis a bare Ctrl+Plus / Ctrl+Minus acts on.
146
+ *
147
+ * Excel opens a dialog when the selection is not a whole row or column. That
148
+ * dialog is a design decision, so this reports what it would ask about and
149
+ * lets the consumer decide: a selection spanning every column is a row
150
+ * operation, every row is a column operation, anything else is ambiguous.
151
+ */
152
+ export function axisForSelection(cmd) {
153
+ const rect = cmd.ranges[cmd.ranges.length - 1];
154
+ if (!rect)
155
+ return 'rows';
156
+ const [minRow, minCol, maxRow, maxCol] = rect;
157
+ const spansAllCols = minCol === 0 && maxCol >= cmd.colCount - 1;
158
+ const spansAllRows = minRow === 0 && maxRow >= cmd.rowCount - 1;
159
+ if (spansAllCols && !spansAllRows)
160
+ return 'rows';
161
+ if (spansAllRows && !spansAllCols)
162
+ return 'cols';
163
+ if (spansAllCols && spansAllRows)
164
+ return 'rows';
165
+ return 'ambiguous';
166
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The table styles gallery: Excel's presets, by the names Excel stores.
3
+ *
4
+ * A table's look is drawn rather than written into the cells, which is what
5
+ * lets a row typed under the last one arrive already banded. That drawing
6
+ * needs colours, and "the theme's accent" is one look rather than a gallery,
7
+ * so this is the set to pick from.
8
+ *
9
+ * The ids are Excel's own (`TableStyleMedium2`), and the colours are the
10
+ * Office theme's accents, so a table saved here opens in Excel wearing the
11
+ * same style rather than something approximate. A style is three tones of
12
+ * one accent: Light tints the header, Medium fills it, Dark fills it with a
13
+ * deeper shade, exactly as Excel's three families do.
14
+ */
15
+ export type TableStyleTone = 'light' | 'medium' | 'dark';
16
+ export type TableStyle = {
17
+ /** Excel's name for it, which is what goes in the file. */
18
+ id: string;
19
+ /** The colour's name, for the gallery. */
20
+ colour: string;
21
+ tone: TableStyleTone;
22
+ /** The Office theme accent it is built from. */
23
+ accent: string;
24
+ };
25
+ /**
26
+ * Eighteen styles: six accents in three tones. Excel numbers each family
27
+ * from 1, with 1 reserved for the black-and-white variant, so the accents
28
+ * start at 2 and this maps one for one onto the built-in names.
29
+ */
30
+ export declare const TABLE_STYLES: ReadonlyArray<TableStyle>;
31
+ /** What a table wears unless it is given something else: Excel's own default. */
32
+ export declare const DEFAULT_TABLE_STYLE = "TableStyleMedium2";
33
+ /** No style at all: the cells keep whatever formats they carry. */
34
+ export declare const NO_TABLE_STYLE = "None";
35
+ export declare function findTableStyle(id: string | undefined): TableStyle | undefined;
36
+ /**
37
+ * Black or white over a fill, whichever can be read.
38
+ *
39
+ * Excel paints a header's text white whatever the fill, which on its gold
40
+ * and sky accents is about 2:1: legible to some people, not to others, and
41
+ * flagged by every checker. Picking the readable one keeps Excel's colours
42
+ * and drops the part of Excel's behaviour that fails.
43
+ */
44
+ export declare function readableOn(fill: string): string;
45
+ /**
46
+ * The fill a filled header takes: the accent, darkened only when neither
47
+ * black nor white can be read on it.
48
+ *
49
+ * Mid grey is the one accent where that happens: white is 4.0 against it
50
+ * and near-black 4.3, so both sit under the 4.5 a checker asks for. A few
51
+ * steps darker keeps it recognisably the same grey and lets the white text
52
+ * clear it, which is a smaller lie than a header nobody can read.
53
+ */
54
+ export declare function headerFill(accent: string): string;
55
+ export type TableStyleColours = {
56
+ /** The header row's fill, and the colour its text needs to stay readable. */
57
+ header: string;
58
+ headerText: string;
59
+ /** Every other data row. */
60
+ band: string;
61
+ /** The totals row, and the line over it. */
62
+ totals: string;
63
+ border: string;
64
+ };
65
+ /**
66
+ * A style as CSS colours.
67
+ *
68
+ * `color-mix` rather than fixed hexes for the tints, so a table keeps its
69
+ * colour over a dark sheet as well as a light one: the accent is mixed with
70
+ * the surface underneath rather than painted over it.
71
+ */
72
+ export declare function tableStyleColours(style: TableStyle | string | undefined): TableStyleColours | null;
73
+ /** "Blue, Medium", for the gallery's tooltip and for a screen reader. */
74
+ export declare function tableStyleLabel(style: TableStyle): string;
@@ -0,0 +1,152 @@
1
+ /**
2
+ * The table styles gallery: Excel's presets, by the names Excel stores.
3
+ *
4
+ * A table's look is drawn rather than written into the cells, which is what
5
+ * lets a row typed under the last one arrive already banded. That drawing
6
+ * needs colours, and "the theme's accent" is one look rather than a gallery,
7
+ * so this is the set to pick from.
8
+ *
9
+ * The ids are Excel's own (`TableStyleMedium2`), and the colours are the
10
+ * Office theme's accents, so a table saved here opens in Excel wearing the
11
+ * same style rather than something approximate. A style is three tones of
12
+ * one accent: Light tints the header, Medium fills it, Dark fills it with a
13
+ * deeper shade, exactly as Excel's three families do.
14
+ */
15
+ /** The Office theme's six accents, in Excel's order. */
16
+ const ACCENTS = [
17
+ { name: 'Blue', hex: '#4472c4' },
18
+ { name: 'Orange', hex: '#ed7d31' },
19
+ { name: 'Grey', hex: '#7f7f7f' },
20
+ { name: 'Gold', hex: '#ffc000' },
21
+ { name: 'Sky', hex: '#5b9bd5' },
22
+ { name: 'Green', hex: '#70ad47' },
23
+ ];
24
+ const TONES = [
25
+ { tone: 'light', family: 'Light' },
26
+ { tone: 'medium', family: 'Medium' },
27
+ { tone: 'dark', family: 'Dark' },
28
+ ];
29
+ /**
30
+ * Eighteen styles: six accents in three tones. Excel numbers each family
31
+ * from 1, with 1 reserved for the black-and-white variant, so the accents
32
+ * start at 2 and this maps one for one onto the built-in names.
33
+ */
34
+ export const TABLE_STYLES = TONES.flatMap(({ tone, family }) => ACCENTS.map((accent, i) => ({
35
+ id: `TableStyle${family}${i + 2}`,
36
+ colour: accent.name,
37
+ tone,
38
+ accent: accent.hex,
39
+ })));
40
+ /** What a table wears unless it is given something else: Excel's own default. */
41
+ export const DEFAULT_TABLE_STYLE = 'TableStyleMedium2';
42
+ /** No style at all: the cells keep whatever formats they carry. */
43
+ export const NO_TABLE_STYLE = 'None';
44
+ export function findTableStyle(id) {
45
+ if (!id || id === NO_TABLE_STYLE)
46
+ return undefined;
47
+ return TABLE_STYLES.find((s) => s.id.toLowerCase() === id.toLowerCase());
48
+ }
49
+ /** A hex colour as its three channels, 0 to 255. */
50
+ function channels(hex) {
51
+ const value = hex.trim().replace('#', '');
52
+ const full = value.length === 3 ? value.split('').map((c) => c + c).join('') : value;
53
+ const n = Number.parseInt(full.slice(0, 6), 16);
54
+ return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
55
+ }
56
+ /** Relative luminance, the way WCAG defines it. */
57
+ function luminance(hex) {
58
+ const [r, g, b] = channels(hex).map((c) => {
59
+ const s = c / 255;
60
+ return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
61
+ });
62
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
63
+ }
64
+ function contrast(a, b) {
65
+ const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p);
66
+ return (x + 0.05) / (y + 0.05);
67
+ }
68
+ /**
69
+ * Black or white over a fill, whichever can be read.
70
+ *
71
+ * Excel paints a header's text white whatever the fill, which on its gold
72
+ * and sky accents is about 2:1: legible to some people, not to others, and
73
+ * flagged by every checker. Picking the readable one keeps Excel's colours
74
+ * and drops the part of Excel's behaviour that fails.
75
+ */
76
+ export function readableOn(fill) {
77
+ const dark = '#0f172a';
78
+ const light = '#ffffff';
79
+ return contrast(fill, light) >= contrast(fill, dark) ? light : dark;
80
+ }
81
+ /**
82
+ * The fill a filled header takes: the accent, darkened only when neither
83
+ * black nor white can be read on it.
84
+ *
85
+ * Mid grey is the one accent where that happens: white is 4.0 against it
86
+ * and near-black 4.3, so both sit under the 4.5 a checker asks for. A few
87
+ * steps darker keeps it recognisably the same grey and lets the white text
88
+ * clear it, which is a smaller lie than a header nobody can read.
89
+ */
90
+ export function headerFill(accent) {
91
+ const best = Math.max(contrast(accent, '#ffffff'), contrast(accent, '#0f172a'));
92
+ if (best >= 4.5)
93
+ return accent;
94
+ for (let percent = 92; percent >= 60; percent -= 8) {
95
+ const darker = mixWithBlack(accent, percent);
96
+ if (contrast(darker, '#ffffff') >= 4.5)
97
+ return darker;
98
+ }
99
+ return mixWithBlack(accent, 60);
100
+ }
101
+ /** The colour a mix of an accent with black comes out as, for the dark tone. */
102
+ function mixWithBlack(hex, percent) {
103
+ const mixed = channels(hex).map((c) => Math.round((c * percent) / 100));
104
+ return `#${mixed.map((c) => c.toString(16).padStart(2, '0')).join('')}`;
105
+ }
106
+ /**
107
+ * A style as CSS colours.
108
+ *
109
+ * `color-mix` rather than fixed hexes for the tints, so a table keeps its
110
+ * colour over a dark sheet as well as a light one: the accent is mixed with
111
+ * the surface underneath rather than painted over it.
112
+ */
113
+ export function tableStyleColours(style) {
114
+ const found = typeof style === 'string' || style === undefined ? findTableStyle(style) : style;
115
+ if (!found)
116
+ return null;
117
+ const accent = found.accent;
118
+ const mix = (percent, into = 'transparent') => `color-mix(in srgb, ${accent} ${percent}%, ${into})`;
119
+ if (found.tone === 'light') {
120
+ return {
121
+ header: mix(18),
122
+ headerText: 'inherit',
123
+ band: mix(8),
124
+ totals: mix(14),
125
+ border: mix(50),
126
+ };
127
+ }
128
+ if (found.tone === 'dark') {
129
+ return {
130
+ header: `color-mix(in srgb, ${accent} 65%, #000)`,
131
+ headerText: readableOn(mixWithBlack(accent, 65)),
132
+ band: mix(22),
133
+ totals: mix(30),
134
+ border: mix(70),
135
+ };
136
+ }
137
+ const fill = headerFill(accent);
138
+ return {
139
+ header: fill,
140
+ // White where white can be read, near-black where it cannot: Excel's
141
+ // gold and sky headers are about 2:1 against white.
142
+ headerText: readableOn(fill),
143
+ band: mix(13),
144
+ totals: mix(20),
145
+ border: mix(55),
146
+ };
147
+ }
148
+ /** "Blue, Medium", for the gallery's tooltip and for a screen reader. */
149
+ export function tableStyleLabel(style) {
150
+ const tone = style.tone === 'light' ? 'Light' : style.tone === 'dark' ? 'Dark' : 'Medium';
151
+ return `${style.colour}, ${tone}`;
152
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Tables: a named region with a header row, so a formula can say
3
+ * `Orders[Amount]` instead of `D2:D57` and keep meaning it after rows are
4
+ * added.
5
+ *
6
+ * The point is not shorter text. A1 references are positional, so a total
7
+ * under a table has to be re-pointed every time the table grows, and a
8
+ * reference typed against 57 rows silently stops covering row 58. A
9
+ * structured reference names the COLUMN, and the range it resolves to is
10
+ * whatever the table currently is.
11
+ *
12
+ * This module is the model; the grammar that reads `Orders[Amount]` lives in
13
+ * the tokenizer, and resolving one to a range happens at evaluation, because
14
+ * the range depends on the table's size at that moment rather than at parse
15
+ * time.
16
+ */
17
+ import type { StructuralEdit } from './refs.js';
18
+ export type TableRegion = {
19
+ name: string;
20
+ sheet: string;
21
+ /** Row of the header. The data starts on the next one. */
22
+ headerRow: number;
23
+ /** First and last column, inclusive. */
24
+ firstCol: number;
25
+ lastCol: number;
26
+ /** Last row of the DATA, not counting a totals row. */
27
+ lastRow: number;
28
+ /** Whether the row after `lastRow` is a totals row. */
29
+ hasTotals: boolean;
30
+ /**
31
+ * The look, by Excel's name for it (`TableStyleMedium2`), or `'None'` for
32
+ * cells that keep whatever formats they carry. Absent means the default,
33
+ * which is Excel's default too.
34
+ */
35
+ style?: string;
36
+ };
37
+ /** Which part of a table a structured reference asks for. */
38
+ export type TableSpecifier = '#All' | '#Data' | '#Headers' | '#Totals' | '#ThisRow';
39
+ export type TableRange = {
40
+ sheet: string;
41
+ firstRow: number;
42
+ lastRow: number;
43
+ firstCol: number;
44
+ lastCol: number;
45
+ };
46
+ export type TableRegistry = {
47
+ define(table: TableRegion): void;
48
+ remove(name: string): boolean;
49
+ get(name: string): TableRegion | undefined;
50
+ list(): TableRegion[];
51
+ /** The table containing a cell, if any. This is what makes an unqualified
52
+ * `[@Amount]` work: it only means something inside a table. */
53
+ at(sheet: string, row: number, col: number): TableRegion | undefined;
54
+ /** Grow a table to include a row written just below it, the way Excel's
55
+ * auto-expand does. Returns whether anything changed. */
56
+ growToInclude(sheet: string, row: number, col: number): boolean;
57
+ clear(): void;
58
+ };
59
+ /** Excel's rules for a table name are the same as for a defined name. */
60
+ export declare function isValidTableName(name: string): boolean;
61
+ export declare function createTableRegistry(initial?: ReadonlyArray<TableRegion>): TableRegistry;
62
+ /** Column index for a header name, or -1. Case-insensitive, as Excel is. */
63
+ export declare function columnIndexOf(table: TableRegion, header: string, headerAt: (sheet: string, row: number, col: number) => string): number;
64
+ /**
65
+ * Resolve a structured reference to a rectangle.
66
+ *
67
+ * `currentRow` is where the formula lives, which is the only way `[@Amount]`
68
+ * can mean anything: "this row" is relative to the formula, not the table.
69
+ * A `#ThisRow` reference from outside the table has no answer, so it returns
70
+ * null and the evaluator reports #VALUE!, which is what Excel does.
71
+ */
72
+ export declare function resolveTableRange(table: TableRegion, specifier: TableSpecifier, columns: {
73
+ from: number;
74
+ to: number;
75
+ } | null, currentRow: number | null): TableRange | null;
76
+ /** How many data rows a table holds. */
77
+ export declare function rowCountOf(table: TableRegion): number;
78
+ /**
79
+ * A table after an insert or delete on its own sheet: its header row, its
80
+ * columns and its last row move with the cells. Null when the edit took the
81
+ * header row, or every column, which is what deleting a table looks like.
82
+ *
83
+ * A totals row sits on `lastRow + 1`, so it moves with the rest; an insert
84
+ * INSIDE the table grows it, which is what Excel does when a row is added
85
+ * in the middle of one.
86
+ */
87
+ export declare function shiftTable(table: TableRegion, sheet: string, edit: StructuralEdit): TableRegion | null;
88
+ /** Every table after an edit, the gone ones dropped. */
89
+ export declare function shiftTables(tables: ReadonlyArray<TableRegion>, sheet: string, edit: StructuralEdit): TableRegion[];
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Tables: a named region with a header row, so a formula can say
3
+ * `Orders[Amount]` instead of `D2:D57` and keep meaning it after rows are
4
+ * added.
5
+ *
6
+ * The point is not shorter text. A1 references are positional, so a total
7
+ * under a table has to be re-pointed every time the table grows, and a
8
+ * reference typed against 57 rows silently stops covering row 58. A
9
+ * structured reference names the COLUMN, and the range it resolves to is
10
+ * whatever the table currently is.
11
+ *
12
+ * This module is the model; the grammar that reads `Orders[Amount]` lives in
13
+ * the tokenizer, and resolving one to a range happens at evaluation, because
14
+ * the range depends on the table's size at that moment rather than at parse
15
+ * time.
16
+ */
17
+ import { shiftRect } from './rects.js';
18
+ /** Excel's rules for a table name are the same as for a defined name. */
19
+ export function isValidTableName(name) {
20
+ if (!/^[A-Za-z_][A-Za-z0-9_.]*$/.test(name))
21
+ return false;
22
+ if (name.length > 255)
23
+ return false;
24
+ if (/^\$?[A-Za-z]{1,3}\$?\d+$/.test(name))
25
+ return false;
26
+ if (/^[RC]$/i.test(name))
27
+ return false;
28
+ return true;
29
+ }
30
+ export function createTableRegistry(initial = []) {
31
+ const byName = new Map();
32
+ const registry = {
33
+ define(table) {
34
+ if (!isValidTableName(table.name)) {
35
+ throw new Error(`"${table.name}" is not a valid table name`);
36
+ }
37
+ byName.set(table.name.toLowerCase(), { ...table });
38
+ },
39
+ remove(name) {
40
+ return byName.delete(name.toLowerCase());
41
+ },
42
+ get(name) {
43
+ return byName.get(name.toLowerCase());
44
+ },
45
+ list() {
46
+ return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
47
+ },
48
+ at(sheet, row, col) {
49
+ for (const table of byName.values()) {
50
+ if (table.sheet !== sheet)
51
+ continue;
52
+ if (col < table.firstCol || col > table.lastCol)
53
+ continue;
54
+ const bottom = table.hasTotals ? table.lastRow + 1 : table.lastRow;
55
+ if (row < table.headerRow || row > bottom)
56
+ continue;
57
+ return table;
58
+ }
59
+ return undefined;
60
+ },
61
+ growToInclude(sheet, row, col) {
62
+ for (const table of byName.values()) {
63
+ if (table.sheet !== sheet)
64
+ continue;
65
+ if (col < table.firstCol || col > table.lastCol)
66
+ continue;
67
+ // Only the row immediately after the data extends it. A write five
68
+ // rows below is a separate thing the user put there, and swallowing
69
+ // it would be worse than not expanding.
70
+ if (row !== table.lastRow + 1)
71
+ continue;
72
+ // A totals row occupies that slot already; Excel inserts above it,
73
+ // which is a structural edit rather than a grow.
74
+ if (table.hasTotals)
75
+ continue;
76
+ table.lastRow = row;
77
+ return true;
78
+ }
79
+ return false;
80
+ },
81
+ clear() {
82
+ byName.clear();
83
+ },
84
+ };
85
+ for (const table of initial)
86
+ registry.define(table);
87
+ return registry;
88
+ }
89
+ /** Column index for a header name, or -1. Case-insensitive, as Excel is. */
90
+ export function columnIndexOf(table, header, headerAt) {
91
+ const wanted = header.trim().toLowerCase();
92
+ for (let c = table.firstCol; c <= table.lastCol; c += 1) {
93
+ if (headerAt(table.sheet, table.headerRow, c).trim().toLowerCase() === wanted)
94
+ return c;
95
+ }
96
+ return -1;
97
+ }
98
+ /**
99
+ * Resolve a structured reference to a rectangle.
100
+ *
101
+ * `currentRow` is where the formula lives, which is the only way `[@Amount]`
102
+ * can mean anything: "this row" is relative to the formula, not the table.
103
+ * A `#ThisRow` reference from outside the table has no answer, so it returns
104
+ * null and the evaluator reports #VALUE!, which is what Excel does.
105
+ */
106
+ export function resolveTableRange(table, specifier, columns, currentRow) {
107
+ const firstCol = columns ? columns.from : table.firstCol;
108
+ const lastCol = columns ? columns.to : table.lastCol;
109
+ if (firstCol < 0 || lastCol < 0)
110
+ return null;
111
+ const totalsRow = table.hasTotals ? table.lastRow + 1 : null;
112
+ switch (specifier) {
113
+ case '#Headers':
114
+ return { sheet: table.sheet, firstRow: table.headerRow, lastRow: table.headerRow, firstCol, lastCol };
115
+ case '#Totals':
116
+ return totalsRow === null
117
+ ? null
118
+ : { sheet: table.sheet, firstRow: totalsRow, lastRow: totalsRow, firstCol, lastCol };
119
+ case '#All':
120
+ return {
121
+ sheet: table.sheet,
122
+ firstRow: table.headerRow,
123
+ lastRow: totalsRow ?? table.lastRow,
124
+ firstCol, lastCol,
125
+ };
126
+ case '#ThisRow': {
127
+ if (currentRow === null)
128
+ return null;
129
+ // Outside the table's data rows, "this row" is meaningless.
130
+ if (currentRow <= table.headerRow || currentRow > table.lastRow)
131
+ return null;
132
+ return { sheet: table.sheet, firstRow: currentRow, lastRow: currentRow, firstCol, lastCol };
133
+ }
134
+ case '#Data':
135
+ default: {
136
+ const firstRow = table.headerRow + 1;
137
+ // An empty table has no data rows. Returning the header row instead
138
+ // would make =SUM(Orders[Amount]) add the word "Amount".
139
+ if (firstRow > table.lastRow)
140
+ return null;
141
+ return { sheet: table.sheet, firstRow, lastRow: table.lastRow, firstCol, lastCol };
142
+ }
143
+ }
144
+ }
145
+ /** How many data rows a table holds. */
146
+ export function rowCountOf(table) {
147
+ return Math.max(0, table.lastRow - table.headerRow);
148
+ }
149
+ /**
150
+ * A table after an insert or delete on its own sheet: its header row, its
151
+ * columns and its last row move with the cells. Null when the edit took the
152
+ * header row, or every column, which is what deleting a table looks like.
153
+ *
154
+ * A totals row sits on `lastRow + 1`, so it moves with the rest; an insert
155
+ * INSIDE the table grows it, which is what Excel does when a row is added
156
+ * in the middle of one.
157
+ */
158
+ export function shiftTable(table, sheet, edit) {
159
+ if (table.sheet.toLowerCase() !== sheet.toLowerCase())
160
+ return table;
161
+ const rows = edit.kind === 'insertRows' || edit.kind === 'deleteRows';
162
+ const rect = rows
163
+ ? [table.headerRow, table.firstCol, table.lastRow + (table.hasTotals ? 1 : 0), table.lastCol]
164
+ : [table.headerRow, table.firstCol, table.lastRow + (table.hasTotals ? 1 : 0), table.lastCol];
165
+ const moved = shiftRect(rect, edit);
166
+ if (!moved)
167
+ return null;
168
+ const [r1, c1, r2, c2] = moved;
169
+ // A table with no data rows left is gone, as is one whose header went.
170
+ const lastRow = r2 - (table.hasTotals ? 1 : 0);
171
+ if (lastRow < r1 + 1)
172
+ return null;
173
+ return { ...table, headerRow: r1, firstCol: c1, lastCol: c2, lastRow };
174
+ }
175
+ /** Every table after an edit, the gone ones dropped. */
176
+ export function shiftTables(tables, sheet, edit) {
177
+ return tables.map((t) => shiftTable(t, sheet, edit)).filter((t) => t !== null);
178
+ }