@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.
- package/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
- package/dist/SvAlertsManager.svelte.d.ts +14 -0
- package/dist/SvAlertsPanel.svelte.d.ts +9 -0
- package/dist/SvAuthGate.svelte.d.ts +22 -0
- package/dist/SvBoard.svelte.d.ts +35 -0
- package/dist/SvExportMenu.svelte.d.ts +61 -0
- package/dist/SvExpressionEditor.svelte.d.ts +12 -0
- package/dist/SvFileInput.svelte.d.ts +20 -0
- package/dist/SvGridAlerts.svelte.d.ts +77 -0
- package/dist/SvGridBoard.svelte.d.ts +30 -0
- package/dist/SvGridEditPanel.svelte.d.ts +73 -0
- package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
- package/dist/SvGridScheduler.svelte.d.ts +30 -0
- package/dist/SvImportDialog.svelte.d.ts +88 -0
- package/dist/SvLookupInput.svelte.d.ts +21 -0
- package/dist/SvPivotDesigner.svelte.d.ts +176 -0
- package/dist/SvRecordDetail.svelte.d.ts +58 -0
- package/dist/SvSchedule.svelte.d.ts +29 -0
- package/dist/SvSchemaChart.svelte.d.ts +61 -0
- package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
- package/dist/alerts/alert-engine-attach.d.ts +79 -0
- package/dist/alerts/alert-engine-attach.js +106 -0
- package/dist/alerts/alert-engine.d.ts +42 -0
- package/dist/alerts/alert-engine.js +196 -0
- package/dist/alerts/alert-formats.d.ts +26 -0
- package/dist/alerts/alert-formats.js +58 -0
- package/dist/alerts/alert-observer.d.ts +54 -0
- package/dist/alerts/alert-observer.js +156 -0
- package/dist/alerts/alert-scheduler.d.ts +30 -0
- package/dist/alerts/alert-scheduler.js +54 -0
- package/dist/alerts/alert-storage.d.ts +31 -0
- package/dist/alerts/alert-storage.js +92 -0
- package/dist/alerts/alert-store.svelte.d.ts +24 -0
- package/dist/alerts/alert-store.svelte.js +69 -0
- package/dist/alerts/alert-types.d.ts +86 -0
- package/dist/alerts/alert-types.js +1 -0
- package/dist/alerts.d.ts +2 -0
- package/{src/alerts.ts → dist/alerts.js} +9 -9
- package/dist/board.d.ts +7 -0
- package/{src/board.ts → dist/board.js} +13 -14
- package/dist/cdn/svgrid-enterprise.svelte-external.js +2987 -2981
- package/dist/designer/assets/{index-CM5xvaOy.js → index-BF0UH638.js} +3 -3
- package/dist/designer/assets/{src-D-ET9Mmo.js → src-BPJruwB9.js} +184 -184
- package/dist/designer/index.html +2 -2
- package/dist/edit-panel.d.ts +105 -0
- package/dist/edit-panel.js +350 -0
- package/dist/export-conditional.d.ts +31 -0
- package/dist/export-conditional.js +65 -0
- package/dist/export-ooxml.d.ts +93 -0
- package/dist/export-ooxml.js +385 -0
- package/dist/export-pdf.d.ts +107 -0
- package/dist/export-pdf.js +144 -0
- package/dist/export-print.d.ts +55 -0
- package/dist/export-print.js +91 -0
- package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
- package/dist/export-serialize.js +11 -0
- package/dist/export-xls.d.ts +26 -0
- package/dist/export-xls.js +157 -0
- package/dist/export.d.ts +323 -0
- package/dist/export.js +1021 -0
- package/dist/expressions/evaluate.d.ts +17 -0
- package/dist/expressions/evaluate.js +214 -0
- package/dist/expressions/expression-columns.d.ts +61 -0
- package/dist/expressions/expression-columns.js +72 -0
- package/dist/expressions/expression-types.d.ts +125 -0
- package/dist/expressions/expression-types.js +1 -0
- package/dist/expressions/parse.d.ts +25 -0
- package/dist/expressions/parse.js +537 -0
- package/dist/import.d.ts +232 -0
- package/dist/import.js +846 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +91 -0
- package/dist/install.d.ts +70 -0
- package/dist/install.js +61 -0
- package/dist/license-core.d.ts +37 -0
- package/dist/license-core.js +81 -0
- package/dist/license.d.ts +30 -0
- package/dist/license.js +139 -0
- package/dist/master-detail.d.ts +23 -0
- package/dist/master-detail.js +35 -0
- package/dist/node/studio.js +1 -1
- package/dist/pivot-chart.d.ts +28 -0
- package/dist/pivot-chart.js +71 -0
- package/dist/pivot-designer.d.ts +69 -0
- package/dist/pivot-designer.js +38 -0
- package/dist/pivot-enable.d.ts +6 -0
- package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
- package/dist/pivot.d.ts +111 -0
- package/dist/pivot.js +353 -0
- package/dist/print.d.ts +33 -0
- package/dist/print.js +61 -0
- package/dist/revoked.d.ts +1 -0
- package/{src/revoked.ts → dist/revoked.js} +5 -6
- package/dist/scheduler-assignments.d.ts +64 -0
- package/dist/scheduler-assignments.js +92 -0
- package/dist/scheduler-axis.d.ts +81 -0
- package/dist/scheduler-axis.js +180 -0
- package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
- package/dist/scheduler-booking.js +50 -0
- package/dist/scheduler-config.d.ts +177 -0
- package/dist/scheduler-config.js +1 -0
- package/dist/scheduler-dependencies.d.ts +89 -0
- package/dist/scheduler-dependencies.js +179 -0
- package/dist/scheduler-freebusy.d.ts +19 -0
- package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
- package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
- package/dist/scheduler-heatmap.js +41 -0
- package/dist/scheduler-resource-tree.d.ts +48 -0
- package/dist/scheduler-resource-tree.js +78 -0
- package/dist/scheduler-slots.d.ts +37 -0
- package/dist/scheduler-slots.js +80 -0
- package/dist/scheduler-summary.d.ts +41 -0
- package/dist/scheduler-summary.js +54 -0
- package/dist/scheduler.d.ts +7 -0
- package/{src/scheduler.ts → dist/scheduler.js} +13 -14
- package/dist/scheduling.d.ts +132 -0
- package/dist/scheduling.js +228 -0
- package/dist/schema-designer.d.ts +42 -0
- package/dist/schema-designer.js +117 -0
- package/dist/schema.d.ts +369 -0
- package/dist/schema.js +216 -0
- package/dist/smart-shim.d.ts +62 -0
- package/dist/smart-shim.js +34 -0
- package/dist/sources/aggregate.d.ts +43 -0
- package/dist/sources/aggregate.js +60 -0
- package/dist/sources/auth-supabase.d.ts +69 -0
- package/dist/sources/auth-supabase.js +39 -0
- package/dist/sources/dashboard.d.ts +65 -0
- package/dist/sources/dashboard.js +95 -0
- package/dist/sources/field-inference.d.ts +23 -0
- package/dist/sources/field-inference.js +52 -0
- package/dist/sources/filters.d.ts +35 -0
- package/dist/sources/filters.js +52 -0
- package/dist/sources/index.d.ts +18 -0
- package/dist/sources/index.js +18 -0
- package/dist/sources/introspect-supabase.d.ts +30 -0
- package/dist/sources/introspect-supabase.js +134 -0
- package/dist/sources/realtime-supabase.d.ts +37 -0
- package/dist/sources/realtime-supabase.js +52 -0
- package/dist/sources/relation-lookup.d.ts +50 -0
- package/dist/sources/relation-lookup.js +77 -0
- package/dist/sources/rest-adapters.d.ts +48 -0
- package/dist/sources/rest-adapters.js +85 -0
- package/dist/sources/rest.d.ts +38 -0
- package/dist/sources/rest.js +86 -0
- package/dist/sources/schema-from-columns.d.ts +37 -0
- package/dist/sources/schema-from-columns.js +48 -0
- package/dist/sources/supabase.d.ts +33 -0
- package/dist/sources/supabase.js +74 -0
- package/dist/sources/with-entity-rules.d.ts +25 -0
- package/dist/sources/with-entity-rules.js +47 -0
- package/dist/sources/with-relation-labels.d.ts +26 -0
- package/dist/sources/with-relation-labels.js +38 -0
- package/dist/staged-editing.d.ts +85 -0
- package/dist/staged-editing.js +0 -0
- package/dist/studio/bug-report.d.ts +61 -0
- package/dist/studio/bug-report.js +126 -0
- package/dist/studio/cli.d.ts +56 -0
- package/dist/studio/cli.js +70 -0
- package/dist/studio/copilot-core.d.ts +22 -0
- package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
- package/dist/studio/csv.d.ts +36 -0
- package/dist/studio/csv.js +173 -0
- package/dist/studio/db-connect-string.d.ts +45 -0
- package/dist/studio/db-connect-string.js +113 -0
- package/dist/studio/deploy-cli.d.ts +35 -0
- package/dist/studio/deploy-cli.js +81 -0
- package/dist/studio/emit-project.d.ts +77 -0
- package/dist/studio/emit-project.js +5389 -0
- package/dist/studio/emit-schema.d.ts +110 -0
- package/dist/studio/emit-schema.js +1128 -0
- package/dist/studio/index.d.ts +35 -0
- package/dist/studio/index.js +38 -0
- package/dist/studio/init-flow.d.ts +58 -0
- package/dist/studio/init-flow.js +451 -0
- package/dist/studio/introspect-db.d.ts +47 -0
- package/dist/studio/introspect-db.js +255 -0
- package/dist/studio/introspect-openapi.d.ts +19 -0
- package/dist/studio/introspect-openapi.js +244 -0
- package/dist/studio/introspect-prisma.d.ts +25 -0
- package/dist/studio/introspect-prisma.js +164 -0
- package/dist/studio/introspect.d.ts +35 -0
- package/dist/studio/introspect.js +306 -0
- package/dist/studio/project.d.ts +1327 -0
- package/dist/studio/project.js +1798 -0
- package/dist/studio/sample-data.d.ts +19 -0
- package/dist/studio/sample-data.js +207 -0
- package/dist/studio/samples/ats.d.ts +2 -0
- package/dist/studio/samples/ats.js +194 -0
- package/dist/studio/samples/clinic.d.ts +2 -0
- package/dist/studio/samples/clinic.js +171 -0
- package/dist/studio/samples/crm.d.ts +2 -0
- package/dist/studio/samples/crm.js +280 -0
- package/dist/studio/samples/datasets.d.ts +38 -0
- package/dist/studio/samples/datasets.js +296 -0
- package/dist/studio/samples/ecommerce.d.ts +2 -0
- package/dist/studio/samples/ecommerce.js +178 -0
- package/dist/studio/samples/events.d.ts +2 -0
- package/dist/studio/samples/events.js +192 -0
- package/dist/studio/samples/fleet.d.ts +2 -0
- package/dist/studio/samples/fleet.js +203 -0
- package/dist/studio/samples/gym.d.ts +2 -0
- package/dist/studio/samples/gym.js +205 -0
- package/dist/studio/samples/hr.d.ts +2 -0
- package/dist/studio/samples/hr.js +186 -0
- package/dist/studio/samples/index.d.ts +13 -0
- package/dist/studio/samples/index.js +44 -0
- package/dist/studio/samples/insurance.d.ts +2 -0
- package/dist/studio/samples/insurance.js +220 -0
- package/dist/studio/samples/inventory.d.ts +2 -0
- package/dist/studio/samples/inventory.js +204 -0
- package/dist/studio/samples/invoicing.d.ts +2 -0
- package/dist/studio/samples/invoicing.js +154 -0
- package/dist/studio/samples/library.d.ts +2 -0
- package/dist/studio/samples/library.js +171 -0
- package/dist/studio/samples/live-data.d.ts +5 -0
- package/dist/studio/samples/live-data.js +261 -0
- package/dist/studio/samples/projects.d.ts +2 -0
- package/dist/studio/samples/projects.js +203 -0
- package/dist/studio/samples/realestate.d.ts +2 -0
- package/dist/studio/samples/realestate.js +187 -0
- package/dist/studio/samples/restaurant.d.ts +2 -0
- package/dist/studio/samples/restaurant.js +180 -0
- package/dist/studio/samples/school.d.ts +2 -0
- package/dist/studio/samples/school.js +188 -0
- package/dist/studio/samples/shared.d.ts +142 -0
- package/dist/studio/samples/shared.js +164 -0
- package/dist/studio/samples/starter.d.ts +4 -0
- package/dist/studio/samples/starter.js +237 -0
- package/dist/studio/samples/subscriptions.d.ts +2 -0
- package/dist/studio/samples/subscriptions.js +175 -0
- package/dist/studio/samples/support.d.ts +2 -0
- package/dist/studio/samples/support.js +209 -0
- package/dist/studio/scaffold-app.d.ts +22 -0
- package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
- package/dist/studio/scaffold.d.ts +63 -0
- package/dist/studio/scaffold.js +346 -0
- package/dist/studio/screen-suites.d.ts +193 -0
- package/dist/studio/screen-suites.js +297 -0
- package/dist/studio/themes.d.ts +34 -0
- package/dist/studio/themes.js +41 -0
- package/dist/studio/ui-components.d.ts +89 -0
- package/dist/studio/ui-components.generated.d.ts +29 -0
- package/dist/studio/ui-components.generated.js +7139 -0
- package/dist/studio/ui-components.js +673 -0
- package/dist/studio/user-error.d.ts +23 -0
- package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
- package/dist/studio/verify.d.ts +34 -0
- package/dist/studio/verify.js +47 -0
- package/dist/sveltekit/in-memory.d.ts +14 -0
- package/dist/sveltekit/in-memory.js +113 -0
- package/dist/sveltekit/index.d.ts +6 -0
- package/dist/sveltekit/index.js +5 -0
- package/dist/sveltekit/query-plan.d.ts +44 -0
- package/dist/sveltekit/query-plan.js +76 -0
- package/dist/sveltekit/sql-source.d.ts +47 -0
- package/dist/sveltekit/sql-source.js +106 -0
- package/dist/sveltekit/sql.d.ts +48 -0
- package/dist/sveltekit/sql.js +73 -0
- package/dist/sveltekit/transport.d.ts +209 -0
- package/dist/sveltekit/transport.js +219 -0
- package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
- package/dist/sveltekit/types.js +1 -0
- package/dist/upgrade-prompt.d.ts +16 -0
- package/dist/upgrade-prompt.js +141 -0
- package/dist/version.d.ts +13 -0
- package/{src/version.ts → dist/version.js} +1 -1
- package/dist/watermark.d.ts +2 -0
- package/dist/watermark.js +146 -0
- package/package.json +26 -24
- package/src/SvBoard.dom.test.ts +0 -67
- package/src/SvGridAlerts.dom.test.ts +0 -113
- package/src/SvGridEditPanel.dom.test.ts +0 -320
- package/src/SvRecordDetail.dom.test.ts +0 -137
- package/src/SvSchedule.dom.test.ts +0 -57
- package/src/ai-export-pdf.dom.test.ts +0 -77
- package/src/ai-export-xlsx.dom.test.ts +0 -90
- package/src/ai-export.dom.test.ts +0 -114
- package/src/alerts/alert-engine-attach.ts +0 -165
- package/src/alerts/alert-engine.test.ts +0 -135
- package/src/alerts/alert-engine.ts +0 -260
- package/src/alerts/alert-formats.test.ts +0 -87
- package/src/alerts/alert-formats.ts +0 -77
- package/src/alerts/alert-observer.test.ts +0 -189
- package/src/alerts/alert-observer.ts +0 -208
- package/src/alerts/alert-scheduler.ts +0 -96
- package/src/alerts/alert-storage.test.ts +0 -54
- package/src/alerts/alert-storage.ts +0 -116
- package/src/alerts/alert-store.svelte.ts +0 -80
- package/src/alerts/alert-types.ts +0 -94
- package/src/board.dom.test.ts +0 -941
- package/src/edit-panel.test.ts +0 -322
- package/src/edit-panel.ts +0 -379
- package/src/export-conditional.test.ts +0 -60
- package/src/export-conditional.ts +0 -94
- package/src/export-ooxml.test.ts +0 -152
- package/src/export-ooxml.ts +0 -489
- package/src/export-pdf.test.ts +0 -138
- package/src/export-pdf.ts +0 -245
- package/src/export-print.test.ts +0 -66
- package/src/export-print.ts +0 -132
- package/src/export-serialize.test.ts +0 -56
- package/src/export-xls.ts +0 -199
- package/src/export-xlsx-roundtrip.test.ts +0 -120
- package/src/export-xlsx.test.ts +0 -150
- package/src/export.test.ts +0 -349
- package/src/export.ts +0 -1464
- package/src/expressions/evaluate.test.ts +0 -111
- package/src/expressions/evaluate.ts +0 -237
- package/src/expressions/expression-columns.ts +0 -133
- package/src/expressions/expression-types.ts +0 -84
- package/src/expressions/parse.test.ts +0 -106
- package/src/expressions/parse.ts +0 -610
- package/src/import-automap.test.ts +0 -131
- package/src/import-hardening.test.ts +0 -158
- package/src/import.test.ts +0 -415
- package/src/import.ts +0 -1044
- package/src/index.ts +0 -569
- package/src/install.ts +0 -154
- package/src/license-core.test.ts +0 -23
- package/src/license-core.ts +0 -107
- package/src/license-expiry.test.ts +0 -127
- package/src/license.ts +0 -137
- package/src/master-detail.test.ts +0 -61
- package/src/master-detail.ts +0 -42
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
- package/src/pivot-chart.test.ts +0 -86
- package/src/pivot-chart.ts +0 -112
- package/src/pivot-designer.ts +0 -101
- package/src/pivot.test.ts +0 -335
- package/src/pivot.ts +0 -578
- package/src/print.ts +0 -107
- package/src/scheduler-assignments.test.ts +0 -97
- package/src/scheduler-assignments.ts +0 -134
- package/src/scheduler-axis.test.ts +0 -108
- package/src/scheduler-axis.ts +0 -238
- package/src/scheduler-booking.test.ts +0 -57
- package/src/scheduler-config.ts +0 -179
- package/src/scheduler-dependencies.test.ts +0 -155
- package/src/scheduler-dependencies.ts +0 -223
- package/src/scheduler-freebusy.test.ts +0 -41
- package/src/scheduler-heatmap.test.ts +0 -39
- package/src/scheduler-resource-tree.test.ts +0 -84
- package/src/scheduler-resource-tree.ts +0 -107
- package/src/scheduler-slots.test.ts +0 -53
- package/src/scheduler-slots.ts +0 -94
- package/src/scheduler-summary.test.ts +0 -47
- package/src/scheduler-summary.ts +0 -81
- package/src/scheduling.test.ts +0 -194
- package/src/scheduling.ts +0 -293
- package/src/schema-designer.test.ts +0 -121
- package/src/schema-designer.ts +0 -142
- package/src/schema.test.ts +0 -268
- package/src/schema.ts +0 -562
- package/src/smart-shim.ts +0 -107
- package/src/sources/aggregate.test.ts +0 -79
- package/src/sources/aggregate.ts +0 -102
- package/src/sources/auth-supabase.test.ts +0 -80
- package/src/sources/auth-supabase.ts +0 -87
- package/src/sources/dashboard.kpi.test.ts +0 -50
- package/src/sources/dashboard.test.ts +0 -61
- package/src/sources/dashboard.ts +0 -136
- package/src/sources/field-inference.test.ts +0 -60
- package/src/sources/field-inference.ts +0 -63
- package/src/sources/filters.test.ts +0 -58
- package/src/sources/filters.ts +0 -70
- package/src/sources/index.ts +0 -67
- package/src/sources/introspect-supabase.test.ts +0 -112
- package/src/sources/introspect-supabase.ts +0 -139
- package/src/sources/realtime-supabase.test.ts +0 -93
- package/src/sources/realtime-supabase.ts +0 -99
- package/src/sources/relation-lookup.test.ts +0 -99
- package/src/sources/relation-lookup.ts +0 -128
- package/src/sources/rest-adapters.test.ts +0 -95
- package/src/sources/rest-adapters.ts +0 -120
- package/src/sources/rest.test.ts +0 -104
- package/src/sources/rest.ts +0 -129
- package/src/sources/schema-from-columns.test.ts +0 -106
- package/src/sources/schema-from-columns.ts +0 -88
- package/src/sources/supabase.test.ts +0 -110
- package/src/sources/supabase.ts +0 -99
- package/src/sources/with-entity-rules.test.ts +0 -104
- package/src/sources/with-entity-rules.ts +0 -78
- package/src/sources/with-relation-labels.test.ts +0 -75
- package/src/sources/with-relation-labels.ts +0 -73
- package/src/staged-editing.ts +0 -0
- package/src/studio/bug-report.test.ts +0 -101
- package/src/studio/bug-report.ts +0 -165
- package/src/studio/cli.test.ts +0 -187
- package/src/studio/cli.ts +0 -117
- package/src/studio/copilot-core.test.ts +0 -45
- package/src/studio/csv.test.ts +0 -90
- package/src/studio/csv.ts +0 -165
- package/src/studio/db-connect-string.test.ts +0 -94
- package/src/studio/db-connect-string.ts +0 -128
- package/src/studio/deploy-cli.test.ts +0 -56
- package/src/studio/deploy-cli.ts +0 -100
- package/src/studio/emit-project.test.ts +0 -3324
- package/src/studio/emit-project.ts +0 -5377
- package/src/studio/emit-schema.test.ts +0 -111
- package/src/studio/emit-schema.ts +0 -1181
- package/src/studio/index.ts +0 -380
- package/src/studio/init-flow.test.ts +0 -514
- package/src/studio/init-flow.ts +0 -556
- package/src/studio/introspect-db.test.ts +0 -186
- package/src/studio/introspect-db.ts +0 -312
- package/src/studio/introspect-openapi.test.ts +0 -84
- package/src/studio/introspect-openapi.ts +0 -252
- package/src/studio/introspect-prisma.test.ts +0 -99
- package/src/studio/introspect-prisma.ts +0 -175
- package/src/studio/introspect.test.ts +0 -172
- package/src/studio/introspect.ts +0 -310
- package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
- package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
- package/src/studio/pipeline.test.ts +0 -42
- package/src/studio/project-robust.test.ts +0 -157
- package/src/studio/project.test.ts +0 -929
- package/src/studio/project.ts +0 -2394
- package/src/studio/sample-data.test.ts +0 -58
- package/src/studio/sample-data.ts +0 -203
- package/src/studio/samples/ats.ts +0 -202
- package/src/studio/samples/clinic.ts +0 -179
- package/src/studio/samples/crm.ts +0 -291
- package/src/studio/samples/datasets.test.ts +0 -84
- package/src/studio/samples/datasets.ts +0 -340
- package/src/studio/samples/ecommerce.ts +0 -187
- package/src/studio/samples/events.ts +0 -201
- package/src/studio/samples/fleet.ts +0 -213
- package/src/studio/samples/gym.ts +0 -215
- package/src/studio/samples/hr.ts +0 -195
- package/src/studio/samples/index.ts +0 -55
- package/src/studio/samples/insurance.ts +0 -229
- package/src/studio/samples/inventory.ts +0 -213
- package/src/studio/samples/invoicing.ts +0 -162
- package/src/studio/samples/library.ts +0 -180
- package/src/studio/samples/live-data.test.ts +0 -99
- package/src/studio/samples/live-data.ts +0 -306
- package/src/studio/samples/projects.ts +0 -212
- package/src/studio/samples/realestate.ts +0 -196
- package/src/studio/samples/restaurant.ts +0 -189
- package/src/studio/samples/samples.test.ts +0 -304
- package/src/studio/samples/school.ts +0 -197
- package/src/studio/samples/seed-floor.test.ts +0 -25
- package/src/studio/samples/shared.ts +0 -237
- package/src/studio/samples/starter.ts +0 -251
- package/src/studio/samples/subscriptions.ts +0 -183
- package/src/studio/samples/support.ts +0 -216
- package/src/studio/scaffold-app.test.ts +0 -91
- package/src/studio/scaffold.test.ts +0 -192
- package/src/studio/scaffold.ts +0 -390
- package/src/studio/screen-suites.test.ts +0 -269
- package/src/studio/screen-suites.ts +0 -448
- package/src/studio/themes.ts +0 -62
- package/src/studio/ui-components-surface.test.ts +0 -185
- package/src/studio/ui-components.generated.ts +0 -7154
- package/src/studio/ui-components.ts +0 -742
- package/src/studio/verify.test.ts +0 -47
- package/src/studio/verify.ts +0 -79
- package/src/sveltekit/in-memory.test.ts +0 -104
- package/src/sveltekit/in-memory.ts +0 -129
- package/src/sveltekit/index.ts +0 -24
- package/src/sveltekit/query-plan.test.ts +0 -109
- package/src/sveltekit/query-plan.ts +0 -125
- package/src/sveltekit/sql-source.test.ts +0 -198
- package/src/sveltekit/sql-source.ts +0 -171
- package/src/sveltekit/sql.test.ts +0 -80
- package/src/sveltekit/sql.ts +0 -131
- package/src/sveltekit/transport-scope.test.ts +0 -125
- package/src/sveltekit/transport.test.ts +0 -201
- package/src/sveltekit/transport.ts +0 -373
- package/src/upgrade-prompt.test.ts +0 -71
- package/src/upgrade-prompt.ts +0 -162
- package/src/version.test.ts +0 -17
- package/src/watermark.test.ts +0 -97
- package/src/watermark.ts +0 -156
- /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
- /package/{src → dist}/SvAlertsManager.svelte +0 -0
- /package/{src → dist}/SvAlertsPanel.svelte +0 -0
- /package/{src → dist}/SvAuthGate.svelte +0 -0
- /package/{src → dist}/SvBoard.svelte +0 -0
- /package/{src → dist}/SvExportMenu.svelte +0 -0
- /package/{src → dist}/SvExpressionEditor.svelte +0 -0
- /package/{src → dist}/SvFileInput.svelte +0 -0
- /package/{src → dist}/SvGridAlerts.svelte +0 -0
- /package/{src → dist}/SvGridBoard.svelte +0 -0
- /package/{src → dist}/SvGridEditPanel.svelte +0 -0
- /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
- /package/{src → dist}/SvGridScheduler.svelte +0 -0
- /package/{src → dist}/SvImportDialog.svelte +0 -0
- /package/{src → dist}/SvLookupInput.svelte +0 -0
- /package/{src → dist}/SvPivotDesigner.svelte +0 -0
- /package/{src → dist}/SvRecordDetail.svelte +0 -0
- /package/{src → dist}/SvSchedule.svelte +0 -0
- /package/{src → dist}/SvSchemaChart.svelte +0 -0
- /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
- /package/{src → dist}/pdfmake-shims.d.ts +0 -0
- /package/{src → dist}/smart.export.d.ts +0 -0
- /package/{src → dist}/smart.export.js +0 -0
- /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
- /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
- /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
- /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,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,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
|
+
};
|