@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,178 @@
1
+ import { screen, formScreen, boardScreen, detailScreen, project, dashScreen, statusPills, pad, ids } from './shared.js';
2
+ const products = {
3
+ name: 'products',
4
+ label: 'Product',
5
+ idField: 'id',
6
+ fields: [
7
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
8
+ { field: 'name', type: 'text', required: true, minLength: 2 },
9
+ { field: 'sku', type: 'text', label: 'SKU', input: { editorType: 'mask', mask: 'AAA-#####', help: 'Warehouse stock code' } },
10
+ { field: 'category', type: 'enum', required: true, options: [
11
+ { value: 'electronics', label: 'Electronics', color: '#6366f1' },
12
+ { value: 'home', label: 'Home', color: '#10b981' },
13
+ { value: 'apparel', label: 'Apparel', color: '#f59e0b' },
14
+ { value: 'office', label: 'Office', color: '#0ea5e9' },
15
+ ] },
16
+ { field: 'price', type: 'number', label: 'Price ($)', required: true, min: 0, defaultValue: 0, input: { prefix: '$', help: 'Retail price' } },
17
+ { field: 'stock', type: 'number', label: 'In stock', min: 0, defaultValue: 0 },
18
+ // Derived: inventory value on hand (display-only, never stored).
19
+ { field: 'stockValue', type: 'number', label: 'Stock value ($)', readonly: true, formula: 'price * stock' },
20
+ { field: 'rating', type: 'number', label: 'Rating', min: 1, max: 5, defaultValue: 3, input: { editorType: 'rating', help: '1-5 customer rating' } },
21
+ { field: 'tags', type: 'text', label: 'Tags', input: { editorType: 'chips', help: 'Merchandising tags' } },
22
+ { field: 'color', type: 'text', label: 'Swatch', input: { editorType: 'color', help: 'Primary colorway' } },
23
+ { field: 'imageUrl', type: 'text', label: 'Image', format: 'url', input: { placeholder: 'https://…' } },
24
+ { field: 'active', type: 'boolean', label: 'Active', defaultValue: true },
25
+ ],
26
+ };
27
+ const customers = {
28
+ name: 'customers',
29
+ label: 'Customer',
30
+ idField: 'id',
31
+ fields: [
32
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
33
+ { field: 'name', type: 'text', required: true, minLength: 2 },
34
+ { field: 'email', type: 'text', format: 'email', required: true },
35
+ { field: 'phone', type: 'text', input: { editorType: 'phone', help: 'Primary contact number' } },
36
+ { field: 'country', type: 'text', label: 'Country', input: { editorType: 'country', help: 'Billing country' } },
37
+ { field: 'tier', type: 'enum', required: true, options: [
38
+ { value: 'free', label: 'Free', color: '#94a3b8' },
39
+ { value: 'plus', label: 'Plus', color: '#6366f1' },
40
+ { value: 'vip', label: 'VIP', color: '#f59e0b' },
41
+ ] },
42
+ { field: 'joinedAt', type: 'datetime', label: 'Joined', input: { help: 'Signup date and time' } },
43
+ { field: 'active', type: 'boolean', defaultValue: true },
44
+ ],
45
+ };
46
+ const orders = {
47
+ name: 'orders',
48
+ label: 'Order',
49
+ idField: 'id',
50
+ fields: [
51
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
52
+ { field: 'ref', type: 'text', label: 'Reference' },
53
+ { field: 'customerId', type: 'relation', label: 'Customer', relation: { entity: 'customers', foreignKey: 'customerId', labelField: 'name' } },
54
+ { field: 'status', type: 'enum', required: true, options: [
55
+ { value: 'pending', label: 'Pending', color: '#f59e0b' },
56
+ { value: 'paid', label: 'Paid', color: '#6366f1' },
57
+ { value: 'shipped', label: 'Shipped', color: '#10b981' },
58
+ { value: 'refunded', label: 'Refunded', color: '#ef4444' },
59
+ ] },
60
+ { field: 'total', type: 'number', label: 'Total ($)', required: true, min: 0, input: { prefix: '$' } },
61
+ { field: 'discount', type: 'number', label: 'Discount (%)', min: 0, max: 100, defaultValue: 0, input: { editorType: 'slider', help: 'Order-level discount' } },
62
+ // Derived: revenue after the discount is applied (display-only).
63
+ { field: 'net', type: 'number', label: 'Net ($)', readonly: true, formula: 'total - total * discount / 100' },
64
+ { field: 'placedAt', type: 'datetime', label: 'Placed' },
65
+ ],
66
+ };
67
+ // Order grid formatting: status pills plus numeric thresholds - big-ticket orders
68
+ // green + bold, tiny orders muted, and steep discounts flagged red so margin risk
69
+ // pops without reading a number.
70
+ const orderFormats = [
71
+ ...statusPills(orders, 'status'),
72
+ { field: 'total', op: 'gte', value: 500, color: '#16a34a', bold: true },
73
+ { field: 'total', op: 'lt', value: 100, color: '#94a3b8' },
74
+ { field: 'discount', op: 'gte', value: 20, color: '#dc2626', bold: true },
75
+ ];
76
+ // Product grid formatting: category pills plus stock thresholds - out-of-stock /
77
+ // low stock red + bold, healthy stock green, and premium prices bold.
78
+ const productFormats = [
79
+ ...statusPills(products, 'category'),
80
+ { field: 'stock', op: 'lt', value: 10, color: '#dc2626', bold: true },
81
+ { field: 'stock', op: 'gte', value: 200, color: '#16a34a' },
82
+ { field: 'price', op: 'gte', value: 300, bold: true },
83
+ ];
84
+ const seed = {
85
+ products: [
86
+ { id: 'p1', name: 'Mechanical Keyboard', sku: 'ELE-01001', category: 'electronics', price: 120, stock: 42, rating: 5, tags: ['Bestseller', 'New'], color: '#111827', imageUrl: 'https://cdn.shopadmin.io/p/keyboard.png', active: true },
87
+ { id: 'p2', name: 'Standing Desk', sku: 'HOM-02002', category: 'home', price: 480, stock: 12, rating: 4, tags: ['Ergonomic'], color: '#a16207', imageUrl: 'https://cdn.shopadmin.io/p/desk.png', active: true },
88
+ { id: 'p3', name: 'Noise-Cancelling Headphones', sku: 'ELE-01003', category: 'electronics', price: 260, stock: 0, rating: 4, tags: ['Premium', 'Audio'], color: '#1e3a8a', imageUrl: 'https://cdn.shopadmin.io/p/headphones.png', active: false },
89
+ { id: 'p4', name: 'Ergonomic Mouse', sku: 'ELE-01004', category: 'electronics', price: 60, stock: 130, rating: 5, tags: ['Ergonomic', 'Wireless'], color: '#374151', imageUrl: 'https://cdn.shopadmin.io/p/mouse.png', active: true },
90
+ { id: 'p5', name: 'Desk Lamp', sku: 'HOM-02005', category: 'home', price: 45, stock: 88, rating: 3, tags: ['Home'], color: '#f59e0b', imageUrl: 'https://cdn.shopadmin.io/p/lamp.png', active: true },
91
+ { id: 'p6', name: 'Cotton Hoodie', sku: 'APP-03006', category: 'apparel', price: 55, stock: 210, rating: 4, tags: ['Cotton', 'Casual'], color: '#6366f1', imageUrl: 'https://cdn.shopadmin.io/p/hoodie.png', active: true },
92
+ { id: 'p7', name: 'Notebook Pack', sku: 'OFF-04007', category: 'office', price: 18, stock: 500, rating: 5, tags: ['Bulk'], color: '#10b981', imageUrl: 'https://cdn.shopadmin.io/p/notebook.png', active: true },
93
+ ],
94
+ customers: [
95
+ { id: 'c1', name: 'Ada Lovelace', email: 'ada@analytic.io', phone: '+1 (415) 555-0110', country: 'United States', tier: 'vip', joinedAt: '2025-01-15T09:20:00Z', active: true },
96
+ { id: 'c2', name: 'Alan Turing', email: 'alan@bletchley.uk', phone: '+44 20 7946 0111', country: 'United Kingdom', tier: 'plus', joinedAt: '2025-03-02T14:05:00Z', active: true },
97
+ { id: 'c3', name: 'Grace Hopper', email: 'grace@navy.mil', phone: '+1 (202) 555-0112', country: 'United States', tier: 'vip', joinedAt: '2024-11-08T11:45:00Z', active: true },
98
+ { id: 'c4', name: 'Linus Torvalds', email: 'linus@kernel.org', phone: '+358 9 5550113', country: 'Finland', tier: 'plus', joinedAt: '2025-05-21T08:30:00Z', active: true },
99
+ { id: 'c5', name: 'Barbara Liskov', email: 'barbara@sub.dev', phone: '+1 (650) 555-0114', country: 'United States', tier: 'free', joinedAt: '2025-02-17T16:10:00Z', active: false },
100
+ { id: 'c6', name: 'Guido van Rossum', email: 'guido@py.org', phone: '+31 20 5550115', country: 'Netherlands', tier: 'plus', joinedAt: '2025-04-09T10:00:00Z', active: true },
101
+ ],
102
+ orders: [
103
+ { id: 'o1', ref: 'ORD-1001', customerId: 'c1', status: 'shipped', total: 640, discount: 10, placedAt: '2026-06-12T14:30:00Z' },
104
+ { id: 'o2', ref: 'ORD-1002', customerId: 'c2', status: 'paid', total: 120, discount: 0, placedAt: '2026-06-18T09:15:00Z' },
105
+ { id: 'o3', ref: 'ORD-1003', customerId: 'c3', status: 'pending', total: 305, discount: 15, placedAt: '2026-07-01T18:40:00Z' },
106
+ { id: 'o4', ref: 'ORD-1004', customerId: 'c1', status: 'refunded', total: 260, discount: 0, placedAt: '2026-05-22T12:05:00Z' },
107
+ { id: 'o5', ref: 'ORD-1005', customerId: 'c4', status: 'shipped', total: 78, discount: 5, placedAt: '2026-07-03T07:50:00Z' },
108
+ { id: 'o6', ref: 'ORD-1006', customerId: 'c6', status: 'paid', total: 540, discount: 20, placedAt: '2026-07-08T20:25:00Z' },
109
+ { id: 'o7', ref: 'ORD-1007', customerId: 'c3', status: 'pending', total: 45, discount: 0, placedAt: '2026-07-10T13:00:00Z' },
110
+ { id: 'o8', ref: 'ORD-1008', customerId: 'c2', status: 'shipped', total: 198, discount: 25, placedAt: '2026-06-28T15:35:00Z' },
111
+ ],
112
+ };
113
+ export const ecommerce = {
114
+ id: 'ecommerce',
115
+ name: 'E-commerce admin',
116
+ description: 'Products, customers and orders - enterprise revenue + catalog dashboards (KPI revenue sparkline + target, gauges, area sales trend, category x stock pivot, tabbed breakdowns), filtered status-pill grids with low-stock red formatting and row actions, per-customer order-history master/detail, and rich edit forms (SKU mask, star rating, tags, color swatch, phone, country, discount slider).',
117
+ emoji: '\u{1F6D2}',
118
+ accent: '#10b981',
119
+ build: () => {
120
+ const productRows = pad(products, seed.products, 18);
121
+ const customerRows = pad(customers, seed.customers, 16);
122
+ const orderRows = pad(orders, seed.orders, 34, { customerId: ids(customerRows) });
123
+ return project({
124
+ title: 'Shop Admin',
125
+ brand: 'Shop Admin',
126
+ accent: '#10b981',
127
+ preset: 'vercel',
128
+ navStyle: 'top-nav',
129
+ footer: '© Shop Inc.',
130
+ entities: [products, customers, orders],
131
+ seed: { products: productRows, customers: customerRows, orders: orderRows },
132
+ screens: [
133
+ // Revenue dashboard: KPI cards (a revenue card with a sparkline over placed
134
+ // dates + a $12k target), a target gauge, a status breakdown + pie, a
135
+ // sales-over-time area trend, a tabbed breakdown, and a status-pill order grid.
136
+ dashScreen(orders, { id: 'overview', title: 'Overview', order: 0 }, [
137
+ { kpi: 'Revenue', measure: 'total', reduce: 'sum', format: 'currency', trendField: 'placedAt', trendReduce: 'sum', target: 12000, span: 1 },
138
+ { kpi: 'Orders', reduce: 'count', span: 1 },
139
+ { kpi: 'Avg order', measure: 'total', reduce: 'avg', format: 'currency', span: 1 },
140
+ { gauge: 'Revenue vs $15k target', measure: 'total', reduce: 'sum', min: 0, max: 15000, unit: '$', span: 1 },
141
+ { chart: 'status', measure: 'total', reduce: 'sum', type: 'bar', span: 2 },
142
+ { chart: 'status', reduce: 'count', type: 'pie', span: 1 },
143
+ { chart: 'placedAt', measure: 'total', reduce: 'sum', type: 'area', span: 3 },
144
+ { tabs: [
145
+ { label: 'Revenue by status', tiles: [{ chart: 'status', measure: 'total', reduce: 'sum', type: 'bar' }] },
146
+ { label: 'Orders by status', tiles: [{ chart: 'status', reduce: 'count', type: 'bar' }] },
147
+ ], span: 3 },
148
+ { grid: true, format: orderFormats, summaries: true, rowActions: [{ kind: 'edit' }], span: 3 },
149
+ ]),
150
+ // Catalog dashboard: stock + price KPIs (units compact-formatted), a rating
151
+ // gauge, category breakdowns, a category x active pivot of stock, a faceted
152
+ // filter, and a product grid with low-stock red formatting + inline edit.
153
+ // Fulfillment board: orders as cards in status columns (pending/paid/shipped/refunded).
154
+ boardScreen(orders, { id: 'board', title: 'Fulfillment', order: 1 }, { groupBy: 'status', titleField: 'ref', badgeField: 'total', filter: ['status', 'customerId'] }),
155
+ // Customer 360: shopper header (tier pill) with an order-history timeline
156
+ // (by placed date, colored by fulfillment status, $ order totals).
157
+ detailScreen(customers, { id: 'customer-360', title: 'Customer 360', order: 2 }, {
158
+ titleField: 'name', subtitleField: 'country', statusField: 'tier',
159
+ related: [{ entity: 'orders', foreignKey: 'customerId', label: 'Orders', titleField: 'ref', subtitleField: 'total', dateField: 'placedAt', statusField: 'status' }],
160
+ }),
161
+ dashScreen(products, { id: 'catalog', title: 'Catalog', order: 3 }, [
162
+ { kpi: 'Products', reduce: 'count', span: 1 },
163
+ { kpi: 'Units in stock', measure: 'stock', reduce: 'sum', format: 'compact', span: 1 },
164
+ { kpi: 'Avg price', measure: 'price', reduce: 'avg', format: 'currency', span: 1 },
165
+ { gauge: 'Avg rating', measure: 'rating', reduce: 'avg', min: 0, max: 5, span: 1 },
166
+ { chart: 'category', measure: 'stock', reduce: 'sum', type: 'bar', span: 2 },
167
+ { chart: 'category', reduce: 'count', type: 'pie', span: 1 },
168
+ { pivot: { rows: ['category'], cols: ['active'], measure: 'stock', aggregate: 'sum' }, span: 3 },
169
+ { filter: ['category', 'active'], span: 3 },
170
+ { grid: true, format: productFormats, summaries: true, rowActions: [{ kind: 'edit' }], span: 3 },
171
+ ]),
172
+ screen(customers, 'master-detail', { id: 'customers', title: 'Customers', order: 4, child: orders, foreignKey: 'customerId', linkScreen: 'customer-360' }),
173
+ formScreen(products, { id: 'products', title: 'Products', order: 5 }, undefined, { format: productFormats, summaries: true, rowActions: [{ kind: 'edit' }] }, ['category', 'tags', 'active']),
174
+ formScreen(orders, { id: 'orders', title: 'Orders', order: 6 }, undefined, { format: orderFormats, summaries: true, rowActions: [{ kind: 'edit' }] }, ['status', 'customerId']),
175
+ ],
176
+ });
177
+ },
178
+ };
@@ -0,0 +1,2 @@
1
+ import { type SampleApp } from './shared.js';
2
+ export declare const events: SampleApp;
@@ -0,0 +1,192 @@
1
+ import { screen, formScreen, schedulerScreen, project, dashScreen, detailScreen, statusPills, pad, ids } from './shared.js';
2
+ const eventsEntity = {
3
+ name: 'events',
4
+ label: 'Event',
5
+ idField: 'id',
6
+ fields: [
7
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
8
+ { field: 'name', type: 'text', required: true, minLength: 3, input: { help: 'Public event title' } },
9
+ { field: 'category', type: 'enum', label: 'Category', required: true, defaultValue: 'conference', options: [
10
+ { value: 'conference', label: 'Conference', color: '#6366f1' },
11
+ { value: 'workshop', label: 'Workshop', color: '#10b981' },
12
+ { value: 'webinar', label: 'Webinar', color: '#0ea5e9' },
13
+ { value: 'meetup', label: 'Meetup', color: '#f59e0b' },
14
+ ] },
15
+ { field: 'status', type: 'enum', label: 'Status', required: true, defaultValue: 'draft', options: [
16
+ { value: 'draft', label: 'Draft', color: '#94a3b8' },
17
+ { value: 'published', label: 'Published', color: '#6366f1' },
18
+ { value: 'sold_out', label: 'Sold out', color: '#ef4444' },
19
+ { value: 'done', label: 'Done', color: '#10b981' },
20
+ ] },
21
+ { field: 'capacity', type: 'number', label: 'Capacity', required: true, min: 1, max: 5000, defaultValue: 100, input: { help: 'Maximum seats available' } },
22
+ { field: 'price', type: 'number', label: 'Ticket price ($)', min: 0, defaultValue: 0, input: { prefix: '$', help: 'Standard ticket price' } },
23
+ // Derived: projected gross if the event sells out (display-only, never stored).
24
+ { field: 'revenue', type: 'number', label: 'Max revenue ($)', readonly: true, formula: 'price * capacity' },
25
+ { field: 'startAt', type: 'datetime', label: 'Starts at', required: true, input: { editorType: 'datetime', help: 'Local start date and time' } },
26
+ { field: 'topics', type: 'text', label: 'Topics', input: { editorType: 'chips', help: 'Session themes / tracks' } },
27
+ { field: 'color', type: 'text', label: 'Brand color', defaultValue: '#6366f1', input: { editorType: 'color', help: 'Accent used on the event page' } },
28
+ { field: 'website', type: 'text', label: 'Website', format: 'url', input: { placeholder: 'https://…', help: 'Landing page URL' } },
29
+ ],
30
+ };
31
+ const attendees = {
32
+ name: 'attendees',
33
+ label: 'Attendee',
34
+ idField: 'id',
35
+ fields: [
36
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
37
+ { field: 'name', type: 'text', required: true, minLength: 2 },
38
+ { field: 'email', type: 'text', format: 'email', required: true, input: { help: 'Used for the confirmation email' } },
39
+ { field: 'phone', type: 'text', label: 'Phone', input: { editorType: 'phone', help: 'Mobile for event reminders' } },
40
+ { field: 'country', type: 'text', label: 'Country', input: { editorType: 'country', help: 'Billing country' } },
41
+ { field: 'company', type: 'text', label: 'Company' },
42
+ { field: 'interests', type: 'text', label: 'Interests', input: { editorType: 'chips', help: 'Topics this attendee follows' } },
43
+ { field: 'vip', type: 'boolean', label: 'VIP', defaultValue: false },
44
+ ],
45
+ };
46
+ const registrations = {
47
+ name: 'registrations',
48
+ label: 'Registration',
49
+ idField: 'id',
50
+ fields: [
51
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
52
+ { field: 'eventId', type: 'relation', label: 'Event', relation: { entity: 'events', foreignKey: 'eventId', labelField: 'name' } },
53
+ { field: 'attendeeId', type: 'relation', label: 'Attendee', relation: { entity: 'attendees', foreignKey: 'attendeeId', labelField: 'name' } },
54
+ { field: 'ticket', type: 'enum', label: 'Ticket', required: true, defaultValue: 'standard', options: [
55
+ { value: 'standard', label: 'Standard', color: '#6366f1' },
56
+ { value: 'vip', label: 'VIP', color: '#f59e0b' },
57
+ { value: 'student', label: 'Student', color: '#10b981' },
58
+ ] },
59
+ { field: 'amount', type: 'number', label: 'Amount ($)', min: 0, defaultValue: 0, input: { prefix: '$', help: 'Charged after any discount' } },
60
+ { field: 'discount', type: 'number', label: 'Discount (%)', min: 0, max: 100, defaultValue: 0, input: { editorType: 'slider', help: 'Promo discount applied' } },
61
+ { field: 'status', type: 'enum', label: 'Status', required: true, defaultValue: 'confirmed', options: [
62
+ { value: 'confirmed', label: 'Confirmed', color: '#10b981' },
63
+ { value: 'cancelled', label: 'Cancelled', color: '#ef4444' },
64
+ { value: 'waitlist', label: 'Waitlist', color: '#94a3b8' },
65
+ ] },
66
+ { field: 'registeredAt', type: 'datetime', label: 'Registered at', input: { editorType: 'datetime', help: 'When the ticket was booked' } },
67
+ { field: 'rating', type: 'number', label: 'Feedback', min: 1, max: 5, input: { editorType: 'rating', help: 'Post-event satisfaction (1-5)' } },
68
+ ],
69
+ };
70
+ // Registration grid formatting: status + ticket-tier pills, plus numeric
71
+ // thresholds (big-ticket amounts bold, poor ratings red, top ratings green) -
72
+ // data-driven color, not just status pills.
73
+ const registrationFormats = [
74
+ ...statusPills(registrations, 'status'),
75
+ ...statusPills(registrations, 'ticket'),
76
+ { field: 'amount', op: 'gte', value: 300, bold: true },
77
+ { field: 'rating', op: 'lte', value: 2, color: '#dc2626' },
78
+ { field: 'rating', op: 'gte', value: 5, color: '#16a34a', bold: true },
79
+ ];
80
+ // Event grid formatting: status + category pills, plus capacity / price
81
+ // thresholds (large-venue capacity bold, free events muted, premium tickets green).
82
+ const eventFormats = [
83
+ ...statusPills(eventsEntity, 'status'),
84
+ ...statusPills(eventsEntity, 'category'),
85
+ { field: 'capacity', op: 'gte', value: 500, bold: true },
86
+ { field: 'price', op: 'eq', value: 0, color: '#94a3b8' },
87
+ { field: 'price', op: 'gte', value: 400, color: '#16a34a', bold: true },
88
+ ];
89
+ const seed = {
90
+ events: [
91
+ { id: 'ev1', name: 'Svelte Summit 2026', category: 'conference', status: 'published', capacity: 800, price: 490, startAt: '2026-09-12T09:00:00.000Z', topics: ['Svelte', 'Frontend', 'Performance'], color: '#6366f1', website: 'https://sveltesummit.com' },
92
+ { id: 'ev2', name: 'Grid Performance Workshop', category: 'workshop', status: 'sold_out', capacity: 50, price: 150, startAt: '2026-07-28T13:30:00.000Z', topics: ['Grids', 'Virtualization'], color: '#10b981', website: 'https://svgrid.com/workshop' },
93
+ { id: 'ev3', name: 'Data Apps Webinar', category: 'webinar', status: 'done', capacity: 500, price: 0, startAt: '2026-05-19T16:00:00.000Z', topics: ['Studio', 'No-code'], color: '#0ea5e9', website: 'https://svgrid.com/webinar' },
94
+ { id: 'ev4', name: 'Frontend Meetup Berlin', category: 'meetup', status: 'published', capacity: 120, price: 25, startAt: '2026-08-06T18:00:00.000Z', topics: ['Community', 'Svelte'], color: '#f59e0b', website: 'https://frontend.berlin' },
95
+ { id: 'ev5', name: 'AI in Tooling Conference', category: 'conference', status: 'draft', capacity: 600, price: 420, startAt: '2026-11-03T09:30:00.000Z', topics: ['AI', 'DevTools', 'MCP'], color: '#8b5cf6', website: 'https://aitooling.dev' },
96
+ { id: 'ev6', name: 'TypeScript Deep Dive', category: 'workshop', status: 'published', capacity: 60, price: 320, startAt: '2026-10-15T10:00:00.000Z', topics: ['TypeScript', 'Types'], color: '#3b82f6', website: 'https://tsdeepdive.io' },
97
+ ],
98
+ attendees: [
99
+ { id: 'at1', name: 'Clara Voss', email: 'clara.voss@nimbus.io', phone: '+1 (415) 555-0110', country: 'United States', company: 'Nimbus', interests: ['Svelte', 'Performance'], vip: true },
100
+ { id: 'at2', name: 'Diego Martins', email: 'diego.martins@lumen.dev', phone: '+55 11 95555-0111', country: 'Brazil', company: 'Lumen', interests: ['Frontend'], vip: false },
101
+ { id: 'at3', name: 'Priya Anand', email: 'priya.anand@quanta.co', phone: '+91 80 5550 0112', country: 'India', company: 'Quanta', interests: ['AI', 'DevTools'], vip: false },
102
+ { id: 'at4', name: 'Felix Braun', email: 'felix.braun@orbit.tech', phone: '+49 30 5550113', country: 'Germany', company: 'Orbit', interests: ['TypeScript', 'Grids'], vip: true },
103
+ { id: 'at5', name: 'Hana Sato', email: 'hana.sato@meridian.jp', phone: '+81 3 5550 0114', country: 'Japan', company: 'Meridian', interests: ['Community'], vip: false },
104
+ { id: 'at6', name: 'Lucas Moreau', email: 'lucas.moreau@volta.fr', phone: '+33 1 55 55 0115', country: 'France', company: 'Volta', interests: ['Studio', 'No-code'], vip: false },
105
+ ],
106
+ registrations: [
107
+ { id: 'rg1', eventId: 'ev1', attendeeId: 'at1', ticket: 'vip', amount: 490, discount: 0, status: 'confirmed', registeredAt: '2026-06-01T10:15:00.000Z', rating: 5 },
108
+ { id: 'rg2', eventId: 'ev1', attendeeId: 'at2', ticket: 'standard', amount: 190, discount: 0, status: 'confirmed', registeredAt: '2026-06-02T14:40:00.000Z', rating: 4 },
109
+ { id: 'rg3', eventId: 'ev2', attendeeId: 'at3', ticket: 'standard', amount: 150, discount: 0, status: 'waitlist', registeredAt: '2026-06-10T09:05:00.000Z', rating: 3 },
110
+ { id: 'rg4', eventId: 'ev3', attendeeId: 'at4', ticket: 'student', amount: 0, discount: 100, status: 'confirmed', registeredAt: '2026-04-28T11:20:00.000Z', rating: 5 },
111
+ { id: 'rg5', eventId: 'ev4', attendeeId: 'at5', ticket: 'standard', amount: 25, discount: 0, status: 'cancelled', registeredAt: '2026-07-01T17:30:00.000Z', rating: 2 },
112
+ { id: 'rg6', eventId: 'ev6', attendeeId: 'at6', ticket: 'vip', amount: 320, discount: 0, status: 'confirmed', registeredAt: '2026-07-03T08:45:00.000Z', rating: 4 },
113
+ { id: 'rg7', eventId: 'ev1', attendeeId: 'at5', ticket: 'student', amount: 90, discount: 50, status: 'confirmed', registeredAt: '2026-06-05T20:10:00.000Z', rating: 5 },
114
+ { id: 'rg8', eventId: 'ev4', attendeeId: 'at2', ticket: 'standard', amount: 25, discount: 0, status: 'confirmed', registeredAt: '2026-07-08T12:00:00.000Z', rating: 4 },
115
+ ],
116
+ };
117
+ export const events = {
118
+ id: 'events',
119
+ name: 'Events',
120
+ description: 'Events, attendees and registrations - sales + events dashboards (KPI sparklines, revenue target, feedback + capacity gauges, amount-over-time area trend, category x status pivot, tabs), filtered status-pill grids with row actions, master/detail, and rich edit forms (datetime, topic chips, brand color, phone, country, feedback rating, discount slider) with a computed max-revenue field.',
121
+ emoji: '\u{1F39F}\u{FE0F}',
122
+ accent: '#ec4899',
123
+ build: () => {
124
+ const eventRows = pad(eventsEntity, seed.events, 24);
125
+ const attendeeRows = pad(attendees, seed.attendees, 70);
126
+ const registrationRows = pad(registrations, seed.registrations, 90, { eventId: ids(eventRows), attendeeId: ids(attendeeRows) });
127
+ return project({
128
+ title: 'Evently',
129
+ brand: 'Evently',
130
+ accent: '#ec4899',
131
+ preset: 'catppuccin',
132
+ mode: 'dark',
133
+ navStyle: 'top-nav',
134
+ footer: '',
135
+ entities: [eventsEntity, attendees, registrations],
136
+ seed: { events: eventRows, attendees: attendeeRows, registrations: registrationRows },
137
+ screens: [
138
+ // Sales dashboard: registration KPIs (a revenue card with a sparkline over
139
+ // register dates + a $50k target), a feedback gauge, ticket / status
140
+ // breakdowns, an amount-over-time area trend, a ticket x status pivot, a
141
+ // tabbed breakdown, and a status-pill registration grid.
142
+ dashScreen(registrations, { id: 'overview', title: 'Overview', order: 0 }, [
143
+ { kpi: 'Ticket revenue', measure: 'amount', reduce: 'sum', format: 'currency', trendField: 'registeredAt', trendReduce: 'sum', target: 50000, span: 1 },
144
+ { kpi: 'Registrations', reduce: 'count', span: 1 },
145
+ { kpi: 'Avg ticket', measure: 'amount', reduce: 'avg', format: 'currency', span: 1 },
146
+ { gauge: 'Avg feedback', measure: 'rating', reduce: 'avg', min: 0, max: 5, span: 1 },
147
+ { chart: 'ticket', measure: 'amount', reduce: 'sum', type: 'bar', span: 2 },
148
+ { chart: 'status', reduce: 'count', type: 'pie', span: 1 },
149
+ { chart: 'registeredAt', measure: 'amount', reduce: 'sum', type: 'area', span: 3 },
150
+ { pivot: { rows: ['ticket'], cols: ['status'], measure: 'amount', aggregate: 'sum' }, span: 3 },
151
+ { tabs: [
152
+ { label: 'Revenue by ticket', tiles: [{ chart: 'ticket', measure: 'amount', reduce: 'sum', type: 'bar' }] },
153
+ { label: 'Registrations by status', tiles: [{ chart: 'status', reduce: 'count', type: 'bar' }] },
154
+ ], span: 3 },
155
+ { grid: true, format: registrationFormats, summaries: true, rowActions: [{ kind: 'edit' }], span: 3 },
156
+ ]),
157
+ // Events dashboard: catalog KPIs (an avg-price card trending over start
158
+ // dates), a capacity gauge, category breakdowns, a category x status pivot, a
159
+ // tabbed view, a filter, and an event grid with status + category pills.
160
+ dashScreen(eventsEntity, { id: 'catalog', title: 'Catalog', order: 1 }, [
161
+ { kpi: 'Events', reduce: 'count', span: 1 },
162
+ { kpi: 'Total capacity', measure: 'capacity', reduce: 'sum', format: 'compact', span: 1 },
163
+ { kpi: 'Avg price', measure: 'price', reduce: 'avg', format: 'currency', trendField: 'startAt', trendReduce: 'avg', span: 1 },
164
+ { gauge: 'Avg capacity', measure: 'capacity', reduce: 'avg', min: 0, max: 1000, span: 1 },
165
+ { chart: 'category', measure: 'capacity', reduce: 'sum', type: 'bar', span: 2 },
166
+ { chart: 'category', reduce: 'count', type: 'pie', span: 1 },
167
+ { pivot: { rows: ['category'], cols: ['status'], measure: 'price', aggregate: 'avg' }, span: 3 },
168
+ { tabs: [
169
+ { label: 'Capacity by category', tiles: [{ chart: 'category', measure: 'capacity', reduce: 'sum', type: 'bar' }] },
170
+ { label: 'Price by category', tiles: [{ chart: 'category', measure: 'price', reduce: 'avg', type: 'bar' }] },
171
+ ], span: 3 },
172
+ { filter: ['category', 'status'], span: 3 },
173
+ { grid: true, format: eventFormats, summaries: true, rowActions: [{ kind: 'edit' }], span: 3 },
174
+ ]),
175
+ // Schedule: a month calendar placing every event on its start date, tinted
176
+ // by category. The signature "real app" scheduling view.
177
+ // Scheduler: events laid out on a week/day timeline by start time + tinted by
178
+ // category, with drag-to-reschedule + a detail drawer. Was a month calendar.
179
+ schedulerScreen(eventsEntity, { id: 'schedule', title: 'Schedule', order: 2 }, { startField: 'startAt', titleField: 'name', colorField: 'category', initialView: 'week' }),
180
+ // Event 360: a full record page for one event - header with status pill and
181
+ // capacity / price tiles, a tabbed overview, and a registrations timeline.
182
+ detailScreen(eventsEntity, { id: 'event-detail', title: 'Event detail', order: 3 }, {
183
+ titleField: 'name', statusField: 'status', metricFields: ['capacity', 'price'],
184
+ related: [{ entity: 'registrations', foreignKey: 'eventId', label: 'Registrations', titleField: 'attendeeId', subtitleField: 'amount', dateField: 'registeredAt', statusField: 'status' }],
185
+ }),
186
+ screen(eventsEntity, 'master-detail', { id: 'events', title: 'Events', order: 4, child: registrations, foreignKey: 'eventId', linkScreen: 'event-detail' }),
187
+ formScreen(registrations, { id: 'registrations', title: 'Registrations', order: 5 }, undefined, { format: registrationFormats, summaries: true, rowActions: [{ kind: 'edit' }] }, ['ticket', 'status']),
188
+ formScreen(attendees, { id: 'attendees', title: 'Attendees', order: 6 }, undefined, {}, ['country', 'company', 'vip']),
189
+ ],
190
+ });
191
+ },
192
+ };
@@ -0,0 +1,2 @@
1
+ import { type SampleApp } from './shared.js';
2
+ export declare const fleet: SampleApp;
@@ -0,0 +1,203 @@
1
+ import { screen, formScreen, schedulerScreen, detailScreen, project, dashScreen, statusPills, pad, ids } from './shared.js';
2
+ // Industrial control-console chrome (the look of a LabVIEW / SystemLink operations
3
+ // dashboard): a near-black rail, uppercase monospace nav labels, a cyan LED-style
4
+ // active indicator, and a faint measurement grid over the content.
5
+ const CONTROL_CSS = `.sv-app.theme-control .sv-app__side { background: #0a0e14; border-right: 1px solid #1b2430; }
6
+ .sv-app.theme-control .sv-app__brandtext { color: #e6f6ff; font-family: ui-monospace, "SFMono-Regular", Menlo, monospace; text-transform: uppercase; letter-spacing: 0.08em; font-size: 14px; }
7
+ .sv-app.theme-control .sv-app__link { color: #9fb3c8; font-family: ui-monospace, "SFMono-Regular", Menlo, monospace; font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase; border-radius: 4px; padding: 7px 12px; }
8
+ .sv-app.theme-control .sv-app__link:hover { background: rgba(34, 211, 238, 0.08); color: #e6f6ff; }
9
+ .sv-app.theme-control .sv-app__link.is-active { background: rgba(34, 211, 238, 0.14); color: #67e8f9; box-shadow: inset 3px 0 0 #22d3ee; }
10
+ .sv-app.theme-control .sv-app__collapse, .sv-app.theme-control .sv-app__foot { color: #64798f; }
11
+ .sv-app.theme-control .sv-app__toolbar { border-bottom: 1px solid #1b2430; }
12
+ .sv-app.theme-control .sv-app__content { background-image: linear-gradient(rgba(34, 211, 238, 0.045) 1px, transparent 1px), linear-gradient(90deg, rgba(34, 211, 238, 0.045) 1px, transparent 1px); background-size: 28px 28px; }`;
13
+ const drivers = {
14
+ name: 'drivers',
15
+ label: 'Driver',
16
+ idField: 'id',
17
+ fields: [
18
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
19
+ { field: 'name', type: 'text', required: true, minLength: 2 },
20
+ { field: 'phone', type: 'text', input: { editorType: 'phone', help: 'Mobile contact number' } },
21
+ { field: 'email', type: 'text', format: 'email', required: true, input: { placeholder: 'name@fleetly.com' } },
22
+ { field: 'license', type: 'text', label: 'License', input: { editorType: 'mask', mask: 'AA-######', help: 'State code + 6 digits' } },
23
+ { field: 'rating', type: 'number', label: 'Safety rating', min: 1, max: 5, defaultValue: 3, input: { editorType: 'rating', help: '1-5 safety score' } },
24
+ { field: 'hireDate', type: 'date', label: 'Hire date' },
25
+ ],
26
+ };
27
+ const vehicles = {
28
+ name: 'vehicles',
29
+ label: 'Vehicle',
30
+ idField: 'id',
31
+ fields: [
32
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
33
+ { field: 'name', type: 'text', required: true, minLength: 2 },
34
+ { field: 'vin', type: 'text', label: 'VIN', input: { editorType: 'mask', mask: '*****************', help: '17-character vehicle identification number' } },
35
+ { field: 'plate', type: 'text', label: 'Plate', input: { editorType: 'mask', mask: 'AAA-####', help: 'Fleet plate, e.g. FLT-1201' } },
36
+ { field: 'type', type: 'enum', required: true, defaultValue: 'van', options: [
37
+ { value: 'van', label: 'Van', color: '#6366f1' },
38
+ { value: 'truck', label: 'Truck', color: '#10b981' },
39
+ { value: 'car', label: 'Car', color: '#f59e0b' },
40
+ { value: 'bike', label: 'Bike', color: '#0ea5e9' },
41
+ ] },
42
+ { field: 'year', type: 'number', label: 'Year', min: 1990, max: 2030 },
43
+ { field: 'mileage', type: 'number', label: 'Mileage', min: 0, input: { help: 'Odometer reading' } },
44
+ { field: 'fuelLevel', type: 'number', label: 'Fuel level (%)', min: 0, max: 100, defaultValue: 100, input: { editorType: 'slider', help: 'Current tank level' } },
45
+ { field: 'status', type: 'enum', required: true, defaultValue: 'available', options: [
46
+ { value: 'available', label: 'Available', color: '#10b981' },
47
+ { value: 'on_trip', label: 'On trip', color: '#0ea5e9' },
48
+ { value: 'maintenance', label: 'Maintenance', color: '#ef4444' },
49
+ ] },
50
+ { field: 'color', type: 'text', label: 'Livery color', input: { editorType: 'color', help: 'Fleet livery / map color' } },
51
+ ],
52
+ };
53
+ const trips = {
54
+ name: 'trips',
55
+ label: 'Trip',
56
+ idField: 'id',
57
+ fields: [
58
+ { field: 'id', type: 'text', primaryKey: true, readonly: true },
59
+ { field: 'vehicleId', type: 'relation', label: 'Vehicle', required: true, relation: { entity: 'vehicles', foreignKey: 'vehicleId', labelField: 'name' } },
60
+ { field: 'driverId', type: 'relation', label: 'Driver', required: true, relation: { entity: 'drivers', foreignKey: 'driverId', labelField: 'name' } },
61
+ { field: 'status', type: 'enum', required: true, defaultValue: 'planned', options: [
62
+ { value: 'planned', label: 'Planned', color: '#94a3b8' },
63
+ { value: 'ongoing', label: 'Ongoing', color: '#0ea5e9' },
64
+ { value: 'done', label: 'Done', color: '#10b981' },
65
+ { value: 'cancelled', label: 'Cancelled', color: '#ef4444' },
66
+ ] },
67
+ { field: 'distanceKm', type: 'number', label: 'Distance (km)', min: 0, input: { help: 'Route distance in kilometers' } },
68
+ { field: 'cost', type: 'number', label: 'Cost ($)', min: 0 },
69
+ // Derived: cost efficiency per kilometer (display-only, never stored).
70
+ { field: 'costPerKm', type: 'number', label: 'Cost / km ($)', readonly: true, formula: 'cost / distanceKm' },
71
+ { field: 'startAt', type: 'datetime', label: 'Start', input: { editorType: 'datetime', help: 'Scheduled departure time' } },
72
+ ],
73
+ };
74
+ const seed = {
75
+ drivers: [
76
+ { id: 'dr1', name: 'Miguel Santos', phone: '+1 (415) 555-0201', email: 'miguel@fleetly.com', license: 'CA-482910', rating: 5, hireDate: '2021-03-15' },
77
+ { id: 'dr2', name: 'Aisha Khan', phone: '+1 (312) 555-0202', email: 'aisha@fleetly.com', license: 'IL-118273', rating: 4, hireDate: '2022-07-01' },
78
+ { id: 'dr3', name: 'Tom Becker', phone: '+1 (206) 555-0203', email: 'tom@fleetly.com', license: 'WA-905641', rating: 4, hireDate: '2020-11-20' },
79
+ { id: 'dr4', name: 'Lena Novak', phone: '+1 (720) 555-0204', email: 'lena@fleetly.com', license: 'CO-337882', rating: 3, hireDate: '2023-02-10' },
80
+ { id: 'dr5', name: 'Raj Mehta', phone: '+1 (646) 555-0205', email: 'raj@fleetly.com', license: 'NY-556201', rating: 5, hireDate: '2019-09-05' },
81
+ { id: 'dr6', name: 'Sofia Rossi', phone: '+1 (305) 555-0206', email: 'sofia@fleetly.com', license: 'FL-774519', rating: 4, hireDate: '2024-01-22' },
82
+ ],
83
+ vehicles: [
84
+ { id: 've1', name: 'Sprinter 1', vin: '1HGCM82633A004352', plate: 'FLT-1201', type: 'van', year: 2021, mileage: 82000, fuelLevel: 80, status: 'available', color: '#0284c7' },
85
+ { id: 've2', name: 'Hauler 2', vin: '2FMDK48C97BB12345', plate: 'FLT-1202', type: 'truck', year: 2019, mileage: 154000, fuelLevel: 45, status: 'on_trip', color: '#dc2626' },
86
+ { id: 've3', name: 'Sedan 3', vin: '3VWFE21C04M001234', plate: 'FLT-1203', type: 'car', year: 2022, mileage: 41000, fuelLevel: 95, status: 'available', color: '#0f172a' },
87
+ { id: 've4', name: 'Courier 4', vin: '5UXWX7C5XG0R12345', plate: 'FLT-1204', type: 'bike', year: 2023, mileage: 12000, fuelLevel: 60, status: 'maintenance', color: '#f59e0b' },
88
+ { id: 've5', name: 'Hauler 5', vin: '1FTFW1ET5DFA12345', plate: 'FLT-1205', type: 'truck', year: 2020, mileage: 132000, fuelLevel: 30, status: 'on_trip', color: '#10b981' },
89
+ { id: 've6', name: 'Sprinter 6', vin: '1GNEK13ZX3R123456', plate: 'FLT-1206', type: 'van', year: 2021, mileage: 76000, fuelLevel: 70, status: 'available', color: '#6366f1' },
90
+ ],
91
+ trips: [
92
+ { id: 'tp1', vehicleId: 've1', driverId: 'dr1', status: 'done', distanceKm: 120, cost: 180, startAt: '2026-07-08T08:30:00' },
93
+ { id: 'tp2', vehicleId: 've2', driverId: 'dr2', status: 'ongoing', distanceKm: 340, cost: 520, startAt: '2026-07-12T06:15:00' },
94
+ { id: 'tp3', vehicleId: 've3', driverId: 'dr3', status: 'planned', distanceKm: 60, cost: 90, startAt: '2026-07-15T09:00:00' },
95
+ { id: 'tp4', vehicleId: 've4', driverId: 'dr4', status: 'cancelled', distanceKm: 15, cost: 25, startAt: '2026-07-09T14:45:00' },
96
+ { id: 'tp5', vehicleId: 've5', driverId: 'dr5', status: 'ongoing', distanceKm: 410, cost: 640, startAt: '2026-07-13T05:30:00' },
97
+ { id: 'tp6', vehicleId: 've1', driverId: 'dr6', status: 'done', distanceKm: 95, cost: 140, startAt: '2026-07-11T11:20:00' },
98
+ { id: 'tp7', vehicleId: 've2', driverId: 'dr1', status: 'done', distanceKm: 275, cost: 430, startAt: '2026-07-10T07:00:00' },
99
+ ],
100
+ };
101
+ // Vehicle grid formatting: type + status pills, plus numeric thresholds (low fuel
102
+ // red + bold, healthy fuel green, high-mileage vehicles bold) - data-driven color,
103
+ // not just status pills.
104
+ const vehicleFormats = [
105
+ ...statusPills(vehicles, 'status'),
106
+ ...statusPills(vehicles, 'type'),
107
+ { field: 'fuelLevel', op: 'lt', value: 25, color: '#dc2626', bold: true },
108
+ { field: 'fuelLevel', op: 'gte', value: 75, color: '#16a34a' },
109
+ { field: 'mileage', op: 'gte', value: 150000, bold: true },
110
+ ];
111
+ // Trip grid formatting: status pills, plus expensive trips bold and long-haul
112
+ // distances highlighted.
113
+ const tripFormats = [
114
+ ...statusPills(trips, 'status'),
115
+ { field: 'cost', op: 'gte', value: 500, bold: true },
116
+ { field: 'distanceKm', op: 'gte', value: 300, color: '#0284c7', bold: true },
117
+ ];
118
+ export const fleet = {
119
+ id: 'fleet',
120
+ name: 'Fleet',
121
+ description: 'Vehicles, drivers and trips - a LabVIEW / SystemLink-style operations console behind a sign-in, with fleet + trips dashboards (mileage/cost KPIs with a startAt sparkline, a fuel-level gauge, a type x status pivot, a cost-over-time area trend, tabbed breakdowns), filtered status-pill grids with row actions, master/detail, and rich edit forms (phone, license/VIN/plate masks, safety rating, fuel slider, livery color, datetime).',
122
+ emoji: '\u{1F69A}',
123
+ accent: '#38bdf8',
124
+ build: () => {
125
+ const driverRows = pad(drivers, seed.drivers, 12);
126
+ const vehicleRows = pad(vehicles, seed.vehicles, 14);
127
+ const tripRows = pad(trips, seed.trips, 30, { vehicleId: ids(vehicleRows), driverId: ids(driverRows) });
128
+ return project({
129
+ title: 'Fleetly',
130
+ brand: 'Fleet Ops',
131
+ accent: '#22d3ee',
132
+ preset: 'carbon',
133
+ mode: 'dark',
134
+ footer: '',
135
+ // A LabVIEW / SystemLink-style operations console: dark control-room chrome.
136
+ appClass: 'theme-control',
137
+ customCss: CONTROL_CSS,
138
+ // Sign-in with two roles. Operators get the dispatch floor (and cannot delete);
139
+ // the Trips cost dashboard and the driver roster are manager-only, so they drop
140
+ // out of an operator's nav entirely.
141
+ auth: { enabled: true, protect: true },
142
+ access: {
143
+ enabled: true,
144
+ defaultRole: 'operator',
145
+ roles: [
146
+ { role: 'manager', screens: '*', actions: '*' },
147
+ { role: 'operator', screens: ['overview', 'dispatch', 'vehicle-detail', 'vehicles', 'trip-forms'], actions: ['create', 'update'] },
148
+ ],
149
+ },
150
+ entities: [drivers, vehicles, trips],
151
+ seed: { drivers: driverRows, vehicles: vehicleRows, trips: tripRows },
152
+ screens: [
153
+ // Fleet dashboard: fleet-size + mileage KPIs, a fuel-level gauge (avg tank
154
+ // 0-100), mileage-by-type + status breakdowns, a type x status pivot, a
155
+ // tabbed view, and a status-pill vehicle grid with inline edit actions.
156
+ dashScreen(vehicles, { id: 'overview', title: 'Fleet', order: 0 }, [
157
+ { kpi: 'Vehicles', reduce: 'count', span: 1 },
158
+ { kpi: 'Total mileage', measure: 'mileage', reduce: 'sum', format: 'compact', span: 1 },
159
+ { kpi: 'Avg mileage', measure: 'mileage', reduce: 'avg', format: 'compact', span: 1 },
160
+ { gauge: 'Avg fuel level', measure: 'fuelLevel', reduce: 'avg', min: 0, max: 100, unit: '%', span: 1 },
161
+ { chart: 'type', measure: 'mileage', reduce: 'sum', type: 'bar', span: 2 },
162
+ { chart: 'status', reduce: 'count', type: 'pie', span: 1 },
163
+ { pivot: { rows: ['type'], cols: ['status'], aggregate: 'count' }, span: 3 },
164
+ { tabs: [
165
+ { label: 'Mileage by type', tiles: [{ chart: 'type', measure: 'mileage', reduce: 'sum', type: 'bar' }] },
166
+ { label: 'Vehicles by status', tiles: [{ chart: 'status', reduce: 'count', type: 'bar' }] },
167
+ ], span: 3 },
168
+ { grid: true, format: vehicleFormats, summaries: true, rowActions: [{ kind: 'edit' }], span: 3 },
169
+ ]),
170
+ // Trips dashboard: distance + cost KPIs (both trending over start time via a
171
+ // sparkline), an avg-distance gauge, a cost-over-time area trend, a status
172
+ // pie, a tabbed breakdown, a faceted filter, and a status-pill trip grid.
173
+ dashScreen(trips, { id: 'trips-dashboard', title: 'Trips', order: 1 }, [
174
+ { kpi: 'Trips', reduce: 'count', span: 1 },
175
+ { kpi: 'Total distance', measure: 'distanceKm', reduce: 'sum', format: 'compact', trendField: 'startAt', trendReduce: 'sum', span: 1 },
176
+ { kpi: 'Total cost', measure: 'cost', reduce: 'sum', format: 'currency', trendField: 'startAt', trendReduce: 'sum', span: 1 },
177
+ { kpi: 'Avg cost', measure: 'cost', reduce: 'avg', format: 'currency', span: 1 },
178
+ { gauge: 'Avg distance (km)', measure: 'distanceKm', reduce: 'avg', min: 0, max: 500, unit: 'km', span: 1 },
179
+ { chart: 'startAt', measure: 'cost', reduce: 'sum', type: 'area', span: 2 },
180
+ { chart: 'status', reduce: 'count', type: 'pie', span: 1 },
181
+ { tabs: [
182
+ { label: 'Cost by status', tiles: [{ chart: 'status', measure: 'cost', reduce: 'sum', type: 'bar' }] },
183
+ { label: 'Distance by status', tiles: [{ chart: 'status', measure: 'distanceKm', reduce: 'sum', type: 'bar' }] },
184
+ ], span: 3 },
185
+ { filter: ['status', 'vehicleId', 'driverId'], span: 3 },
186
+ { grid: true, format: tripFormats, summaries: true, rowActions: [{ kind: 'edit' }], span: 3 },
187
+ ]),
188
+ // Resource scheduler: a column per vehicle, trips placed by time + tinted by status,
189
+ // drag-to-reassign a vehicle + a detail drawer (week view). Was a month calendar.
190
+ schedulerScreen(trips, { id: 'dispatch', title: 'Dispatch', order: 2 }, { startField: 'startAt', titleField: 'driverId', colorField: 'status', resourceField: 'vehicleId', initialView: 'week' }),
191
+ // Vehicle detail: asset header (status pill) + mileage / fuel tiles with a
192
+ // trip-history timeline (each trip titled by its driver, colored by status).
193
+ detailScreen(vehicles, { id: 'vehicle-detail', title: 'Vehicle detail', order: 3 }, {
194
+ titleField: 'name', subtitleField: 'plate', statusField: 'status', metricFields: ['mileage', 'fuelLevel'],
195
+ related: [{ entity: 'trips', foreignKey: 'vehicleId', label: 'Trips', titleField: 'driverId', subtitleField: 'distanceKm', dateField: 'startAt', statusField: 'status' }],
196
+ }),
197
+ screen(vehicles, 'master-detail', { id: 'vehicles', title: 'Vehicles', order: 4, child: trips, foreignKey: 'vehicleId', linkScreen: 'vehicle-detail' }),
198
+ formScreen(trips, { id: 'trip-forms', title: 'Trip forms', order: 5 }, ['vehicleId', 'driverId', 'status'], { format: tripFormats, summaries: true, rowActions: [{ kind: 'edit' }] }, ['status', 'vehicleId', 'driverId']),
199
+ formScreen(drivers, { id: 'drivers', title: 'Drivers', order: 6 }, ['name', 'phone', 'rating'], { summaries: true }, ['rating']),
200
+ ],
201
+ });
202
+ },
203
+ };
@@ -0,0 +1,2 @@
1
+ import { type SampleApp } from './shared.js';
2
+ export declare const gym: SampleApp;