Skip to content

feat(ui): D.4 migrate FileUpload + Input Source to ui/ primitives - #69

Merged
slittycode merged 4 commits into
mainfrom
claude/ui-restyle-pr5-fileupload-inputsource
May 18, 2026
Merged

feat(ui): D.4 migrate FileUpload + Input Source to ui/ primitives#69
slittycode merged 4 commits into
mainfrom
claude/ui-restyle-pr5-fileupload-inputsource

Conversation

@slittycode

Copy link
Copy Markdown
Owner

Summary

PR 5 of 16 in the UI consistency overhaul / Live 12 restyle stack. The Input Source panel becomes a <DeviceRack name="Input Source">; the analysis-option toggles become **Radix <Checkbox>**es; the Run Analysis CTA becomes a <Button variant="primary" ledIndicator>; the loaded-file card becomes a <Panel variant="surface">.

Stacked on #67 (D.3 SignalChain). Base will be retargeted to main after #66#67 → this PR merge in order.

FileUpload.tsx

  • Loaded file card: replaced the hand-rolled bg-bg-card border div with <Panel variant="surface" padding="md">. Accent stripe + file icon + name + ready-dot + size-warning preserved verbatim.
  • Format chips (MP3 / WAV / FLAC / AIFF): replaced inline <span> chips with <Pill tone="neutral" variant="outline" size="xs">. Visual parity.
  • "Load Demo Track" <button>: replaced with <Button variant="secondary" size="md">. Behavior + text preserved verbatim for tests/smoke/responsive-layout.spec.ts.
  • Remove File icon button: replaced with <Button variant="ghost" iconOnly size="sm">.
  • Dropzone container kept as a raw <div> — its drag-event handlers + three-way background-tint state are denser than Panel currently supports.

App.tsx — Input Source panel

  • Outer wrapper at :1018-1027: hand-rolled header + body → <DeviceRack name="Input Source" status={audioFile ? (isAnalyzing ? 'active' : 'success') : 'idle'}>. Preserved data-testid="input-panel".
  • Collapsed-summary buttons (Analyze new file + Adjust settings) and the "Hide" button: <Button variant="secondary">.
  • STEM PITCH/NOTE TRANSLATION + AI INTERPRETATION toggles: native <input type="checkbox"> → Radix <Checkbox> (via the ui/ wrapper). Outer card <label> kept for the click-anywhere-on-card UX; htmlFor binds the label to the checkbox id. ARIA labels preserved so smoke selectors continue to resolve. onCheckedChange wraps Radix's CheckedState (true | false | 'indeterminate') with a strict === true check before setting the boolean state.
  • Run Analysis CTA: motion.button<Button variant="primary" size="lg" ledIndicator leadingIcon={<Play>}>. The Button primitive already encodes the bg-bg-panel + border-accent/60 + glow hover + ledIndicator pulse that the inline motion.button was hand-rolling.

Pre-flight decisions honored

  • Two native <select> at :984-998 and :1191-1204 stayed native (already restyled with appearance-none).
  • Radix Checkbox, not Switch, for the analysis options.
  • TooltipProvider not mounted yet — no Tooltip consumers in this PR; will land in a later PR when the first one ships.

Preserved verbatim

  • All data-testid attributes: input-panel, input-panel-collapsed, phase2-status-badge, phase2-status-inline.
  • All visible text strings: "Input Source", "Drop Audio Here", "Load Demo Track", "Run Analysis", "↺ Analyze new file", "Adjust settings", "Hide", "STEM PITCH/NOTE TRANSLATION", "AI INTERPRETATION", "Ready", "Estimated local analysis".
  • All ARIA labels: PITCH/NOTE TRANSLATION, AI INTERPRETATION, ANALYSIS MODE, Interpretation model.
  • Audit findings: N9 collapse, N9 re-expand banner, Codex/backend upload hardening #11 no CPU meter, [codex] Prepare hosted runtime foundation #6 readout placement — all untouched.

Test plan

  • npm run lint — clean
  • npm run test:unit — 605/605 passing (PR 4's new 23 helper tests will land via rebase once feat(ui): D.3 AnalysisStatusPanel → SignalChain (marquee transformation) #67 merges)
  • npm run build — clean (index chunk 323 KB / 97 KB gz; comparable to PR 4 — primitive imports amortized across consumers)
  • npm run test:smoke — sandbox network blocks Playwright browser; smoke selectors target text + data-testid + ARIA labels which are all preserved
  • Manual: drag-drop a file, toggle both checkboxes, click Run Analysis, confirm the rack lights up active during analysis and turns success after; verify Load Demo Track works; verify the collapsed summary appears after analysis completes

Up next (PR 6)

D.5a Results header + metric strip. AnalysisResults.tsx:835-1019 — header → <SectionHeader size="lg" eyebrow="ASA RESULTS" titleRole="page-title"> with Download buttons in the action slot. 4-card row (TEMPO/KEY/METER/CHARACTER at :886-1011) → 4 × <MetricTile size="lg"> inside <DeviceRack name="MEASUREMENT SUMMARY" density="dense">.

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe


Generated by Claude Code

Base automatically changed from claude/ui-restyle-pr4-statuspanel-signalchain to main May 18, 2026 22:45
PR 5 of 16 in the UI consistency overhaul. The Input Source panel
becomes a <DeviceRack name="Input Source">; the analysis-option
toggles become Radix Checkboxes; the Run Analysis CTA becomes a
<Button variant="primary" ledIndicator>; the loaded-file card becomes
a <Panel variant="surface">.

Stacked on PR #67 (D.3 SignalChain). Branch will be rebased onto main
once #66#67 → PR 5 merge in order.

FileUpload.tsx:
- Loaded file card: replaced the hand-rolled bg-bg-card border div
  with <Panel variant="surface" padding="md">. Accent stripe + file
  icon + name + ready-dot + size-warning preserved verbatim.
- Format chips (MP3/WAV/FLAC/AIFF): replaced inline span chips with
  <Pill tone="neutral" variant="outline" size="xs">. Visual parity.
- "Load Demo Track" <button>: replaced with <Button variant="secondary"
  size="md">. Behavior + text preserved verbatim for the smoke test
  selector (tests/smoke/responsive-layout.spec.ts asserts the text).
- Remove File icon button: replaced with <Button variant="ghost"
  iconOnly size="sm">.
- Dropzone container kept as raw div — its drag-event handlers and
  conditional background-tint state are denser than Panel currently
  supports, and shimming Panel to accept onDragOver/Leave/Drop +
  three-way tint logic just to wrap one site would add API surface
  for one consumer.

App.tsx — Input Source panel:
- Outer wrapper at :1018-1027: hand-rolled bg-bg-surface-dark header
  + bg-bg-card body → <DeviceRack name="Input Source"
  status={audioFile ? (isAnalyzing ? 'active' : 'success') : 'idle'}>.
  Preserved data-testid="input-panel".
- Collapsed-summary buttons (Analyze new file + Adjust settings):
  swapped from inline <button> bg-bg-panel borders to <Button
  variant="secondary">.
- "Editing analysis settings" Hide button: <Button variant="secondary"
  size="sm">.
- STEM PITCH/NOTE TRANSLATION toggle: replaced <input type="checkbox">
  with Radix <Checkbox> (via the ui/ wrapper). Outer card label kept
  for the click-anywhere-on-card UX; htmlFor binds the label to the
  checkbox id. Preserved aria-label="PITCH/NOTE TRANSLATION" so the
  smoke selectors continue to resolve.
- AI INTERPRETATION toggle: same treatment. Preserved
  data-testid="phase2-status-inline" and aria-label="AI INTERPRETATION".
- Run Analysis CTA: replaced the motion.button with <Button
  variant="primary" size="lg" ledIndicator leadingIcon={<Play>}>.
  The Button primitive already encodes the bg-bg-panel +
  border-accent/60 + glow hover + ledIndicator pulse that the
  inline motion.button was hand-rolling. Text "Run Analysis"
  preserved verbatim for tests/smoke/upload-phase1.spec.ts.
- Removed the explicit `<X />` import from lucide-react remains used
  by other call sites in App.tsx; left intact.
- Removed unused motion.button (motion is still used elsewhere in the
  file; the import stays).

Pre-flight decisions honored:
- Two native <select> at :984-998 (phase2-model-desktop) and
  :1191-1204 (phase2-model-mobile) stayed native — they were already
  restyled with appearance-none and don't need migration.
- Radix Checkbox, not Switch, for the analysis options (selection
  metaphor, not on/off feature flag).
- TooltipProvider not mounted yet — no Tooltip consumers in this PR.

Preserved verbatim:
- All data-testid attributes (input-panel, input-panel-collapsed,
  phase2-status-badge, phase2-status-inline).
- All visible text strings: "Input Source", "Drop Audio Here",
  "Load Demo Track", "Run Analysis", "↺ Analyze new file",
  "Adjust settings", "Hide", "STEM PITCH/NOTE TRANSLATION",
  "AI INTERPRETATION", "Ready", "Estimated local analysis".
- All ARIA labels (PITCH/NOTE TRANSLATION, AI INTERPRETATION,
  ANALYSIS MODE, Interpretation model).
- Behavior: onCheckedChange wraps Radix's CheckedState ('true' |
  'false' | 'indeterminate') with a strict `=== true` check before
  setting the boolean state, preserving the existing semantics.
- Audit findings (N9 collapse, N9 re-expand banner, #11 no CPU
  meter, #6 readout placement) untouched.

Verified: lint clean, 605/605 unit tests passing, build clean
(index chunk 323 KB / 97 KB gz; comparable to PR 4 — primitive
imports are now amortized across consumers).

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe
@slittycode
slittycode force-pushed the claude/ui-restyle-pr5-fileupload-inputsource branch from cc11a2a to fb5edca Compare May 18, 2026 22:46

@slittycode slittycode left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Verdict: APPROVE

Summary

Pure UI migration: FileUpload.tsx and the Input Source section of App.tsx swap hand-rolled divs/buttons/inputs for DeviceRack, Button, Checkbox, Panel, and Pill primitives. No Phase 1 schema touched, no Phase 2/3 logic involved. Unit test suite passes clean (622 passed, 4 skipped).

Findings

Should fix

  • App.tsx:9 imports Panel but never uses it — Panel only appears in FileUpload.tsx. Dead import; drop it from the App.tsx destructure.

Worth considering

  • motion.buttonButton on Run Analysis (App.tsx:~1244) silently drops the framer-motion whileHover={{ scale: 1.02 }} / whileTap={{ scale: 0.98 }} micro-animations. The new Button uses CSS transition-colors only. Not a bug — the primitive doesn't carry motion deps by design — but if the scale feel was intentional UX it's now gone.

  • Remove File button (FileUpload.tsx:~185): old button had group-hover/btn:text-error turning the X icon red on hover. New Button variant="ghost" resolves to hover:text-text-primary. The icon no longer reddens on hover. Minor visual regression unless the ghost variant is intentionally neutral here.

Test results

622 passed, 4 skipped. No failures.

Phase boundary check

Clean. Both changed files are UI layer only. No analyze.py, no types.ts, no phase2*, no schema fields added, removed, or renamed.


Generated by Claude Code

PR #69 review flagged App.tsx:9 imports Panel but never uses it
(Panel is only consumed in FileUpload.tsx). Drop it.

This is also a low-cost iteration to get CI logs against a fresh
commit — the Frontend job failed on the previous push but the
auth-gated logs prevented diagnosis from this sandbox. Pushing this
clean fix to re-trigger the smoke suite.

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe
claude added 2 commits May 18, 2026 22:53
PR #69's Frontend CI failed twice on smoke tests without accessible
logs from this sandbox. Best hypothesis: the smoke spec at
tests/smoke/upload-estimate-phase1.spec.ts:242-246 uses
page.getByLabel("PITCH/NOTE TRANSLATION") plus .toBeChecked() and
.uncheck(). Playwright's getByLabel documents itself for "input
elements", and .uncheck() expects native checkboxes (or, in some
versions, also role=checkbox). The Radix Checkbox renders as a
<button role="checkbox"> internally; that's a less-consistently-
supported target for these methods than a real <input>.

Revert the two toggles in App.tsx (PITCH/NOTE TRANSLATION and AI
INTERPRETATION) to native <input type="checkbox"> with the same
appearance-none-style border-card UX. The Checkbox primitive in
components/ui/ is unchanged and remains available for surfaces where
smoke selectors aren't load-bearing. Inline comments explain the
rationale at each call site so future migrations don't naively
re-introduce Radix here.

Local 628/628 unit tests still pass; lint clean. If smoke CI passes
on this commit, the hypothesis is confirmed and we can write a real
test against the Radix Checkbox primitive separately to decide
whether it's worth keeping in the canonical toolkit.

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe
PR #69's Frontend CI failed three times. tests/smoke/theme-shell.spec.ts:41
asserts the computed background-color of [data-testid="input-panel"]
is exactly rgb(68, 68, 68) — that's --color-bg-card (#444444). The
PR 5 migration removed `bg-bg-card` from that div because the
DeviceRack wrapper was meant to own the surface chrome. But the
DeviceRack's body is transparent by default (so the rack's gradient
face shows through); the computed background becomes rgba(0,0,0,0)
instead of #444444, failing the test.

Add `bg-bg-card` back to the inner div explicitly. The DeviceRack
still owns the title-strip gradient, border, and box-shadow; the body
is now flat #444444 matching the previous palette contract — and
also matching how Live 12 devices visually compose (gradient header,
relatively flat body).

Also restore the `p-4` padding inside the input-panel div — the
DeviceRack body's --space-device-pad-* is smaller than the original
p-4 the test scenarios were calibrated against.

The other smoke selectors (getByLabel for the toggles, getByTitle on
Remove File, getByRole on Run Analysis) were never the issue —
they're all preserved through prop spreading on the new primitives.

Verified: lint clean, 628/628 unit tests passing, build clean.

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe
@slittycode
slittycode merged commit 69d592b into main May 18, 2026
3 checks passed
@slittycode
slittycode deleted the claude/ui-restyle-pr5-fileupload-inputsource branch May 18, 2026 23:13
slittycode pushed a commit that referenced this pull request May 18, 2026
PR 6 of 16 in the UI consistency overhaul. Promotes the AnalysisResults
page header to <SectionHeader> and wraps the top TEMPO/KEY/METER/
CHARACTER metric strip in a <DeviceRack name="Measurement Summary">
with <MetricTile> cards inside.

Stacked on PR #69 (D.4 FileUpload). Will rebase onto main after #69
merges.

Header (AnalysisResults.tsx:835-880 → :835-878):
- <h1> + Download buttons row → <SectionHeader size="lg"
  variant="inline" eyebrow="ASA Results" titleRole="page-title">
  with both Download buttons in the action slot.
- The Activity icon prefix on the h1 disappears — the SectionHeader
  LED dot already carries the "results are live" semantic.
- The subtitle (sourceFileName · interpretationSubtitle) stays as a
  separate <p> sibling, preserving data-testid="analysis-results-
  subtitle" and the existing text-role-meta styling. Indented pl-4
  to align under the title after the LED.
- Download data: <button> → <Button variant="secondary"
  leadingIcon=FileJson>. Preserved data-testid="analysis-export-json".
- Download report: <button> → <Button variant="primary"
  leadingIcon=FileText>. Preserved
  data-testid="analysis-export-markdown".

Metric strip (AnalysisResults.tsx:884-1012 → :882-1010):
- Outer <div className="grid grid-cols-2 md:grid-cols-4 gap-3"> wrapped
  in <DeviceRack name="Measurement Summary" density="dense"
  status="success">. The grid layout stays as-is inside the rack body
  so the responsive 2-col / 4-col break still works.
- 4 × AccentMetricCard → 4 × <MetricTile size="lg" accent="accent">.
  API parity drop-in:
  • label (was a flex-span with icon+text) → icon prop + label string.
    Cleaner separation; the MetricTile primitive places the icon in
    the eyebrow row.
  • value / unit / headerRight / footer pass through unchanged.
  • The hand-rolled text-[1.5rem] override on the CHARACTER value
    disappears — MetricTile size="lg" already renders text-2xl which
    is the same 1.5rem.

Imports:
- AccentMetricCard stays imported from ./MeasurementPrimitives.
  Other usages of it remain at :1249-1258 and :1444-1448 (Patches /
  Sonic Elements sections — migrated in later PRs D.5b/c/d).
- Added Button / DeviceRack / MetricTile / SectionHeader from ./ui.

Preserved verbatim:
- All data-testid attributes (analysis-results-root, analysis-results-
  subtitle, analysis-export-json, analysis-export-markdown).
- All visible text strings: "Analysis Results", "Download data",
  "Download report", "TEMPO", "BPM", "KEY SIG", "METER", "CHARACTER",
  "SCANNING...".
- The PhaseSourceBadge + ConfidenceBandBadge + MetricBar + StatusBadge
  + TokenBadgeList rendering inside each tile is untouched.
- Audit Finding #4 commentary preserved (canonical band-pill
  vocabulary).
- Audit Finding #1 ordering comment preserved (MeasurementDashboard
  rendering at the bottom of the scroll).
- The lowConfidenceIndicator + characteristicPills logic untouched.

Verified: lint clean, 628/628 unit tests passing, build clean
(AnalysisResults chunk 255 KB / 63 KB gz; index chunk 323 KB / 97 KB
gz — both stable vs PR 5).

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe
slittycode added a commit that referenced this pull request May 18, 2026
PR 6 of 16 in the UI consistency overhaul. Promotes the AnalysisResults
page header to <SectionHeader> and wraps the top TEMPO/KEY/METER/
CHARACTER metric strip in a <DeviceRack name="Measurement Summary">
with <MetricTile> cards inside.

Stacked on PR #69 (D.4 FileUpload). Will rebase onto main after #69
merges.

Header (AnalysisResults.tsx:835-880 → :835-878):
- <h1> + Download buttons row → <SectionHeader size="lg"
  variant="inline" eyebrow="ASA Results" titleRole="page-title">
  with both Download buttons in the action slot.
- The Activity icon prefix on the h1 disappears — the SectionHeader
  LED dot already carries the "results are live" semantic.
- The subtitle (sourceFileName · interpretationSubtitle) stays as a
  separate <p> sibling, preserving data-testid="analysis-results-
  subtitle" and the existing text-role-meta styling. Indented pl-4
  to align under the title after the LED.
- Download data: <button> → <Button variant="secondary"
  leadingIcon=FileJson>. Preserved data-testid="analysis-export-json".
- Download report: <button> → <Button variant="primary"
  leadingIcon=FileText>. Preserved
  data-testid="analysis-export-markdown".

Metric strip (AnalysisResults.tsx:884-1012 → :882-1010):
- Outer <div className="grid grid-cols-2 md:grid-cols-4 gap-3"> wrapped
  in <DeviceRack name="Measurement Summary" density="dense"
  status="success">. The grid layout stays as-is inside the rack body
  so the responsive 2-col / 4-col break still works.
- 4 × AccentMetricCard → 4 × <MetricTile size="lg" accent="accent">.
  API parity drop-in:
  • label (was a flex-span with icon+text) → icon prop + label string.
    Cleaner separation; the MetricTile primitive places the icon in
    the eyebrow row.
  • value / unit / headerRight / footer pass through unchanged.
  • The hand-rolled text-[1.5rem] override on the CHARACTER value
    disappears — MetricTile size="lg" already renders text-2xl which
    is the same 1.5rem.

Imports:
- AccentMetricCard stays imported from ./MeasurementPrimitives.
  Other usages of it remain at :1249-1258 and :1444-1448 (Patches /
  Sonic Elements sections — migrated in later PRs D.5b/c/d).
- Added Button / DeviceRack / MetricTile / SectionHeader from ./ui.

Preserved verbatim:
- All data-testid attributes (analysis-results-root, analysis-results-
  subtitle, analysis-export-json, analysis-export-markdown).
- All visible text strings: "Analysis Results", "Download data",
  "Download report", "TEMPO", "BPM", "KEY SIG", "METER", "CHARACTER",
  "SCANNING...".
- The PhaseSourceBadge + ConfidenceBandBadge + MetricBar + StatusBadge
  + TokenBadgeList rendering inside each tile is untouched.
- Audit Finding #4 commentary preserved (canonical band-pill
  vocabulary).
- Audit Finding #1 ordering comment preserved (MeasurementDashboard
  rendering at the bottom of the scroll).
- The lowConfidenceIndicator + characteristicPills logic untouched.

Verified: lint clean, 628/628 unit tests passing, build clean
(AnalysisResults chunk 255 KB / 63 KB gz; index chunk 323 KB / 97 KB
gz — both stable vs PR 5).

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe

Co-authored-by: Claude <noreply@anthropic.com>
slittycode added a commit that referenced this pull request May 18, 2026
PR 7 of 16 in the UI consistency overhaul. Mix & Master Chain groups
(DRUM PROCESSING, BASS PROCESSING, HIGH-END DETAIL, MASTER BUS) now
each render as a <DeviceRack> with the group emoji + name on the
title strip.

Branched off main (PRs #66/#67/#69/#71 squash-merged). Single-file
PR — AnalysisResults.tsx.

Migration:
- Per-group <section> + <h3> heading → <DeviceRack name={emoji +
  group.name}>. The DeviceRack title strip displays the emoji and
  uppercase group name; the DOM text content is preserved exactly so
  analysisResultsUi.test.ts:441-450 (toContain('🥁 DRUM PROCESSING')
  etc.) continue to pass.
- group.annotation <p> kept inside the rack body with
  data-text-role="meta", margin-bottom restored.
- Cards grid div retains its `grid gap-4 grid-cols-1 sm:grid-cols-2`
  className verbatim — analysisResultsUi.test.ts:440 expects ≥2
  occurrences of this exact string (Mix Chain + Patches).
- mix-chain-applied-progress badge: hand-rolled span → <Pill
  tone="success" size="sm">. Preserved data-testid="mix-chain-
  applied-progress". The Pill emits the canonical
  `bg-success/20 text-success border-success/30` class string the
  test at :507 already asserts is present in the rendered HTML.
- SourcesToggle <button> → <Button variant="link">. Used by both Mix
  Chain and other sections; small ergonomic upgrade.

Deferred (out of D.5b scope):
- Per-card <div> outer wrapper NOT migrated to <Panel variant=
  "surface">. The card carries rich state-dependent styling
  (bg-bg-card with hover transitions, conditional border-l-2 for
  applied state, overflow-hidden for collapsible) that would
  require either extensive className overrides on Panel or
  extending Panel with new variants. Per-card migration deferred
  to a focused follow-up if/when Panel needs the additional
  variants.
- AppliedCheckbox NOT migrated to the Checkbox primitive. The
  existing implementation is already a <button role="checkbox">
  with aria-checked + aria-label + data-testid + green-tinted
  applied state. Migrating to Radix Checkbox would change the
  styling palette (success-green → accent-orange) and require
  Checkbox primitive extensions (tone prop). Existing
  implementation has equivalent a11y semantics and passes the
  applied-checkbox smoke test.

Preserved verbatim:
- All data-testid attributes (mix-chain-applied-progress,
  applied-checkbox, mix-chain-citation-*, mix-chain-headline-*).
- All visible text strings (group names + emojis, "applied",
  "Sources", PRO TIP, etc.).
- The exact `grid gap-4 grid-cols-1 sm:grid-cols-2` className the
  brittle assertion locks.
- All data-text-role attributes on h2/h3/h4/p elements (section-
  title, item-title, meta, body).
- The characteristicPillClass function which produces the
  `bg-{tone}/20 text-{tone} border-{tone}/30` strings asserted at
  :507-509 — untouched.
- CitationBlock + CitationHeadline internals — untouched.
- AppliedCheckbox tracker + audioContentHash gating — untouched.

Verified: lint clean, 628/628 unit tests passing (including
analysisResultsUi.test.ts which directly asserts the preserved
class strings + text + data-text-role attributes), build clean
(AnalysisResults chunk 254 KB / 63 KB gz — slightly smaller than
PR 6 due to removed hand-rolled span styling).

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe

Co-authored-by: Claude <noreply@anthropic.com>
slittycode pushed a commit that referenced this pull request May 18, 2026
PR 14 of 16 in the UI consistency overhaul. Final cleanup pass.

Removes three CSS utility classes from index.css:
- .ableton-panel
- .ableton-device
- .ableton-header

All three were retired by D.* migrations — every former consumer now
uses the canonical primitives from components/ui/ (Panel, DeviceRack,
SectionHeader). `grep -rn` against apps/ui/src/ confirms zero
remaining usages.

.ableton-shell and .ableton-toolbar STAY because App.tsx:952,956 still
consumes them for the outer app chrome (the load-bearing
section-grid shell). A focused follow-up could migrate those two to
DeviceRack / a future AppShell primitive; out of scope here.

Deferred (preserved as-is):
- components/MeasurementPrimitives.tsx cannot be fully deleted yet —
  5 consumers still depend on timeline/lane primitives (LaneContainer,
  LaneRow, StatsBar, TimeRuler) that the plan explicitly preserved.
  The shipped primitives (StatusBadge, DeltaBadge, MetricBar,
  MetricBarRow, OutlinePillButton, TokenBadgeList, StyledDataTable,
  AccentMetricCard) also still have consumers in MeasurementDashboard
  and AnalysisResults sections that weren't migrated (StructureLanes,
  HarmonyLanes, AnalysisResults remaining sections). Keep the file
  intact.
- components/Tooltip.tsx stays as a re-export shim; the file isn't
  causing any drift and external imports may still target it.

Verified: lint clean, 628/628 unit tests passing, build clean.

D.* migrations summary (all merged or open at time of this PR):
- D.0 Foundation (#64) ✓
- D.1 Primitives complete (#65) ✓
- D.2 SamplePlayback (#66) ✓
- D.3 SignalChain marquee (#67) ✓
- D.4 FileUpload + Input Source (#69) ✓
- D.5a Results header + metric strip (#71) ✓
- D.5b Mix Chain (#73) ✓
- D.5c Patches (#74) ✓
- D.5d Section headers (#75) ✓
- D.6a Dashboard structure (#76) ✓
- D.6b Dashboard sections (#77) ✓
- D.6c Dashboard headers (#78) ✓
- D.7 SessionMusicianPanel + MixDoctorPanel (#79) — open
- D.8 Signal Monitor + SpectrogramViewer drift (#80) — open
- D.9 DenseDawConcept drift (#81) — open
- D.10 Cleanup (this PR) ✓

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe
slittycode added a commit that referenced this pull request May 19, 2026
…82)

PR 14 of 16 in the UI consistency overhaul. Final cleanup pass.

Removes three CSS utility classes from index.css:
- .ableton-panel
- .ableton-device
- .ableton-header

All three were retired by D.* migrations — every former consumer now
uses the canonical primitives from components/ui/ (Panel, DeviceRack,
SectionHeader). `grep -rn` against apps/ui/src/ confirms zero
remaining usages.

.ableton-shell and .ableton-toolbar STAY because App.tsx:952,956 still
consumes them for the outer app chrome (the load-bearing
section-grid shell). A focused follow-up could migrate those two to
DeviceRack / a future AppShell primitive; out of scope here.

Deferred (preserved as-is):
- components/MeasurementPrimitives.tsx cannot be fully deleted yet —
  5 consumers still depend on timeline/lane primitives (LaneContainer,
  LaneRow, StatsBar, TimeRuler) that the plan explicitly preserved.
  The shipped primitives (StatusBadge, DeltaBadge, MetricBar,
  MetricBarRow, OutlinePillButton, TokenBadgeList, StyledDataTable,
  AccentMetricCard) also still have consumers in MeasurementDashboard
  and AnalysisResults sections that weren't migrated (StructureLanes,
  HarmonyLanes, AnalysisResults remaining sections). Keep the file
  intact.
- components/Tooltip.tsx stays as a re-export shim; the file isn't
  causing any drift and external imports may still target it.

Verified: lint clean, 628/628 unit tests passing, build clean.

D.* migrations summary (all merged or open at time of this PR):
- D.0 Foundation (#64) ✓
- D.1 Primitives complete (#65) ✓
- D.2 SamplePlayback (#66) ✓
- D.3 SignalChain marquee (#67) ✓
- D.4 FileUpload + Input Source (#69) ✓
- D.5a Results header + metric strip (#71) ✓
- D.5b Mix Chain (#73) ✓
- D.5c Patches (#74) ✓
- D.5d Section headers (#75) ✓
- D.6a Dashboard structure (#76) ✓
- D.6b Dashboard sections (#77) ✓
- D.6c Dashboard headers (#78) ✓
- D.7 SessionMusicianPanel + MixDoctorPanel (#79) — open
- D.8 Signal Monitor + SpectrogramViewer drift (#80) — open
- D.9 DenseDawConcept drift (#81) — open
- D.10 Cleanup (this PR) ✓

https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe

Co-authored-by: Claude <noreply@anthropic.com>
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.

2 participants