@utopia-studio-design/design-system-cli 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -14
- package/bin/utopia-ds-mcp.mjs +6 -2
- package/bin/utopia-ds.mjs +94 -21
- package/data/docs/arabic-friendly.md +19 -2
- package/data/docs/billing-setup.md +80 -0
- package/data/docs/cer-003-032-033-round-8-repair.md +41 -0
- package/data/docs/cer-007-checkout.md +51 -0
- package/data/docs/cer-008-011-qa-repair.md +64 -0
- package/data/docs/cer-016-023-round-6-repair.md +92 -0
- package/data/docs/cer-024-031-round-7-repair.md +51 -0
- package/data/docs/cer-033-035-036-round-12-repair.md +37 -0
- package/data/docs/cer-035-037-round-10-repair.md +34 -0
- package/data/docs/charts.md +34 -3
- package/data/docs/chat-service-methodology.md +181 -0
- package/data/docs/code-block.md +20 -0
- package/data/docs/creative-production.md +149 -0
- package/data/docs/designer-agent-backend-contract.md +552 -0
- package/data/docs/email-resend.md +29 -0
- package/data/docs/foundations.md +46 -8
- package/data/docs/guide.md +9 -9
- package/data/docs/handover-billing-aiden.md +132 -0
- package/data/docs/logo-maker-methodology.md +109 -0
- package/data/docs/presentation-asset-repository.md +53 -0
- package/data/docs/product-architecture.md +42 -0
- package/data/docs/quick-start-ai.md +4 -4
- package/data/docs/shadcn-conversion.md +1 -1
- package/data/docs/sidebar-placement.md +56 -0
- package/data/docs/theme-authoring.md +6 -3
- package/data/manifests/catalog.json +42 -46
- package/data/manifests/components.json +317 -66
- package/data/manifests/logo-skills.json +174 -0
- package/data/manifests/motion-profiles.json +2 -2
- package/data/manifests/patterns.json +201 -7
- package/data/manifests/presentation-assets.schema.json +44 -0
- package/data/manifests/templates.json +87 -1
- package/data/manifests/theme-dextrum.json +7 -7
- package/data/manifests/theme-prism-mono.json +19 -0
- package/data/manifests/theme-utopia-cloudblur.json +135 -0
- package/data/manifests/theme-utopia-default.json +31 -31
- package/data/manifests/theme-vyapti.json +17 -1
- package/data/manifests/theme-y2k-pop.json +18 -0
- package/data/manifests/themes.json +285 -57
- package/data/templates/analytics-dashboard/main.tsx +14 -1
- package/data/templates/calendar-application/main.tsx +14 -1
- package/data/templates/chat-workspace/README.md +12 -0
- package/data/templates/chat-workspace/index.html +11 -0
- package/data/templates/chat-workspace/main.tsx +97 -0
- package/data/templates/chat-workspace/styles.css +19 -0
- package/data/templates/chat-workspace/template.manifest.json +13 -0
- package/data/templates/composition-registry-lab/main.tsx +12 -1
- package/data/templates/dashboard-composer/main.tsx +14 -1
- package/data/templates/database-workspace/main.tsx +14 -1
- package/data/templates/interaction-lab/main.tsx +12 -1
- package/data/templates/quantum-verification-story/README.md +12 -0
- package/data/templates/quantum-verification-story/components.json +21 -0
- package/data/templates/quantum-verification-story/eslint.config.mjs +13 -0
- package/data/templates/quantum-verification-story/next-env.d.ts +7 -0
- package/data/templates/quantum-verification-story/next.config.mjs +11 -0
- package/data/templates/quantum-verification-story/package-lock.json +7535 -0
- package/data/templates/quantum-verification-story/package.json +46 -0
- package/data/templates/quantum-verification-story/postcss.config.js +6 -0
- package/data/templates/quantum-verification-story/src/app/assessment/page.tsx +138 -0
- package/data/templates/quantum-verification-story/src/app/ceramic-theme.css +48 -0
- package/data/templates/quantum-verification-story/src/app/deployment/page.tsx +178 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Bold.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Medium.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/IBMPlexSansArabic-Regular.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/ReadexPro-Variable.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-350.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-500.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/fonts/TWKLausanne-700.ttf +0 -0
- package/data/templates/quantum-verification-story/src/app/globals.css +175 -0
- package/data/templates/quantum-verification-story/src/app/layout.tsx +45 -0
- package/data/templates/quantum-verification-story/src/app/not-found.tsx +39 -0
- package/data/templates/quantum-verification-story/src/app/page.tsx +24 -0
- package/data/templates/quantum-verification-story/src/app/products/page.tsx +132 -0
- package/data/templates/quantum-verification-story/src/app/utopia-default.css +312 -0
- package/data/templates/quantum-verification-story/src/components/RotatingText.css +36 -0
- package/data/templates/quantum-verification-story/src/components/RotatingText.tsx +189 -0
- package/data/templates/quantum-verification-story/src/components/brand-mark.tsx +14 -0
- package/data/templates/quantum-verification-story/src/components/console-preview-section.tsx +57 -0
- package/data/templates/quantum-verification-story/src/components/console-preview.tsx +72 -0
- package/data/templates/quantum-verification-story/src/components/fade-up.tsx +54 -0
- package/data/templates/quantum-verification-story/src/components/floating-network.tsx +125 -0
- package/data/templates/quantum-verification-story/src/components/footer.tsx +83 -0
- package/data/templates/quantum-verification-story/src/components/harvest-timeline.tsx +70 -0
- package/data/templates/quantum-verification-story/src/components/lattice-diagram.tsx +73 -0
- package/data/templates/quantum-verification-story/src/components/lattice-field.tsx +129 -0
- package/data/templates/quantum-verification-story/src/components/nav.tsx +104 -0
- package/data/templates/quantum-verification-story/src/components/presentation-layout.tsx +91 -0
- package/data/templates/quantum-verification-story/src/components/readiness-estimator.tsx +135 -0
- package/data/templates/quantum-verification-story/src/components/scramble-text.tsx +60 -0
- package/data/templates/quantum-verification-story/src/components/section-backdrop.tsx +38 -0
- package/data/templates/quantum-verification-story/src/components/sections/clients.tsx +140 -0
- package/data/templates/quantum-verification-story/src/components/sections/contact.tsx +125 -0
- package/data/templates/quantum-verification-story/src/components/sections/hero.tsx +92 -0
- package/data/templates/quantum-verification-story/src/components/sections/moat.tsx +73 -0
- package/data/templates/quantum-verification-story/src/components/sections/offer.tsx +113 -0
- package/data/templates/quantum-verification-story/src/components/sections/pilot.tsx +63 -0
- package/data/templates/quantum-verification-story/src/components/sections/problem.tsx +53 -0
- package/data/templates/quantum-verification-story/src/components/text-particle.tsx +204 -0
- package/data/templates/quantum-verification-story/src/components/ticker.tsx +27 -0
- package/data/templates/quantum-verification-story/src/components/ui/badge.tsx +29 -0
- package/data/templates/quantum-verification-story/src/components/ui/button.tsx +55 -0
- package/data/templates/quantum-verification-story/src/components/ui/card.tsx +46 -0
- package/data/templates/quantum-verification-story/src/components/ui/cursor-driven-particle-typography.tsx +288 -0
- package/data/templates/quantum-verification-story/src/components/ui/input.tsx +20 -0
- package/data/templates/quantum-verification-story/src/components/ui/label.tsx +21 -0
- package/data/templates/quantum-verification-story/src/components/ui/separator.tsx +25 -0
- package/data/templates/quantum-verification-story/src/components/ui/textarea.tsx +19 -0
- package/data/templates/quantum-verification-story/src/lib/utils.ts +6 -0
- package/data/templates/quantum-verification-story/tailwind.config.js +95 -0
- package/data/templates/quantum-verification-story/template.manifest.json +23 -0
- package/data/templates/quantum-verification-story/tsconfig.json +42 -0
- package/data/templates/saas-solution-homepage/main.tsx +91 -14
- package/data/templates/saas-solution-homepage/privacy/index.html +1 -0
- package/data/templates/saas-solution-homepage/styles.css +47 -2
- package/data/templates/saas-solution-homepage/team/index.html +1 -0
- package/data/templates/saas-solution-homepage/template.manifest.json +41 -0
- package/data/templates/saas-solution-homepage/terms/index.html +1 -0
- package/lib/api.mjs +52 -3
- package/lib/template-runtime.mjs +1 -0
- package/package.json +2 -2
package/data/docs/foundations.md
CHANGED
|
@@ -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
|
-
-
|
|
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
|
|
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
|
-
-
|
|
125
|
-
-
|
|
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
|
|
153
|
-
|
|
154
|
-
navigation defaults keep their
|
|
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.
|
package/data/docs/guide.md
CHANGED
|
@@ -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
|
-
- `
|
|
10
|
-
- `
|
|
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
|
-
- `
|
|
15
|
-
- `
|
|
16
|
-
- `
|
|
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
|
|
93
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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/
|
|
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
|
-
|
|
10
|
+
npm install
|
|
11
|
+
npm run ds -- theme create your-theme-name
|
|
9
12
|
```
|
|
10
13
|
|
|
11
|
-
|
|
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
|
|
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
|
|