Skip to content

UI overhaul: shadcn/ui + Tailwind v4, resizable layout, accordion sidebar - #36

Merged
cbaucom merged 7 commits into
mainfrom
feat/ui-overhaul-shadcn
Jun 11, 2026
Merged

cbaucom merged 7 commits into
mainfrom
feat/ui-overhaul-shadcn

Conversation

@cbaucom

@cbaucom cbaucom commented Jun 11, 2026

Copy link
Copy Markdown
Owner

Summary

Replaces the one-off-CSS editor UI with a design system and a new layout:

  • Design system: Tailwind CSS v4 + shadcn/ui (radix-nova preset) in src/components/ui/, dark-only theme mapped to the existing palette (#111 background, #2563eb primary). standards/slideshow.md updated accordingly (owner-approved reversal of the old "not Tailwind" rule), including a new guardrail: src/composition/ stays inline-styles-only so rendered video never depends on editor stylesheets.
  • Layout: resizable panels — player above a horizontal storyboard filmstrip, right sidebar with collapsible accordions (Settings / Soundtrack / Find Music). Filmstrip preserves drag-reorder, exclude toggle, selected ring, and the custom-settings star.
  • Jamendo panel: results in a fixed-height scrollable list with compact rows; previously the panel had no CSS at all.
  • Dialogs: shadcn Dialog (focus trap, Escape, proper aria) with a shared OverrideField row component.
  • App.tsx split to respect the 300-line cap: folder/persistence state extracted to useProject; presentational pieces to AppHeader / EmptyState / PlayerPane / EditorLayout / EditorSidebar.

Bug fixes found while verifying live: react-resizable-panels v4 pixel-vs-percent sizing (panels could only grow), Radix ScrollArea intrinsic-width overflow (long filenames pushed controls off-panel and made focus jump the sidebar), and stale Radix accordion height clipping search results to 38px (forceMount also preserves search state across collapse).

One intentional rendering delta: the Remotion Player now mounts only after a folder is open; the empty state stands alone before that.

Review

code-reviewer agent: 5/5, APPROVE, zero blocking findings. Non-blocking follow-ups noted: move build-time packages to devDependencies; converge the duplicated FPS constant onto the PlayerPane export.

Test plan

  • pnpm lint, pnpm build, pnpm test (198 tests) green at every commit
  • Playwright smoke against the live app (folder picker stubbed with an OPFS directory): both resize handles shrink and grow, accordions collapse/expand, Jamendo search renders 20 results inside the fixed-height scroll container, results survive dialogs and collapse/expand, slide dialog opens/closes on Escape, zero console errors — including with a long audio filename present
  • Manual: owner exercised the app against a real folder during development

🤖 Generated with Claude Code

cbaucom and others added 7 commits June 11, 2026 08:44
Tailwind via @tailwindcss/vite, dark-only theme variables mapped to the
existing palette, shadcn radix-nova preset, eslint exemption for
generated ui files.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
button, input, label, select, switch, checkbox, accordion, resizable,
scroll-area, dialog, slider, toggle-group, separator.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- EditorLayout: resizable panels (player / bottom filmstrip / right sidebar)
- StoryboardFilmstrip replaces StoryboardGrid (horizontal, drag-reorder kept)
- EditorSidebar: collapsible accordions for Settings, Soundtrack, Find Music
- JamendoPanel results in fixed-height scroll area with compact rows
- Dialogs on shadcn Dialog with shared OverrideField row
- useProject hook extracts folder/persistence state to meet 300-line cap
- App.css deleted; styling is Tailwind + shadcn primitives

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
react-resizable-panels v4 treats numeric sizes as pixels, so the
defaultSize/minSize numbers collapsed the sidebar and filmstrip to a
sliver and the player could only grow. Use percentage strings and add
min-w-0/min-h-0/overflow-hidden to every panel so content can shrink.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three fixes for the Find Music panel:
- Radix ScrollArea sizes content to intrinsic width (display: table), so a
  long audio filename pushed every right-aligned control off-panel and made
  focusing the search input scroll the sidebar sideways. Vertical scroll
  containers (sidebar, results list) now use native overflow-y-auto.
- The accordion content wrapper pinned its height to
  --radix-accordion-content-height, which Radix only measures on open/close;
  results appearing later were clipped to the stale (form-only) height.
  Height now applies only via the open/close animation keyframes.
- The Find Music accordion content is forceMount-ed so collapsing the
  section no longer wipes in-progress search state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cbaucom
cbaucom merged commit 1fc17c0 into main Jun 11, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant