@svgrid/enterprise 3.0.2 → 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 (364) 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 +94 -20
  10. package/dist/SvFormulaBar.svelte.d.ts +7 -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 +198 -40
  18. package/dist/SvPivotDesigner.svelte.d.ts +27 -20
  19. package/dist/SvSheet.svelte +4043 -243
  20. package/dist/SvSheet.svelte.d.ts +76 -3
  21. package/dist/SvSheetChartSetup.svelte +151 -0
  22. package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
  23. package/dist/SvSheetComment.svelte +216 -31
  24. package/dist/SvSheetComment.svelte.d.ts +11 -11
  25. package/dist/SvSheetConditionalFormat.svelte +28 -31
  26. package/dist/SvSheetDataValidation.svelte +66 -42
  27. package/dist/SvSheetEditRanges.svelte +217 -0
  28. package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
  29. package/dist/SvSheetErrors.svelte +125 -0
  30. package/dist/SvSheetErrors.svelte.d.ts +20 -0
  31. package/dist/SvSheetEvaluate.svelte +133 -0
  32. package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
  33. package/dist/SvSheetFilterMenu.svelte +137 -34
  34. package/dist/SvSheetFilterMenu.svelte.d.ts +5 -0
  35. package/dist/SvSheetFindReplace.svelte +19 -19
  36. package/dist/SvSheetFormatCells.svelte +125 -81
  37. package/dist/SvSheetGoalSeek.svelte +17 -16
  38. package/dist/SvSheetInsertFunction.svelte +15 -13
  39. package/dist/SvSheetIteration.svelte +81 -0
  40. package/dist/SvSheetIteration.svelte.d.ts +10 -0
  41. package/dist/SvSheetLink.svelte +99 -0
  42. package/dist/SvSheetLink.svelte.d.ts +17 -0
  43. package/dist/SvSheetListPicker.svelte +4 -2
  44. package/dist/SvSheetListPicker.svelte.d.ts +0 -6
  45. package/dist/SvSheetManageRules.svelte +20 -18
  46. package/dist/SvSheetNameManager.svelte +17 -15
  47. package/dist/SvSheetPageSetup.svelte +159 -0
  48. package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
  49. package/dist/SvSheetPasteSpecial.svelte +22 -20
  50. package/dist/SvSheetPivot.svelte +220 -0
  51. package/dist/SvSheetPivot.svelte.d.ts +21 -0
  52. package/dist/SvSheetProtectSheet.svelte +81 -0
  53. package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
  54. package/dist/SvSheetRemoveDuplicates.svelte +13 -10
  55. package/dist/SvSheetRibbon.svelte +104 -51
  56. package/dist/SvSheetSizeDialog.svelte +4 -2
  57. package/dist/SvSheetSort.svelte +218 -0
  58. package/dist/SvSheetSort.svelte.d.ts +28 -0
  59. package/dist/SvSheetSparklines.svelte +135 -0
  60. package/dist/SvSheetSparklines.svelte.d.ts +14 -0
  61. package/dist/SvSheetTable.svelte +160 -0
  62. package/dist/SvSheetTable.svelte.d.ts +24 -0
  63. package/dist/SvSheetTabs.svelte +161 -31
  64. package/dist/SvSheetTabs.svelte.d.ts +22 -8
  65. package/dist/SvSheetTextToColumns.svelte +20 -20
  66. package/dist/SvSheetValidationAlert.svelte +8 -6
  67. package/dist/advanced-filter-enable.js +1 -1
  68. package/dist/alerts/alert-engine.d.ts +6 -0
  69. package/dist/alerts/alert-engine.js +21 -4
  70. package/dist/alerts/alert-formats.js +2 -0
  71. package/dist/alerts/alert-types.d.ts +1 -1
  72. package/dist/alerts.d.ts +1 -1
  73. package/dist/alerts.js +2 -2
  74. package/dist/board.js +2 -2
  75. package/dist/bulk-edit.d.ts +3 -1
  76. package/dist/bulk-edit.js +1 -1
  77. package/dist/cdn/svgrid-enterprise.svelte-external.js +39827 -16429
  78. package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
  79. package/dist/designer/assets/{SvChartMenu-D9hEeHar.js → SvChartMenu-BDoeqGz6.js} +1 -1
  80. package/dist/designer/assets/{SvDateTimePicker-DARvKUL2.js → SvDateTimePicker-DCPg7WGN.js} +1 -1
  81. package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
  82. package/dist/designer/assets/{SvGridChart-B8j1SSy3.js → SvGridChart-Cy1ATrWh.js} +2 -2
  83. package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
  84. package/dist/designer/assets/{SvGridChartPanel-pT6ITc2P.js → SvGridChartPanel-CATdVc9X.js} +3 -3
  85. package/dist/designer/assets/{SvGridChartView-bg281UA1.js → SvGridChartView-CmsZtCED.js} +1 -1
  86. package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
  87. package/dist/designer/assets/{SvTabs-UFCMTHXS.js → SvTabs-2mHC6oaz.js} +1 -1
  88. package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
  89. package/dist/designer/assets/{chart-cIPUsbM5.js → chart-Cn7MnNqA.js} +1 -1
  90. package/dist/designer/assets/{chart-panel-messages-DtTxpBUU.js → chart-panel-messages-Dz7PTIqT.js} +1 -1
  91. package/dist/designer/assets/{chart-summary-Czu_5epb.js → chart-summary-BD1qYB2R.js} +1 -1
  92. package/dist/designer/assets/{chart-trend-D5I5VEe8.js → chart-trend-B8xr5LuD.js} +1 -1
  93. package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
  94. package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
  95. package/dist/designer/assets/{focus-trap-CAreAhlU.js → focus-trap-V2-6Fy9I.js} +1 -1
  96. package/dist/designer/assets/{index-DwU7CAMm.js → index-D5bVbuzI.js} +317 -315
  97. package/dist/designer/assets/index-_JVFxt02.css +1 -0
  98. package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
  99. package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
  100. package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
  101. package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
  102. package/dist/designer/index.html +17 -16
  103. package/dist/export-pdf.d.ts +75 -0
  104. package/dist/export-pdf.js +216 -15
  105. package/dist/export.js +10 -2
  106. package/dist/gantt/SvGridGantt.svelte +2890 -0
  107. package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
  108. package/dist/gantt/gantt-config.d.ts +73 -0
  109. package/dist/gantt/gantt-config.js +1 -0
  110. package/dist/gantt/gantt-critical-path.d.ts +67 -0
  111. package/dist/gantt/gantt-critical-path.js +207 -0
  112. package/dist/gantt/gantt-model.d.ts +257 -0
  113. package/dist/gantt/gantt-model.js +651 -0
  114. package/dist/gantt/gantt-resources.d.ts +59 -0
  115. package/dist/gantt/gantt-resources.js +71 -0
  116. package/dist/gantt/gantt.d.ts +7 -0
  117. package/dist/gantt/gantt.js +36 -0
  118. package/dist/gantt/index.d.ts +15 -0
  119. package/dist/gantt/index.js +22 -0
  120. package/dist/gantt/timeline-arrows.d.ts +102 -0
  121. package/dist/gantt/timeline-arrows.js +181 -0
  122. package/dist/import.d.ts +2 -2
  123. package/dist/import.js +1 -1
  124. package/dist/index.d.ts +34 -7
  125. package/dist/index.js +44 -7
  126. package/dist/install.js +8 -1
  127. package/dist/license-core.d.ts +17 -1
  128. package/dist/license-core.js +16 -5
  129. package/dist/license.d.ts +18 -2
  130. package/dist/license.js +71 -6
  131. package/dist/node/studio.js +140 -8
  132. package/dist/pivot-enable.js +2 -2
  133. package/dist/scheduler-dependencies.d.ts +35 -0
  134. package/dist/scheduler-dependencies.js +36 -1
  135. package/dist/scheduler.js +2 -2
  136. package/dist/selection-bar.js +2 -2
  137. package/dist/server/SvGroupCell.svelte +213 -0
  138. package/dist/server/SvGroupCell.svelte.d.ts +62 -0
  139. package/dist/server/SvRowGroupPanel.svelte +322 -0
  140. package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
  141. package/dist/server/enable.d.ts +17 -0
  142. package/dist/server/enable.js +49 -0
  143. package/dist/server/index.d.ts +22 -0
  144. package/dist/server/index.js +24 -0
  145. package/dist/server/messages.d.ts +45 -0
  146. package/dist/server/messages.js +35 -0
  147. package/dist/server/server-group-model.d.ts +104 -0
  148. package/dist/server/server-group-model.js +272 -0
  149. package/dist/server/server-pivot.d.ts +46 -0
  150. package/dist/server/server-pivot.js +57 -0
  151. package/dist/server/server-row-model.d.ts +547 -0
  152. package/dist/server/server-row-model.js +1551 -0
  153. package/dist/server/server-selection.d.ts +99 -0
  154. package/dist/server/server-selection.js +215 -0
  155. package/dist/server/svgrid-adapter.d.ts +155 -0
  156. package/dist/server/svgrid-adapter.js +202 -0
  157. package/dist/sheet/ast.d.ts +45 -1
  158. package/dist/sheet/ast.js +14 -0
  159. package/dist/sheet/auto-filter.d.ts +58 -4
  160. package/dist/sheet/auto-filter.js +159 -11
  161. package/dist/sheet/autocomplete.d.ts +9 -0
  162. package/dist/sheet/autocomplete.js +90 -4
  163. package/dist/sheet/cell-images.d.ts +39 -0
  164. package/dist/sheet/cell-images.js +90 -0
  165. package/dist/sheet/cell-types.d.ts +58 -0
  166. package/dist/sheet/cell-types.js +96 -0
  167. package/dist/sheet/coerce.d.ts +40 -0
  168. package/dist/sheet/coerce.js +170 -3
  169. package/dist/sheet/comments.d.ts +43 -9
  170. package/dist/sheet/comments.js +85 -27
  171. package/dist/sheet/conditional-formats.d.ts +29 -6
  172. package/dist/sheet/conditional-formats.js +37 -12
  173. package/dist/sheet/csv.d.ts +32 -0
  174. package/dist/sheet/csv.js +158 -0
  175. package/dist/sheet/culture.d.ts +87 -0
  176. package/dist/sheet/culture.js +247 -0
  177. package/dist/sheet/delta.d.ts +102 -0
  178. package/dist/sheet/delta.js +203 -0
  179. package/dist/sheet/deps.d.ts +45 -1
  180. package/dist/sheet/deps.js +77 -2
  181. package/dist/sheet/document.d.ts +106 -4
  182. package/dist/sheet/document.js +204 -3
  183. package/dist/sheet/engine.d.ts +67 -0
  184. package/dist/sheet/engine.js +19 -0
  185. package/dist/sheet/entry.d.ts +8 -4
  186. package/dist/sheet/entry.js +171 -21
  187. package/dist/sheet/error-check.d.ts +49 -0
  188. package/dist/sheet/error-check.js +83 -0
  189. package/dist/sheet/evaluate-steps.d.ts +48 -0
  190. package/dist/sheet/evaluate-steps.js +196 -0
  191. package/dist/sheet/evaluate.d.ts +67 -0
  192. package/dist/sheet/evaluate.js +725 -13
  193. package/dist/sheet/filter-files.d.ts +37 -0
  194. package/dist/sheet/filter-files.js +465 -0
  195. package/dist/sheet/format-store.d.ts +15 -0
  196. package/dist/sheet/format-store.js +11 -1
  197. package/dist/sheet/from-rows.d.ts +14 -0
  198. package/dist/sheet/from-rows.js +50 -0
  199. package/dist/sheet/function-catalog.d.ts +1 -1
  200. package/dist/sheet/function-catalog.js +296 -5
  201. package/dist/sheet/functions.js +363 -91
  202. package/dist/sheet/index.d.ts +35 -8
  203. package/dist/sheet/index.js +35 -8
  204. package/dist/sheet/links.d.ts +57 -0
  205. package/dist/sheet/links.js +174 -0
  206. package/dist/sheet/messages.d.ts +778 -0
  207. package/dist/sheet/messages.js +806 -0
  208. package/dist/sheet/number-format.d.ts +52 -5
  209. package/dist/sheet/number-format.js +465 -68
  210. package/dist/sheet/objects.d.ts +106 -0
  211. package/dist/sheet/objects.js +149 -0
  212. package/dist/sheet/ods-document.d.ts +44 -0
  213. package/dist/sheet/ods-document.js +1275 -0
  214. package/dist/sheet/open-file.d.ts +26 -0
  215. package/dist/sheet/open-file.js +56 -0
  216. package/dist/sheet/outline.d.ts +82 -0
  217. package/dist/sheet/outline.js +228 -0
  218. package/dist/sheet/packs/array.d.ts +16 -0
  219. package/dist/sheet/packs/array.js +172 -0
  220. package/dist/sheet/packs/database.d.ts +42 -0
  221. package/dist/sheet/packs/database.js +142 -0
  222. package/dist/sheet/packs/engineering.d.ts +2 -0
  223. package/dist/sheet/packs/engineering.js +296 -0
  224. package/dist/sheet/packs/financial.d.ts +5 -0
  225. package/dist/sheet/packs/financial.js +220 -0
  226. package/dist/sheet/packs/math-stats.d.ts +2 -0
  227. package/dist/sheet/packs/math-stats.js +372 -0
  228. package/dist/sheet/packs/special.d.ts +44 -0
  229. package/dist/sheet/packs/special.js +187 -0
  230. package/dist/sheet/packs/stats-dist.d.ts +2 -0
  231. package/dist/sheet/packs/stats-dist.js +785 -0
  232. package/dist/sheet/packs/text-date.d.ts +2 -0
  233. package/dist/sheet/packs/text-date.js +332 -0
  234. package/dist/sheet/packs/trig.d.ts +2 -0
  235. package/dist/sheet/packs/trig.js +73 -0
  236. package/dist/sheet/page-setup.d.ts +73 -0
  237. package/dist/sheet/page-setup.js +73 -0
  238. package/dist/sheet/parse.js +42 -10
  239. package/dist/sheet/paste-special.d.ts +22 -0
  240. package/dist/sheet/paste-special.js +14 -5
  241. package/dist/sheet/pivot-range.d.ts +160 -0
  242. package/dist/sheet/pivot-range.js +333 -0
  243. package/dist/sheet/presence.d.ts +73 -0
  244. package/dist/sheet/presence.js +79 -0
  245. package/dist/sheet/print.d.ts +104 -0
  246. package/dist/sheet/print.js +169 -0
  247. package/dist/sheet/protection.d.ts +55 -1
  248. package/dist/sheet/protection.js +55 -2
  249. package/dist/sheet/rects.d.ts +1 -1
  250. package/dist/sheet/refs.d.ts +48 -0
  251. package/dist/sheet/refs.js +155 -8
  252. package/dist/sheet/ribbon-icons.d.ts +1 -1
  253. package/dist/sheet/ribbon-icons.js +186 -0
  254. package/dist/sheet/ribbon.d.ts +1 -1
  255. package/dist/sheet/ribbon.js +324 -23
  256. package/dist/sheet/sheet-kinds.d.ts +74 -0
  257. package/dist/sheet/sheet-kinds.js +91 -0
  258. package/dist/sheet/shortcuts.d.ts +13 -3
  259. package/dist/sheet/shortcuts.js +63 -12
  260. package/dist/sheet/sort.d.ts +51 -0
  261. package/dist/sheet/sort.js +107 -0
  262. package/dist/sheet/sparklines.d.ts +111 -0
  263. package/dist/sheet/sparklines.js +204 -0
  264. package/dist/sheet/table-styles.d.ts +74 -0
  265. package/dist/sheet/table-styles.js +152 -0
  266. package/dist/sheet/tables.d.ts +19 -0
  267. package/dist/sheet/tables.js +31 -0
  268. package/dist/sheet/tokenize.d.ts +18 -1
  269. package/dist/sheet/tokenize.js +60 -9
  270. package/dist/sheet/validation.d.ts +16 -0
  271. package/dist/sheet/validation.js +37 -0
  272. package/dist/sheet/workbook.d.ts +148 -3
  273. package/dist/sheet/workbook.js +742 -31
  274. package/dist/sheet/xls-cfb.d.ts +32 -0
  275. package/dist/sheet/xls-cfb.js +290 -0
  276. package/dist/sheet/xls-document.d.ts +10 -0
  277. package/dist/sheet/xls-document.js +1243 -0
  278. package/dist/sheet/xls-formula.d.ts +40 -0
  279. package/dist/sheet/xls-formula.js +569 -0
  280. package/dist/sheet/xlsx-document.d.ts +108 -0
  281. package/dist/sheet/xlsx-document.js +1849 -0
  282. package/dist/sheet/xlsx-drawing.d.ts +99 -0
  283. package/dist/sheet/xlsx-drawing.js +420 -0
  284. package/dist/sheet-enable.js +6 -7
  285. package/dist/sheet-text.d.ts +7 -0
  286. package/dist/sheet-text.js +29 -0
  287. package/dist/sources/auth-supabase.js +2 -2
  288. package/dist/sources/realtime-supabase.js +2 -2
  289. package/dist/sources/rest.d.ts +6 -2
  290. package/dist/sources/rest.js +42 -7
  291. package/dist/sources/supabase.d.ts +10 -1
  292. package/dist/sources/supabase.js +73 -40
  293. package/dist/studio/emit-project.js +14 -1
  294. package/dist/studio/index.js +1 -1
  295. package/dist/studio/project.d.ts +11 -2
  296. package/dist/studio/project.js +5 -2
  297. package/dist/studio/ui-components.generated.js +107 -2
  298. package/dist/sveltekit/in-memory.d.ts +2 -2
  299. package/dist/sveltekit/in-memory.js +125 -4
  300. package/dist/sveltekit/index.d.ts +1 -1
  301. package/dist/sveltekit/index.js +1 -1
  302. package/dist/sveltekit/query-plan.d.ts +50 -4
  303. package/dist/sveltekit/query-plan.js +25 -3
  304. package/dist/sveltekit/sql-source.d.ts +6 -0
  305. package/dist/sveltekit/sql-source.js +34 -6
  306. package/dist/sveltekit/sql.d.ts +31 -0
  307. package/dist/sveltekit/sql.js +135 -25
  308. package/dist/sveltekit/transport.d.ts +10 -2
  309. package/dist/sveltekit/transport.js +30 -6
  310. package/dist/upgrade-prompt.d.ts +1 -1
  311. package/dist/version.d.ts +1 -1
  312. package/dist/version.js +1 -1
  313. package/dist/watermark.js +35 -2
  314. package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
  315. package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
  316. package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
  317. package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
  318. package/dist/wc/SvField-B_kurx_P.js +149 -0
  319. package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
  320. package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
  321. package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
  322. package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
  323. package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
  324. package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
  325. package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
  326. package/dist/wc/SvModal-DrfOYYyX.js +189 -0
  327. package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
  328. package/dist/wc/chart-6OXlybVT.js +4341 -0
  329. package/dist/wc/chart-export-CeSADGfi.js +135 -0
  330. package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
  331. package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
  332. package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
  333. package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
  334. package/dist/wc/client-DQIzjDBG.js +3064 -0
  335. package/dist/wc/column-resize-DUPgynvc.js +101 -0
  336. package/dist/wc/date-format-DS-z_h9v.js +1130 -0
  337. package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
  338. package/dist/wc/editor-contract-peBDxir_.js +22 -0
  339. package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
  340. package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
  341. package/dist/wc/list-option-DrRyivWp.js +82 -0
  342. package/dist/wc/popover-WsGlvtQv.js +69 -0
  343. package/dist/wc/positioning-BiKLfu1E.js +112 -0
  344. package/dist/wc/react.d.ts +41 -0
  345. package/dist/wc/react.js +90 -0
  346. package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
  347. package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
  348. package/dist/wc/row-resize-limG_N1z.js +111 -0
  349. package/dist/wc/sv-sheet-element.d.ts +97 -0
  350. package/dist/wc/sv-sheet-element.js +44213 -0
  351. package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
  352. package/dist/wc/validate-BqDthkNr.js +88 -0
  353. package/dist/wc/vue.d.ts +31 -0
  354. package/dist/wc/vue.js +75 -0
  355. package/package.json +30 -5
  356. package/dist/designer/assets/GridMenus-BlsvL_aU.js +0 -8
  357. package/dist/designer/assets/SvGridCellEditor-C7uQXYds.js +0 -4
  358. package/dist/designer/assets/SvGridChartBuilder-kvyIU_Rl.js +0 -1
  359. package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
  360. package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
  361. package/dist/designer/assets/index-CMFgAoVV.css +0 -1
  362. package/dist/designer/assets/row-resize-DLktcqUK.js +0 -1
  363. package/dist/designer/assets/src-EdI3Xqds.js +0 -58
  364. package/dist/designer/assets/validate-h-aslRV9.js +0 -1
@@ -16,7 +16,7 @@
16
16
  * Stop If True stops the rules below it for the cells it matches.
17
17
  */
18
18
  import { type CellValue } from './ast.js';
19
- import type { StructuralEdit } from './refs.js';
19
+ import { type StructuralEdit } from './refs.js';
20
20
  import { type Rect } from './rects.js';
21
21
  import type { CellFormatEntry } from './format-store.js';
22
22
  export type CfStyle = Pick<CellFormatEntry, 'fill' | 'color' | 'bold' | 'italic' | 'underline' | 'strike' | 'numFmt'>;
@@ -53,9 +53,20 @@ export type CfRule = {
53
53
  kind: 'average';
54
54
  above: boolean;
55
55
  style: CfStyle;
56
- } | {
56
+ }
57
+ /** Excel's "Use a formula to determine which cells to format": written
58
+ * for the rule's top-left cell and moved to each cell, TRUE formats. */
59
+ | {
60
+ kind: 'formula';
61
+ formula: string;
62
+ style: CfStyle;
63
+ }
64
+ /** `negativeColor` paints the bars left of the axis; without it a range
65
+ * with negatives still draws them, in Excel's red. */
66
+ | {
57
67
  kind: 'dataBar';
58
68
  color: string;
69
+ negativeColor?: string;
59
70
  } | {
60
71
  kind: 'colorScale';
61
72
  colors: CfScaleColors;
@@ -75,7 +86,7 @@ export type CfRuleBody = DistributiveOmit<CfRule, 'id' | 'rects'>;
75
86
  /** A styled rule without its id and rectangles: what the dialog hands back. */
76
87
  export type CfBody = DistributiveOmit<CfStyledRule, 'id' | 'rects'>;
77
88
  /** The small dialogs, one per ribbon entry. */
78
- export type CfPreset = 'greater' | 'less' | 'between' | 'equal' | 'text' | 'duplicates' | 'top10' | 'bottom10' | 'aboveAverage' | 'belowAverage';
89
+ export type CfPreset = 'greater' | 'less' | 'between' | 'equal' | 'text' | 'duplicates' | 'top10' | 'bottom10' | 'aboveAverage' | 'belowAverage' | 'formula';
79
90
  /** What one rule knows about the numbers in its rectangles. */
80
91
  export type CfStats = {
81
92
  /** Numbers, sorted ascending. */
@@ -89,10 +100,16 @@ export type CfStats = {
89
100
  /** What the rules say about one cell. */
90
101
  export type CfResult = {
91
102
  style?: CfStyle;
92
- /** A bar across the cell, 0..1 of its width. */
103
+ /**
104
+ * A bar across the cell: `ratio` of its width, starting `axis` of the
105
+ * way across (0 when the range has no negatives) and running right for a
106
+ * positive value, left for a negative one, which `negative` says.
107
+ */
93
108
  dataBar?: {
94
109
  ratio: number;
95
110
  color: string;
111
+ axis: number;
112
+ negative: boolean;
96
113
  };
97
114
  /** The icon set and which of its three icons: 0 = the top one. */
98
115
  icon?: {
@@ -102,8 +119,12 @@ export type CfResult = {
102
119
  };
103
120
  /** How a rule reads the sheet: the shell wires the workbook in. */
104
121
  export type CfContext = {
105
- /** A formula or a literal, evaluated in the sheet. */
106
- evaluate(text: string): CellValue;
122
+ /** A formula or a literal, evaluated in the sheet; `at` is the cell a
123
+ * formula rule is being read for, so ROW() and COLUMN() work in it. */
124
+ evaluate(text: string, at?: {
125
+ row: number;
126
+ col: number;
127
+ }): CellValue;
107
128
  };
108
129
  /** The six "with" styles of Excel's Highlight Cells dialogs. */
109
130
  export declare const CF_PRESET_STYLES: ReadonlyArray<{
@@ -112,6 +133,8 @@ export declare const CF_PRESET_STYLES: ReadonlyArray<{
112
133
  style: CfStyle;
113
134
  }>;
114
135
  export declare const DATA_BAR_COLOR = "#638EC6";
136
+ /** Excel's colour for the bars left of the axis. */
137
+ export declare const DATA_BAR_NEGATIVE_COLOR = "#FF0000";
115
138
  export declare const COLOR_SCALES: Record<'green-yellow-red' | 'red-yellow-green' | 'green-white' | 'white-red', CfScaleColors>;
116
139
  export declare function cfId(): string;
117
140
  /**
@@ -17,6 +17,7 @@
17
17
  */
18
18
  import { isError } from './ast.js';
19
19
  import { toText } from './coerce.js';
20
+ import { translateFormula } from './refs.js';
20
21
  import { rectContains, shiftRects, subtractRect, rectsIntersect } from './rects.js';
21
22
  // ---------------------------------------------------------------------------
22
23
  // Excel's palettes
@@ -30,6 +31,8 @@ export const CF_PRESET_STYLES = [
30
31
  { id: 'red-text', label: 'Red Text', style: { color: '#9C0006' } },
31
32
  ];
32
33
  export const DATA_BAR_COLOR = '#638EC6';
34
+ /** Excel's colour for the bars left of the axis. */
35
+ export const DATA_BAR_NEGATIVE_COLOR = '#FF0000';
33
36
  export const COLOR_SCALES = {
34
37
  'green-yellow-red': ['#63BE7B', '#FFEB84', '#F8696B'],
35
38
  'red-yellow-green': ['#F8696B', '#FFEB84', '#63BE7B'],
@@ -109,7 +112,7 @@ function cellIs(value, operator, a, b) {
109
112
  }
110
113
  }
111
114
  /** Whether a styling rule matches the cell. */
112
- function matches(rule, value, display, stats, ctx) {
115
+ function matches(rule, value, display, stats, ctx, at) {
113
116
  switch (rule.kind) {
114
117
  case 'cellIs': {
115
118
  const isEquality = rule.operator === 'equal' || rule.operator === 'notEqual';
@@ -166,22 +169,43 @@ function matches(rule, value, display, stats, ctx) {
166
169
  return false;
167
170
  return rule.above ? value > stats.mean : value < stats.mean;
168
171
  }
172
+ case 'formula': {
173
+ // Written for the rule's top-left cell and moved to the cell being
174
+ // painted, as a copied formula would be: =$B2>100 on A2:A9 reads
175
+ // each row's B. TRUE, or a number other than 0, formats.
176
+ const text = rule.formula.trim();
177
+ if (!text)
178
+ return false;
179
+ const origin = rule.rects[0];
180
+ const source = text.startsWith('=') ? text : `=${text}`;
181
+ const moved = origin && at ? String(translateFormula(source, at.row - origin[0], at.col - origin[1])) : source;
182
+ const v = ctx.evaluate(moved, at);
183
+ if (isError(v))
184
+ return false;
185
+ return typeof v === 'boolean' ? v : typeof v === 'number' ? v !== 0 : false;
186
+ }
169
187
  default:
170
188
  return false;
171
189
  }
172
190
  }
173
191
  /**
174
- * A data bar's share of the cell, 0..1. Excel measures from zero when the
175
- * range is non-negative (10, 20, 40 draw a quarter, a half and the whole
176
- * width), so the smallest value keeps a bar; a range with negatives runs
177
- * from its minimum instead, since there is no negative axis here.
192
+ * A data bar's geometry. Excel measures from zero: over a non-negative
193
+ * range 10, 20, 40 draw a quarter, a half and the whole width, so the
194
+ * smallest value keeps a bar. A range with negatives puts an axis where
195
+ * zero falls between the minimum and the maximum, and a bar grows away
196
+ * from it, right for a positive value and left for a negative one, each
197
+ * as its share of the whole span, as Excel's automatic axis draws them.
178
198
  */
179
- function barRatio(value, stats) {
199
+ function dataBarFor(value, stats) {
180
200
  const lo = Math.min(0, stats.min);
181
201
  const hi = Math.max(0, stats.max);
182
- if (hi === lo)
183
- return 0;
184
- return Math.min(1, Math.max(0, (value - lo) / (hi - lo)));
202
+ const span = hi - lo;
203
+ const negative = value < 0;
204
+ if (span === 0)
205
+ return { ratio: 0, axis: 0, negative };
206
+ const axis = lo < 0 ? -lo / span : 0;
207
+ const ratio = Math.min(1, Math.abs(value) / span);
208
+ return { ratio, axis, negative };
185
209
  }
186
210
  /** Where a number sits in a range, 0..1; 0.5 for a flat range. */
187
211
  function ratioOf(value, stats) {
@@ -229,8 +253,8 @@ export function evaluateCf(rules, r, c, value, display, statsFor, ctx) {
229
253
  let hit = false;
230
254
  if (rule.kind === 'dataBar') {
231
255
  if (typeof value === 'number' && !(out?.dataBar)) {
232
- const stats = statsFor(rule);
233
- out = { ...(out ?? {}), dataBar: { ratio: barRatio(value, stats), color: rule.color } };
256
+ const bar = dataBarFor(value, statsFor(rule));
257
+ out = { ...(out ?? {}), dataBar: { ...bar, color: bar.negative ? rule.negativeColor ?? DATA_BAR_NEGATIVE_COLOR : rule.color } };
234
258
  hit = true;
235
259
  }
236
260
  }
@@ -249,7 +273,7 @@ export function evaluateCf(rules, r, c, value, display, statsFor, ctx) {
249
273
  hit = true;
250
274
  }
251
275
  }
252
- else if (hasStyle(rule) && matches(rule, value, display, statsFor(rule), ctx)) {
276
+ else if (hasStyle(rule) && matches(rule, value, display, statsFor(rule), ctx, { row: r, col: c })) {
253
277
  const style = { ...(out?.style ?? {}) };
254
278
  const own = rule.style;
255
279
  for (const key of Object.keys(own)) {
@@ -305,6 +329,7 @@ export function describeCf(rule) {
305
329
  case 'duplicates': return rule.unique ? 'Unique Values' : 'Duplicate Values';
306
330
  case 'topBottom': return `${rule.top ? 'Top' : 'Bottom'} ${rule.rank}${rule.percent ? '%' : ''}`;
307
331
  case 'average': return rule.above ? 'Above Average' : 'Below Average';
332
+ case 'formula': return `Formula: ${rule.formula}`;
308
333
  case 'dataBar': return 'Data Bar';
309
334
  case 'colorScale': return rule.colors.length === 3 ? 'Graded Color Scale' : 'Two-Color Scale';
310
335
  case 'iconSet': return 'Icon Set';
@@ -0,0 +1,32 @@
1
+ import type { SheetState } from './document.js';
2
+ /**
3
+ * A sheet as CSV, the way Excel's Save As CSV writes one: what the cells
4
+ * SHOW, so a formula goes out as its value and a formatted number as its
5
+ * text; a field with a comma, a quote or a line break in quotes, a quote
6
+ * doubled; CRLF between rows; trailing empty cells kept so every row has
7
+ * the sheet's width.
8
+ */
9
+ export declare function csvText(rows: ReadonlyArray<ReadonlyArray<string>>, separator?: string): string;
10
+ /**
11
+ * CSV text back into rows.
12
+ *
13
+ * A scan, not a split: a quoted field may hold the separator, a line break
14
+ * or a doubled quote, and every real export uses all three. CRLF and LF both
15
+ * end a row, a BOM at the start is dropped (Excel writes one), and the
16
+ * separator is guessed when it is not given, so a semicolon file from a
17
+ * European Excel and a tab file pasted from anywhere read as themselves.
18
+ */
19
+ export declare function csvRows(text: string, separator?: string): string[][];
20
+ /** The separator a file uses: the one that divides its first lines evenly. */
21
+ export declare function guessCsvSeparator(text: string): string;
22
+ /**
23
+ * A CSV (or TSV) file as a one-sheet document.
24
+ *
25
+ * Every spreadsheet exports CSV and every one of them reads it back the same
26
+ * way: a field that looks like a number IS a number, and one that looks like
27
+ * a percentage, a currency amount or a grouped number keeps the format it
28
+ * implies, which is what `parseEntry` decides for typing. A field is never
29
+ * read as a formula - a CSV holding `=1+1` is text in Excel too, since the
30
+ * file came from somewhere else.
31
+ */
32
+ export declare function sheetStateFromCsv(text: string, sheetName?: string, separator?: string): SheetState;
@@ -0,0 +1,158 @@
1
+ import { parseEntry } from './entry.js';
2
+ import { formatKeyAt } from './format-store.js';
3
+ /**
4
+ * A sheet as CSV, the way Excel's Save As CSV writes one: what the cells
5
+ * SHOW, so a formula goes out as its value and a formatted number as its
6
+ * text; a field with a comma, a quote or a line break in quotes, a quote
7
+ * doubled; CRLF between rows; trailing empty cells kept so every row has
8
+ * the sheet's width.
9
+ */
10
+ export function csvText(rows, separator = ',') {
11
+ const width = rows.reduce((max, row) => Math.max(max, row.length), 0);
12
+ const field = (text) => /[",\r\n]/.test(text) || text.includes(separator) ? `"${text.replace(/"/g, '""')}"` : text;
13
+ return rows
14
+ .map((row) => Array.from({ length: width }, (_, i) => field(row[i] ?? '')).join(separator))
15
+ .join('\r\n');
16
+ }
17
+ /**
18
+ * CSV text back into rows.
19
+ *
20
+ * A scan, not a split: a quoted field may hold the separator, a line break
21
+ * or a doubled quote, and every real export uses all three. CRLF and LF both
22
+ * end a row, a BOM at the start is dropped (Excel writes one), and the
23
+ * separator is guessed when it is not given, so a semicolon file from a
24
+ * European Excel and a tab file pasted from anywhere read as themselves.
25
+ */
26
+ export function csvRows(text, separator) {
27
+ const body = text.replace(/^/, '');
28
+ if (body === '')
29
+ return [];
30
+ const sep = separator ?? guessCsvSeparator(body);
31
+ const rows = [];
32
+ let row = [];
33
+ let field = '';
34
+ let quoted = false;
35
+ let i = 0;
36
+ const endField = () => { row.push(field); field = ''; };
37
+ const endRow = () => { endField(); rows.push(row); row = []; };
38
+ while (i < body.length) {
39
+ const ch = body[i];
40
+ if (quoted) {
41
+ if (ch === '"') {
42
+ if (body[i + 1] === '"') {
43
+ field += '"';
44
+ i += 2;
45
+ continue;
46
+ }
47
+ quoted = false;
48
+ i += 1;
49
+ continue;
50
+ }
51
+ field += ch;
52
+ i += 1;
53
+ continue;
54
+ }
55
+ if (ch === '"' && field === '') {
56
+ quoted = true;
57
+ i += 1;
58
+ continue;
59
+ }
60
+ if (body.startsWith(sep, i)) {
61
+ endField();
62
+ i += sep.length;
63
+ continue;
64
+ }
65
+ if (ch === '\r') {
66
+ if (body[i + 1] === '\n')
67
+ i += 1;
68
+ endRow();
69
+ i += 1;
70
+ continue;
71
+ }
72
+ if (ch === '\n') {
73
+ endRow();
74
+ i += 1;
75
+ continue;
76
+ }
77
+ field += ch;
78
+ i += 1;
79
+ }
80
+ if (field !== '' || row.length)
81
+ endRow();
82
+ return rows;
83
+ }
84
+ /** The separator a file uses: the one that divides its first lines evenly. */
85
+ export function guessCsvSeparator(text) {
86
+ const lines = text.split(/\r?\n/).filter((line) => line !== '').slice(0, 20);
87
+ if (!lines.length)
88
+ return ',';
89
+ let best = null;
90
+ for (const sep of [',', ';', '\t', '|']) {
91
+ // Count outside quotes: a comma inside "Smith, John" divides nothing.
92
+ const counts = lines.map((line) => {
93
+ let n = 0;
94
+ let quoted = false;
95
+ for (let i = 0; i < line.length; i += 1) {
96
+ const ch = line[i];
97
+ if (ch === '"') {
98
+ quoted = !quoted;
99
+ continue;
100
+ }
101
+ if (!quoted && line.startsWith(sep, i))
102
+ n += 1;
103
+ }
104
+ return n;
105
+ });
106
+ const present = counts.filter((n) => n > 0).length;
107
+ if (!present)
108
+ continue;
109
+ const first = counts.find((n) => n > 0) ?? 0;
110
+ const even = counts.every((n) => n === 0 || n === first);
111
+ const score = present * (even ? 3 : 1) + first;
112
+ if (!best || score > best.score)
113
+ best = { sep, score };
114
+ }
115
+ return best?.sep ?? ',';
116
+ }
117
+ /**
118
+ * A CSV (or TSV) file as a one-sheet document.
119
+ *
120
+ * Every spreadsheet exports CSV and every one of them reads it back the same
121
+ * way: a field that looks like a number IS a number, and one that looks like
122
+ * a percentage, a currency amount or a grouped number keeps the format it
123
+ * implies, which is what `parseEntry` decides for typing. A field is never
124
+ * read as a formula - a CSV holding `=1+1` is text in Excel too, since the
125
+ * file came from somewhere else.
126
+ */
127
+ export function sheetStateFromCsv(text, sheetName = 'Sheet1', separator) {
128
+ const rows = csvRows(text, separator);
129
+ const cells = [];
130
+ const formats = {};
131
+ rows.forEach((row, r) => {
132
+ const line = [];
133
+ row.forEach((field, c) => {
134
+ const parsed = field === '' ? null : parseEntry(field);
135
+ if (parsed) {
136
+ line.push(parsed.value);
137
+ if (parsed.numFmt)
138
+ formats[formatKeyAt(r, c)] = { numFmt: parsed.numFmt };
139
+ return;
140
+ }
141
+ // A leading = would be read as a formula by the workbook, and this
142
+ // text was never one: Excel's own CSV import keeps it as it reads.
143
+ line.push(field.startsWith('=') ? `'${field}` : field);
144
+ });
145
+ cells.push(line);
146
+ });
147
+ return {
148
+ version: 1,
149
+ workbook: { sheets: [{ name: sheetName, cells }], active: sheetName, names: {} },
150
+ sheets: {
151
+ [sheetName]: {
152
+ formats, columnWidths: {}, rowHeights: [], hidden: { rows: [], cols: [] },
153
+ freeze: { rows: 0, cols: 0 }, comments: {}, protected: false,
154
+ merges: [], validation: [], conditionalFormats: [], autoFilter: null,
155
+ },
156
+ },
157
+ };
158
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * How a locale spells a number, a date and a formula.
3
+ *
4
+ * The rule this module exists to enforce: **the workbook stores the
5
+ * invariant spelling, always.** A formula in the document is
6
+ * `=SUM(1.5, A1)` whatever the user's locale, and a number is `1234.5`.
7
+ * The culture is a layer over the top, applied when a formula is shown for
8
+ * editing and un-applied when one is typed.
9
+ *
10
+ * That is what Excel does, and it is the only arrangement where a file
11
+ * written in Berlin opens in Boston. Storing `=SUMME(1,5;A1)` would make
12
+ * the document's meaning depend on who saved it, and every reader, writer
13
+ * and test would have to carry the locale to make sense of a cell.
14
+ *
15
+ * What a culture changes:
16
+ * - the decimal mark and the group mark, `1.234,5` against `1,234.5`
17
+ * - the argument separator, which Excel makes `;` wherever the decimal
18
+ * mark is `,`, since `,` is then busy
19
+ * - the order of a slash date, `31/12` against `12/31`
20
+ *
21
+ * What it does NOT change: function names, which stay English here, and
22
+ * the spelling in the file, which stays invariant.
23
+ */
24
+ export type SheetCulture = {
25
+ /** The locale this was derived from, for the number formatter. */
26
+ locale: string;
27
+ /** The decimal mark, `.` or `,`. */
28
+ decimal: string;
29
+ /** The group mark, which may be a non-breaking space. */
30
+ group: string;
31
+ /** What separates a function's arguments: `,`, or `;` where `,` is the
32
+ * decimal mark. */
33
+ argSeparator: string;
34
+ /** How a slash date reads: day first, month first, or year first. */
35
+ dateOrder: 'dmy' | 'mdy' | 'ymd';
36
+ };
37
+ export declare const SPACE_GROUP_MARKS: ReadonlyArray<string>;
38
+ /** The spelling the document itself uses, and the default. */
39
+ export declare const INVARIANT_CULTURE: SheetCulture;
40
+ /**
41
+ * The culture a locale implies, read off `Intl` rather than a table, so a
42
+ * locale nobody thought of still comes out right.
43
+ *
44
+ * Falls back to the invariant culture where `Intl` is missing or the
45
+ * locale is not one it knows, since a sheet that renders in the wrong
46
+ * separators is better than one that does not render.
47
+ */
48
+ export declare function cultureFromLocale(locale: string): SheetCulture;
49
+ /** True where the culture spells everything the way the document does. */
50
+ export declare const isInvariant: (c: SheetCulture) => boolean;
51
+ /**
52
+ * A stored formula as the user's locale spells it, for the formula bar.
53
+ *
54
+ * `=SUM(1.5, A1)` becomes `=SUM(1,5; A1)` in a German sheet.
55
+ */
56
+ export declare function formulaToCulture(formula: string, culture: SheetCulture): string;
57
+ /**
58
+ * A typed formula back to the spelling the document stores.
59
+ *
60
+ * The inverse of `formulaToCulture`, with one deliberate kindness: where
61
+ * the culture's separator is `;`, a `,` between arguments is taken as a
62
+ * separator too, so a user with an English keyboard habit is not stopped.
63
+ * A `,` that sits between digits is still the decimal mark, so nothing
64
+ * ambiguous is guessed at.
65
+ */
66
+ export declare function formulaFromCulture(formula: string, culture: SheetCulture): string;
67
+ /**
68
+ * A number as the culture writes it, back to a plain number.
69
+ *
70
+ * Returns null when the text is not a number in this culture, so the
71
+ * caller can fall through to treating it as text. The group mark is
72
+ * dropped wherever it appears rather than checked for position, as Excel
73
+ * does: `1.2.3,4` is not worth refusing on a technicality.
74
+ */
75
+ export declare function parseNumberInCulture(text: string, culture: SheetCulture): number | null;
76
+ /** A number as the culture writes it, for display. */
77
+ export declare function formatNumberInCulture(value: number, culture: SheetCulture): string;
78
+ /**
79
+ * The day, month and year a slash date names, in this culture's order.
80
+ *
81
+ * Returns null when the pieces cannot be a date, which is what tells a
82
+ * slash date apart from a fraction typed without a whole part.
83
+ */
84
+ export declare function slashDateParts(a: number, b: number, culture: SheetCulture): {
85
+ month: number;
86
+ day: number;
87
+ } | null;