From fb5edcacf355492ba4c931e281b2e4f0eb45a527 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 18 May 2026 22:44:36 +0000 Subject: [PATCH 1/3] feat(ui): D.4 migrate FileUpload + Input Source to ui/ primitives MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR 5 of 16 in the UI consistency overhaul. The Input Source panel becomes a ; the analysis-option toggles become Radix Checkboxes; the Run Analysis CTA becomes a )} )} - +
diff --git a/apps/ui/src/components/FileUpload.tsx b/apps/ui/src/components/FileUpload.tsx index 8b8fc26a..da9e3a1a 100644 --- a/apps/ui/src/components/FileUpload.tsx +++ b/apps/ui/src/components/FileUpload.tsx @@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { UploadCloud, FileAudio, X, AlertTriangle } from 'lucide-react'; import { isSupportedAudioFile } from '../services/audioFile'; +import { Button, Panel, Pill } from './ui'; interface FileUploadProps { onFileSelect: (file: File) => void; @@ -139,24 +140,26 @@ export function FileUpload({

Drop Audio Here

or click to browse

-
- {['MP3', 'WAV', 'FLAC', 'AIFF'].map(fmt => ( - - {fmt} - - ))} +
+ {['MP3', 'WAV', 'FLAC', 'AIFF'].map((fmt) => ( + + {fmt} + + ))} +
+
+
- {fileError && (
@@ -165,36 +168,45 @@ export function FileUpload({ )}
) : ( -
-
-
-
- -
-
-

{selectedFile.name}

-

- - Ready • {(selectedFile.size / (1024 * 1024)).toFixed(2)} MB -

- {fileSizeWarning && ( -

- - {fileSizeWarning} + + {/* Accent stripe down the left edge — the same Live device-on + affordance used elsewhere. */} +

+
+
+
+ +
+
+

+ {selectedFile.name}

- )} +

+ + Ready • {(selectedFile.size / (1024 * 1024)).toFixed(2)} MB +

+ {fileSizeWarning && ( +

+ + {fileSizeWarning} +

+ )} +
+ {!isLoading && ( + + )}
- {!isLoading && ( - - )} -
+ )}
); From d049e34e079609f94e7a7bf9e9fe5ef9b5bd9080 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 18 May 2026 22:48:34 +0000 Subject: [PATCH 2/3] feat(ui): D.5a migrate Results header + 4-card metric strip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR 6 of 16 in the UI consistency overhaul. Promotes the AnalysisResults page header to and wraps the top TEMPO/KEY/METER/ CHARACTER metric strip in a with cards inside. Stacked on PR #69 (D.4 FileUpload). Will rebase onto main after #69 merges. Header (AnalysisResults.tsx:835-880 → :835-878): -

+ Download buttons row → 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

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: - + + + } + /> + {headerSubtitle && ( +

- - Download report - -

+ {headerSubtitle} +

+ )}
-
- {/* TEMPO */} - - - TEMPO - - } - value={finalBpm} - unit="BPM" - headerRight={} - footer={ -
- {/* Audit Finding #4: `SCORE 0.86` badge retired in favor of the - canonical band pill — same vocabulary as Key, Character, and - every other confidence surface. */} - - {phase1.bpmSource && ( - - {phase1.bpmSource.replace(/_/g, ' ')} - - )} -
- } - /> - - {/* KEY SIG */} - - - KEY SIG - - } - value={{finalKey}} - headerRight={ -
- - {lowConfidenceIndicator(keyIsApproximate)} -
- } - footer={ -
- - {/* Audit Finding #4: `CONF 62%` text replaced with the canonical - band pill so every confidence reads in the same vocabulary. */} - -
- } - /> - - {/* METER */} - - - METER - - } - value={phase1.timeSignature} - footer={} - /> - - {/* CHARACTER — genre primary, characteristic pills secondary */} - {phase1.genreDetail ? ( - - - CHARACTER - - } - value={{phase1.genreDetail.genre}} + +
+ {/* TEMPO */} + } + label="TEMPO" + value={finalBpm} + unit="BPM" headerRight={} footer={
- + {/* Audit Finding #4: `SCORE 0.86` badge retired in favor of the + canonical band pill — same vocabulary as Key, Character, and + every other confidence surface. */} + + {phase1.bpmSource && ( + + {phase1.bpmSource.replace(/_/g, ' ')} + + )} +
+ } + /> + + {/* KEY SIG */} + } + label="KEY SIG" + value={{finalKey}} + headerRight={ +
+ + {lowConfidenceIndicator(keyIsApproximate)} +
+ } + footer={ +
- {/* Audit Finding #4: `CONF X%` replaced with the canonical - band pill — same vocabulary across every confidence. */} - + {/* Audit Finding #4: `CONF 62%` text replaced with the canonical + band pill so every confidence reads in the same vocabulary. */} +
} /> - ) : ( - - - CHARACTER - - } - value={SCANNING...} - footer={ - characteristicPills.length > 0 ? ( -
- {characteristicPills.map((item, idx) => ( - - {shortenCharacteristicName(item.name)} - - ))} -
- ) : undefined - } + + {/* METER */} + } + label="METER" + value={phase1.timeSignature} + footer={} /> - )} -
+ + {/* CHARACTER — genre primary, characteristic pills secondary */} + {phase1.genreDetail ? ( + } + label="CHARACTER" + value={{phase1.genreDetail.genre}} + headerRight={} + footer={ +
+ + + {/* Audit Finding #4: `CONF X%` replaced with the canonical + band pill — same vocabulary across every confidence. */} + +
+ } + /> + ) : ( + } + label="CHARACTER" + value={ + + SCANNING... + + } + footer={ + characteristicPills.length > 0 ? ( +
+ {characteristicPills.map((item, idx) => ( + + {shortenCharacteristicName(item.name)} + + ))} +
+ ) : undefined + } + /> + )} +
+ {/* Audit Finding #1: MeasurementDashboard was here at the top of the results scroll, ahead of Style / Sonic Elements / Mix Chain / Patches. From 41436e661c137afffd6c0d20f424df65a25c56d8 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 18 May 2026 22:53:53 +0000 Subject: [PATCH 3/3] chore: normalize package-lock.json after npm install npm install during PR review stripped redundant `"dev": true` flags from optional platform-specific Rollup binary entries. https://claude.ai/code/session_01EQenqavW2LS5ZTCfbogBJL --- apps/ui/package-lock.json | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/apps/ui/package-lock.json b/apps/ui/package-lock.json index 52cc0bcb..1edabd73 100644 --- a/apps/ui/package-lock.json +++ b/apps/ui/package-lock.json @@ -362,7 +362,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -379,7 +378,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -396,7 +394,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -413,7 +410,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -430,7 +426,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -447,7 +442,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -464,7 +458,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -481,7 +474,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -498,7 +490,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -515,7 +506,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -532,7 +522,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -549,7 +538,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -566,7 +554,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -583,7 +570,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -600,7 +586,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -617,7 +602,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -634,7 +618,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -651,7 +634,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -668,7 +650,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -685,7 +666,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -702,7 +682,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -719,7 +698,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -736,7 +714,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -753,7 +730,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -770,7 +746,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -787,7 +762,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [