@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,341 @@
1
+ /**
2
+ * Conditional formatting, Excel's: rules over cells that colour them by
3
+ * what they hold. Highlight Cells Rules (greater than, between, text that
4
+ * contains, duplicates), Top/Bottom Rules (top 10, above average), Data
5
+ * Bars, Color Scales and Icon Sets, each over rectangles that move with
6
+ * an insert or delete.
7
+ *
8
+ * Rules are evaluated over COMPUTED values (what a formula shows, not its
9
+ * text), which is why the model lives here beside the workbook rather than
10
+ * in the grid's own value-driven rules. The statistics a rule needs over
11
+ * its range (min, max, mean, rank, counts) are computed once per repaint by
12
+ * the shell and handed in, so a thousand cells cost one pass.
13
+ *
14
+ * Priority is array order, first rule first, as Excel's Manage Rules lists
15
+ * them: the first rule that decides a property wins it, and a rule with
16
+ * Stop If True stops the rules below it for the cells it matches.
17
+ */
18
+ import { isError } from './ast.js';
19
+ import { toText } from './coerce.js';
20
+ import { translateFormula } from './refs.js';
21
+ import { rectContains, shiftRects, subtractRect, rectsIntersect } from './rects.js';
22
+ // ---------------------------------------------------------------------------
23
+ // Excel's palettes
24
+ // ---------------------------------------------------------------------------
25
+ /** The six "with" styles of Excel's Highlight Cells dialogs. */
26
+ export const CF_PRESET_STYLES = [
27
+ { id: 'light-red', label: 'Light Red Fill with Dark Red Text', style: { fill: '#FFC7CE', color: '#9C0006' } },
28
+ { id: 'yellow', label: 'Yellow Fill with Dark Yellow Text', style: { fill: '#FFEB9C', color: '#9C5700' } },
29
+ { id: 'green', label: 'Green Fill with Dark Green Text', style: { fill: '#C6EFCE', color: '#006100' } },
30
+ { id: 'red-fill', label: 'Light Red Fill', style: { fill: '#FFC7CE' } },
31
+ { id: 'red-text', label: 'Red Text', style: { color: '#9C0006' } },
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';
36
+ export const COLOR_SCALES = {
37
+ 'green-yellow-red': ['#63BE7B', '#FFEB84', '#F8696B'],
38
+ 'red-yellow-green': ['#F8696B', '#FFEB84', '#63BE7B'],
39
+ 'green-white': ['#63BE7B', '#FCFCFF'],
40
+ 'white-red': ['#FCFCFF', '#F8696B'],
41
+ };
42
+ let nextId = 1;
43
+ export function cfId() {
44
+ nextId += 1;
45
+ return `cf${Date.now().toString(36)}${nextId}`;
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Statistics
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * The numbers and the texts a rule's rectangles hold. One pass; the shell
52
+ * caches the result per rule until the next repaint.
53
+ */
54
+ export function ruleStats(rule, valueAt, displayAt) {
55
+ const numbers = [];
56
+ const counts = new Map();
57
+ let sum = 0;
58
+ for (const [r1, c1, r2, c2] of rule.rects) {
59
+ for (let r = r1; r <= r2; r += 1) {
60
+ for (let c = c1; c <= c2; c += 1) {
61
+ const v = valueAt(r, c);
62
+ if (typeof v === 'number' && Number.isFinite(v)) {
63
+ numbers.push(v);
64
+ sum += v;
65
+ }
66
+ if (rule.kind === 'duplicates') {
67
+ const shown = displayAt(r, c);
68
+ if (shown !== '')
69
+ counts.set(shown, (counts.get(shown) ?? 0) + 1);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ numbers.sort((a, b) => a - b);
75
+ return {
76
+ sorted: numbers,
77
+ min: numbers[0] ?? 0,
78
+ max: numbers[numbers.length - 1] ?? 0,
79
+ mean: numbers.length ? sum / numbers.length : 0,
80
+ counts,
81
+ };
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Evaluation
85
+ // ---------------------------------------------------------------------------
86
+ function numberOf(text, ctx) {
87
+ const v = ctx.evaluate(text);
88
+ if (isError(v) || typeof v === 'boolean')
89
+ return null;
90
+ const n = typeof v === 'number' ? v : Number(v);
91
+ return Number.isFinite(n) ? n : null;
92
+ }
93
+ function textOf(text, ctx) {
94
+ const t = text.trim();
95
+ if (!t.startsWith('='))
96
+ return t;
97
+ const v = ctx.evaluate(t);
98
+ return isError(v) ? '' : toText(v);
99
+ }
100
+ function cellIs(value, operator, a, b) {
101
+ if (a === null)
102
+ return false;
103
+ switch (operator) {
104
+ case 'greater': return value > a;
105
+ case 'less': return value < a;
106
+ case 'greaterOrEqual': return value >= a;
107
+ case 'lessOrEqual': return value <= a;
108
+ case 'equal': return value === a;
109
+ case 'notEqual': return value !== a;
110
+ case 'between': return b !== null && value >= Math.min(a, b) && value <= Math.max(a, b);
111
+ case 'notBetween': return b !== null && (value < Math.min(a, b) || value > Math.max(a, b));
112
+ }
113
+ }
114
+ /** Whether a styling rule matches the cell. */
115
+ function matches(rule, value, display, stats, ctx, at) {
116
+ switch (rule.kind) {
117
+ case 'cellIs': {
118
+ const isEquality = rule.operator === 'equal' || rule.operator === 'notEqual';
119
+ const a = numberOf(rule.value1, ctx);
120
+ if (typeof value === 'number' && (a !== null || !isEquality)) {
121
+ return cellIs(value, rule.operator, a, rule.value2 === undefined ? null : numberOf(rule.value2, ctx));
122
+ }
123
+ // Equal to / not equal to compare as text where either side is text,
124
+ // as Excel does: 5 is not equal to 'Paid', and 'paid' is equal to it.
125
+ if (!isEquality)
126
+ return false;
127
+ const same = display !== '' && display.toLowerCase() === textOf(rule.value1, ctx).toLowerCase();
128
+ return rule.operator === 'equal' ? same : display !== '' && !same;
129
+ }
130
+ case 'text': {
131
+ if (display === '')
132
+ return false;
133
+ const hay = display.toLowerCase();
134
+ const needle = textOf(rule.value, ctx).toLowerCase();
135
+ if (needle === '')
136
+ return false;
137
+ switch (rule.match) {
138
+ case 'contains': return hay.includes(needle);
139
+ case 'notContains': return !hay.includes(needle);
140
+ case 'beginsWith': return hay.startsWith(needle);
141
+ case 'endsWith': return hay.endsWith(needle);
142
+ default: return false;
143
+ }
144
+ }
145
+ case 'duplicates': {
146
+ if (display === '')
147
+ return false;
148
+ const n = stats.counts.get(display) ?? 0;
149
+ return rule.unique ? n === 1 : n > 1;
150
+ }
151
+ case 'topBottom': {
152
+ if (typeof value !== 'number' || !stats.sorted.length)
153
+ return false;
154
+ const count = rule.percent
155
+ ? Math.max(1, Math.round((stats.sorted.length * rule.rank) / 100))
156
+ : rule.rank;
157
+ if (count <= 0)
158
+ return false;
159
+ // The cut is the count-th value from the top (or bottom); ties keep
160
+ // every cell at that value in, as Excel's do.
161
+ const sorted = stats.sorted;
162
+ const cut = rule.top
163
+ ? sorted[Math.max(sorted.length - count, 0)]
164
+ : sorted[Math.min(count - 1, sorted.length - 1)];
165
+ return rule.top ? value >= cut : value <= cut;
166
+ }
167
+ case 'average': {
168
+ if (typeof value !== 'number' || !stats.sorted.length)
169
+ return false;
170
+ return rule.above ? value > stats.mean : value < stats.mean;
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
+ }
187
+ default:
188
+ return false;
189
+ }
190
+ }
191
+ /**
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.
198
+ */
199
+ function dataBarFor(value, stats) {
200
+ const lo = Math.min(0, stats.min);
201
+ const hi = Math.max(0, stats.max);
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 };
209
+ }
210
+ /** Where a number sits in a range, 0..1; 0.5 for a flat range. */
211
+ function ratioOf(value, stats) {
212
+ if (stats.max === stats.min)
213
+ return 0.5;
214
+ return Math.min(1, Math.max(0, (value - stats.min) / (stats.max - stats.min)));
215
+ }
216
+ /** Linear interpolate two hex colours. */
217
+ function lerp(a, b, t) {
218
+ const pa = parseHex(a);
219
+ const pb = parseHex(b);
220
+ if (!pa || !pb)
221
+ return a;
222
+ const k = Math.min(1, Math.max(0, t));
223
+ const ch = (i) => Math.round(pa[i] + (pb[i] - pa[i]) * k).toString(16).padStart(2, '0');
224
+ return `#${ch(0)}${ch(1)}${ch(2)}`;
225
+ }
226
+ function parseHex(hex) {
227
+ const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());
228
+ if (!m)
229
+ return null;
230
+ const n = parseInt(m[1], 16);
231
+ return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
232
+ }
233
+ /** The colour a scale gives a position 0..1. */
234
+ export function scaleColor(colors, t) {
235
+ if (colors.length === 2)
236
+ return lerp(colors[0], colors[1], t);
237
+ return t <= 0.5 ? lerp(colors[0], colors[1], t * 2) : lerp(colors[1], colors[2], (t - 0.5) * 2);
238
+ }
239
+ /** Which of an icon set's three icons a position 0..1 gets: Excel's thirds. */
240
+ export function iconIndex(t) {
241
+ return t >= 2 / 3 ? 0 : t >= 1 / 3 ? 1 : 2;
242
+ }
243
+ /**
244
+ * What the rules say about (r, c). Array order is priority; the first rule
245
+ * that decides a property (the fill, the text colour, the bar, the icon)
246
+ * keeps it; a matching rule with Stop If True ends the walk.
247
+ */
248
+ export function evaluateCf(rules, r, c, value, display, statsFor, ctx) {
249
+ let out = null;
250
+ for (const rule of rules) {
251
+ if (!rule.rects.some((rect) => rectContains(rect, r, c)))
252
+ continue;
253
+ let hit = false;
254
+ if (rule.kind === 'dataBar') {
255
+ if (typeof value === 'number' && !(out?.dataBar)) {
256
+ const bar = dataBarFor(value, statsFor(rule));
257
+ out = { ...(out ?? {}), dataBar: { ...bar, color: bar.negative ? rule.negativeColor ?? DATA_BAR_NEGATIVE_COLOR : rule.color } };
258
+ hit = true;
259
+ }
260
+ }
261
+ else if (rule.kind === 'colorScale') {
262
+ const current = out ?? {};
263
+ if (typeof value === 'number' && current.style?.fill === undefined) {
264
+ const stats = statsFor(rule);
265
+ out = { ...current, style: { ...(current.style ?? {}), fill: scaleColor(rule.colors, ratioOf(value, stats)) } };
266
+ hit = true;
267
+ }
268
+ }
269
+ else if (rule.kind === 'iconSet') {
270
+ if (typeof value === 'number' && !(out?.icon)) {
271
+ const stats = statsFor(rule);
272
+ out = { ...(out ?? {}), icon: { set: rule.set, index: iconIndex(ratioOf(value, stats)) } };
273
+ hit = true;
274
+ }
275
+ }
276
+ else if (hasStyle(rule) && matches(rule, value, display, statsFor(rule), ctx, { row: r, col: c })) {
277
+ const style = { ...(out?.style ?? {}) };
278
+ const own = rule.style;
279
+ for (const key of Object.keys(own)) {
280
+ if (style[key] === undefined && own[key] !== undefined)
281
+ style[key] = own[key];
282
+ }
283
+ out = { ...(out ?? {}), style };
284
+ hit = true;
285
+ }
286
+ if (hit && rule.stopIfTrue)
287
+ break;
288
+ }
289
+ return out;
290
+ }
291
+ // ---------------------------------------------------------------------------
292
+ // Bookkeeping
293
+ // ---------------------------------------------------------------------------
294
+ /** The rules after an insert or delete. */
295
+ export function shiftCf(rules, edit) {
296
+ return shiftRects(rules, edit);
297
+ }
298
+ /** The rules with the rectangles cut out of them: Clear Rules from Selected Cells. */
299
+ export function removeCf(rules, rects) {
300
+ const out = [];
301
+ for (const rule of rules) {
302
+ let kept = [...rule.rects];
303
+ for (const hole of rects)
304
+ kept = kept.flatMap((rect) => subtractRect(rect, hole));
305
+ if (kept.length)
306
+ out.push({ ...rule, rects: kept });
307
+ }
308
+ return out;
309
+ }
310
+ /** The rules touching any of the rectangles. */
311
+ export function cfIn(rules, rects) {
312
+ return rules.filter((rule) => rule.rects.some((a) => rects.some((b) => rectsIntersect(a, b))));
313
+ }
314
+ const OPERATOR_WORDS = {
315
+ greater: 'greater than', less: 'less than', between: 'between', notBetween: 'not between',
316
+ equal: 'equal to', notEqual: 'not equal to', greaterOrEqual: 'greater than or equal to', lessOrEqual: 'less than or equal to',
317
+ };
318
+ const MATCH_WORDS = {
319
+ contains: 'contains', notContains: 'does not contain', beginsWith: 'begins with', endsWith: 'ends with',
320
+ };
321
+ /** A rule in words, the way Excel's Manage Rules lists it. */
322
+ export function describeCf(rule) {
323
+ switch (rule.kind) {
324
+ case 'cellIs':
325
+ return rule.operator === 'between' || rule.operator === 'notBetween'
326
+ ? `Cell Value ${OPERATOR_WORDS[rule.operator]} ${rule.value1} and ${rule.value2 ?? ''}`
327
+ : `Cell Value ${OPERATOR_WORDS[rule.operator]} ${rule.value1}`;
328
+ case 'text': return `Cell Value ${MATCH_WORDS[rule.match]} '${rule.value}'`;
329
+ case 'duplicates': return rule.unique ? 'Unique Values' : 'Duplicate Values';
330
+ case 'topBottom': return `${rule.top ? 'Top' : 'Bottom'} ${rule.rank}${rule.percent ? '%' : ''}`;
331
+ case 'average': return rule.above ? 'Above Average' : 'Below Average';
332
+ case 'formula': return `Formula: ${rule.formula}`;
333
+ case 'dataBar': return 'Data Bar';
334
+ case 'colorScale': return rule.colors.length === 3 ? 'Graded Color Scale' : 'Two-Color Scale';
335
+ case 'iconSet': return 'Icon Set';
336
+ }
337
+ }
338
+ /** Whether a rule carries a style the dialog can edit. */
339
+ export function hasStyle(rule) {
340
+ return 'style' in rule;
341
+ }
@@ -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;