@svgrid/enterprise 2.5.2 → 2.6.0

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 (620) hide show
  1. package/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
  2. package/dist/SvAlertsManager.svelte.d.ts +14 -0
  3. package/dist/SvAlertsPanel.svelte.d.ts +9 -0
  4. package/dist/SvAuthGate.svelte.d.ts +22 -0
  5. package/dist/SvBoard.svelte.d.ts +35 -0
  6. package/dist/SvExportMenu.svelte.d.ts +61 -0
  7. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  8. package/dist/SvFileInput.svelte.d.ts +20 -0
  9. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  10. package/dist/SvGridBoard.svelte.d.ts +30 -0
  11. package/dist/SvGridEditPanel.svelte.d.ts +73 -0
  12. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  13. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  14. package/dist/SvImportDialog.svelte.d.ts +88 -0
  15. package/dist/SvLookupInput.svelte.d.ts +21 -0
  16. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  17. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  18. package/dist/SvSchedule.svelte.d.ts +29 -0
  19. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  20. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  21. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  22. package/dist/alerts/alert-engine-attach.js +106 -0
  23. package/dist/alerts/alert-engine.d.ts +42 -0
  24. package/dist/alerts/alert-engine.js +196 -0
  25. package/dist/alerts/alert-formats.d.ts +26 -0
  26. package/dist/alerts/alert-formats.js +58 -0
  27. package/dist/alerts/alert-observer.d.ts +54 -0
  28. package/dist/alerts/alert-observer.js +156 -0
  29. package/dist/alerts/alert-scheduler.d.ts +30 -0
  30. package/dist/alerts/alert-scheduler.js +54 -0
  31. package/dist/alerts/alert-storage.d.ts +31 -0
  32. package/dist/alerts/alert-storage.js +92 -0
  33. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  34. package/dist/alerts/alert-store.svelte.js +69 -0
  35. package/dist/alerts/alert-types.d.ts +86 -0
  36. package/dist/alerts/alert-types.js +1 -0
  37. package/dist/alerts.d.ts +2 -0
  38. package/{src/alerts.ts → dist/alerts.js} +9 -9
  39. package/dist/board.d.ts +7 -0
  40. package/{src/board.ts → dist/board.js} +13 -14
  41. package/dist/cdn/svgrid-enterprise.svelte-external.js +2987 -2981
  42. package/dist/designer/assets/{index-CM5xvaOy.js → index-BF0UH638.js} +3 -3
  43. package/dist/designer/assets/{src-D-ET9Mmo.js → src-BPJruwB9.js} +184 -184
  44. package/dist/designer/index.html +2 -2
  45. package/dist/edit-panel.d.ts +105 -0
  46. package/dist/edit-panel.js +350 -0
  47. package/dist/export-conditional.d.ts +31 -0
  48. package/dist/export-conditional.js +65 -0
  49. package/dist/export-ooxml.d.ts +93 -0
  50. package/dist/export-ooxml.js +385 -0
  51. package/dist/export-pdf.d.ts +107 -0
  52. package/dist/export-pdf.js +144 -0
  53. package/dist/export-print.d.ts +55 -0
  54. package/dist/export-print.js +91 -0
  55. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  56. package/dist/export-serialize.js +11 -0
  57. package/dist/export-xls.d.ts +26 -0
  58. package/dist/export-xls.js +157 -0
  59. package/dist/export.d.ts +323 -0
  60. package/dist/export.js +1021 -0
  61. package/dist/expressions/evaluate.d.ts +17 -0
  62. package/dist/expressions/evaluate.js +214 -0
  63. package/dist/expressions/expression-columns.d.ts +61 -0
  64. package/dist/expressions/expression-columns.js +72 -0
  65. package/dist/expressions/expression-types.d.ts +125 -0
  66. package/dist/expressions/expression-types.js +1 -0
  67. package/dist/expressions/parse.d.ts +25 -0
  68. package/dist/expressions/parse.js +537 -0
  69. package/dist/import.d.ts +232 -0
  70. package/dist/import.js +846 -0
  71. package/dist/index.d.ts +66 -0
  72. package/dist/index.js +91 -0
  73. package/dist/install.d.ts +70 -0
  74. package/dist/install.js +61 -0
  75. package/dist/license-core.d.ts +37 -0
  76. package/dist/license-core.js +81 -0
  77. package/dist/license.d.ts +30 -0
  78. package/dist/license.js +139 -0
  79. package/dist/master-detail.d.ts +23 -0
  80. package/dist/master-detail.js +35 -0
  81. package/dist/node/studio.js +1 -1
  82. package/dist/pivot-chart.d.ts +28 -0
  83. package/dist/pivot-chart.js +71 -0
  84. package/dist/pivot-designer.d.ts +69 -0
  85. package/dist/pivot-designer.js +38 -0
  86. package/dist/pivot-enable.d.ts +6 -0
  87. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  88. package/dist/pivot.d.ts +111 -0
  89. package/dist/pivot.js +353 -0
  90. package/dist/print.d.ts +33 -0
  91. package/dist/print.js +61 -0
  92. package/dist/revoked.d.ts +1 -0
  93. package/{src/revoked.ts → dist/revoked.js} +5 -6
  94. package/dist/scheduler-assignments.d.ts +64 -0
  95. package/dist/scheduler-assignments.js +92 -0
  96. package/dist/scheduler-axis.d.ts +81 -0
  97. package/dist/scheduler-axis.js +180 -0
  98. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  99. package/dist/scheduler-booking.js +50 -0
  100. package/dist/scheduler-config.d.ts +177 -0
  101. package/dist/scheduler-config.js +1 -0
  102. package/dist/scheduler-dependencies.d.ts +89 -0
  103. package/dist/scheduler-dependencies.js +179 -0
  104. package/dist/scheduler-freebusy.d.ts +19 -0
  105. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  106. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  107. package/dist/scheduler-heatmap.js +41 -0
  108. package/dist/scheduler-resource-tree.d.ts +48 -0
  109. package/dist/scheduler-resource-tree.js +78 -0
  110. package/dist/scheduler-slots.d.ts +37 -0
  111. package/dist/scheduler-slots.js +80 -0
  112. package/dist/scheduler-summary.d.ts +41 -0
  113. package/dist/scheduler-summary.js +54 -0
  114. package/dist/scheduler.d.ts +7 -0
  115. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  116. package/dist/scheduling.d.ts +132 -0
  117. package/dist/scheduling.js +228 -0
  118. package/dist/schema-designer.d.ts +42 -0
  119. package/dist/schema-designer.js +117 -0
  120. package/dist/schema.d.ts +369 -0
  121. package/dist/schema.js +216 -0
  122. package/dist/smart-shim.d.ts +62 -0
  123. package/dist/smart-shim.js +34 -0
  124. package/dist/sources/aggregate.d.ts +43 -0
  125. package/dist/sources/aggregate.js +60 -0
  126. package/dist/sources/auth-supabase.d.ts +69 -0
  127. package/dist/sources/auth-supabase.js +39 -0
  128. package/dist/sources/dashboard.d.ts +65 -0
  129. package/dist/sources/dashboard.js +95 -0
  130. package/dist/sources/field-inference.d.ts +23 -0
  131. package/dist/sources/field-inference.js +52 -0
  132. package/dist/sources/filters.d.ts +35 -0
  133. package/dist/sources/filters.js +52 -0
  134. package/dist/sources/index.d.ts +18 -0
  135. package/dist/sources/index.js +18 -0
  136. package/dist/sources/introspect-supabase.d.ts +30 -0
  137. package/dist/sources/introspect-supabase.js +134 -0
  138. package/dist/sources/realtime-supabase.d.ts +37 -0
  139. package/dist/sources/realtime-supabase.js +52 -0
  140. package/dist/sources/relation-lookup.d.ts +50 -0
  141. package/dist/sources/relation-lookup.js +77 -0
  142. package/dist/sources/rest-adapters.d.ts +48 -0
  143. package/dist/sources/rest-adapters.js +85 -0
  144. package/dist/sources/rest.d.ts +38 -0
  145. package/dist/sources/rest.js +86 -0
  146. package/dist/sources/schema-from-columns.d.ts +37 -0
  147. package/dist/sources/schema-from-columns.js +48 -0
  148. package/dist/sources/supabase.d.ts +33 -0
  149. package/dist/sources/supabase.js +74 -0
  150. package/dist/sources/with-entity-rules.d.ts +25 -0
  151. package/dist/sources/with-entity-rules.js +47 -0
  152. package/dist/sources/with-relation-labels.d.ts +26 -0
  153. package/dist/sources/with-relation-labels.js +38 -0
  154. package/dist/staged-editing.d.ts +85 -0
  155. package/dist/staged-editing.js +0 -0
  156. package/dist/studio/bug-report.d.ts +61 -0
  157. package/dist/studio/bug-report.js +126 -0
  158. package/dist/studio/cli.d.ts +56 -0
  159. package/dist/studio/cli.js +70 -0
  160. package/dist/studio/copilot-core.d.ts +22 -0
  161. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  162. package/dist/studio/csv.d.ts +36 -0
  163. package/dist/studio/csv.js +173 -0
  164. package/dist/studio/db-connect-string.d.ts +45 -0
  165. package/dist/studio/db-connect-string.js +113 -0
  166. package/dist/studio/deploy-cli.d.ts +35 -0
  167. package/dist/studio/deploy-cli.js +81 -0
  168. package/dist/studio/emit-project.d.ts +77 -0
  169. package/dist/studio/emit-project.js +5389 -0
  170. package/dist/studio/emit-schema.d.ts +110 -0
  171. package/dist/studio/emit-schema.js +1128 -0
  172. package/dist/studio/index.d.ts +35 -0
  173. package/dist/studio/index.js +38 -0
  174. package/dist/studio/init-flow.d.ts +58 -0
  175. package/dist/studio/init-flow.js +451 -0
  176. package/dist/studio/introspect-db.d.ts +47 -0
  177. package/dist/studio/introspect-db.js +255 -0
  178. package/dist/studio/introspect-openapi.d.ts +19 -0
  179. package/dist/studio/introspect-openapi.js +244 -0
  180. package/dist/studio/introspect-prisma.d.ts +25 -0
  181. package/dist/studio/introspect-prisma.js +164 -0
  182. package/dist/studio/introspect.d.ts +35 -0
  183. package/dist/studio/introspect.js +306 -0
  184. package/dist/studio/project.d.ts +1327 -0
  185. package/dist/studio/project.js +1798 -0
  186. package/dist/studio/sample-data.d.ts +19 -0
  187. package/dist/studio/sample-data.js +207 -0
  188. package/dist/studio/samples/ats.d.ts +2 -0
  189. package/dist/studio/samples/ats.js +194 -0
  190. package/dist/studio/samples/clinic.d.ts +2 -0
  191. package/dist/studio/samples/clinic.js +171 -0
  192. package/dist/studio/samples/crm.d.ts +2 -0
  193. package/dist/studio/samples/crm.js +280 -0
  194. package/dist/studio/samples/datasets.d.ts +38 -0
  195. package/dist/studio/samples/datasets.js +296 -0
  196. package/dist/studio/samples/ecommerce.d.ts +2 -0
  197. package/dist/studio/samples/ecommerce.js +178 -0
  198. package/dist/studio/samples/events.d.ts +2 -0
  199. package/dist/studio/samples/events.js +192 -0
  200. package/dist/studio/samples/fleet.d.ts +2 -0
  201. package/dist/studio/samples/fleet.js +203 -0
  202. package/dist/studio/samples/gym.d.ts +2 -0
  203. package/dist/studio/samples/gym.js +205 -0
  204. package/dist/studio/samples/hr.d.ts +2 -0
  205. package/dist/studio/samples/hr.js +186 -0
  206. package/dist/studio/samples/index.d.ts +13 -0
  207. package/dist/studio/samples/index.js +44 -0
  208. package/dist/studio/samples/insurance.d.ts +2 -0
  209. package/dist/studio/samples/insurance.js +220 -0
  210. package/dist/studio/samples/inventory.d.ts +2 -0
  211. package/dist/studio/samples/inventory.js +204 -0
  212. package/dist/studio/samples/invoicing.d.ts +2 -0
  213. package/dist/studio/samples/invoicing.js +154 -0
  214. package/dist/studio/samples/library.d.ts +2 -0
  215. package/dist/studio/samples/library.js +171 -0
  216. package/dist/studio/samples/live-data.d.ts +5 -0
  217. package/dist/studio/samples/live-data.js +261 -0
  218. package/dist/studio/samples/projects.d.ts +2 -0
  219. package/dist/studio/samples/projects.js +203 -0
  220. package/dist/studio/samples/realestate.d.ts +2 -0
  221. package/dist/studio/samples/realestate.js +187 -0
  222. package/dist/studio/samples/restaurant.d.ts +2 -0
  223. package/dist/studio/samples/restaurant.js +180 -0
  224. package/dist/studio/samples/school.d.ts +2 -0
  225. package/dist/studio/samples/school.js +188 -0
  226. package/dist/studio/samples/shared.d.ts +142 -0
  227. package/dist/studio/samples/shared.js +164 -0
  228. package/dist/studio/samples/starter.d.ts +4 -0
  229. package/dist/studio/samples/starter.js +237 -0
  230. package/dist/studio/samples/subscriptions.d.ts +2 -0
  231. package/dist/studio/samples/subscriptions.js +175 -0
  232. package/dist/studio/samples/support.d.ts +2 -0
  233. package/dist/studio/samples/support.js +209 -0
  234. package/dist/studio/scaffold-app.d.ts +22 -0
  235. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  236. package/dist/studio/scaffold.d.ts +63 -0
  237. package/dist/studio/scaffold.js +346 -0
  238. package/dist/studio/screen-suites.d.ts +193 -0
  239. package/dist/studio/screen-suites.js +297 -0
  240. package/dist/studio/themes.d.ts +34 -0
  241. package/dist/studio/themes.js +41 -0
  242. package/dist/studio/ui-components.d.ts +89 -0
  243. package/dist/studio/ui-components.generated.d.ts +29 -0
  244. package/dist/studio/ui-components.generated.js +7139 -0
  245. package/dist/studio/ui-components.js +673 -0
  246. package/dist/studio/user-error.d.ts +23 -0
  247. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  248. package/dist/studio/verify.d.ts +34 -0
  249. package/dist/studio/verify.js +47 -0
  250. package/dist/sveltekit/in-memory.d.ts +14 -0
  251. package/dist/sveltekit/in-memory.js +113 -0
  252. package/dist/sveltekit/index.d.ts +6 -0
  253. package/dist/sveltekit/index.js +5 -0
  254. package/dist/sveltekit/query-plan.d.ts +44 -0
  255. package/dist/sveltekit/query-plan.js +76 -0
  256. package/dist/sveltekit/sql-source.d.ts +47 -0
  257. package/dist/sveltekit/sql-source.js +106 -0
  258. package/dist/sveltekit/sql.d.ts +48 -0
  259. package/dist/sveltekit/sql.js +73 -0
  260. package/dist/sveltekit/transport.d.ts +209 -0
  261. package/dist/sveltekit/transport.js +219 -0
  262. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  263. package/dist/sveltekit/types.js +1 -0
  264. package/dist/upgrade-prompt.d.ts +16 -0
  265. package/dist/upgrade-prompt.js +141 -0
  266. package/dist/version.d.ts +13 -0
  267. package/{src/version.ts → dist/version.js} +1 -1
  268. package/dist/watermark.d.ts +2 -0
  269. package/dist/watermark.js +146 -0
  270. package/package.json +26 -24
  271. package/src/SvBoard.dom.test.ts +0 -67
  272. package/src/SvGridAlerts.dom.test.ts +0 -113
  273. package/src/SvGridEditPanel.dom.test.ts +0 -320
  274. package/src/SvRecordDetail.dom.test.ts +0 -137
  275. package/src/SvSchedule.dom.test.ts +0 -57
  276. package/src/ai-export-pdf.dom.test.ts +0 -77
  277. package/src/ai-export-xlsx.dom.test.ts +0 -90
  278. package/src/ai-export.dom.test.ts +0 -114
  279. package/src/alerts/alert-engine-attach.ts +0 -165
  280. package/src/alerts/alert-engine.test.ts +0 -135
  281. package/src/alerts/alert-engine.ts +0 -260
  282. package/src/alerts/alert-formats.test.ts +0 -87
  283. package/src/alerts/alert-formats.ts +0 -77
  284. package/src/alerts/alert-observer.test.ts +0 -189
  285. package/src/alerts/alert-observer.ts +0 -208
  286. package/src/alerts/alert-scheduler.ts +0 -96
  287. package/src/alerts/alert-storage.test.ts +0 -54
  288. package/src/alerts/alert-storage.ts +0 -116
  289. package/src/alerts/alert-store.svelte.ts +0 -80
  290. package/src/alerts/alert-types.ts +0 -94
  291. package/src/board.dom.test.ts +0 -941
  292. package/src/edit-panel.test.ts +0 -322
  293. package/src/edit-panel.ts +0 -379
  294. package/src/export-conditional.test.ts +0 -60
  295. package/src/export-conditional.ts +0 -94
  296. package/src/export-ooxml.test.ts +0 -152
  297. package/src/export-ooxml.ts +0 -489
  298. package/src/export-pdf.test.ts +0 -138
  299. package/src/export-pdf.ts +0 -245
  300. package/src/export-print.test.ts +0 -66
  301. package/src/export-print.ts +0 -132
  302. package/src/export-serialize.test.ts +0 -56
  303. package/src/export-xls.ts +0 -199
  304. package/src/export-xlsx-roundtrip.test.ts +0 -120
  305. package/src/export-xlsx.test.ts +0 -150
  306. package/src/export.test.ts +0 -349
  307. package/src/export.ts +0 -1464
  308. package/src/expressions/evaluate.test.ts +0 -111
  309. package/src/expressions/evaluate.ts +0 -237
  310. package/src/expressions/expression-columns.ts +0 -133
  311. package/src/expressions/expression-types.ts +0 -84
  312. package/src/expressions/parse.test.ts +0 -106
  313. package/src/expressions/parse.ts +0 -610
  314. package/src/import-automap.test.ts +0 -131
  315. package/src/import-hardening.test.ts +0 -158
  316. package/src/import.test.ts +0 -415
  317. package/src/import.ts +0 -1044
  318. package/src/index.ts +0 -569
  319. package/src/install.ts +0 -154
  320. package/src/license-core.test.ts +0 -23
  321. package/src/license-core.ts +0 -107
  322. package/src/license-expiry.test.ts +0 -127
  323. package/src/license.ts +0 -137
  324. package/src/master-detail.test.ts +0 -61
  325. package/src/master-detail.ts +0 -42
  326. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  327. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  328. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  329. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  330. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  331. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  386. package/src/pivot-chart.test.ts +0 -86
  387. package/src/pivot-chart.ts +0 -112
  388. package/src/pivot-designer.ts +0 -101
  389. package/src/pivot.test.ts +0 -335
  390. package/src/pivot.ts +0 -578
  391. package/src/print.ts +0 -107
  392. package/src/scheduler-assignments.test.ts +0 -97
  393. package/src/scheduler-assignments.ts +0 -134
  394. package/src/scheduler-axis.test.ts +0 -108
  395. package/src/scheduler-axis.ts +0 -238
  396. package/src/scheduler-booking.test.ts +0 -57
  397. package/src/scheduler-config.ts +0 -179
  398. package/src/scheduler-dependencies.test.ts +0 -155
  399. package/src/scheduler-dependencies.ts +0 -223
  400. package/src/scheduler-freebusy.test.ts +0 -41
  401. package/src/scheduler-heatmap.test.ts +0 -39
  402. package/src/scheduler-resource-tree.test.ts +0 -84
  403. package/src/scheduler-resource-tree.ts +0 -107
  404. package/src/scheduler-slots.test.ts +0 -53
  405. package/src/scheduler-slots.ts +0 -94
  406. package/src/scheduler-summary.test.ts +0 -47
  407. package/src/scheduler-summary.ts +0 -81
  408. package/src/scheduling.test.ts +0 -194
  409. package/src/scheduling.ts +0 -293
  410. package/src/schema-designer.test.ts +0 -121
  411. package/src/schema-designer.ts +0 -142
  412. package/src/schema.test.ts +0 -268
  413. package/src/schema.ts +0 -562
  414. package/src/smart-shim.ts +0 -107
  415. package/src/sources/aggregate.test.ts +0 -79
  416. package/src/sources/aggregate.ts +0 -102
  417. package/src/sources/auth-supabase.test.ts +0 -80
  418. package/src/sources/auth-supabase.ts +0 -87
  419. package/src/sources/dashboard.kpi.test.ts +0 -50
  420. package/src/sources/dashboard.test.ts +0 -61
  421. package/src/sources/dashboard.ts +0 -136
  422. package/src/sources/field-inference.test.ts +0 -60
  423. package/src/sources/field-inference.ts +0 -63
  424. package/src/sources/filters.test.ts +0 -58
  425. package/src/sources/filters.ts +0 -70
  426. package/src/sources/index.ts +0 -67
  427. package/src/sources/introspect-supabase.test.ts +0 -112
  428. package/src/sources/introspect-supabase.ts +0 -139
  429. package/src/sources/realtime-supabase.test.ts +0 -93
  430. package/src/sources/realtime-supabase.ts +0 -99
  431. package/src/sources/relation-lookup.test.ts +0 -99
  432. package/src/sources/relation-lookup.ts +0 -128
  433. package/src/sources/rest-adapters.test.ts +0 -95
  434. package/src/sources/rest-adapters.ts +0 -120
  435. package/src/sources/rest.test.ts +0 -104
  436. package/src/sources/rest.ts +0 -129
  437. package/src/sources/schema-from-columns.test.ts +0 -106
  438. package/src/sources/schema-from-columns.ts +0 -88
  439. package/src/sources/supabase.test.ts +0 -110
  440. package/src/sources/supabase.ts +0 -99
  441. package/src/sources/with-entity-rules.test.ts +0 -104
  442. package/src/sources/with-entity-rules.ts +0 -78
  443. package/src/sources/with-relation-labels.test.ts +0 -75
  444. package/src/sources/with-relation-labels.ts +0 -73
  445. package/src/staged-editing.ts +0 -0
  446. package/src/studio/bug-report.test.ts +0 -101
  447. package/src/studio/bug-report.ts +0 -165
  448. package/src/studio/cli.test.ts +0 -187
  449. package/src/studio/cli.ts +0 -117
  450. package/src/studio/copilot-core.test.ts +0 -45
  451. package/src/studio/csv.test.ts +0 -90
  452. package/src/studio/csv.ts +0 -165
  453. package/src/studio/db-connect-string.test.ts +0 -94
  454. package/src/studio/db-connect-string.ts +0 -128
  455. package/src/studio/deploy-cli.test.ts +0 -56
  456. package/src/studio/deploy-cli.ts +0 -100
  457. package/src/studio/emit-project.test.ts +0 -3324
  458. package/src/studio/emit-project.ts +0 -5377
  459. package/src/studio/emit-schema.test.ts +0 -111
  460. package/src/studio/emit-schema.ts +0 -1181
  461. package/src/studio/index.ts +0 -380
  462. package/src/studio/init-flow.test.ts +0 -514
  463. package/src/studio/init-flow.ts +0 -556
  464. package/src/studio/introspect-db.test.ts +0 -186
  465. package/src/studio/introspect-db.ts +0 -312
  466. package/src/studio/introspect-openapi.test.ts +0 -84
  467. package/src/studio/introspect-openapi.ts +0 -252
  468. package/src/studio/introspect-prisma.test.ts +0 -99
  469. package/src/studio/introspect-prisma.ts +0 -175
  470. package/src/studio/introspect.test.ts +0 -172
  471. package/src/studio/introspect.ts +0 -310
  472. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  473. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  474. package/src/studio/pipeline.test.ts +0 -42
  475. package/src/studio/project-robust.test.ts +0 -157
  476. package/src/studio/project.test.ts +0 -929
  477. package/src/studio/project.ts +0 -2394
  478. package/src/studio/sample-data.test.ts +0 -58
  479. package/src/studio/sample-data.ts +0 -203
  480. package/src/studio/samples/ats.ts +0 -202
  481. package/src/studio/samples/clinic.ts +0 -179
  482. package/src/studio/samples/crm.ts +0 -291
  483. package/src/studio/samples/datasets.test.ts +0 -84
  484. package/src/studio/samples/datasets.ts +0 -340
  485. package/src/studio/samples/ecommerce.ts +0 -187
  486. package/src/studio/samples/events.ts +0 -201
  487. package/src/studio/samples/fleet.ts +0 -213
  488. package/src/studio/samples/gym.ts +0 -215
  489. package/src/studio/samples/hr.ts +0 -195
  490. package/src/studio/samples/index.ts +0 -55
  491. package/src/studio/samples/insurance.ts +0 -229
  492. package/src/studio/samples/inventory.ts +0 -213
  493. package/src/studio/samples/invoicing.ts +0 -162
  494. package/src/studio/samples/library.ts +0 -180
  495. package/src/studio/samples/live-data.test.ts +0 -99
  496. package/src/studio/samples/live-data.ts +0 -306
  497. package/src/studio/samples/projects.ts +0 -212
  498. package/src/studio/samples/realestate.ts +0 -196
  499. package/src/studio/samples/restaurant.ts +0 -189
  500. package/src/studio/samples/samples.test.ts +0 -304
  501. package/src/studio/samples/school.ts +0 -197
  502. package/src/studio/samples/seed-floor.test.ts +0 -25
  503. package/src/studio/samples/shared.ts +0 -237
  504. package/src/studio/samples/starter.ts +0 -251
  505. package/src/studio/samples/subscriptions.ts +0 -183
  506. package/src/studio/samples/support.ts +0 -216
  507. package/src/studio/scaffold-app.test.ts +0 -91
  508. package/src/studio/scaffold.test.ts +0 -192
  509. package/src/studio/scaffold.ts +0 -390
  510. package/src/studio/screen-suites.test.ts +0 -269
  511. package/src/studio/screen-suites.ts +0 -448
  512. package/src/studio/themes.ts +0 -62
  513. package/src/studio/ui-components-surface.test.ts +0 -185
  514. package/src/studio/ui-components.generated.ts +0 -7154
  515. package/src/studio/ui-components.ts +0 -742
  516. package/src/studio/verify.test.ts +0 -47
  517. package/src/studio/verify.ts +0 -79
  518. package/src/sveltekit/in-memory.test.ts +0 -104
  519. package/src/sveltekit/in-memory.ts +0 -129
  520. package/src/sveltekit/index.ts +0 -24
  521. package/src/sveltekit/query-plan.test.ts +0 -109
  522. package/src/sveltekit/query-plan.ts +0 -125
  523. package/src/sveltekit/sql-source.test.ts +0 -198
  524. package/src/sveltekit/sql-source.ts +0 -171
  525. package/src/sveltekit/sql.test.ts +0 -80
  526. package/src/sveltekit/sql.ts +0 -131
  527. package/src/sveltekit/transport-scope.test.ts +0 -125
  528. package/src/sveltekit/transport.test.ts +0 -201
  529. package/src/sveltekit/transport.ts +0 -373
  530. package/src/upgrade-prompt.test.ts +0 -71
  531. package/src/upgrade-prompt.ts +0 -162
  532. package/src/version.test.ts +0 -17
  533. package/src/watermark.test.ts +0 -97
  534. package/src/watermark.ts +0 -156
  535. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  536. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  537. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  538. /package/{src → dist}/SvAuthGate.svelte +0 -0
  539. /package/{src → dist}/SvBoard.svelte +0 -0
  540. /package/{src → dist}/SvExportMenu.svelte +0 -0
  541. /package/{src → dist}/SvExpressionEditor.svelte +0 -0
  542. /package/{src → dist}/SvFileInput.svelte +0 -0
  543. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  544. /package/{src → dist}/SvGridBoard.svelte +0 -0
  545. /package/{src → dist}/SvGridEditPanel.svelte +0 -0
  546. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  547. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  548. /package/{src → dist}/SvImportDialog.svelte +0 -0
  549. /package/{src → dist}/SvLookupInput.svelte +0 -0
  550. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  551. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  552. /package/{src → dist}/SvSchedule.svelte +0 -0
  553. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  554. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  555. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  556. /package/{src → dist}/smart.export.d.ts +0 -0
  557. /package/{src → dist}/smart.export.js +0 -0
  558. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  559. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  560. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  561. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  562. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  563. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  575. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  579. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
@@ -0,0 +1,280 @@
1
+ import { screen, formScreen, boardScreen, schedulerScreen, workspaceScreen, detailScreen, project, dashScreen, statusPills, pad, ids, whenIs } from './shared.js';
2
+ // Salesforce Lightning-style chrome: a gradient blue brand rail, white rounded-pill
3
+ // nav with a solid-white active state, and a Lightning-blue rule under the toolbar.
4
+ const LIGHTNING_CSS = `.sv-app.theme-lightning .sv-app__side { background: linear-gradient(180deg, #032d60, #0176d3); border-right: 0; }
5
+ .sv-app.theme-lightning .sv-app__brandtext { color: #fff; font-weight: 800; letter-spacing: -0.01em; }
6
+ .sv-app.theme-lightning .sv-app__link { color: #d9edff; font-weight: 600; border-radius: 9999px; padding: 8px 14px; }
7
+ .sv-app.theme-lightning .sv-app__link:hover { background: rgba(255, 255, 255, 0.14); color: #fff; }
8
+ .sv-app.theme-lightning .sv-app__link.is-active { background: #fff; color: #032d60; }
9
+ .sv-app.theme-lightning .sv-app__collapse, .sv-app.theme-lightning .sv-app__foot { color: rgba(255, 255, 255, 0.72); }
10
+ .sv-app.theme-lightning .sv-app__toolbar { border-bottom: 2px solid #0176d3; }`;
11
+ // A fixed sales-rep pool, shared by deals + activities so leaderboards, pivots
12
+ // and owner pills stay clean (padded rows cycle these instead of random names).
13
+ const OWNERS = [
14
+ { value: 'Sam Rivera', label: 'Sam Rivera', color: '#6366f1' },
15
+ { value: 'Jamie Chen', label: 'Jamie Chen', color: '#10b981' },
16
+ { value: 'Priya Patel', label: 'Priya Patel', color: '#f59e0b' },
17
+ { value: 'Dana Lee', label: 'Dana Lee', color: '#ec4899' },
18
+ ];
19
+ const companies = {
20
+ name: 'companies',
21
+ label: 'Company',
22
+ idField: 'id',
23
+ fields: [
24
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
25
+ { field: 'name', type: 'text', required: true, minLength: 2 },
26
+ { field: 'industry', type: 'enum', required: true, options: [
27
+ { value: 'saas', label: 'SaaS', color: '#6366f1' },
28
+ { value: 'fintech', label: 'Fintech', color: '#10b981' },
29
+ { value: 'retail', label: 'Retail', color: '#f59e0b' },
30
+ { value: 'health', label: 'Health', color: '#ef4444' },
31
+ ] },
32
+ { field: 'country', type: 'text', label: 'Country', input: { editorType: 'country', help: 'Headquarters country' } },
33
+ { field: 'website', type: 'text', format: 'url', input: { placeholder: 'https://…' } },
34
+ { field: 'employees', type: 'number', label: 'Employees', min: 0 },
35
+ { field: 'health', type: 'number', label: 'Account health', min: 1, max: 5, defaultValue: 3, input: { editorType: 'rating', help: '1-5 relationship score' } },
36
+ { field: 'active', type: 'boolean', label: 'Active', defaultValue: true },
37
+ ],
38
+ };
39
+ const contacts = {
40
+ name: 'contacts',
41
+ label: 'Contact',
42
+ idField: 'id',
43
+ fields: [
44
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
45
+ { field: 'name', type: 'text', required: true, minLength: 2 },
46
+ { field: 'email', type: 'text', format: 'email', required: true },
47
+ { field: 'phone', type: 'text', input: { editorType: 'phone' } },
48
+ { field: 'title', type: 'text', label: 'Job title' },
49
+ { field: 'companyId', type: 'relation', label: 'Company', relation: { entity: 'companies', foreignKey: 'companyId', labelField: 'name' } },
50
+ { field: 'tags', type: 'text', label: 'Segments', input: { editorType: 'chips', help: 'Interests / segments' } },
51
+ { field: 'active', type: 'boolean', defaultValue: true },
52
+ ],
53
+ };
54
+ const deals = {
55
+ name: 'deals',
56
+ label: 'Deal',
57
+ idField: 'id',
58
+ fields: [
59
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
60
+ { field: 'title', type: 'text', required: true, minLength: 2 },
61
+ { field: 'companyId', type: 'relation', label: 'Company', relation: { entity: 'companies', foreignKey: 'companyId', labelField: 'name' } },
62
+ { field: 'stage', type: 'enum', required: true, options: [
63
+ { value: 'lead', label: 'Lead', color: '#94a3b8' },
64
+ { value: 'qualified', label: 'Qualified', color: '#6366f1' },
65
+ { value: 'proposal', label: 'Proposal', color: '#f59e0b' },
66
+ { value: 'won', label: 'Won', color: '#10b981' },
67
+ { value: 'lost', label: 'Lost', color: '#ef4444' },
68
+ ] },
69
+ { field: 'value', type: 'number', label: 'Value ($)', min: 0 },
70
+ { field: 'probability', type: 'number', label: 'Probability (%)', min: 0, max: 100, defaultValue: 50, input: { editorType: 'slider', help: 'Win likelihood' } },
71
+ // Derived: expected value weighted by win probability (display-only).
72
+ { field: 'weighted', type: 'number', label: 'Weighted ($)', readonly: true, formula: 'value * probability / 100' },
73
+ { field: 'owner', type: 'enum', label: 'Owner', options: OWNERS },
74
+ { field: 'closeDate', type: 'date', label: 'Close date' },
75
+ // Only asked for once a deal is actually lost, and then it is mandatory - the
76
+ // form never shows a question it does not need an answer to.
77
+ { field: 'lostReason', type: 'enum', label: 'Lost to', hidden: { grid: true }, options: [
78
+ { value: 'price', label: 'Price' },
79
+ { value: 'competitor', label: 'Competitor' },
80
+ { value: 'timing', label: 'Timing' },
81
+ { value: 'no-budget', label: 'No budget' },
82
+ { value: 'other', label: 'Other' },
83
+ ], when: { visible: whenIs('stage', 'lost'), required: whenIs('stage', 'lost') } },
84
+ ],
85
+ };
86
+ const activities = {
87
+ name: 'activities',
88
+ label: 'Activity',
89
+ idField: 'id',
90
+ fields: [
91
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
92
+ { field: 'subject', type: 'text', required: true, minLength: 3 },
93
+ { field: 'type', type: 'enum', required: true, options: [
94
+ { value: 'call', label: 'Call', color: '#6366f1' },
95
+ { value: 'email', label: 'Email', color: '#10b981' },
96
+ { value: 'meeting', label: 'Meeting', color: '#f59e0b' },
97
+ { value: 'task', label: 'Task', color: '#8b5cf6' },
98
+ ] },
99
+ { field: 'dealId', type: 'relation', label: 'Deal', relation: { entity: 'deals', foreignKey: 'dealId', labelField: 'title' } },
100
+ { field: 'owner', type: 'enum', label: 'Owner', options: OWNERS },
101
+ { field: 'priority', type: 'enum', defaultValue: 'medium', options: [
102
+ { value: 'low', label: 'Low', color: '#94a3b8' },
103
+ { value: 'medium', label: 'Medium', color: '#6366f1' },
104
+ { value: 'high', label: 'High', color: '#ef4444' },
105
+ ] },
106
+ { field: 'dueDate', type: 'date', label: 'Due date' },
107
+ { field: 'durationMins', type: 'number', label: 'Duration (min)', min: 0 },
108
+ { field: 'completed', type: 'boolean', label: 'Done', defaultValue: false },
109
+ { field: 'notes', type: 'text', label: 'Notes' },
110
+ ],
111
+ };
112
+ // Deal grid formatting: stage + owner pills, plus numeric thresholds (weak deals
113
+ // red, strong deals green + bold, big-ticket values bold) - data-driven color, not
114
+ // just status pills.
115
+ const dealFormats = [
116
+ ...statusPills(deals, 'stage'),
117
+ ...statusPills(deals, 'owner'),
118
+ { field: 'probability', op: 'lt', value: 30, color: '#dc2626' },
119
+ { field: 'probability', op: 'gte', value: 70, color: '#16a34a', bold: true },
120
+ { field: 'value', op: 'gte', value: 100000, bold: true },
121
+ ];
122
+ const seed = {
123
+ companies: [
124
+ { id: 'co1', name: 'Globex', industry: 'saas', country: 'United States', website: 'https://globex.com', employees: 320, health: 4, active: true },
125
+ { id: 'co2', name: 'Initech', industry: 'fintech', country: 'United Kingdom', website: 'https://initech.co', employees: 140, health: 3, active: true },
126
+ { id: 'co3', name: 'Umbrella', industry: 'health', country: 'Germany', website: 'https://umbrella.de', employees: 900, health: 5, active: true },
127
+ { id: 'co4', name: 'Hooli', industry: 'saas', country: 'United States', website: 'https://hooli.com', employees: 2100, health: 2, active: false },
128
+ { id: 'co5', name: 'Soylent', industry: 'retail', country: 'Canada', website: 'https://soylent.ca', employees: 75, health: 3, active: true },
129
+ { id: 'co6', name: 'Stark Industries', industry: 'fintech', country: 'United States', website: 'https://stark.com', employees: 5400, health: 5, active: true },
130
+ ],
131
+ contacts: [
132
+ { id: 'ct1', name: 'Ada Lovelace', email: 'ada@globex.com', phone: '+1 (415) 555-0101', title: 'CTO', companyId: 'co1', tags: ['Champion', 'Technical'], active: true },
133
+ { id: 'ct2', name: 'Alan Turing', email: 'alan@initech.co', phone: '+44 20 7946 0102', title: 'Head of Data', companyId: 'co2', tags: ['Economic buyer'], active: true },
134
+ { id: 'ct3', name: 'Grace Hopper', email: 'grace@umbrella.de', phone: '+49 30 5550103', title: 'VP Engineering', companyId: 'co3', tags: ['Champion'], active: true },
135
+ { id: 'ct4', name: 'Linus Torvalds', email: 'linus@hooli.com', phone: '+1 (650) 555-0104', title: 'Architect', companyId: 'co4', tags: ['Technical', 'Blocker'], active: false },
136
+ { id: 'ct5', name: 'Barbara Liskov', email: 'barbara@soylent.ca', phone: '+1 (416) 555-0105', title: 'Founder', companyId: 'co5', tags: ['Decision maker'], active: true },
137
+ { id: 'ct6', name: 'Katherine Johnson', email: 'kj@stark.com', phone: '+1 (212) 555-0106', title: 'Analyst', companyId: 'co6', tags: ['Influencer'], active: true },
138
+ { id: 'ct7', name: 'Donald Knuth', email: 'don@globex.com', phone: '+1 (415) 555-0107', title: 'Advisor', companyId: 'co1', tags: ['Influencer', 'Technical'], active: true },
139
+ { id: 'ct8', name: 'Margaret Hamilton', email: 'mh@stark.com', phone: '+1 (212) 555-0108', title: 'Director', companyId: 'co6', tags: ['Decision maker'], active: true },
140
+ ],
141
+ deals: [
142
+ { id: 'dl1', title: 'Globex platform rollout', companyId: 'co1', stage: 'proposal', value: 48000, probability: 60, owner: 'Sam Rivera', closeDate: '2026-08-15' },
143
+ { id: 'dl2', title: 'Initech data pipeline', companyId: 'co2', stage: 'won', value: 26000, probability: 100, owner: 'Jamie Chen', closeDate: '2026-06-30' },
144
+ { id: 'dl3', title: 'Umbrella compliance suite', companyId: 'co3', stage: 'qualified', value: 91000, probability: 40, owner: 'Sam Rivera', closeDate: '2026-09-20' },
145
+ { id: 'dl4', title: 'Hooli migration', companyId: 'co4', stage: 'lost', value: 15000, probability: 0, owner: 'Priya Patel', closeDate: '2026-05-10', lostReason: 'competitor' },
146
+ { id: 'dl5', title: 'Soylent storefront', companyId: 'co5', stage: 'lead', value: 8000, probability: 20, owner: 'Jamie Chen', closeDate: '2026-10-01' },
147
+ { id: 'dl6', title: 'Stark analytics', companyId: 'co6', stage: 'proposal', value: 132000, probability: 65, owner: 'Priya Patel', closeDate: '2026-08-28' },
148
+ { id: 'dl7', title: 'Globex add-on seats', companyId: 'co1', stage: 'won', value: 12000, probability: 100, owner: 'Sam Rivera', closeDate: '2026-07-05' },
149
+ { id: 'dl8', title: 'Stark expansion', companyId: 'co6', stage: 'qualified', value: 54000, probability: 45, owner: 'Jamie Chen', closeDate: '2026-09-12' },
150
+ ],
151
+ activities: [
152
+ { id: 'ac1', subject: 'Discovery call with Ada', type: 'call', dealId: 'dl1', owner: 'Sam Rivera', priority: 'high', dueDate: '2026-07-16', durationMins: 30, completed: true, notes: 'Mapped the rollout scope.' },
153
+ { id: 'ac2', subject: 'Send pricing proposal', type: 'email', dealId: 'dl1', owner: 'Sam Rivera', priority: 'high', dueDate: '2026-07-18', durationMins: 15, completed: false, notes: 'Awaiting legal sign-off.' },
154
+ { id: 'ac3', subject: 'Data pipeline demo', type: 'meeting', dealId: 'dl2', owner: 'Jamie Chen', priority: 'medium', dueDate: '2026-07-12', durationMins: 45, completed: true, notes: 'Great fit, moving to close.' },
155
+ { id: 'ac4', subject: 'Compliance review follow-up', type: 'task', dealId: 'dl3', owner: 'Sam Rivera', priority: 'medium', dueDate: '2026-07-20', durationMins: 20, completed: false, notes: 'Collect SOC2 docs.' },
156
+ { id: 'ac5', subject: 'Re-engage Hooli champion', type: 'call', dealId: 'dl4', owner: 'Priya Patel', priority: 'low', dueDate: '2026-07-22', durationMins: 25, completed: false, notes: 'Deal went cold - revisit Q4.' },
157
+ { id: 'ac6', subject: 'Storefront scoping', type: 'meeting', dealId: 'dl5', owner: 'Jamie Chen', priority: 'medium', dueDate: '2026-07-19', durationMins: 60, completed: false, notes: 'Needs design mockups.' },
158
+ { id: 'ac7', subject: 'Analytics exec briefing', type: 'meeting', dealId: 'dl6', owner: 'Priya Patel', priority: 'high', dueDate: '2026-07-24', durationMins: 40, completed: false, notes: 'CFO joining the call.' },
159
+ { id: 'ac8', subject: 'Renewal paperwork', type: 'task', dealId: 'dl7', owner: 'Sam Rivera', priority: 'low', dueDate: '2026-07-14', durationMins: 10, completed: true, notes: 'Signed and filed.' },
160
+ { id: 'ac9', subject: 'Expansion seats quote', type: 'email', dealId: 'dl8', owner: 'Jamie Chen', priority: 'medium', dueDate: '2026-07-21', durationMins: 15, completed: false, notes: 'Quote 40 extra seats.' },
161
+ { id: 'ac10', subject: 'Quarterly business review', type: 'meeting', dealId: 'dl6', owner: 'Priya Patel', priority: 'high', dueDate: '2026-07-28', durationMins: 90, completed: false, notes: 'Prep the QBR deck.' },
162
+ ],
163
+ };
164
+ export const crm = {
165
+ id: 'crm',
166
+ name: 'CRM',
167
+ description: 'Companies, contacts, deals and activities - a Salesforce Lightning-style CRM behind a sign-in, with sales + forecast + activity dashboards (KPI sparklines, target gauge, value-over-time trend, pivot, tabs), filtered status-pill grids with drill-through and row actions, master/detail, and rich edit forms.',
168
+ emoji: '\u{1F91D}',
169
+ accent: '#0176d3',
170
+ build: () => {
171
+ const companyRows = pad(companies, seed.companies, 12);
172
+ const pool = ids(companyRows);
173
+ const contactRows = pad(contacts, seed.contacts, 22, { companyId: pool });
174
+ const dealRows = pad(deals, seed.deals, 30, { companyId: pool });
175
+ const dealPool = ids(dealRows);
176
+ const activityRows = pad(activities, seed.activities, 24, { dealId: dealPool });
177
+ return project({
178
+ title: 'Acme CRM',
179
+ brand: 'Acme CRM',
180
+ accent: '#0176d3',
181
+ preset: 'salesforce',
182
+ footer: '© Acme Inc.',
183
+ // Salesforce Lightning look: a deep-blue brand rail with white pill nav, and a
184
+ // Lightning-blue accent bar under the app toolbar.
185
+ appClass: 'theme-lightning',
186
+ customCss: LIGHTNING_CSS,
187
+ // A sign-in wall with two sales roles (reps can create + edit, not delete).
188
+ auth: { enabled: true, protect: true },
189
+ access: {
190
+ enabled: true,
191
+ defaultRole: 'rep',
192
+ roles: [
193
+ { role: 'admin', screens: '*', actions: '*' },
194
+ { role: 'rep', screens: '*', actions: ['create', 'update'] },
195
+ ],
196
+ },
197
+ entities: [companies, contacts, deals, activities],
198
+ seed: { companies: companyRows, contacts: contactRows, deals: dealRows, activities: activityRows },
199
+ screens: [
200
+ // Sales dashboard: KPI cards (a pipeline-value card with a sparkline over
201
+ // close dates + a $400k target), a target gauge, a stage funnel, a pie, an
202
+ // owner-leaderboard, a tabbed breakdown, and a status-pill deal grid.
203
+ dashScreen(deals, { id: 'overview', title: 'Overview', order: 0 }, [
204
+ { kpi: 'Pipeline value', measure: 'value', reduce: 'sum', format: 'currency', trendField: 'closeDate', trendReduce: 'sum', target: 400000, span: 1 },
205
+ { kpi: 'Open deals', reduce: 'count', span: 1 },
206
+ { kpi: 'Avg deal size', measure: 'value', reduce: 'avg', format: 'currency', span: 1 },
207
+ { gauge: 'Pipeline vs $500k target', measure: 'value', reduce: 'sum', min: 0, max: 500000, unit: '$', span: 1 },
208
+ { chart: 'stage', measure: 'value', reduce: 'sum', type: 'bar', span: 2 },
209
+ { chart: 'stage', reduce: 'count', type: 'pie', span: 1 },
210
+ { chart: 'owner', measure: 'value', reduce: 'sum', type: 'bar', span: 2 },
211
+ { tabs: [
212
+ { label: 'Value by stage', tiles: [{ chart: 'stage', measure: 'value', reduce: 'sum', type: 'bar' }] },
213
+ { label: 'Deals by owner', tiles: [{ chart: 'owner', reduce: 'count', type: 'bar' }] },
214
+ ], span: 3 },
215
+ { grid: true, format: dealFormats, summaries: true, rowActions: [{ kind: 'edit' }], span: 3 },
216
+ ]),
217
+ // Pipeline board: deals as draggable cards in stage columns (drag a card to
218
+ // change its stage). The signature "real app" view.
219
+ boardScreen(deals, { id: 'pipeline', title: 'Pipeline', order: 1 }, { groupBy: 'stage', titleField: 'title', badgeField: 'value', subtitleField: 'owner', filter: ['owner', 'companyId'], openScreen: 'deal-360' }),
220
+ // Deal desk: a docking-manager console (split panes) - filter deals on the
221
+ // left, the pipeline grid centre, and the selected deal's record on the right.
222
+ // Resize the panes; click a row to load it. Showcases screen layout: 'split'.
223
+ workspaceScreen(deals, { id: 'deal-desk', title: 'Deal desk', order: 2 }, { filter: ['stage', 'owner'], mode: 'split' }),
224
+ // Deal 360: a full record page - header (title + company + stage pill), value /
225
+ // probability metric tiles, an Overview of deal + account fields, and an
226
+ // Activities timeline of the tasks logged against the deal.
227
+ detailScreen(deals, { id: 'deal-360', title: 'Deal 360', order: 3 }, {
228
+ titleField: 'title', subtitleField: 'companyId', statusField: 'stage',
229
+ metricFields: ['value', 'probability'],
230
+ sections: [
231
+ { label: 'Deal', fields: ['owner', 'closeDate'] },
232
+ { label: 'Account', fields: ['companyId'] },
233
+ ],
234
+ related: [{ entity: 'activities', foreignKey: 'dealId', label: 'Activities', titleField: 'subject', subtitleField: 'owner', dateField: 'dueDate', statusField: 'priority' }],
235
+ }),
236
+ // Forecast: value KPIs, a value-over-time area trend, and a pivot of value by
237
+ // owner (rows) x stage (columns).
238
+ dashScreen(deals, { id: 'forecast', title: 'Forecast', order: 4 }, [
239
+ { kpi: 'Pipeline value', measure: 'value', reduce: 'sum', format: 'currency', span: 1 },
240
+ { kpi: 'Avg deal size', measure: 'value', reduce: 'avg', format: 'currency', span: 1 },
241
+ { kpi: 'Largest deal', measure: 'value', reduce: 'max', format: 'currency', span: 1 },
242
+ { chart: 'closeDate', measure: 'value', reduce: 'sum', type: 'area', span: 3 },
243
+ { pivot: { rows: ['owner'], cols: ['stage'], measure: 'value', aggregate: 'sum' }, span: 3 },
244
+ ]),
245
+ // Accounts dashboard: headcount KPIs (compact-formatted), an account-health
246
+ // gauge (avg rating 0-5), industry breakdowns, and a company grid that drills
247
+ // into the account's deals.
248
+ dashScreen(companies, { id: 'accounts', title: 'Accounts', order: 5 }, [
249
+ { kpi: 'Companies', reduce: 'count', span: 1 },
250
+ { kpi: 'Total headcount', measure: 'employees', reduce: 'sum', format: 'compact', span: 1 },
251
+ { kpi: 'Avg headcount', measure: 'employees', reduce: 'avg', span: 1 },
252
+ { gauge: 'Avg account health', measure: 'health', reduce: 'avg', min: 0, max: 5, span: 1 },
253
+ { chart: 'industry', measure: 'employees', reduce: 'sum', type: 'bar', span: 2 },
254
+ { chart: 'industry', reduce: 'count', type: 'pie', span: 1 },
255
+ { filter: ['industry', 'country', 'active'], span: 3 },
256
+ { grid: true, format: statusPills(companies, 'industry'), summaries: true, rowLink: { screen: 'deals', sourceField: 'id', targetField: 'companyId' }, span: 3 },
257
+ ]),
258
+ // Activity board: task KPIs, a duration gauge, type/owner breakdowns, a filter,
259
+ // and a grid with type + priority pills and inline edit actions.
260
+ dashScreen(activities, { id: 'activities', title: 'Activities', order: 6 }, [
261
+ { kpi: 'Activities', reduce: 'count', span: 1 },
262
+ { kpi: 'Logged minutes', measure: 'durationMins', reduce: 'sum', format: 'compact', span: 1 },
263
+ { kpi: 'Avg duration', measure: 'durationMins', reduce: 'avg', span: 1 },
264
+ { gauge: 'Avg duration (min)', measure: 'durationMins', reduce: 'avg', min: 0, max: 120, unit: 'm', span: 1 },
265
+ { chart: 'type', reduce: 'count', type: 'pie', span: 1 },
266
+ { chart: 'owner', reduce: 'count', type: 'bar', span: 2 },
267
+ { filter: ['type', 'priority', 'owner', 'completed'], span: 3 },
268
+ { grid: true, format: [...statusPills(activities, 'type'), ...statusPills(activities, 'priority'), ...statusPills(activities, 'owner')], summaries: true, rowActions: [{ kind: 'edit' }], span: 3 },
269
+ ]),
270
+ // Activity schedule: the activities grid rendered as a resource scheduler -
271
+ // a column per owner (rep), tasks placed by due date and tinted by type, with
272
+ // drag-to-reschedule + a detail drawer. Showcases the grid's scheduler view.
273
+ schedulerScreen(activities, { id: 'activity-cal', title: 'Schedule', order: 7 }, { startField: 'dueDate', titleField: 'subject', colorField: 'type', resourceField: 'owner', initialView: 'week' }),
274
+ screen(companies, 'master-detail', { id: 'companies', title: 'Companies', order: 8, child: contacts, foreignKey: 'companyId' }),
275
+ formScreen(contacts, { id: 'contacts', title: 'Contacts', order: 9 }, undefined, {}, ['companyId', 'tags', 'active']),
276
+ formScreen(deals, { id: 'deals', title: 'Deals', order: 10 }, undefined, { format: dealFormats, summaries: true, rowActions: [{ kind: 'edit' }], rowLink: { screen: 'deal-360', sourceField: 'id', targetField: 'id' } }, ['stage', 'owner', 'companyId']),
277
+ ],
278
+ });
279
+ },
280
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Starter datasets for the guided "new app" flow.
3
+ *
4
+ * Where `sampleApps` are finished, hand-laid-out showcases, these are just DATA:
5
+ * a small pair of related entities plus realistic seed rows. The guided wizard
6
+ * (and `svgrid-studio init`) feeds them through `crudAppFromSchemas`, so the
7
+ * user sees the same generated app shape they would get from their own database
8
+ * - only without having to connect one first.
9
+ *
10
+ * Each dataset carries a parent and a child linked by a relation, plus at least
11
+ * one colored enum, so the generated app has status pills, a chart dimension and
12
+ * a related-records tab out of the box.
13
+ *
14
+ * Pure + node-safe: `build()` returns fresh data on every call.
15
+ */
16
+ import type { EntitySchema } from '../../schema.js';
17
+ type Row = Record<string, unknown>;
18
+ /** A ready-made pair of entities + seed rows, offered as a starting point. */
19
+ export type StarterDataset = {
20
+ /** Stable id (also the wizard / CLI selection value). */
21
+ id: string;
22
+ /** Display name, e.g. "Customers & orders". */
23
+ name: string;
24
+ /** One-line description for the picker card. */
25
+ description: string;
26
+ /** A single emoji used as the card icon. */
27
+ emoji: string;
28
+ /** Build the schemas + seed (fresh each call). */
29
+ build: () => {
30
+ entities: EntitySchema[];
31
+ seed: Record<string, Row[]>;
32
+ };
33
+ };
34
+ /** Every starter dataset, in picker order. */
35
+ export declare const starterDatasets: StarterDataset[];
36
+ /** Look up a starter dataset by id. */
37
+ export declare function getStarterDataset(id: string): StarterDataset | undefined;
38
+ export {};
@@ -0,0 +1,296 @@
1
+ import { pad, ids } from './shared.js';
2
+ // --- 1. Customers & orders ---------------------------------------------------
3
+ function customersOrders() {
4
+ const customers = {
5
+ name: 'customers',
6
+ label: 'Customer',
7
+ idField: 'id',
8
+ fields: [
9
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
10
+ { field: 'name', type: 'text', label: 'Customer', required: true, minLength: 2 },
11
+ { field: 'email', type: 'text', label: 'Email', format: 'email' },
12
+ { field: 'city', type: 'text', label: 'City' },
13
+ { field: 'tier', type: 'enum', label: 'Tier', options: [
14
+ { value: 'free', label: 'Free', color: '#64748b' },
15
+ { value: 'pro', label: 'Pro', color: '#2563eb' },
16
+ { value: 'enterprise', label: 'Enterprise', color: '#7c3aed' },
17
+ ] },
18
+ { field: 'since', type: 'dateString', label: 'Customer since' },
19
+ ],
20
+ };
21
+ const orders = {
22
+ name: 'orders',
23
+ label: 'Order',
24
+ idField: 'id',
25
+ fields: [
26
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
27
+ { field: 'reference', type: 'text', label: 'Reference', required: true },
28
+ { field: 'customer_id', type: 'relation', label: 'Customer', relation: { entity: 'customers', labelField: 'name' } },
29
+ { field: 'total', type: 'number', label: 'Total ($)', min: 0 },
30
+ { field: 'status', type: 'enum', label: 'Status', options: [
31
+ { value: 'pending', label: 'Pending', color: '#f59e0b' },
32
+ { value: 'paid', label: 'Paid', color: '#16a34a' },
33
+ { value: 'shipped', label: 'Shipped', color: '#2563eb' },
34
+ { value: 'refunded', label: 'Refunded', color: '#dc2626' },
35
+ ] },
36
+ { field: 'placed', type: 'dateString', label: 'Placed' },
37
+ ],
38
+ };
39
+ const customerRows = [
40
+ { id: 'cu1', name: 'Northwind Traders', email: 'ops@northwind.test', city: 'Seattle', tier: 'enterprise', since: '2023-02-14' },
41
+ { id: 'cu2', name: 'Blue Harbour Foods', email: 'hello@blueharbour.test', city: 'Bristol', tier: 'pro', since: '2024-06-02' },
42
+ { id: 'cu3', name: 'Cedar & Co', email: 'accounts@cedar.test', city: 'Toronto', tier: 'pro', since: '2024-11-19' },
43
+ { id: 'cu4', name: 'Meridian Labs', email: 'buy@meridian.test', city: 'Berlin', tier: 'free', since: '2025-03-08' },
44
+ { id: 'cu5', name: 'Fairlight Studio', email: 'studio@fairlight.test', city: 'Melbourne', tier: 'pro', since: '2025-05-21' },
45
+ { id: 'cu6', name: 'Alpine Outfitters', email: 'orders@alpine.test', city: 'Zurich', tier: 'enterprise', since: '2022-09-30' },
46
+ ];
47
+ const orderRows = [
48
+ { id: 'or1', reference: 'INV-1041', customer_id: 'cu1', total: 4820, status: 'paid', placed: '2026-01-12' },
49
+ { id: 'or2', reference: 'INV-1042', customer_id: 'cu2', total: 615, status: 'shipped', placed: '2026-01-15' },
50
+ { id: 'or3', reference: 'INV-1043', customer_id: 'cu1', total: 1290, status: 'pending', placed: '2026-01-19' },
51
+ { id: 'or4', reference: 'INV-1044', customer_id: 'cu3', total: 340, status: 'refunded', placed: '2026-01-23' },
52
+ { id: 'or5', reference: 'INV-1045', customer_id: 'cu6', total: 7150, status: 'paid', placed: '2026-02-02' },
53
+ ];
54
+ return {
55
+ entities: [customers, orders],
56
+ seed: {
57
+ customers: pad(customers, customerRows, 24),
58
+ orders: pad(orders, orderRows, 40, { customer_id: ids(customerRows) }),
59
+ },
60
+ };
61
+ }
62
+ // --- 2. Products & categories ------------------------------------------------
63
+ function productsCategories() {
64
+ const categories = {
65
+ name: 'categories',
66
+ label: 'Category',
67
+ idField: 'id',
68
+ fields: [
69
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
70
+ { field: 'name', type: 'text', label: 'Category', required: true },
71
+ { field: 'description', type: 'text', label: 'Description' },
72
+ ],
73
+ };
74
+ const products = {
75
+ name: 'products',
76
+ label: 'Product',
77
+ idField: 'id',
78
+ fields: [
79
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
80
+ { field: 'name', type: 'text', label: 'Product', required: true, minLength: 2 },
81
+ { field: 'category_id', type: 'relation', label: 'Category', relation: { entity: 'categories', labelField: 'name' } },
82
+ { field: 'price', type: 'number', label: 'Price ($)', min: 0 },
83
+ { field: 'stock', type: 'number', label: 'In stock', min: 0 },
84
+ { field: 'status', type: 'enum', label: 'Status', options: [
85
+ { value: 'active', label: 'Active', color: '#16a34a' },
86
+ { value: 'low', label: 'Low stock', color: '#f59e0b' },
87
+ { value: 'discontinued', label: 'Discontinued', color: '#64748b' },
88
+ ] },
89
+ ],
90
+ };
91
+ const categoryRows = [
92
+ { id: 'ca1', name: 'Beverages', description: 'Coffee, tea, soft drinks' },
93
+ { id: 'ca2', name: 'Condiments', description: 'Sauces, spreads, seasonings' },
94
+ { id: 'ca3', name: 'Produce', description: 'Fresh fruit and vegetables' },
95
+ { id: 'ca4', name: 'Bakery', description: 'Bread, pastries, cakes' },
96
+ { id: 'ca5', name: 'Household', description: 'Cleaning and kitchen supplies' },
97
+ ];
98
+ const productRows = [
99
+ { id: 'pr1', name: 'Single-origin coffee', category_id: 'ca1', price: 14.5, stock: 92, status: 'active' },
100
+ { id: 'pr2', name: 'Green tea sampler', category_id: 'ca1', price: 9.75, stock: 12, status: 'low' },
101
+ { id: 'pr3', name: 'Smoked chilli sauce', category_id: 'ca2', price: 6.2, stock: 240, status: 'active' },
102
+ { id: 'pr4', name: 'Sourdough loaf', category_id: 'ca4', price: 5, stock: 30, status: 'active' },
103
+ { id: 'pr5', name: 'Bamboo dish brush', category_id: 'ca5', price: 4.4, stock: 0, status: 'discontinued' },
104
+ ];
105
+ return {
106
+ entities: [categories, products],
107
+ seed: {
108
+ categories: pad(categories, categoryRows, 12),
109
+ products: pad(products, productRows, 36, { category_id: ids(categoryRows) }),
110
+ },
111
+ };
112
+ }
113
+ // --- 3. Projects & tasks -----------------------------------------------------
114
+ function projectsTasks() {
115
+ const projects = {
116
+ name: 'projects',
117
+ label: 'Project',
118
+ idField: 'id',
119
+ fields: [
120
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
121
+ { field: 'name', type: 'text', label: 'Project', required: true, minLength: 2 },
122
+ { field: 'owner', type: 'text', label: 'Owner' },
123
+ { field: 'status', type: 'enum', label: 'Status', options: [
124
+ { value: 'planning', label: 'Planning', color: '#64748b' },
125
+ { value: 'active', label: 'Active', color: '#2563eb' },
126
+ { value: 'blocked', label: 'Blocked', color: '#dc2626' },
127
+ { value: 'done', label: 'Done', color: '#16a34a' },
128
+ ] },
129
+ { field: 'budget', type: 'number', label: 'Budget ($)', min: 0 },
130
+ { field: 'due', type: 'dateString', label: 'Due' },
131
+ ],
132
+ };
133
+ const tasks = {
134
+ name: 'tasks',
135
+ label: 'Task',
136
+ idField: 'id',
137
+ fields: [
138
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
139
+ { field: 'title', type: 'text', label: 'Task', required: true, minLength: 2 },
140
+ { field: 'project_id', type: 'relation', label: 'Project', relation: { entity: 'projects', labelField: 'name' } },
141
+ { field: 'assignee', type: 'text', label: 'Assignee' },
142
+ { field: 'priority', type: 'enum', label: 'Priority', options: [
143
+ { value: 'low', label: 'Low', color: '#64748b' },
144
+ { value: 'medium', label: 'Medium', color: '#f59e0b' },
145
+ { value: 'high', label: 'High', color: '#dc2626' },
146
+ ] },
147
+ { field: 'estimate', type: 'number', label: 'Estimate (h)', min: 0 },
148
+ { field: 'done', type: 'boolean', label: 'Done' },
149
+ { field: 'due', type: 'dateString', label: 'Due' },
150
+ ],
151
+ };
152
+ const projectRows = [
153
+ { id: 'pj1', name: 'Website redesign', owner: 'Dana Iqbal', status: 'active', budget: 48000, due: '2026-04-30' },
154
+ { id: 'pj2', name: 'Mobile checkout', owner: 'Sam Oyelaran', status: 'blocked', budget: 96000, due: '2026-06-15' },
155
+ { id: 'pj3', name: 'Warehouse migration', owner: 'Riya Kapoor', status: 'planning', budget: 130000, due: '2026-09-01' },
156
+ { id: 'pj4', name: 'Support portal', owner: 'Theo Marchand', status: 'done', budget: 25000, due: '2025-12-12' },
157
+ ];
158
+ const taskRows = [
159
+ { id: 'ts1', title: 'Audit current pages', project_id: 'pj1', assignee: 'Dana Iqbal', priority: 'medium', estimate: 12, done: true, due: '2026-02-10' },
160
+ { id: 'ts2', title: 'New component library', project_id: 'pj1', assignee: 'Nils Berg', priority: 'high', estimate: 40, done: false, due: '2026-03-20' },
161
+ { id: 'ts3', title: 'Payment provider spike', project_id: 'pj2', assignee: 'Sam Oyelaran', priority: 'high', estimate: 16, done: false, due: '2026-02-28' },
162
+ { id: 'ts4', title: 'Inventory data mapping', project_id: 'pj3', assignee: 'Riya Kapoor', priority: 'low', estimate: 24, done: false, due: '2026-05-05' },
163
+ ];
164
+ return {
165
+ entities: [projects, tasks],
166
+ seed: {
167
+ projects: pad(projects, projectRows, 16),
168
+ tasks: pad(tasks, taskRows, 48, { project_id: ids(projectRows) }),
169
+ },
170
+ };
171
+ }
172
+ // --- 4. Employees & departments ---------------------------------------------
173
+ function employeesDepartments() {
174
+ const departments = {
175
+ name: 'departments',
176
+ label: 'Department',
177
+ idField: 'id',
178
+ fields: [
179
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
180
+ { field: 'name', type: 'text', label: 'Department', required: true },
181
+ { field: 'location', type: 'text', label: 'Location' },
182
+ { field: 'headcount', type: 'number', label: 'Headcount', min: 0 },
183
+ ],
184
+ };
185
+ const employees = {
186
+ name: 'employees',
187
+ label: 'Employee',
188
+ idField: 'id',
189
+ fields: [
190
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
191
+ { field: 'name', type: 'text', label: 'Name', required: true, minLength: 2 },
192
+ { field: 'email', type: 'text', label: 'Email', format: 'email' },
193
+ { field: 'department_id', type: 'relation', label: 'Department', relation: { entity: 'departments', labelField: 'name' } },
194
+ { field: 'role', type: 'text', label: 'Role' },
195
+ { field: 'salary', type: 'number', label: 'Salary ($)', min: 0 },
196
+ { field: 'status', type: 'enum', label: 'Status', options: [
197
+ { value: 'active', label: 'Active', color: '#16a34a' },
198
+ { value: 'onboarding', label: 'Onboarding', color: '#2563eb' },
199
+ { value: 'leave', label: 'On leave', color: '#f59e0b' },
200
+ { value: 'alumni', label: 'Alumni', color: '#64748b' },
201
+ ] },
202
+ { field: 'started', type: 'dateString', label: 'Start date' },
203
+ ],
204
+ };
205
+ const departmentRows = [
206
+ { id: 'de1', name: 'Engineering', location: 'Lisbon', headcount: 42 },
207
+ { id: 'de2', name: 'Sales', location: 'Chicago', headcount: 18 },
208
+ { id: 'de3', name: 'Support', location: 'Manila', headcount: 25 },
209
+ { id: 'de4', name: 'Finance', location: 'London', headcount: 9 },
210
+ ];
211
+ const employeeRows = [
212
+ { id: 'em1', name: 'Aisha Rahman', email: 'aisha@example.test', department_id: 'de1', role: 'Staff engineer', salary: 142000, status: 'active', started: '2021-08-16' },
213
+ { id: 'em2', name: 'Marcus Webb', email: 'marcus@example.test', department_id: 'de2', role: 'Account executive', salary: 88000, status: 'active', started: '2023-01-09' },
214
+ { id: 'em3', name: 'Lena Fischer', email: 'lena@example.test', department_id: 'de3', role: 'Support lead', salary: 76000, status: 'leave', started: '2022-04-25' },
215
+ { id: 'em4', name: 'Diego Santos', email: 'diego@example.test', department_id: 'de4', role: 'Financial analyst', salary: 81000, status: 'onboarding', started: '2026-01-05' },
216
+ ];
217
+ return {
218
+ entities: [departments, employees],
219
+ seed: {
220
+ departments: pad(departments, departmentRows, 10),
221
+ employees: pad(employees, employeeRows, 40, { department_id: ids(departmentRows) }),
222
+ },
223
+ };
224
+ }
225
+ // --- 5. Support tickets ------------------------------------------------------
226
+ function ticketsAccounts() {
227
+ const accounts = {
228
+ name: 'accounts',
229
+ label: 'Account',
230
+ idField: 'id',
231
+ fields: [
232
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
233
+ { field: 'company', type: 'text', label: 'Company', required: true, minLength: 2 },
234
+ { field: 'contact', type: 'text', label: 'Primary contact' },
235
+ { field: 'plan', type: 'enum', label: 'Plan', options: [
236
+ { value: 'starter', label: 'Starter', color: '#64748b' },
237
+ { value: 'growth', label: 'Growth', color: '#2563eb' },
238
+ { value: 'scale', label: 'Scale', color: '#7c3aed' },
239
+ ] },
240
+ { field: 'seats', type: 'number', label: 'Seats', min: 1 },
241
+ ],
242
+ };
243
+ const tickets = {
244
+ name: 'tickets',
245
+ label: 'Ticket',
246
+ idField: 'id',
247
+ fields: [
248
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
249
+ { field: 'subject', type: 'text', label: 'Subject', required: true, minLength: 3 },
250
+ { field: 'account_id', type: 'relation', label: 'Account', relation: { entity: 'accounts', labelField: 'company' } },
251
+ { field: 'priority', type: 'enum', label: 'Priority', options: [
252
+ { value: 'low', label: 'Low', color: '#64748b' },
253
+ { value: 'normal', label: 'Normal', color: '#2563eb' },
254
+ { value: 'urgent', label: 'Urgent', color: '#dc2626' },
255
+ ] },
256
+ { field: 'status', type: 'enum', label: 'Status', options: [
257
+ { value: 'open', label: 'Open', color: '#f59e0b' },
258
+ { value: 'pending', label: 'Pending', color: '#2563eb' },
259
+ { value: 'solved', label: 'Solved', color: '#16a34a' },
260
+ ] },
261
+ { field: 'hours', type: 'number', label: 'Hours logged', min: 0 },
262
+ { field: 'opened', type: 'dateString', label: 'Opened' },
263
+ ],
264
+ };
265
+ const accountRows = [
266
+ { id: 'ac1', company: 'Halcyon Retail', contact: 'Priya Nair', plan: 'scale', seats: 220 },
267
+ { id: 'ac2', company: 'Redwood Clinic', contact: 'Tom Alvarez', plan: 'growth', seats: 45 },
268
+ { id: 'ac3', company: 'Vector Freight', contact: 'Ingrid Holm', plan: 'starter', seats: 8 },
269
+ { id: 'ac4', company: 'Pinehill Academy', contact: 'Joy Adeyemi', plan: 'growth', seats: 60 },
270
+ ];
271
+ const ticketRows = [
272
+ { id: 'tk1', subject: 'Export fails on large report', account_id: 'ac1', priority: 'urgent', status: 'open', hours: 3.5, opened: '2026-02-03' },
273
+ { id: 'tk2', subject: 'Add a second admin seat', account_id: 'ac2', priority: 'low', status: 'solved', hours: 0.5, opened: '2026-01-28' },
274
+ { id: 'tk3', subject: 'Webhook retries stop after an hour', account_id: 'ac3', priority: 'normal', status: 'pending', hours: 2, opened: '2026-02-06' },
275
+ { id: 'tk4', subject: 'SSO metadata refresh', account_id: 'ac4', priority: 'normal', status: 'open', hours: 1.25, opened: '2026-02-11' },
276
+ ];
277
+ return {
278
+ entities: [accounts, tickets],
279
+ seed: {
280
+ accounts: pad(accounts, accountRows, 12),
281
+ tickets: pad(tickets, ticketRows, 44, { account_id: ids(accountRows) }),
282
+ },
283
+ };
284
+ }
285
+ /** Every starter dataset, in picker order. */
286
+ export const starterDatasets = [
287
+ { id: 'customers-orders', name: 'Customers & orders', description: 'Accounts with their order history - the classic back-office pair.', emoji: '🧾', build: customersOrders },
288
+ { id: 'products-categories', name: 'Products & categories', description: 'A product catalog with stock levels and categories.', emoji: '📦', build: productsCategories },
289
+ { id: 'projects-tasks', name: 'Projects & tasks', description: 'Project tracker with assignees, priorities and due dates.', emoji: '🗂️', build: projectsTasks },
290
+ { id: 'employees-departments', name: 'Employees & departments', description: 'A staff directory with departments, roles and salaries.', emoji: '👥', build: employeesDepartments },
291
+ { id: 'tickets-accounts', name: 'Support tickets', description: 'Customer accounts with a support queue by priority and status.', emoji: '🎧', build: ticketsAccounts },
292
+ ];
293
+ /** Look up a starter dataset by id. */
294
+ export function getStarterDataset(id) {
295
+ return starterDatasets.find((d) => d.id === id);
296
+ }
@@ -0,0 +1,2 @@
1
+ import { type SampleApp } from './shared.js';
2
+ export declare const ecommerce: SampleApp;