@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,73 @@
1
+ /**
2
+ * Goal Seek: find the input value that makes a formula cell hit a target.
3
+ *
4
+ * "What interest rate makes the monthly payment 1500?" You know the answer
5
+ * you want and one cell you are willing to change; the solver finds it.
6
+ *
7
+ * The method is secant with a bisection fallback, not Newton. Newton needs a
8
+ * derivative, and the function here is "recalculate a spreadsheet", which has
9
+ * no analytic one. Secant approximates the slope from two evaluations, which
10
+ * is the same information a numerical derivative would cost anyway.
11
+ *
12
+ * Bisection is the fallback because secant is fast but not safe: it can step
13
+ * to infinity on a flat stretch or oscillate on a kink. When a bracket is
14
+ * known - two inputs whose results straddle the target - bisection cannot
15
+ * fail, only be slow. Trying secant first and falling back keeps the common
16
+ * case quick and the awkward case terminating.
17
+ */
18
+ export type GoalSeekOptions = {
19
+ /** Stop once the result is this close to the target. */
20
+ tolerance?: number;
21
+ /** Give up after this many recalculations. */
22
+ maxIterations?: number;
23
+ /** Where to start looking. Defaults to the input cell's current value. */
24
+ initialGuess?: number;
25
+ /** Keep the answer inside these bounds. A rate solver wants [0, 1]. */
26
+ min?: number;
27
+ max?: number;
28
+ };
29
+ export type GoalSeekResult = {
30
+ /** Whether the target was reached within tolerance. */
31
+ converged: boolean;
32
+ /** The input value found. Present even when it did not converge, so a
33
+ * caller can show the closest attempt rather than nothing. */
34
+ value: number;
35
+ /** What the formula produced at that input. */
36
+ result: number;
37
+ iterations: number;
38
+ /** Why it stopped, when it did not converge. */
39
+ reason?: 'maxIterations' | 'notNumeric' | 'flat' | 'outOfBounds';
40
+ };
41
+ /**
42
+ * Solve `evaluate(input) = target` for `input`.
43
+ *
44
+ * `evaluate` sets the input cell, recalculates, and returns the formula
45
+ * cell's value. It is called many times, so it should be the workbook's own
46
+ * recalculation rather than anything that touches the DOM.
47
+ *
48
+ * The caller owns the input cell: this never writes. It reports the value it
49
+ * found and lets the caller decide whether to keep it, which is what makes
50
+ * Excel's "Goal Seek found a solution / OK or Cancel" dialog possible.
51
+ */
52
+ export declare function goalSeek(evaluate: (input: number) => unknown, target: number, start: number, options?: GoalSeekOptions): GoalSeekResult;
53
+ /** What `goalSeekCell` needs of a workbook. */
54
+ export type GoalSeekSheet = {
55
+ getRaw(sheet: string, row: number, col: number): string;
56
+ setRaw(sheet: string, row: number, col: number, text: string): void;
57
+ getValue(sheet: string, row: number, col: number): unknown;
58
+ };
59
+ export type CellAddress = {
60
+ sheet: string;
61
+ row: number;
62
+ col: number;
63
+ };
64
+ /**
65
+ * Goal Seek over a workbook: change `input` until `formula` reads `target`.
66
+ *
67
+ * The input cell is RESTORED before returning, whatever the outcome. The
68
+ * solver writes to it dozens of times while searching, and leaving the last
69
+ * probe behind would be worse than not running: Excel shows you the answer
70
+ * and asks before keeping it, which it cannot do if the sheet has already
71
+ * moved. Apply `result.value` yourself once the user says yes.
72
+ */
73
+ export declare function goalSeekCell(book: GoalSeekSheet, formula: CellAddress, input: CellAddress, target: number, options?: GoalSeekOptions): GoalSeekResult;
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Goal Seek: find the input value that makes a formula cell hit a target.
3
+ *
4
+ * "What interest rate makes the monthly payment 1500?" You know the answer
5
+ * you want and one cell you are willing to change; the solver finds it.
6
+ *
7
+ * The method is secant with a bisection fallback, not Newton. Newton needs a
8
+ * derivative, and the function here is "recalculate a spreadsheet", which has
9
+ * no analytic one. Secant approximates the slope from two evaluations, which
10
+ * is the same information a numerical derivative would cost anyway.
11
+ *
12
+ * Bisection is the fallback because secant is fast but not safe: it can step
13
+ * to infinity on a flat stretch or oscillate on a kink. When a bracket is
14
+ * known - two inputs whose results straddle the target - bisection cannot
15
+ * fail, only be slow. Trying secant first and falling back keeps the common
16
+ * case quick and the awkward case terminating.
17
+ */
18
+ const DEFAULTS = {
19
+ tolerance: 1e-7,
20
+ maxIterations: 100,
21
+ };
22
+ /**
23
+ * Solve `evaluate(input) = target` for `input`.
24
+ *
25
+ * `evaluate` sets the input cell, recalculates, and returns the formula
26
+ * cell's value. It is called many times, so it should be the workbook's own
27
+ * recalculation rather than anything that touches the DOM.
28
+ *
29
+ * The caller owns the input cell: this never writes. It reports the value it
30
+ * found and lets the caller decide whether to keep it, which is what makes
31
+ * Excel's "Goal Seek found a solution / OK or Cancel" dialog possible.
32
+ */
33
+ export function goalSeek(evaluate, target, start, options = {}) {
34
+ const tolerance = options.tolerance ?? DEFAULTS.tolerance;
35
+ const maxIterations = options.maxIterations ?? DEFAULTS.maxIterations;
36
+ const min = options.min ?? Number.NEGATIVE_INFINITY;
37
+ const max = options.max ?? Number.POSITIVE_INFINITY;
38
+ let iterations = 0;
39
+ const clamp = (x) => Math.min(Math.max(x, min), max);
40
+ /** The signed distance from the target. Zero is the answer. */
41
+ const f = (x) => {
42
+ iterations += 1;
43
+ const raw = evaluate(x);
44
+ const n = typeof raw === 'number' ? raw : Number(raw);
45
+ return Number.isFinite(n) ? n - target : null;
46
+ };
47
+ let x0 = clamp(options.initialGuess ?? start);
48
+ let f0 = f(x0);
49
+ if (f0 === null) {
50
+ return { converged: false, value: x0, result: NaN, iterations, reason: 'notNumeric' };
51
+ }
52
+ if (Math.abs(f0) <= tolerance) {
53
+ return { converged: true, value: x0, result: f0 + target, iterations };
54
+ }
55
+ // A second point, offset enough to see a slope. Scaling with the guess
56
+ // matters: a fixed step of 1 is enormous next to an interest rate of 0.05
57
+ // and invisible next to a loan of 300000.
58
+ let x1 = clamp(x0 !== 0 ? x0 * 1.1 : 1);
59
+ if (x1 === x0)
60
+ x1 = clamp(x0 + 1);
61
+ let f1 = f(x1);
62
+ if (f1 === null) {
63
+ return { converged: false, value: x0, result: f0 + target, iterations, reason: 'notNumeric' };
64
+ }
65
+ /** Best seen so far, so a failure still reports the closest attempt. */
66
+ let best = Math.abs(f0) <= Math.abs(f1) ? { x: x0, fx: f0 } : { x: x1, fx: f1 };
67
+ const bracket = { lo: null, hi: null };
68
+ const noteBracket = (a, b) => {
69
+ if (a.fx === 0 || b.fx === 0)
70
+ return;
71
+ if ((a.fx < 0) !== (b.fx < 0)) {
72
+ bracket.lo = a.fx < 0 ? a : b;
73
+ bracket.hi = a.fx < 0 ? b : a;
74
+ }
75
+ };
76
+ noteBracket({ x: x0, fx: f0 }, { x: x1, fx: f1 });
77
+ while (iterations < maxIterations) {
78
+ if (Math.abs(f1) <= tolerance) {
79
+ return { converged: true, value: x1, result: f1 + target, iterations };
80
+ }
81
+ let next;
82
+ const slope = f1 - f0;
83
+ if (slope === 0) {
84
+ // Flat between the two points. Secant divides by this, so bisect if a
85
+ // bracket exists and give up if not - a genuinely flat function has no
86
+ // solution to find.
87
+ const { lo, hi } = bracket;
88
+ if (!lo || !hi) {
89
+ return { converged: false, value: best.x, result: best.fx + target, iterations, reason: 'flat' };
90
+ }
91
+ next = (lo.x + hi.x) / 2;
92
+ }
93
+ else {
94
+ next = x1 - f1 * ((x1 - x0) / slope);
95
+ // Secant can step anywhere, including outside a bracket we already
96
+ // trust. Bisect instead when it does.
97
+ const { lo, hi } = bracket;
98
+ const outside = !Number.isFinite(next) ||
99
+ (lo !== null && hi !== null && (next < Math.min(lo.x, hi.x) || next > Math.max(lo.x, hi.x)));
100
+ if (outside)
101
+ next = lo && hi ? (lo.x + hi.x) / 2 : clamp(next);
102
+ }
103
+ next = clamp(next);
104
+ if (next === x1) {
105
+ // Clamped against a bound and cannot move.
106
+ return {
107
+ converged: false, value: best.x, result: best.fx + target, iterations,
108
+ reason: Number.isFinite(min) || Number.isFinite(max) ? 'outOfBounds' : 'flat',
109
+ };
110
+ }
111
+ const fNext = f(next);
112
+ if (fNext === null) {
113
+ return { converged: false, value: best.x, result: best.fx + target, iterations, reason: 'notNumeric' };
114
+ }
115
+ if (Math.abs(fNext) < Math.abs(best.fx))
116
+ best = { x: next, fx: fNext };
117
+ noteBracket({ x: x1, fx: f1 }, { x: next, fx: fNext });
118
+ x0 = x1;
119
+ f0 = f1;
120
+ x1 = next;
121
+ f1 = fNext;
122
+ }
123
+ if (Math.abs(f1) <= tolerance) {
124
+ return { converged: true, value: x1, result: f1 + target, iterations };
125
+ }
126
+ return {
127
+ converged: false, value: best.x, result: best.fx + target,
128
+ iterations, reason: 'maxIterations',
129
+ };
130
+ }
131
+ /**
132
+ * Goal Seek over a workbook: change `input` until `formula` reads `target`.
133
+ *
134
+ * The input cell is RESTORED before returning, whatever the outcome. The
135
+ * solver writes to it dozens of times while searching, and leaving the last
136
+ * probe behind would be worse than not running: Excel shows you the answer
137
+ * and asks before keeping it, which it cannot do if the sheet has already
138
+ * moved. Apply `result.value` yourself once the user says yes.
139
+ */
140
+ export function goalSeekCell(book, formula, input, target, options = {}) {
141
+ const original = book.getRaw(input.sheet, input.row, input.col);
142
+ const startText = original.trim();
143
+ const start = Number(startText);
144
+ try {
145
+ return goalSeek((x) => {
146
+ book.setRaw(input.sheet, input.row, input.col, String(x));
147
+ return book.getValue(formula.sheet, formula.row, formula.col);
148
+ }, target, Number.isFinite(start) ? start : 0, options);
149
+ }
150
+ finally {
151
+ book.setRaw(input.sheet, input.row, input.col, original);
152
+ }
153
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * `@svgrid/enterprise/sheet` - the Excel keyboard layer on its own subpath.
3
+ *
4
+ * Importing the package barrel pulls every module it reaches into the chunk
5
+ * (the package sets no `sideEffects` flag), which for an app that only wants
6
+ * the shortcuts would mean shipping export, pivot, the scheduler and the board
7
+ * as well. This subpath is the shortcuts and nothing else. It matters more once
8
+ * the formula engine lands beside them in phase 2.
9
+ */
10
+ export { enableSheet } from '../sheet-enable.js';
11
+ export { createTableRegistry, isValidTableName, resolveTableRange, columnIndexOf, rowCountOf, type TableRegion, type TableRegistry, type TableRange, type TableSpecifier, } from './tables.js';
12
+ export { TABLE_STYLES, DEFAULT_TABLE_STYLE, NO_TABLE_STYLE, findTableStyle, tableStyleColours, tableStyleLabel, type TableStyle, type TableStyleTone, type TableStyleColours, } from './table-styles.js';
13
+ export { goalSeek, goalSeekCell, type GoalSeekOptions, type GoalSeekResult, type GoalSeekSheet, type CellAddress as GoalSeekCellAddress, } from './goal-seek.js';
14
+ export { evaluationSteps, printNode, printValue, type EvaluationStep, } from './evaluate-steps.js';
15
+ export { checkSheet, describeFinding, ERROR_MEANINGS, type ErrorFinding, type ErrorFindingKind, type SheetReader, } from './error-check.js';
16
+ export { imageCall, isDrawableImageSource, type ImageCall } from './cell-images.js';
17
+ export { livePresence, presenceOnSheet, presenceAnchor, presenceColour, presenceInitials, PRESENCE_COLOURS, type SheetPresence, } from './presence.js';
18
+ export { default as SvSheetTabs } from '../SvSheetTabs.svelte';
19
+ export { createWorkbook, isValidSheetName, cleanIteration, DEFAULT_ITERATION, type Workbook, type SheetData, type WorkbookOptions, type IterationSettings, } from './workbook.js';
20
+ export { setWorkbook, getWorkbook } from './shortcuts.js';
21
+ export { createSheetDocument, type SheetDocument, type SheetDocumentInit, type SheetState, type SheetStateEntry, type PerSheetState, type SheetChangeReason, } from './document.js';
22
+ export { shiftRect, shiftRects, subtractRect, rectContains, rectsIntersect, remapNotes, lineShift, type NotesMap } from './rects.js';
23
+ export { isLocked, cellLocked, inEditRange, rectsHaveLocked, rectsMixLocked, PROTECTED_MESSAGE, PROTECTION_PERMISSIONS, defaultProtection, copyProtection, newEditRangeId, parseRangeText, rangeText, type ProtectionAllow, type ProtectionPermission, type EditRange, type SheetProtection, } from './protection.js';
24
+ export { commentAt, withComment, withThread, threadAt, threadOf, threadText, notesOf, isThreaded, listComments, nextComment, type CommentEntry, type CommentThread, type CommentValue, type CommentsMap, } from './comments.js';
25
+ export { ruleAt, rulesIn, checkEntry, listChoices, shiftValidation, removeValidation, describeRule, dateValue, validationId, DEFAULT_ALERT_MESSAGE, OPERATOR_LABELS, type ValidationRule, type ValidationAllow, type ValidationOperator, type ValidationContext, type ValidationVerdict, type ValidationSpec, } from './validation.js';
26
+ export { ruleStats, evaluateCf, shiftCf, removeCf, cfIn, describeCf, scaleColor, iconIndex, hasStyle, cfId, CF_PRESET_STYLES, COLOR_SCALES, DATA_BAR_COLOR, DATA_BAR_NEGATIVE_COLOR, type CfRule, type CfRuleBody, type CfStyledRule, type CfBody, type CfPreset, type CfStyle, type CfStats, type CfResult, type CfContext, type CfOperator, type CfTextMatch, type CfIconSet, type CfScaleColors, type CfKind, } from './conditional-formats.js';
27
+ export { mergePlan, unmergePlan, mergeDropsValues, mergesIn, mergeAt as sheetMergeAt, isCoveredCell, selectionMerged, toGridMerges, sortBlockedByMerges, reorderMerges, normalRect, type MergeKind, type MergePlan, } from './merges.js';
28
+ export { distinctValues, hiddenRowsFor, passesFilter, isFiltering, withColumnFilter, valuesFilter, shiftAutoFilter, describeFilter, datePeriodBounds, distinctFills, isDateColumn, type AutoFilterState, type ColumnFilter, type FilterCondition, type FilterValue, type DatePeriod, type FilterContext, } from './auto-filter.js';
29
+ export { sortOrder, guessHeaderRow, type SortKey, type SortDirection } from './sort.js';
30
+ export { documentToXlsxParts, documentFromXlsxParts, documentToXlsx, documentFromXlsx } from './xlsx-document.js';
31
+ export { csvText, csvRows, guessCsvSeparator, sheetStateFromCsv } from './csv.js';
32
+ export { sheetStateFromOds, documentFromOds, documentToOds, documentToOdsParts, formulaFromOdf, formulaToOdf } from './ods-document.js';
33
+ export { sheetStateFromXls, documentFromXls, documentToXls, isXlsFile } from './xls-document.js';
34
+ export { documentFromFile, readSpreadsheetFile, type OpenedFile } from './open-file.js';
35
+ export { defaultPageSetup, copyPageSetup, marginPresetOf, shiftPageSetup, marginsCss, MARGIN_PRESETS, PAPER_SIZES, type PageSetup, type PageMargins, type PageOrientation, type PaperSize, type MarginPreset, } from './page-setup.js';
36
+ export { sheetPrintHtml, printAreas, type SheetPrintInput, type SheetPrintCell } from './print.js';
37
+ export { sheetCellsFromRows, cellTextOf, type SheetField, type SheetFromRowsOptions } from './from-rows.js';
38
+ export { builtinEngine, type SheetEngine, type SheetEngineHost, type SheetEngineCell, type SheetEngineResult } from './engine.js';
39
+ export { chartSpecOf, chartFromRange, shiftObject, shiftObjects, objectAt, copyObject, objectId, SHEET_CHART_TYPES, type SheetObject, type SheetChartObject, type SheetImageObject, type ObjectAnchor, type SheetChartType, } from './objects.js';
40
+ export { sparklineSeries, sparklineAt, sparklineScale, sparklinesFromRange, clearSparklines, shiftSparkline, shiftSparklines, copySparkline, sparklineId, isColumnLocation, SPARKLINE_TYPES, type SparklineGroup, type SheetSparklineType, } from './sparklines.js';
41
+ export { pivotFields, pivotFieldValues, pivotRecords, filteredRecords, pivotBlock, pivotLayout, pivotDrill, pivotFromRange, pivotWrittenRect, flattenPivotColumns, ALL_VALUES, shiftPivot, shiftPivots, copyPivot, pivotId, SHEET_PIVOT_AGGS, type SheetPivot, type SheetPivotValue, type SheetPivotAgg, type SheetPivotFilter, type PivotLayout, type PivotDrill, } from './pivot-range.js';
42
+ export { createDeltaStream, applySheetDelta, partsOfReasons, type SheetDelta, type SheetDeltaStream, type SheetDeltaOptions, type SheetCellWrite, } from './delta.js';
43
+ export { linkAt, setLink, removeLink, listLinks, shiftLinks, copyLinks, parseLinkTarget, isSafeLinkTarget, linkTitle, type SheetLink, type LinksMap, type LinkTarget, } from './links.js';
44
+ export { default as SvSheetSort } from '../SvSheetSort.svelte';
45
+ export { splitText, textToColumns, guessDelimiter, findDuplicates, removeDuplicates, type SplitOptions, type DuplicateOptions, type DuplicateReport, } from './transforms.js';
46
+ export { insertRows, deleteRows, insertColumns, deleteColumns, axisForSelection, setStructureTarget, getStructureTarget, rewriteFormulas, type StructureTarget, } from './structure.js';
47
+ export { findAll, findNext, replaceOne, replaceAll, replaceInText, cellMatches, setFindTarget, getFindTarget, type FindOptions, type FindHit, type FindTarget, } from './find-replace.js';
48
+ export { splitFrozenRows, frozenColumnIds, applyFreeze, freezeAtActiveCell, freezeTopRow, freezeFirstColumn, unfreeze, type FreezeState, type FreezeSplit, } from './freeze.js';
49
+ export { buildClipboardPayload, parseClipboard, parseClipboardText, parseClipboardHtml, readClipboardOrigin, anchorForeignFormulas, resolvePasteCell, planPaste, msoNumberFormat, numFmtFromMso, isR1C1, r1c1ToA1, type PasteSpecialOptions, type PasteWhat, type PasteOperation, type ClipboardCell, type ClipboardGrid, type PasteResolution, } from './paste-special.js';
50
+ export { setFindReplaceHandler, setPasteSpecialHandler } from './shortcuts.js';
51
+ export { default as SvFormulaBar } from '../SvFormulaBar.svelte';
52
+ export { default as SvSheet } from '../SvSheet.svelte';
53
+ export { default as SvSheetRibbon } from '../SvSheetRibbon.svelte';
54
+ export { RIBBON_TABS, ribbonItems, withDecimals, applyBorders, type RibbonTab, type RibbonGroup, type RibbonItem, type RibbonOption, type RibbonItemKind, type RibbonActionId, type BorderPreset, } from './ribbon.js';
55
+ export { RIBBON_ICONS, RIBBON_ICON_NAMES, type RibbonIconName, type IconPath } from './ribbon-icons.js';
56
+ export { THEME_COLOURS, STANDARD_COLOURS, ALL_COLOURS, tint, type PaletteColour } from './palette.js';
57
+ export { default as SvRibbonIcon } from '../SvRibbonIcon.svelte';
58
+ export { move, selectRegion, selectLine, applyFormat, toggleFormat, preset, autoSum, structural, switchSheet, gridOf, } from './shortcuts.js';
59
+ export { compileNumberFormat, formatWithPattern, FORMAT_PRESETS, FORMAT_CATEGORY_PATTERNS, SPECIAL_FORMATS, formatCategory, accountingPattern, accountingParts, type CompiledFormat, type FormatPresetName, type SpecialFormatName, } from './number-format.js';
60
+ export { createFormatStore, entryToStyle, type SheetFormatStore, type CellFormatEntry, type CellAddressLookup, } from './format-store.js';
61
+ export { createNames, isValidName, type SheetNames, type DefinedName, } from './names.js';
62
+ export { defaultSheetMessages, defaultSheetTextMessages, defaultDialogMessages, ribbonMessageDefaults, resolveSheetMessages, formatMessage, type SheetMessages, type SheetTextMessages, type SheetDialogMessages, type SheetLocalization, } from './messages.js';
63
+ export { suggestFunctions, applySuggestion, signatureAt, partialAt, SIGNATURES, type FunctionSuggestion, } from './autocomplete.js';
64
+ export { setFormatTarget, getFormatTarget, setFormatDialogHandler, type SheetFormatTarget, } from './shortcuts.js';
65
+ export { parseFormula, parse, } from './parse.js';
66
+ export { tokenize, type Token } from './tokenize.js';
67
+ export { evaluate, evaluateSpill, formatValue, type EvalContext } from './evaluate.js';
68
+ export { ARRAY_FUNCTIONS, type ArrayFunction, type Grid as SpillGrid } from './packs/array.js';
69
+ export { FUNCTIONS, withCustomFunctions, type SheetFunction, type FnArgs, } from './functions.js';
70
+ export { translateFormula, fixupReferences, renameSheetReferences, formatFormula, referenceSpans, repointReferences, REFERENCE_COLOURS, type StructuralEdit, type EditScope, type ReferenceSpan, type CellMove, } from './refs.js';
71
+ export { createDependencyGraph, precedentsOf, cellKey, parseCellKey, type DependencyGraph, type CellKey, } from './deps.js';
72
+ export { parseA1, formatA1, colToLetters, lettersToCol, type CellRef, } from './address.js';
73
+ export { isError, type CellValue, type SheetError, type Node as FormulaNode, } from './ast.js';
74
+ export { SHEET_BINDINGS, handleSheetKey, type SheetBinding, type SheetCommand, } from './shortcuts.js';
75
+ export { edgeOfRegion, currentRegion, isWholeSheet, wholeSheet, isBlankValue, type Direction, type Grid, type Cell, type Rect, } from './navigate.js';
76
+ export { fillDown, fillRight, fillSelection, stampDate, stampNow, copyFromAbove, copyValueFromAbove, guessSumRange, looksNumeric, numericAt, targetRect, setFillTranslator, setSheetValueProbe, getSheetValueProbe, type FillTranslator, type SheetValueProbe, } from './commands.js';
77
+ export { cultureFromLocale, formulaToCulture, formulaFromCulture, parseNumberInCulture, formatNumberInCulture, slashDateParts, isInvariant, INVARIANT_CULTURE, type SheetCulture, } from './culture.js';
78
+ export { emptyOutline, groupLines, ungroupLines, clearOutline, toggleCollapsed, showLevel, hiddenByOutline, detailRange, shiftOutline, autoOutline, outlineLevel, isOutlined, deepestLevel, MAX_OUTLINE_LEVEL, type OutlineState, type OutlineSide, } from './outline.js';
79
+ export { cellTypeAt, isChecked, toggledValue, radioIndex, applyCellType, removeCellTypes, shiftCellTypes, checkboxValues, newCellTypeId, copyCellType, CHECKED, UNCHECKED, type CellTypeRegion, type CellTypeKind, } from './cell-types.js';
80
+ export { projectGridSheet, rowOfRecord, recordOfRow, isRecordRow, columnOfField, copyGridSheet, coerceFieldValue, emptyGridSheet, type SheetKind, type GridSheetSpec, type GridSheetField, } from './sheet-kinds.js';
@@ -0,0 +1,80 @@
1
+ /**
2
+ * `@svgrid/enterprise/sheet` - the Excel keyboard layer on its own subpath.
3
+ *
4
+ * Importing the package barrel pulls every module it reaches into the chunk
5
+ * (the package sets no `sideEffects` flag), which for an app that only wants
6
+ * the shortcuts would mean shipping export, pivot, the scheduler and the board
7
+ * as well. This subpath is the shortcuts and nothing else. It matters more once
8
+ * the formula engine lands beside them in phase 2.
9
+ */
10
+ export { enableSheet } from '../sheet-enable.js';
11
+ export { createTableRegistry, isValidTableName, resolveTableRange, columnIndexOf, rowCountOf, } from './tables.js';
12
+ export { TABLE_STYLES, DEFAULT_TABLE_STYLE, NO_TABLE_STYLE, findTableStyle, tableStyleColours, tableStyleLabel, } from './table-styles.js';
13
+ export { goalSeek, goalSeekCell, } from './goal-seek.js';
14
+ export { evaluationSteps, printNode, printValue, } from './evaluate-steps.js';
15
+ export { checkSheet, describeFinding, ERROR_MEANINGS, } from './error-check.js';
16
+ export { imageCall, isDrawableImageSource } from './cell-images.js';
17
+ export { livePresence, presenceOnSheet, presenceAnchor, presenceColour, presenceInitials, PRESENCE_COLOURS, } from './presence.js';
18
+ export { default as SvSheetTabs } from '../SvSheetTabs.svelte';
19
+ export { createWorkbook, isValidSheetName, cleanIteration, DEFAULT_ITERATION, } from './workbook.js';
20
+ export { setWorkbook, getWorkbook } from './shortcuts.js';
21
+ export { createSheetDocument, } from './document.js';
22
+ export { shiftRect, shiftRects, subtractRect, rectContains, rectsIntersect, remapNotes, lineShift } from './rects.js';
23
+ export { isLocked, cellLocked, inEditRange, rectsHaveLocked, rectsMixLocked, PROTECTED_MESSAGE, PROTECTION_PERMISSIONS, defaultProtection, copyProtection, newEditRangeId, parseRangeText, rangeText, } from './protection.js';
24
+ export { commentAt, withComment, withThread, threadAt, threadOf, threadText, notesOf, isThreaded, listComments, nextComment, } from './comments.js';
25
+ export { ruleAt, rulesIn, checkEntry, listChoices, shiftValidation, removeValidation, describeRule, dateValue, validationId, DEFAULT_ALERT_MESSAGE, OPERATOR_LABELS, } from './validation.js';
26
+ export { ruleStats, evaluateCf, shiftCf, removeCf, cfIn, describeCf, scaleColor, iconIndex, hasStyle, cfId, CF_PRESET_STYLES, COLOR_SCALES, DATA_BAR_COLOR, DATA_BAR_NEGATIVE_COLOR, } from './conditional-formats.js';
27
+ export { mergePlan, unmergePlan, mergeDropsValues, mergesIn, mergeAt as sheetMergeAt, isCoveredCell, selectionMerged, toGridMerges, sortBlockedByMerges, reorderMerges, normalRect, } from './merges.js';
28
+ export { distinctValues, hiddenRowsFor, passesFilter, isFiltering, withColumnFilter, valuesFilter, shiftAutoFilter, describeFilter, datePeriodBounds, distinctFills, isDateColumn, } from './auto-filter.js';
29
+ export { sortOrder, guessHeaderRow } from './sort.js';
30
+ export { documentToXlsxParts, documentFromXlsxParts, documentToXlsx, documentFromXlsx } from './xlsx-document.js';
31
+ export { csvText, csvRows, guessCsvSeparator, sheetStateFromCsv } from './csv.js';
32
+ export { sheetStateFromOds, documentFromOds, documentToOds, documentToOdsParts, formulaFromOdf, formulaToOdf } from './ods-document.js';
33
+ export { sheetStateFromXls, documentFromXls, documentToXls, isXlsFile } from './xls-document.js';
34
+ export { documentFromFile, readSpreadsheetFile } from './open-file.js';
35
+ export { defaultPageSetup, copyPageSetup, marginPresetOf, shiftPageSetup, marginsCss, MARGIN_PRESETS, PAPER_SIZES, } from './page-setup.js';
36
+ export { sheetPrintHtml, printAreas } from './print.js';
37
+ export { sheetCellsFromRows, cellTextOf } from './from-rows.js';
38
+ export { builtinEngine } from './engine.js';
39
+ export { chartSpecOf, chartFromRange, shiftObject, shiftObjects, objectAt, copyObject, objectId, SHEET_CHART_TYPES, } from './objects.js';
40
+ export { sparklineSeries, sparklineAt, sparklineScale, sparklinesFromRange, clearSparklines, shiftSparkline, shiftSparklines, copySparkline, sparklineId, isColumnLocation, SPARKLINE_TYPES, } from './sparklines.js';
41
+ export { pivotFields, pivotFieldValues, pivotRecords, filteredRecords, pivotBlock, pivotLayout, pivotDrill, pivotFromRange, pivotWrittenRect, flattenPivotColumns, ALL_VALUES, shiftPivot, shiftPivots, copyPivot, pivotId, SHEET_PIVOT_AGGS, } from './pivot-range.js';
42
+ export { createDeltaStream, applySheetDelta, partsOfReasons, } from './delta.js';
43
+ export { linkAt, setLink, removeLink, listLinks, shiftLinks, copyLinks, parseLinkTarget, isSafeLinkTarget, linkTitle, } from './links.js';
44
+ export { default as SvSheetSort } from '../SvSheetSort.svelte';
45
+ export { splitText, textToColumns, guessDelimiter, findDuplicates, removeDuplicates, } from './transforms.js';
46
+ export { insertRows, deleteRows, insertColumns, deleteColumns, axisForSelection, setStructureTarget, getStructureTarget, rewriteFormulas, } from './structure.js';
47
+ export { findAll, findNext, replaceOne, replaceAll, replaceInText, cellMatches, setFindTarget, getFindTarget, } from './find-replace.js';
48
+ export { splitFrozenRows, frozenColumnIds, applyFreeze, freezeAtActiveCell, freezeTopRow, freezeFirstColumn, unfreeze, } from './freeze.js';
49
+ export { buildClipboardPayload, parseClipboard, parseClipboardText, parseClipboardHtml, readClipboardOrigin, anchorForeignFormulas, resolvePasteCell, planPaste, msoNumberFormat, numFmtFromMso, isR1C1, r1c1ToA1, } from './paste-special.js';
50
+ export { setFindReplaceHandler, setPasteSpecialHandler } from './shortcuts.js';
51
+ export { default as SvFormulaBar } from '../SvFormulaBar.svelte';
52
+ export { default as SvSheet } from '../SvSheet.svelte';
53
+ export { default as SvSheetRibbon } from '../SvSheetRibbon.svelte';
54
+ export { RIBBON_TABS, ribbonItems, withDecimals, applyBorders, } from './ribbon.js';
55
+ export { RIBBON_ICONS, RIBBON_ICON_NAMES } from './ribbon-icons.js';
56
+ export { THEME_COLOURS, STANDARD_COLOURS, ALL_COLOURS, tint } from './palette.js';
57
+ export { default as SvRibbonIcon } from '../SvRibbonIcon.svelte';
58
+ export { move, selectRegion, selectLine, applyFormat, toggleFormat, preset, autoSum, structural, switchSheet, gridOf, } from './shortcuts.js';
59
+ export { compileNumberFormat, formatWithPattern, FORMAT_PRESETS, FORMAT_CATEGORY_PATTERNS, SPECIAL_FORMATS, formatCategory, accountingPattern, accountingParts, } from './number-format.js';
60
+ export { createFormatStore, entryToStyle, } from './format-store.js';
61
+ export { createNames, isValidName, } from './names.js';
62
+ export { defaultSheetMessages, defaultSheetTextMessages, defaultDialogMessages, ribbonMessageDefaults, resolveSheetMessages, formatMessage, } from './messages.js';
63
+ export { suggestFunctions, applySuggestion, signatureAt, partialAt, SIGNATURES, } from './autocomplete.js';
64
+ export { setFormatTarget, getFormatTarget, setFormatDialogHandler, } from './shortcuts.js';
65
+ export { parseFormula, parse, } from './parse.js';
66
+ export { tokenize } from './tokenize.js';
67
+ export { evaluate, evaluateSpill, formatValue } from './evaluate.js';
68
+ export { ARRAY_FUNCTIONS } from './packs/array.js';
69
+ export { FUNCTIONS, withCustomFunctions, } from './functions.js';
70
+ export { translateFormula, fixupReferences, renameSheetReferences, formatFormula, referenceSpans, repointReferences, REFERENCE_COLOURS, } from './refs.js';
71
+ export { createDependencyGraph, precedentsOf, cellKey, parseCellKey, } from './deps.js';
72
+ export { parseA1, formatA1, colToLetters, lettersToCol, } from './address.js';
73
+ export { isError, } from './ast.js';
74
+ export { SHEET_BINDINGS, handleSheetKey, } from './shortcuts.js';
75
+ export { edgeOfRegion, currentRegion, isWholeSheet, wholeSheet, isBlankValue, } from './navigate.js';
76
+ export { fillDown, fillRight, fillSelection, stampDate, stampNow, copyFromAbove, copyValueFromAbove, guessSumRange, looksNumeric, numericAt, targetRect, setFillTranslator, setSheetValueProbe, getSheetValueProbe, } from './commands.js';
77
+ export { cultureFromLocale, formulaToCulture, formulaFromCulture, parseNumberInCulture, formatNumberInCulture, slashDateParts, isInvariant, INVARIANT_CULTURE, } from './culture.js';
78
+ export { emptyOutline, groupLines, ungroupLines, clearOutline, toggleCollapsed, showLevel, hiddenByOutline, detailRange, shiftOutline, autoOutline, outlineLevel, isOutlined, deepestLevel, MAX_OUTLINE_LEVEL, } from './outline.js';
79
+ export { cellTypeAt, isChecked, toggledValue, radioIndex, applyCellType, removeCellTypes, shiftCellTypes, checkboxValues, newCellTypeId, copyCellType, CHECKED, UNCHECKED, } from './cell-types.js';
80
+ export { projectGridSheet, rowOfRecord, recordOfRow, isRecordRow, columnOfField, copyGridSheet, coerceFieldValue, emptyGridSheet, } from './sheet-kinds.js';
@@ -0,0 +1,57 @@
1
+ import type { StructuralEdit } from './refs.js';
2
+ export type SheetLink = {
3
+ /** Where it goes: a URL, or an address on this workbook. */
4
+ target: string;
5
+ /** Excel's ScreenTip: what hovering says, when it is not the target. */
6
+ tip?: string;
7
+ };
8
+ /** `r4` -> `B` -> the link on B5. */
9
+ export type LinksMap = Record<string, Record<string, SheetLink>>;
10
+ /** The link on a cell, or undefined. */
11
+ export declare function linkAt(links: LinksMap, row: number, col: number): SheetLink | undefined;
12
+ /** A copy with the link set on one cell. */
13
+ export declare function setLink(links: LinksMap, row: number, col: number, link: SheetLink): LinksMap;
14
+ /** A copy with the link removed from one cell, and the row dropped if empty. */
15
+ export declare function removeLink(links: LinksMap, row: number, col: number): LinksMap;
16
+ /** Every link, as rows and columns, for a writer or a test. */
17
+ export declare function listLinks(links: LinksMap): Array<{
18
+ row: number;
19
+ col: number;
20
+ link: SheetLink;
21
+ }>;
22
+ /** The links after an insert or delete: they move with their cells. */
23
+ export declare function shiftLinks(links: LinksMap, edit: StructuralEdit): LinksMap;
24
+ /** A deep enough copy to hand out or save. */
25
+ export declare function copyLinks(links: LinksMap): LinksMap;
26
+ /** Whether a target is one this shell will follow out of the page. */
27
+ export declare function isSafeLinkTarget(target: string): boolean;
28
+ export type LinkTarget = {
29
+ kind: 'external';
30
+ href: string;
31
+ } | {
32
+ kind: 'internal';
33
+ sheet: string | null;
34
+ row: number;
35
+ col: number;
36
+ } | {
37
+ kind: 'name';
38
+ name: string;
39
+ };
40
+ /**
41
+ * What a target means. An address wins over a name, so `B4` is a cell and
42
+ * `Sales` is a defined name; `Sheet1!B4` is the cell on that sheet.
43
+ */
44
+ export declare function parseLinkTarget(target: string): LinkTarget | null;
45
+ /** What a linked cell's title says: the tip, or where it goes. */
46
+ export declare function linkTitle(link: SheetLink): string;
47
+ /**
48
+ * The first argument of a top-level `=HYPERLINK(...)`, as it was written,
49
+ * so the caller can evaluate it and learn where the cell goes.
50
+ *
51
+ * Excel makes a cell holding that formula clickable, and the target is
52
+ * whatever the first argument works out to, which may be an expression
53
+ * (`"…/issues/" & A2`). Null for anything that is not that call, including
54
+ * one nested inside another formula, since only the outermost one decides
55
+ * where the cell goes.
56
+ */
57
+ export declare function hyperlinkArgument(text: string): string | null;
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Hyperlinks: Excel's Insert > Link, and the `HYPERLINK` function.
3
+ *
4
+ * A link belongs to a CELL rather than to its text, the way Excel keeps
5
+ * one: the cell still holds whatever was typed, and the link is kept beside
6
+ * it so that editing the text does not lose the target and clearing the
7
+ * cell does. That also means a link survives a format change, a sort of the
8
+ * text around it and a save, and moves with an insert or a delete.
9
+ *
10
+ * Two kinds of target, told apart by how they read rather than by a flag
11
+ * the user has to set:
12
+ *
13
+ * external `https://…`, `mailto:…`, anything with a scheme, opened in
14
+ * a new tab;
15
+ * internal `Sheet1!B4`, `B4`, or a defined name, which moves the
16
+ * selection instead of leaving the page.
17
+ *
18
+ * The map is keyed the way the comments map is (`r4` -> `B` -> the link),
19
+ * so the same `remapNotes` moves both when a row or column is inserted.
20
+ */
21
+ import { remapNotes } from './rects.js';
22
+ import { colToLetters, lettersToCol, parseA1 } from './address.js';
23
+ import { lineShift } from './rects.js';
24
+ /** The link on a cell, or undefined. */
25
+ export function linkAt(links, row, col) {
26
+ return links[`r${row}`]?.[colToLetters(col)];
27
+ }
28
+ /** A copy with the link set on one cell. */
29
+ export function setLink(links, row, col, link) {
30
+ const rowId = `r${row}`;
31
+ return { ...links, [rowId]: { ...(links[rowId] ?? {}), [colToLetters(col)]: { ...link } } };
32
+ }
33
+ /** A copy with the link removed from one cell, and the row dropped if empty. */
34
+ export function removeLink(links, row, col) {
35
+ const rowId = `r${row}`;
36
+ const line = links[rowId];
37
+ if (!line || !(colToLetters(col) in line))
38
+ return links;
39
+ const next = { ...line };
40
+ delete next[colToLetters(col)];
41
+ const out = { ...links };
42
+ if (Object.keys(next).length)
43
+ out[rowId] = next;
44
+ else
45
+ delete out[rowId];
46
+ return out;
47
+ }
48
+ /** Every link, as rows and columns, for a writer or a test. */
49
+ export function listLinks(links) {
50
+ const out = [];
51
+ for (const [rowId, line] of Object.entries(links)) {
52
+ const row = Number(rowId.slice(1));
53
+ if (!Number.isInteger(row))
54
+ continue;
55
+ for (const [columnId, link] of Object.entries(line)) {
56
+ const col = lettersToCol(columnId);
57
+ if (col >= 0)
58
+ out.push({ row, col, link: { ...link } });
59
+ }
60
+ }
61
+ return out.sort((a, b) => a.row - b.row || a.col - b.col);
62
+ }
63
+ /** The links after an insert or delete: they move with their cells. */
64
+ export function shiftLinks(links, edit) {
65
+ const rows = edit.kind === 'insertRows' || edit.kind === 'deleteRows';
66
+ return remapNotes(links, rows ? 'rows' : 'cols', lineShift(edit));
67
+ }
68
+ /** A deep enough copy to hand out or save. */
69
+ export function copyLinks(links) {
70
+ const out = {};
71
+ for (const [rowId, line] of Object.entries(links)) {
72
+ out[rowId] = Object.fromEntries(Object.entries(line).map(([c, link]) => [c, { ...link }]));
73
+ }
74
+ return out;
75
+ }
76
+ /** Anything with a scheme, or a bare `www.`, is a link out of the page. */
77
+ const EXTERNAL = /^(?:[a-z][a-z0-9+.-]*:|www\.)/i;
78
+ /**
79
+ * The schemes a cell's link may carry.
80
+ *
81
+ * A link is data: it is typed by a colleague, arrives on a delta stream, or
82
+ * comes out of a file someone sent. Following `javascript:` from one runs
83
+ * that text in the page, so the set of schemes that may be followed is
84
+ * named here rather than assumed, and anything else is not a link at all.
85
+ */
86
+ const SAFE_SCHEMES = new Set(['http', 'https', 'mailto', 'tel', 'sms', 'ftp', 'ftps']);
87
+ /** Whether a target is one this shell will follow out of the page. */
88
+ export function isSafeLinkTarget(target) {
89
+ const text = target.trim();
90
+ const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(text);
91
+ return scheme ? SAFE_SCHEMES.has(scheme[1].toLowerCase()) : true;
92
+ }
93
+ /**
94
+ * What a target means. An address wins over a name, so `B4` is a cell and
95
+ * `Sales` is a defined name; `Sheet1!B4` is the cell on that sheet.
96
+ */
97
+ export function parseLinkTarget(target) {
98
+ // Not a string at all: a state built by hand, or one from a version that
99
+ // spelled a link differently. No link, rather than a thrown TypeError
100
+ // taking a whole Save As with it.
101
+ if (typeof target !== 'string')
102
+ return null;
103
+ const text = target.trim();
104
+ if (text === '')
105
+ return null;
106
+ // A scheme that is not one of the safe ones is not a link: null rather
107
+ // than an address, so nothing downstream can follow it or write it into
108
+ // a file.
109
+ if (!isSafeLinkTarget(text))
110
+ return null;
111
+ if (EXTERNAL.test(text))
112
+ return { kind: 'external', href: text.toLowerCase().startsWith('www.') ? `https://${text}` : text };
113
+ // `Sheet1!B4` and `'Two words'!B4`: the sheet is whatever is before the
114
+ // last `!`, which `parseA1` takes as an argument rather than parsing.
115
+ const bang = text.lastIndexOf('!');
116
+ const sheet = bang < 0 ? null : text.slice(0, bang).replace(/^'(.*)'$/, '$1').replace(/''/g, "'");
117
+ const cell = bang < 0 ? text : text.slice(bang + 1);
118
+ const ref = parseA1(cell, sheet);
119
+ if (ref && ref.row !== null)
120
+ return { kind: 'internal', sheet: ref.sheet, row: ref.row, col: ref.col };
121
+ return { kind: 'name', name: text };
122
+ }
123
+ /** What a linked cell's title says: the tip, or where it goes. */
124
+ export function linkTitle(link) {
125
+ return link.tip?.trim() ? link.tip : link.target;
126
+ }
127
+ /**
128
+ * The first argument of a top-level `=HYPERLINK(...)`, as it was written,
129
+ * so the caller can evaluate it and learn where the cell goes.
130
+ *
131
+ * Excel makes a cell holding that formula clickable, and the target is
132
+ * whatever the first argument works out to, which may be an expression
133
+ * (`"…/issues/" & A2`). Null for anything that is not that call, including
134
+ * one nested inside another formula, since only the outermost one decides
135
+ * where the cell goes.
136
+ */
137
+ export function hyperlinkArgument(text) {
138
+ const m = /^=\s*HYPERLINK\s*\(/i.exec(text.trim());
139
+ if (!m)
140
+ return null;
141
+ const inside = text.trim().slice(m[0].length);
142
+ let depth = 0;
143
+ let quoted = false;
144
+ for (let i = 0; i < inside.length; i += 1) {
145
+ const ch = inside[i];
146
+ if (quoted) {
147
+ // `""` inside a string is an escaped quote, not the end of one.
148
+ if (ch === '"') {
149
+ if (inside[i + 1] === '"')
150
+ i += 1;
151
+ else
152
+ quoted = false;
153
+ }
154
+ continue;
155
+ }
156
+ if (ch === '"') {
157
+ quoted = true;
158
+ continue;
159
+ }
160
+ if (ch === '(') {
161
+ depth += 1;
162
+ continue;
163
+ }
164
+ if (ch === ')') {
165
+ if (depth === 0)
166
+ return inside.slice(0, i).trim() || null;
167
+ depth -= 1;
168
+ continue;
169
+ }
170
+ if (ch === ',' && depth === 0)
171
+ return inside.slice(0, i).trim() || null;
172
+ }
173
+ return null;
174
+ }