@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,680 @@
1
+ <script lang="ts">
2
+ /**
3
+ * The formula bar: a Name Box showing (and accepting) the active cell's
4
+ * address, and an input holding the cell's RAW text rather than its computed
5
+ * value.
6
+ *
7
+ * That split is the whole point. The grid shows `1,234.50`; the bar shows
8
+ * `=B2*C2`. Editing in the grid would otherwise mean editing the result.
9
+ *
10
+ * The bar owns no grid state. It reads the active cell and the raw text
11
+ * through props and reports edits through `onCommit`, so it works over a
12
+ * `<SvGrid>`, a plain array, or a workbook with several sheets.
13
+ */
14
+ import { useSheetText } from './sheet-text'
15
+ import {
16
+ suggestFunctions,
17
+ applySuggestion,
18
+ signatureAt,
19
+ type FunctionSuggestion,
20
+ } from './sheet/autocomplete'
21
+ import { parseA1, formatA1 } from './sheet/address'
22
+ import { cycleReference } from './sheet/edit-keys'
23
+
24
+ type Props = {
25
+ /** Active cell in display coordinates, or null when nothing is active. */
26
+ active: { rowIndex: number; colIndex: number } | null
27
+ /** The cell's raw text: a formula as typed, or the literal value. */
28
+ value: string
29
+ /**
30
+ * Called when the user commits with Enter (or the tick) or by leaving
31
+ * the field, with the cell the edit STARTED in. Leaving the field by
32
+ * clicking another cell moves `active` before the blur lands, so a
33
+ * handler that wrote to the active cell would put the text into the cell
34
+ * just clicked. `via` says which: after an Enter the sheet takes the
35
+ * focus back and the cursor moves down, as in Excel; after a blur the
36
+ * click that caused it has already placed the cursor.
37
+ */
38
+ onCommit: (text: string, cell: { rowIndex: number; colIndex: number }, via: 'enter' | 'blur') => void
39
+ /** Called when the user types an address into the Name Box. */
40
+ onNavigate?: (cell: { rowIndex: number; colIndex: number }) => void
41
+ /** Named ranges for the Name Box dropdown. */
42
+ names?: ReadonlyArray<{ name: string; refersTo: string }>
43
+ /**
44
+ * Shown in the Name Box instead of the address while set: Excel prints
45
+ * "3R x 2C" there while a range is being dragged out.
46
+ */
47
+ label?: string | null
48
+ onSelectName?: (name: string) => void
49
+ /** A name typed that is neither an address nor a name yet: Excel defines
50
+ * it for the selection. Without a handler the entry is dropped. */
51
+ onDefineName?: (name: string) => void
52
+ /** A range or a sheet-qualified address typed into the Name Box, B2:D4 or
53
+ * Orders!C3: the consumer selects it and answers true, or false when the
54
+ * text is not a reference, which the bar then defines as a name. */
55
+ onSelectReference?: (text: string) => boolean
56
+ /** The fx button: Excel's Insert Function. Without a handler the button
57
+ * is not drawn, since a button that does nothing is worse than none. */
58
+ onInsertFunction?: () => void
59
+ /** The text as it is being typed, and null once editing ends. The shell
60
+ * colours the cells a formula refers to while it is being written. */
61
+ onDraft?: (text: string | null) => void
62
+ /**
63
+ * Runs of the text to colour, as Excel colours the references in a
64
+ * formula: the shell passes `referenceSpans`. The bar lays a mirror of
65
+ * the text over the field with the runs in colour and makes the field's
66
+ * own text transparent under it, so the caret and the selection stay
67
+ * the browser's.
68
+ */
69
+ highlight?: (text: string) => ReadonlyArray<{ start: number; end: number; colour: string }>
70
+ showNameBox?: boolean
71
+ autocomplete?: boolean
72
+ disabled?: boolean
73
+ }
74
+
75
+ let {
76
+ active,
77
+ value = '',
78
+ onCommit,
79
+ onNavigate,
80
+ names = [],
81
+ label = null,
82
+ onSelectName,
83
+ onDefineName,
84
+ onSelectReference,
85
+ onInsertFunction,
86
+ onDraft,
87
+ highlight,
88
+ showNameBox = true,
89
+ autocomplete = true,
90
+ disabled = false,
91
+ }: Props = $props()
92
+ const t = useSheetText()
93
+
94
+ let draft = $state('')
95
+ let editing = $state(false)
96
+ /** The coloured runs of the draft, or none while there is nothing to colour. */
97
+ const runs = $derived.by(() => {
98
+ if (!highlight) return []
99
+ const spans = highlight(draft)
100
+ if (spans.length === 0) return []
101
+ const out: Array<{ text: string; colour: string | null }> = []
102
+ let at = 0
103
+ for (const span of spans) {
104
+ if (span.start > at) out.push({ text: draft.slice(at, span.start), colour: null })
105
+ out.push({ text: draft.slice(span.start, span.end), colour: span.colour })
106
+ at = span.end
107
+ }
108
+ if (at < draft.length) out.push({ text: draft.slice(at), colour: null })
109
+ return out
110
+ })
111
+ /** The cell being edited, pinned when editing starts. */
112
+ let editingCell: { rowIndex: number; colIndex: number } | null = null
113
+
114
+ function startEditing() {
115
+ if (editing) return
116
+ editing = true
117
+ editingCell = active
118
+ }
119
+ let caret = $state(0)
120
+ let highlighted = $state(0)
121
+ let input = $state<HTMLTextAreaElement | null>(null)
122
+ /**
123
+ * Excel's bar shows one line until it is expanded with the chevron at its
124
+ * end, and then up to six. The height never follows the active cell on
125
+ * its own: a bar that grew for a two-line cell and shrank on the next
126
+ * click would move the sheet under the pointer mid-click, so the click
127
+ * landed a row below where it was pressed. Alt+Enter typed in the bar
128
+ * expands it, since that is the user's own doing.
129
+ */
130
+ let expanded = $state(false)
131
+ const lines = $derived(draft.split('\n').length)
132
+ /**
133
+ * The lines the draft takes at the bar's width once it wraps, which is
134
+ * what the expanded bar is for: a long formula is one line of text and
135
+ * six lines on screen, and counting its line breaks gave it two rows with
136
+ * the rest cut off under `overflow: hidden`, so the chevron showed an
137
+ * empty second row and nothing more. Measured from the textarea at one
138
+ * row, where its scroll height is the text's rather than the box's.
139
+ */
140
+ let wrapped = $state(1)
141
+ /** The scrollbar's width once the bar scrolls, so the mirror wraps where the text does. */
142
+ let gutter = $state(0)
143
+ let mirror = $state<HTMLDivElement | null>(null)
144
+ $effect(() => {
145
+ void draft
146
+ if (!expanded || !input) { wrapped = 1; gutter = 0; return }
147
+ const el = input
148
+ const style = getComputedStyle(el)
149
+ const line = parseFloat(style.lineHeight) || 18
150
+ const pad = (parseFloat(style.paddingTop) || 0) + (parseFloat(style.paddingBottom) || 0)
151
+ const was = el.rows
152
+ el.rows = 1
153
+ wrapped = Math.max(1, Math.round((el.scrollHeight - pad) / line))
154
+ el.rows = was
155
+ // Read after the rows settle: the gutter is there only past six lines.
156
+ requestAnimationFrame(() => { gutter = el.offsetWidth - el.clientWidth })
157
+ })
158
+ const rows = $derived(expanded ? Math.min(6, Math.max(2, lines, wrapped)) : 1)
159
+ let nameBoxText = $state('')
160
+ /** True while the Name Box has focus, which is when it shows a draft. */
161
+ let nameBoxTyping = $state(false)
162
+
163
+ // Follow the active cell while the user is not mid-edit. Clobbering the
164
+ // draft on every selection change would throw away half-typed formulas.
165
+ $effect(() => {
166
+ const incoming = value
167
+ if (!editing) draft = incoming
168
+ })
169
+
170
+ const address = $derived(
171
+ active
172
+ ? formatA1({
173
+ col: active.colIndex, colAbs: false,
174
+ row: active.rowIndex, rowAbs: false, sheet: null,
175
+ })
176
+ : '',
177
+ )
178
+
179
+ const suggestions = $derived<FunctionSuggestion[]>(
180
+ autocomplete && editing ? suggestFunctions(draft, caret) : [],
181
+ )
182
+ const hint = $derived(editing ? signatureAt(draft, caret) : null)
183
+
184
+ function syncCaret(event: Event) {
185
+ const el = event.currentTarget as HTMLTextAreaElement
186
+ caret = el.selectionStart ?? el.value.length
187
+ }
188
+
189
+ function accept(suggestion: FunctionSuggestion) {
190
+ const next = applySuggestion(draft, suggestion)
191
+ draft = next.text
192
+ highlighted = 0
193
+ // Let Svelte write the value before moving the caret into the parens.
194
+ queueMicrotask(() => {
195
+ input?.setSelectionRange(next.caret, next.caret)
196
+ input?.focus()
197
+ caret = next.caret
198
+ })
199
+ }
200
+
201
+ function commit(via: 'enter' | 'blur' = 'enter') {
202
+ const cell = editingCell ?? active
203
+ editing = false
204
+ editingCell = null
205
+ onDraft?.(null)
206
+ if (cell) onCommit(draft, cell, via)
207
+ }
208
+
209
+ /** Excel's ✕: forget what was typed and leave the cell as it was. */
210
+ function cancel() {
211
+ draft = value
212
+ editing = false
213
+ editingCell = null
214
+ onDraft?.(null)
215
+ input?.blur()
216
+ }
217
+
218
+ function onKeyDown(event: KeyboardEvent) {
219
+ if (suggestions.length > 0) {
220
+ if (event.key === 'ArrowDown') {
221
+ event.preventDefault()
222
+ highlighted = (highlighted + 1) % suggestions.length
223
+ return
224
+ }
225
+ if (event.key === 'ArrowUp') {
226
+ event.preventDefault()
227
+ highlighted = (highlighted - 1 + suggestions.length) % suggestions.length
228
+ return
229
+ }
230
+ if (event.key === 'Tab' || (event.key === 'Enter' && highlighted >= 0)) {
231
+ const picked = suggestions[highlighted]
232
+ if (picked) {
233
+ event.preventDefault()
234
+ accept(picked)
235
+ return
236
+ }
237
+ }
238
+ }
239
+ if (event.key === 'Enter' && event.altKey && input) {
240
+ // A line break in the cell's text, as in the cell editor.
241
+ event.preventDefault()
242
+ const start = input.selectionStart ?? input.value.length
243
+ const end = input.selectionEnd ?? start
244
+ startEditing()
245
+ expanded = true
246
+ draft = draft.slice(0, start) + '\n' + draft.slice(end)
247
+ input.value = draft
248
+ input.setSelectionRange(start + 1, start + 1)
249
+ caret = start + 1
250
+ onDraft?.(draft)
251
+ return
252
+ }
253
+ if (event.key === 'Enter') {
254
+ event.preventDefault()
255
+ commit()
256
+ return
257
+ }
258
+ if (event.key === 'Escape') {
259
+ event.preventDefault()
260
+ // Revert rather than commit: Escape means "forget what I typed".
261
+ cancel()
262
+ return
263
+ }
264
+ if (event.key === 'F4' && input) {
265
+ // Excel's F4: the reference at the caret turns through $A$1, A$1, $A1.
266
+ const edit = cycleReference(input.value, input.selectionStart ?? input.value.length)
267
+ if (!edit) return
268
+ event.preventDefault()
269
+ startEditing()
270
+ draft = edit.text
271
+ input.value = edit.text
272
+ input.setSelectionRange(edit.caret, edit.caret)
273
+ caret = edit.caret
274
+ onDraft?.(draft)
275
+ }
276
+ }
277
+
278
+ function onNameBoxKey(event: KeyboardEvent) {
279
+ if (event.key !== 'Enter') return
280
+ event.preventDefault()
281
+ const ref = parseA1(nameBoxText.trim())
282
+ if (ref && ref.row !== null) {
283
+ onNavigate?.({ rowIndex: ref.row, colIndex: ref.col })
284
+ nameBoxText = ''
285
+ return
286
+ }
287
+ const typed = nameBoxText.trim()
288
+ if (names.some((n) => n.name.toUpperCase() === typed.toUpperCase())) {
289
+ onSelectName?.(typed)
290
+ nameBoxText = ''
291
+ return
292
+ }
293
+ // A range, or an address on another sheet, is a place to go.
294
+ if (typed && onSelectReference?.(typed)) {
295
+ nameBoxText = ''
296
+ return
297
+ }
298
+ // Neither an address nor a name: Excel defines it for the selection.
299
+ if (typed) {
300
+ onDefineName?.(typed)
301
+ nameBoxText = ''
302
+ }
303
+ }
304
+ </script>
305
+
306
+ <div class="sv-formula-bar" role="group" aria-label={t('formulaBar')}>
307
+ {#if showNameBox}
308
+ <!--
309
+ Excel's Name Box: one field that takes an address and, behind its arrow,
310
+ lists the defined names. The native select sits invisibly over the
311
+ arrow so the list is the browser's own; the field never changes shape
312
+ when the workbook has no names, the arrow only greys out.
313
+ -->
314
+ <div class="name-box">
315
+ <input
316
+ type="text"
317
+ aria-label={t('nameBox')}
318
+ placeholder={label ?? address}
319
+ value={nameBoxTyping ? nameBoxText : (label ?? address)}
320
+ {disabled}
321
+ oninput={(e) => (nameBoxText = e.currentTarget.value)}
322
+ onkeydown={onNameBoxKey}
323
+ onfocus={(e) => {
324
+ // The address is the field's VALUE, not a placeholder: a placeholder
325
+ // is a hint, so a screen reader on the Name Box would say "blank"
326
+ // where Excel says B3. It is selected on focus, so typing over it
327
+ // still replaces it in one go.
328
+ nameBoxTyping = true
329
+ nameBoxText = label ?? address
330
+ const el = e.currentTarget
331
+ queueMicrotask(() => el.select())
332
+ }}
333
+ onblur={() => { nameBoxTyping = false; nameBoxText = '' }}
334
+ />
335
+ <span class="caret" class:idle={names.length === 0} aria-hidden="true">
336
+ <svg viewBox="0 0 10 10" width="10" height="10"><path d="M2 3.5l3 3 3-3" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" /></svg>
337
+ </span>
338
+ {#if names.length > 0}
339
+ <select
340
+ class="names"
341
+ aria-label={t('definedNames')}
342
+ {disabled}
343
+ onchange={(e) => {
344
+ const picked = e.currentTarget.value
345
+ if (picked) onSelectName?.(picked)
346
+ e.currentTarget.selectedIndex = 0
347
+ }}
348
+ >
349
+ <option value="">{t('namesHeading')}</option>
350
+ {#each names as entry (entry.name)}
351
+ <option value={entry.name}>{entry.name}</option>
352
+ {/each}
353
+ </select>
354
+ {/if}
355
+ </div>
356
+ {/if}
357
+
358
+ <!-- Excel's three: Cancel and Enter while editing, Insert Function always. -->
359
+ <div class="actions">
360
+ <button
361
+ type="button"
362
+ class="action"
363
+ title={t('formulaBarCancel')}
364
+ aria-label={t('formulaBarCancel')}
365
+ disabled={!editing}
366
+ onmousedown={(e) => e.preventDefault()}
367
+ onclick={cancel}
368
+ ><svg viewBox="0 0 12 12" width="12" height="12" aria-hidden="true"><path d="M2.5 2.5l7 7M9.5 2.5l-7 7" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" /></svg></button>
369
+ <button
370
+ type="button"
371
+ class="action"
372
+ title={t('formulaBarEnter')}
373
+ aria-label={t('formulaBarEnter')}
374
+ disabled={!editing}
375
+ onmousedown={(e) => e.preventDefault()}
376
+ onclick={() => commit()}
377
+ ><svg viewBox="0 0 12 12" width="12" height="12" aria-hidden="true"><path d="M2 6.5l2.7 2.7L10 3.5" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" /></svg></button>
378
+ {#if onInsertFunction}
379
+ <button
380
+ type="button"
381
+ class="action fx"
382
+ title={`${t('insertFunction')} (Shift+F3)`}
383
+ aria-label={t('insertFunction')}
384
+ {disabled}
385
+ onclick={() => onInsertFunction?.()}
386
+ >fx</button>
387
+ {:else}
388
+ <span class="action fx idle" aria-hidden="true">fx</span>
389
+ {/if}
390
+ </div>
391
+
392
+ <div class="field">
393
+ <!-- A textarea, not an input: an input strips the line breaks a cell
394
+ typed with Alt+Enter holds, and would commit "twolines" for a cell
395
+ showing two lines. One row until there are breaks to show. -->
396
+ {#if runs.length > 0}
397
+ <div class="formula mirror" class:line={!expanded} bind:this={mirror} style:padding-right={gutter ? `${6 + gutter}px` : undefined} aria-hidden="true">{#each runs as run, i (i)}{#if run.colour}<span style:color={run.colour}>{run.text}</span>{:else}{run.text}{/if}{/each}</div>
398
+ {/if}
399
+ <textarea
400
+ bind:this={input}
401
+ class="formula"
402
+ class:coloured={runs.length > 0}
403
+ class:tall={expanded}
404
+ class:line={!expanded}
405
+ aria-label={t('formula')}
406
+ autocomplete="off"
407
+ spellcheck="false"
408
+ wrap={expanded ? 'soft' : 'off'}
409
+ {rows}
410
+ value={draft}
411
+ disabled={disabled || active === null}
412
+ oninput={(e) => {
413
+ startEditing()
414
+ draft = e.currentTarget.value
415
+ highlighted = 0
416
+ syncCaret(e)
417
+ onDraft?.(draft)
418
+ }}
419
+ onkeyup={syncCaret}
420
+ onclick={syncCaret}
421
+ onscroll={(e) => { if (mirror) { mirror.scrollTop = e.currentTarget.scrollTop; mirror.scrollLeft = e.currentTarget.scrollLeft } }}
422
+ onfocus={startEditing}
423
+ onblur={() => { if (editing) commit('blur') }}
424
+ onkeydown={onKeyDown}
425
+ ></textarea>
426
+ <button
427
+ type="button"
428
+ class="expand"
429
+ class:on={expanded}
430
+ title={expanded ? t('collapseFormulaBar') : t('expandFormulaBar')}
431
+ aria-label={expanded ? t('collapseFormulaBar') : t('expandFormulaBar')}
432
+ aria-expanded={expanded}
433
+ onclick={() => (expanded = !expanded)}
434
+ ><svg viewBox="0 0 12 12" width="10" height="10" aria-hidden="true"><path d="M2 4l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" /></svg></button>
435
+
436
+ {#if hint}
437
+ <div class="hint" role="status">{hint}</div>
438
+ {/if}
439
+
440
+ {#if suggestions.length > 0}
441
+ <ul class="suggestions" role="listbox" aria-label={t('functionSuggestions')}>
442
+ {#each suggestions as suggestion, i (suggestion.name)}
443
+ <li role="option" aria-selected={i === highlighted}>
444
+ <button
445
+ type="button"
446
+ class:active={i === highlighted}
447
+ onmousedown={(e) => { e.preventDefault(); accept(suggestion) }}
448
+ >{suggestion.name}</button>
449
+ </li>
450
+ {/each}
451
+ </ul>
452
+ {/if}
453
+ </div>
454
+ </div>
455
+
456
+ <style>
457
+ .sv-formula-bar {
458
+ display: flex;
459
+ align-items: flex-start;
460
+ min-height: 26px;
461
+ font-family: var(--sg-font, "Segoe UI", system-ui, sans-serif);
462
+ font-size: 12.5px;
463
+ border: 1px solid var(--sg-border, #d1d1d1);
464
+ border-radius: var(--sg-radius, 3px);
465
+ background: var(--sg-input-bg, var(--sg-bg, #fff));
466
+ color: var(--sg-fg, #242424);
467
+ }
468
+
469
+ /* ---- Name Box ------------------------------------------------------ */
470
+ .name-box {
471
+ position: relative;
472
+ display: flex;
473
+ align-items: stretch;
474
+ flex: 0 0 auto;
475
+ width: 96px;
476
+ height: 24px;
477
+ border-right: 1px solid var(--sg-border, #d1d1d1);
478
+ }
479
+ .name-box input {
480
+ flex: 1 1 auto;
481
+ width: 100%;
482
+ min-width: 0;
483
+ padding: 0 0 0 7px;
484
+ }
485
+ .name-box input::placeholder {
486
+ color: var(--sg-fg, #242424);
487
+ opacity: 1;
488
+ }
489
+ .caret {
490
+ display: flex;
491
+ align-items: center;
492
+ justify-content: center;
493
+ width: 18px;
494
+ color: var(--sg-muted, #616161);
495
+ border-left: 1px solid transparent;
496
+ }
497
+ .caret.idle { opacity: 0.35; }
498
+ .name-box:hover .caret:not(.idle) {
499
+ background: var(--sg-row-hover-bg, #f0f0f0);
500
+ border-left-color: var(--sg-border, #d1d1d1);
501
+ }
502
+ /* The list is the browser's own select, laid invisibly over the arrow. */
503
+ .names {
504
+ position: absolute;
505
+ top: 0;
506
+ right: 0;
507
+ width: 18px;
508
+ height: 100%;
509
+ opacity: 0;
510
+ cursor: pointer;
511
+ /* Not transparent: the dropdown it opens paints with this background,
512
+ and a see-through one is unreadable on a dark theme. */
513
+ background: var(--sg-input-bg, var(--sg-bg, #fff));
514
+ color: var(--sg-fg, #242424);
515
+ }
516
+
517
+ /* ---- Cancel / Enter / fx ------------------------------------------- */
518
+ .actions {
519
+ display: flex;
520
+ align-items: center;
521
+ gap: 0;
522
+ height: 24px;
523
+ padding: 0 3px;
524
+ border-right: 1px solid var(--sg-border, #d1d1d1);
525
+ }
526
+ .action {
527
+ display: inline-flex;
528
+ align-items: center;
529
+ justify-content: center;
530
+ width: 20px;
531
+ height: 20px;
532
+ padding: 0;
533
+ font: inherit;
534
+ border: 1px solid transparent;
535
+ border-radius: 3px;
536
+ background: transparent;
537
+ color: var(--sg-muted, #616161);
538
+ cursor: pointer;
539
+ }
540
+ .action:hover:not(:disabled):not(.idle) {
541
+ background: var(--sg-row-hover-bg, #f0f0f0);
542
+ border-color: var(--sg-border, #d1d1d1);
543
+ color: var(--sg-fg, #242424);
544
+ }
545
+ .action:disabled, .action.idle { opacity: 0.35; cursor: default; }
546
+ .action.fx {
547
+ font-family: Georgia, "Times New Roman", serif;
548
+ font-style: italic;
549
+ font-size: 13px;
550
+ width: 22px;
551
+ }
552
+ .action:focus-visible {
553
+ outline: 2px solid var(--sg-focus-ring, var(--sg-accent, #107c41));
554
+ outline-offset: -2px;
555
+ }
556
+
557
+ /* ---- the formula field --------------------------------------------- */
558
+ .field {
559
+ position: relative;
560
+ display: flex;
561
+ flex: 1 1 auto;
562
+ min-width: 0;
563
+ }
564
+ input {
565
+ font: inherit;
566
+ border: 0;
567
+ outline: none;
568
+ background: transparent;
569
+ color: inherit;
570
+ padding: 0 6px;
571
+ }
572
+ input:focus-visible {
573
+ outline: 2px solid var(--sg-focus-ring, var(--sg-accent, #107c41));
574
+ outline-offset: -2px;
575
+ }
576
+ .formula {
577
+ width: 100%;
578
+ min-height: 24px;
579
+ padding: 3px 6px 3px 8px;
580
+ font: inherit;
581
+ line-height: 18px;
582
+ color: inherit;
583
+ background: transparent;
584
+ border: 0;
585
+ outline: none;
586
+ resize: none;
587
+ overflow: hidden;
588
+ white-space: pre-wrap;
589
+ }
590
+ /* Expanded, the bar shows up to six lines and scrolls past them, as
591
+ Excel's does; the mirror follows the scroll from the textarea's
592
+ onscroll. Collapsed, it stays one line with no scrollbar of its own. */
593
+ .formula.tall { overflow-y: auto; }
594
+ /* Collapsed, the line does not wrap: Excel's one-line bar is cut off at
595
+ the right and scrolls sideways with the caret, rather than folding a
596
+ long entry onto a second row that the one-row box then hides. The
597
+ mirror follows the scroll the same way. */
598
+ .formula.line { white-space: pre; overflow-x: hidden; }
599
+ .formula:focus-visible {
600
+ outline: 2px solid var(--sg-focus-ring, var(--sg-accent, #107c41));
601
+ outline-offset: -2px;
602
+ }
603
+ /* The references in colour: a mirror of the text under a field whose own
604
+ text is transparent. Same box, same type, so the glyphs coincide; the
605
+ textarea's rows decide the height and the mirror is clipped to it. */
606
+ .formula.mirror {
607
+ position: absolute;
608
+ inset: 0;
609
+ right: 18px;
610
+ overflow: hidden;
611
+ overflow-wrap: break-word;
612
+ pointer-events: none;
613
+ color: var(--sg-fg, #242424);
614
+ }
615
+ .formula.coloured {
616
+ position: relative;
617
+ color: transparent;
618
+ caret-color: var(--sg-fg, #242424);
619
+ }
620
+ /* Excel's chevron at the bar's end: expands to show every line. */
621
+ .expand {
622
+ flex: 0 0 auto;
623
+ align-self: flex-start;
624
+ width: 18px;
625
+ height: 24px;
626
+ padding: 0;
627
+ border: 0;
628
+ background: transparent;
629
+ color: var(--sg-muted, #616161);
630
+ cursor: pointer;
631
+ }
632
+ .expand:hover { color: var(--sg-fg, #242424); }
633
+ .expand.on svg { transform: rotate(180deg); }
634
+ .hint {
635
+ position: absolute;
636
+ top: 100%;
637
+ left: 6px;
638
+ z-index: 30;
639
+ margin-top: 3px;
640
+ padding: 3px 7px;
641
+ border-radius: 3px;
642
+ background: var(--sg-fg, #242424);
643
+ color: var(--sg-bg, #fff);
644
+ font-size: 11.5px;
645
+ white-space: nowrap;
646
+ }
647
+ .suggestions {
648
+ position: absolute;
649
+ top: 100%;
650
+ left: 0;
651
+ z-index: 40;
652
+ margin: 24px 0 0;
653
+ padding: 2px;
654
+ list-style: none;
655
+ min-width: 180px;
656
+ max-height: 220px;
657
+ overflow-y: auto;
658
+ border: 1px solid var(--sg-border, #d1d1d1);
659
+ border-radius: 4px;
660
+ background: var(--sg-bg, #fff);
661
+ color: var(--sg-fg, #242424);
662
+ box-shadow: 0 8px 24px rgb(0 0 0 / 0.14);
663
+ }
664
+ .suggestions button {
665
+ display: block;
666
+ width: 100%;
667
+ text-align: left;
668
+ font: inherit;
669
+ border: 0;
670
+ background: transparent;
671
+ color: inherit;
672
+ padding: 4px 8px;
673
+ border-radius: 3px;
674
+ cursor: pointer;
675
+ }
676
+ .suggestions button.active,
677
+ .suggestions button:hover {
678
+ background: var(--sg-row-hover-bg, #f0f0f0);
679
+ }
680
+ </style>