@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,213 @@
1
+ <!--
2
+ Built-in group cell for the server-side group/tree model. Drop it into the
3
+ grouping column and it draws the expander + indentation for group rows (and an
4
+ indented leaf value) - no hand-written cell recipe. Pair with `serverGroupRows`
5
+ to feed `<SvGrid data>`, and wire `onToggle` to the controller's `toggleGroup`.
6
+
7
+ cell: (ctx) => renderComponent(SvGroupCell, {
8
+ row: ctx.row.original, onToggle: ctl.toggleGroup, leafField: 'name',
9
+ })
10
+ -->
11
+ <script lang="ts" generics="TData">
12
+ import type { GridIcons, ServerDisplayRow, ServerPlaceholderRow } from '@svgrid/grid'
13
+ import { fillMessage, resolveServerGroupMessages, type ServerGroupMessages } from './messages'
14
+
15
+ // Rows from either model: the display-row union, plus the block-cached
16
+ // model's shared placeholder (which the grid renders itself, so it never
17
+ // reaches this cell - but the type has to admit it).
18
+ type GroupGridRow = { __group?: ServerDisplayRow<TData> | ServerPlaceholderRow } & Record<string, unknown>
19
+ type Props = {
20
+ /** The grid row from `serverGroupRows` (carries the `__group` marker). */
21
+ row: GroupGridRow
22
+ /**
23
+ * Expand / collapse a group, or load more children. Receives the grid row;
24
+ * wire to `serverGroupNav(ctl).onToggle` (which drives clicks and keyboard).
25
+ */
26
+ onToggle: (row: GroupGridRow) => void
27
+ /**
28
+ * Field to show for leaf rows in the group column (blank if omitted).
29
+ * Under `treeData` every row is a node of the same shape, so it names
30
+ * the label of expandable nodes too; a group row's key is otherwise
31
+ * the text.
32
+ */
33
+ leafField?: string
34
+ /** Pixels of indentation per level. Default 18. */
35
+ indent?: number
36
+ /**
37
+ * Icon overrides, the same map `<SvGrid icons>` takes. Only
38
+ * `chevron-right` is drawn here. You mount this component yourself, so it
39
+ * cannot inherit the grid's icons - pass the same object to both to keep
40
+ * the expander consistent with the rest of the chrome.
41
+ */
42
+ icons?: GridIcons
43
+ /**
44
+ * Strings, for localization: the "load more" row, the footer and grand
45
+ * total labels. Partial; missing keys keep the English default. Pass the
46
+ * same map to `SvRowGroupPanel` and `serverGroupText`.
47
+ */
48
+ messages?: Partial<ServerGroupMessages>
49
+ /** Locale for the child count and the "load more" number. Default: the browser's. */
50
+ locale?: string | ReadonlyArray<string>
51
+ }
52
+
53
+ let { row, onToggle, leafField, indent = 18, icons, messages, locale }: Props = $props()
54
+ const chevron = $derived(icons?.['chevron-right'])
55
+ const meta = $derived(row.__group)
56
+ const m = $derived(resolveServerGroupMessages(messages))
57
+ const num = (n: number) => n.toLocaleString(locale as string | string[] | undefined)
58
+ // A tree node's key is its id (`field` is empty under treeData); the
59
+ // label is the leaf field then, the same as for its leaves.
60
+ const label = $derived(
61
+ meta?.kind === 'group' && meta.field === '' && leafField ? String(row[leafField] ?? '') : meta?.kind === 'group' ? meta.key : '',
62
+ )
63
+ </script>
64
+
65
+ {#if meta && meta.kind === 'group' && meta.expandable === false}
66
+ <!-- Nothing opens beneath it (the innermost level under a server pivot),
67
+ so no expander: the key and the count, indented like its siblings. -->
68
+ <span class="sv-group-cell sv-group-cell-leaf" style={`padding-inline-start: ${meta.level * indent}px`}>
69
+ <span class="sv-group-chev sv-group-chev-none" aria-hidden="true"></span>
70
+ <span class="sv-group-key">{label}</span>
71
+ {#if meta.childCount != null}<span class="sv-group-count">({num(meta.childCount)})</span>{/if}
72
+ </span>
73
+ {:else if meta && meta.kind === 'group'}
74
+ <!-- The button's accessible name is the group itself ("Germany (1,234)");
75
+ expanded and busy are states, on aria-expanded / aria-busy, so a
76
+ screen reader hears what it is opening rather than "Expand group". -->
77
+ <button
78
+ type="button"
79
+ class="sv-group-cell"
80
+ style={`padding-inline-start: ${meta.level * indent}px`}
81
+ aria-expanded={meta.expanded}
82
+ aria-busy={meta.loading ? 'true' : undefined}
83
+ onclick={() => onToggle(row)}
84
+ >
85
+ {#if meta.loading}
86
+ <!-- The level's block is in flight: the expander's slot holds a
87
+ spinner until it lands, so the wait is visible on the row itself. -->
88
+ <span class="sv-group-chev sv-group-spinner" aria-hidden="true"></span>
89
+ {:else}
90
+ <!-- Same chevron the grid's own expanders and SvTree draw, so every
91
+ expander in the library looks identical. -->
92
+ <span class="sv-group-chev" class:open={meta.expanded} aria-hidden="true">
93
+ {#if chevron}
94
+ {@render chevron()}
95
+ {:else}
96
+ <svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor"
97
+ stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6" /></svg>
98
+ {/if}
99
+ </span>
100
+ {/if}
101
+ <span class="sv-group-key">{label}</span>
102
+ {#if meta.childCount != null}<span class="sv-group-count">({num(meta.childCount)})</span>{/if}
103
+ </button>
104
+ {:else if meta && meta.kind === 'more'}
105
+ <!-- aria-disabled rather than disabled: a disabled button drops keyboard
106
+ focus the moment it is pressed, and this one is pressed to wait. -->
107
+ <button
108
+ type="button"
109
+ class="sv-group-more"
110
+ style={`padding-inline-start: ${meta.level * indent}px`}
111
+ aria-disabled={meta.loading ? 'true' : undefined}
112
+ aria-busy={meta.loading ? 'true' : undefined}
113
+ onclick={() => {
114
+ if (!meta.loading) onToggle(row)
115
+ }}
116
+ >
117
+ {meta.loading ? m.loading : fillMessage(m.loadMore, { count: num(meta.remaining) })}
118
+ </button>
119
+ {:else if meta && meta.kind === 'footer'}
120
+ <span class="sv-group-footer" style={`padding-inline-start: ${meta.level * indent}px`}>{fillMessage(m.total, { label: meta.key })}</span>
121
+ {:else if meta && meta.kind === 'skeleton'}
122
+ <span class="sv-group-skeleton" style={`margin-inline-start: ${meta.level * indent}px`} aria-hidden="true"></span>
123
+ {:else if meta && meta.kind === 'grandTotal'}
124
+ <span class="sv-group-footer sv-group-grand-total">{m.grandTotal}</span>
125
+ {:else if meta && meta.kind === 'placeholder'}
126
+ <!-- The grid draws placeholder rows itself; nothing to add here. -->
127
+ {:else if meta}
128
+ <span class="sv-group-leaf" style={`padding-inline-start: ${(meta.level + 1) * indent}px`}>
129
+ {leafField ? (row[leafField] ?? '') : ''}
130
+ </span>
131
+ {/if}
132
+
133
+ <style>
134
+ .sv-group-cell {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ gap: 6px;
138
+ background: none;
139
+ border: 0;
140
+ padding: 0;
141
+ font: inherit;
142
+ color: inherit;
143
+ cursor: pointer;
144
+ border-radius: 3px;
145
+ }
146
+ .sv-group-cell-leaf { cursor: default; }
147
+ /* The same ring the grid's own tree toggle draws, so keyboard focus looks
148
+ alike whichever expander it lands on. */
149
+ .sv-group-cell:focus-visible,
150
+ .sv-group-more:focus-visible {
151
+ outline: 2px solid var(--sg-accent, #2563eb);
152
+ outline-offset: 2px;
153
+ }
154
+ .sv-group-chev {
155
+ display: inline-flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ width: 12px;
159
+ height: 12px;
160
+ transition: transform 0.15s;
161
+ color: var(--sg-muted, #64748b);
162
+ }
163
+ /* An `icons` override renders inside this wrapper, and this style block is
164
+ scoped, so its markup needs :global() to be reached. Sizing it here means
165
+ a custom chevron lands in the same box as the built-in and rotates with
166
+ the wrapper rather than needing to know the rule exists. */
167
+ .sv-group-chev :global(svg),
168
+ .sv-group-chev :global(img) {
169
+ width: 100%;
170
+ height: 100%;
171
+ display: block;
172
+ }
173
+ .sv-group-chev.open { transform: rotate(90deg); }
174
+ .sv-group-key { font-weight: 600; }
175
+ .sv-group-count { color: var(--sg-muted, #64748b); font-size: 12px; }
176
+ .sv-group-spinner {
177
+ box-sizing: border-box;
178
+ border-radius: 50%;
179
+ border: 2px solid color-mix(in srgb, var(--sg-muted, #64748b) 35%, transparent);
180
+ border-top-color: var(--sg-accent, #2563eb);
181
+ animation: sv-group-spin 0.8s linear infinite;
182
+ }
183
+ @keyframes sv-group-spin {
184
+ to { transform: rotate(360deg); }
185
+ }
186
+ @media (prefers-reduced-motion: reduce) {
187
+ .sv-group-spinner { animation: none; border-top-color: var(--sg-muted, #64748b); }
188
+ }
189
+ .sv-group-leaf { color: var(--sg-muted, #64748b); }
190
+ .sv-group-more {
191
+ background: none;
192
+ border: 0;
193
+ padding: 0;
194
+ font: inherit;
195
+ font-size: 13px;
196
+ color: var(--sg-accent, #2563eb);
197
+ cursor: pointer;
198
+ border-radius: 3px;
199
+ }
200
+ .sv-group-more[aria-disabled='true'] { color: var(--sg-muted, #64748b); cursor: default; }
201
+ .sv-group-footer { font-weight: 600; color: var(--sg-muted, #64748b); font-size: 12px; text-transform: uppercase; letter-spacing: 0.03em; }
202
+ .sv-group-skeleton {
203
+ display: inline-block;
204
+ width: 60%;
205
+ height: 10px;
206
+ border-radius: 5px;
207
+ background: linear-gradient(90deg, var(--sg-border, #e2e8f0) 25%, var(--sg-header-bg, #f1f5f9) 50%, var(--sg-border, #e2e8f0) 75%);
208
+ background-size: 200% 100%;
209
+ animation: sv-group-shimmer 1.2s infinite;
210
+ }
211
+ @keyframes sv-group-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
212
+ @media (prefers-reduced-motion: reduce) { .sv-group-skeleton { animation: none; } }
213
+ </style>
@@ -0,0 +1,62 @@
1
+ import type { GridIcons, ServerDisplayRow, ServerPlaceholderRow } from '@svgrid/grid';
2
+ import { type ServerGroupMessages } from './messages.js';
3
+ declare function $$render<TData>(): {
4
+ props: {
5
+ /** The grid row from `serverGroupRows` (carries the `__group` marker). */
6
+ row: {
7
+ __group?: ServerDisplayRow<TData> | ServerPlaceholderRow;
8
+ } & Record<string, unknown>;
9
+ /**
10
+ * Expand / collapse a group, or load more children. Receives the grid row;
11
+ * wire to `serverGroupNav(ctl).onToggle` (which drives clicks and keyboard).
12
+ */
13
+ onToggle: (row: {
14
+ __group?: ServerDisplayRow<TData> | ServerPlaceholderRow;
15
+ } & Record<string, unknown>) => void;
16
+ /**
17
+ * Field to show for leaf rows in the group column (blank if omitted).
18
+ * Under `treeData` every row is a node of the same shape, so it names
19
+ * the label of expandable nodes too; a group row's key is otherwise
20
+ * the text.
21
+ */
22
+ leafField?: string;
23
+ /** Pixels of indentation per level. Default 18. */
24
+ indent?: number;
25
+ /**
26
+ * Icon overrides, the same map `<SvGrid icons>` takes. Only
27
+ * `chevron-right` is drawn here. You mount this component yourself, so it
28
+ * cannot inherit the grid's icons - pass the same object to both to keep
29
+ * the expander consistent with the rest of the chrome.
30
+ */
31
+ icons?: GridIcons;
32
+ /**
33
+ * Strings, for localization: the "load more" row, the footer and grand
34
+ * total labels. Partial; missing keys keep the English default. Pass the
35
+ * same map to `SvRowGroupPanel` and `serverGroupText`.
36
+ */
37
+ messages?: Partial<ServerGroupMessages>;
38
+ /** Locale for the child count and the "load more" number. Default: the browser's. */
39
+ locale?: string | ReadonlyArray<string>;
40
+ };
41
+ exports: {};
42
+ bindings: "";
43
+ slots: {};
44
+ events: {};
45
+ };
46
+ declare class __sveltets_Render<TData> {
47
+ props(): ReturnType<typeof $$render<TData>>['props'];
48
+ events(): ReturnType<typeof $$render<TData>>['events'];
49
+ slots(): ReturnType<typeof $$render<TData>>['slots'];
50
+ bindings(): "";
51
+ exports(): {};
52
+ }
53
+ interface $$IsomorphicComponent {
54
+ new <TData>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TData>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TData>['props']>, ReturnType<__sveltets_Render<TData>['events']>, ReturnType<__sveltets_Render<TData>['slots']>> & {
55
+ $$bindings?: ReturnType<__sveltets_Render<TData>['bindings']>;
56
+ } & ReturnType<__sveltets_Render<TData>['exports']>;
57
+ <TData>(internal: unknown, props: ReturnType<__sveltets_Render<TData>['props']> & {}): ReturnType<__sveltets_Render<TData>['exports']>;
58
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
59
+ }
60
+ declare const SvGroupCell: $$IsomorphicComponent;
61
+ type SvGroupCell<TData> = InstanceType<typeof SvGroupCell<TData>>;
62
+ export default SvGroupCell;
@@ -0,0 +1,322 @@
1
+ <!--
2
+ A row-group panel (like the "drag columns to group" bar in enterprise grids).
3
+ Shows the current group-by columns as chips you can remove or drag to reorder,
4
+ plus a "+ Group by" menu to add one. It is also a drop target: a column drag
5
+ that carries `text/sv-column` (its column id) adds that column. Wire `onChange`
6
+ to a server group model's `setGroupBy`, or to client grouping.
7
+
8
+ <SvRowGroupPanel
9
+ columns={[{ id: 'region', label: 'Region' }, { id: 'country', label: 'Country' }]}
10
+ groupBy={view.groupBy}
11
+ onChange={(g) => ctl.setGroupBy(g)}
12
+ />
13
+ -->
14
+ <script lang="ts">
15
+ import { untrack } from 'svelte'
16
+ import { GRID_ICON_GLYPHS, type GridIconName, type GridIcons } from '@svgrid/grid'
17
+ import { fillMessage, resolveServerGroupMessages, type ServerGroupMessages } from './messages'
18
+
19
+ type Col = { id: string; label: string }
20
+ type Props = {
21
+ /** Columns that can be grouped on. */
22
+ columns: Col[]
23
+ /** Current group-by column ids, outer to inner. */
24
+ groupBy: string[]
25
+ /** Called with the new group-by order. */
26
+ onChange: (groupBy: string[]) => void
27
+ /** Text shown when nothing is grouped. Default: `messages.dropHere`. */
28
+ placeholder?: string
29
+ /**
30
+ * Icon overrides, the same map `<SvGrid icons>` takes. This panel draws
31
+ * `drag-handle`, `remove` and `breadcrumb-separator`. You mount it
32
+ * yourself, so pass the same object you gave the grid to keep them
33
+ * consistent.
34
+ */
35
+ icons?: GridIcons
36
+ /**
37
+ * `'immediate'` (default) calls `onChange` on every edit. `'deferred'`
38
+ * collects edits in the panel and shows Apply / Cancel, so a server
39
+ * model reloads once per session of changes rather than once per chip.
40
+ */
41
+ applyMode?: 'immediate' | 'deferred'
42
+ /**
43
+ * Strings, for localization. Partial; missing keys keep the English
44
+ * default. Pass the same map to `SvGroupCell`.
45
+ */
46
+ messages?: Partial<ServerGroupMessages>
47
+ }
48
+ let {
49
+ columns,
50
+ groupBy,
51
+ onChange,
52
+ placeholder,
53
+ icons,
54
+ applyMode = 'immediate',
55
+ messages,
56
+ }: Props = $props()
57
+ const m = $derived(resolveServerGroupMessages(messages))
58
+
59
+ // Deferred mode edits a local copy; a `groupBy` that changes from outside
60
+ // wins over it (a change from elsewhere drops what was pending here). By
61
+ // value, not by identity: a server row model hands out a fresh array on
62
+ // every emit, and a block landing must not throw away un-applied chips.
63
+ let pending = $state<string[] | null>(null)
64
+ let seen = untrack(() => JSON.stringify(groupBy))
65
+ $effect(() => {
66
+ const now = JSON.stringify(groupBy)
67
+ if (now === seen) return
68
+ seen = now
69
+ pending = null
70
+ })
71
+ const shown = $derived(pending ?? groupBy)
72
+ const dirty = $derived(pending !== null && JSON.stringify(pending) !== JSON.stringify(groupBy))
73
+ function commit(next: string[]) {
74
+ if (applyMode === 'deferred') pending = next
75
+ else onChange(next)
76
+ }
77
+ function apply() {
78
+ if (!pending) return
79
+ const next = pending
80
+ pending = null
81
+ onChange(next)
82
+ }
83
+ function cancel() {
84
+ pending = null
85
+ }
86
+
87
+ const labelOf = (id: string) => columns.find((c) => c.id === id)?.label ?? id
88
+ const available = $derived(columns.filter((c) => !shown.includes(c.id)))
89
+
90
+ let dragIndex = $state<number | null>(null)
91
+ /** Where a dragged chip would land, for the insertion mark. */
92
+ let dropIndex = $state<number | null>(null)
93
+ /** What a keyboard reorder just did, for the live region. */
94
+ let announcement = $state('')
95
+
96
+ function remove(id: string) {
97
+ commit(shown.filter((g) => g !== id))
98
+ }
99
+ function add(id: string) {
100
+ if (id && !shown.includes(id)) commit([...shown, id])
101
+ }
102
+ function reorder(to: number) {
103
+ dropIndex = null
104
+ if (dragIndex === null || dragIndex === to) {
105
+ dragIndex = null
106
+ return
107
+ }
108
+ const next = [...shown]
109
+ const [moved] = next.splice(dragIndex, 1)
110
+ next.splice(to, 0, moved!)
111
+ dragIndex = null
112
+ commit(next)
113
+ }
114
+ function onPanelDrop(e: DragEvent) {
115
+ e.preventDefault()
116
+ const id = e.dataTransfer?.getData('text/sv-column')
117
+ if (id) add(id)
118
+ }
119
+ function onChipDragStart(e: DragEvent, i: number) {
120
+ dragIndex = i
121
+ // Firefox starts no drag without data on the transfer.
122
+ if (e.dataTransfer) {
123
+ e.dataTransfer.setData('text/plain', shown[i] ?? '')
124
+ e.dataTransfer.effectAllowed = 'move'
125
+ }
126
+ }
127
+ /** Keyboard equivalent of dragging a chip: moves the chip at `i` one slot earlier/later,
128
+ * reusing `reorder()` (via `dragIndex`) so there is a single source of truth for the move. */
129
+ function moveByKeyboard(i: number, delta: number) {
130
+ const to = i + delta
131
+ if (to < 0 || to >= shown.length) return
132
+ const id = shown[i]!
133
+ dragIndex = i
134
+ reorder(to)
135
+ announcement = fillMessage(m.movedTo, { label: labelOf(id), index: to + 1, total: shown.length })
136
+ }
137
+ function onChipKeydown(e: KeyboardEvent, i: number) {
138
+ if (!e.altKey) return
139
+ if (e.key === 'ArrowLeft') {
140
+ e.preventDefault()
141
+ moveByKeyboard(i, -1)
142
+ } else if (e.key === 'ArrowRight') {
143
+ e.preventDefault()
144
+ moveByKeyboard(i, 1)
145
+ }
146
+ }
147
+ </script>
148
+
149
+ <!-- Same override-or-default resolution SvGrid uses, kept local because this
150
+ component is mounted by the consumer and never sees the grid's snippet. -->
151
+ {#snippet ic(name: GridIconName)}
152
+ {@const override = icons?.[name]}
153
+ {#if override}{@render override()}{:else}{GRID_ICON_GLYPHS[name]}{/if}
154
+ {/snippet}
155
+
156
+ <div
157
+ class="sv-rowgroup-panel"
158
+ role="group"
159
+ aria-label={m.rowGroups}
160
+ ondragover={(e) => e.preventDefault()}
161
+ ondrop={onPanelDrop}
162
+ >
163
+ <span class="sv-rgp-label" aria-hidden="true">{m.groupBy}</span>
164
+ {#if shown.length === 0}
165
+ <span class="sv-rgp-empty">{placeholder ?? m.dropHere}</span>
166
+ {:else}
167
+ {#each shown as id, i (id)}
168
+ {#if i > 0}<span class="sv-rgp-sep" aria-hidden="true">{@render ic('breadcrumb-separator')}</span>{/if}
169
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex, a11y_no_noninteractive_element_interactions -->
170
+ <span
171
+ class="sv-rgp-chip"
172
+ class:sv-rgp-chip-drag={dragIndex === i}
173
+ class:sv-rgp-chip-drop={dropIndex === i && dragIndex !== i}
174
+ role="group"
175
+ tabindex="0"
176
+ aria-label={fillMessage(m.groupedBy, { label: labelOf(id), index: i + 1, total: shown.length })}
177
+ draggable="true"
178
+ ondragstart={(e) => onChipDragStart(e, i)}
179
+ ondragend={() => {
180
+ dragIndex = null
181
+ dropIndex = null
182
+ }}
183
+ ondragover={(e) => {
184
+ e.preventDefault()
185
+ if (dragIndex !== null) dropIndex = i
186
+ }}
187
+ ondragleave={() => {
188
+ if (dropIndex === i) dropIndex = null
189
+ }}
190
+ ondrop={(e) => {
191
+ // Handled here: without preventDefault Firefox opens the dropped
192
+ // text as a URL.
193
+ e.preventDefault()
194
+ e.stopPropagation()
195
+ reorder(i)
196
+ }}
197
+ onkeydown={(e) => onChipKeydown(e, i)}
198
+ >
199
+ <span class="sv-rgp-grip" aria-hidden="true">{@render ic('drag-handle')}</span>
200
+ {labelOf(id)}
201
+ <button type="button" class="sv-rgp-x" onclick={() => remove(id)} aria-label={fillMessage(m.stopGroupingBy, { label: labelOf(id) })}>{@render ic('remove')}</button>
202
+ </span>
203
+ {/each}
204
+ {/if}
205
+ {#if available.length}
206
+ <select
207
+ class="sv-rgp-add"
208
+ aria-label={m.addGroupLabel}
209
+ onchange={(e) => { add(e.currentTarget.value); e.currentTarget.value = '' }}
210
+ >
211
+ <option value="">{m.addGroup}</option>
212
+ {#each available as c (c.id)}<option value={c.id}>{c.label}</option>{/each}
213
+ </select>
214
+ {/if}
215
+ {#if applyMode === 'deferred'}
216
+ <span class="sv-rgp-apply" role="group" aria-label={m.applyGrouping}>
217
+ <button type="button" class="sv-rgp-btn sv-rgp-btn-primary" disabled={!dirty} onclick={apply}>{m.apply}</button>
218
+ <button type="button" class="sv-rgp-btn" disabled={!dirty} onclick={cancel}>{m.cancel}</button>
219
+ </span>
220
+ {/if}
221
+ <span class="sv-rgp-live" aria-live="polite">{announcement}</span>
222
+ </div>
223
+
224
+ <style>
225
+ .sv-rowgroup-panel {
226
+ position: relative;
227
+ display: flex;
228
+ align-items: center;
229
+ flex-wrap: wrap;
230
+ gap: 6px;
231
+ padding: 8px 10px;
232
+ border: 1px dashed var(--sg-border, #cbd5e1);
233
+ border-radius: 10px;
234
+ background: var(--sg-header-bg, #f8fafc);
235
+ font-size: 13px;
236
+ }
237
+ .sv-rgp-label { color: var(--sg-muted, #64748b); font-weight: 600; }
238
+ .sv-rgp-empty { color: var(--sg-muted, #94a3b8); font-style: italic; }
239
+ .sv-rgp-sep { color: var(--sg-muted, #94a3b8); }
240
+ .sv-rgp-chip {
241
+ display: inline-flex;
242
+ align-items: center;
243
+ gap: 6px;
244
+ padding: 3px 6px 3px 8px;
245
+ border-radius: 999px;
246
+ background: var(--sg-bg, #fff);
247
+ border: 1px solid var(--sg-border, #e2e8f0);
248
+ cursor: grab;
249
+ user-select: none;
250
+ font-weight: 600;
251
+ }
252
+ .sv-rgp-chip-drag { opacity: 0.5; }
253
+ /* Where the dragged chip will land: an accent edge on the chip it displaces. */
254
+ .sv-rgp-chip-drop { box-shadow: -3px 0 0 0 var(--sg-accent, #2563eb); }
255
+ .sv-rgp-grip { color: var(--sg-muted, #94a3b8); cursor: grab; }
256
+ .sv-rgp-x {
257
+ display: inline-flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ width: 24px;
261
+ height: 24px;
262
+ margin: -4px -4px -4px 0;
263
+ border: 0;
264
+ border-radius: 50%;
265
+ background: none;
266
+ color: var(--sg-muted, #64748b);
267
+ cursor: pointer;
268
+ font-size: 14px;
269
+ line-height: 1;
270
+ }
271
+ .sv-rgp-x:hover { background: var(--sg-header-bg, #f1f5f9); color: var(--sg-fg, #0f172a); }
272
+ .sv-rgp-add {
273
+ font: inherit;
274
+ font-size: 13px;
275
+ padding: 4px 8px;
276
+ border-radius: 8px;
277
+ border: 1px solid var(--sg-border, #e2e8f0);
278
+ background: var(--sg-bg, #fff);
279
+ color: var(--sg-accent, #2563eb);
280
+ cursor: pointer;
281
+ }
282
+ .sv-rgp-apply { display: inline-flex; gap: 6px; margin-left: auto; }
283
+ .sv-rgp-btn {
284
+ font: inherit;
285
+ font-size: 13px;
286
+ padding: 4px 10px;
287
+ border-radius: 8px;
288
+ border: 1px solid var(--sg-border, #e2e8f0);
289
+ background: var(--sg-bg, #fff);
290
+ color: var(--sg-fg, #0f172a);
291
+ cursor: pointer;
292
+ }
293
+ .sv-rgp-btn-primary {
294
+ background: var(--sg-accent, #2563eb);
295
+ border-color: var(--sg-accent, #2563eb);
296
+ color: var(--sg-on-accent, #fff);
297
+ }
298
+ .sv-rgp-btn:disabled { opacity: 0.5; cursor: default; }
299
+ /* Apply with nothing to apply reads as off, not as a paler Apply. */
300
+ .sv-rgp-btn-primary:disabled {
301
+ opacity: 1;
302
+ background: var(--sg-header-bg, #f1f5f9);
303
+ border-color: var(--sg-border, #e2e8f0);
304
+ color: var(--sg-muted, #64748b);
305
+ }
306
+ .sv-rgp-chip:focus-visible,
307
+ .sv-rgp-x:focus-visible,
308
+ .sv-rgp-add:focus-visible,
309
+ .sv-rgp-btn:focus-visible {
310
+ outline: 2px solid var(--sg-accent, #2563eb);
311
+ outline-offset: 2px;
312
+ }
313
+ /* The live region reads to a screen reader and takes no space. */
314
+ .sv-rgp-live {
315
+ position: absolute;
316
+ width: 1px;
317
+ height: 1px;
318
+ overflow: hidden;
319
+ clip: rect(0 0 0 0);
320
+ white-space: nowrap;
321
+ }
322
+ </style>
@@ -0,0 +1,37 @@
1
+ import { type GridIcons } from '@svgrid/grid';
2
+ import { type ServerGroupMessages } from './messages.js';
3
+ type Col = {
4
+ id: string;
5
+ label: string;
6
+ };
7
+ type Props = {
8
+ /** Columns that can be grouped on. */
9
+ columns: Col[];
10
+ /** Current group-by column ids, outer to inner. */
11
+ groupBy: string[];
12
+ /** Called with the new group-by order. */
13
+ onChange: (groupBy: string[]) => void;
14
+ /** Text shown when nothing is grouped. Default: `messages.dropHere`. */
15
+ placeholder?: string;
16
+ /**
17
+ * Icon overrides, the same map `<SvGrid icons>` takes. This panel draws
18
+ * `drag-handle`, `remove` and `breadcrumb-separator`. You mount it
19
+ * yourself, so pass the same object you gave the grid to keep them
20
+ * consistent.
21
+ */
22
+ icons?: GridIcons;
23
+ /**
24
+ * `'immediate'` (default) calls `onChange` on every edit. `'deferred'`
25
+ * collects edits in the panel and shows Apply / Cancel, so a server
26
+ * model reloads once per session of changes rather than once per chip.
27
+ */
28
+ applyMode?: 'immediate' | 'deferred';
29
+ /**
30
+ * Strings, for localization. Partial; missing keys keep the English
31
+ * default. Pass the same map to `SvGroupCell`.
32
+ */
33
+ messages?: Partial<ServerGroupMessages>;
34
+ };
35
+ declare const SvRowGroupPanel: import("svelte").Component<Props, {}, "">;
36
+ type SvRowGroupPanel = ReturnType<typeof SvRowGroupPanel>;
37
+ export default SvRowGroupPanel;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Turn on the Enterprise server-side row model. Idempotent. Also invoked by
3
+ * {@link installEnterprise}, so wiring the Pro API covers it.
4
+ *
5
+ * Calling it is optional: the model factories nudge on their own first call
6
+ * (see {@link nudgeServerRowModel}), so an app that only imports
7
+ * `createServerRowModel` is still gated.
8
+ */
9
+ export declare function enableServerRowModel(): void;
10
+ /**
11
+ * Raise the unlicensed nudge from a model factory. Shares the `enabled` latch with
12
+ * {@link enableServerRowModel} so an app that calls both (or constructs many
13
+ * models) still gets exactly one nudge.
14
+ *
15
+ * @internal
16
+ */
17
+ export declare function nudgeServerRowModel(): void;