chore: normalize package-lock.json (npm install artifact) - #72
chore: normalize package-lock.json (npm install artifact)#72slittycode wants to merge 3 commits into
Conversation
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
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
npm install during PR review stripped redundant `"dev": true` flags from optional platform-specific Rollup binary entries. https://claude.ai/code/session_01EQenqavW2LS5ZTCfbogBJL
slittycode
left a comment
There was a problem hiding this comment.
Verdict: APPROVE
Summary
This PR does two distinct things: (1) normalizes the lockfile by stripping "dev": true from 26 optional Rollup platform binaries, and (2) migrates App.tsx, AnalysisResults.tsx, and FileUpload.tsx from ad-hoc inline HTML elements to the components/ui design system (Button, Checkbox, DeviceRack, MetricTile, Panel, Pill, SectionHeader). Tests pass clean. No phase boundary violations.
The PR title and description only describe the lockfile change; the actual diff is ~370 lines of UI component migration. Fine to merge but someone will squint at the git log.
Findings
Should fix
Panelis imported inApp.tsx:9but never referenced anywhere in the file. The other*Panelsymbols (AnalysisStatusPanel,IdleValuePropPanel) are different imports.noUnusedLocalsisn't set intsconfig.jsonso this doesn't fail lint. DropPanelfrom that import line.
Worth considering
-
The "Run Analysis" button was a
motion.buttonwithwhileHover={{ scale: 1.02 }}/whileTap={{ scale: 0.98 }}. The newButtonis pure CSS (transition-colors). The scale-pulse on the primary CTA is gone. If that was intentional — fine, the new design is clean — but it's a deliberate feel regression on the most important interactive element in the product and should be called out explicitly rather than buried in a lockfile PR. -
AnalysisResults.tsxwraps the metric quad in<DeviceRack status="success">with a hardcoded status. The rack always shows a success LED regardless of actual measurement quality. Trivial now becauseAnalysisResultsonly mounts when analysis completes, but ifDeviceRackever gains conditional styling based on status this will need revisiting.
Test results
645 passed | 4 skipped | 0 failed. Full unit suite ran clean.
Phase boundary check
Clean. All changed files are pure UI layer. phase1.* fields are read for display only; no re-derivation or mutation anywhere in the diff.
Generated by Claude Code
|
Closing as superseded. Same as #70: this PR and #68 had the same purpose — strip Verified empty against No further action needed. https://claude.ai/code/session_01WNtYcWXwn4mVnnjxqT7uAe Generated by Claude Code |
Summary
npm installduring PR feat(ui): D.5a migrate Results header + 4-card metric strip #71 review stripped redundant"dev": trueflags from 26 optional platform-specific Rollup binary entries inpackage-lock.json. This is a no-op change generated by npm's lockfile normalization.Test plan
https://claude.ai/code/session_01EQenqavW2LS5ZTCfbogBJL
Generated by Claude Code