diff --git a/apps/ui/src/App.tsx b/apps/ui/src/App.tsx index 4859d781..0d68de5b 100644 --- a/apps/ui/src/App.tsx +++ b/apps/ui/src/App.tsx @@ -6,6 +6,7 @@ import { AnalysisStatusPanel } from './components/AnalysisStatusPanel'; import { DiagnosticLog } from './components/DiagnosticLog'; import { FileUpload } from './components/FileUpload'; import { WaveformPlayer } from './components/WaveformPlayer'; +import { Button, DeviceRack } from './components/ui'; // Audit Finding #5: IdleValuePropPanel now occupies the Signal Monitor area // when no file is selected. It tells the producer what ASA does and what to // expect in 30s / 5min. @@ -1016,14 +1017,20 @@ export default function App() {
-
-
- -

Input Source

-
+ + {/* bg-bg-card on the inner div: locked by + tests/smoke/theme-shell.spec.ts:41 which asserts the + input-panel computed background is rgb(68, 68, 68) + (#444444 = --color-bg-card). The DeviceRack's body is + transparent by default so the rack's gradient face + would show through; we explicitly flatten the body + here to preserve the palette contract. */}
{showInputCollapsed && audioFile ? ( // Audit N9: compact post-analysis summary. Replaces the @@ -1054,20 +1061,21 @@ export default function App() {

- - +
) : ( @@ -1079,13 +1087,13 @@ export default function App() {

Editing analysis settings

- +
)}
+ {/* Native input kept here rather than the Radix + Checkbox primitive because Playwright smoke tests + depend on getByLabel + .toBeChecked() + .uncheck() + against this control (tests/smoke/upload-estimate- + phase1.spec.ts:242). Those locators work reliably + for native form controls; the Radix + )} )}
- +
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 && ( - - )} -
+ )}
);