@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.
- package/README.md +23 -0
- package/bin/utopia-ds-mcp.mjs +9 -2
- package/bin/utopia-ds.mjs +115 -7
- package/data/blocks/activity-feed/ActivityFeedBlock.tsx +255 -0
- package/data/blocks/activity-feed/README.md +16 -0
- package/data/blocks/activity-feed/activity-feed-contract.ts +96 -0
- package/data/blocks/activity-feed/activity-feed-fixture.ts +22 -0
- package/data/blocks/activity-feed/activity-feed.css +154 -0
- package/data/blocks/agent-status/AgentStatusBlock.tsx +313 -0
- package/data/blocks/agent-status/README.md +15 -0
- package/data/blocks/agent-status/agent-status-contract.ts +133 -0
- package/data/blocks/agent-status/agent-status-fixture.ts +79 -0
- package/data/blocks/agent-status/agent-status.css +216 -0
- package/data/blocks/analytics-dashboard/AnalyticsDashboardBlocks.tsx +107 -0
- package/data/blocks/analytics-dashboard/AnalyticsMetricBlocks.tsx +87 -0
- package/data/blocks/analytics-dashboard/README.md +17 -0
- package/data/blocks/analytics-dashboard/analytics-dashboard.css +92 -0
- package/data/blocks/calendar-application/CalendarApplicationBlocks.tsx +519 -0
- package/data/blocks/calendar-application/README.md +20 -0
- package/data/blocks/calendar-application/calendar-application.css +216 -0
- package/data/blocks/calendar-application/calendar-localization.ts +90 -0
- package/data/blocks/calendar-application/calendar-panel-contract.ts +72 -0
- package/data/blocks/dashboard-composer/CeramicPuckAdapter.tsx +380 -0
- package/data/blocks/dashboard-composer/DashboardComposerBlocks.tsx +337 -0
- package/data/blocks/dashboard-composer/README.md +16 -0
- package/data/blocks/dashboard-composer/RegistryDataBlocks.tsx +238 -0
- package/data/blocks/dashboard-composer/dashboard-composer.css +328 -0
- package/data/blocks/database-workspace/DatabaseWorkspaceBlocks.tsx +240 -0
- package/data/blocks/database-workspace/README.md +9 -0
- package/data/blocks/database-workspace/database-workspace.css +107 -0
- package/data/blocks/interaction-workbench/InteractionWorkbench.tsx +271 -0
- package/data/blocks/interaction-workbench/README.md +9 -0
- package/data/blocks/interaction-workbench/interaction-workbench.css +226 -0
- package/data/docs/calendar.md +164 -0
- package/data/docs/charts.md +95 -0
- package/data/docs/composition-registry.md +174 -0
- package/data/docs/dashboard-composer.md +94 -0
- package/data/docs/database.md +68 -0
- package/data/docs/examples/dashboard-layout.v1.json +65 -0
- package/data/docs/foundations.md +2 -1
- package/data/docs/interaction-foundation.md +109 -0
- package/data/docs/observability.md +165 -0
- package/data/docs/quick-start-ai.md +55 -1
- package/data/manifests/blocks.json +392 -0
- package/data/manifests/catalog.json +7 -4
- package/data/manifests/components.json +191 -3
- package/data/manifests/composition-registry.json +427 -0
- package/data/manifests/motion-profiles.json +1 -1
- package/data/manifests/patterns.json +113 -1
- package/data/manifests/templates.json +346 -0
- package/data/manifests/theme-renacore.json +142 -0
- package/data/manifests/themes.json +314 -28
- package/data/templates/analytics-dashboard/AnalyticsDashboardBlocks.tsx +107 -0
- package/data/templates/analytics-dashboard/AnalyticsMetricBlocks.tsx +87 -0
- package/data/templates/analytics-dashboard/README.md +6 -0
- package/data/templates/analytics-dashboard/analytics-dashboard.css +92 -0
- package/data/templates/analytics-dashboard/index.html +13 -0
- package/data/templates/analytics-dashboard/main.tsx +196 -0
- package/data/templates/analytics-dashboard/styles.css +120 -0
- package/data/templates/analytics-dashboard/template.manifest.json +17 -0
- package/data/templates/calendar-application/CalendarApplicationBlocks.tsx +519 -0
- package/data/templates/calendar-application/README.md +10 -0
- package/data/templates/calendar-application/calendar-application.css +216 -0
- package/data/templates/calendar-application/calendar-localization.ts +90 -0
- package/data/templates/calendar-application/index.html +14 -0
- package/data/templates/calendar-application/main.tsx +409 -0
- package/data/templates/calendar-application/styles.css +248 -0
- package/data/templates/calendar-application/template.manifest.json +27 -0
- package/data/templates/composition-registry-lab/README.md +9 -0
- package/data/templates/composition-registry-lab/index.html +14 -0
- package/data/templates/composition-registry-lab/main.tsx +217 -0
- package/data/templates/composition-registry-lab/sample-layout.json +63 -0
- package/data/templates/composition-registry-lab/styles.css +343 -0
- package/data/templates/composition-registry-lab/template.manifest.json +34 -0
- package/data/templates/dashboard-composer/ActivityFeedBlock.tsx +255 -0
- package/data/templates/dashboard-composer/AgentStatusBlock.tsx +313 -0
- package/data/templates/dashboard-composer/AnalyticsDashboardBlocks.tsx +107 -0
- package/data/templates/dashboard-composer/AnalyticsMetricBlocks.tsx +87 -0
- package/data/templates/dashboard-composer/CalendarApplicationBlocks.tsx +519 -0
- package/data/templates/dashboard-composer/CeramicPuckAdapter.tsx +380 -0
- package/data/templates/dashboard-composer/DashboardComposerBlocks.tsx +337 -0
- package/data/templates/dashboard-composer/DatabaseWorkspaceBlocks.tsx +240 -0
- package/data/templates/dashboard-composer/README.md +53 -0
- package/data/templates/dashboard-composer/RegistryDataBlocks.tsx +238 -0
- package/data/templates/dashboard-composer/activity-feed-contract.ts +96 -0
- package/data/templates/dashboard-composer/activity-feed-fixture.ts +22 -0
- package/data/templates/dashboard-composer/activity-feed.css +154 -0
- package/data/templates/dashboard-composer/agent-status-contract.ts +133 -0
- package/data/templates/dashboard-composer/agent-status-fixture.ts +79 -0
- package/data/templates/dashboard-composer/agent-status-lab/index.html +19 -0
- package/data/templates/dashboard-composer/agent-status-lab/main.tsx +151 -0
- package/data/templates/dashboard-composer/agent-status-lab/styles.css +139 -0
- package/data/templates/dashboard-composer/agent-status.css +216 -0
- package/data/templates/dashboard-composer/analytics-dashboard.css +92 -0
- package/data/templates/dashboard-composer/calendar-application.css +216 -0
- package/data/templates/dashboard-composer/calendar-localization.ts +90 -0
- package/data/templates/dashboard-composer/calendar-panel-contract.ts +72 -0
- package/data/templates/dashboard-composer/dashboard-composer.css +328 -0
- package/data/templates/dashboard-composer/database-workspace.css +107 -0
- package/data/templates/dashboard-composer/index.html +14 -0
- package/data/templates/dashboard-composer/main.tsx +550 -0
- package/data/templates/dashboard-composer/sample-layout.json +147 -0
- package/data/templates/dashboard-composer/styles.css +198 -0
- package/data/templates/dashboard-composer/template.manifest.json +34 -0
- package/data/templates/dashboard-composer/visual-editor/PuckEditorSurface.tsx +132 -0
- package/data/templates/dashboard-composer/visual-editor/VisualEditorApp.tsx +343 -0
- package/data/templates/dashboard-composer/visual-editor/index.html +17 -0
- package/data/templates/dashboard-composer/visual-editor/main.tsx +95 -0
- package/data/templates/dashboard-composer/visual-editor/styles.css +310 -0
- package/data/templates/database-workspace/DatabaseWorkspaceBlocks.tsx +240 -0
- package/data/templates/database-workspace/README.md +5 -0
- package/data/templates/database-workspace/database-workspace.css +107 -0
- package/data/templates/database-workspace/index.html +14 -0
- package/data/templates/database-workspace/main.tsx +247 -0
- package/data/templates/database-workspace/styles.css +121 -0
- package/data/templates/database-workspace/template.manifest.json +19 -0
- package/data/templates/interaction-lab/InteractionWorkbench.tsx +271 -0
- package/data/templates/interaction-lab/README.md +7 -0
- package/data/templates/interaction-lab/index.html +14 -0
- package/data/templates/interaction-lab/interaction-workbench.css +226 -0
- package/data/templates/interaction-lab/main.tsx +104 -0
- package/data/templates/interaction-lab/styles.css +224 -0
- package/data/templates/interaction-lab/template.manifest.json +36 -0
- package/lib/api.mjs +72 -5
- package/lib/composition-runtime.mjs +382 -0
- package/lib/telemetry.mjs +74 -0
- 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,
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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",
|