@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,145 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Goal Seek: set a formula cell to a value by changing one input
4
+ * cell. The solver restores the input while it searches and the status
5
+ * page shows what it found; OK keeps the answer through the command
6
+ * context, so it lands in the grid's history like a typed number.
7
+ */
8
+ import { useSheetText } from './sheet-text'
9
+ import { untrack } from 'svelte'
10
+ import { SvModal } from '@svgrid/grid'
11
+ import type { GridCommandContext } from '@svgrid/grid/shortcuts'
12
+ import type { Workbook } from './sheet/workbook'
13
+ import { goalSeekCell, type GoalSeekResult } from './sheet/goal-seek'
14
+ import { parseA1, colToLetters } from './sheet/address'
15
+
16
+ type Props = {
17
+ open?: boolean
18
+ workbook: Workbook
19
+ /** The command context the dialog was opened with. */
20
+ cmd: () => GridCommandContext | null
21
+ onClose?: () => void
22
+ }
23
+
24
+ let { open = $bindable(false), workbook, cmd, onClose }: Props = $props()
25
+ const t = useSheetText()
26
+
27
+ let step = $state<'ask' | 'done'>('ask')
28
+ let setCell = $state('')
29
+ let toValue = $state('')
30
+ let byCell = $state('')
31
+ let problem = $state<string | null>(null)
32
+ let found = $state<GoalSeekResult | null>(null)
33
+ let firstInput = $state<HTMLInputElement | null>(null)
34
+
35
+ // The active cell is the natural "Set cell", as it is in Excel.
36
+ $effect(() => {
37
+ if (!open) return
38
+ untrack(prepare)
39
+ })
40
+
41
+ function prepare() {
42
+ const at = cmd()?.activeCell
43
+ setCell = at ? `${colToLetters(at.colIndex)}${at.rowIndex + 1}` : ''
44
+ toValue = ''
45
+ byCell = ''
46
+ step = 'ask'
47
+ problem = null
48
+ found = null
49
+ queueMicrotask(() => firstInput?.focus())
50
+ }
51
+
52
+ function address(text: string): { row: number; col: number } | null {
53
+ const ref = parseA1(text.trim().toUpperCase())
54
+ return ref && ref.row !== null ? { row: ref.row, col: ref.col } : null
55
+ }
56
+
57
+ function solve() {
58
+ const formula = address(setCell)
59
+ const input = address(byCell)
60
+ const target = Number(toValue)
61
+ if (!formula) { problem = t('goalSeek.notAddress', { text: setCell }); return }
62
+ if (!input) { problem = t('goalSeek.notAddress', { text: byCell }); return }
63
+ if (toValue.trim() === '' || !Number.isFinite(target)) { problem = t('goalSeek.toValueNumber'); return }
64
+ const sheet = workbook.active
65
+ if (!workbook.getRaw(sheet, formula.row, formula.col).startsWith('=')) {
66
+ problem = t('goalSeek.needsFormula', { cell: setCell.toUpperCase() })
67
+ return
68
+ }
69
+ if (workbook.getRaw(sheet, input.row, input.col).startsWith('=')) {
70
+ problem = `${byCell.toUpperCase()} must contain a value, not a formula`
71
+ return
72
+ }
73
+ found = goalSeekCell(workbook, { sheet, ...formula }, { sheet, ...input }, target, { maxIterations: 100 })
74
+ problem = null
75
+ step = 'done'
76
+ }
77
+
78
+ function keep() {
79
+ const input = address(byCell)
80
+ const c = cmd()
81
+ if (!input || !found || !c) return
82
+ c.setCellValue(input.row, input.col, String(round(found.value)))
83
+ c.setActiveCell(input.row, input.col)
84
+ close()
85
+ }
86
+
87
+ function close() {
88
+ open = false
89
+ onClose?.()
90
+ }
91
+
92
+ const round = (n: number) => Number(n.toFixed(4))
93
+ const money = (n: number) => n.toLocaleString('en-US', { maximumFractionDigits: 2 })
94
+ </script>
95
+
96
+ <SvModal bind:open onClose={onClose} title={t(step === 'ask' ? 'goalSeek.title' : 'goalSeek.statusTitle')} size="sm">
97
+ {#if step === 'ask'}
98
+ <form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); solve() }}>
99
+ <label class="field">
100
+ <span>{t('goalSeek.setCell')}</span>
101
+ <input bind:this={firstInput} type="text" bind:value={setCell} spellcheck="false" />
102
+ </label>
103
+ <label class="field">
104
+ <span>{t('goalSeek.toValue')}</span>
105
+ <input type="text" bind:value={toValue} inputmode="decimal" />
106
+ </label>
107
+ <label class="field">
108
+ <span>{t('goalSeek.byChanging')}</span>
109
+ <input type="text" bind:value={byCell} spellcheck="false" />
110
+ </label>
111
+ {#if problem}<p class="status problem" role="alert">{problem}</p>{/if}
112
+ </form>
113
+ {:else if found}
114
+ <div class="sv-sheet-dialog">
115
+ <p class="lead">
116
+ {t(found.converged ? 'goalSeek.found' : 'goalSeek.notFound', { cell: setCell.toUpperCase() })}
117
+ </p>
118
+ <dl class="facts">
119
+ <dt>{t('goalSeek.target')}</dt><dd>{money(Number(toValue))}</dd>
120
+ <dt>{t('goalSeek.current')}</dt><dd>{money(found.result)}</dd>
121
+ <dt>{t('goalSeek.becomes', { cell: byCell.toUpperCase() })}</dt><dd>{money(round(found.value))}</dd>
122
+ </dl>
123
+ <p class="status">{t('goalSeek.iterations', { count: found.iterations })}</p>
124
+ </div>
125
+ {/if}
126
+ {#snippet footer()}
127
+ <div class="sv-sheet-dialog-buttons">
128
+ <button type="button" class="btn primary" onclick={step === 'ask' ? solve : keep}>{t('ok')}</button>
129
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
130
+ </div>
131
+ {/snippet}
132
+ </SvModal>
133
+
134
+ <style>
135
+ .lead { margin: 0; }
136
+ .facts {
137
+ display: grid;
138
+ grid-template-columns: auto 1fr;
139
+ gap: 4px 12px;
140
+ margin: 0;
141
+ }
142
+ .facts dt { color: var(--sg-muted, #616161); }
143
+ .facts dd { margin: 0; font-variant-numeric: tabular-nums; }
144
+ .problem { color: var(--sg-danger, #dc2626); }
145
+ </style>
@@ -0,0 +1,12 @@
1
+ import type { GridCommandContext } from '@svgrid/grid/shortcuts';
2
+ import type { Workbook } from './sheet/workbook.js';
3
+ type Props = {
4
+ open?: boolean;
5
+ workbook: Workbook;
6
+ /** The command context the dialog was opened with. */
7
+ cmd: () => GridCommandContext | null;
8
+ onClose?: () => void;
9
+ };
10
+ declare const SvSheetGoalSeek: import("svelte").Component<Props, {}, "open">;
11
+ type SvSheetGoalSeek = ReturnType<typeof SvSheetGoalSeek>;
12
+ export default SvSheetGoalSeek;
@@ -0,0 +1,149 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Insert Function: search or pick a category, choose a function,
4
+ * read its argument list and what it does, and OK starts the active cell
5
+ * on `=NAME(` with the caret inside the parentheses, where the formula
6
+ * bar's autocomplete and signature hint take over. Excel follows with a
7
+ * Function Arguments dialog; typing the arguments in place with the
8
+ * signature shown is the same information with less chrome.
9
+ */
10
+ import { useSheetText } from './sheet-text'
11
+ import { SvModal } from '@svgrid/grid'
12
+ import { functionCatalog, FUNCTION_GROUPS, type FunctionGroup, type FunctionInfo } from './sheet/function-catalog'
13
+
14
+ type Props = {
15
+ open?: boolean
16
+ onPick: (name: string) => void
17
+ onClose?: () => void
18
+ }
19
+
20
+ let { open = $bindable(false), onPick, onClose }: Props = $props()
21
+ const t = useSheetText()
22
+
23
+ const all = functionCatalog()
24
+ let search = $state('')
25
+ let group = $state<FunctionGroup | 'All'>('All')
26
+ let selected = $state<string>(all[0]?.name ?? '')
27
+ let searchInput = $state<HTMLInputElement | null>(null)
28
+
29
+ const shown = $derived.by<FunctionInfo[]>(() => {
30
+ const needle = search.trim().toUpperCase()
31
+ return all.filter((f) =>
32
+ (group === 'All' || f.group === group) &&
33
+ (needle === '' || f.name.includes(needle) || f.description.toUpperCase().includes(needle)),
34
+ )
35
+ })
36
+ const current = $derived(all.find((f) => f.name === selected) ?? null)
37
+
38
+ // The highlighted function follows the filter, so Enter always inserts
39
+ // something visible.
40
+ $effect(() => {
41
+ if (shown.length && !shown.some((f) => f.name === selected)) selected = shown[0]!.name
42
+ })
43
+ $effect(() => {
44
+ if (open) queueMicrotask(() => searchInput?.focus())
45
+ })
46
+
47
+ function ok() {
48
+ if (!current) return
49
+ onPick(current.name)
50
+ open = false
51
+ onClose?.()
52
+ }
53
+
54
+ function close() {
55
+ open = false
56
+ onClose?.()
57
+ }
58
+
59
+ function onListKey(event: KeyboardEvent) {
60
+ const index = shown.findIndex((f) => f.name === selected)
61
+ if (event.key === 'ArrowDown') {
62
+ event.preventDefault()
63
+ selected = shown[Math.min(index + 1, shown.length - 1)]?.name ?? selected
64
+ } else if (event.key === 'ArrowUp') {
65
+ event.preventDefault()
66
+ selected = shown[Math.max(index - 1, 0)]?.name ?? selected
67
+ } else if (event.key === 'Enter') {
68
+ event.preventDefault()
69
+ ok()
70
+ }
71
+ }
72
+ </script>
73
+
74
+ <SvModal bind:open onClose={onClose} title={t('insertFunction.title')} size="md">
75
+ <div class="sv-sheet-dialog insert" role="group" aria-label={t('insertFunction.title')}>
76
+ <label class="field">
77
+ <span>{t('insertFunction.search')}</span>
78
+ <input bind:this={searchInput} type="text" bind:value={search} onkeydown={onListKey} spellcheck="false" autocomplete="off" placeholder={t('insertFunction.searchPlaceholder')} />
79
+ </label>
80
+ <label class="field">
81
+ <span>{t('insertFunction.category')}</span>
82
+ <select bind:value={group}>
83
+ <option value="All">{t('insertFunction.all')}</option>
84
+ {#each FUNCTION_GROUPS as g (g)}
85
+ <option value={g}>{t(`insertFunction.group.${g}`)}</option>
86
+ {/each}
87
+ </select>
88
+ </label>
89
+ <div class="label">{t('insertFunction.select')}</div>
90
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
91
+ <ul class="list" role="listbox" aria-label={t('insertFunction.functions')} tabindex="0" onkeydown={onListKey}>
92
+ {#each shown as fn (fn.name)}
93
+ <!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_noninteractive_element_interactions -->
94
+ <li
95
+ role="option"
96
+ aria-selected={fn.name === selected}
97
+ class:selected={fn.name === selected}
98
+ onclick={() => (selected = fn.name)}
99
+ ondblclick={ok}
100
+ >{fn.name}</li>
101
+ {:else}
102
+ <li class="empty">{t('insertFunction.noMatch')}</li>
103
+ {/each}
104
+ </ul>
105
+ {#if current}
106
+ <div class="about">
107
+ <div class="signature">{current.signature}</div>
108
+ <div class="description">{current.description || t('insertFunction.noDescription')}</div>
109
+ </div>
110
+ {/if}
111
+ </div>
112
+ {#snippet footer()}
113
+ <div class="sv-sheet-dialog-buttons">
114
+ <button type="button" class="btn primary" onclick={ok} disabled={!current}>{t('ok')}</button>
115
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
116
+ </div>
117
+ {/snippet}
118
+ </SvModal>
119
+
120
+ <style>
121
+ .label { font-weight: 600; }
122
+ .insert :global(.field) { grid-template-columns: 160px 1fr; }
123
+ .list {
124
+ height: 160px;
125
+ margin: 0;
126
+ padding: 2px 0;
127
+ overflow-y: auto;
128
+ list-style: none;
129
+ background: var(--sg-bg, #fff);
130
+ border: 1px solid var(--sg-border, #d1d1d1);
131
+ border-radius: var(--sg-radius, 3px);
132
+ font-family: ui-monospace, Consolas, monospace;
133
+ font-size: 12px;
134
+ }
135
+ .list:focus { outline: none; border-color: var(--sg-accent, #217346); }
136
+ .list li {
137
+ padding: 2px 8px;
138
+ cursor: default;
139
+ }
140
+ .list li:hover { background: var(--sg-row-hover-bg, #f5f5f5); }
141
+ .list li.selected {
142
+ color: var(--sg-on-accent, #fff);
143
+ background: var(--sg-accent, #217346);
144
+ }
145
+ .list li.empty { color: var(--sg-muted, #616161); font-family: inherit; }
146
+ .about { display: flex; flex-direction: column; gap: 4px; min-height: 52px; }
147
+ .signature { font-weight: 600; font-family: ui-monospace, Consolas, monospace; font-size: 12px; }
148
+ .description { color: var(--sg-muted, #616161); }
149
+ </style>
@@ -0,0 +1,8 @@
1
+ type Props = {
2
+ open?: boolean;
3
+ onPick: (name: string) => void;
4
+ onClose?: () => void;
5
+ };
6
+ declare const SvSheetInsertFunction: import("svelte").Component<Props, {}, "open">;
7
+ type SvSheetInsertFunction = ReturnType<typeof SvSheetInsertFunction>;
8
+ export default SvSheetInsertFunction;
@@ -0,0 +1,81 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's File > Options > Formulas > Calculation options, raised to the
4
+ * Formulas tab because it is the one setting there that changes what a
5
+ * formula is worth: with iteration on a circular reference settles on its
6
+ * fixed point instead of showing #CYCLE!.
7
+ */
8
+ import { SvModal } from '@svgrid/grid'
9
+ import { useSheetText } from './sheet-text'
10
+ import type { IterationSettings } from './sheet/workbook'
11
+
12
+ type Props = {
13
+ open?: boolean
14
+ iteration: IterationSettings
15
+ onApply: (next: IterationSettings) => void
16
+ onClose?: () => void
17
+ }
18
+
19
+ let { open = $bindable(false), iteration, onApply, onClose }: Props = $props()
20
+ const t = useSheetText()
21
+
22
+ let enabled = $state(false)
23
+ let passes = $state('100')
24
+ let change = $state('0.001')
25
+ let error = $state('')
26
+ let first = $state<HTMLInputElement | null>(null)
27
+
28
+ $effect(() => {
29
+ if (!open) return
30
+ enabled = iteration.enabled
31
+ passes = String(iteration.maxIterations)
32
+ change = String(iteration.maxChange)
33
+ error = ''
34
+ queueMicrotask(() => first?.focus())
35
+ })
36
+
37
+ function ok() {
38
+ const maxIterations = Number(passes)
39
+ const maxChange = Number(change)
40
+ if (!Number.isFinite(maxIterations) || maxIterations < 1 || !Number.isFinite(maxChange) || maxChange < 0) {
41
+ error = t('iteration.badNumbers')
42
+ return
43
+ }
44
+ open = false
45
+ onApply({ enabled, maxIterations: Math.round(maxIterations), maxChange })
46
+ onClose?.()
47
+ }
48
+
49
+ function close() {
50
+ open = false
51
+ onClose?.()
52
+ }
53
+ </script>
54
+
55
+ <SvModal bind:open onClose={onClose} title={t('iteration.title')} size="sm">
56
+ <form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); ok() }}>
57
+ <label class="check"><input type="checkbox" bind:this={first} bind:checked={enabled} /> {t('iteration.enable')}</label>
58
+ <label class="field">
59
+ <span>{t('iteration.maxIterations')}</span>
60
+ <input type="number" min="1" step="1" bind:value={passes} disabled={!enabled} />
61
+ </label>
62
+ <label class="field">
63
+ <span>{t('iteration.maxChange')}</span>
64
+ <input type="number" min="0" step="0.0001" bind:value={change} disabled={!enabled} />
65
+ </label>
66
+ {#if error}<p class="error">{error}</p>{/if}
67
+ <p class="hint">{t('iteration.hint')}</p>
68
+ </form>
69
+ {#snippet footer()}
70
+ <div class="sv-sheet-dialog-buttons">
71
+ <span class="spacer"></span>
72
+ <button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
73
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
74
+ </div>
75
+ {/snippet}
76
+ </SvModal>
77
+
78
+ <style>
79
+ .spacer { flex: 1; }
80
+ .error { margin: 4px 0 0; color: var(--sg-danger, #c42b1c); font-size: 12px; }
81
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { IterationSettings } from './sheet/workbook.js';
2
+ type Props = {
3
+ open?: boolean;
4
+ iteration: IterationSettings;
5
+ onApply: (next: IterationSettings) => void;
6
+ onClose?: () => void;
7
+ };
8
+ declare const SvSheetIteration: import("svelte").Component<Props, {}, "open">;
9
+ type SvSheetIteration = ReturnType<typeof SvSheetIteration>;
10
+ export default SvSheetIteration;
@@ -0,0 +1,99 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Excel's Insert Hyperlink dialog, as the three fields that matter: where
4
+ * it goes, what the cell says, and what hovering says. Opened by
5
+ * Insert > Link or Ctrl+K, and again on a cell that already has one,
6
+ * which is how a link is edited.
7
+ */
8
+ import { SvModal } from '@svgrid/grid'
9
+ import { useSheetText } from './sheet-text'
10
+ import { isSafeLinkTarget, parseLinkTarget, type SheetLink } from './sheet/links'
11
+
12
+ type Props = {
13
+ open?: boolean
14
+ /** The link as it stands, or a blank one for a cell that has none. */
15
+ link: SheetLink
16
+ /** What the cell shows right now, offered as the text. */
17
+ text: string
18
+ /** The cell's address, for the title. */
19
+ where: string
20
+ existing?: boolean
21
+ onApply: (link: SheetLink, text: string) => void
22
+ onRemove?: () => void
23
+ onClose?: () => void
24
+ }
25
+
26
+ let { open = $bindable(false), link, text, where, existing = false, onApply, onRemove, onClose }: Props = $props()
27
+ const t = useSheetText()
28
+
29
+ let address = $state('')
30
+ let label = $state('')
31
+ let tip = $state('')
32
+ let error = $state('')
33
+ let first = $state<HTMLInputElement | null>(null)
34
+
35
+ $effect(() => {
36
+ if (!open) return
37
+ address = link.target
38
+ label = text
39
+ tip = link.tip ?? ''
40
+ error = ''
41
+ queueMicrotask(() => first?.focus())
42
+ })
43
+
44
+ function ok() {
45
+ const target = parseLinkTarget(address)
46
+ if (!target) {
47
+ // Two ways to have no target, and they are not the same mistake: an
48
+ // address nobody typed, and one carrying a scheme this shell will not
49
+ // open. Telling the second one it is empty sends the user back to a
50
+ // field that is not.
51
+ error = address.trim() && !isSafeLinkTarget(address) ? t('link.unsafeScheme') : t('link.badAddress')
52
+ return
53
+ }
54
+ const next: SheetLink = { target: address.trim() }
55
+ if (tip.trim()) next.tip = tip.trim()
56
+ open = false
57
+ onApply(next, label)
58
+ onClose?.()
59
+ }
60
+
61
+ function close() {
62
+ open = false
63
+ onClose?.()
64
+ }
65
+ </script>
66
+
67
+ <SvModal bind:open onClose={onClose} title={`${t('link.title')} – ${where}`} size="sm">
68
+ <form class="sv-sheet-dialog" onsubmit={(e) => { e.preventDefault(); ok() }}>
69
+ <label class="field">
70
+ <span>{t('link.address')}</span>
71
+ <input type="text" bind:this={first} bind:value={address} spellcheck="false" placeholder={t('link.addressPlaceholder')} />
72
+ </label>
73
+ <label class="field">
74
+ <span>{t('link.text')}</span>
75
+ <input type="text" bind:value={label} placeholder={t('link.textPlaceholder')} />
76
+ </label>
77
+ <label class="field">
78
+ <span>{t('link.tip')}</span>
79
+ <input type="text" bind:value={tip} placeholder={t('link.tipPlaceholder')} />
80
+ </label>
81
+ {#if error}<p class="error">{error}</p>{/if}
82
+ <p class="hint">{t('link.hint')}</p>
83
+ </form>
84
+ {#snippet footer()}
85
+ <div class="sv-sheet-dialog-buttons">
86
+ {#if existing && onRemove}
87
+ <button type="button" class="btn" onclick={() => { open = false; onRemove?.() }}>{t('link.remove')}</button>
88
+ {/if}
89
+ <span class="spacer"></span>
90
+ <button type="button" class="btn primary" onclick={ok}>{t('ok')}</button>
91
+ <button type="button" class="btn" onclick={close}>{t('cancel')}</button>
92
+ </div>
93
+ {/snippet}
94
+ </SvModal>
95
+
96
+ <style>
97
+ .spacer { flex: 1; }
98
+ .error { margin: 4px 0 0; color: var(--sg-danger, #c42b1c); font-size: 12px; }
99
+ </style>
@@ -0,0 +1,17 @@
1
+ import { type SheetLink } from './sheet/links.js';
2
+ type Props = {
3
+ open?: boolean;
4
+ /** The link as it stands, or a blank one for a cell that has none. */
5
+ link: SheetLink;
6
+ /** What the cell shows right now, offered as the text. */
7
+ text: string;
8
+ /** The cell's address, for the title. */
9
+ where: string;
10
+ existing?: boolean;
11
+ onApply: (link: SheetLink, text: string) => void;
12
+ onRemove?: () => void;
13
+ onClose?: () => void;
14
+ };
15
+ declare const SvSheetLink: import("svelte").Component<Props, {}, "open">;
16
+ type SvSheetLink = ReturnType<typeof SvSheetLink>;
17
+ export default SvSheetLink;
@@ -0,0 +1,91 @@
1
+ <script lang="ts">
2
+ /**
3
+ * The list a validated cell drops down: Excel's in-cell dropdown. The
4
+ * choices as the rule lists them, the current value marked, arrow keys
5
+ * and Enter to pick, Escape to leave the cell as it is. The shell mounts
6
+ * it inside the popover anchored to the cell.
7
+ */
8
+ import { useSheetText } from './sheet-text'
9
+ type Props = {
10
+ choices: ReadonlyArray<string>
11
+ /** The cell's current text, marked in the list. */
12
+ value: string
13
+ onPick: (choice: string) => void
14
+ onCancel: () => void
15
+ }
16
+
17
+ let { choices, value, onPick, onCancel }: Props = $props()
18
+ const t = useSheetText()
19
+
20
+ let list = $state<HTMLDivElement | null>(null)
21
+ let index = $state(0)
22
+
23
+ $effect(() => {
24
+ const at = choices.findIndex((c) => c.toLowerCase() === value.trim().toLowerCase())
25
+ index = at >= 0 ? at : 0
26
+ queueMicrotask(() => list?.focus())
27
+ })
28
+
29
+ function onKeyDown(event: KeyboardEvent) {
30
+ if (event.key === 'ArrowDown') { event.preventDefault(); index = Math.min(index + 1, choices.length - 1); scrollTo() }
31
+ else if (event.key === 'ArrowUp') { event.preventDefault(); index = Math.max(index - 1, 0); scrollTo() }
32
+ else if (event.key === 'Home') { event.preventDefault(); index = 0; scrollTo() }
33
+ else if (event.key === 'End') { event.preventDefault(); index = choices.length - 1; scrollTo() }
34
+ else if (event.key === 'Enter' || event.key === 'Tab') { event.preventDefault(); const c = choices[index]; if (c !== undefined) onPick(c) }
35
+ else if (event.key === 'Escape') { event.preventDefault(); onCancel() }
36
+ }
37
+
38
+ function scrollTo() {
39
+ list?.querySelector<HTMLElement>(`[data-index="${index}"]`)?.scrollIntoView({ block: 'nearest' })
40
+ }
41
+ </script>
42
+
43
+ <div
44
+ bind:this={list}
45
+ class="sv-sheet-list-picker"
46
+ role="listbox"
47
+ aria-label={t('choices')}
48
+ tabindex="0"
49
+ aria-activedescendant={choices.length ? `sv-sheet-choice-${index}` : undefined}
50
+ onkeydown={onKeyDown}
51
+ >
52
+ {#if choices.length === 0}
53
+ <div class="empty">{t('listEmpty')}</div>
54
+ {:else}
55
+ {#each choices as choice, i (i)}
56
+ <!-- svelte-ignore a11y_click_events_have_key_events, a11y_interactive_supports_focus -->
57
+ <div
58
+ id={`sv-sheet-choice-${i}`}
59
+ class="choice"
60
+ class:on={i === index}
61
+ role="option"
62
+ aria-selected={i === index}
63
+ data-index={i}
64
+ onpointermove={() => (index = i)}
65
+ onclick={() => onPick(choice)}
66
+ >{choice}</div>
67
+ {/each}
68
+ {/if}
69
+ </div>
70
+
71
+ <style>
72
+ .sv-sheet-list-picker {
73
+ min-width: 120px;
74
+ max-width: 320px;
75
+ max-height: 200px;
76
+ overflow-y: auto;
77
+ padding: 4px 0;
78
+ font-size: 12px;
79
+ color: var(--sg-fg, #242424);
80
+ outline: none;
81
+ }
82
+ .choice {
83
+ padding: 4px 10px;
84
+ white-space: nowrap;
85
+ overflow: hidden;
86
+ text-overflow: ellipsis;
87
+ cursor: default;
88
+ }
89
+ .choice.on { background: var(--sg-selection-bg, rgba(16, 124, 65, 0.12)); }
90
+ .empty { padding: 4px 10px; color: var(--sg-muted, #616161); }
91
+ </style>
@@ -0,0 +1,10 @@
1
+ type Props = {
2
+ choices: ReadonlyArray<string>;
3
+ /** The cell's current text, marked in the list. */
4
+ value: string;
5
+ onPick: (choice: string) => void;
6
+ onCancel: () => void;
7
+ };
8
+ declare const SvSheetListPicker: import("svelte").Component<Props, {}, "">;
9
+ type SvSheetListPicker = ReturnType<typeof SvSheetListPicker>;
10
+ export default SvSheetListPicker;