Skip to content

feat(create): rebuild /create as a design-system studio#282

Open
mehdibha wants to merge 3 commits into
mainfrom
claude/elastic-clarke-fba9d3
Open

feat(create): rebuild /create as a design-system studio#282
mehdibha wants to merge 3 commits into
mainfrom
claude/elastic-clarke-fba9d3

Conversation

@mehdibha

@mehdibha mehdibha commented Jun 27, 2026

Copy link
Copy Markdown
Owner

Experiment, UI-only. Gut the old left control panel and redesign the whole /create experience as an end-to-end design-system builder: brand in → complete, on-brand library out, openable anywhere.

What changed

  • The old 288px left CustomizerPanel is no longer rendered. routes/_app/create.tsx renders the new <Studio/>; ?lab=true still serves the legacy LabExperience. Old files remain on disk but unwired.
  • New module www/src/modules/create/studio/ — a canvas-first three-zone studio.

The experience

  • Top bar — brand mark, editable name, Draft chip · Surprise-me / Undo / Reset · Share (deep-link) · Export popover (shadcn CLI + Open in v0 live; Bolt/Lovable/Claude/Figma "Soon").
  • Left rail — the system's axes as a slim icon nav: Brand · Color · Type · Shape · Space · Depth · Motion · Icons · Cursor · Components.
  • Canvas — the live iframe elevated: scene switcher, device sizes, zoom, light/dark split view, fullscreen. Token edits stream in over postMessage (no reload).
  • Inspector — a purpose-built panel per axis, with honest binding dots (● live / ○ designed).
  • Generate overlay — seed by one color / logo / URL, pick a vibe → applies color + radius + density + depth, then dissolves into the studio.

Coverage (maps to the brief)

  • 1 color → full system (auto neutrals + status, real OKLCH engine), or decide the structure (seed strategy, algorithm + knobs, contrast readout).
  • Palettes or not — Foundation toggle: full 50–950 ramps vs semantic-only roles.
  • Tweak any component — searchable grouped list → real per-component params + synced-group awareness (Button ⇄ ToggleButton).
  • Control anything — type, shape, space, depth, motion, icons, cursor each get an inspector with live specimens.

Live vs designed

Live now (reuses the existing pure engine, no new logic): color, radius, density, cursor, component params, shuffle/undo/reset, export. Designed (write real --ds-* vars, marked ○, go live when a consumer reads them): typography, depth, motion, icon stroke, spacing scale, border width.

Verification

pnpm typecheck passes; pnpm check clean (0 errors, 0 new warnings). Browser-tested end-to-end: onboarding, axis switching, color engine + ramps + foundation, Components → Alert with real params + canvas switch, light/dark split, mobile layout, and a live shuffle recoloring the preview.

Full report: docs/research/2026-06-27-create-studio-redesign.md.

Notes

  • Designed axes need engine consumers to become live (var names already aligned).
  • Import-from-logo/URL and "More targets" exports are visual stubs; fonts apply by name only (no webfont loading); system name + vibe are local UI state (not yet persisted).

Note

Medium Risk
Large UI-only surface on the primary /create route with layout/header behavior changes; core preset/preview pipeline is reused rather than rewritten.

Overview
Replaces the default /create layout (288px CustomizerPanel + preview) with a new Studio module: top bar, left axis rail, center canvas, and per-axis inspector. create.tsx now renders <Studio />; ?lab=true still loads the legacy LabExperience. The app layout hides the site Header on /create (except when lab is set) so the studio top bar owns the viewport.

The studio reuses the existing preset URL, useDesignSystem, iframe postMessage preview, color engine, component params, and export targets. New UI adds onboarding (brand color + vibe), per-axis inspectors with live vs “designed” binding dots, canvas Preview / Tokens / Code (iframe stays mounted when switching), device/zoom/light-dark split, color-vision simulation, ⌘K command palette, presets gallery, custom undo over ?preset=, and a .studio-rise CSS enter animation instead of problematic Motion SSR patterns.

Reviewed by Cursor Bugbot for commit 6a2bc9a. Bugbot is set up for automated code reviews on this repo. Configure here.

Replace the left CustomizerPanel with a three-zone studio: an axis rail,
the live canvas, and a context-sensitive inspector, plus a top bar and a
"Generate from brand" onboarding overlay. The route renders <Studio/>;
?lab=true still serves the legacy panel.

Color, radius, density, cursor and per-component params stay genuinely
live (existing engine); typography, depth, motion, icons, spacing and
border are designed controls writing --ds-* vars (marked with binding
dots). Experiment, UI-only.
@changeset-bot

changeset-bot Bot commented Jun 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 6a2bc9a

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@vercel

vercel Bot commented Jun 27, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
dotui Ready Ready Preview, Comment Jun 27, 2026 10:48pm

@github-actions github-actions Bot added documentation Improvements or additions to documentation area: www labels Jun 27, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 6 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 92596a2. Configure here.

sessionStorage.setItem('dotui-onboarded', '1')
setOnboardingOpen(true)
// oxlint-disable-next-line react/exhaustive-deps -- mount-only greeting
}, [])

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Onboarding ignores stored preset

High Severity

The onboarding effect checks the preset URL parameter on mount. This happens before a saved preset from localStorage can hydrate the URL, causing returning users with an existing design system to see the onboarding overlay.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 92596a2. Configure here.

'neutral',
on ? (seeds.accent ?? DEFAULT_COLOR_CONFIG.seeds.accent) : '#808080',
)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tint switch out of sync

Medium Severity

The "Tint neutrals with brand" switch's local state is initialized once from the neutral seed. This state doesn't update when the neutral seed changes from other parts of the color recipe (e.g., undo, reset), causing the switch to display an incorrect position relative to the actual neutral color.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 92596a2. Configure here.

className="font-medium text-fg underline-offset-2 hover:underline"
>
{titleCase(s.name)}
</button>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Synced links only go back

Medium Severity

In the ComponentDetail view, the sibling component links within the "synced-group" notice incorrectly call onBack. This returns to the component list instead of navigating to the selected sibling's detail view and updating the canvas preview.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 92596a2. Configure here.

)
}
return <ComponentList onSelect={setSelectedComponent} />
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preview scene inspector mismatch

Medium Severity

selectedComponent in the studio store stays set when the canvas scene selector changes preview via the route. The inspector can keep editing one component’s params while the iframe shows a different scene.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 92596a2. Configure here.

density: 'default',
elevation: 'glass',
},
]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate vibe definitions

Low Severity

Personality vibes are defined twice: a four-item set in onboarding (Minimal / Modern / Playful / Soft glass) and a six-item set in the Brand inspector (Minimal / Bold / Playful / Corporate / Editorial / Soft glass) with different ids, accents, and elevation defaults. The two flows can apply different “same label” personalities.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 92596a2. Configure here.

</button>
</span>
))}
. Changes apply to the whole group.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Group sync claim is wrong

Medium Severity

The inspector tells users that style is synced and that changes apply to the whole group, but setComponentParam only updates componentParams for the active component name, so siblings keep their own param entries in the preview.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 92596a2. Configure here.

Deepen the studio: a ⌘K command palette (jump to axes/components, run
actions), canvas view modes Preview/Tokens/Code (live token browser +
real emitPrimitivesCss output), color-vision simulation over the preview,
and a gallery of curated presets that fork the whole system. Shuffle and
reset move into a shared actions hook.
@cursor

cursor Bot commented Jun 27, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_ba369dc8-0140-4de4-9cab-8a615140a183)

@cursor

cursor Bot commented Jun 27, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_661c4f3c-0151-4001-8371-edfc07abd1f6)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: www documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant