@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,159 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's small conditional-formatting dialogs, one component: Greater
4
+ * Than..., Less Than..., Between..., Equal To..., Text that Contains...,
5
+ * Duplicate Values..., Top 10 Items..., Bottom 10 Items..., Above Average
6
+ * and Below Average. Each is a sentence with its inputs and the "with"
7
+ * picker of Excel's six styles. It opens empty for a new rule from the
8
+ * ribbon, or on a rule from Manage Rules > Edit, and hands back the rule's
9
+ * body for the shell to place.
10
+ */
11
+ import { useSheetText } from './sheet-text'
12
+ import { SvModal } from '@svgrid/grid'
13
+ import { CF_PRESET_STYLES, type CfPreset, type CfBody, type CfStyledRule } from './sheet/conditional-formats'
14
+
15
+ type Props = {
16
+ open?: boolean
17
+ preset: CfPreset
18
+ /** The rule being edited, for Manage Rules > Edit. */
19
+ rule?: CfStyledRule | null
20
+ /** The selection as A1, for the heading. */
21
+ address: string
22
+ onApply: (body: CfBody) => void
23
+ onClose?: () => void
24
+ }
25
+
26
+ let { open = $bindable(false), preset, rule = null, address, onApply, onClose }: Props = $props()
27
+ const t = useSheetText()
28
+
29
+
30
+ let value1 = $state('')
31
+ let value2 = $state('')
32
+ let rank = $state('10')
33
+ let percent = $state(false)
34
+ let unique = $state(false)
35
+ let styleId = $state(CF_PRESET_STYLES[0]!.id)
36
+ let first = $state<HTMLInputElement | HTMLSelectElement | null>(null)
37
+
38
+ $effect(() => {
39
+ if (!open) return
40
+ value1 = ''
41
+ value2 = ''
42
+ rank = '10'
43
+ percent = false
44
+ unique = false
45
+ styleId = CF_PRESET_STYLES[0]!.id
46
+ const r = rule
47
+ if (r) {
48
+ if (r.kind === 'cellIs') { value1 = r.value1; value2 = r.value2 ?? '' }
49
+ else if (r.kind === 'text') value1 = r.value
50
+ else if (r.kind === 'duplicates') unique = !!r.unique
51
+ else if (r.kind === 'topBottom') { rank = String(r.rank); percent = !!r.percent }
52
+ else if (r.kind === 'formula') value1 = r.formula
53
+ const match = CF_PRESET_STYLES.find((p) => JSON.stringify(p.style) === JSON.stringify(r.style))
54
+ if (match) styleId = match.id
55
+ }
56
+ queueMicrotask(() => first?.focus())
57
+ })
58
+
59
+ const needsValue = $derived(preset === 'greater' || preset === 'less' || preset === 'between' || preset === 'equal' || preset === 'text' || preset === 'formula')
60
+ const valid = $derived(
61
+ (!needsValue || value1.trim() !== '')
62
+ && (preset !== 'between' || value2.trim() !== '')
63
+ && ((preset !== 'top10' && preset !== 'bottom10') || (Number.isInteger(Number(rank)) && Number(rank) > 0)),
64
+ )
65
+
66
+ function body(): CfBody {
67
+ const style = CF_PRESET_STYLES.find((p) => p.id === styleId)?.style ?? CF_PRESET_STYLES[0]!.style
68
+ switch (preset) {
69
+ case 'greater': return { kind: 'cellIs', operator: 'greater', value1: value1.trim(), style }
70
+ case 'less': return { kind: 'cellIs', operator: 'less', value1: value1.trim(), style }
71
+ case 'between': return { kind: 'cellIs', operator: 'between', value1: value1.trim(), value2: value2.trim(), style }
72
+ case 'equal': return { kind: 'cellIs', operator: 'equal', value1: value1.trim(), style }
73
+ case 'text': return { kind: 'text', match: 'contains', value: value1.trim(), style }
74
+ case 'duplicates': return { kind: 'duplicates', unique, style }
75
+ case 'top10': return { kind: 'topBottom', top: true, rank: Number(rank), percent, style }
76
+ case 'bottom10': return { kind: 'topBottom', top: false, rank: Number(rank), percent, style }
77
+ case 'aboveAverage': return { kind: 'average', above: true, style }
78
+ case 'belowAverage': return { kind: 'average', above: false, style }
79
+ case 'formula': {
80
+ const text = value1.trim()
81
+ return { kind: 'formula', formula: text.startsWith('=') ? text : `=${text}`, style }
82
+ }
83
+ }
84
+ }
85
+
86
+ function ok() {
87
+ if (!valid) return
88
+ onApply(body())
89
+ open = false
90
+ onClose?.()
91
+ }
92
+
93
+ function close() {
94
+ open = false
95
+ onClose?.()
96
+ }
97
+
98
+ const sample = $derived(CF_PRESET_STYLES.find((p) => p.id === styleId)?.style ?? {})
99
+ </script>
100
+
101
+ <SvModal bind:open onClose={onClose} title={t(`cf.title.${preset}`)} size="sm" width={440}>
102
+ <form class="sv-sheet-dialog cf" onsubmit={(e) => { e.preventDefault(); ok() }}>
103
+ <div class="where">{address}</div>
104
+ <div class="lead">{t(`cf.lead.${preset}`)}</div>
105
+ <div class="row">
106
+ {#if preset === 'between'}
107
+ <input bind:this={first} type="text" bind:value={value1} aria-label={t('cf.lowerValue')} spellcheck="false" />
108
+ <span>{t('cf.and')}</span>
109
+ <input type="text" bind:value={value2} aria-label={t('cf.upperValue')} spellcheck="false" />
110
+ {:else if needsValue}
111
+ <input bind:this={first} type="text" bind:value={value1} aria-label={t(preset === 'formula' ? 'cf.formula' : 'cf.value')} spellcheck="false" placeholder={preset === 'text' ? t('cf.textPlaceholder') : preset === 'formula' ? '=$B2>100' : t('cf.valuePlaceholder')} />
112
+ {:else if preset === 'duplicates'}
113
+ <select bind:this={first} bind:value={unique} aria-label={t('cf.duplicateOrUnique')}>
114
+ <option value={false}>{t('cf.duplicate')}</option>
115
+ <option value={true}>{t('cf.unique')}</option>
116
+ </select>
117
+ <span>{t('cf.values')}</span>
118
+ {:else if preset === 'top10' || preset === 'bottom10'}
119
+ <input bind:this={first} type="number" min="1" bind:value={rank} aria-label={t('cf.howMany')} />
120
+ <label class="check"><input type="checkbox" bind:checked={percent} /> {t('cf.percentOfRange')}</label>
121
+ {/if}
122
+ <span>{t('cf.with')}</span>
123
+ <select bind:value={styleId} aria-label={t('cf.formatStyle')}>
124
+ {#each CF_PRESET_STYLES as p (p.id)}<option value={p.id}>{t(`cf.style.${p.id}`)}</option>{/each}
125
+ </select>
126
+ </div>
127
+ {#if preset === 'formula'}
128
+ <p class="hint">{t('cf.formulaHint')}</p>
129
+ {/if}
130
+ <div class="sample" style:background={sample.fill ?? 'transparent'} style:color={sample.color ?? 'inherit'}>AaBbCcYyZz</div>
131
+ </form>
132
+ {#snippet footer()}
133
+ <div class="sv-sheet-dialog-buttons">
134
+ <button type="button" class="btn primary" onclick={ok} disabled={!valid}>{t('ok')}</button>
135
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
136
+ </div>
137
+ {/snippet}
138
+ </SvModal>
139
+
140
+ <style>
141
+ .where { color: var(--sg-muted, #616161); }
142
+ .lead { font-weight: 600; }
143
+ .row {
144
+ display: flex;
145
+ flex-wrap: wrap;
146
+ align-items: center;
147
+ gap: 8px;
148
+ }
149
+ .row input[type="text"] { flex: 1 1 110px; min-width: 90px; }
150
+ .row input[type="number"] { width: 64px; }
151
+ .row select { max-width: 240px; }
152
+ .sample {
153
+ width: 120px;
154
+ padding: 4px 10px;
155
+ border: 1px solid var(--sg-border, #d1d1d1);
156
+ border-radius: var(--sg-radius, 3px);
157
+ text-align: center;
158
+ }
159
+ </style>
@@ -0,0 +1,14 @@
1
+ import { type CfPreset, type CfBody, type CfStyledRule } from './sheet/conditional-formats.js';
2
+ type Props = {
3
+ open?: boolean;
4
+ preset: CfPreset;
5
+ /** The rule being edited, for Manage Rules > Edit. */
6
+ rule?: CfStyledRule | null;
7
+ /** The selection as A1, for the heading. */
8
+ address: string;
9
+ onApply: (body: CfBody) => void;
10
+ onClose?: () => void;
11
+ };
12
+ declare const SvSheetConditionalFormat: import("svelte").Component<Props, {}, "open">;
13
+ type SvSheetConditionalFormat = ReturnType<typeof SvSheetConditionalFormat>;
14
+ export default SvSheetConditionalFormat;
@@ -0,0 +1,273 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Data Validation dialog, its three tabs: Settings (Allow, Data,
4
+ * the bounds or the source, Ignore blank, In-cell dropdown), Input
5
+ * Message (shown under the cell while it is selected) and Error Alert
6
+ * (Style, Title, Message). It opens on the rule
7
+ * at the active cell and, on OK, hands back one rule for the shell to put
8
+ * over the selection; Clear All removes the validation from the selection.
9
+ */
10
+ import { useSheetText } from './sheet-text'
11
+ import { SvModal } from '@svgrid/grid'
12
+ import {
13
+ OPERATOR_LABELS,
14
+ type ValidationRule, type ValidationAllow, type ValidationOperator, type ValidationSpec,
15
+ } from './sheet/validation'
16
+
17
+ type Props = {
18
+ open?: boolean
19
+ /** The rule at the active cell, what the dialog opens on. */
20
+ rule: ValidationRule | undefined
21
+ /** The selection as A1, for the heading. */
22
+ address: string
23
+ onApply: (spec: ValidationSpec) => void
24
+ onClear: () => void
25
+ onClose?: () => void
26
+ }
27
+
28
+ let { open = $bindable(false), rule, address, onApply, onClear, onClose }: Props = $props()
29
+ const t = useSheetText()
30
+
31
+ type Tab = 'settings' | 'input' | 'alert'
32
+ let tab = $state<Tab>('settings')
33
+
34
+ const ALLOWS: ReadonlyArray<{ id: ValidationAllow; label: string }> = [
35
+ { id: 'any', label: 'validation.allow.any' },
36
+ { id: 'whole', label: 'validation.allow.whole' },
37
+ { id: 'decimal', label: 'validation.allow.decimal' },
38
+ { id: 'list', label: 'validation.allow.list' },
39
+ { id: 'date', label: 'validation.allow.date' },
40
+ { id: 'textLength', label: 'validation.allow.textLength' },
41
+ { id: 'custom', label: 'validation.allow.custom' },
42
+ ]
43
+ const OPERATORS = Object.keys(OPERATOR_LABELS) as ValidationOperator[]
44
+
45
+ let allow = $state<ValidationAllow>('any')
46
+ let operator = $state<ValidationOperator>('between')
47
+ let value1 = $state('')
48
+ let value2 = $state('')
49
+ let ignoreBlank = $state(true)
50
+ let inCellDropdown = $state(true)
51
+ let style = $state<'stop' | 'warning'>('stop')
52
+ let title = $state('')
53
+ let message = $state('')
54
+ let showInput = $state(true)
55
+ let inputTitle = $state('')
56
+ let inputMessage = $state('')
57
+ let first = $state<HTMLSelectElement | null>(null)
58
+
59
+ $effect(() => {
60
+ if (!open) return
61
+ tab = 'settings'
62
+ allow = rule?.allow ?? 'any'
63
+ operator = rule?.operator ?? 'between'
64
+ value1 = rule?.value1 ?? ''
65
+ value2 = rule?.value2 ?? ''
66
+ ignoreBlank = rule?.ignoreBlank ?? true
67
+ inCellDropdown = rule?.inCellDropdown ?? true
68
+ style = rule?.alert.style ?? 'stop'
69
+ title = rule?.alert.title ?? ''
70
+ message = rule?.alert.message ?? ''
71
+ showInput = rule ? rule.input !== undefined : true
72
+ inputTitle = rule?.input?.title ?? ''
73
+ inputMessage = rule?.input?.message ?? ''
74
+ queueMicrotask(() => first?.focus())
75
+ })
76
+
77
+ const bounded = $derived(allow === 'whole' || allow === 'decimal' || allow === 'date' || allow === 'textLength')
78
+ const twoBounds = $derived(operator === 'between' || operator === 'notBetween')
79
+ const firstLabel = $derived(
80
+ allow === 'list' ? t('validation.source')
81
+ : allow === 'custom' ? t('validation.formula')
82
+ : twoBounds ? t(allow === 'date' ? 'validation.startDate' : 'validation.minimum')
83
+ : t(allow === 'date' ? 'validation.date' : allow === 'textLength' ? 'validation.length' : 'validation.value'),
84
+ )
85
+ const secondLabel = $derived(t(allow === 'date' ? 'validation.endDate' : 'validation.maximum'))
86
+ const valid = $derived(
87
+ allow === 'any'
88
+ || (allow === 'list' && value1.trim() !== '')
89
+ || (allow === 'custom' && value1.trim() !== '')
90
+ || (bounded && value1.trim() !== '' && (!twoBounds || value2.trim() !== '')),
91
+ )
92
+
93
+ function ok() {
94
+ if (!valid) return
95
+ const spec: ValidationSpec = {
96
+ allow,
97
+ ignoreBlank,
98
+ inCellDropdown: allow === 'list' ? inCellDropdown : false,
99
+ alert: { style, title: title.trim() || undefined, message: message.trim() || undefined },
100
+ }
101
+ // An input message exists when the box is on and there is text to show.
102
+ if (showInput && (inputTitle.trim() || inputMessage.trim())) {
103
+ spec.input = { title: inputTitle.trim() || undefined, message: inputMessage.trim() || undefined }
104
+ }
105
+ if (bounded) {
106
+ spec.operator = operator
107
+ spec.value1 = value1.trim()
108
+ if (twoBounds) spec.value2 = value2.trim()
109
+ } else if (allow === 'list' || allow === 'custom') {
110
+ spec.value1 = value1.trim()
111
+ }
112
+ onApply(spec)
113
+ open = false
114
+ onClose?.()
115
+ }
116
+
117
+ function clearAll() {
118
+ onClear()
119
+ open = false
120
+ onClose?.()
121
+ }
122
+
123
+ function close() {
124
+ open = false
125
+ onClose?.()
126
+ }
127
+ </script>
128
+
129
+ <SvModal bind:open onClose={onClose} title={t('validation.title')} size="sm" width={400}>
130
+ <form class="sv-sheet-dialog validation" onsubmit={(e) => { e.preventDefault(); ok() }}>
131
+ <div class="where">{address}</div>
132
+ <div class="tabs" role="tablist" aria-label={t('validation.tabs')}>
133
+ {#each ['settings', 'input', 'alert'] as id (id)}
134
+ <button type="button" role="tab" class="tab" class:on={tab === id} aria-selected={tab === id} onclick={() => (tab = id as Tab)}>{t(`validation.tab.${id}`)}</button>
135
+ {/each}
136
+ </div>
137
+ <div class="panel" role="tabpanel">
138
+ {#if tab === 'settings'}
139
+ <div class="lead">{t('validation.criteria')}</div>
140
+ <label class="field">
141
+ <span>{t('validation.allow')}</span>
142
+ <select bind:this={first} bind:value={allow}>
143
+ {#each ALLOWS as a (a.id)}<option value={a.id}>{t(a.label)}</option>{/each}
144
+ </select>
145
+ </label>
146
+ {#if bounded}
147
+ <label class="field">
148
+ <span>{t('validation.data')}</span>
149
+ <select bind:value={operator}>
150
+ {#each OPERATORS as id (id)}<option value={id}>{t(`validation.operator.${id}`)}</option>{/each}
151
+ </select>
152
+ </label>
153
+ {/if}
154
+ {#if allow !== 'any'}
155
+ <label class="field">
156
+ <span>{firstLabel}</span>
157
+ <input type="text" bind:value={value1} spellcheck="false" placeholder={allow === 'list' ? t('validation.listPlaceholder') : allow === 'custom' ? '=B1<>""' : ''} />
158
+ </label>
159
+ {/if}
160
+ {#if bounded && twoBounds}
161
+ <label class="field">
162
+ <span>{secondLabel}</span>
163
+ <input type="text" bind:value={value2} spellcheck="false" />
164
+ </label>
165
+ {/if}
166
+ <div class="checks">
167
+ <label class="check"><input type="checkbox" bind:checked={ignoreBlank} /> {t('validation.ignoreBlank')}</label>
168
+ {#if allow === 'list'}
169
+ <label class="check"><input type="checkbox" bind:checked={inCellDropdown} /> {t('validation.inCellDropdown')}</label>
170
+ {/if}
171
+ </div>
172
+ {#if allow === 'custom'}
173
+ <p class="hint">{t('validation.customHint')}</p>
174
+ {:else if allow === 'list'}
175
+ <p class="hint">{t('validation.listHint')}</p>
176
+ {:else if allow !== 'any'}
177
+ <p class="hint">{t('validation.boundHint')}</p>
178
+ {/if}
179
+ {:else if tab === 'input'}
180
+ <label class="check"><input type="checkbox" bind:checked={showInput} /> {t('validation.showInput')}</label>
181
+ <div class="lead">{t('validation.inputLead')}</div>
182
+ <label class="field">
183
+ <span>{t('validation.inputTitle')}</span>
184
+ <input type="text" bind:value={inputTitle} disabled={!showInput} />
185
+ </label>
186
+ <label class="field message">
187
+ <span>{t('validation.inputMessage')}</span>
188
+ <textarea rows="4" bind:value={inputMessage} disabled={!showInput}></textarea>
189
+ </label>
190
+ {:else}
191
+ <div class="lead">{t('validation.alertLead')}</div>
192
+ <label class="field">
193
+ <span>{t('validation.style')}</span>
194
+ <select bind:value={style}>
195
+ <option value="stop">{t('validation.stop')}</option>
196
+ <option value="warning">{t('validation.warning')}</option>
197
+ </select>
198
+ </label>
199
+ <label class="field">
200
+ <span>{t('validation.errorTitle')}</span>
201
+ <input type="text" bind:value={title} />
202
+ </label>
203
+ <label class="field message">
204
+ <span>{t('validation.errorMessage')}</span>
205
+ <textarea rows="4" bind:value={message}></textarea>
206
+ </label>
207
+ <p class="hint">{t('validation.alertHint')}</p>
208
+ {/if}
209
+ </div>
210
+ </form>
211
+ {#snippet footer()}
212
+ <div class="sv-sheet-dialog-buttons">
213
+ <button type="button" class="btn" onclick={clearAll}>{t('validation.clearAll')}</button>
214
+ <span class="spacer"></span>
215
+ <button type="button" class="btn primary" onclick={ok} disabled={!valid}>{t('ok')}</button>
216
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
217
+ </div>
218
+ {/snippet}
219
+ </SvModal>
220
+
221
+ <style>
222
+ .where { color: var(--sg-muted, #616161); }
223
+ .tabs {
224
+ display: flex;
225
+ gap: 2px;
226
+ border-bottom: 1px solid var(--sg-border, #d1d1d1);
227
+ }
228
+ .tab {
229
+ padding: 5px 12px;
230
+ font: inherit;
231
+ font-size: 13px;
232
+ color: var(--sg-muted, #616161);
233
+ background: transparent;
234
+ border: 1px solid transparent;
235
+ border-bottom: 0;
236
+ border-radius: var(--sg-radius, 3px) var(--sg-radius, 3px) 0 0;
237
+ cursor: pointer;
238
+ }
239
+ .tab:hover { color: var(--sg-fg, #242424); }
240
+ .tab.on {
241
+ color: var(--sg-fg, #242424);
242
+ background: var(--sg-bg, #fff);
243
+ border-color: var(--sg-border, #d1d1d1);
244
+ margin-bottom: -1px;
245
+ }
246
+ .panel {
247
+ display: flex;
248
+ flex-direction: column;
249
+ gap: 10px;
250
+ min-height: 220px;
251
+ padding-top: 4px;
252
+ }
253
+ .lead { font-weight: 600; }
254
+ .hint { margin: 0; color: var(--sg-muted, #616161); }
255
+ .field.message { align-items: start; }
256
+ textarea {
257
+ width: 100%;
258
+ box-sizing: border-box;
259
+ padding: 4px 6px;
260
+ font: inherit;
261
+ color: inherit;
262
+ background: var(--sg-bg, #fff);
263
+ border: 1px solid var(--sg-border, #d1d1d1);
264
+ border-radius: var(--sg-radius, 3px);
265
+ resize: vertical;
266
+ }
267
+ textarea:focus {
268
+ outline: none;
269
+ border-color: var(--sg-accent, #217346);
270
+ box-shadow: 0 0 0 1px var(--sg-accent, #217346);
271
+ }
272
+ .spacer { flex: 1; }
273
+ </style>
@@ -0,0 +1,14 @@
1
+ import { type ValidationRule, type ValidationSpec } from './sheet/validation.js';
2
+ type Props = {
3
+ open?: boolean;
4
+ /** The rule at the active cell, what the dialog opens on. */
5
+ rule: ValidationRule | undefined;
6
+ /** The selection as A1, for the heading. */
7
+ address: string;
8
+ onApply: (spec: ValidationSpec) => void;
9
+ onClear: () => void;
10
+ onClose?: () => void;
11
+ };
12
+ declare const SvSheetDataValidation: import("svelte").Component<Props, {}, "open">;
13
+ type SvSheetDataValidation = ReturnType<typeof SvSheetDataValidation>;
14
+ export default SvSheetDataValidation;
@@ -0,0 +1,217 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Allow Users to Edit Ranges: the blocks that take an edit while
4
+ * the sheet is protected, locked or not, each with a title. New adds
5
+ * one from a title and an A1 text (`B2:B10`, or several areas with
6
+ * commas), Modify edits one in place, Delete removes it; OK hands the
7
+ * list back as one change, and Protect Sheet... closes this and opens
8
+ * that dialog, as Excel's button does. No password per range.
9
+ */
10
+ import { useSheetText } from './sheet-text'
11
+ import { SvModal } from '@svgrid/grid'
12
+ import { newEditRangeId, parseRangeText, rangeText, type EditRange } from './sheet/protection'
13
+
14
+ type Props = {
15
+ open?: boolean
16
+ /** The sheet's ranges as they stand. */
17
+ ranges: ReadonlyArray<EditRange>
18
+ /** The selection as A1 text, what a new range's cells open on. */
19
+ selection: string
20
+ onApply: (ranges: EditRange[]) => void
21
+ /** The Protect Sheet... button: the shell opens that dialog. */
22
+ onProtect: () => void
23
+ onClose?: () => void
24
+ }
25
+
26
+ let { open = $bindable(false), ranges, selection, onApply, onProtect, onClose }: Props = $props()
27
+ const t = useSheetText()
28
+
29
+ let working = $state<EditRange[]>([])
30
+ let newTitle = $state('')
31
+ let newRefers = $state('')
32
+ let editing = $state<string | null>(null)
33
+ let editTitle = $state('')
34
+ let editRefers = $state('')
35
+ let problem = $state<string | null>(null)
36
+ let titleBox = $state<HTMLInputElement | null>(null)
37
+
38
+ $effect(() => {
39
+ if (!open) return
40
+ const copy = ranges.map((r) => ({ ...r, rects: r.rects.map(([r1, c1, r2, c2]) => [r1, c1, r2, c2] as const) }))
41
+ working = copy
42
+ newTitle = `Range${copy.length + 1}`
43
+ newRefers = selection
44
+ editing = null
45
+ problem = null
46
+ queueMicrotask(() => titleBox?.focus())
47
+ })
48
+
49
+ function add() {
50
+ const rects = parseRangeText(newRefers)
51
+ if (!rects) { problem = t('editRanges.invalidRef', { text: newRefers }); return }
52
+ const title = newTitle.trim() || `Range${working.length + 1}`
53
+ working = [...working, { id: newEditRangeId(), title, rects }]
54
+ newTitle = `Range${working.length + 1}`
55
+ newRefers = ''
56
+ problem = null
57
+ }
58
+
59
+ function startEdit(range: EditRange) {
60
+ editing = range.id
61
+ editTitle = range.title
62
+ editRefers = rangeText(range.rects)
63
+ problem = null
64
+ }
65
+
66
+ function saveEdit() {
67
+ const rects = parseRangeText(editRefers)
68
+ if (!rects) { problem = t('editRanges.invalidRef', { text: editRefers }); return }
69
+ working = working.map((r) => (r.id === editing ? { ...r, title: editTitle.trim() || r.title, rects } : r))
70
+ editing = null
71
+ problem = null
72
+ }
73
+
74
+ function remove(id: string) {
75
+ working = working.filter((r) => r.id !== id)
76
+ if (editing === id) editing = null
77
+ }
78
+
79
+ function ok() {
80
+ open = false
81
+ onApply(working)
82
+ onClose?.()
83
+ }
84
+
85
+ function protect() {
86
+ open = false
87
+ onApply(working)
88
+ onProtect()
89
+ }
90
+
91
+ function close() {
92
+ open = false
93
+ onClose?.()
94
+ }
95
+ </script>
96
+
97
+ <SvModal bind:open onClose={onClose} title={t('editRanges.title')} size="md">
98
+ <div class="sv-sheet-dialog ranges" role="group" aria-label={t('editRanges.title')}>
99
+ <div class="lead">{t('editRanges.lead')}</div>
100
+ <table class="list">
101
+ <thead>
102
+ <tr><th>{t('editRanges.name')}</th><th>{t('editRanges.refersTo')}</th><th></th></tr>
103
+ </thead>
104
+ <tbody>
105
+ {#each working as range (range.id)}
106
+ <tr>
107
+ {#if editing === range.id}
108
+ <td><input type="text" bind:value={editTitle} aria-label={t('editRanges.name')} spellcheck="false" /></td>
109
+ <td class="mono">
110
+ <input
111
+ type="text"
112
+ bind:value={editRefers}
113
+ aria-label={t('editRanges.refersTo')}
114
+ spellcheck="false"
115
+ onkeydown={(e) => { if (e.key === 'Enter') { e.preventDefault(); saveEdit() } if (e.key === 'Escape') { e.stopPropagation(); editing = null } }}
116
+ />
117
+ </td>
118
+ <td class="actions">
119
+ <button type="button" class="link" onclick={saveEdit}>{t('save')}</button>
120
+ <button type="button" class="link" onclick={() => (editing = null)}>{t('cancel')}</button>
121
+ </td>
122
+ {:else}
123
+ <td>{range.title}</td>
124
+ <td class="mono">{rangeText(range.rects)}</td>
125
+ <td class="actions">
126
+ <button type="button" class="link" onclick={() => startEdit(range)}>{t('editRanges.modify')}</button>
127
+ <button type="button" class="link" onclick={() => remove(range.id)}>{t('delete')}</button>
128
+ </td>
129
+ {/if}
130
+ </tr>
131
+ {:else}
132
+ <tr><td colspan="3" class="empty">{t('editRanges.empty')}</td></tr>
133
+ {/each}
134
+ </tbody>
135
+ </table>
136
+ <form class="new" onsubmit={(e) => { e.preventDefault(); add() }}>
137
+ <label>
138
+ <span>{t('editRanges.titleField')}</span>
139
+ <input bind:this={titleBox} type="text" bind:value={newTitle} placeholder={t('editRanges.titlePlaceholder')} spellcheck="false" />
140
+ </label>
141
+ <label>
142
+ <span>{t('editRanges.refersField')}</span>
143
+ <input type="text" bind:value={newRefers} placeholder={t('editRanges.refersPlaceholder')} spellcheck="false" />
144
+ </label>
145
+ <button type="submit" class="btn">{t('editRanges.new')}</button>
146
+ </form>
147
+ {#if problem}<p class="status problem" role="alert">{problem}</p>{/if}
148
+ </div>
149
+ {#snippet footer()}
150
+ <div class="sv-sheet-dialog-buttons">
151
+ <button type="button" class="btn" onclick={protect}>{t('editRanges.protectSheet')}</button>
152
+ <span class="spacer"></span>
153
+ <button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
154
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
155
+ </div>
156
+ {/snippet}
157
+ </SvModal>
158
+
159
+ <style>
160
+ .ranges { min-width: 460px; }
161
+ .list {
162
+ width: 100%;
163
+ border-collapse: collapse;
164
+ font-size: 12px;
165
+ }
166
+ .list th {
167
+ padding: 4px 8px;
168
+ text-align: left;
169
+ font-weight: 600;
170
+ color: var(--sg-muted, #616161);
171
+ border-bottom: 1px solid var(--sg-border, #d1d1d1);
172
+ }
173
+ .list td {
174
+ padding: 4px 8px;
175
+ border-bottom: 1px solid var(--sg-border, #e5e5e5);
176
+ vertical-align: middle;
177
+ }
178
+ .list td input {
179
+ width: 100%;
180
+ box-sizing: border-box;
181
+ padding: 3px 6px;
182
+ font: inherit;
183
+ color: inherit;
184
+ background: var(--sg-bg, #fff);
185
+ border: 1px solid var(--sg-border, #d1d1d1);
186
+ border-radius: 3px;
187
+ }
188
+ .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
189
+ .empty { color: var(--sg-muted, #616161); text-align: center; }
190
+ .actions { white-space: nowrap; text-align: right; }
191
+ .link {
192
+ padding: 0 4px;
193
+ font: inherit;
194
+ color: var(--sg-accent, #107c41);
195
+ background: none;
196
+ border: 0;
197
+ cursor: pointer;
198
+ }
199
+ .link:hover { text-decoration: underline; }
200
+ .new {
201
+ display: grid;
202
+ grid-template-columns: 1fr 2fr auto;
203
+ gap: 8px;
204
+ align-items: end;
205
+ margin-top: 6px;
206
+ }
207
+ .new label { display: flex; flex-direction: column; gap: 3px; font-size: 12px; }
208
+ .new input {
209
+ padding: 4px 8px;
210
+ font: inherit;
211
+ color: inherit;
212
+ background: var(--sg-bg, #fff);
213
+ border: 1px solid var(--sg-border, #d1d1d1);
214
+ border-radius: 3px;
215
+ }
216
+ .spacer { flex: 1; }
217
+ </style>