@svgrid/enterprise 2.5.3 → 2.6.1

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 (624) 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/{src → dist}/SvExpressionEditor.svelte +4 -1
  8. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  9. package/dist/SvFileInput.svelte.d.ts +20 -0
  10. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  11. package/dist/SvGridBoard.svelte.d.ts +30 -0
  12. package/{src → dist}/SvGridEditPanel.svelte +173 -28
  13. package/dist/SvGridEditPanel.svelte.d.ts +75 -0
  14. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  15. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  16. package/dist/SvImportDialog.svelte.d.ts +88 -0
  17. package/dist/SvLookupInput.svelte.d.ts +21 -0
  18. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  19. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  20. package/dist/SvSchedule.svelte.d.ts +29 -0
  21. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  22. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  23. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  24. package/dist/alerts/alert-engine-attach.js +106 -0
  25. package/dist/alerts/alert-engine.d.ts +42 -0
  26. package/dist/alerts/alert-engine.js +196 -0
  27. package/dist/alerts/alert-formats.d.ts +26 -0
  28. package/dist/alerts/alert-formats.js +58 -0
  29. package/dist/alerts/alert-observer.d.ts +54 -0
  30. package/dist/alerts/alert-observer.js +156 -0
  31. package/dist/alerts/alert-scheduler.d.ts +30 -0
  32. package/dist/alerts/alert-scheduler.js +54 -0
  33. package/dist/alerts/alert-storage.d.ts +31 -0
  34. package/dist/alerts/alert-storage.js +92 -0
  35. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  36. package/dist/alerts/alert-store.svelte.js +69 -0
  37. package/dist/alerts/alert-types.d.ts +86 -0
  38. package/dist/alerts/alert-types.js +1 -0
  39. package/dist/alerts.d.ts +2 -0
  40. package/{src/alerts.ts → dist/alerts.js} +9 -9
  41. package/dist/board.d.ts +7 -0
  42. package/{src/board.ts → dist/board.js} +13 -14
  43. package/dist/cdn/svgrid-enterprise.svelte-external.js +3220 -2607
  44. package/dist/designer/assets/index-BfzoL904.css +1 -0
  45. package/dist/designer/assets/{index-CBYU-KNn.js → index-CKdwDseq.js} +139 -139
  46. package/dist/designer/assets/src-DCKhP5Xy.css +1 -0
  47. package/dist/designer/assets/{src-i309BeJb.js → src-DLsSdh3J.js} +213 -193
  48. package/dist/designer/index.html +4 -4
  49. package/dist/edit-panel.d.ts +105 -0
  50. package/dist/edit-panel.js +350 -0
  51. package/dist/export-conditional.d.ts +31 -0
  52. package/dist/export-conditional.js +65 -0
  53. package/dist/export-ooxml.d.ts +93 -0
  54. package/dist/export-ooxml.js +385 -0
  55. package/dist/export-pdf.d.ts +107 -0
  56. package/dist/export-pdf.js +144 -0
  57. package/dist/export-print.d.ts +55 -0
  58. package/dist/export-print.js +91 -0
  59. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  60. package/dist/export-serialize.js +11 -0
  61. package/dist/export-xls.d.ts +26 -0
  62. package/dist/export-xls.js +157 -0
  63. package/dist/export.d.ts +323 -0
  64. package/dist/export.js +1021 -0
  65. package/dist/expressions/evaluate.d.ts +17 -0
  66. package/dist/expressions/evaluate.js +214 -0
  67. package/dist/expressions/expression-columns.d.ts +61 -0
  68. package/dist/expressions/expression-columns.js +72 -0
  69. package/dist/expressions/expression-types.d.ts +125 -0
  70. package/dist/expressions/expression-types.js +1 -0
  71. package/dist/expressions/parse.d.ts +25 -0
  72. package/dist/expressions/parse.js +537 -0
  73. package/dist/import.d.ts +232 -0
  74. package/dist/import.js +846 -0
  75. package/dist/index.d.ts +66 -0
  76. package/dist/index.js +91 -0
  77. package/dist/install.d.ts +70 -0
  78. package/dist/install.js +61 -0
  79. package/dist/license-core.d.ts +37 -0
  80. package/dist/license-core.js +81 -0
  81. package/dist/license.d.ts +30 -0
  82. package/dist/license.js +139 -0
  83. package/dist/master-detail.d.ts +23 -0
  84. package/dist/master-detail.js +35 -0
  85. package/dist/node/studio.js +683 -13
  86. package/dist/pivot-chart.d.ts +28 -0
  87. package/dist/pivot-chart.js +71 -0
  88. package/dist/pivot-designer.d.ts +69 -0
  89. package/dist/pivot-designer.js +38 -0
  90. package/dist/pivot-enable.d.ts +6 -0
  91. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  92. package/dist/pivot.d.ts +111 -0
  93. package/dist/pivot.js +353 -0
  94. package/dist/print.d.ts +33 -0
  95. package/dist/print.js +61 -0
  96. package/dist/revoked.d.ts +1 -0
  97. package/{src/revoked.ts → dist/revoked.js} +5 -6
  98. package/dist/scheduler-assignments.d.ts +64 -0
  99. package/dist/scheduler-assignments.js +92 -0
  100. package/dist/scheduler-axis.d.ts +81 -0
  101. package/dist/scheduler-axis.js +180 -0
  102. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  103. package/dist/scheduler-booking.js +50 -0
  104. package/dist/scheduler-config.d.ts +177 -0
  105. package/dist/scheduler-config.js +1 -0
  106. package/dist/scheduler-dependencies.d.ts +89 -0
  107. package/dist/scheduler-dependencies.js +179 -0
  108. package/dist/scheduler-freebusy.d.ts +19 -0
  109. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  110. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  111. package/dist/scheduler-heatmap.js +41 -0
  112. package/dist/scheduler-resource-tree.d.ts +48 -0
  113. package/dist/scheduler-resource-tree.js +78 -0
  114. package/dist/scheduler-slots.d.ts +37 -0
  115. package/dist/scheduler-slots.js +80 -0
  116. package/dist/scheduler-summary.d.ts +41 -0
  117. package/dist/scheduler-summary.js +54 -0
  118. package/dist/scheduler.d.ts +7 -0
  119. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  120. package/dist/scheduling.d.ts +132 -0
  121. package/dist/scheduling.js +228 -0
  122. package/dist/schema-designer.d.ts +42 -0
  123. package/dist/schema-designer.js +117 -0
  124. package/dist/schema.d.ts +408 -0
  125. package/dist/schema.js +225 -0
  126. package/dist/smart-shim.d.ts +62 -0
  127. package/dist/smart-shim.js +34 -0
  128. package/dist/sources/aggregate.d.ts +43 -0
  129. package/dist/sources/aggregate.js +60 -0
  130. package/dist/sources/auth-supabase.d.ts +69 -0
  131. package/dist/sources/auth-supabase.js +39 -0
  132. package/dist/sources/dashboard.d.ts +65 -0
  133. package/dist/sources/dashboard.js +95 -0
  134. package/dist/sources/field-inference.d.ts +23 -0
  135. package/dist/sources/field-inference.js +52 -0
  136. package/dist/sources/filters.d.ts +35 -0
  137. package/dist/sources/filters.js +52 -0
  138. package/dist/sources/index.d.ts +18 -0
  139. package/dist/sources/index.js +18 -0
  140. package/dist/sources/introspect-supabase.d.ts +30 -0
  141. package/dist/sources/introspect-supabase.js +134 -0
  142. package/dist/sources/realtime-supabase.d.ts +37 -0
  143. package/dist/sources/realtime-supabase.js +52 -0
  144. package/dist/sources/relation-lookup.d.ts +50 -0
  145. package/dist/sources/relation-lookup.js +77 -0
  146. package/dist/sources/rest-adapters.d.ts +48 -0
  147. package/dist/sources/rest-adapters.js +85 -0
  148. package/dist/sources/rest.d.ts +38 -0
  149. package/dist/sources/rest.js +86 -0
  150. package/dist/sources/schema-from-columns.d.ts +37 -0
  151. package/dist/sources/schema-from-columns.js +48 -0
  152. package/dist/sources/supabase.d.ts +33 -0
  153. package/dist/sources/supabase.js +74 -0
  154. package/dist/sources/with-entity-rules.d.ts +25 -0
  155. package/dist/sources/with-entity-rules.js +47 -0
  156. package/dist/sources/with-relation-labels.d.ts +26 -0
  157. package/dist/sources/with-relation-labels.js +38 -0
  158. package/dist/staged-editing.d.ts +85 -0
  159. package/dist/staged-editing.js +0 -0
  160. package/dist/studio/bug-report.d.ts +61 -0
  161. package/dist/studio/bug-report.js +126 -0
  162. package/dist/studio/cli.d.ts +56 -0
  163. package/dist/studio/cli.js +70 -0
  164. package/dist/studio/copilot-core.d.ts +22 -0
  165. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  166. package/dist/studio/csv.d.ts +36 -0
  167. package/dist/studio/csv.js +173 -0
  168. package/dist/studio/db-connect-string.d.ts +45 -0
  169. package/dist/studio/db-connect-string.js +113 -0
  170. package/dist/studio/deploy-cli.d.ts +35 -0
  171. package/dist/studio/deploy-cli.js +81 -0
  172. package/dist/studio/emit-project.d.ts +77 -0
  173. package/dist/studio/emit-project.js +5463 -0
  174. package/dist/studio/emit-schema.d.ts +110 -0
  175. package/dist/studio/emit-schema.js +1128 -0
  176. package/dist/studio/index.d.ts +35 -0
  177. package/dist/studio/index.js +41 -0
  178. package/dist/studio/init-flow.d.ts +58 -0
  179. package/dist/studio/init-flow.js +451 -0
  180. package/dist/studio/introspect-db.d.ts +47 -0
  181. package/dist/studio/introspect-db.js +255 -0
  182. package/dist/studio/introspect-openapi.d.ts +19 -0
  183. package/dist/studio/introspect-openapi.js +244 -0
  184. package/dist/studio/introspect-prisma.d.ts +25 -0
  185. package/dist/studio/introspect-prisma.js +164 -0
  186. package/dist/studio/introspect.d.ts +35 -0
  187. package/dist/studio/introspect.js +306 -0
  188. package/dist/studio/project.d.ts +1448 -0
  189. package/dist/studio/project.js +2187 -0
  190. package/dist/studio/sample-data.d.ts +19 -0
  191. package/dist/studio/sample-data.js +207 -0
  192. package/dist/studio/samples/ats.d.ts +2 -0
  193. package/dist/studio/samples/ats.js +194 -0
  194. package/dist/studio/samples/clinic.d.ts +2 -0
  195. package/dist/studio/samples/clinic.js +171 -0
  196. package/dist/studio/samples/crm.d.ts +2 -0
  197. package/dist/studio/samples/crm.js +280 -0
  198. package/dist/studio/samples/datasets.d.ts +38 -0
  199. package/dist/studio/samples/datasets.js +296 -0
  200. package/dist/studio/samples/ecommerce.d.ts +2 -0
  201. package/dist/studio/samples/ecommerce.js +178 -0
  202. package/dist/studio/samples/events.d.ts +2 -0
  203. package/dist/studio/samples/events.js +192 -0
  204. package/dist/studio/samples/fleet.d.ts +2 -0
  205. package/dist/studio/samples/fleet.js +203 -0
  206. package/dist/studio/samples/gym.d.ts +2 -0
  207. package/dist/studio/samples/gym.js +205 -0
  208. package/dist/studio/samples/hr.d.ts +2 -0
  209. package/dist/studio/samples/hr.js +186 -0
  210. package/dist/studio/samples/index.d.ts +13 -0
  211. package/dist/studio/samples/index.js +44 -0
  212. package/dist/studio/samples/insurance.d.ts +2 -0
  213. package/dist/studio/samples/insurance.js +220 -0
  214. package/dist/studio/samples/inventory.d.ts +2 -0
  215. package/dist/studio/samples/inventory.js +204 -0
  216. package/dist/studio/samples/invoicing.d.ts +2 -0
  217. package/dist/studio/samples/invoicing.js +154 -0
  218. package/dist/studio/samples/library.d.ts +2 -0
  219. package/dist/studio/samples/library.js +171 -0
  220. package/dist/studio/samples/live-data.d.ts +5 -0
  221. package/dist/studio/samples/live-data.js +261 -0
  222. package/dist/studio/samples/projects.d.ts +2 -0
  223. package/dist/studio/samples/projects.js +203 -0
  224. package/dist/studio/samples/realestate.d.ts +2 -0
  225. package/dist/studio/samples/realestate.js +187 -0
  226. package/dist/studio/samples/restaurant.d.ts +2 -0
  227. package/dist/studio/samples/restaurant.js +180 -0
  228. package/dist/studio/samples/school.d.ts +2 -0
  229. package/dist/studio/samples/school.js +188 -0
  230. package/dist/studio/samples/shared.d.ts +142 -0
  231. package/dist/studio/samples/shared.js +164 -0
  232. package/dist/studio/samples/starter.d.ts +4 -0
  233. package/dist/studio/samples/starter.js +237 -0
  234. package/dist/studio/samples/subscriptions.d.ts +2 -0
  235. package/dist/studio/samples/subscriptions.js +175 -0
  236. package/dist/studio/samples/support.d.ts +2 -0
  237. package/dist/studio/samples/support.js +209 -0
  238. package/dist/studio/scaffold-app.d.ts +22 -0
  239. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  240. package/dist/studio/scaffold.d.ts +63 -0
  241. package/dist/studio/scaffold.js +346 -0
  242. package/dist/studio/screen-suites.d.ts +193 -0
  243. package/dist/studio/screen-suites.js +297 -0
  244. package/dist/studio/themes.d.ts +34 -0
  245. package/dist/studio/themes.js +41 -0
  246. package/dist/studio/ui-components.d.ts +89 -0
  247. package/dist/studio/ui-components.generated.d.ts +29 -0
  248. package/dist/studio/ui-components.generated.js +7319 -0
  249. package/dist/studio/ui-components.js +673 -0
  250. package/dist/studio/user-error.d.ts +23 -0
  251. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  252. package/dist/studio/verify.d.ts +34 -0
  253. package/dist/studio/verify.js +47 -0
  254. package/dist/sveltekit/in-memory.d.ts +14 -0
  255. package/dist/sveltekit/in-memory.js +113 -0
  256. package/dist/sveltekit/index.d.ts +6 -0
  257. package/dist/sveltekit/index.js +5 -0
  258. package/dist/sveltekit/query-plan.d.ts +44 -0
  259. package/dist/sveltekit/query-plan.js +76 -0
  260. package/dist/sveltekit/sql-source.d.ts +47 -0
  261. package/dist/sveltekit/sql-source.js +106 -0
  262. package/dist/sveltekit/sql.d.ts +48 -0
  263. package/dist/sveltekit/sql.js +73 -0
  264. package/dist/sveltekit/transport.d.ts +209 -0
  265. package/dist/sveltekit/transport.js +219 -0
  266. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  267. package/dist/sveltekit/types.js +1 -0
  268. package/dist/upgrade-prompt.d.ts +16 -0
  269. package/dist/upgrade-prompt.js +141 -0
  270. package/dist/version.d.ts +13 -0
  271. package/{src/version.ts → dist/version.js} +1 -1
  272. package/dist/watermark.d.ts +2 -0
  273. package/dist/watermark.js +146 -0
  274. package/package.json +28 -26
  275. package/dist/designer/assets/index-oYok52zd.css +0 -1
  276. package/dist/designer/assets/src-D-O2F805.css +0 -1
  277. package/src/SvBoard.dom.test.ts +0 -67
  278. package/src/SvGridAlerts.dom.test.ts +0 -113
  279. package/src/SvGridEditPanel.dom.test.ts +0 -320
  280. package/src/SvRecordDetail.dom.test.ts +0 -137
  281. package/src/SvSchedule.dom.test.ts +0 -57
  282. package/src/ai-export-pdf.dom.test.ts +0 -77
  283. package/src/ai-export-xlsx.dom.test.ts +0 -90
  284. package/src/ai-export.dom.test.ts +0 -114
  285. package/src/alerts/alert-engine-attach.ts +0 -165
  286. package/src/alerts/alert-engine.test.ts +0 -135
  287. package/src/alerts/alert-engine.ts +0 -260
  288. package/src/alerts/alert-formats.test.ts +0 -87
  289. package/src/alerts/alert-formats.ts +0 -77
  290. package/src/alerts/alert-observer.test.ts +0 -189
  291. package/src/alerts/alert-observer.ts +0 -208
  292. package/src/alerts/alert-scheduler.ts +0 -96
  293. package/src/alerts/alert-storage.test.ts +0 -54
  294. package/src/alerts/alert-storage.ts +0 -116
  295. package/src/alerts/alert-store.svelte.ts +0 -80
  296. package/src/alerts/alert-types.ts +0 -94
  297. package/src/board.dom.test.ts +0 -941
  298. package/src/edit-panel.test.ts +0 -322
  299. package/src/edit-panel.ts +0 -379
  300. package/src/export-conditional.test.ts +0 -60
  301. package/src/export-conditional.ts +0 -94
  302. package/src/export-ooxml.test.ts +0 -152
  303. package/src/export-ooxml.ts +0 -489
  304. package/src/export-pdf.test.ts +0 -138
  305. package/src/export-pdf.ts +0 -245
  306. package/src/export-print.test.ts +0 -66
  307. package/src/export-print.ts +0 -132
  308. package/src/export-serialize.test.ts +0 -56
  309. package/src/export-xls.ts +0 -199
  310. package/src/export-xlsx-roundtrip.test.ts +0 -120
  311. package/src/export-xlsx.test.ts +0 -150
  312. package/src/export.test.ts +0 -349
  313. package/src/export.ts +0 -1464
  314. package/src/expressions/evaluate.test.ts +0 -111
  315. package/src/expressions/evaluate.ts +0 -237
  316. package/src/expressions/expression-columns.ts +0 -133
  317. package/src/expressions/expression-types.ts +0 -84
  318. package/src/expressions/parse.test.ts +0 -106
  319. package/src/expressions/parse.ts +0 -610
  320. package/src/import-automap.test.ts +0 -131
  321. package/src/import-hardening.test.ts +0 -158
  322. package/src/import.test.ts +0 -415
  323. package/src/import.ts +0 -1044
  324. package/src/index.ts +0 -569
  325. package/src/install.ts +0 -154
  326. package/src/license-core.test.ts +0 -23
  327. package/src/license-core.ts +0 -107
  328. package/src/license-expiry.test.ts +0 -144
  329. package/src/license.ts +0 -157
  330. package/src/master-detail.test.ts +0 -61
  331. package/src/master-detail.ts +0 -42
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  386. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  387. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  388. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  389. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  390. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  391. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  392. package/src/pivot-chart.test.ts +0 -86
  393. package/src/pivot-chart.ts +0 -112
  394. package/src/pivot-designer.ts +0 -101
  395. package/src/pivot.test.ts +0 -335
  396. package/src/pivot.ts +0 -578
  397. package/src/print.ts +0 -107
  398. package/src/scheduler-assignments.test.ts +0 -97
  399. package/src/scheduler-assignments.ts +0 -134
  400. package/src/scheduler-axis.test.ts +0 -108
  401. package/src/scheduler-axis.ts +0 -238
  402. package/src/scheduler-booking.test.ts +0 -57
  403. package/src/scheduler-config.ts +0 -179
  404. package/src/scheduler-dependencies.test.ts +0 -155
  405. package/src/scheduler-dependencies.ts +0 -223
  406. package/src/scheduler-freebusy.test.ts +0 -41
  407. package/src/scheduler-heatmap.test.ts +0 -39
  408. package/src/scheduler-resource-tree.test.ts +0 -84
  409. package/src/scheduler-resource-tree.ts +0 -107
  410. package/src/scheduler-slots.test.ts +0 -53
  411. package/src/scheduler-slots.ts +0 -94
  412. package/src/scheduler-summary.test.ts +0 -47
  413. package/src/scheduler-summary.ts +0 -81
  414. package/src/scheduling.test.ts +0 -194
  415. package/src/scheduling.ts +0 -293
  416. package/src/schema-designer.test.ts +0 -121
  417. package/src/schema-designer.ts +0 -142
  418. package/src/schema.test.ts +0 -268
  419. package/src/schema.ts +0 -562
  420. package/src/smart-shim.ts +0 -107
  421. package/src/sources/aggregate.test.ts +0 -79
  422. package/src/sources/aggregate.ts +0 -102
  423. package/src/sources/auth-supabase.test.ts +0 -80
  424. package/src/sources/auth-supabase.ts +0 -87
  425. package/src/sources/dashboard.kpi.test.ts +0 -50
  426. package/src/sources/dashboard.test.ts +0 -61
  427. package/src/sources/dashboard.ts +0 -136
  428. package/src/sources/field-inference.test.ts +0 -60
  429. package/src/sources/field-inference.ts +0 -63
  430. package/src/sources/filters.test.ts +0 -58
  431. package/src/sources/filters.ts +0 -70
  432. package/src/sources/index.ts +0 -67
  433. package/src/sources/introspect-supabase.test.ts +0 -112
  434. package/src/sources/introspect-supabase.ts +0 -139
  435. package/src/sources/realtime-supabase.test.ts +0 -93
  436. package/src/sources/realtime-supabase.ts +0 -99
  437. package/src/sources/relation-lookup.test.ts +0 -99
  438. package/src/sources/relation-lookup.ts +0 -128
  439. package/src/sources/rest-adapters.test.ts +0 -95
  440. package/src/sources/rest-adapters.ts +0 -120
  441. package/src/sources/rest.test.ts +0 -104
  442. package/src/sources/rest.ts +0 -129
  443. package/src/sources/schema-from-columns.test.ts +0 -106
  444. package/src/sources/schema-from-columns.ts +0 -88
  445. package/src/sources/supabase.test.ts +0 -110
  446. package/src/sources/supabase.ts +0 -99
  447. package/src/sources/with-entity-rules.test.ts +0 -104
  448. package/src/sources/with-entity-rules.ts +0 -78
  449. package/src/sources/with-relation-labels.test.ts +0 -75
  450. package/src/sources/with-relation-labels.ts +0 -73
  451. package/src/staged-editing.ts +0 -0
  452. package/src/studio/bug-report.test.ts +0 -101
  453. package/src/studio/bug-report.ts +0 -165
  454. package/src/studio/cli.test.ts +0 -187
  455. package/src/studio/cli.ts +0 -117
  456. package/src/studio/copilot-core.test.ts +0 -45
  457. package/src/studio/csv.test.ts +0 -90
  458. package/src/studio/csv.ts +0 -165
  459. package/src/studio/db-connect-string.test.ts +0 -94
  460. package/src/studio/db-connect-string.ts +0 -128
  461. package/src/studio/deploy-cli.test.ts +0 -56
  462. package/src/studio/deploy-cli.ts +0 -100
  463. package/src/studio/emit-project.test.ts +0 -3324
  464. package/src/studio/emit-project.ts +0 -5377
  465. package/src/studio/emit-schema.test.ts +0 -111
  466. package/src/studio/emit-schema.ts +0 -1181
  467. package/src/studio/index.ts +0 -380
  468. package/src/studio/init-flow.test.ts +0 -514
  469. package/src/studio/init-flow.ts +0 -556
  470. package/src/studio/introspect-db.test.ts +0 -186
  471. package/src/studio/introspect-db.ts +0 -312
  472. package/src/studio/introspect-openapi.test.ts +0 -84
  473. package/src/studio/introspect-openapi.ts +0 -252
  474. package/src/studio/introspect-prisma.test.ts +0 -99
  475. package/src/studio/introspect-prisma.ts +0 -175
  476. package/src/studio/introspect.test.ts +0 -172
  477. package/src/studio/introspect.ts +0 -310
  478. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  479. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  480. package/src/studio/pipeline.test.ts +0 -42
  481. package/src/studio/project-robust.test.ts +0 -157
  482. package/src/studio/project.test.ts +0 -929
  483. package/src/studio/project.ts +0 -2394
  484. package/src/studio/sample-data.test.ts +0 -58
  485. package/src/studio/sample-data.ts +0 -203
  486. package/src/studio/samples/ats.ts +0 -202
  487. package/src/studio/samples/clinic.ts +0 -179
  488. package/src/studio/samples/crm.ts +0 -291
  489. package/src/studio/samples/datasets.test.ts +0 -84
  490. package/src/studio/samples/datasets.ts +0 -340
  491. package/src/studio/samples/ecommerce.ts +0 -187
  492. package/src/studio/samples/events.ts +0 -201
  493. package/src/studio/samples/fleet.ts +0 -213
  494. package/src/studio/samples/gym.ts +0 -215
  495. package/src/studio/samples/hr.ts +0 -195
  496. package/src/studio/samples/index.ts +0 -55
  497. package/src/studio/samples/insurance.ts +0 -229
  498. package/src/studio/samples/inventory.ts +0 -213
  499. package/src/studio/samples/invoicing.ts +0 -162
  500. package/src/studio/samples/library.ts +0 -180
  501. package/src/studio/samples/live-data.test.ts +0 -99
  502. package/src/studio/samples/live-data.ts +0 -306
  503. package/src/studio/samples/projects.ts +0 -212
  504. package/src/studio/samples/realestate.ts +0 -196
  505. package/src/studio/samples/restaurant.ts +0 -189
  506. package/src/studio/samples/samples.test.ts +0 -304
  507. package/src/studio/samples/school.ts +0 -197
  508. package/src/studio/samples/seed-floor.test.ts +0 -25
  509. package/src/studio/samples/shared.ts +0 -237
  510. package/src/studio/samples/starter.ts +0 -251
  511. package/src/studio/samples/subscriptions.ts +0 -183
  512. package/src/studio/samples/support.ts +0 -216
  513. package/src/studio/scaffold-app.test.ts +0 -91
  514. package/src/studio/scaffold.test.ts +0 -192
  515. package/src/studio/scaffold.ts +0 -390
  516. package/src/studio/screen-suites.test.ts +0 -269
  517. package/src/studio/screen-suites.ts +0 -448
  518. package/src/studio/themes.ts +0 -62
  519. package/src/studio/ui-components-surface.test.ts +0 -185
  520. package/src/studio/ui-components.generated.ts +0 -7154
  521. package/src/studio/ui-components.ts +0 -742
  522. package/src/studio/verify.test.ts +0 -47
  523. package/src/studio/verify.ts +0 -79
  524. package/src/sveltekit/in-memory.test.ts +0 -104
  525. package/src/sveltekit/in-memory.ts +0 -129
  526. package/src/sveltekit/index.ts +0 -24
  527. package/src/sveltekit/query-plan.test.ts +0 -109
  528. package/src/sveltekit/query-plan.ts +0 -125
  529. package/src/sveltekit/sql-source.test.ts +0 -198
  530. package/src/sveltekit/sql-source.ts +0 -171
  531. package/src/sveltekit/sql.test.ts +0 -80
  532. package/src/sveltekit/sql.ts +0 -131
  533. package/src/sveltekit/transport-scope.test.ts +0 -125
  534. package/src/sveltekit/transport.test.ts +0 -201
  535. package/src/sveltekit/transport.ts +0 -373
  536. package/src/upgrade-prompt.test.ts +0 -71
  537. package/src/upgrade-prompt.ts +0 -162
  538. package/src/version.test.ts +0 -17
  539. package/src/watermark.test.ts +0 -97
  540. package/src/watermark.ts +0 -156
  541. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  542. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  543. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  544. /package/{src → dist}/SvAuthGate.svelte +0 -0
  545. /package/{src → dist}/SvBoard.svelte +0 -0
  546. /package/{src → dist}/SvExportMenu.svelte +0 -0
  547. /package/{src → dist}/SvFileInput.svelte +0 -0
  548. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  549. /package/{src → dist}/SvGridBoard.svelte +0 -0
  550. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  551. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  552. /package/{src → dist}/SvImportDialog.svelte +0 -0
  553. /package/{src → dist}/SvLookupInput.svelte +0 -0
  554. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  555. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  556. /package/{src → dist}/SvSchedule.svelte +0 -0
  557. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  558. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  559. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  560. /package/{src → dist}/smart.export.d.ts +0 -0
  561. /package/{src → dist}/smart.export.js +0 -0
  562. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  563. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  575. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  579. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  621. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  622. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  623. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  624. /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;