Skip to content

feat(create): rebuild builder panel from scratch#283

Open
mehdibha wants to merge 2 commits into
mainfrom
claude/beautiful-driscoll-ea6896
Open

feat(create): rebuild builder panel from scratch#283
mehdibha wants to merge 2 commits into
mainfrom
claude/beautiful-driscoll-ea6896

Conversation

@mehdibha

@mehdibha mehdibha commented Jun 27, 2026

Copy link
Copy Markdown
Owner

Rebuilds the /create left panel from scratch as dotUI Studio — an
experiment toward the most capable design-system builder on the web. It serves
both audiences at once: drop in a single brand color and walk away with a
complete, on-brand, accessible library in minutes, or drill down to a single
component's hover effect.

UI-first experiment (as scoped). Headline axes drive the live preview today;
the genuinely-new axes are real, interactive UI on local state pending their
preview consumers.

What changed

  • Deleted customizer-panel.tsx (the old left panel + every control it composed) and the orphaned typography/, iconography/, chart-colors/ control modules.
  • Added www/src/modules/create/studio/ (8 files): a persistent identity header over a slide-stack — Home → foundation/component editors — with the export footer kept.
  • Edits flow through the existing useDesignSystem?preset= contract, so the live preview re-themes for free. The ?lab=true experiment is untouched.

Two depth dials for two audiences

  • Quick ↔ Pro (global): Quick surfaces the 4 core foundations; Pro reveals all 10 + advanced sub-controls.
  • Simple ↔ Advanced (Color): one seed, or total control.

The tweaking surface

Axis Live? Notes
Color — Simple one brand seed → full system, neutral character, light/dark, status on/off
Color — Advanced ✅ seeds/algo/knobs Expose-palettes ↔ Semantic-only foundations style, 6 role seeds, algorithm + per-algo knobs, semantic mapping, WCAG AA/AAA readout
Shape · Density · Cursors · Charts radius factor, density, cursor tokens, derived chart palette
Per-component ✅ params hover effect + every real registry param, synced-group note, auto-switches preview
Typography · Elevation · Motion · Icons UI scale/weights, shadow language, easing curves, library/stroke

Requirements met

  • One color → complete system → Color Simple.
  • Decide how the color system works → Color Advanced (roles, algorithm, knobs).
  • Palettes or not as foundations → the Foundations style toggle.
  • Tweak a specific component → the component editor.
  • Quick clean output or tweak everything → Quick/Pro + Simple/Advanced.

Verification

pnpm typecheck ✅ · pnpm check (oxlint + oxfmt) ✅ · zero console errors. In-browser: navigation, Quick/Pro, Color Simple+Advanced, foundation + component editors, and back-nav all work; applying the Vivid vibe set the brand to #7C3AED, wrote the encoded ?preset=, and re-themed the live preview purple. No registry/types.ts changes, so no generated drift.

Heads-up

A separate /create studio experiment exists on branch elastic-clarke (a 3-zone rail+canvas+inspector take) using the same studio/ folder name. This is a distinct second direction — pick one before merging, since the folders collide.


Note

Medium Risk
Large UX swap on the primary /create flow and a new navigation model (in-memory stack vs prior URL panel drill-in); preset/undo behavior is preserved but several controls are UI-only and do not yet affect export/preview.

Overview
Replaces the /create left CustomizerPanel and its split modules (chart-colors, typography, iconography) with a new studio/ experience: dotUI Studio — a slide-stack from Home into foundation and component editors, still persisting edits through useDesignSystem?preset= so the preview keeps working.

Chrome and routing: /create gets a dedicated CreateTopBar (system name, Quick/Pro depth, surprise-me, undo) inside StudioProvider; the global site Header is hidden on /create so nav does not stack. The page layout is 100svh with the builder owning the top bar.

Product surface: Home adds brand hero, vibes, tier-gated foundations (Quick vs Pro), and a searchable component list. New editors include Color Lab (simple/advanced, WCAG readout), registry-driven component params, and foundation screens for shape, density, cursors, charts, plus UI-only typography/elevation/motion/icons until wired to tokens. Undo/reroll move into studio context (preset history unchanged in spirit).

?lab=true still swaps in LabExperience; default path uses StudioPanel instead of CustomizerPanel.

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

Replace the /create left panel with dotUI Studio: a brand hero (one
seed -> full system), one-tap vibes, Quick/Pro depth, and drill-in
editors for color (Simple/Advanced, palettes-vs-semantic foundations,
algorithm + knobs, semantic mapping, a11y readout), typography, shape,
density, elevation, motion, icons, cursors, charts, plus a per-component
editor. Edits flow through the existing ?preset= state so the live
preview re-themes. Removes customizer-panel and the orphaned
typography/iconography/chart-colors control modules.

UI-first experiment: headline axes (color, radius, density, cursors,
charts, component params) are wired live; new axes are interactive UI
on local state pending preview consumers.
@changeset-bot

changeset-bot Bot commented Jun 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 5041832

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:52pm

@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 7 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 fcf732d. Configure here.

const matchTheme = () => {
;[1, 2, 3, 4, 5].forEach((n, i) =>
setToken(`--chart-${n}`, derived[i] ?? '#888888'),
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Match theme freezes chart colors

Medium Severity

The "Match theme" button in the Charts screen now sets chart color tokens to static hex values. This prevents chart colors from automatically updating when the overall theme's brand or status seeds change, breaking their dynamic linkage.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fcf732d. Configure here.

0,
RADIUS_OPTIONS.findIndex((o) => o.value === current),
)
const safeIdx = idx >= 0 ? idx : 0

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Radius slider wrong default

Medium Severity

The RadiusParam slider defaults to the first radius option (index 0) when its current value isn't found in RADIUS_OPTIONS. This occurs because Math.max(0, findIndex(...)) forces index 0, causing the control to display an inaccurate starting point for user adjustments.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fcf732d. Configure here.

Shares one style with{' '}
{siblings.map((s) => getComponentDisplayName(s)).join(', ')}. Edits
stay in sync.
</Hint>

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 group edits not shared

Medium Severity

The component editor UI states that parameter edits for synced siblings stay in sync. However, setComponentParam only updates the current component's parameters, meaning changes don't propagate to other grouped components or their shared preview styling.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fcf732d. Configure here.

options={[
{ id: 'gray', label: 'Pure gray' },
{ id: 'tinted', label: 'Tinted by brand' },
{ id: 'warm', label: 'Warm' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Status toggle only hides UI

Medium Severity

The "Tinted by brand" neutral option in Simple mode is hardcoded to a fixed hex value (#7d7a85). Its label and hint suggest it should derive the neutral color from the current brand seed, but it doesn't.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fcf732d. Configure here.

muted: '100',
border: '200',
ring: '500',
})

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Spacing scale slider inert

Medium Severity

Several studio controls update local React state (useState) but don't propagate changes to the designSystem context. This prevents user adjustments to the "Spacing scale" (Density), "Hover effect" (Components), "Status colors" (Simple Color), and "Semantic mapping" (Advanced Color) from affecting the live preview or the exported preset.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fcf732d. Configure here.

label={`Series ${n}`}
value={colors[i] ?? '#888888'}
onChange={(hex) => setToken(`--chart-${n}`, hex)}
/>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Chart picker ignores var tokens

Medium Severity

Chart series swatches pass raw designSystem.tokens['--chart-n'] into SeedSwatch without resolving var(...) overrides to hex. Presets that still store theme-linked chart tokens (including after the old panel) can break or mis-seed the color picker while the bar preview still looks correct.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fcf732d. Configure here.

const navigate = routeApi.useNavigate()
const { setDesignSystem } = useDesignSystem()

const [stack, setStack] = useState<string[]>([])

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Panel query param ignored

Medium Severity

The create route still accepts panel in search params, but StudioProvider keeps navigation in local stack state only and never reads or writes panel. Bookmarks and shared links that relied on ?panel=… no longer open the matching editor after refresh.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fcf732d. Configure here.

@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_88020d2c-b5f6-4b0b-be9c-ad61503c8036)

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant