@utopia-studio-design/design-system-cli 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +23 -0
  2. package/bin/utopia-ds-mcp.mjs +9 -2
  3. package/bin/utopia-ds.mjs +106 -8
  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 +1 -1
  41. package/data/docs/interaction-foundation.md +109 -0
  42. package/data/docs/quick-start-ai.md +23 -1
  43. package/data/manifests/blocks.json +392 -0
  44. package/data/manifests/catalog.json +7 -4
  45. package/data/manifests/components.json +179 -0
  46. package/data/manifests/composition-registry.json +427 -0
  47. package/data/manifests/motion-profiles.json +1 -1
  48. package/data/manifests/patterns.json +113 -1
  49. package/data/manifests/templates.json +346 -0
  50. package/data/manifests/theme-renacore.json +142 -0
  51. package/data/manifests/theme-vyapti.json +125 -0
  52. package/data/manifests/themes.json +400 -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/package.json +4 -1
@@ -100,8 +100,18 @@
100
100
  "locked": true,
101
101
  "role": "default brand theme",
102
102
  "description": "The default Ceramic theme for The Utopia Studio. It maps semantic roles to Special Black, White, Brick Red, Light Grey, TWK Lausanne, IBM Plex Sans Arabic, square geometry, and border-led depth.",
103
- "bestFor": ["The Utopia Studio products", "Ceramic documentation", "brand-led editorial and operational surfaces"],
104
- "principles": ["architectural hierarchy", "square geometry", "restrained Brick Red emphasis", "border-led elevation", "bilingual Latin and Arabic typography"],
103
+ "bestFor": [
104
+ "The Utopia Studio products",
105
+ "Ceramic documentation",
106
+ "brand-led editorial and operational surfaces"
107
+ ],
108
+ "principles": [
109
+ "architectural hierarchy",
110
+ "square geometry",
111
+ "restrained Brick Red emphasis",
112
+ "border-led elevation",
113
+ "bilingual Latin and Arabic typography"
114
+ ],
105
115
  "brandAsset": {
106
116
  "kind": "wordmark",
107
117
  "src": "/brand/the-utopia-studio-wordmark.avif",
@@ -113,8 +123,18 @@
113
123
  "name": "ثيم The Utopia Studio الافتراضي",
114
124
  "role": "ثيم العلامة الافتراضي",
115
125
  "description": "الثيم الافتراضي لـ Ceramic وThe Utopia Studio. يربط الأدوار الدلالية بألوان العلامة وخطي TWK Lausanne وIBM Plex Sans Arabic والهندسة المربعة والعمق المعتمد على الحدود.",
116
- "bestFor": ["منتجات The Utopia Studio", "توثيق Ceramic", "الأسطح التحريرية والتشغيلية المرتبطة بالعلامة"],
117
- "principles": ["تسلسل معماري", "هندسة مربعة", "إبراز مقيد بلون Brick Red", "ارتفاع يعتمد على الحدود", "طباعة ثنائية للاتينية والعربية"],
126
+ "bestFor": [
127
+ "منتجات The Utopia Studio",
128
+ "توثيق Ceramic",
129
+ "الأسطح التحريرية والتشغيلية المرتبطة بالعلامة"
130
+ ],
131
+ "principles": [
132
+ "تسلسل معماري",
133
+ "هندسة مربعة",
134
+ "إبراز مقيد بلون Brick Red",
135
+ "ارتفاع يعتمد على الحدود",
136
+ "طباعة ثنائية للاتينية والعربية"
137
+ ],
118
138
  "brandAssetUsage": "يمكن للعلامة النصية تعريف الأسطح التابعة لـ The Utopia Studio، لكنها ليست أصلا مطلوبا لمكونات الجوهر."
119
139
  }
120
140
  },
@@ -188,8 +208,17 @@
188
208
  "locked": false,
189
209
  "role": "brand theme",
190
210
  "description": "Dark Blue, Ocean Blue, Charcoal Blue, Timid White. Manrope drives product UI and default headings; Clash Grotesk is marketing-only.",
191
- "bestFor": ["Dextrum product UI", "technical sales surfaces", "data-heavy operational workflows"],
192
- "principles": ["calm technical hierarchy", "blue-led product surfaces", "Manrope product typography", "Lucide icon system"],
211
+ "bestFor": [
212
+ "Dextrum product UI",
213
+ "technical sales surfaces",
214
+ "data-heavy operational workflows"
215
+ ],
216
+ "principles": [
217
+ "calm technical hierarchy",
218
+ "blue-led product surfaces",
219
+ "Manrope product typography",
220
+ "Lucide icon system"
221
+ ],
193
222
  "brandAsset": {
194
223
  "kind": "logo",
195
224
  "src": "/brand/dextrum-logo.svg",
@@ -201,8 +230,17 @@
201
230
  "name": "Dextrum",
202
231
  "role": "ثيم علامة",
203
232
  "description": "ثيم تقني بأزرق داكن وأزرق محيطي وأبيض هادئ. يستخدم Manrope لواجهة المنتج وClash Grotesk للتسويق فقط.",
204
- "bestFor": ["واجهات منتج Dextrum", "أسطح المبيعات التقنية", "سير العمل التشغيلي كثيف البيانات"],
205
- "principles": ["تسلسل تقني هادئ", "أسطح منتج يقودها الأزرق", "طباعة منتج بخط Manrope", "نظام أيقونات Lucide"],
233
+ "bestFor": [
234
+ "واجهات منتج Dextrum",
235
+ "أسطح المبيعات التقنية",
236
+ "سير العمل التشغيلي كثيف البيانات"
237
+ ],
238
+ "principles": [
239
+ "تسلسل تقني هادئ",
240
+ "أسطح منتج يقودها الأزرق",
241
+ "طباعة منتج بخط Manrope",
242
+ "نظام أيقونات Lucide"
243
+ ],
206
244
  "brandAssetUsage": "يستخدم الشعار فقط على الأسطح التابعة لعلامة Dextrum."
207
245
  }
208
246
  },
@@ -278,15 +316,35 @@
278
316
  "locked": false,
279
317
  "role": "brand theme",
280
318
  "description": "Near-black surfaces with warm gold accents, restrained detector lime, domain assurance states, and Hanken Grotesk for product UI. Brand and color mode are selected independently.",
281
- "bestFor": ["Barrier Intelligence product UI", "risk and intelligence workflows", "high-contrast analytical products"],
282
- "principles": ["near-black hierarchy", "warm gold emphasis", "dense analytical surfaces", "Lucide icon system", "independent brand and color mode", "restrained detector and assurance signals"],
319
+ "bestFor": [
320
+ "Barrier Intelligence product UI",
321
+ "risk and intelligence workflows",
322
+ "high-contrast analytical products"
323
+ ],
324
+ "principles": [
325
+ "near-black hierarchy",
326
+ "warm gold emphasis",
327
+ "dense analytical surfaces",
328
+ "Lucide icon system",
329
+ "independent brand and color mode",
330
+ "restrained detector and assurance signals"
331
+ ],
283
332
  "translations": {
284
333
  "ar": {
285
334
  "name": "Barrier Intelligence",
286
335
  "role": "ثيم علامة",
287
336
  "description": "ثيم بأسطح شبه سوداء ولمسات ذهبية دافئة وتسلسل حبر واضح وخط Hanken Grotesk لواجهة المنتج.",
288
- "bestFor": ["واجهات Barrier Intelligence", "سير عمل المخاطر والاستخبارات", "المنتجات التحليلية عالية التباين"],
289
- "principles": ["تسلسل شبه أسود", "إبراز ذهبي دافئ", "أسطح تحليلية كثيفة", "نظام أيقونات Lucide"],
337
+ "bestFor": [
338
+ "واجهات Barrier Intelligence",
339
+ "سير عمل المخاطر والاستخبارات",
340
+ "المنتجات التحليلية عالية التباين"
341
+ ],
342
+ "principles": [
343
+ "تسلسل شبه أسود",
344
+ "إبراز ذهبي دافئ",
345
+ "أسطح تحليلية كثيفة",
346
+ "نظام أيقونات Lucide"
347
+ ],
290
348
  "brandAssetUsage": "تبقى أصول العلامة خارج شريط هيكل Ceramic."
291
349
  }
292
350
  },
@@ -369,6 +427,200 @@
369
427
  "--modal-surface": "#141414",
370
428
  "--popover-surface": "#141414"
371
429
  }
430
+ },
431
+ {
432
+ "id": "renacore",
433
+ "name": "Renacore",
434
+ "shortName": "Renacore",
435
+ "locked": false,
436
+ "role": "brand theme",
437
+ "description": "A calm, precise operational theme for critical energy infrastructure, built from a white product canvas, muted grey structure, and restrained Renacore Teal active states.",
438
+ "motionProfile": "precise",
439
+ "bestFor": [
440
+ "Renacore marketing websites",
441
+ "predictive-intelligence product interfaces",
442
+ "energy infrastructure dashboards"
443
+ ],
444
+ "principles": [
445
+ "quiet",
446
+ "precise",
447
+ "utilitarian",
448
+ "operational"
449
+ ],
450
+ "translations": {
451
+ "ar": {
452
+ "name": "Renacore",
453
+ "role": "ثيم علامة",
454
+ "description": "ثيم تشغيلي هادئ ودقيق للبنية التحتية الحرجة للطاقة، مبني على مساحة بيضاء وهيكل رمادي وإشارات نشطة بلون Renacore Teal.",
455
+ "bestFor": [
456
+ "مواقع Renacore",
457
+ "واجهات الذكاء التنبؤي",
458
+ "لوحات معلومات البنية التحتية للطاقة"
459
+ ],
460
+ "principles": [
461
+ "هادئ",
462
+ "دقيق",
463
+ "عملي",
464
+ "تشغيلي"
465
+ ]
466
+ }
467
+ },
468
+ "brandAsset": {
469
+ "type": "image",
470
+ "src": "/brand/renacore-mark.svg",
471
+ "alt": "Renacore",
472
+ "usage": "Use the eight-part mark for Renacore identity moments. Do not repeat it as a generic interface icon."
473
+ },
474
+ "policyManifest": "packages/design-system/src/manifests/theme-renacore.json",
475
+ "css": "packages/design-system/src/themes/renacore.css",
476
+ "iconSystem": "lucide",
477
+ "values": {
478
+ "--background": "#FFFFFF",
479
+ "--foreground": "#000000",
480
+ "--card": "#F2F2F2",
481
+ "--card-foreground": "#000000",
482
+ "--primary": "#12414B",
483
+ "--primary-foreground": "#FFFFFF",
484
+ "--secondary": "#F2F2F2",
485
+ "--secondary-foreground": "#12414B",
486
+ "--muted": "#F2F2F2",
487
+ "--muted-foreground": "#666666",
488
+ "--border": "#F2F2F2",
489
+ "--input": "#D8D8D8",
490
+ "--ring": "#12414B",
491
+ "--radius": "8px",
492
+ "--radius-control": "6px",
493
+ "--radius-surface": "12px",
494
+ "--radius-chat-bubble": "14px",
495
+ "--radius-chat-composer": "16px",
496
+ "--radius-chat-token": "8px",
497
+ "--shadow-control": "none",
498
+ "--motion-duration-press": "120ms",
499
+ "--motion-duration-page": "300ms",
500
+ "--motion-duration-expand": "260ms",
501
+ "--motion-duration-reveal": "520ms",
502
+ "--motion-duration-icon": "360ms",
503
+ "--motion-ease-standard": "cubic-bezier(0.2, 0, 0, 1)",
504
+ "--motion-ease-emphasized": "cubic-bezier(0.16, 1, 0.3, 1)",
505
+ "--motion-ease-icon": "cubic-bezier(0.16, 1, 0.3, 1)",
506
+ "--motion-press-scale": "0.985",
507
+ "--motion-distance-page": "6px",
508
+ "--motion-distance-reveal": "14px",
509
+ "--font-sans": "Host Grotesk",
510
+ "--font-display": "Host Grotesk",
511
+ "--font-ui-support": "Host Grotesk",
512
+ "--font-marketing-display": "Host Grotesk",
513
+ "--font-arabic": "IBM Plex Sans Arabic",
514
+ "--font-arabic-body": "IBM Plex Sans Arabic",
515
+ "--font-arabic-display": "IBM Plex Sans Arabic",
516
+ "--font-weight-arabic-body": "400",
517
+ "--font-weight-arabic-display": "500",
518
+ "--font-size-display": "clamp(3rem, 7vw, 6.75rem)",
519
+ "--font-size-arabic-body": "16px",
520
+ "--font-size-arabic-body-lg": "18px",
521
+ "--font-size-arabic-display": "clamp(3rem, 7.1vw, 6.8rem)",
522
+ "--line-height-arabic": "1.75",
523
+ "--line-height-arabic-body": "1.75",
524
+ "--line-height-arabic-display": "1.12",
525
+ "--tracking-arabic": "0",
526
+ "--tracking-arabic-display": "0",
527
+ "--sidebar-width": "17rem",
528
+ "--control-height-sm": "2.125rem",
529
+ "--sidebar-width-collapsed": "4rem",
530
+ "--sidebar-min-block-size": "30rem",
531
+ "--sidebar-rail-size": "8px",
532
+ "--button-height": "42px",
533
+ "--card-padding": "24px",
534
+ "--overlay": "rgb(0 0 0 / 65%)",
535
+ "--modal-surface": "#FFFFFF",
536
+ "--popover-surface": "#FFFFFF"
537
+ }
538
+ },
539
+ {
540
+ "id": "vyapti",
541
+ "name": "Vyapti",
542
+ "shortName": "Vyapti",
543
+ "locked": false,
544
+ "role": "brand theme",
545
+ "description": "White-first, deep-green technical theme for calm, precise, evidence-led product and marketing interfaces.",
546
+ "motionProfile": "precise",
547
+ "bestFor": [
548
+ "Vyapti product interfaces",
549
+ "security and cryptography workflows",
550
+ "technical marketing and evidence-led content"
551
+ ],
552
+ "principles": [
553
+ "calm technical hierarchy",
554
+ "white-first product surfaces",
555
+ "semantic green emphasis",
556
+ "spacious sections and compact controls",
557
+ "Arabic-friendly logical layout"
558
+ ],
559
+ "policyManifest": "packages/design-system/src/manifests/theme-vyapti.json",
560
+ "css": "packages/design-system/src/themes/vyapti.css",
561
+ "iconSystem": "lucide",
562
+ "values": {
563
+ "--background": "#FFFFFF",
564
+ "--foreground": "#012519",
565
+ "--card": "#FFFFFF",
566
+ "--card-foreground": "#012519",
567
+ "--primary": "#15B57F",
568
+ "--primary-foreground": "#00140D",
569
+ "--secondary": "#F2F7F4",
570
+ "--secondary-foreground": "#012519",
571
+ "--muted": "#F2F7F4",
572
+ "--muted-foreground": "#5D7066",
573
+ "--border": "rgb(1 37 25 / 10%)",
574
+ "--input": "rgb(1 37 25 / 18%)",
575
+ "--ring": "#0F9B6A",
576
+ "--radius": "10px",
577
+ "--radius-control": "10px",
578
+ "--radius-surface": "18px",
579
+ "--radius-chat-bubble": "18px",
580
+ "--radius-chat-composer": "24px",
581
+ "--radius-chat-token": "14px",
582
+ "--shadow-control": "0 0 0 4px rgb(21 181 127 / 20%)",
583
+ "--motion-duration-press": "100ms",
584
+ "--motion-duration-page": "260ms",
585
+ "--motion-duration-expand": "220ms",
586
+ "--motion-duration-reveal": "320ms",
587
+ "--motion-duration-icon": "280ms",
588
+ "--motion-ease-standard": "cubic-bezier(0.2, 0, 0, 1)",
589
+ "--motion-ease-emphasized": "cubic-bezier(0.16, 1, 0.3, 1)",
590
+ "--motion-ease-icon": "cubic-bezier(0.16, 1, 0.3, 1)",
591
+ "--motion-press-scale": "0.985",
592
+ "--motion-distance-page": "6px",
593
+ "--motion-distance-reveal": "10px",
594
+ "--font-sans": "Inter",
595
+ "--font-display": "Hanken Grotesk",
596
+ "--font-ui-support": "Inter",
597
+ "--font-marketing-display": "Hanken Grotesk",
598
+ "--font-mono": "JetBrains Mono",
599
+ "--font-arabic": "IBM Plex Sans Arabic",
600
+ "--font-arabic-body": "IBM Plex Sans Arabic",
601
+ "--font-arabic-display": "IBM Plex Sans Arabic",
602
+ "--font-weight-arabic-body": "400",
603
+ "--font-weight-arabic-display": "700",
604
+ "--font-size-display": "clamp(2.35rem, 6vw, 4.75rem)",
605
+ "--font-size-arabic-body": "16px",
606
+ "--font-size-arabic-body-lg": "18px",
607
+ "--font-size-arabic-display": "clamp(2.25rem, 5.7vw, 4.5rem)",
608
+ "--line-height-arabic": "1.75",
609
+ "--line-height-arabic-body": "1.75",
610
+ "--line-height-arabic-display": "1.16",
611
+ "--tracking-arabic": "0",
612
+ "--tracking-arabic-display": "0",
613
+ "--sidebar-width": "17rem",
614
+ "--control-height-sm": "2rem",
615
+ "--sidebar-width-collapsed": "4rem",
616
+ "--sidebar-min-block-size": "30rem",
617
+ "--sidebar-rail-size": "8px",
618
+ "--button-height": "40px",
619
+ "--card-padding": "24px",
620
+ "--overlay": "rgb(0 20 13 / 72%)",
621
+ "--modal-surface": "#FFFFFF",
622
+ "--popover-surface": "#FFFFFF"
623
+ }
372
624
  }
373
625
  ],
374
626
  "plannedThemeSlots": [
@@ -377,44 +629,164 @@
377
629
  "name": "Venture Proof",
378
630
  "status": "planned",
379
631
  "purpose": "Portfolio and company proof surfaces.",
380
- "audience": ["venture studios", "portfolios", "company profiles"],
632
+ "audience": [
633
+ "venture studios",
634
+ "portfolios",
635
+ "company profiles"
636
+ ],
381
637
  "visualDirection": "Editorial proof hierarchy with strong media, concise evidence, and calm navigation.",
382
- "semanticExtensions": ["--proof-accent", "--proof-media-surface", "--proof-metric-foreground"],
383
- "requiredValidation": ["case-study density", "mixed media ratios", "Arabic company profiles", "LTR and RTL carousels"],
384
- "translations": { "ar": { "name": "إثبات المشاريع", "purpose": "أسطح للمحافظ وإثبات الشركات.", "audience": ["استوديوهات المشاريع", "المحافظ", "ملفات الشركات"], "visualDirection": "تسلسل تحريري للأدلة مع وسائط قوية وأدلة مختصرة وتنقل هادئ.", "requiredValidation": ["كثافة دراسات الحالة", "نسب الوسائط المختلطة", "ملفات شركات عربية", "عارضات شرائح LTR وRTL"] } }
638
+ "semanticExtensions": [
639
+ "--proof-accent",
640
+ "--proof-media-surface",
641
+ "--proof-metric-foreground"
642
+ ],
643
+ "requiredValidation": [
644
+ "case-study density",
645
+ "mixed media ratios",
646
+ "Arabic company profiles",
647
+ "LTR and RTL carousels"
648
+ ],
649
+ "translations": {
650
+ "ar": {
651
+ "name": "إثبات المشاريع",
652
+ "purpose": "أسطح للمحافظ وإثبات الشركات.",
653
+ "audience": [
654
+ "استوديوهات المشاريع",
655
+ "المحافظ",
656
+ "ملفات الشركات"
657
+ ],
658
+ "visualDirection": "تسلسل تحريري للأدلة مع وسائط قوية وأدلة مختصرة وتنقل هادئ.",
659
+ "requiredValidation": [
660
+ "كثافة دراسات الحالة",
661
+ "نسب الوسائط المختلطة",
662
+ "ملفات شركات عربية",
663
+ "عارضات شرائح LTR وRTL"
664
+ ]
665
+ }
666
+ }
385
667
  },
386
668
  {
387
669
  "id": "operator",
388
670
  "name": "Operator Console",
389
671
  "status": "planned",
390
672
  "purpose": "Dense product and internal tool interfaces.",
391
- "audience": ["operators", "internal tools", "admin products"],
673
+ "audience": [
674
+ "operators",
675
+ "internal tools",
676
+ "admin products"
677
+ ],
392
678
  "visualDirection": "High-density operational hierarchy with compact controls and clear exception states.",
393
- "semanticExtensions": ["--operator-density", "--operator-row-height", "--operator-exception"],
394
- "requiredValidation": ["dense tables", "keyboard navigation", "Arabic filters", "RTL side navigation"],
395
- "translations": { "ar": { "name": "وحدة المشغّل", "purpose": "واجهات كثيفة للمنتجات والأدوات الداخلية.", "audience": ["المشغّلون", "الأدوات الداخلية", "منتجات الإدارة"], "visualDirection": "تسلسل تشغيلي عالي الكثافة مع عناصر تحكم مختصرة وحالات استثناء واضحة.", "requiredValidation": ["الجداول الكثيفة", "التنقل بلوحة المفاتيح", "مرشحات عربية", "تنقل جانبي RTL"] } }
679
+ "semanticExtensions": [
680
+ "--operator-density",
681
+ "--operator-row-height",
682
+ "--operator-exception"
683
+ ],
684
+ "requiredValidation": [
685
+ "dense tables",
686
+ "keyboard navigation",
687
+ "Arabic filters",
688
+ "RTL side navigation"
689
+ ],
690
+ "translations": {
691
+ "ar": {
692
+ "name": "وحدة المشغّل",
693
+ "purpose": "واجهات كثيفة للمنتجات والأدوات الداخلية.",
694
+ "audience": [
695
+ "المشغّلون",
696
+ "الأدوات الداخلية",
697
+ "منتجات الإدارة"
698
+ ],
699
+ "visualDirection": "تسلسل تشغيلي عالي الكثافة مع عناصر تحكم مختصرة وحالات استثناء واضحة.",
700
+ "requiredValidation": [
701
+ "الجداول الكثيفة",
702
+ "التنقل بلوحة المفاتيح",
703
+ "مرشحات عربية",
704
+ "تنقل جانبي RTL"
705
+ ]
706
+ }
707
+ }
396
708
  },
397
709
  {
398
710
  "id": "editorial",
399
711
  "name": "Editorial Resource",
400
712
  "status": "planned",
401
713
  "purpose": "Resource articles and technical guides.",
402
- "audience": ["documentation teams", "research publishers", "technical resources"],
714
+ "audience": [
715
+ "documentation teams",
716
+ "research publishers",
717
+ "technical resources"
718
+ ],
403
719
  "visualDirection": "Reading-first typography with restrained navigation, annotations, code, and media.",
404
- "semanticExtensions": ["--editorial-measure", "--editorial-note", "--editorial-code-surface"],
405
- "requiredValidation": ["long-form reading", "code overflow", "Arabic article rhythm", "bilingual tables of contents"],
406
- "translations": { "ar": { "name": "المورد التحريري", "purpose": "مقالات الموارد والأدلة التقنية.", "audience": ["فرق التوثيق", "ناشرو الأبحاث", "الموارد التقنية"], "visualDirection": "طباعة تضع القراءة أولا مع تنقل هادئ وملاحظات وكود ووسائط.", "requiredValidation": ["قراءة المحتوى الطويل", "تجاوز الكود", "إيقاع المقال العربي", "جداول محتويات ثنائية اللغة"] } }
720
+ "semanticExtensions": [
721
+ "--editorial-measure",
722
+ "--editorial-note",
723
+ "--editorial-code-surface"
724
+ ],
725
+ "requiredValidation": [
726
+ "long-form reading",
727
+ "code overflow",
728
+ "Arabic article rhythm",
729
+ "bilingual tables of contents"
730
+ ],
731
+ "translations": {
732
+ "ar": {
733
+ "name": "المورد التحريري",
734
+ "purpose": "مقالات الموارد والأدلة التقنية.",
735
+ "audience": [
736
+ "فرق التوثيق",
737
+ "ناشرو الأبحاث",
738
+ "الموارد التقنية"
739
+ ],
740
+ "visualDirection": "طباعة تضع القراءة أولا مع تنقل هادئ وملاحظات وكود ووسائط.",
741
+ "requiredValidation": [
742
+ "قراءة المحتوى الطويل",
743
+ "تجاوز الكود",
744
+ "إيقاع المقال العربي",
745
+ "جداول محتويات ثنائية اللغة"
746
+ ]
747
+ }
748
+ }
407
749
  },
408
750
  {
409
751
  "id": "application",
410
752
  "name": "Application Flow",
411
753
  "status": "planned",
412
754
  "purpose": "Forms, eligibility, conversion, and onboarding flows.",
413
- "audience": ["applications", "onboarding", "eligibility and conversion flows"],
755
+ "audience": [
756
+ "applications",
757
+ "onboarding",
758
+ "eligibility and conversion flows"
759
+ ],
414
760
  "visualDirection": "Trustworthy step-by-step interaction with strong progress, validation, and recovery states.",
415
- "semanticExtensions": ["--flow-progress", "--flow-validation", "--flow-review-surface"],
416
- "requiredValidation": ["multi-step recovery", "localized validation", "Arabic forms", "RTL progress order"],
417
- "translations": { "ar": { "name": "مسار التقديم", "purpose": "النماذج والأهلية والتحويل ومسارات الانضمام.", "audience": ["طلبات التقديم", "الانضمام", "مسارات الأهلية والتحويل"], "visualDirection": "تفاعل موثوق خطوة بخطوة مع حالات واضحة للتقدم والتحقق والاستعادة.", "requiredValidation": ["استعادة المسارات متعددة الخطوات", "تحقق موضّع", "نماذج عربية", "ترتيب تقدم RTL"] } }
761
+ "semanticExtensions": [
762
+ "--flow-progress",
763
+ "--flow-validation",
764
+ "--flow-review-surface"
765
+ ],
766
+ "requiredValidation": [
767
+ "multi-step recovery",
768
+ "localized validation",
769
+ "Arabic forms",
770
+ "RTL progress order"
771
+ ],
772
+ "translations": {
773
+ "ar": {
774
+ "name": "مسار التقديم",
775
+ "purpose": "النماذج والأهلية والتحويل ومسارات الانضمام.",
776
+ "audience": [
777
+ "طلبات التقديم",
778
+ "الانضمام",
779
+ "مسارات الأهلية والتحويل"
780
+ ],
781
+ "visualDirection": "تفاعل موثوق خطوة بخطوة مع حالات واضحة للتقدم والتحقق والاستعادة.",
782
+ "requiredValidation": [
783
+ "استعادة المسارات متعددة الخطوات",
784
+ "تحقق موضّع",
785
+ "نماذج عربية",
786
+ "ترتيب تقدم RTL"
787
+ ]
788
+ }
789
+ }
418
790
  }
419
791
  ],
420
792
  "arabicFriendly": {
@@ -0,0 +1,107 @@
1
+ import * as React from 'react'
2
+ import { Button } from '@utopia-studio-design/design-system/Button'
3
+ import {
4
+ ChartRoot,
5
+ type ChartAnnotationDefinition,
6
+ type ChartDatum,
7
+ type ChartSeriesDefinition,
8
+ type ChartState,
9
+ type ChartType,
10
+ } from '@utopia-studio-design/design-system/Charts'
11
+ import './analytics-dashboard.css'
12
+
13
+ export {
14
+ KPIGrid,
15
+ type KPIGridProps,
16
+ type MetricDefinition,
17
+ } from './AnalyticsMetricBlocks'
18
+
19
+ export interface AnalyticsChartCardProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
20
+ annotations?: ChartAnnotationDefinition[]
21
+ data: ChartDatum[]
22
+ description?: React.ReactNode
23
+ direction?: 'ltr' | 'rtl'
24
+ series: ChartSeriesDefinition[]
25
+ showDataTable?: boolean
26
+ state?: ChartState
27
+ title: React.ReactNode
28
+ type?: ChartType
29
+ }
30
+
31
+ export function AnalyticsChartCard({
32
+ annotations = [],
33
+ data,
34
+ description,
35
+ direction,
36
+ series,
37
+ showDataTable,
38
+ state,
39
+ title,
40
+ type,
41
+ ...props
42
+ }: AnalyticsChartCardProps) {
43
+ return (
44
+ <ChartRoot
45
+ accessibleSummary={`${String(title)} across ${data.length} periods. Use the chart explorer or data table for exact values.`}
46
+ annotations={annotations}
47
+ axis={{ showGrid: true }}
48
+ data={data}
49
+ description={description}
50
+ direction={direction}
51
+ series={series}
52
+ showDataTable={showDataTable}
53
+ state={state}
54
+ title={title}
55
+ type={type}
56
+ {...props}
57
+ />
58
+ )
59
+ }
60
+
61
+ export interface ComparisonChartPanelProps extends AnalyticsChartCardProps {
62
+ benchmarkLabel?: string
63
+ benchmarkValue?: number
64
+ }
65
+
66
+ export function ComparisonChartPanel({
67
+ benchmarkLabel = 'Target',
68
+ benchmarkValue,
69
+ annotations = [],
70
+ ...props
71
+ }: ComparisonChartPanelProps) {
72
+ const nextAnnotations = benchmarkValue === undefined
73
+ ? annotations
74
+ : [
75
+ ...annotations,
76
+ { id: 'benchmark', label: benchmarkLabel, value: benchmarkValue, tone: 'neutral' as const },
77
+ ]
78
+ return <AnalyticsChartCard annotations={nextAnnotations} {...props} />
79
+ }
80
+
81
+ export function ChartWithDataTable(props: AnalyticsChartCardProps) {
82
+ return <AnalyticsChartCard {...props} showDataTable />
83
+ }
84
+
85
+ export interface AnalyticsDashboardHeaderProps extends React.HTMLAttributes<HTMLElement> {
86
+ onRefresh?: () => void
87
+ periodLabel: string
88
+ title: string
89
+ }
90
+
91
+ export function AnalyticsDashboardHeader({
92
+ onRefresh,
93
+ periodLabel,
94
+ title,
95
+ ...props
96
+ }: AnalyticsDashboardHeaderProps) {
97
+ return (
98
+ <header className="ceramic-analytics-header" {...props}>
99
+ <div>
100
+ <span>Analytics dashboard</span>
101
+ <h1>{title}</h1>
102
+ <p>{periodLabel}</p>
103
+ </div>
104
+ <Button variant="outline" onClick={onRefresh}>Refresh data</Button>
105
+ </header>
106
+ )
107
+ }