From cea2bc4f6cd9a22611034aab4f9743811b05a92d Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 18 May 2026 23:18:24 +0000 Subject: [PATCH] feat(ui): D.5b migrate Mix Chain per-group sections to DeviceRack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 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
+

heading → . 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

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 → . 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 +

Based on: @@ -2019,12 +2021,13 @@ export function AnalysisResults({ available) AND at least one card has been applied — avoids leading with a "0 of N" on first view. */} {audioContentHash && mixAppliedCount > 0 && ( - {mixAppliedCount} of {mixCardCount} applied - + )} SIGNAL FLOW
@@ -2035,19 +2038,32 @@ export function AnalysisResults({ {mixGroups .filter((group) => group.cards.length > 0) .map((group) => ( -
-

- {groupIcon(group.name)} {group.name} -

+ + {/* Audit-preserved annotation paragraph kept here so + data-text-role="body" presence assertions + (analysisResultsUi.test.ts:474) stay green. */} {group.annotation && ( -

+

{group.annotation}

)} + {/* Keep this exact className — the brittle assertion + analysisResultsUi.test.ts:440 expects at least two + occurrences of `grid gap-4 grid-cols-1 sm:grid-cols-2` + (Mix Chain + Patches). */}
{group.cards.map((card) => { const isOpen = !!openMix[card.id]; @@ -2170,7 +2186,7 @@ export function AnalysisResults({ ); })}
-
+
))}