@utopia-studio-design/design-system-cli 0.6.2 → 0.7.1

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 (124) hide show
  1. package/README.md +28 -14
  2. package/bin/utopia-ds-mcp.mjs +6 -2
  3. package/bin/utopia-ds.mjs +94 -21
  4. package/data/docs/arabic-friendly.md +19 -2
  5. package/data/docs/billing-setup.md +80 -0
  6. package/data/docs/cer-003-032-033-round-8-repair.md +41 -0
  7. package/data/docs/cer-007-checkout.md +51 -0
  8. package/data/docs/cer-008-011-qa-repair.md +64 -0
  9. package/data/docs/cer-016-023-round-6-repair.md +92 -0
  10. package/data/docs/cer-024-031-round-7-repair.md +51 -0
  11. package/data/docs/cer-033-035-036-round-12-repair.md +37 -0
  12. package/data/docs/cer-035-037-round-10-repair.md +34 -0
  13. package/data/docs/ceramic-release-2026-09-06.md +11 -0
  14. package/data/docs/charts.md +34 -3
  15. package/data/docs/chat-service-methodology.md +181 -0
  16. package/data/docs/code-block.md +20 -0
  17. package/data/docs/creative-production.md +149 -0
  18. package/data/docs/designer-agent-backend-contract.md +552 -0
  19. package/data/docs/email-resend.md +29 -0
  20. package/data/docs/foundations.md +46 -8
  21. package/data/docs/guide.md +9 -9
  22. package/data/docs/handover-billing-aiden.md +132 -0
  23. package/data/docs/logo-maker-methodology.md +109 -0
  24. package/data/docs/presentation-asset-repository.md +53 -0
  25. package/data/docs/product-architecture.md +42 -0
  26. package/data/docs/quick-start-ai.md +4 -4
  27. package/data/docs/shadcn-conversion.md +1 -1
  28. package/data/docs/sidebar-placement.md +56 -0
  29. package/data/docs/theme-authoring.md +6 -3
  30. package/data/manifests/catalog.json +42 -46
  31. package/data/manifests/components.json +317 -66
  32. package/data/manifests/logo-skills.json +174 -0
  33. package/data/manifests/motion-profiles.json +2 -2
  34. package/data/manifests/patterns.json +201 -7
  35. package/data/manifests/presentation-assets.schema.json +44 -0
  36. package/data/manifests/templates.json +87 -1
  37. package/data/manifests/theme-dextrum.json +7 -7
  38. package/data/manifests/theme-prism-mono.json +19 -0
  39. package/data/manifests/theme-utopia-cloudblur.json +135 -0
  40. package/data/manifests/theme-utopia-default.json +31 -31
  41. package/data/manifests/theme-vyapti.json +17 -1
  42. package/data/manifests/theme-y2k-pop.json +18 -0
  43. package/data/manifests/themes.json +285 -57
  44. package/data/templates/analytics-dashboard/main.tsx +14 -1
  45. package/data/templates/calendar-application/main.tsx +14 -1
  46. package/data/templates/chat-workspace/README.md +12 -0
  47. package/data/templates/chat-workspace/index.html +11 -0
  48. package/data/templates/chat-workspace/main.tsx +97 -0
  49. package/data/templates/chat-workspace/styles.css +19 -0
  50. package/data/templates/chat-workspace/template.manifest.json +13 -0
  51. package/data/templates/composition-registry-lab/main.tsx +12 -1
  52. package/data/templates/dashboard-composer/main.tsx +14 -1
  53. package/data/templates/database-workspace/main.tsx +14 -1
  54. package/data/templates/interaction-lab/main.tsx +12 -1
  55. package/data/templates/quantum-verification-story/README.md +12 -0
  56. package/data/templates/quantum-verification-story/components.json +21 -0
  57. package/data/templates/quantum-verification-story/eslint.config.mjs +13 -0
  58. package/data/templates/quantum-verification-story/next-env.d.ts +7 -0
  59. package/data/templates/quantum-verification-story/next.config.mjs +11 -0
  60. package/data/templates/quantum-verification-story/package-lock.json +7535 -0
  61. package/data/templates/quantum-verification-story/package.json +46 -0
  62. package/data/templates/quantum-verification-story/postcss.config.js +6 -0
  63. package/data/templates/quantum-verification-story/src/app/assessment/page.tsx +138 -0
  64. package/data/templates/quantum-verification-story/src/app/ceramic-theme.css +48 -0
  65. package/data/templates/quantum-verification-story/src/app/deployment/page.tsx +178 -0
  66. package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Bold.ttf +0 -0
  67. package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Medium.ttf +0 -0
  68. package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Regular.ttf +0 -0
  69. package/data/templates/quantum-verification-story/src/app/fonts/ReadexPro-Variable.ttf +0 -0
  70. package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-350.ttf +0 -0
  71. package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-500.ttf +0 -0
  72. package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-700.ttf +0 -0
  73. package/data/templates/quantum-verification-story/src/app/globals.css +175 -0
  74. package/data/templates/quantum-verification-story/src/app/layout.tsx +45 -0
  75. package/data/templates/quantum-verification-story/src/app/not-found.tsx +39 -0
  76. package/data/templates/quantum-verification-story/src/app/page.tsx +24 -0
  77. package/data/templates/quantum-verification-story/src/app/products/page.tsx +132 -0
  78. package/data/templates/quantum-verification-story/src/app/utopia-default.css +312 -0
  79. package/data/templates/quantum-verification-story/src/components/RotatingText.css +36 -0
  80. package/data/templates/quantum-verification-story/src/components/RotatingText.tsx +189 -0
  81. package/data/templates/quantum-verification-story/src/components/brand-mark.tsx +14 -0
  82. package/data/templates/quantum-verification-story/src/components/console-preview-section.tsx +57 -0
  83. package/data/templates/quantum-verification-story/src/components/console-preview.tsx +72 -0
  84. package/data/templates/quantum-verification-story/src/components/fade-up.tsx +54 -0
  85. package/data/templates/quantum-verification-story/src/components/floating-network.tsx +125 -0
  86. package/data/templates/quantum-verification-story/src/components/footer.tsx +83 -0
  87. package/data/templates/quantum-verification-story/src/components/harvest-timeline.tsx +70 -0
  88. package/data/templates/quantum-verification-story/src/components/lattice-diagram.tsx +73 -0
  89. package/data/templates/quantum-verification-story/src/components/lattice-field.tsx +129 -0
  90. package/data/templates/quantum-verification-story/src/components/nav.tsx +104 -0
  91. package/data/templates/quantum-verification-story/src/components/presentation-layout.tsx +91 -0
  92. package/data/templates/quantum-verification-story/src/components/readiness-estimator.tsx +135 -0
  93. package/data/templates/quantum-verification-story/src/components/scramble-text.tsx +60 -0
  94. package/data/templates/quantum-verification-story/src/components/section-backdrop.tsx +38 -0
  95. package/data/templates/quantum-verification-story/src/components/sections/clients.tsx +140 -0
  96. package/data/templates/quantum-verification-story/src/components/sections/contact.tsx +125 -0
  97. package/data/templates/quantum-verification-story/src/components/sections/hero.tsx +92 -0
  98. package/data/templates/quantum-verification-story/src/components/sections/moat.tsx +73 -0
  99. package/data/templates/quantum-verification-story/src/components/sections/offer.tsx +113 -0
  100. package/data/templates/quantum-verification-story/src/components/sections/pilot.tsx +63 -0
  101. package/data/templates/quantum-verification-story/src/components/sections/problem.tsx +53 -0
  102. package/data/templates/quantum-verification-story/src/components/text-particle.tsx +204 -0
  103. package/data/templates/quantum-verification-story/src/components/ticker.tsx +27 -0
  104. package/data/templates/quantum-verification-story/src/components/ui/badge.tsx +29 -0
  105. package/data/templates/quantum-verification-story/src/components/ui/button.tsx +55 -0
  106. package/data/templates/quantum-verification-story/src/components/ui/card.tsx +46 -0
  107. package/data/templates/quantum-verification-story/src/components/ui/cursor-driven-particle-typography.tsx +288 -0
  108. package/data/templates/quantum-verification-story/src/components/ui/input.tsx +20 -0
  109. package/data/templates/quantum-verification-story/src/components/ui/label.tsx +21 -0
  110. package/data/templates/quantum-verification-story/src/components/ui/separator.tsx +25 -0
  111. package/data/templates/quantum-verification-story/src/components/ui/textarea.tsx +19 -0
  112. package/data/templates/quantum-verification-story/src/lib/utils.ts +6 -0
  113. package/data/templates/quantum-verification-story/tailwind.config.js +95 -0
  114. package/data/templates/quantum-verification-story/template.manifest.json +23 -0
  115. package/data/templates/quantum-verification-story/tsconfig.json +42 -0
  116. package/data/templates/saas-solution-homepage/main.tsx +91 -14
  117. package/data/templates/saas-solution-homepage/privacy/index.html +1 -0
  118. package/data/templates/saas-solution-homepage/styles.css +47 -2
  119. package/data/templates/saas-solution-homepage/team/index.html +1 -0
  120. package/data/templates/saas-solution-homepage/template.manifest.json +41 -0
  121. package/data/templates/saas-solution-homepage/terms/index.html +1 -0
  122. package/lib/api.mjs +52 -3
  123. package/lib/template-runtime.mjs +56 -0
  124. package/package.json +2 -2
@@ -2,6 +2,33 @@
2
2
 
3
3
  Foundations define the semantic contract for humans, AI agents, themes, and reusable components. Components consume roles. Themes map those roles to visual primitives. The design-system app renders these pages at `/docs/foundations/*`.
4
4
 
5
+ ## Non-negotiable premises
6
+
7
+ 1. **Everything is semantic.** Every visible element must express its meaning, role, state, hierarchy, and layout intent through a registered token, component, `data-slot`, state attribute, or composition pattern.
8
+ 2. **Pages only compose.** Pages own content, routing, data binding, and orchestration. They do not own CSS, raw visual primitives, or theme decisions.
9
+ 3. **Visual ownership flows in one direction.** Semantic tokens → components and registered patterns → page composition. Themes map those roles to brand expression without changing their meaning.
10
+ 4. **A missing semantic role is a contract gap.** Do not patch the page. Extend the design-system contract, document it, register it, and then consume it.
11
+ 5. **Product surfaces are not marketing pages.** In tools, rooms, consoles, setup flows, and agent workspaces, names identify the current object rather than acting as campaign headlines. Keep them within the product heading scale. Remove decorative kickers, readiness slogans, oversized editorial type, and promotional prose unless they communicate a real state or action.
12
+
13
+ Interactive elements follow the same ownership rule. Actions use the registered `Button`, `IconButton`, or selection-control pattern. A navigation CTA keeps an anchor or router link as its single semantic root and receives Button behavior through `Button asChild`. Pages must not style a raw `<a>` or `<button>` with local CSS to imitate a design-system control.
14
+
15
+ The static gate `npm run audit:semantic-pages` rejects CSS files and CSS imports under `src/pages/`. Registered patterns may own CSS, but their consumers must use token roles. `npm run audit:workspace-setup` enforces that rule for workspace setup, including its external identity token and registered responsive breakpoints.
16
+
17
+ Registered workflow compositions include `brand-room-empty-start` and `designer-agent-workbench`. A new Brand Room keeps compact identity, empty-state truth, first action, and setup sequence in one surface without turning the brand name or empty-state copy into a marketing hero. The designer workbench keeps journey, conversation, and created artifacts in one hierarchy; future stages never appear in the artifact register as if they already exist. Agent activity appears inside the conversation as a truthful projection of durable queued, running, checkpointed, approved, completed, or failed server events. It never claims a file read, edit, command, provider call, or external write that did not occur. Durable generated results resolve in the context/output rail. Their CSS and breakpoint contracts live in `src/patterns/`, while pages supply localized content and state only.
18
+
19
+ Teams building assistant, support, or collaborative chat products use the
20
+ [Ceramic chat service methodology](./chat-service-methodology.md). Managed chat
21
+ workspaces resolve scrolling, live-edge following, compact tool disclosure,
22
+ composer behavior, output separation, localization, and QA through the shared
23
+ Chat contract rather than page-local implementations.
24
+
25
+ ## Ceramic Brand Identity Contract
26
+
27
+ - `/brand/ceramic-logo.svg` is the canonical Ceramic logo for every product, documentation, authentication, navigation, loading, promotional, and agent-selection surface.
28
+ - Preserve the wordmark's aspect ratio and Brick Red artwork. Scale the registered asset; do not redraw, recolor, crop, or substitute a symbol, monogram, generic icon, or generated mark.
29
+ - Decorative repetitions use `alt=""` or `aria-hidden="true"`. A logo that identifies its surface uses the accessible name `Ceramic`.
30
+ - Retired Ceramic symbols may remain as archival source files, but they are not approved interface assets and must not be referenced by production UI.
31
+
5
32
  ## Foundation Pages
6
33
 
7
34
  - `All Tokens`: complete semantic contract and required roles.
@@ -16,10 +43,13 @@ Foundations define the semantic contract for humans, AI agents, themes, and reus
16
43
 
17
44
  ## Token Contract
18
45
 
19
- - Use semantic roles such as `--background`, `--foreground`, `--primary`, `--secondary`, `--surface`, `--surface-elevated`, `--border`, `--ring`, `--radius-control`, `--radius-surface`, `--font-sans`, `--font-arabic-body`, and `--font-arabic-display`.
46
+ - Use semantic roles such as `--background`, `--foreground`, `--primary`, `--secondary`, `--surface`, `--surface-elevated`, `--border`, `--ring`, `--radius-control`, `--radius-surface`, `--font-sans`, `--font-size-page-title`, `--line-height-page-title`, `--font-arabic-body`, and `--font-arabic-display`.
47
+ - Dense product tools use the workspace role family: `--font-size-workspace-title`, `--font-size-workspace-body`, `--font-size-workspace-label`, `--line-height-workspace-body`, `--workspace-row-min-block-size`, `--workspace-panel-padding`, `--workspace-content-max-inline-size`, `--workspace-composer-min-block-size`, and `--workspace-context-rail-min-inline-size`. Agent consoles, editors, and operations workspaces consume these roles instead of introducing page-local type or spacing scales. `ChatLayout density="compact"` opts a persistent workspace conversation into the same contract without changing standalone chat defaults; generated work uses the context-rail minimum so preview, status, and review actions do not compete for space.
20
48
  - Do not hardcode Utopia Default primitives such as Brick Red, Special Black, TWK Lausanne, or IBM Plex Sans Arabic inside reusable components.
21
49
  - Use logical CSS properties: `padding-inline`, `margin-inline`, `border-inline`, `inset-inline`, `block-size`, and `inline-size`.
22
50
  - Use start/end API names instead of left/right names.
51
+ - Reusable layout widths consume container roles such as `--container-narrow`, `--container-compact`, `--container-standard`, and `--container-wide`.
52
+ - CSS media queries cannot interpolate custom properties. Pattern breakpoint literals therefore live in an adjacent `*.contract.json` registry and must pass the pattern audit; an unregistered breakpoint is a contract violation.
23
53
 
24
54
  ## Color Contract
25
55
 
@@ -63,7 +93,7 @@ Arabic display sizing should follow the Latin display scale at about 95%, rather
63
93
  - Controls consume `--radius-control`.
64
94
  - Cards, dialogs, popovers, and other framed surfaces consume `--radius-surface`.
65
95
  - Avatars, pills, and circular affordances may consume a round role when present.
66
- - Control dimensions use size roles such as `--size-control-sm`, `--size-control-md`, and `--size-control-lg`.
96
+ - In published 0.8.2, Button dimensions use `--button-height-sm`, `--button-height`, and `--button-height-lg`; inputs use `--input-height`. Prefer the registered component size API.
67
97
  - Borders use semantic width/style roles such as `--border-width-hairline`, `--border-width-focus`, and `--border-style-default`.
68
98
  - Utopia Default can be square. Future themes may be rounded without component rewrites.
69
99
 
@@ -74,12 +104,14 @@ Arabic display sizing should follow the Latin display scale at about 95%, rather
74
104
  - Runtime recipes use four engine-neutral intents: `feedback`, `page`, `surface`, and `layout`.
75
105
  - Components consume `--motion-duration-*` and `--motion-ease-*` roles rather than hardcoded milliseconds or easing curves.
76
106
  - `MotionProvider` sets the theme profile and runtime adapter for a subtree. Motion-aware components expose `motion?: boolean` for a local override.
107
+ - Ceramic React applications use the Framer Motion adapter by default for layout reflow, shared-layout, drag, and gesture transitions. These transitions still consume the active semantic recipe from `MotionProvider`; application code must not introduce private timing or easing values.
108
+ - CSS transitions remain appropriate for local hover, focus, color, and other state-only micro-interactions. The design-system core stays engine-neutral so non-React consumers can use the built-in WAAPI adapter.
77
109
  - `MotionProvider asChild` applies that policy to exactly one semantic subtree root without adding a wrapper. The consumer root must accept `className`, `style`, `data-*`, and its children.
78
110
  - `motion={false}` and `prefers-reduced-motion: reduce` disable decorative movement while preserving state changes and accessibility.
79
111
  - Directional motion follows logical inline start/end and mirrors in RTL when direction carries meaning.
80
112
  - Icon motion follows the action: a bell swings from its top, download moves downward, and copy snaps once. Do not apply a generic bounce.
81
113
  - `utopia-default` uses the `ceremonial` profile, `dextrum` uses `swift`, and both `barrier-intelligence` and `renacore` use `precise`.
82
- - WAAPI is built in. Motion for React, Anime.js, and GSAP are optional peer adapters, so unused engines do not need to ship with an application.
114
+ - WAAPI is built in. Framer Motion is the default React adapter; Anime.js and GSAP remain optional peer adapters, so unused engines do not need to ship with an application.
83
115
 
84
116
  ```tsx
85
117
  import { getMotionThemeProfile, MotionProvider } from '@utopia-studio-design/design-system/Motion'
@@ -121,8 +153,9 @@ The engine-neutral registry is published as `manifests/motion-profiles.json`. It
121
153
 
122
154
  - Core owns icon slots, icon-only controls, labels, and accessibility.
123
155
  - Theme manifests own icon philosophy and icon style.
124
- - Use `lucide-react` as the default shadcn/ui icon baseline for examples and previews.
125
- - Use `PhosphorIcon` when a product selects the Phosphor family. Import individual
156
+ - Existing core components may keep their documented Lucide defaults, but theme-facing examples must follow the active theme policy.
157
+ - `utopia-default` and `utopia-cloudblur` select Phosphor Icons for interface actions and navigation.
158
+ - Use `PhosphorIcon` on those themed surfaces. Import individual
126
159
  `*Icon` exports from `@phosphor-icons/react` so bundlers can tree-shake unused icons.
127
160
  - `PhosphorIcon` uses `currentColor` and `--icon-size-xs|sm|md`; do not pass raw
128
161
  color or pixel sizes.
@@ -149,9 +182,10 @@ export function IconExamples() {
149
182
  }
150
183
  ```
151
184
 
152
- Phosphor is an additional supported family, not a silent replacement for
153
- Lucide-based component internals. Breadcrumb separators and existing Ceramic
154
- navigation defaults keep their documented icon contracts.
185
+ Selecting Phosphor at the theme layer does not silently rewrite Lucide-based
186
+ component internals. Compose Phosphor through the documented icon slots;
187
+ Breadcrumb separators and existing Ceramic navigation defaults keep their
188
+ documented contracts until their icon slot is explicitly supplied.
155
189
 
156
190
  ## Illustration Contract
157
191
 
@@ -201,3 +235,7 @@ All Tokens and the Arabic Friendly page must include or link to these RTL previe
201
235
  - Side navigation
202
236
 
203
237
  Individual Foundation pages should show a compact Arabic / RTL check instead of repeating the full product mockups.
238
+
239
+ ## Scrolling without scrollbar chrome
240
+
241
+ Ceramic preserves native overflow scrolling while hiding scrollbar chrome globally, on both axes and during hover/focus. Do not use `scrollbar-width: thin`, reveal-on-hover scrollbars, or disable scrolling to hide a bar. Horizontal tabs must remain reachable through keyboard navigation and touch/trackpad scrolling. This contract is registered as `scroll-without-chrome` in the patterns manifest.
@@ -6,14 +6,13 @@ Guide pages are the operating layer of Ceramic. They define how humans and AI ag
6
6
 
7
7
  - `Getting Started`: installation, theme CSS, first component, examples, CLI discovery, Arabic-friendly entrypoint.
8
8
  - `What's New`: release notes for package, manifest, theme, and docs changes.
9
- - `Quick Start with AI`: dense setup workflow for AI coding tools.
10
- - `Working with AI`: how manifests, docs, and examples stay machine-readable.
11
- - `Principles`: semantic-first, shadcn-founded, theme-extensible, Arabic-friendly, AI-readable rules.
12
- - `Theme System`: required semantic roles, Utopia Default as first theme, and future theme boundaries.
9
+ - `Create a Theme`: scaffold a theme, define brand primitives, map Ceramic semantic roles, document visual policy, and verify compatibility.
10
+ - `Use Templates`: discover a reviewed starter, inspect its contract, copy it with a theme, connect product-owned data, and validate the standalone result.
13
11
  - `Arabic Friendly`: RTL-first layout, Arabic typography, mixed-script resilience, localization readiness, and icon/motion mirroring.
14
- - `Styling Components`: safe component styling through semantic tokens and app-layer className.
15
- - `Styling Library Interop`: Tailwind, plain CSS, CSS modules, and CSS-in-JS bridges through Ceramic CSS variables.
16
- - `Migration Guide`: safe migration from app-local UI or raw shadcn usage into `packages/design-system`.
12
+ - `Token System`: an architecture overview connecting theme-owned Token Values to selected Semantic Tokens and Ceramic components, followed by focused color, type, spacing, shape, motion, and elevation guidance.
13
+ - `Icons`: supported icon libraries, accessibility, and mirroring rules.
14
+ - `Illustrations`: intentional media usage and text-first localization rules.
15
+ - `Packages & CLI`: package entrypoints, CLI discovery, and the shadcn/ui foundation.
17
16
 
18
17
  ## Guide Contract
19
18
 
@@ -89,8 +88,9 @@ import {
89
88
 
90
89
  ## Phosphor Icon Composition
91
90
 
92
- Phosphor is an optional supported icon family. It does not replace Lucide-based
93
- defaults inside existing Ceramic components.
91
+ Phosphor is the selected icon family for The Utopia Studio and Utopia Cloudblur.
92
+ It is composed through Ceramic icon slots and does not silently replace
93
+ Lucide-based defaults inside existing components.
94
94
 
95
95
  ```tsx
96
96
  import { GearIcon } from '@phosphor-icons/react'
@@ -0,0 +1,132 @@
1
+ # Handover: Ceramic billing (Clerk + Convex + Polar)
2
+
3
+ **Branch:** `feature/kp-work`
4
+ **For:** Aiden
5
+ **Site:** https://design.utopia-studio.co
6
+ **Status:** Backend deployed; frontend env on Vercel is the main remaining step.
7
+
8
+ ---
9
+
10
+ ## What this PR adds
11
+
12
+ - **Product layers:** `src/domain/`, `src/services/`, slim `src/utopia-os.tsx`, `convex/` billing backend
13
+ - **Pricing page:** `#/pricing` (Polar checkout via Convex actions)
14
+ - **Theme gating:** premium themes respect entitlements when `VITE_CERAMIC_BILLING_ENABLED=true`
15
+ - **Docs:** `product-architecture.md`, `billing-setup.md`, architecture diagram
16
+
17
+ Billing is **off by default** until Vercel env vars are set.
18
+
19
+ ---
20
+
21
+ ## Infrastructure (already configured)
22
+
23
+ ### Convex — team `thestudio`, project `ceramic-design-system`
24
+
25
+ | | Dev | Prod |
26
+ |---|-----|------|
27
+ | Deployment | `nautical-goldfish-225` | `mellow-fox-829` |
28
+ | Cloud URL | https://nautical-goldfish-225.convex.cloud | https://mellow-fox-829.convex.cloud |
29
+ | Webhook URL | https://nautical-goldfish-225.convex.site/polar/webhook | https://mellow-fox-829.convex.site/polar/webhook |
30
+ | Dashboard | [dev](https://dashboard.convex.dev/d/nautical-goldfish-225) | [prod](https://dashboard.convex.dev/d/mellow-fox-829) |
31
+
32
+ Convex env vars are set on **both** deployments: Clerk issuer, Polar token/org/webhook secrets, `FRONTEND_URL`, `POLAR_SERVER=sandbox`.
33
+ Secrets live in the Convex dashboard only — not in git.
34
+
35
+ ### Clerk — StudioOS app
36
+
37
+ - Instance: `included-seahorse-61`
38
+ - Issuer: `https://included-seahorse-61.clerk.accounts.dev`
39
+ - JWT template: **`convex`** (required)
40
+ - Publishable key → Vercel/local `VITE_UTOPIA_OS_CLERK_PUBLISHABLE_KEY` (ask Karan or Clerk dashboard)
41
+
42
+ ### Polar — org `the-utopia-studio`
43
+
44
+ - Product ID (catalogue): `8ce88721-cb75-414b-9238-a8400a470d9e`
45
+ - Checkout uses **price IDs**, not product IDs — copy a price ID from Polar → Products → ⋮ → copy price id for the `/pricing` grid
46
+ - Webhooks registered for prod + dev Convex URLs (subscription.* events)
47
+
48
+ ---
49
+
50
+ ## Your checklist
51
+
52
+ ### 1. Vercel (production — design.utopia-studio.co)
53
+
54
+ Set **Production** environment variables:
55
+
56
+ ```env
57
+ VITE_UTOPIA_OS_CONVEX_URL=https://mellow-fox-829.convex.cloud
58
+ VITE_UTOPIA_OS_CLERK_PUBLISHABLE_KEY=<StudioOS pk_test from Clerk>
59
+ VITE_CERAMIC_BILLING_ENABLED=true
60
+ VITE_UTOPIA_OS_FELLOW_ENABLED=false
61
+ ```
62
+
63
+ Redeploy after saving.
64
+
65
+ ### 2. Clerk allowed origins
66
+
67
+ StudioOS app → add:
68
+
69
+ - `https://design.utopia-studio.co`
70
+ - `http://localhost:5173`
71
+
72
+ ### 3. Local dev
73
+
74
+ ```sh
75
+ git checkout feature/kp-work
76
+ npm install
77
+ cp .env.example .env.local # then add keys (see billing-setup.md)
78
+ npx convex dev # optional; functions already deployed
79
+ npm run dev
80
+ ```
81
+
82
+ `.env.local` is gitignored. Karan has a working local copy with dev Convex + Clerk key.
83
+
84
+ ### 4. Smoke test
85
+
86
+ 1. Open https://design.utopia-studio.co (after Vercel env + redeploy)
87
+ 2. Sign in (Clerk)
88
+ 3. Go to `#/pricing` — plans should load from Polar
89
+ 4. Test checkout (sandbox) — success URL returns to `#/onboarding-v2?checkout=success` on the origin that opened checkout
90
+ 5. Confirm subscription row in Convex dashboard → Data → `subscriptions`
91
+ 6. Premium theme unlock on `#/themes` for subscribed user
92
+
93
+ ### 5. Polar products
94
+
95
+ If pricing page is empty, confirm the product has **active prices** in Polar sandbox and that Convex `POLAR_ACCESS_TOKEN` has product read scope.
96
+
97
+ ---
98
+
99
+ ## Key files
100
+
101
+ | Area | Path |
102
+ |------|------|
103
+ | Convex schema | `convex/schema.ts` |
104
+ | Polar + webhooks | `convex/subscriptions.ts`, `convex/http.ts` |
105
+ | Entitlements query | `convex/entitlements.ts` |
106
+ | Domain rules | `src/domain/entitlements.ts` |
107
+ | Client wiring | `src/services/utopia-os-client.ts`, `src/utopia-os.tsx` |
108
+ | Pricing UI | `src/pages/PricingPage.tsx` |
109
+ | Setup guide | `docs/design-system/billing-setup.md` |
110
+
111
+ ---
112
+
113
+ ## Known limitations / follow-ups
114
+
115
+ - **Fellow / brand room:** still on Daedalus Convex — keep `VITE_UTOPIA_OS_FELLOW_ENABLED=false` on Ceramic-only deployments
116
+ - **Polar sandbox:** `POLAR_SERVER=sandbox` on both Convex envs until go-live
117
+ - **Team plan:** schema supports `team`; Clerk org gating not wired yet
118
+ - **Rotate secrets:** Polar OAT and webhook secrets were shared in chat during setup — rotate in Polar if concerned
119
+
120
+ ---
121
+
122
+ ## MCP connectors (optional)
123
+
124
+ Project `.cursor/mcp.json`: Convex (stdio), Clerk, Vercel. Install OAuth in Cursor Settings → MCP if agents need dashboard access.
125
+
126
+ ---
127
+
128
+ ## Questions
129
+
130
+ - Karan for Clerk publishable key and Vercel project access
131
+ - Convex dashboard for data/webhook logs
132
+ - Polar dashboard for products and webhook delivery logs
@@ -0,0 +1,109 @@
1
+ # Ceramic Logo Maker methodology
2
+
3
+ Logo Maker helps a person without design training make an informed identity
4
+ decision. It does not declare that a logo is good because a model prefers it.
5
+ It presents a recommendation, tests the generated artifact against shared and
6
+ brand-specific criteria, shows visual evidence, and leaves approval to a human.
7
+
8
+ ## What “good” means
9
+
10
+ A good logo passes two different kinds of judgment.
11
+
12
+ ### Universal quality gates
13
+
14
+ These gates apply to every logo direction:
15
+
16
+ 1. **Small-size legibility** — the defining shape remains identifiable at 16px
17
+ and 24px without relying on fine detail.
18
+ 2. **One-color integrity** — the mark survives as one flat color for engraving,
19
+ embossing, photocopying, and restricted production.
20
+ 3. **Positive and reverse contrast** — approved light- and dark-surface versions
21
+ retain the same silhouette and visual weight.
22
+ 4. **Silhouette and spacing** — the outer contour, counters, negative space,
23
+ and clear space remain intentional rather than collapsing into noise.
24
+ 5. **Lockup versatility** — the registered wordmark, symbol, and compact badge
25
+ formats remain related and usable in their declared contexts.
26
+ 6. **Distinctiveness** — the concept has one ownable visual idea and is not
27
+ interchangeable with a generic category mark.
28
+ 7. **Reference independence** — selected third-party logos inform comparison
29
+ only; artwork, proprietary letterforms, and distinctive constructions are
30
+ never copied or morphed.
31
+ 8. **Production readiness** — the approved result can be redrawn as clean vector
32
+ geometry without gradients, effects, or detail that the brief did not require.
33
+
34
+ Passing these gates does not prove trademark availability. Similarity review is
35
+ design evidence, not legal clearance.
36
+
37
+ ### Brand-specific fit
38
+
39
+ The agent evaluates each concept against the durable Discovery brief:
40
+
41
+ - what the brand must communicate;
42
+ - what it must never become;
43
+ - the primary audience and usage context;
44
+ - the selected logo structure and references;
45
+ - the intended values and the visible feature that expresses each value; and
46
+ - explicit constraints, such as scripts, markets, colors, or production media.
47
+
48
+ A technically clean logo can still be the wrong logo when it contradicts this
49
+ brief. Brand fit must therefore remain separate from universal craft quality.
50
+
51
+ ## Required response structure
52
+
53
+ The durable assistant response remains Markdown and uses this order:
54
+
55
+ 1. `Recommended direction` — one decisive proposal with concrete construction.
56
+ 2. `Suggested palette` — named colors and `#RRGGBB` values when relevant.
57
+ 3. `Values expressed through the mark` — value-to-visible-evidence mappings.
58
+ 4. `Logo quality check` — evidence for every applicable quality gate.
59
+ 5. `Decisions needed` — no more than two unresolved choices.
60
+ 6. `Next step` — one action the user can understand without design knowledge.
61
+
62
+ Do not return an unstructured wall of text or a single unexplained score.
63
+
64
+ ## Logo Quality Check presentation
65
+
66
+ Each generated variant receives the same compact evidence board:
67
+
68
+ | Check | Result | Required evidence |
69
+ | --- | --- | --- |
70
+ | Small-size test | Pass / Review / Fail | 16px and 24px render |
71
+ | One-color test | Pass / Review / Fail | black or approved primary-color render |
72
+ | Reverse test | Pass / Review / Fail | light-on-dark render |
73
+ | Brief alignment | Strong / Partial / Weak | cited brief statement and visible response |
74
+ | Distinctiveness | Strong / Review / Weak | defining feature and nearest-category risk |
75
+ | Production fit | Ready / Review / Blocked | intended favicon, header, print, or badge context |
76
+
77
+ The board shows evidence before judgment. A total score may summarize the board,
78
+ but it never replaces failed checks, caveats, or comparison views. Approval stays
79
+ disabled while a blocking check has no evidence.
80
+
81
+ ## Visual proof sheet
82
+
83
+ Logo Maker should generate or derive these synchronized views from the actual
84
+ selected artifact:
85
+
86
+ - primary full-color lockup;
87
+ - one-color mark;
88
+ - reverse mark on a dark surface;
89
+ - 16px and 24px small-size samples;
90
+ - square and circular badge crops when the chosen structure supports them; and
91
+ - one realistic target context such as product chrome, a web header, or print.
92
+
93
+ These are evaluations of one artifact version, not separately invented logos.
94
+ The Artifact register owns the visual files, variants, version, and approval.
95
+ Interpretation, evidence, and unresolved decisions remain in the conversation.
96
+
97
+ ## Browser and MCP parity
98
+
99
+ The browser and MCP both read `manifests/logo-skills.json`. The manifest exposes
100
+ the shared quality gates, while this document defines how to interpret and show
101
+ their evidence. An MCP client follows the same sequence:
102
+
103
+ `get_room_context` → `list_logo_skills` → `prepare_logo_maker_run` → generate
104
+ variant and proof sheet → return structured quality evidence → human review →
105
+ checkpoint the approved artifact.
106
+
107
+ Neither surface may claim that a gate passed without evaluating the generated
108
+ artifact. A prepared prompt is not a completed quality check, and model output is
109
+ not approval.
@@ -0,0 +1,53 @@
1
+ # Presentation asset repository
2
+
3
+ Keep presentation imagery in a dedicated GitHub repository. The repository is
4
+ read-only input for presentation generation and must contain
5
+ `ceramic.assets.json` at its root. The generator pins the commit SHA, reads the
6
+ manifest, and uses only assets whose theme, locale, placement, aspect ratio,
7
+ license, and usage policy match the deck.
8
+
9
+ Do not add application code, install scripts, credentials, private customer
10
+ data, or unlicensed media. Presentation tooling must never execute repository
11
+ scripts or infer missing rights metadata.
12
+
13
+ ## Repository layout
14
+
15
+ ```text
16
+ brand-presentation-assets/
17
+ ├── ceramic.assets.json
18
+ ├── logos/
19
+ ├── photography/
20
+ ├── illustrations/
21
+ └── textures/
22
+ ```
23
+
24
+ ## Manifest example
25
+
26
+ ```json
27
+ {
28
+ "$schema": "https://utopia-studio.co/schemas/ceramic-presentation-assets.schema.json",
29
+ "schemaVersion": "1.0.0",
30
+ "assets": [
31
+ {
32
+ "id": "studio-collaboration-01",
33
+ "kind": "photography",
34
+ "src": "photography/studio-collaboration-01.webp",
35
+ "alt": "A multidisciplinary team reviewing a prototype",
36
+ "usage": "Use for collaboration and delivery narratives; do not use as product evidence.",
37
+ "themes": ["utopia-default", "utopia-cloudblur"],
38
+ "locales": ["*"],
39
+ "placements": ["section-divider", "image-led", "closing"],
40
+ "aspectRatios": ["16:9", "3:2"],
41
+ "focalPoint": { "x": 0.62, "y": 0.45 },
42
+ "license": "Owned by The Utopia Studio",
43
+ "credit": "The Utopia Studio"
44
+ }
45
+ ]
46
+ }
47
+ ```
48
+
49
+ For a 12–15 slide deck, the prompt selects two to four distinct editorial
50
+ assets when relevant. It does not force imagery into data or evidence slides,
51
+ repeat one image as decoration, or mix an asset into a theme that is not listed.
52
+ The final handoff records the repository path, commit SHA, crop or
53
+ transformation, credit, license, and slide numbers for every used asset.
@@ -0,0 +1,42 @@
1
+ # Ceramic product architecture
2
+
3
+ How the repo is layered so we can ship subscriptions without mixing product logic into the design-system packages.
4
+
5
+ ## Layers
6
+
7
+ | Layer | Location | Owns |
8
+ |-------|----------|------|
9
+ | **Packages** | `packages/*` | Publishable npm artifacts (components, CLI, Clerk wrappers). No billing tables. |
10
+ | **Domain** | `src/domain/` | Pure rules: theme access, plan tiers, entitlement checks. No React, no fetch. |
11
+ | **Services** | `src/services/` | Convex function refs and other reusable mechanics. |
12
+ | **Providers** | `src/utopia-os.tsx` | Orchestration: Clerk session, Convex queries, React context. |
13
+ | **Control plane** | `convex/` | Auth-backed queries, Polar checkout, subscription webhooks. |
14
+ | **Patterns** | `src/patterns/` | Registered semantic composition styling shared by pages; never imported by an individual page. |
15
+ | **Pages** | `src/pages/` | Content, routing, data binding, and semantic composition only. No page-owned CSS or raw visual policy. |
16
+
17
+ **Rule (from Studio Product Framework):** pages decide *when* to gate; domain decides *whether* access is allowed; Convex stores *what* the user bought.
18
+
19
+ ## Semantic UI ownership
20
+
21
+ The UI dependency direction is fixed:
22
+
23
+ ```text
24
+ semantic tokens → components / registered patterns → pages
25
+ ```
26
+
27
+ - A page may select components, pass semantic variants, bind product state, and arrange registered patterns.
28
+ - A page may not import CSS, create a page stylesheet, hardcode brand primitives, or invent a local visual variant.
29
+ - `src/styles.css` is the application entrypoint that loads registered patterns. A page never loads pattern CSS itself.
30
+ - If the system cannot express a required interface decision, treat that as a missing design-system contract and repair the component, pattern, manifest, or token layer first.
31
+ - `npm run audit:semantic-pages` enforces the page boundary in local and release checks.
32
+
33
+ ## Convex deployments
34
+
35
+ - **Ceramic `convex/`** (this repo) — subscriptions, `users`, webhooks. Point `VITE_UTOPIA_OS_CONVEX_URL` here for billing launch.
36
+ - **Daedalus** (optional sibling) — legacy fellow/brand-room functions (`profiles:*`, `fellowDesign:*`). Still used when that deployment URL is set and billing is off.
37
+
38
+ When billing is enabled, the same Convex URL must include `convex/entitlements.ts` and `convex/subscriptions.ts` from this repo.
39
+
40
+ ## Going live checklist
41
+
42
+ See [billing-setup.md](./billing-setup.md).
@@ -98,7 +98,6 @@ npx utopia-ds template --list --json
98
98
  npx utopia-ds template template-saas-solution-homepage --copy ./saas-solution-website
99
99
  npx utopia-ds template template-saas-solution-homepage --theme dextrum --copy ./dextrum-website
100
100
  npx utopia-ds theme utopia-default --json
101
- npx utopia-ds theme create nova
102
101
  npx utopia-ds docs arabic-friendly --dense
103
102
  npx utopia-ds doctor --json
104
103
  ```
@@ -161,15 +160,16 @@ messages, or raw stacks.
161
160
 
162
161
  ## Create A Theme
163
162
 
164
- Run this from the Ceramic Design System workspace:
163
+ Theme creation changes the Design System source catalog; it is not available from a consumer project. Clone or open the Ceramic Design System repository, install its dependencies, and run these commands from the repository root:
165
164
 
166
165
  ```sh
167
- npx utopia-ds theme create nova
166
+ npm install
167
+ npm run ds -- theme create your-theme-name
168
168
  npm run sync-data --workspace @utopia-studio-design/design-system-cli
169
169
  npm run ds -- doctor
170
170
  ```
171
171
 
172
- The command creates `nova.css`, `theme-nova.json`, and registers the theme in `themes.json`. The scaffold includes dark, light, Arabic typography, shape, and semantic motion contracts. Replace its placeholder brand primitives before publishing it.
172
+ Replace `your-theme-name` with the lowercase kebab-case ID you want for the theme. The command creates `<your-theme-name>.css`, `theme-<your-theme-name>.json`, and registers the theme in `themes.json`. The scaffold includes dark, light, Arabic typography, shape, and semantic motion contracts. Replace its placeholder brand primitives before publishing it.
173
173
 
174
174
  ## Core And Theme Boundary
175
175
 
@@ -31,5 +31,5 @@ Use the dense CLI output to pick the Utopia package import. If a component still
31
31
  - shadcn setup: `components.json`
32
32
  - Utopia catalog: `packages/design-system/src/manifests/catalog.json`
33
33
  - Component contracts: `packages/design-system/src/manifests/components.json`
34
- - Safe conversion wrappers: `packages/design-system/src/components/ShadcnPrimitives.tsx`
34
+ - Safe conversion wrappers: `packages/design-system/src/components/Primitives.tsx`
35
35
  - Core semantic styling: `packages/design-system/src/core.css`
@@ -0,0 +1,56 @@
1
+ # Sidebar placement
2
+
3
+ Ceramic treats sidebar placement as a logical layout preference. Pass `start` or `end` to `SidebarProvider`; do not convert the value to `left` or `right` before rendering or persistence.
4
+
5
+ ```tsx
6
+ import {
7
+ Sidebar,
8
+ SidebarInset,
9
+ SidebarProvider,
10
+ } from '@utopia-studio-design/design-system/Sidebar'
11
+
12
+ export function WorkspaceShell({
13
+ direction,
14
+ placement = 'start',
15
+ }: {
16
+ direction: 'ltr' | 'rtl'
17
+ placement?: 'start' | 'end'
18
+ }) {
19
+ return (
20
+ <div dir={direction} className="workspace-shell">
21
+ <SidebarProvider placement={placement}>
22
+ <Sidebar>{/* localized navigation */}</Sidebar>
23
+ <SidebarInset>{/* workspace content */}</SidebarInset>
24
+ </SidebarProvider>
25
+ </div>
26
+ )
27
+ }
28
+ ```
29
+
30
+ The four supported mappings are:
31
+
32
+ | Direction | `start` | `end` |
33
+ | --- | --- | --- |
34
+ | `ltr` | Physical left | Physical right |
35
+ | `rtl` | Physical right | Physical left |
36
+
37
+ Each combination uses the same semantic API:
38
+
39
+ ```tsx
40
+ <div dir="ltr"><SidebarProvider placement="start">{/* left navigation */}</SidebarProvider></div>
41
+ <div dir="ltr"><SidebarProvider placement="end">{/* right navigation */}</SidebarProvider></div>
42
+ <div dir="rtl"><SidebarProvider placement="start">{/* right navigation */}</SidebarProvider></div>
43
+ <div dir="rtl"><SidebarProvider placement="end">{/* left navigation */}</SidebarProvider></div>
44
+ ```
45
+
46
+ `placement` defaults to `start`. Keep the semantic value in user settings so changing locale does not silently change intent. Sidebar, inset, rail, active indicator, collapsed tooltip, trigger icon, overlay, and mobile off-canvas motion all consume the same provider value.
47
+
48
+ For mobile shells, render `SidebarBlockType1Trigger` in the app top bar as well as using `SidebarBlockType1`. The external trigger remains reachable while the drawer is closed. Supply every visible and accessible label from the product localization layer.
49
+
50
+ When a product has a secondary workspace-tools panel, derive it as the opposite logical side:
51
+
52
+ ```ts
53
+ const toolsPlacement = navigationPlacement === 'start' ? 'end' : 'start'
54
+ ```
55
+
56
+ Load the persisted placement before revealing the shell, or inject it into the initial render. This avoids a hydration flash from the default `start` placement to the stored value.
@@ -4,11 +4,14 @@ Themes are token-contract and visual-policy implementations.
4
4
 
5
5
  ## Scaffold A Theme
6
6
 
7
+ Clone or open the Ceramic Design System repository, install its dependencies, and run the authoring command from the repository root:
8
+
7
9
  ```sh
8
- npx utopia-ds theme create nova
10
+ npm install
11
+ npm run ds -- theme create your-theme-name
9
12
  ```
10
13
 
11
- Run the command from the Design System workspace. It writes the theme CSS and policy manifest and registers the theme in the catalog. Theme IDs use lowercase kebab-case. The generated colors and typography are safe placeholders, not a finished brand direction.
14
+ `theme create` is not a consumer-project command. Replace `your-theme-name` with the lowercase kebab-case ID you want for the theme, such as `acme-dark`. The command writes the theme CSS and policy manifest into `packages/design-system` and registers the theme in the source catalog. The generated colors and typography are safe placeholders, not a finished brand direction.
12
15
 
13
16
  ## Required Read Order
14
17
 
@@ -37,7 +40,7 @@ A theme maps primitives to semantic roles and declares its own visual policy:
37
40
 
38
41
  Theme CSS owns both `[data-theme="<id>"]` and `[data-theme="<id>"][data-color-mode="light"]`. Templates set theme and color-mode attributes but must not remap brand primitives themselves.
39
42
 
40
- Utopia Default is strict about Brick Red, Special Black, TWK Lausanne, square geometry, and dot/bar icons. Those are not global design-system rules.
43
+ Utopia Default is strict about Brick Red, Special Black, TWK Lausanne, square geometry, and its Phosphor icon policy. Those are not global design-system rules.
41
44
 
42
45
  ## Motion Profile
43
46