@utopia-studio-design/design-system-cli 0.4.0 → 0.5.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 (127) hide show
  1. package/README.md +23 -0
  2. package/bin/utopia-ds-mcp.mjs +9 -2
  3. package/bin/utopia-ds.mjs +115 -7
  4. package/data/blocks/activity-feed/ActivityFeedBlock.tsx +255 -0
  5. package/data/blocks/activity-feed/README.md +16 -0
  6. package/data/blocks/activity-feed/activity-feed-contract.ts +96 -0
  7. package/data/blocks/activity-feed/activity-feed-fixture.ts +22 -0
  8. package/data/blocks/activity-feed/activity-feed.css +154 -0
  9. package/data/blocks/agent-status/AgentStatusBlock.tsx +313 -0
  10. package/data/blocks/agent-status/README.md +15 -0
  11. package/data/blocks/agent-status/agent-status-contract.ts +133 -0
  12. package/data/blocks/agent-status/agent-status-fixture.ts +79 -0
  13. package/data/blocks/agent-status/agent-status.css +216 -0
  14. package/data/blocks/analytics-dashboard/AnalyticsDashboardBlocks.tsx +107 -0
  15. package/data/blocks/analytics-dashboard/AnalyticsMetricBlocks.tsx +87 -0
  16. package/data/blocks/analytics-dashboard/README.md +17 -0
  17. package/data/blocks/analytics-dashboard/analytics-dashboard.css +92 -0
  18. package/data/blocks/calendar-application/CalendarApplicationBlocks.tsx +519 -0
  19. package/data/blocks/calendar-application/README.md +20 -0
  20. package/data/blocks/calendar-application/calendar-application.css +216 -0
  21. package/data/blocks/calendar-application/calendar-localization.ts +90 -0
  22. package/data/blocks/calendar-application/calendar-panel-contract.ts +72 -0
  23. package/data/blocks/dashboard-composer/CeramicPuckAdapter.tsx +380 -0
  24. package/data/blocks/dashboard-composer/DashboardComposerBlocks.tsx +337 -0
  25. package/data/blocks/dashboard-composer/README.md +16 -0
  26. package/data/blocks/dashboard-composer/RegistryDataBlocks.tsx +238 -0
  27. package/data/blocks/dashboard-composer/dashboard-composer.css +328 -0
  28. package/data/blocks/database-workspace/DatabaseWorkspaceBlocks.tsx +240 -0
  29. package/data/blocks/database-workspace/README.md +9 -0
  30. package/data/blocks/database-workspace/database-workspace.css +107 -0
  31. package/data/blocks/interaction-workbench/InteractionWorkbench.tsx +271 -0
  32. package/data/blocks/interaction-workbench/README.md +9 -0
  33. package/data/blocks/interaction-workbench/interaction-workbench.css +226 -0
  34. package/data/docs/calendar.md +164 -0
  35. package/data/docs/charts.md +95 -0
  36. package/data/docs/composition-registry.md +174 -0
  37. package/data/docs/dashboard-composer.md +94 -0
  38. package/data/docs/database.md +68 -0
  39. package/data/docs/examples/dashboard-layout.v1.json +65 -0
  40. package/data/docs/foundations.md +2 -1
  41. package/data/docs/interaction-foundation.md +109 -0
  42. package/data/docs/observability.md +165 -0
  43. package/data/docs/quick-start-ai.md +55 -1
  44. package/data/manifests/blocks.json +392 -0
  45. package/data/manifests/catalog.json +7 -4
  46. package/data/manifests/components.json +191 -3
  47. package/data/manifests/composition-registry.json +427 -0
  48. package/data/manifests/motion-profiles.json +1 -1
  49. package/data/manifests/patterns.json +113 -1
  50. package/data/manifests/templates.json +346 -0
  51. package/data/manifests/theme-renacore.json +142 -0
  52. package/data/manifests/themes.json +314 -28
  53. package/data/templates/analytics-dashboard/AnalyticsDashboardBlocks.tsx +107 -0
  54. package/data/templates/analytics-dashboard/AnalyticsMetricBlocks.tsx +87 -0
  55. package/data/templates/analytics-dashboard/README.md +6 -0
  56. package/data/templates/analytics-dashboard/analytics-dashboard.css +92 -0
  57. package/data/templates/analytics-dashboard/index.html +13 -0
  58. package/data/templates/analytics-dashboard/main.tsx +196 -0
  59. package/data/templates/analytics-dashboard/styles.css +120 -0
  60. package/data/templates/analytics-dashboard/template.manifest.json +17 -0
  61. package/data/templates/calendar-application/CalendarApplicationBlocks.tsx +519 -0
  62. package/data/templates/calendar-application/README.md +10 -0
  63. package/data/templates/calendar-application/calendar-application.css +216 -0
  64. package/data/templates/calendar-application/calendar-localization.ts +90 -0
  65. package/data/templates/calendar-application/index.html +14 -0
  66. package/data/templates/calendar-application/main.tsx +409 -0
  67. package/data/templates/calendar-application/styles.css +248 -0
  68. package/data/templates/calendar-application/template.manifest.json +27 -0
  69. package/data/templates/composition-registry-lab/README.md +9 -0
  70. package/data/templates/composition-registry-lab/index.html +14 -0
  71. package/data/templates/composition-registry-lab/main.tsx +217 -0
  72. package/data/templates/composition-registry-lab/sample-layout.json +63 -0
  73. package/data/templates/composition-registry-lab/styles.css +343 -0
  74. package/data/templates/composition-registry-lab/template.manifest.json +34 -0
  75. package/data/templates/dashboard-composer/ActivityFeedBlock.tsx +255 -0
  76. package/data/templates/dashboard-composer/AgentStatusBlock.tsx +313 -0
  77. package/data/templates/dashboard-composer/AnalyticsDashboardBlocks.tsx +107 -0
  78. package/data/templates/dashboard-composer/AnalyticsMetricBlocks.tsx +87 -0
  79. package/data/templates/dashboard-composer/CalendarApplicationBlocks.tsx +519 -0
  80. package/data/templates/dashboard-composer/CeramicPuckAdapter.tsx +380 -0
  81. package/data/templates/dashboard-composer/DashboardComposerBlocks.tsx +337 -0
  82. package/data/templates/dashboard-composer/DatabaseWorkspaceBlocks.tsx +240 -0
  83. package/data/templates/dashboard-composer/README.md +53 -0
  84. package/data/templates/dashboard-composer/RegistryDataBlocks.tsx +238 -0
  85. package/data/templates/dashboard-composer/activity-feed-contract.ts +96 -0
  86. package/data/templates/dashboard-composer/activity-feed-fixture.ts +22 -0
  87. package/data/templates/dashboard-composer/activity-feed.css +154 -0
  88. package/data/templates/dashboard-composer/agent-status-contract.ts +133 -0
  89. package/data/templates/dashboard-composer/agent-status-fixture.ts +79 -0
  90. package/data/templates/dashboard-composer/agent-status-lab/index.html +19 -0
  91. package/data/templates/dashboard-composer/agent-status-lab/main.tsx +151 -0
  92. package/data/templates/dashboard-composer/agent-status-lab/styles.css +139 -0
  93. package/data/templates/dashboard-composer/agent-status.css +216 -0
  94. package/data/templates/dashboard-composer/analytics-dashboard.css +92 -0
  95. package/data/templates/dashboard-composer/calendar-application.css +216 -0
  96. package/data/templates/dashboard-composer/calendar-localization.ts +90 -0
  97. package/data/templates/dashboard-composer/calendar-panel-contract.ts +72 -0
  98. package/data/templates/dashboard-composer/dashboard-composer.css +328 -0
  99. package/data/templates/dashboard-composer/database-workspace.css +107 -0
  100. package/data/templates/dashboard-composer/index.html +14 -0
  101. package/data/templates/dashboard-composer/main.tsx +550 -0
  102. package/data/templates/dashboard-composer/sample-layout.json +147 -0
  103. package/data/templates/dashboard-composer/styles.css +198 -0
  104. package/data/templates/dashboard-composer/template.manifest.json +34 -0
  105. package/data/templates/dashboard-composer/visual-editor/PuckEditorSurface.tsx +132 -0
  106. package/data/templates/dashboard-composer/visual-editor/VisualEditorApp.tsx +343 -0
  107. package/data/templates/dashboard-composer/visual-editor/index.html +17 -0
  108. package/data/templates/dashboard-composer/visual-editor/main.tsx +95 -0
  109. package/data/templates/dashboard-composer/visual-editor/styles.css +310 -0
  110. package/data/templates/database-workspace/DatabaseWorkspaceBlocks.tsx +240 -0
  111. package/data/templates/database-workspace/README.md +5 -0
  112. package/data/templates/database-workspace/database-workspace.css +107 -0
  113. package/data/templates/database-workspace/index.html +14 -0
  114. package/data/templates/database-workspace/main.tsx +247 -0
  115. package/data/templates/database-workspace/styles.css +121 -0
  116. package/data/templates/database-workspace/template.manifest.json +19 -0
  117. package/data/templates/interaction-lab/InteractionWorkbench.tsx +271 -0
  118. package/data/templates/interaction-lab/README.md +7 -0
  119. package/data/templates/interaction-lab/index.html +14 -0
  120. package/data/templates/interaction-lab/interaction-workbench.css +226 -0
  121. package/data/templates/interaction-lab/main.tsx +104 -0
  122. package/data/templates/interaction-lab/styles.css +224 -0
  123. package/data/templates/interaction-lab/template.manifest.json +36 -0
  124. package/lib/api.mjs +72 -5
  125. package/lib/composition-runtime.mjs +382 -0
  126. package/lib/telemetry.mjs +74 -0
  127. package/package.json +4 -1
@@ -0,0 +1,165 @@
1
+ # Ceramic Observability
2
+
3
+ Ceramic observability has two explicit modes. It is not a hidden backdoor:
4
+
5
+ - `operational` starts when a host configures and enables a collector. It
6
+ records only minimized error diagnostics, uses an in-memory page-session ID,
7
+ ignores actor/account IDs and custom properties, and does not use telemetry
8
+ cookies, `sessionStorage`, `localStorage`, usage events, or page-view events.
9
+ It needs no consent click, but hosts must publish notice, assess their lawful
10
+ basis, and provide an immediate opt-out.
11
+ - `consented` records the allow-listed usage plan and optional opaque cohorts
12
+ only after explicit consent.
13
+
14
+ ## Decisions this data supports
15
+
16
+ - Which Ceramic versions, components, and public composition paths are in use?
17
+ - Which anonymous app/account cohort is encountering a repeated error?
18
+ - Which route, viewport class, locale, direction, and release are affected?
19
+ - Did a CLI command succeed or fail, without collecting its arguments or path?
20
+ - Did a fixed error fingerprint stop recurring after a release?
21
+
22
+ ## Data minimization contract
23
+
24
+ Consented Ceramic telemetry may collect:
25
+
26
+ - event name and timestamp;
27
+ - opaque app, account, actor, session, and event IDs;
28
+ - component and operation names;
29
+ - package version and application release;
30
+ - route template supplied by the host;
31
+ - locale, direction, and viewport bucket;
32
+ - stable error code, error class, and non-reversible fingerprint;
33
+ - allow-listed short boolean, numeric, or non-email string properties.
34
+
35
+ Ceramic does not collect:
36
+
37
+ - names, email addresses, raw database IDs, or authentication identifiers;
38
+ - DOM, form values, user copy, component props, command arguments, or cwd;
39
+ - error messages or raw stacks;
40
+ - IP addresses in retained records;
41
+ - session replay, screenshots, keystrokes, or network payloads.
42
+
43
+ Operational mode accepts only `component_error` and `runtime_error`, and removes
44
+ `accountId`, `actorId`, custom properties, and persistent telemetry storage even
45
+ if the host passes them.
46
+
47
+ In consented mode, pass pre-hashed or otherwise opaque `accountId` and `actorId` values. The SDK
48
+ rejects identifiers with whitespace or email syntax. Route resolvers should
49
+ return route templates such as `/projects/:projectId`, not raw URLs containing
50
+ customer identifiers.
51
+
52
+ ## Start the private collector and dashboard
53
+
54
+ Create two different random secrets:
55
+
56
+ ```sh
57
+ export CERAMIC_TELEMETRY_INGEST_KEY="$(openssl rand -hex 32)"
58
+ export CERAMIC_TELEMETRY_ADMIN_TOKEN="$(openssl rand -hex 32)"
59
+ export CERAMIC_TELEMETRY_ALLOWED_ORIGINS="http://localhost:5173"
60
+ npm run observability:start
61
+ ```
62
+
63
+ Open `http://127.0.0.1:4318` and enter the admin token. The collector binds to
64
+ loopback by default, retains data for 30 days, and stores newline-delimited JSON
65
+ under `.ceramic/observability/`, which is ignored by Git.
66
+
67
+ The dashboard shows aggregate event, error, app, opaque actor/account,
68
+ component, release, and fingerprint counts plus the latest sanitized events.
69
+ The admin can export the aggregate response or delete all retained events.
70
+
71
+ For a shared deployment, place the collector behind TLS, SSO or a private
72
+ network, persistent encrypted storage, rate limiting, and backups appropriate
73
+ to the retention policy. Do not expose the Node reference collector directly
74
+ to the public internet. The admin token must never be put in a `VITE_*`
75
+ variable or browser bundle.
76
+
77
+ ## Configure a React/browser consumer
78
+
79
+ ```tsx
80
+ import {
81
+ configureCeramicTelemetry,
82
+ installCeramicGlobalErrorTracking,
83
+ trackCeramicEvent,
84
+ } from '@utopia-studio-design/design-system/Telemetry'
85
+
86
+ configureCeramicTelemetry({
87
+ enabled: diagnosticsPreference !== 'disabled',
88
+ consent: 'unknown',
89
+ mode: 'operational',
90
+ appId: 'renacore-dashboard',
91
+ endpoint: 'https://observability.example.com',
92
+ ingestKey: publicWriteOnlyIngestKey,
93
+ packageVersion: '0.6.0',
94
+ release: appRelease,
95
+ routeResolver: () => currentRouteTemplate,
96
+ sampleRate: 0.1,
97
+ })
98
+
99
+ const removeGlobalTracking = installCeramicGlobalErrorTracking()
100
+ ```
101
+
102
+ Global error listeners are never installed automatically by the package. The
103
+ host owns notice, lawful-basis assessment, opt-out, route normalization,
104
+ installation, and cleanup. Errors are sampled at 100%. Repeated reports with the same
105
+ fingerprint inside two seconds are deduplicated so a component boundary and a
106
+ global listener do not create duplicate incidents.
107
+
108
+ Ceramic's validated `asChild` paths report `ERR_COMPOSITION_CHILD` through the
109
+ configured client before throwing their explanatory development error. With no
110
+ configured and enabled client, this call is a no-op.
111
+
112
+ To enable usage events, obtain separate explicit consent and configure
113
+ `mode: "consented"`, `consent: "granted"`, and any opaque cohort IDs.
114
+
115
+ ## Configure CLI diagnostics
116
+
117
+ CLI telemetry is also disabled by default and never sends command arguments,
118
+ queries, target directories, generated file names, or cwd.
119
+
120
+ ```sh
121
+ export CERAMIC_TELEMETRY_ENABLED=true
122
+ export CERAMIC_TELEMETRY_MODE=operational
123
+ export CERAMIC_TELEMETRY_ENDPOINT=https://observability.example.com
124
+ export CERAMIC_TELEMETRY_INGEST_KEY=replace-with-write-only-key
125
+ export CERAMIC_TELEMETRY_APP_ID=renacore-dashboard
126
+ npx utopia-ds doctor --json
127
+ ```
128
+
129
+ Operational CLI mode sends failed completion only, without actor/account IDs.
130
+ Consented mode additionally requires `CERAMIC_TELEMETRY_MODE=consented` and
131
+ `CERAMIC_TELEMETRY_CONSENT=granted`, and may send successful completion and
132
+ opaque cohorts. Network failure never changes CLI output or exit status.
133
+
134
+ ## Event plan
135
+
136
+ | Event | Trigger | Decision fields |
137
+ | --- | --- | --- |
138
+ | `app_started` | Consented SDK initialization | app, release, package version |
139
+ | `component_used` | Explicit host instrumentation | component, operation, route |
140
+ | `component_error` | Ceramic component contract failure | component, operation, error code/fingerprint |
141
+ | `runtime_error` | Explicit boundary/global error capture | route, release, error code/fingerprint |
142
+ | `cli_command_completed` | Operational failure or consented CLI process exit | command, success, version |
143
+
144
+ ## Public notice and controls
145
+
146
+ The Ceramic documentation site publishes `#/terms` and `#/privacy`. Its privacy
147
+ page includes a browser-level operational-diagnostics opt-out and honors Global
148
+ Privacy Control and Do Not Track. Consumer applications must publish their own
149
+ notice and control because they determine the collector, purpose, retention,
150
+ recipients, and jurisdiction.
151
+
152
+ ## Operations and deletion
153
+
154
+ - Default retention: 30 days; configure 1–365 days.
155
+ - `GET /health`: unauthenticated liveness only.
156
+ - `POST /v1/events`: write-only ingest-key authentication.
157
+ - `GET /v1/summary`: admin Bearer authentication.
158
+ - `DELETE /v1/events`: admin Bearer authentication and full retained-data deletion.
159
+ - `DELETE /v1/events?actorId=<opaque-id>` or `?accountId=<opaque-id>`:
160
+ selective deletion for a consent withdrawal or data-subject request.
161
+ - Rotate ingest and admin secrets independently.
162
+ - Treat the ingest key as public/write-only when used in browsers.
163
+ - Treat the admin token as a server-side secret.
164
+ - Publish a privacy notice before enabling identifiable account or actor
165
+ cohorts in a production consumer.
@@ -42,6 +42,30 @@ export function SaveAction() {
42
42
  }
43
43
  ```
44
44
 
45
+ For navigation, keep the anchor or framework link as the single interactive
46
+ element:
47
+
48
+ ```tsx
49
+ import Link from 'next/link'
50
+ import { Button } from '@utopia-studio-design/design-system/Button'
51
+
52
+ <Button asChild variant="outline" size="sm">
53
+ <a href="/docs">Docs</a>
54
+ </Button>
55
+
56
+ <Button asChild startContent={<FolderIcon />}>
57
+ <Link href="/settings">Settings</Link>
58
+ </Button>
59
+ ```
60
+
61
+ `asChild` accepts exactly one non-Fragment React element. The child must forward
62
+ `ref`, `className`, events, `children`, and accessibility props to one
63
+ interactive element. Anchor and Link props such as `href`, `target`, and
64
+ `aria-*` are preserved. When `disabled` or `loading` is true, Ceramic does not
65
+ pass the invalid `disabled` attribute to a link: it applies
66
+ `aria-disabled="true"`, `tabIndex={-1}`, and blocks click activation while
67
+ keeping the original `href`.
68
+
45
69
  ## Set Motion Policy
46
70
 
47
71
  Ceramic maps BeUI-inspired interaction patterns to semantic roles: `press`, `page`, `expand`, `reveal`, and `icon`. Set the application default once and override only when a local workflow needs to be static.
@@ -68,6 +92,8 @@ Never bypass `MotionProvider`, semantic motion tokens, or `prefers-reduced-motio
68
92
  npx utopia-ds manifest --json
69
93
  npx utopia-ds search "Arabic settings form" --json
70
94
  npx utopia-ds component Button --json
95
+ npx utopia-ds registry --list --json
96
+ npx utopia-ds layout validate ./dashboard-layout.json --json
71
97
  npx utopia-ds template --list --json
72
98
  npx utopia-ds template template-saas-solution-homepage --copy ./saas-solution-website
73
99
  npx utopia-ds template template-saas-solution-homepage --theme dextrum --copy ./dextrum-website
@@ -94,7 +120,35 @@ The MCP server exposes the same API as the CLI. A generated `.mcp.json` uses:
94
120
  }
95
121
  ```
96
122
 
97
- Available tools include search, component/template/theme/doc discovery, and doctor. An MCP client must never receive capabilities that the CLI cannot expose.
123
+ Available tools include search, component/template/theme/doc discovery,
124
+ composition-registry discovery, layout and agent-mutation validation, and
125
+ doctor. An MCP client must never receive capabilities that the CLI cannot
126
+ expose.
127
+
128
+ ## Compose Modular Dashboards
129
+
130
+ Use the Ceramic Composition Registry before generating or rearranging dashboard
131
+ blocks:
132
+
133
+ ```sh
134
+ npx utopia-ds registry --list --json
135
+ npx utopia-ds registry metric-grid --json
136
+ npx utopia-ds layout validate ./dashboard-layout.json --json
137
+ ```
138
+
139
+ Registry definitions expose only reviewed semantic props, responsive spans,
140
+ states, data requirements, locks, and agent permissions. Layout JSON must not
141
+ contain arbitrary CSS, colors, shadows, radii, spacing, class names, or token
142
+ overrides. Read `npx utopia-ds docs composition-registry --dense` for the full
143
+ contract and optional Puck adapter boundary.
144
+
145
+ ## Optional diagnostics
146
+
147
+ Ceramic telemetry is disabled by default. If a product has an approved
148
+ diagnostics consent flow, configure the write-only SDK and private dashboard
149
+ using `npx utopia-ds docs observability --dense`. Never collect names, emails,
150
+ DOM content, component props, command arguments, filesystem paths, error
151
+ messages, or raw stacks.
98
152
 
99
153
  ## Agent Decision Loop
100
154
 
@@ -0,0 +1,392 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "intent": "Copyable Ceramic compositions that demonstrate a reviewed interaction contract without turning product workflow into a core primitive.",
4
+ "blocks": [
5
+ {
6
+ "id": "interaction-workbench",
7
+ "title": "Interaction Workbench",
8
+ "status": "available",
9
+ "category": "interaction-lab",
10
+ "purpose": "A deterministic lab for selection, logical grid navigation, typeahead, reordering, resizing, virtualization, undo, RTL, and reduced motion.",
11
+ "bundlePath": "blocks/interaction-workbench",
12
+ "sourcePath": "blocks/interaction-workbench/InteractionWorkbench.tsx",
13
+ "exportName": "InteractionWorkbench",
14
+ "requiredImports": [
15
+ "@utopia-studio-design/design-system",
16
+ "@utopia-studio-design/design-system/Interaction"
17
+ ],
18
+ "contracts": [
19
+ "single, multiple, range, and select-all selection",
20
+ "roving focus and logical grid navigation",
21
+ "pointer drag with keyboard and touch alternatives",
22
+ "resize with keyboard-operable native range input",
23
+ "virtualized range calculation and stable item keys",
24
+ "undo and redo command history"
25
+ ],
26
+ "rtlReady": true,
27
+ "reducedMotion": true,
28
+ "responsiveMinimum": "320px"
29
+ },
30
+ {
31
+ "id": "analytics-chart-card",
32
+ "title": "Analytics Chart Card",
33
+ "status": "available",
34
+ "category": "analytics",
35
+ "purpose": "A page-ready chart composition with governed states, semantic series, keyboard exploration, and optional exact-value evidence.",
36
+ "bundlePath": "blocks/analytics-dashboard",
37
+ "sourcePath": "blocks/analytics-dashboard/AnalyticsDashboardBlocks.tsx",
38
+ "exportName": "AnalyticsChartCard",
39
+ "requiredImports": [
40
+ "@utopia-studio-design/design-system/Charts"
41
+ ],
42
+ "contracts": [
43
+ "line, bar, area, stacked, scatter, and donut families",
44
+ "loading, empty, error, partial, and ready states",
45
+ "keyboard point exploration and live exact values",
46
+ "semantic series and pattern differentiation"
47
+ ],
48
+ "rtlReady": true,
49
+ "reducedMotion": true,
50
+ "responsiveMinimum": "320px"
51
+ },
52
+ {
53
+ "id": "kpi-grid",
54
+ "title": "KPI Grid",
55
+ "status": "available",
56
+ "category": "analytics",
57
+ "purpose": "A governed metric group with locale-aware values, comparisons, density, and complete data states.",
58
+ "bundlePath": "blocks/analytics-dashboard",
59
+ "sourcePath": "blocks/analytics-dashboard/AnalyticsMetricBlocks.tsx",
60
+ "exportName": "KPIGrid",
61
+ "requiredImports": [
62
+ "@utopia-studio-design/design-system/Badge"
63
+ ],
64
+ "contracts": [
65
+ "locale-aware number, percent, and currency formatting",
66
+ "compact, default, and comfortable density",
67
+ "loading, empty, error, partial, and ready states"
68
+ ],
69
+ "rtlReady": true,
70
+ "reducedMotion": true,
71
+ "responsiveMinimum": "320px"
72
+ },
73
+ {
74
+ "id": "comparison-chart-panel",
75
+ "title": "Comparison Chart Panel",
76
+ "status": "available",
77
+ "category": "analytics",
78
+ "purpose": "A benchmark and period-comparison chart panel with semantic annotations.",
79
+ "bundlePath": "blocks/analytics-dashboard",
80
+ "sourcePath": "blocks/analytics-dashboard/AnalyticsDashboardBlocks.tsx",
81
+ "exportName": "ComparisonChartPanel",
82
+ "requiredImports": [
83
+ "@utopia-studio-design/design-system/Charts"
84
+ ],
85
+ "contracts": [
86
+ "benchmark annotation",
87
+ "period comparison",
88
+ "legend synchronization",
89
+ "accessible summary"
90
+ ],
91
+ "rtlReady": true,
92
+ "reducedMotion": true,
93
+ "responsiveMinimum": "320px"
94
+ },
95
+ {
96
+ "id": "chart-with-data-table",
97
+ "title": "Chart with Data Table",
98
+ "status": "available",
99
+ "category": "analytics",
100
+ "purpose": "A chart paired with a semantic table as the exact-value and screen-reader alternative.",
101
+ "bundlePath": "blocks/analytics-dashboard",
102
+ "sourcePath": "blocks/analytics-dashboard/AnalyticsDashboardBlocks.tsx",
103
+ "exportName": "ChartWithDataTable",
104
+ "requiredImports": [
105
+ "@utopia-studio-design/design-system/Charts"
106
+ ],
107
+ "contracts": [
108
+ "visual and table data parity",
109
+ "component-owned horizontal overflow",
110
+ "semantic caption, row headers, and column headers"
111
+ ],
112
+ "rtlReady": true,
113
+ "reducedMotion": true,
114
+ "responsiveMinimum": "320px"
115
+ },
116
+ {
117
+ "id": "database-toolbar",
118
+ "title": "Database Toolbar",
119
+ "status": "available",
120
+ "category": "database",
121
+ "purpose": "Search, filter, sort, group, and create controls for a schema-driven record workspace.",
122
+ "bundlePath": "blocks/database-workspace",
123
+ "sourcePath": "blocks/database-workspace/DatabaseWorkspaceBlocks.tsx",
124
+ "exportName": "DatabaseToolbar",
125
+ "requiredImports": ["@utopia-studio-design/design-system/Database"],
126
+ "contracts": ["query controls", "saved view context", "permission-aware create action"],
127
+ "rtlReady": true,
128
+ "reducedMotion": true,
129
+ "responsiveMinimum": "320px"
130
+ },
131
+ {
132
+ "id": "database-table-block",
133
+ "title": "Database Table Block",
134
+ "status": "available",
135
+ "category": "database",
136
+ "purpose": "A virtualized, editable semantic record grid with controlled persistence and mobile record transformation.",
137
+ "bundlePath": "blocks/database-workspace",
138
+ "sourcePath": "blocks/database-workspace/DatabaseWorkspaceBlocks.tsx",
139
+ "exportName": "DatabaseTableBlock",
140
+ "requiredImports": ["@utopia-studio-design/design-system/Database"],
141
+ "contracts": ["schema-driven properties", "grid keyboard model", "virtualization", "optimistic recovery"],
142
+ "rtlReady": true,
143
+ "reducedMotion": true,
144
+ "responsiveMinimum": "320px"
145
+ },
146
+ {
147
+ "id": "saved-views-bar",
148
+ "title": "Saved Views Bar",
149
+ "status": "available",
150
+ "category": "database",
151
+ "purpose": "An explicit saved-view switcher for governed filter, sort, grouping, and visibility presets.",
152
+ "bundlePath": "blocks/database-workspace",
153
+ "sourcePath": "blocks/database-workspace/DatabaseWorkspaceBlocks.tsx",
154
+ "exportName": "SavedViewsBar",
155
+ "requiredImports": ["@utopia-studio-design/design-system/Database"],
156
+ "contracts": ["controlled active view", "current view semantics"],
157
+ "rtlReady": true,
158
+ "reducedMotion": true,
159
+ "responsiveMinimum": "320px"
160
+ },
161
+ {
162
+ "id": "record-detail-drawer",
163
+ "title": "Record Detail Drawer",
164
+ "status": "available",
165
+ "category": "database",
166
+ "purpose": "A mobile and desktop detail surface that preserves every property outside the dense grid.",
167
+ "bundlePath": "blocks/database-workspace",
168
+ "sourcePath": "blocks/database-workspace/DatabaseWorkspaceBlocks.tsx",
169
+ "exportName": "RecordDetailDrawer",
170
+ "requiredImports": ["@utopia-studio-design/design-system/Database"],
171
+ "contracts": ["dialog semantics", "complete property detail", "logical inline-end placement"],
172
+ "rtlReady": true,
173
+ "reducedMotion": true,
174
+ "responsiveMinimum": "320px"
175
+ },
176
+ {
177
+ "id": "bulk-action-bar",
178
+ "title": "Bulk Action Bar",
179
+ "status": "available",
180
+ "category": "database",
181
+ "purpose": "A permission-aware action surface for selected records.",
182
+ "bundlePath": "blocks/database-workspace",
183
+ "sourcePath": "blocks/database-workspace/DatabaseWorkspaceBlocks.tsx",
184
+ "exportName": "BulkActionBar",
185
+ "requiredImports": ["@utopia-studio-design/design-system/Button"],
186
+ "contracts": ["selection count", "clear selection", "bulk mutation action"],
187
+ "rtlReady": true,
188
+ "reducedMotion": true,
189
+ "responsiveMinimum": "320px"
190
+ },
191
+ {
192
+ "id": "scheduler-shell",
193
+ "title": "Scheduler Shell",
194
+ "status": "available",
195
+ "category": "calendar",
196
+ "purpose": "An application scheduler shell with Month, Week, Day, Agenda, timezone, recurrence, conflict, and mutation contracts.",
197
+ "bundlePath": "blocks/calendar-application",
198
+ "sourcePath": "blocks/calendar-application/CalendarApplicationBlocks.tsx",
199
+ "exportName": "SchedulerShell",
200
+ "requiredImports": ["@utopia-studio-design/design-system/Calendar"],
201
+ "contracts": ["controlled events and adapter", "accessible agenda", "keyboard and touch move alternatives", "responsive view transition"],
202
+ "rtlReady": true,
203
+ "reducedMotion": true,
204
+ "responsiveMinimum": "320px"
205
+ },
206
+ {
207
+ "id": "calendar-sidebar",
208
+ "title": "Calendar Sidebar",
209
+ "status": "available",
210
+ "category": "calendar",
211
+ "purpose": "Date and resource controls for a multi-calendar scheduler.",
212
+ "bundlePath": "blocks/calendar-application",
213
+ "sourcePath": "blocks/calendar-application/CalendarApplicationBlocks.tsx",
214
+ "exportName": "CalendarSidebar",
215
+ "requiredImports": ["@utopia-studio-design/design-system/Calendar"],
216
+ "contracts": ["controlled date", "resource visibility", "logical sidebar placement"],
217
+ "rtlReady": true,
218
+ "reducedMotion": true,
219
+ "responsiveMinimum": "320px"
220
+ },
221
+ {
222
+ "id": "event-editor-drawer",
223
+ "title": "Event Editor Drawer",
224
+ "status": "available",
225
+ "category": "calendar",
226
+ "purpose": "A modal event editor with occurrence-versus-series scope, validation, dismissal, and focus restoration.",
227
+ "bundlePath": "blocks/calendar-application",
228
+ "sourcePath": "blocks/calendar-application/CalendarApplicationBlocks.tsx",
229
+ "exportName": "EventEditorDrawer",
230
+ "requiredImports": ["@utopia-studio-design/design-system/Calendar"],
231
+ "contracts": ["modal focus and scroll lock", "Escape dismissal", "recurrence edit scope", "required and chronological date validation", "async save recovery with preserved draft", "controlled save and delete"],
232
+ "rtlReady": true,
233
+ "reducedMotion": true,
234
+ "responsiveMinimum": "320px"
235
+ },
236
+ {
237
+ "id": "agenda-panel",
238
+ "title": "Agenda Panel",
239
+ "status": "available",
240
+ "category": "calendar",
241
+ "purpose": "A chronological semantic event list that remains available beside or instead of visual time grids.",
242
+ "bundlePath": "blocks/calendar-application",
243
+ "sourcePath": "blocks/calendar-application/CalendarApplicationBlocks.tsx",
244
+ "exportName": "AgendaPanel",
245
+ "requiredImports": ["@utopia-studio-design/design-system/Calendar"],
246
+ "contracts": ["chronological event order", "screen-reader names", "equivalent event activation"],
247
+ "rtlReady": true,
248
+ "reducedMotion": true,
249
+ "responsiveMinimum": "320px"
250
+ },
251
+ {
252
+ "id": "timezone-selector",
253
+ "title": "Timezone Selector",
254
+ "status": "available",
255
+ "category": "calendar",
256
+ "purpose": "An explicit IANA timezone selector for cross-timezone event display.",
257
+ "bundlePath": "blocks/calendar-application",
258
+ "sourcePath": "blocks/calendar-application/CalendarApplicationBlocks.tsx",
259
+ "exportName": "TimezoneSelector",
260
+ "requiredImports": ["@utopia-studio-design/design-system/Calendar"],
261
+ "contracts": ["IANA timezone values", "controlled selection", "visible display context"],
262
+ "rtlReady": true,
263
+ "reducedMotion": true,
264
+ "responsiveMinimum": "320px"
265
+ },
266
+ {
267
+ "id": "activity-feed",
268
+ "title": "Activity Feed",
269
+ "status": "available",
270
+ "category": "operations",
271
+ "purpose": "A locale-aware chronological activity stream with grouped views, semantic sources, timezone formatting, and recoverable pagination.",
272
+ "bundlePath": "blocks/activity-feed",
273
+ "sourcePath": "blocks/activity-feed/ActivityFeedBlock.tsx",
274
+ "exportName": "ActivityFeedBlock",
275
+ "requiredImports": [
276
+ "@utopia-studio-design/design-system/Badge",
277
+ "@utopia-studio-design/design-system/Button",
278
+ "@utopia-studio-design/design-system/DataDisplay",
279
+ "@utopia-studio-design/design-system/Utilities"
280
+ ],
281
+ "contracts": [
282
+ "actor-independent localized activity labels",
283
+ "none, day, and source grouping",
284
+ "locale and IANA timezone-aware timestamps",
285
+ "inherit, auto, LTR, and RTL direction modes",
286
+ "loading, empty, error, and ready states",
287
+ "recoverable page-size pagination",
288
+ "product-owned records and backend cursors"
289
+ ],
290
+ "rtlReady": true,
291
+ "reducedMotion": true,
292
+ "responsiveMinimum": "320px"
293
+ },
294
+ {
295
+ "id": "agent-status",
296
+ "title": "Agent Status",
297
+ "status": "available",
298
+ "category": "agentic",
299
+ "purpose": "A locale-aware execution surface for progress, risk, approval, failure, and completion with product-owned operational data and decisions.",
300
+ "bundlePath": "blocks/agent-status",
301
+ "sourcePath": "blocks/agent-status/AgentStatusBlock.tsx",
302
+ "exportName": "AgentStatusBlock",
303
+ "requiredImports": [
304
+ "@utopia-studio-design/design-system/Badge",
305
+ "@utopia-studio-design/design-system/Button",
306
+ "@utopia-studio-design/design-system/DataDisplay",
307
+ "@utopia-studio-design/design-system/Utilities"
308
+ ],
309
+ "contracts": [
310
+ "queued, running, approval, blocked, failed, and completed states",
311
+ "localized progress, risk, timestamps, and accessible state labels",
312
+ "inherit, auto, LTR, and RTL direction modes",
313
+ "loading, empty, error, filtered-empty, and ready states",
314
+ "product-owned execution records and approval callbacks",
315
+ "sanitized summaries without raw prompts, stacks, credentials, or command output"
316
+ ],
317
+ "rtlReady": true,
318
+ "reducedMotion": true,
319
+ "responsiveMinimum": "320px"
320
+ },
321
+ {
322
+ "id": "todo-list",
323
+ "title": "To-do List",
324
+ "status": "available",
325
+ "category": "productivity",
326
+ "purpose": "A focused task list with controlled product data, semantic filters, completion, due context, priority, and complete loading states.",
327
+ "bundlePath": "blocks/dashboard-composer",
328
+ "sourcePath": "blocks/dashboard-composer/DashboardComposerBlocks.tsx",
329
+ "exportName": "TodoListBlock",
330
+ "requiredImports": [
331
+ "@utopia-studio-design/design-system/Badge",
332
+ "@utopia-studio-design/design-system/Button",
333
+ "@utopia-studio-design/design-system/Forms"
334
+ ],
335
+ "contracts": [
336
+ "controlled and uncontrolled task data",
337
+ "keyboard and pointer completion",
338
+ "semantic task filters",
339
+ "loading, empty, error, and ready states",
340
+ "product-owned persistence"
341
+ ],
342
+ "rtlReady": true,
343
+ "reducedMotion": true,
344
+ "responsiveMinimum": "320px"
345
+ },
346
+ {
347
+ "id": "ceramic-dashboard-renderer",
348
+ "title": "Ceramic Dashboard Renderer",
349
+ "status": "available",
350
+ "category": "composition",
351
+ "purpose": "A Layout JSON runtime that maps registered definitions to product renderers and validates every agent-style move or removal.",
352
+ "bundlePath": "blocks/dashboard-composer",
353
+ "sourcePath": "blocks/dashboard-composer/DashboardComposerBlocks.tsx",
354
+ "exportName": "CeramicDashboardRenderer",
355
+ "requiredImports": ["@utopia-studio-design/design-system/Composition"],
356
+ "contracts": [
357
+ "versioned layout validation",
358
+ "product-supplied renderer map",
359
+ "locked block and region enforcement",
360
+ "keyboard and touch arrange controls",
361
+ "responsive registered placement"
362
+ ],
363
+ "rtlReady": true,
364
+ "reducedMotion": true,
365
+ "responsiveMinimum": "320px"
366
+ },
367
+ {
368
+ "id": "ceramic-puck-adapter",
369
+ "title": "Ceramic Puck Adapter",
370
+ "status": "available",
371
+ "category": "composition",
372
+ "purpose": "An optional visual-editor adapter that generates Puck fields and permissions from the Ceramic registry, then validates Puck output before producing Layout JSON.",
373
+ "bundlePath": "blocks/dashboard-composer",
374
+ "sourcePath": "blocks/dashboard-composer/CeramicPuckAdapter.tsx",
375
+ "exportName": "createCeramicPuckConfig",
376
+ "requiredImports": [
377
+ "@puckeditor/core",
378
+ "@utopia-studio-design/design-system/Composition"
379
+ ],
380
+ "contracts": [
381
+ "registry-generated component palette and semantic fields",
382
+ "Puck Data and Ceramic Layout JSON conversion",
383
+ "locked block and region permissions",
384
+ "validated publish boundary",
385
+ "no arbitrary style payloads"
386
+ ],
387
+ "rtlReady": true,
388
+ "reducedMotion": true,
389
+ "responsiveMinimum": "320px"
390
+ }
391
+ ]
392
+ }
@@ -193,10 +193,13 @@
193
193
  "Avatar",
194
194
  "Badge",
195
195
  "Bubble",
196
- "Calendar",
197
- "Carousel",
198
- "Chart",
199
- "Data Table",
196
+ "Calendar",
197
+ "Scheduler Root",
198
+ "Carousel",
199
+ "Chart",
200
+ "Chart Root",
201
+ "Database Root",
202
+ "Data Table",
200
203
  "Empty",
201
204
  "Item",
202
205
  "Kbd",