@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,79 @@
1
+ import type { AgentStatusItem } from './AgentStatusBlock'
2
+
3
+ const englishItems: AgentStatusItem[] = [
4
+ {
5
+ id: 'mina-qa',
6
+ name: 'Mina UX-QA',
7
+ progress: 68,
8
+ risk: 'low',
9
+ state: 'running',
10
+ summary: 'Checking responsive, Arabic, and interaction contracts.',
11
+ taskLabel: 'Dashboard composition QA',
12
+ updatedAt: '2026-07-30T08:42:00.000Z',
13
+ },
14
+ {
15
+ approval: {
16
+ id: 'publish-approval',
17
+ description: 'Publishes the validated patch release to the configured npm registry.',
18
+ label: 'Publish Ceramic patch release',
19
+ },
20
+ id: 'release-agent',
21
+ name: 'Release Agent',
22
+ risk: 'medium',
23
+ state: 'waiting-approval',
24
+ summary: 'All local release gates passed. External publishing requires a human decision.',
25
+ taskLabel: 'Prepare npm release',
26
+ updatedAt: '2026-07-30T08:39:00.000Z',
27
+ },
28
+ {
29
+ id: 'registry-agent',
30
+ name: 'Registry Agent',
31
+ risk: 'high',
32
+ state: 'blocked',
33
+ summary: 'A required product data adapter has not been connected.',
34
+ taskLabel: 'Sync production activity source',
35
+ updatedAt: '2026-07-30T08:31:00.000Z',
36
+ },
37
+ {
38
+ id: 'build-agent',
39
+ name: 'Build Agent',
40
+ progress: 100,
41
+ risk: 'none',
42
+ state: 'completed',
43
+ summary: 'Standalone Calendar and Dashboard templates built successfully.',
44
+ taskLabel: 'Verify generated templates',
45
+ updatedAt: '2026-07-30T08:20:00.000Z',
46
+ },
47
+ ]
48
+
49
+ const arabicItems: AgentStatusItem[] = [
50
+ {
51
+ ...englishItems[0],
52
+ summary: 'جارٍ فحص عقود الاستجابة والعربية والتفاعل.',
53
+ taskLabel: 'فحص جودة تكوين لوحة المعلومات',
54
+ },
55
+ {
56
+ ...englishItems[1],
57
+ approval: {
58
+ id: 'publish-approval',
59
+ description: 'سيتم نشر إصدار التصحيح المعتمد في سجل npm المحدد.',
60
+ label: 'نشر إصدار تصحيح Ceramic',
61
+ },
62
+ summary: 'نجحت جميع فحوصات الإصدار المحلية. يتطلب النشر الخارجي قراراً بشرياً.',
63
+ taskLabel: 'إعداد إصدار npm',
64
+ },
65
+ {
66
+ ...englishItems[2],
67
+ summary: 'لم يتم ربط محول بيانات المنتج المطلوب.',
68
+ taskLabel: 'مزامنة مصدر النشاط في الإنتاج',
69
+ },
70
+ {
71
+ ...englishItems[3],
72
+ summary: 'تم بناء قوالب التقويم ولوحة المعلومات المستقلة بنجاح.',
73
+ taskLabel: 'التحقق من القوالب المولدة',
74
+ },
75
+ ]
76
+
77
+ export function getAgentStatusFixture(locale: string): AgentStatusItem[] {
78
+ return locale.startsWith('ar') ? arabicItems : englishItems
79
+ }
@@ -0,0 +1,19 @@
1
+ <!doctype html>
2
+ <html dir="ltr" lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta
7
+ name="description"
8
+ content="A runnable Ceramic Agent Status state, resilience, Arabic, RTL, and approval QA fixture."
9
+ />
10
+ <title>Agent Status State Lab — Dashboard Composer</title>
11
+ </head>
12
+ <body>
13
+ <a class="skip-link uds-button uds-button--default uds-button--sm" href="#state-grid">
14
+ Skip to state fixtures
15
+ </a>
16
+ <div id="root"></div>
17
+ <script type="module" src="./main.tsx"></script>
18
+ </body>
19
+ </html>
@@ -0,0 +1,151 @@
1
+ import { StrictMode, useMemo, useState } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import { Button } from '@utopia-studio-design/design-system/Button'
4
+ import {
5
+ AgentStatusBlock,
6
+ type AgentStatusItem,
7
+ } from '../AgentStatusBlock'
8
+ import {
9
+ resolveAgentStatusConfiguration,
10
+ type AgentStatusLocale,
11
+ } from '../agent-status-contract'
12
+ import { getAgentStatusFixture } from '../agent-status-fixture'
13
+ import '@utopia-studio-design/design-system/core.css'
14
+ import '@utopia-studio-design/design-system/themes/utopia-default.css'
15
+ import '../agent-status.css'
16
+ import './styles.css'
17
+
18
+ type FixtureId = 'loading' | 'empty' | 'error' | 'filtered-empty' | 'ready'
19
+
20
+ const fixtureNames: Record<FixtureId, string> = {
21
+ empty: 'Empty',
22
+ error: 'Recoverable error',
23
+ 'filtered-empty': 'Filtered empty',
24
+ loading: 'Loading',
25
+ ready: 'Ready with approval',
26
+ }
27
+
28
+ function App() {
29
+ const [locale, setLocale] = useState<AgentStatusLocale>('en-US')
30
+ const [dark, setDark] = useState(false)
31
+ const [feedback, setFeedback] = useState('All five product-data states are available for inspection.')
32
+ const [readyItems, setReadyItems] = useState<AgentStatusItem[]>(() => getAgentStatusFixture('en-US'))
33
+ const configuration = useMemo(() => resolveAgentStatusConfiguration({
34
+ density: 'default',
35
+ direction: 'auto',
36
+ filter: 'all',
37
+ locale,
38
+ maxItems: 6,
39
+ showApprovals: true,
40
+ timeZone: 'Asia/Seoul',
41
+ }, { direction: 'ltr' }), [locale])
42
+ const localizedItems = useMemo(() => {
43
+ const stateById = new Map(readyItems.map((item) => [item.id, item]))
44
+ return getAgentStatusFixture(locale).map((item) => {
45
+ const runtimeItem = stateById.get(item.id)
46
+ return runtimeItem
47
+ ? {
48
+ ...item,
49
+ approval: runtimeItem.approval ? item.approval : undefined,
50
+ progress: runtimeItem.progress,
51
+ state: runtimeItem.state,
52
+ }
53
+ : item
54
+ })
55
+ }, [locale, readyItems])
56
+ const completedOnly = localizedItems.filter((item) => item.state === 'completed')
57
+
58
+ const resolveApproval = (item: AgentStatusItem, approved: boolean) => {
59
+ setReadyItems((current) => current.map((candidate) => (
60
+ candidate.id === item.id
61
+ ? {
62
+ ...candidate,
63
+ approval: undefined,
64
+ progress: approved ? Math.max(1, candidate.progress ?? 0) : candidate.progress,
65
+ state: approved ? 'running' : 'blocked',
66
+ }
67
+ : candidate
68
+ )))
69
+ setFeedback(approved ? `${item.name} resumed after approval.` : `${item.name} was blocked after rejection.`)
70
+ }
71
+
72
+ return (
73
+ <main
74
+ className="agent-status-lab"
75
+ data-color-mode={dark ? 'dark' : 'light'}
76
+ data-theme="utopia-default"
77
+ dir="ltr"
78
+ >
79
+ <header>
80
+ <div>
81
+ <span>Resilience fixture</span>
82
+ <h1>Verify every Agent Status outcome</h1>
83
+ <p>
84
+ Product data changes the execution state. Ceramic keeps the same semantic,
85
+ localized, responsive presentation contract.
86
+ </p>
87
+ </div>
88
+ <div aria-label="State Lab controls">
89
+ <Button asChild variant="outline">
90
+ <a href="/templates/dashboard-composer/">Back to runtime</a>
91
+ </Button>
92
+ <Button
93
+ variant="outline"
94
+ onClick={() => setLocale((value) => value === 'en-US' ? 'ar-SA' : 'en-US')}
95
+ >
96
+ {locale === 'en-US' ? 'Preview Arabic states' : 'Preview English states'}
97
+ </Button>
98
+ <Button variant="outline" onClick={() => setDark((value) => !value)}>
99
+ {dark ? 'Switch to light' : 'Switch to dark'}
100
+ </Button>
101
+ </div>
102
+ <output aria-live="polite">{feedback}</output>
103
+ </header>
104
+
105
+ <section aria-label="Agent Status state fixtures" id="state-grid">
106
+ <article data-fixture="loading">
107
+ <span>{fixtureNames.loading}</span>
108
+ <AgentStatusBlock {...configuration} items={[]} state="loading" />
109
+ </article>
110
+ <article data-fixture="empty">
111
+ <span>{fixtureNames.empty}</span>
112
+ <AgentStatusBlock {...configuration} items={[]} state="empty" />
113
+ </article>
114
+ <article data-fixture="error">
115
+ <span>{fixtureNames.error}</span>
116
+ <AgentStatusBlock
117
+ {...configuration}
118
+ items={[]}
119
+ onRetry={() => setFeedback('Agent execution source retry requested.')}
120
+ state="error"
121
+ />
122
+ </article>
123
+ <article data-fixture="filtered-empty">
124
+ <span>{fixtureNames['filtered-empty']}</span>
125
+ <AgentStatusBlock
126
+ {...configuration}
127
+ filter="attention"
128
+ items={completedOnly}
129
+ state="ready"
130
+ />
131
+ </article>
132
+ <article data-fixture="ready">
133
+ <span>{fixtureNames.ready}</span>
134
+ <AgentStatusBlock
135
+ {...configuration}
136
+ items={localizedItems}
137
+ onApprove={(item) => resolveApproval(item, true)}
138
+ onReject={(item) => resolveApproval(item, false)}
139
+ state="ready"
140
+ />
141
+ </article>
142
+ </section>
143
+ </main>
144
+ )
145
+ }
146
+
147
+ createRoot(document.getElementById('root')!).render(
148
+ <StrictMode>
149
+ <App />
150
+ </StrictMode>,
151
+ )
@@ -0,0 +1,139 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ html,
6
+ body,
7
+ #root {
8
+ min-block-size: 100%;
9
+ inline-size: 100%;
10
+ max-inline-size: 100%;
11
+ margin: 0;
12
+ }
13
+
14
+ html,
15
+ body {
16
+ overflow-x: clip;
17
+ }
18
+
19
+ body {
20
+ background: var(--background);
21
+ color: var(--foreground);
22
+ font-family: var(--font-sans);
23
+ }
24
+
25
+ .skip-link {
26
+ position: fixed;
27
+ z-index: var(--z-modal);
28
+ inset-block-start: var(--space-2);
29
+ inset-inline-start: var(--space-2);
30
+ translate: 0 -200%;
31
+ }
32
+
33
+ .skip-link:focus {
34
+ translate: 0;
35
+ }
36
+
37
+ .agent-status-lab {
38
+ min-block-size: 100vh;
39
+ padding: var(--page-gutter);
40
+ background: var(--background);
41
+ color: var(--foreground);
42
+ }
43
+
44
+ .agent-status-lab > * {
45
+ max-inline-size: var(--container-wide);
46
+ margin-inline: auto;
47
+ }
48
+
49
+ .agent-status-lab :is(h1, p) {
50
+ margin: 0;
51
+ }
52
+
53
+ .agent-status-lab > header {
54
+ display: grid;
55
+ grid-template-columns: minmax(20rem, 1fr) auto;
56
+ gap: var(--space-4) var(--space-6);
57
+ padding-block: var(--space-5);
58
+ border-block-end: var(--border-width-hairline) solid var(--border);
59
+ }
60
+
61
+ .agent-status-lab > header > div:first-child {
62
+ display: grid;
63
+ gap: var(--space-2);
64
+ max-inline-size: 54rem;
65
+ }
66
+
67
+ .agent-status-lab > header > div:first-child > span,
68
+ .agent-status-lab article > span {
69
+ color: var(--muted-foreground);
70
+ font-size: var(--font-size-eyebrow);
71
+ font-weight: var(--font-weight-semibold);
72
+ letter-spacing: var(--tracking-eyebrow);
73
+ text-transform: uppercase;
74
+ }
75
+
76
+ .agent-status-lab > header p {
77
+ color: var(--muted-foreground);
78
+ line-height: var(--line-height-body);
79
+ }
80
+
81
+ .agent-status-lab > header > div:nth-child(2) {
82
+ display: flex;
83
+ align-items: start;
84
+ justify-content: end;
85
+ flex-wrap: wrap;
86
+ gap: var(--space-2);
87
+ }
88
+
89
+ .agent-status-lab > header output {
90
+ grid-column: 1 / -1;
91
+ min-inline-size: 0;
92
+ padding: var(--space-3);
93
+ border: var(--border-width-hairline) solid var(--interaction-selection-border);
94
+ background: var(--interaction-selection-surface);
95
+ overflow-wrap: anywhere;
96
+ }
97
+
98
+ .agent-status-lab > section {
99
+ display: grid;
100
+ grid-template-columns: repeat(2, minmax(0, 1fr));
101
+ gap: var(--space-4);
102
+ padding-block: var(--space-5);
103
+ }
104
+
105
+ .agent-status-lab article {
106
+ display: grid;
107
+ align-content: start;
108
+ gap: var(--space-2);
109
+ min-inline-size: 0;
110
+ }
111
+
112
+ .agent-status-lab article > .ceramic-agent-status {
113
+ min-block-size: 20rem;
114
+ border: var(--border-width-hairline) solid var(--border);
115
+ }
116
+
117
+ .agent-status-lab article[data-fixture='ready'] {
118
+ grid-column: 1 / -1;
119
+ }
120
+
121
+ @media (max-width: 48rem) {
122
+ .agent-status-lab > header,
123
+ .agent-status-lab > section {
124
+ grid-template-columns: 1fr;
125
+ }
126
+
127
+ .agent-status-lab > header > div:nth-child(2) {
128
+ display: grid;
129
+ justify-content: stretch;
130
+ }
131
+
132
+ .agent-status-lab article[data-fixture='ready'] {
133
+ grid-column: 1;
134
+ }
135
+
136
+ .agent-status-lab article > .ceramic-agent-status {
137
+ min-block-size: auto;
138
+ }
139
+ }
@@ -0,0 +1,216 @@
1
+ .ceramic-agent-status {
2
+ container-type: inline-size;
3
+ display: grid;
4
+ align-content: start;
5
+ gap: var(--space-3);
6
+ min-inline-size: 0;
7
+ block-size: 100%;
8
+ padding: var(--space-4);
9
+ background: var(--surface);
10
+ color: var(--foreground);
11
+ text-align: start;
12
+ }
13
+
14
+ .ceramic-agent-status > header,
15
+ .ceramic-agent-status > header > div,
16
+ .ceramic-agent-status-heading,
17
+ .ceramic-agent-status-meta,
18
+ .ceramic-agent-approval,
19
+ .ceramic-agent-approval > div:last-child {
20
+ display: flex;
21
+ align-items: center;
22
+ }
23
+
24
+ .ceramic-agent-status > header {
25
+ justify-content: space-between;
26
+ gap: var(--space-3);
27
+ padding-block-end: var(--space-3);
28
+ border-block-end: var(--border-width-hairline) solid var(--border);
29
+ }
30
+
31
+ .ceramic-agent-status > header > div {
32
+ align-items: start;
33
+ flex-direction: column;
34
+ gap: var(--space-1);
35
+ min-inline-size: 0;
36
+ }
37
+
38
+ .ceramic-agent-status :is(h2, p) {
39
+ margin: 0;
40
+ }
41
+
42
+ .ceramic-agent-status > header span {
43
+ color: var(--muted-foreground);
44
+ font-size: var(--font-size-eyebrow);
45
+ font-weight: var(--font-weight-semibold);
46
+ letter-spacing: var(--tracking-eyebrow);
47
+ text-transform: uppercase;
48
+ }
49
+
50
+ .ceramic-agent-status-list {
51
+ display: grid;
52
+ gap: var(--space-3);
53
+ margin: 0;
54
+ padding: 0;
55
+ list-style: none;
56
+ }
57
+
58
+ .ceramic-agent-status-list > li {
59
+ display: grid;
60
+ gap: var(--space-3);
61
+ min-inline-size: 0;
62
+ padding: var(--space-3);
63
+ border: var(--border-width-hairline) solid var(--border);
64
+ background: var(--background);
65
+ }
66
+
67
+ .ceramic-agent-status[data-density='compact'] .ceramic-agent-status-list {
68
+ gap: var(--space-2);
69
+ }
70
+
71
+ .ceramic-agent-status[data-density='compact'] .ceramic-agent-status-list > li {
72
+ gap: var(--space-2);
73
+ padding: var(--space-2);
74
+ }
75
+
76
+ .ceramic-agent-status[data-density='comfortable'] .ceramic-agent-status-list > li {
77
+ gap: var(--space-4);
78
+ padding: var(--space-4);
79
+ }
80
+
81
+ .ceramic-agent-status-heading {
82
+ align-items: start;
83
+ gap: var(--space-3);
84
+ min-inline-size: 0;
85
+ }
86
+
87
+ .ceramic-agent-status-heading > .uds-status-dot {
88
+ flex: 0 0 auto;
89
+ margin-block-start: var(--space-2);
90
+ background: var(--muted-foreground);
91
+ }
92
+
93
+ .ceramic-agent-status-heading > .uds-status-dot[data-execution-state='running'] {
94
+ background: var(--primary);
95
+ }
96
+
97
+ .ceramic-agent-status-heading > .uds-status-dot[data-execution-state='waiting-approval'],
98
+ .ceramic-agent-status-heading > .uds-status-dot[data-execution-state='blocked'] {
99
+ background: var(--warning);
100
+ }
101
+
102
+ .ceramic-agent-status-heading > .uds-status-dot[data-execution-state='failed'] {
103
+ background: var(--destructive);
104
+ }
105
+
106
+ .ceramic-agent-status-heading > .uds-status-dot[data-execution-state='completed'] {
107
+ background: var(--success);
108
+ }
109
+
110
+ .ceramic-agent-status-heading > div {
111
+ display: grid;
112
+ flex: 1 1 auto;
113
+ gap: var(--space-1);
114
+ min-inline-size: 0;
115
+ }
116
+
117
+ .ceramic-agent-status-heading > div > span,
118
+ .ceramic-agent-status-list > li > p,
119
+ .ceramic-agent-status-meta {
120
+ color: var(--muted-foreground);
121
+ font-size: var(--font-size-small);
122
+ }
123
+
124
+ .ceramic-agent-status-heading > div > :is(strong, span),
125
+ .ceramic-agent-status-list > li > p,
126
+ .ceramic-agent-approval :is(span, p) {
127
+ overflow-wrap: anywhere;
128
+ }
129
+
130
+ .ceramic-agent-status-heading > .uds-badge {
131
+ flex: 0 0 auto;
132
+ }
133
+
134
+ .ceramic-agent-status-list > li > p {
135
+ line-height: var(--line-height-body);
136
+ }
137
+
138
+ .ceramic-agent-status-meta {
139
+ flex-wrap: wrap;
140
+ gap: var(--space-2);
141
+ }
142
+
143
+ .ceramic-agent-status-meta [data-risk='high'] {
144
+ border-color: var(--destructive-border);
145
+ color: var(--destructive-text);
146
+ }
147
+
148
+ .ceramic-agent-status-meta [data-risk='medium'] {
149
+ border-color: var(--warning-border);
150
+ color: var(--warning-text);
151
+ }
152
+
153
+ .ceramic-agent-approval {
154
+ align-items: start;
155
+ justify-content: space-between;
156
+ gap: var(--space-3);
157
+ padding: var(--space-3);
158
+ border-inline-start: var(--border-width-strong) solid var(--warning-border);
159
+ background: var(--warning-surface);
160
+ }
161
+
162
+ .ceramic-agent-approval > div:first-child {
163
+ display: grid;
164
+ gap: var(--space-1);
165
+ min-inline-size: 0;
166
+ }
167
+
168
+ .ceramic-agent-approval > div:first-child > span,
169
+ .ceramic-agent-approval > div:first-child > p {
170
+ color: var(--muted-foreground);
171
+ font-size: var(--font-size-small);
172
+ }
173
+
174
+ .ceramic-agent-approval > div:last-child {
175
+ flex: 0 0 auto;
176
+ flex-wrap: wrap;
177
+ gap: var(--space-2);
178
+ }
179
+
180
+ .ceramic-agent-status-state {
181
+ display: grid;
182
+ align-content: center;
183
+ justify-items: start;
184
+ gap: var(--space-2);
185
+ min-block-size: 10rem;
186
+ color: var(--muted-foreground);
187
+ }
188
+
189
+ .ceramic-agent-status-state strong {
190
+ color: var(--foreground);
191
+ }
192
+
193
+ @container (min-width: 48rem) {
194
+ .ceramic-agent-status-list {
195
+ grid-template-columns: repeat(2, minmax(0, 1fr));
196
+ }
197
+ }
198
+
199
+ @media (max-width: 32rem) {
200
+ .ceramic-agent-status {
201
+ padding: var(--space-3);
202
+ }
203
+
204
+ .ceramic-agent-approval {
205
+ align-items: stretch;
206
+ flex-direction: column;
207
+ }
208
+
209
+ .ceramic-agent-approval > div:last-child {
210
+ inline-size: 100%;
211
+ }
212
+
213
+ .ceramic-agent-approval > div:last-child > .uds-button {
214
+ flex: 1 1 auto;
215
+ }
216
+ }
@@ -0,0 +1,92 @@
1
+ .ceramic-kpi-grid {
2
+ display: grid;
3
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 12rem), 1fr));
4
+ gap: var(--interaction-density-default);
5
+ min-inline-size: 0;
6
+ }
7
+
8
+ .ceramic-kpi-grid[data-density='compact'] {
9
+ gap: var(--interaction-density-compact);
10
+ }
11
+
12
+ .ceramic-kpi-grid[data-density='comfortable'] {
13
+ gap: var(--interaction-density-comfortable);
14
+ }
15
+
16
+ .ceramic-kpi {
17
+ display: grid;
18
+ align-content: start;
19
+ gap: var(--space-2);
20
+ min-inline-size: 0;
21
+ padding: var(--space-4);
22
+ border: var(--border-width-hairline) solid var(--border);
23
+ background: var(--surface);
24
+ }
25
+
26
+ .ceramic-kpi > span:first-child,
27
+ .ceramic-kpi-unavailable {
28
+ color: var(--muted-foreground);
29
+ font-size: var(--font-size-small);
30
+ }
31
+
32
+ .ceramic-kpi > strong {
33
+ font-size: var(--font-size-marketing-h3);
34
+ font-weight: var(--font-weight-medium);
35
+ line-height: var(--line-height-tight);
36
+ }
37
+
38
+ .ceramic-kpi .uds-badge {
39
+ inline-size: fit-content;
40
+ }
41
+
42
+ .ceramic-kpi-state {
43
+ display: grid;
44
+ grid-column: 1 / -1;
45
+ justify-items: center;
46
+ gap: var(--space-2);
47
+ min-block-size: 10rem;
48
+ padding: var(--space-6);
49
+ border: var(--border-width-hairline) dashed var(--border);
50
+ color: var(--muted-foreground);
51
+ text-align: center;
52
+ }
53
+
54
+ .ceramic-kpi-state strong {
55
+ color: var(--foreground);
56
+ }
57
+
58
+ .ceramic-kpi-skeleton {
59
+ min-block-size: 9rem;
60
+ background: var(--surface-strong);
61
+ }
62
+
63
+ .ceramic-analytics-header {
64
+ display: flex;
65
+ align-items: end;
66
+ justify-content: space-between;
67
+ gap: var(--space-6);
68
+ padding-block: var(--space-6);
69
+ border-block-end: var(--border-width-hairline) solid var(--border);
70
+ }
71
+
72
+ .ceramic-analytics-header > div {
73
+ display: grid;
74
+ gap: var(--space-1);
75
+ }
76
+
77
+ .ceramic-analytics-header :is(h1, p) {
78
+ margin: 0;
79
+ }
80
+
81
+ .ceramic-analytics-header > div > span,
82
+ .ceramic-analytics-header p {
83
+ color: var(--muted-foreground);
84
+ font-size: var(--font-size-small);
85
+ }
86
+
87
+ @media (max-width: 44rem) {
88
+ .ceramic-analytics-header {
89
+ align-items: stretch;
90
+ flex-direction: column;
91
+ }
92
+ }