@svgrid/enterprise 3.0.0 → 3.0.2

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 (390) hide show
  1. package/README.md +95 -95
  2. package/dist/ExpressionEditorHarness.svelte.d.ts +2 -2
  3. package/dist/SvAdvancedFilter.svelte.d.ts +2 -2
  4. package/dist/SvAlertRuleEditor.svelte.d.ts +2 -2
  5. package/dist/SvAlertsManager.svelte.d.ts +3 -3
  6. package/dist/SvAlertsPanel.svelte.d.ts +1 -1
  7. package/dist/SvAuthGate.svelte +115 -115
  8. package/dist/SvAuthGate.svelte.d.ts +1 -1
  9. package/dist/SvBoard.svelte.d.ts +1 -1
  10. package/dist/SvExportMenu.svelte +553 -553
  11. package/dist/SvExportMenu.svelte.d.ts +2 -2
  12. package/dist/SvExpressionEditor.svelte.d.ts +2 -2
  13. package/dist/SvFileInput.svelte +113 -113
  14. package/dist/SvFormulaBar.svelte +606 -0
  15. package/dist/SvFormulaBar.svelte.d.ts +62 -0
  16. package/dist/SvGridAlerts.svelte.d.ts +2 -2
  17. package/dist/SvGridBoard.svelte +2358 -2358
  18. package/dist/SvGridBulkEditDrawer.svelte.d.ts +1 -1
  19. package/dist/SvGridEditPanel.svelte +1157 -1157
  20. package/dist/SvGridEditPanel.svelte.d.ts +3 -3
  21. package/dist/SvGridMasterDetail.svelte +116 -116
  22. package/dist/SvGridMasterDetail.svelte.d.ts +1 -1
  23. package/dist/SvGridScheduler.svelte +5358 -5358
  24. package/dist/SvImportDialog.svelte +1020 -1020
  25. package/dist/SvImportDialog.svelte.d.ts +2 -2
  26. package/dist/SvLookupInput.svelte +180 -180
  27. package/dist/SvLookupInput.svelte.d.ts +1 -1
  28. package/dist/SvPivotDesigner.svelte +2041 -1990
  29. package/dist/SvPivotDesigner.svelte.d.ts +2 -2
  30. package/dist/SvRecordDetail.svelte.d.ts +1 -1
  31. package/dist/SvRibbonIcon.svelte +46 -0
  32. package/dist/SvRibbonIcon.svelte.d.ts +17 -0
  33. package/dist/SvSchedule.svelte.d.ts +1 -1
  34. package/dist/SvSchemaChart.svelte +236 -234
  35. package/dist/SvSchemaChart.svelte.d.ts +2 -2
  36. package/dist/SvSchemaDashboard.svelte +130 -130
  37. package/dist/SvSchemaDashboard.svelte.d.ts +3 -3
  38. package/dist/SvSheet.svelte +4114 -0
  39. package/dist/SvSheet.svelte.d.ts +142 -0
  40. package/dist/SvSheetComment.svelte +98 -0
  41. package/dist/SvSheetComment.svelte.d.ts +22 -0
  42. package/dist/SvSheetConditionalFormat.svelte +162 -0
  43. package/dist/SvSheetConditionalFormat.svelte.d.ts +14 -0
  44. package/dist/SvSheetDataValidation.svelte +249 -0
  45. package/dist/SvSheetDataValidation.svelte.d.ts +14 -0
  46. package/dist/SvSheetFilterMenu.svelte +217 -0
  47. package/dist/SvSheetFilterMenu.svelte.d.ts +17 -0
  48. package/dist/SvSheetFindReplace.svelte +132 -0
  49. package/dist/SvSheetFindReplace.svelte.d.ts +10 -0
  50. package/dist/SvSheetFormatCells.svelte +421 -0
  51. package/dist/SvSheetFormatCells.svelte.d.ts +17 -0
  52. package/dist/SvSheetGoalSeek.svelte +144 -0
  53. package/dist/SvSheetGoalSeek.svelte.d.ts +12 -0
  54. package/dist/SvSheetInsertFunction.svelte +147 -0
  55. package/dist/SvSheetInsertFunction.svelte.d.ts +8 -0
  56. package/dist/SvSheetListPicker.svelte +89 -0
  57. package/dist/SvSheetListPicker.svelte.d.ts +16 -0
  58. package/dist/SvSheetManageRules.svelte +185 -0
  59. package/dist/SvSheetManageRules.svelte.d.ts +16 -0
  60. package/dist/SvSheetNameManager.svelte +225 -0
  61. package/dist/SvSheetNameManager.svelte.d.ts +11 -0
  62. package/dist/SvSheetPasteSpecial.svelte +105 -0
  63. package/dist/SvSheetPasteSpecial.svelte.d.ts +12 -0
  64. package/dist/SvSheetRemoveDuplicates.svelte +149 -0
  65. package/dist/SvSheetRemoveDuplicates.svelte.d.ts +12 -0
  66. package/dist/SvSheetRibbon.svelte +1201 -0
  67. package/dist/SvSheetRibbon.svelte.d.ts +34 -0
  68. package/dist/SvSheetSizeDialog.svelte +58 -0
  69. package/dist/SvSheetSizeDialog.svelte.d.ts +11 -0
  70. package/dist/SvSheetTabs.svelte +441 -0
  71. package/dist/SvSheetTabs.svelte.d.ts +36 -0
  72. package/dist/SvSheetTabs.test-harness.svelte.d.ts +17 -0
  73. package/dist/SvSheetTabs.test-harness.svelte.js +22 -0
  74. package/dist/SvSheetTextToColumns.svelte +172 -0
  75. package/dist/SvSheetTextToColumns.svelte.d.ts +13 -0
  76. package/dist/SvSheetValidationAlert.svelte +83 -0
  77. package/dist/SvSheetValidationAlert.svelte.d.ts +15 -0
  78. package/dist/advanced-filter/expr-columns-from-grid.d.ts +1 -1
  79. package/dist/advanced-filter-enable.js +3 -3
  80. package/dist/alerts/alert-engine-attach.d.ts +2 -2
  81. package/dist/alerts/alert-engine-attach.js +3 -3
  82. package/dist/alerts/alert-engine.d.ts +1 -1
  83. package/dist/alerts/alert-engine.js +2 -2
  84. package/dist/alerts/alert-formats.d.ts +1 -1
  85. package/dist/alerts/alert-formats.js +1 -1
  86. package/dist/alerts/alert-observer.d.ts +3 -3
  87. package/dist/alerts/alert-observer.js +1 -1
  88. package/dist/alerts/alert-storage.d.ts +1 -1
  89. package/dist/alerts/alert-store.svelte.d.ts +1 -1
  90. package/dist/alerts/alert-types.d.ts +2 -2
  91. package/dist/alerts.js +2 -2
  92. package/dist/board.js +2 -2
  93. package/dist/cdn/svgrid-enterprise.svelte-external.js +19046 -5428
  94. package/dist/designer/assets/GridMenus-BlsvL_aU.js +8 -0
  95. package/dist/designer/assets/SvChartMenu-BYO9cYdy.css +1 -0
  96. package/dist/designer/assets/SvChartMenu-D9hEeHar.js +1 -0
  97. package/dist/designer/assets/SvDateRangeInput-BBRzrQeg.js +1 -0
  98. package/dist/designer/assets/SvDateRangeInput-C0iCCZ8o.css +1 -0
  99. package/dist/designer/assets/SvDateTimePicker-DARvKUL2.js +1 -0
  100. package/dist/designer/assets/SvDateTimePicker-DPv09DIT.css +1 -0
  101. package/dist/designer/assets/{preload-helper-CG0n22O7.js → SvGrid.helpers-BgT-gnCo.js} +1 -1
  102. package/dist/designer/assets/SvGridCellEditor-C7uQXYds.js +4 -0
  103. package/dist/designer/assets/SvGridChart-B8j1SSy3.js +3 -0
  104. package/dist/designer/assets/SvGridChart-BgLuPO7I.css +1 -0
  105. package/dist/designer/assets/SvGridChartBuilder-08YWWeqY.css +1 -0
  106. package/dist/designer/assets/SvGridChartBuilder-kvyIU_Rl.js +1 -0
  107. package/dist/designer/assets/SvGridChartPanel-4Pc8y5yO.css +1 -0
  108. package/dist/designer/assets/SvGridChartPanel-pT6ITc2P.js +4 -0
  109. package/dist/designer/assets/SvGridChartView-7msfnWZT.css +1 -0
  110. package/dist/designer/assets/SvGridChartView-bg281UA1.js +1 -0
  111. package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +1 -0
  112. package/dist/designer/assets/SvGridDropdown-CcidB3rm.css +1 -0
  113. package/dist/designer/assets/SvListBox-BDS66lmZ.js +110 -0
  114. package/dist/designer/assets/SvListBox-BXfyqy4a.css +1 -0
  115. package/dist/designer/assets/SvMenuList-DJ47ba1h.css +1 -0
  116. package/dist/designer/assets/SvMenuList-Dgq2D5VN.js +1 -0
  117. package/dist/designer/assets/SvTabs-DKmwb5p1.css +1 -0
  118. package/dist/designer/assets/SvTabs-UFCMTHXS.js +1 -0
  119. package/dist/designer/assets/cell-formatting-wr5wm7US.js +1 -0
  120. package/dist/designer/assets/chart-cIPUsbM5.js +1 -0
  121. package/dist/designer/assets/chart-export-B6bkQ3X8.js +11 -0
  122. package/dist/designer/assets/chart-export-pdf-BbA28-gt.js +11 -0
  123. package/dist/designer/assets/chart-panel-messages-DtTxpBUU.js +1 -0
  124. package/dist/designer/assets/chart-summary-Czu_5epb.js +1 -0
  125. package/dist/designer/assets/chart-trend-D5I5VEe8.js +1 -0
  126. package/dist/designer/assets/chart-validate-BMqM-qkF.js +1 -0
  127. package/dist/designer/assets/column-resize-BYDzR1Ve.js +1 -0
  128. package/dist/designer/assets/date-format-B8JbEtIG.js +1 -0
  129. package/dist/designer/assets/date-format-DKS-z0xS.css +1 -0
  130. package/dist/designer/assets/editor-contract-Bpoa7A5g.js +1 -0
  131. package/dist/designer/assets/export-format-D-eP4b2l.js +6 -0
  132. package/dist/designer/assets/focus-trap-CAreAhlU.js +1 -0
  133. package/dist/designer/assets/index-CMFgAoVV.css +1 -0
  134. package/dist/designer/assets/{index-zUBix-JQ.js → index-DwU7CAMm.js} +2985 -141
  135. package/dist/designer/assets/list-option-BP_dWS66.js +1 -0
  136. package/dist/designer/assets/preload-helper-HclGiUj8.js +1 -0
  137. package/dist/designer/assets/row-resize-DLktcqUK.js +1 -0
  138. package/dist/designer/assets/src-CITpcm6b.js +1 -0
  139. package/dist/designer/assets/src-EdI3Xqds.js +58 -0
  140. package/dist/designer/index.html +32 -23
  141. package/dist/export-conditional.d.ts +1 -1
  142. package/dist/export-pdf.d.ts +89 -0
  143. package/dist/export-pdf.js +130 -0
  144. package/dist/export-print.js +19 -19
  145. package/dist/export-xls.d.ts +2 -2
  146. package/dist/export.d.ts +2 -2
  147. package/dist/export.js +23 -16
  148. package/dist/expressions/builder-tree.d.ts +2 -2
  149. package/dist/expressions/builder-tree.js +1 -1
  150. package/dist/expressions/compile.d.ts +1 -1
  151. package/dist/import.js +1 -1
  152. package/dist/index.d.ts +116 -53
  153. package/dist/index.js +117 -50
  154. package/dist/install.d.ts +4 -4
  155. package/dist/install.js +16 -11
  156. package/dist/license.d.ts +3 -2
  157. package/dist/license.js +9 -4
  158. package/dist/node/studio.js +187 -116
  159. package/dist/pivot-chart.d.ts +26 -2
  160. package/dist/pivot-chart.js +25 -69
  161. package/dist/pivot-designer.d.ts +1 -1
  162. package/dist/pivot-enable.js +3 -3
  163. package/dist/print.d.ts +1 -1
  164. package/dist/print.js +4 -4
  165. package/dist/scheduler-config.d.ts +5 -5
  166. package/dist/scheduler-freebusy.d.ts +1 -1
  167. package/dist/scheduler-freebusy.js +1 -1
  168. package/dist/scheduler.js +2 -2
  169. package/dist/schema-designer.d.ts +1 -1
  170. package/dist/schema-designer.js +2 -2
  171. package/dist/selection-bar.js +2 -2
  172. package/dist/sheet/address.d.ts +43 -0
  173. package/dist/sheet/address.js +81 -0
  174. package/dist/sheet/ast.d.ts +94 -0
  175. package/dist/sheet/ast.js +56 -0
  176. package/dist/sheet/auto-filter.d.ts +66 -0
  177. package/dist/sheet/auto-filter.js +147 -0
  178. package/dist/sheet/autocomplete.d.ts +42 -0
  179. package/dist/sheet/autocomplete.js +162 -0
  180. package/dist/sheet/coerce.d.ts +31 -0
  181. package/dist/sheet/coerce.js +122 -0
  182. package/dist/sheet/commands.d.ts +89 -0
  183. package/dist/sheet/commands.js +230 -0
  184. package/dist/sheet/comments.d.ts +29 -0
  185. package/dist/sheet/comments.js +73 -0
  186. package/dist/sheet/conditional-formats.d.ts +144 -0
  187. package/dist/sheet/conditional-formats.js +316 -0
  188. package/dist/sheet/deps.d.ts +60 -0
  189. package/dist/sheet/deps.js +199 -0
  190. package/dist/sheet/document.d.ts +150 -0
  191. package/dist/sheet/document.js +264 -0
  192. package/dist/sheet/edit-keys.d.ts +14 -0
  193. package/dist/sheet/edit-keys.js +40 -0
  194. package/dist/sheet/entry.d.ts +31 -0
  195. package/dist/sheet/entry.js +76 -0
  196. package/dist/sheet/evaluate.d.ts +61 -0
  197. package/dist/sheet/evaluate.js +337 -0
  198. package/dist/sheet/find-replace.d.ts +62 -0
  199. package/dist/sheet/find-replace.js +152 -0
  200. package/dist/sheet/format-store.d.ts +99 -0
  201. package/dist/sheet/format-store.js +233 -0
  202. package/dist/sheet/freeze.d.ts +54 -0
  203. package/dist/sheet/freeze.js +58 -0
  204. package/dist/sheet/function-catalog.d.ts +10 -0
  205. package/dist/sheet/function-catalog.js +94 -0
  206. package/dist/sheet/functions.d.ts +28 -0
  207. package/dist/sheet/functions.js +362 -0
  208. package/dist/sheet/goal-seek.d.ts +73 -0
  209. package/dist/sheet/goal-seek.js +153 -0
  210. package/dist/sheet/index.d.ts +53 -0
  211. package/dist/sheet/index.js +53 -0
  212. package/dist/sheet/merges.d.ts +71 -0
  213. package/dist/sheet/merges.js +137 -0
  214. package/dist/sheet/names.d.ts +31 -0
  215. package/dist/sheet/names.js +87 -0
  216. package/dist/sheet/navigate.d.ts +52 -0
  217. package/dist/sheet/navigate.js +135 -0
  218. package/dist/sheet/number-format.d.ts +63 -0
  219. package/dist/sheet/number-format.js +508 -0
  220. package/dist/sheet/palette.d.ts +19 -0
  221. package/dist/sheet/palette.js +84 -0
  222. package/dist/sheet/parse.d.ts +13 -0
  223. package/dist/sheet/parse.js +108 -0
  224. package/dist/sheet/paste-special.d.ts +164 -0
  225. package/dist/sheet/paste-special.js +592 -0
  226. package/dist/sheet/protection.d.ts +21 -0
  227. package/dist/sheet/protection.js +48 -0
  228. package/dist/sheet/rects.d.ts +45 -0
  229. package/dist/sheet/rects.js +112 -0
  230. package/dist/sheet/refs.d.ts +82 -0
  231. package/dist/sheet/refs.js +266 -0
  232. package/dist/sheet/ribbon-icons.d.ts +31 -0
  233. package/dist/sheet/ribbon-icons.js +350 -0
  234. package/dist/sheet/ribbon.d.ts +173 -0
  235. package/dist/sheet/ribbon.js +753 -0
  236. package/dist/sheet/shortcuts.d.ts +164 -0
  237. package/dist/sheet/shortcuts.js +623 -0
  238. package/dist/sheet/structure.d.ts +87 -0
  239. package/dist/sheet/structure.js +166 -0
  240. package/dist/sheet/tables.d.ts +70 -0
  241. package/dist/sheet/tables.js +147 -0
  242. package/dist/sheet/tokenize.d.ts +54 -0
  243. package/dist/sheet/tokenize.js +304 -0
  244. package/dist/sheet/transforms.d.ts +76 -0
  245. package/dist/sheet/transforms.js +154 -0
  246. package/dist/sheet/validation.d.ts +92 -0
  247. package/dist/sheet/validation.js +241 -0
  248. package/dist/sheet/workbook.d.ts +72 -0
  249. package/dist/sheet/workbook.js +409 -0
  250. package/dist/sheet-enable.d.ts +6 -0
  251. package/dist/sheet-enable.js +46 -0
  252. package/dist/sources/aggregate.d.ts +1 -1
  253. package/dist/sources/auth-supabase.js +1 -1
  254. package/dist/sources/dashboard.d.ts +2 -2
  255. package/dist/sources/dashboard.js +1 -1
  256. package/dist/sources/index.d.ts +13 -13
  257. package/dist/sources/index.js +13 -13
  258. package/dist/sources/realtime-supabase.js +1 -1
  259. package/dist/sources/relation-lookup.d.ts +1 -1
  260. package/dist/sources/relation-lookup.js +1 -1
  261. package/dist/sources/rest-adapters.d.ts +1 -1
  262. package/dist/sources/rest-adapters.js +1 -1
  263. package/dist/sources/rest.d.ts +2 -2
  264. package/dist/sources/rest.js +3 -3
  265. package/dist/sources/supabase.d.ts +2 -2
  266. package/dist/sources/supabase.js +3 -3
  267. package/dist/sources/with-entity-rules.d.ts +1 -1
  268. package/dist/sources/with-entity-rules.js +1 -1
  269. package/dist/sources/with-relation-labels.d.ts +1 -1
  270. package/dist/studio/emit-project.js +2161 -2127
  271. package/dist/studio/emit-schema.js +369 -369
  272. package/dist/studio/index.d.ts +1 -1
  273. package/dist/studio/index.js +1 -1
  274. package/dist/studio/introspect-db.js +45 -45
  275. package/dist/studio/project.d.ts +10 -0
  276. package/dist/studio/samples/crm.js +6 -6
  277. package/dist/studio/samples/fleet.js +7 -7
  278. package/dist/studio/samples/insurance.js +9 -9
  279. package/dist/studio/samples/inventory.js +12 -12
  280. package/dist/studio/samples/projects.js +5 -5
  281. package/dist/studio/samples/support.js +8 -8
  282. package/dist/studio/scaffold-app.js +104 -104
  283. package/dist/studio/scaffold.js +151 -151
  284. package/dist/studio/ui-components.d.ts +7 -0
  285. package/dist/studio/ui-components.generated.js +63 -1
  286. package/dist/studio/ui-components.js +35 -0
  287. package/dist/sveltekit/in-memory.d.ts +3 -3
  288. package/dist/sveltekit/in-memory.js +4 -4
  289. package/dist/sveltekit/index.d.ts +6 -6
  290. package/dist/sveltekit/index.js +5 -5
  291. package/dist/sveltekit/query-plan.d.ts +1 -1
  292. package/dist/sveltekit/sql-source.d.ts +4 -4
  293. package/dist/sveltekit/sql-source.js +4 -4
  294. package/dist/sveltekit/sql.d.ts +1 -1
  295. package/dist/sveltekit/transport.d.ts +2 -2
  296. package/dist/sveltekit/transport.js +1 -1
  297. package/dist/upgrade-prompt.js +25 -25
  298. package/dist/version.d.ts +1 -1
  299. package/dist/version.js +1 -1
  300. package/package.json +12 -4
  301. package/dist/designer/assets/GridMenus-Cgilexpk.js +0 -8
  302. package/dist/designer/assets/SvDateRangeInput-BV5OXYQ2.css +0 -1
  303. package/dist/designer/assets/SvDateRangeInput-CVn-yqrQ.js +0 -1
  304. package/dist/designer/assets/SvDateTimePicker-BdioTrJQ.js +0 -1
  305. package/dist/designer/assets/SvDateTimePicker-CY8TK4BT.css +0 -1
  306. package/dist/designer/assets/SvField-BF-9TJSd.css +0 -1
  307. package/dist/designer/assets/SvField-BsqiA5me.js +0 -1
  308. package/dist/designer/assets/SvGridCellEditor-dLY7_kk9.js +0 -2
  309. package/dist/designer/assets/SvGridChart-BEDNTdc5.js +0 -2
  310. package/dist/designer/assets/SvGridChart-Vu4Nvjiv.css +0 -1
  311. package/dist/designer/assets/SvGridChartPanel-x3lzSxuf.js +0 -10
  312. package/dist/designer/assets/SvGridChartView-CAKhPELi.js +0 -1
  313. package/dist/designer/assets/SvGridChartView-DX9HfkBR.css +0 -1
  314. package/dist/designer/assets/SvGridDropdown-CAYG7Y-O.js +0 -1
  315. package/dist/designer/assets/SvGridDropdown-Crwb2P3Q.css +0 -1
  316. package/dist/designer/assets/SvListBox-CVYQcLX9.js +0 -1
  317. package/dist/designer/assets/SvListBox-DgN8kvjt.css +0 -1
  318. package/dist/designer/assets/chart-DHEgt4lN.js +0 -1
  319. package/dist/designer/assets/column-resize-C_inr5zT.js +0 -1
  320. package/dist/designer/assets/date-format-4DJvNtG2.js +0 -1
  321. package/dist/designer/assets/date-format-Dzy4mTGh.css +0 -1
  322. package/dist/designer/assets/easing-zaypKrr0.js +0 -3
  323. package/dist/designer/assets/export-format-DwjuTfrQ.js +0 -6
  324. package/dist/designer/assets/index-Cp7fDJ3b.css +0 -1
  325. package/dist/designer/assets/js-scroller.svelte-Bhxqb3-c.js +0 -110
  326. package/dist/designer/assets/row-resize-B0FWHcNr.js +0 -1
  327. package/dist/designer/assets/src-B7DNcoQK.css +0 -1
  328. package/dist/designer/assets/src-BoYyigAC.js +0 -2896
  329. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  330. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  331. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -3875
  332. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -1
  333. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -21
  334. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -1
  335. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -1938
  336. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -1
  337. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -205
  338. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -1
  339. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -18
  340. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -1
  341. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -264
  342. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -1
  343. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -697
  344. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -1
  345. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  346. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  347. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  348. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  349. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  350. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  351. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  352. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  353. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  354. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  355. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  356. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  357. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  358. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  359. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  360. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  361. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  362. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  363. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  364. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  365. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  366. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  367. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  368. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  369. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  370. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  371. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  372. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  373. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  374. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  375. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  376. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  377. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  378. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  379. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  380. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  381. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -4938
  382. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -1
  383. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -495
  384. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -1
  385. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -190
  386. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -1
  387. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -8
  388. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -1
  389. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -138
  390. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -1
@@ -17,8 +17,8 @@ type PivotInputRow = Record<string, unknown>;
17
17
  * SvPivotDesigner {data} {fields} bind:layout
18
18
  */
19
19
  import { type ColumnDef } from '@svgrid/grid';
20
- import { type PivotRow, type PivotAggregatorId } from './pivot';
21
- import { type PivotField, type PivotLayout, type PivotPreset } from './pivot-designer';
20
+ import { type PivotRow, type PivotAggregatorId } from './pivot.js';
21
+ import { type PivotField, type PivotLayout, type PivotPreset } from './pivot-designer.js';
22
22
  declare function $$render<T extends PivotInputRow>(): {
23
23
  props: {
24
24
  /** Flat input rows. */
@@ -12,7 +12,7 @@
12
12
  * identically. When `row` is omitted it self-drives off `rows` (defaults to the
13
13
  * first, switchable via the header dropdown).
14
14
  */
15
- import type { EntitySchema } from './schema';
15
+ import type { EntitySchema } from './schema.js';
16
16
  type Row = Record<string, unknown>;
17
17
  type Section = {
18
18
  label: string;
@@ -0,0 +1,46 @@
1
+ <script lang="ts">
2
+ /**
3
+ * One ribbon icon, by name, at any size.
4
+ *
5
+ * The paths live in `sheet/ribbon-icons.ts` on a 16-unit grid; the SVG
6
+ * scales them, so a large button gets the same drawing at 32px without a
7
+ * second set. Everything is drawn in `currentColor`: the icon is the
8
+ * colour of the text around it, black on a light ribbon and white on a
9
+ * dark one, and nothing in the set carries a colour of its own.
10
+ */
11
+ import { RIBBON_ICONS, type RibbonIconName } from './sheet/ribbon-icons'
12
+
13
+ let { name, size = 16 }: { name: RibbonIconName; size?: number } = $props()
14
+
15
+ const paths = $derived(RIBBON_ICONS[name] ?? [])
16
+ </script>
17
+
18
+ <svg
19
+ class="sv-ribbon-icon"
20
+ width={size}
21
+ height={size}
22
+ viewBox="0 0 16 16"
23
+ fill="none"
24
+ stroke="currentColor"
25
+ stroke-width="1.4"
26
+ stroke-linecap="round"
27
+ stroke-linejoin="round"
28
+ aria-hidden="true"
29
+ focusable="false"
30
+ >
31
+ {#each paths as path, i (i)}
32
+ <path
33
+ d={path.d}
34
+ fill={path.fill ? 'currentColor' : 'none'}
35
+ stroke-width={path.width}
36
+ stroke-dasharray={path.dash}
37
+ />
38
+ {/each}
39
+ </svg>
40
+
41
+ <style>
42
+ .sv-ribbon-icon {
43
+ display: block;
44
+ flex: 0 0 auto;
45
+ }
46
+ </style>
@@ -0,0 +1,17 @@
1
+ /**
2
+ * One ribbon icon, by name, at any size.
3
+ *
4
+ * The paths live in `sheet/ribbon-icons.ts` on a 16-unit grid; the SVG
5
+ * scales them, so a large button gets the same drawing at 32px without a
6
+ * second set. Everything is drawn in `currentColor`: the icon is the
7
+ * colour of the text around it, black on a light ribbon and white on a
8
+ * dark one, and nothing in the set carries a colour of its own.
9
+ */
10
+ import { type RibbonIconName } from './sheet/ribbon-icons.js';
11
+ type $$ComponentProps = {
12
+ name: RibbonIconName;
13
+ size?: number;
14
+ };
15
+ declare const SvRibbonIcon: import("svelte").Component<$$ComponentProps, {}, "">;
16
+ type SvRibbonIcon = ReturnType<typeof SvRibbonIcon>;
17
+ export default SvRibbonIcon;
@@ -8,7 +8,7 @@
8
8
  * Pure presentation over plain rows + an EntitySchema (same inputs as SvBoard /
9
9
  * SvSchemaChart), so the generated app and the designer preview match.
10
10
  */
11
- import type { EntitySchema } from './schema';
11
+ import type { EntitySchema } from './schema.js';
12
12
  type Row = Record<string, unknown>;
13
13
  type $$ComponentProps = {
14
14
  schema: EntitySchema<any>;
@@ -1,234 +1,236 @@
1
- <script lang="ts" module>
2
- type ChartRow = Record<string, unknown>
3
- </script>
4
-
5
- <script lang="ts" generics="TData extends ChartRow">
6
- /**
7
- * SvSchemaChart - a reusable chart bound to an `EntitySchema`. It picks
8
- * chart-able fields from the schema (dimensions to group by, measures to
9
- * reduce), renders built-in controls, and draws with `SvGridChart`.
10
- *
11
- * Aggregation is either client-side (pass `rows`) or server-side (pass
12
- * `getAggregate`, e.g. a SQL / Supabase source's `GROUP BY`), so it scales
13
- * past what a page holds. Click a category to drill (`onDrill`).
14
- */
15
- import { SvGridChart, SvGridDropdown, type ChartSpec, type ChartType, type ChartSelection } from '@svgrid/grid'
16
- import { titleCase, type EntitySchema } from './schema'
17
- import {
18
- aggregateRows,
19
- chartFieldsFromSchema,
20
- type AggregateBucket,
21
- type AggregateReduce,
22
- type AggregateRequest,
23
- } from './sources/aggregate'
24
-
25
- type FilterModel = AggregateRequest['filterModel']
26
-
27
- type Props = {
28
- schema: EntitySchema<TData>
29
- /** Client-side data to aggregate. Ignored when `getAggregate` is set. */
30
- rows?: ReadonlyArray<TData>
31
- /** Server-side aggregation (a data source's `getAggregate`). Takes precedence. */
32
- getAggregate?: (request: AggregateRequest) => Promise<AggregateBucket[]>
33
- /** Filter passed to `getAggregate`. */
34
- filterModel?: FilterModel
35
- dimension?: string
36
- measure?: string
37
- reduce?: AggregateReduce
38
- type?: ChartType
39
- /** Show the built-in dimension / measure / type controls. Default true. */
40
- controls?: boolean
41
- height?: number
42
- width?: number
43
- dataLabels?: boolean
44
- formatValue?: (v: number) => string
45
- onDrill?: (category: string, dimension: string) => void
46
- /** Bump to re-fetch server aggregates (e.g. after a mutation). */
47
- refreshKey?: unknown
48
- /** Brand color. Bars / lines use it; pie slices grouped by an enum use the
49
- * enum's own option colors (matching status badges). */
50
- accent?: string
51
- }
52
-
53
- let {
54
- schema,
55
- rows,
56
- getAggregate,
57
- filterModel,
58
- dimension,
59
- measure,
60
- reduce,
61
- type,
62
- controls = true,
63
- height = 300,
64
- width = 460,
65
- dataLabels = true,
66
- formatValue,
67
- onDrill,
68
- refreshKey,
69
- accent,
70
- }: Props = $props()
71
-
72
- const fields = $derived(chartFieldsFromSchema(schema as EntitySchema))
73
-
74
- // Render the chart at its ACTUAL pixel width so the SVG viewBox maps 1:1 to
75
- // screen pixels (scale factor = 1). Otherwise the SVG stretches to fill a wide
76
- // block and its text (font-size in user units) scales up with it - "fonts that
77
- // grow with the chart". Measured width keeps labels at a fixed px size, like
78
- // the grid. Falls back to the `width` prop until the first measurement.
79
- let measuredW = $state(0)
80
- let plotEl: HTMLDivElement | undefined = $state()
81
- $effect(() => {
82
- const el = plotEl
83
- if (!el || typeof ResizeObserver === 'undefined') return
84
- const ro = new ResizeObserver((entries) => {
85
- const w = Math.round(entries[0]?.contentRect.width ?? 0)
86
- if (w > 0 && w !== measuredW) measuredW = w
87
- })
88
- ro.observe(el)
89
- return () => ro.disconnect()
90
- })
91
-
92
- let dim = $state('')
93
- let msr = $state('')
94
- let red = $state<AggregateReduce>('sum')
95
- let ctype = $state<ChartType>('bar')
96
-
97
- // Follow the props reactively, so a controlled parent (e.g. the Studio preview,
98
- // which hides the dropdowns) updates the chart whenever its dimension / measure /
99
- // reduce / type change. One effect per prop so a change to one doesn't reset the
100
- // others; the built-in dropdowns still write to this state and persist, because a
101
- // dropdown change doesn't feed back into the props (so these effects don't re-run).
102
- $effect(() => { if (type !== undefined) ctype = type })
103
- $effect(() => { if (dimension !== undefined) dim = dimension })
104
- $effect(() => { if (measure !== undefined) msr = measure })
105
- $effect(() => { if (reduce !== undefined) red = reduce })
106
- // Keep the dimension / measure valid for the schema.
107
- $effect(() => {
108
- if (!dim || !fields.dimensions.includes(dim)) dim = fields.defaultDimension ?? fields.dimensions[0] ?? ''
109
- if ((!msr || !fields.measures.includes(msr)) && fields.measures.length) msr = fields.defaultMeasure ?? fields.measures[0] ?? ''
110
- })
111
-
112
- const labelOf = (field: string) => schema.fields.find((f) => f.field === field)?.label ?? titleCase(field)
113
- const measureLabel = $derived(
114
- red === 'count' ? 'Count' : `${red[0]!.toUpperCase() + red.slice(1)} ${labelOf(msr)}`,
115
- )
116
-
117
- let serverBuckets = $state<AggregateBucket[]>([])
118
- let fetchToken = 0
119
- $effect(() => {
120
- if (!getAggregate || !dim) return
121
- void refreshKey // re-run after a mutation
122
- const req: AggregateRequest = { dimension: dim, measure: msr || undefined, reduce: red, filterModel }
123
- const token = ++fetchToken
124
- getAggregate(req).then((bs) => {
125
- if (token === fetchToken) serverBuckets = bs
126
- })
127
- })
128
-
129
- const buckets = $derived(
130
- getAggregate
131
- ? serverBuckets
132
- : dim
133
- ? aggregateRows((rows ?? []) as ReadonlyArray<ChartRow>, { dimension: dim, measure: msr || undefined, reduce: red })
134
- : [],
135
- )
136
-
137
- // Options for the custom dropdown controls.
138
- const dimOptions = $derived(fields.dimensions.map((d) => ({ value: d, label: labelOf(d) })))
139
- const measureOptions = $derived(fields.measures.map((m) => ({ value: m, label: labelOf(m) })))
140
- const reduceOptions = [
141
- { value: 'count', label: 'Count' }, { value: 'sum', label: 'Sum' }, { value: 'avg', label: 'Average' },
142
- { value: 'min', label: 'Min' }, { value: 'max', label: 'Max' },
143
- ]
144
- const typeOptions = [
145
- { value: 'bar', label: 'Bar' }, { value: 'pie', label: 'Pie' }, { value: 'line', label: 'Line' }, { value: 'area', label: 'Area' },
146
- { value: 'radar', label: 'Radar' }, { value: 'funnel', label: 'Funnel' }, { value: 'waterfall', label: 'Waterfall' }, { value: 'treemap', label: 'Treemap' },
147
- ]
148
- // Cartesian types get x/y axis titles; radial / area-partition types don't.
149
- const CARTESIAN_TYPES = new Set<ChartType>(['bar', 'line', 'area', 'waterfall'])
150
-
151
- // Per-category colors from the dimension's enum options (status/stage/etc), in
152
- // bucket order, so a pie's slices match the grid's badge colors.
153
- const categoryColors = $derived.by<string[] | undefined>(() => {
154
- const opts = schema.fields.find((f) => f.field === dim)?.options
155
- if (!opts?.length) return undefined
156
- return buckets.map((b) => {
157
- const opt = opts.find((o) => String(o.value) === String(b.category))
158
- return opt?.color || accent || '#6366f1'
159
- })
160
- })
161
-
162
- const spec = $derived.by<ChartSpec>(() => {
163
- const s: ChartSpec = {
164
- type: ctype,
165
- categories: buckets.map((b) => b.category),
166
- // Bars / lines / areas take the brand accent; pie ignores series color and
167
- // uses the palette (semantic enum colors when available).
168
- series: [{ label: measureLabel, values: buckets.map((b) => b.value), ...(accent ? { color: accent } : {}) }],
169
- width: measuredW || width,
170
- height,
171
- ...(categoryColors ? { palette: categoryColors } : {}),
172
- }
173
- if (ctype === 'pie') s.innerRadius = 0.6
174
- // Treemap reads a tree, not a category/series pair - build a flat one from
175
- // the same buckets (each dimension value is a leaf sized by the measure).
176
- if (ctype === 'treemap') s.treemap = { name: measureLabel, children: buckets.map((b) => ({ name: b.category, value: b.value })) }
177
- if (CARTESIAN_TYPES.has(ctype)) {
178
- s.xAxisTitle = labelOf(dim)
179
- s.yAxisTitle = measureLabel
180
- }
181
- return s
182
- })
183
-
184
- function onSelect(sel: ChartSelection) {
185
- onDrill?.(String(sel.category), dim)
186
- }
187
- </script>
188
-
189
- <div class="sv-chart">
190
- {#if controls}
191
- <div class="sv-chart__controls">
192
- <div class="sv-chart__ctrl">
193
- <span>Group by</span>
194
- <div class="sv-chart__dd"><SvGridDropdown options={dimOptions} value={dim} autoOpen={false} onChange={(v) => (dim = String(v))} /></div>
195
- </div>
196
- <div class="sv-chart__ctrl">
197
- <span>Measure</span>
198
- <div class="sv-chart__dd"><SvGridDropdown options={reduceOptions} value={red} autoOpen={false} onChange={(v) => (red = v as AggregateReduce)} /></div>
199
- </div>
200
- {#if red !== 'count' && fields.measures.length}
201
- <div class="sv-chart__ctrl">
202
- <span>of</span>
203
- <div class="sv-chart__dd"><SvGridDropdown options={measureOptions} value={msr} autoOpen={false} onChange={(v) => (msr = String(v))} /></div>
204
- </div>
205
- {/if}
206
- <div class="sv-chart__ctrl">
207
- <span>Type</span>
208
- <div class="sv-chart__dd"><SvGridDropdown options={typeOptions} value={ctype} autoOpen={false} onChange={(v) => (ctype = v as ChartType)} /></div>
209
- </div>
210
- </div>
211
- {/if}
212
-
213
- {#if dim}
214
- <div class="sv-chart__plot" bind:this={plotEl}>
215
- <SvGridChart {spec} {dataLabels} {formatValue} {onSelect} />
216
- </div>
217
- {:else}
218
- <p class="sv-chart__empty">No chart-able fields in this schema.</p>
219
- {/if}
220
- </div>
221
-
222
- <style>
223
- .sv-chart { display: flex; flex-direction: column; gap: 10px; }
224
- .sv-chart__plot { width: 100%; min-width: 0; }
225
- .sv-chart__controls { display: flex; flex-wrap: wrap; gap: 10px; }
226
- .sv-chart__ctrl { display: flex; flex-direction: column; gap: 3px; font-size: 11px; font-weight: 600; color: var(--sg-muted, #666); }
227
- .sv-chart__dd {
228
- position: relative; height: 32px; min-width: 130px;
229
- border: 1px solid var(--sg-border, #ccc); border-radius: 8px; background: var(--sg-input-bg, #fff);
230
- }
231
- .sv-chart__dd :global(.sv-grid-dropdown),
232
- .sv-chart__dd :global(.sv-grid-dropdown-trigger) { background: transparent; border-radius: 8px; }
233
- .sv-chart__empty { color: var(--sg-muted, #888); font-size: 13px; padding: 24px; text-align: center; }
234
- </style>
1
+ <script lang="ts" module>
2
+ type ChartRow = Record<string, unknown>
3
+ </script>
4
+
5
+ <script lang="ts" generics="TData extends ChartRow">
6
+ /**
7
+ * SvSchemaChart - a reusable chart bound to an `EntitySchema`. It picks
8
+ * chart-able fields from the schema (dimensions to group by, measures to
9
+ * reduce), renders built-in controls, and draws with `SvGridChart`.
10
+ *
11
+ * Aggregation is either client-side (pass `rows`) or server-side (pass
12
+ * `getAggregate`, e.g. a SQL / Supabase source's `GROUP BY`), so it scales
13
+ * past what a page holds. Click a category to drill (`onDrill`).
14
+ */
15
+ import { SvGridChart, SvGridDropdown, type ChartSpec, type ChartType, type ChartSelection } from '@svgrid/grid'
16
+ import { titleCase, type EntitySchema } from './schema'
17
+ import {
18
+ aggregateRows,
19
+ chartFieldsFromSchema,
20
+ type AggregateBucket,
21
+ type AggregateReduce,
22
+ type AggregateRequest,
23
+ } from './sources/aggregate'
24
+
25
+ type FilterModel = AggregateRequest['filterModel']
26
+
27
+ type Props = {
28
+ schema: EntitySchema<TData>
29
+ /** Client-side data to aggregate. Ignored when `getAggregate` is set. */
30
+ rows?: ReadonlyArray<TData>
31
+ /** Server-side aggregation (a data source's `getAggregate`). Takes precedence. */
32
+ getAggregate?: (request: AggregateRequest) => Promise<AggregateBucket[]>
33
+ /** Filter passed to `getAggregate`. */
34
+ filterModel?: FilterModel
35
+ dimension?: string
36
+ measure?: string
37
+ reduce?: AggregateReduce
38
+ type?: ChartType
39
+ /** Show the built-in dimension / measure / type controls. Default true. */
40
+ controls?: boolean
41
+ height?: number
42
+ width?: number
43
+ dataLabels?: boolean
44
+ formatValue?: (v: number) => string
45
+ onDrill?: (category: string, dimension: string) => void
46
+ /** Bump to re-fetch server aggregates (e.g. after a mutation). */
47
+ refreshKey?: unknown
48
+ /** Brand color. Bars / lines use it; pie slices grouped by an enum use the
49
+ * enum's own option colors (matching status badges). */
50
+ accent?: string
51
+ }
52
+
53
+ let {
54
+ schema,
55
+ rows,
56
+ getAggregate,
57
+ filterModel,
58
+ dimension,
59
+ measure,
60
+ reduce,
61
+ type,
62
+ controls = true,
63
+ height = 300,
64
+ width = 460,
65
+ dataLabels = true,
66
+ formatValue,
67
+ onDrill,
68
+ refreshKey,
69
+ accent,
70
+ }: Props = $props()
71
+
72
+ const fields = $derived(chartFieldsFromSchema(schema as EntitySchema))
73
+
74
+ // Render the chart at its ACTUAL pixel width so the SVG viewBox maps 1:1 to
75
+ // screen pixels (scale factor = 1). Otherwise the SVG stretches to fill a wide
76
+ // block and its text (font-size in user units) scales up with it - "fonts that
77
+ // grow with the chart". Measured width keeps labels at a fixed px size, like
78
+ // the grid. Falls back to the `width` prop until the first measurement.
79
+ let measuredW = $state(0)
80
+ let plotEl: HTMLDivElement | undefined = $state()
81
+ $effect(() => {
82
+ const el = plotEl
83
+ if (!el || typeof ResizeObserver === 'undefined') return
84
+ const ro = new ResizeObserver((entries) => {
85
+ const w = Math.round(entries[0]?.contentRect.width ?? 0)
86
+ if (w > 0 && w !== measuredW) measuredW = w
87
+ })
88
+ ro.observe(el)
89
+ return () => ro.disconnect()
90
+ })
91
+
92
+ let dim = $state('')
93
+ let msr = $state('')
94
+ let red = $state<AggregateReduce>('sum')
95
+ let ctype = $state<ChartType>('bar')
96
+
97
+ // Follow the props reactively, so a controlled parent (e.g. the Studio preview,
98
+ // which hides the dropdowns) updates the chart whenever its dimension / measure /
99
+ // reduce / type change. One effect per prop so a change to one doesn't reset the
100
+ // others; the built-in dropdowns still write to this state and persist, because a
101
+ // dropdown change doesn't feed back into the props (so these effects don't re-run).
102
+ $effect(() => { if (type !== undefined) ctype = type })
103
+ $effect(() => { if (dimension !== undefined) dim = dimension })
104
+ $effect(() => { if (measure !== undefined) msr = measure })
105
+ $effect(() => { if (reduce !== undefined) red = reduce })
106
+ // Keep the dimension / measure valid for the schema.
107
+ $effect(() => {
108
+ if (!dim || !fields.dimensions.includes(dim)) dim = fields.defaultDimension ?? fields.dimensions[0] ?? ''
109
+ if ((!msr || !fields.measures.includes(msr)) && fields.measures.length) msr = fields.defaultMeasure ?? fields.measures[0] ?? ''
110
+ })
111
+
112
+ const labelOf = (field: string) => schema.fields.find((f) => f.field === field)?.label ?? titleCase(field)
113
+ const measureLabel = $derived(
114
+ red === 'count' ? 'Count' : `${red[0]!.toUpperCase() + red.slice(1)} ${labelOf(msr)}`,
115
+ )
116
+
117
+ let serverBuckets = $state<AggregateBucket[]>([])
118
+ let fetchToken = 0
119
+ $effect(() => {
120
+ if (!getAggregate || !dim) return
121
+ void refreshKey // re-run after a mutation
122
+ const req: AggregateRequest = { dimension: dim, measure: msr || undefined, reduce: red, filterModel }
123
+ const token = ++fetchToken
124
+ getAggregate(req).then((bs) => {
125
+ if (token === fetchToken) serverBuckets = bs
126
+ })
127
+ })
128
+
129
+ const buckets = $derived(
130
+ getAggregate
131
+ ? serverBuckets
132
+ : dim
133
+ ? aggregateRows((rows ?? []) as ReadonlyArray<ChartRow>, { dimension: dim, measure: msr || undefined, reduce: red })
134
+ : [],
135
+ )
136
+
137
+ // Options for the custom dropdown controls.
138
+ const dimOptions = $derived(fields.dimensions.map((d) => ({ value: d, label: labelOf(d) })))
139
+ const measureOptions = $derived(fields.measures.map((m) => ({ value: m, label: labelOf(m) })))
140
+ const reduceOptions = [
141
+ { value: 'count', label: 'Count' }, { value: 'sum', label: 'Sum' }, { value: 'avg', label: 'Average' },
142
+ { value: 'min', label: 'Min' }, { value: 'max', label: 'Max' },
143
+ ]
144
+ const typeOptions = [
145
+ { value: 'bar', label: 'Bar' }, { value: 'pie', label: 'Pie' }, { value: 'line', label: 'Line' }, { value: 'area', label: 'Area' },
146
+ { value: 'radar', label: 'Radar' }, { value: 'funnel', label: 'Funnel' }, { value: 'waterfall', label: 'Waterfall' }, { value: 'treemap', label: 'Treemap' },
147
+ { value: 'lollipop', label: 'Lollipop' }, { value: 'pareto', label: 'Pareto' }, { value: 'sunburst', label: 'Sunburst' },
148
+ { value: 'radial-bar', label: 'Radial bar' }, { value: 'radial-column', label: 'Radial column' }, { value: 'nightingale', label: 'Nightingale' },
149
+ ]
150
+ // Cartesian types get x/y axis titles; radial / area-partition types don't.
151
+ const CARTESIAN_TYPES = new Set<ChartType>(['bar', 'line', 'area', 'waterfall', 'lollipop', 'pareto'])
152
+
153
+ // Per-category colors from the dimension's enum options (status/stage/etc), in
154
+ // bucket order, so a pie's slices match the grid's badge colors.
155
+ const categoryColors = $derived.by<string[] | undefined>(() => {
156
+ const opts = schema.fields.find((f) => f.field === dim)?.options
157
+ if (!opts?.length) return undefined
158
+ return buckets.map((b) => {
159
+ const opt = opts.find((o) => String(o.value) === String(b.category))
160
+ return opt?.color || accent || '#6366f1'
161
+ })
162
+ })
163
+
164
+ const spec = $derived.by<ChartSpec>(() => {
165
+ const s: ChartSpec = {
166
+ type: ctype,
167
+ categories: buckets.map((b) => b.category),
168
+ // Bars / lines / areas take the brand accent; pie ignores series color and
169
+ // uses the palette (semantic enum colors when available).
170
+ series: [{ label: measureLabel, values: buckets.map((b) => b.value), ...(accent ? { color: accent } : {}) }],
171
+ width: measuredW || width,
172
+ height,
173
+ ...(categoryColors ? { palette: categoryColors } : {}),
174
+ }
175
+ if (ctype === 'pie') s.innerRadius = 0.6
176
+ // Treemap reads a tree, not a category/series pair - build a flat one from
177
+ // the same buckets (each dimension value is a leaf sized by the measure).
178
+ if (ctype === 'treemap' || ctype === 'sunburst') s.treemap = { name: measureLabel, children: buckets.map((b) => ({ name: b.category, value: b.value })) }
179
+ if (CARTESIAN_TYPES.has(ctype)) {
180
+ s.xAxisTitle = labelOf(dim)
181
+ s.yAxisTitle = measureLabel
182
+ }
183
+ return s
184
+ })
185
+
186
+ function onSelect(sel: ChartSelection) {
187
+ onDrill?.(String(sel.category), dim)
188
+ }
189
+ </script>
190
+
191
+ <div class="sv-chart">
192
+ {#if controls}
193
+ <div class="sv-chart__controls">
194
+ <div class="sv-chart__ctrl">
195
+ <span>Group by</span>
196
+ <div class="sv-chart__dd"><SvGridDropdown options={dimOptions} value={dim} autoOpen={false} onChange={(v) => (dim = String(v))} /></div>
197
+ </div>
198
+ <div class="sv-chart__ctrl">
199
+ <span>Measure</span>
200
+ <div class="sv-chart__dd"><SvGridDropdown options={reduceOptions} value={red} autoOpen={false} onChange={(v) => (red = v as AggregateReduce)} /></div>
201
+ </div>
202
+ {#if red !== 'count' && fields.measures.length}
203
+ <div class="sv-chart__ctrl">
204
+ <span>of</span>
205
+ <div class="sv-chart__dd"><SvGridDropdown options={measureOptions} value={msr} autoOpen={false} onChange={(v) => (msr = String(v))} /></div>
206
+ </div>
207
+ {/if}
208
+ <div class="sv-chart__ctrl">
209
+ <span>Type</span>
210
+ <div class="sv-chart__dd"><SvGridDropdown options={typeOptions} value={ctype} autoOpen={false} onChange={(v) => (ctype = v as ChartType)} /></div>
211
+ </div>
212
+ </div>
213
+ {/if}
214
+
215
+ {#if dim}
216
+ <div class="sv-chart__plot" bind:this={plotEl}>
217
+ <SvGridChart {spec} {dataLabels} {formatValue} {onSelect} />
218
+ </div>
219
+ {:else}
220
+ <p class="sv-chart__empty">No chart-able fields in this schema.</p>
221
+ {/if}
222
+ </div>
223
+
224
+ <style>
225
+ .sv-chart { display: flex; flex-direction: column; gap: 10px; }
226
+ .sv-chart__plot { width: 100%; min-width: 0; }
227
+ .sv-chart__controls { display: flex; flex-wrap: wrap; gap: 10px; }
228
+ .sv-chart__ctrl { display: flex; flex-direction: column; gap: 3px; font-size: 11px; font-weight: 600; color: var(--sg-muted, #666); }
229
+ .sv-chart__dd {
230
+ position: relative; height: 32px; min-width: 130px;
231
+ border: 1px solid var(--sg-border, #ccc); border-radius: 8px; background: var(--sg-input-bg, #fff);
232
+ }
233
+ .sv-chart__dd :global(.sv-grid-dropdown),
234
+ .sv-chart__dd :global(.sv-grid-dropdown-trigger) { background: transparent; border-radius: 8px; }
235
+ .sv-chart__empty { color: var(--sg-muted, #888); font-size: 13px; padding: 24px; text-align: center; }
236
+ </style>
@@ -9,8 +9,8 @@ type ChartRow = Record<string, unknown>;
9
9
  * past what a page holds. Click a category to drill (`onDrill`).
10
10
  */
11
11
  import { type ChartType } from '@svgrid/grid';
12
- import { type EntitySchema } from './schema';
13
- import { type AggregateBucket, type AggregateReduce, type AggregateRequest } from './sources/aggregate';
12
+ import { type EntitySchema } from './schema.js';
13
+ import { type AggregateBucket, type AggregateReduce, type AggregateRequest } from './sources/aggregate.js';
14
14
  declare function $$render<TData extends ChartRow>(): {
15
15
  props: {
16
16
  schema: EntitySchema<TData>;