fix(ui): stop painting the same separation progress twice (#285) 2 months ago
Authored
Davy 7/27/2026, 11:20:08 AM * fix(ui): stop painting the same separation progress twice
Single-song separation and uploads keep one full progress bar in the
global task list; song rows use a compact status chip. Batch runs keep
complementary surfaces: aggregate total globally, compact per-song bar
on the active row. Measure virtual list rows when height changes so an
expanded batch row does not overlap neighbours.
* ci: align actions/checkout version comments with the pinned SHA
The checkout pin 3d3c42e… is v7.0.1. mirror.yml still said v4 and
spectral-candidate.yml said v5, which tripped zizmor ref-version-mismatch
alerts #390 and #397.
* chore: prefer self-explanatory code over rationale comments
Update Agents.md engineering rules: constraints and design rationale
belong in commit messages or ADRs, not source. Strip the narrative
comments added with the progress-bar UI change.
* test: drop narrative comments from progress UI tests
* chore: strip narrative comments and cover progress-bar edge paths
Update AGENTS.md so design rationale lives in commits/ADRs, not source.
Remove frontend RATIONALE essays and multi-line product narration that
the old engineering rules encouraged. Cover compact TaskProgressBar
clamping/indeterminate fill and SongList virtual measure helpers so
patch coverage stays green. Parent15ef164
147 files changed
.github/workflows/mirror.yml +1 −1 .github/workflows/spectral-candidate.yml +1 −1 AGENTS.md +5 −4 src/App.tsx +0 −3 src/components/Bootstrap/ModelBootstrapBanner.tsx +0 −5 src/components/Bootstrap/RuntimeUpdateBanner.tsx +0 −6 src/components/ErrorBoundary.tsx +0 −5 src/components/Layout/AppLayout.tsx +0 −17
src/components/Layout/AppShellSkeleton.tsx +0 −9
src/components/Layout/GlobalProgressBar.test.tsx +29 −4
src/components/Layout/GlobalProgressBar.tsx +33 −9
src/components/Library/AlphabetRail.test.tsx +0 −5
src/components/Library/AlphabetRail.tsx +0 −29
src/components/Library/SearchBox.tsx +0 −3
src/components/Library/SongList.tsx +7 −17
src/components/Library/SongListItem.test.tsx +119 −11
src/components/Library/SongListItem.tsx +41 −35
src/components/Library/song-list-item-context-menu-build.test.ts +0 −2
src/components/Library/song-list-virtual.test.ts +46 −0
src/components/Library/song-list-virtual.ts +18 −0
src/components/Library/submenu-safety-zone.test.ts +0 −9
src/components/Lyrics/LyricLine.test.tsx +0 −2
src/components/Lyrics/LyricLine.tsx +0 −14
src/components/Lyrics/LyricsEditDialog.tsx +0 −2
src/components/Lyrics/LyricsEmptyState.tsx +0 −3
src/components/Lyrics/LyricsFontSizeControl.test.tsx +0 −2
src/components/Lyrics/LyricsOffsetControl.test.tsx +0 −3
src/components/Lyrics/LyricsPanel.tsx +0 −12
src/components/Lyrics/lyrics-scroll.ts +0 −18
src/components/Lyrics/plain-text-pages.test.ts +0 −12
src/components/Overlay/Tooltip.test.tsx +0 −2
src/components/Playback/PlaybackStage.test.tsx +0 −6
src/components/Playback/PlaybackStage.tsx +0 −14
src/components/Player/AirPlayRouteButton.tsx +1 −8
src/components/Player/AudioLevelSlider.tsx +0 −2
src/components/Player/FullscreenControls.test.tsx +0 −3
src/components/Player/FullscreenControls.tsx +1 −13
src/components/Player/FullscreenPlayerView.test.tsx +0 −2
src/components/Player/FullscreenPlayerView.tsx +0 −7
src/components/Player/MonitorPicker.tsx +1 −3
src/components/Player/PeakMeter.test.tsx +0 −23
src/components/Player/PeakMeter.tsx +0 −38
src/components/Player/RemoteReconnectIndicator.tsx +0 −3
src/components/Player/SeekBar.test.tsx +0 −13
src/components/Player/SeekBar.tsx +0 −38
src/components/Player/VolumeSliders.interaction.test.tsx +0 −6
src/components/Player/VolumeSliders.tsx +0 −25
src/components/Player/playback-bar-layout.ts +0 −8
src/components/Settings/ConfirmationDialog.tsx +0 −3
src/components/Settings/LibrarySetup.render.test.tsx +0 −3
src/components/Settings/LibrarySetup.tsx +0 −6
src/components/Settings/SettingsAboutSection.test.tsx +0 −4
src/components/Settings/SettingsCrossfadeSection.test.tsx +0 −2
src/components/Settings/SettingsCrossfadeSection.tsx +0 −14
src/components/Settings/SettingsEqSection.test.tsx +0 −6
src/components/Settings/SettingsEqSection.tsx +0 −31
src/components/Settings/SettingsModelVariantSection.tsx +0 −8
src/components/Settings/SettingsOverlay.state.test.ts +0 −2
src/components/Settings/SettingsOverlay.state.ts +0 −24
src/components/Settings/SettingsOverlay.test.tsx +0 −1
src/components/Settings/SettingsRemoteDiagnosticsSection.test.tsx +0 −1
src/components/Settings/SettingsRuntimeSection.test.tsx +0 −2
src/components/Settings/SettingsRuntimeSection.tsx +0 −8
src/components/Settings/remote-library-copy.ts +0 −3
src/components/Settings/settings-overlay.integrity-actions.ts +0 −1
src/components/Settings/settings-overlay.library-actions.test.ts +0 −2
src/components/Settings/settings-overlay.library-actions.ts +0 −9
src/components/Settings/settings-overlay.model-actions.ts +0 −2
src/components/Shared/CoverArtThumbnail.asset.test.tsx +0 −2
src/components/Shared/CoverArtThumbnail.tsx +0 −12
src/hooks/use-audience-plain-text-paging.layout.test.tsx +1 −20
src/hooks/use-audience-plain-text-paging.ts +0 −3
src/hooks/use-cdg-frame-receiver.ts +0 −10
src/hooks/use-cdg-sync.coordinator.test.ts +0 −4
src/hooks/use-cdg-sync.render.test.tsx +0 −12
src/hooks/use-cdg-sync.ts +0 −82
src/hooks/use-event-subscription.ts +0 −4
src/hooks/use-keyboard-shortcuts.test.ts +0 −4
src/hooks/use-keyboard-shortcuts.ts +0 −12
src/hooks/use-local-audience-romanize-receiver.test.tsx +0 −2
src/hooks/use-local-audience-romanize-receiver.ts +0 −18
src/hooks/use-lyrics-engine.test.tsx +0 −18
src/hooks/use-lyrics-engine.ts +0 −47
src/hooks/use-playback-runtime.test.tsx +0 −22
src/hooks/use-playback-runtime.ts +0 −10
src/lib/alphabet-index.ts +0 −5
src/lib/audience-presentation.ts +0 −4
src/lib/cdg-protocol.ts +0 −24
src/lib/cover-art.hook.test.tsx +0 −10
src/lib/cover-art.test.ts +0 −4
src/lib/cover-art.ts +0 −45
src/lib/debug-info.test.ts +0 −2
src/lib/fullscreen-player.ts +0 −7
src/lib/i18n.test.ts +0 −3
src/lib/i18n.ts +0 −9
src/lib/local-audience-romanize.ts +0 −6
src/lib/lyrics-companion-romanization.test.ts +0 −9
src/lib/lyrics-companion-romanization.ts +0 −3
src/lib/lyrics-engine.test.ts +0 −21
src/lib/lyrics-engine.ts +0 −58
src/lib/lyrics-line-runtime.test.ts +0 −3
src/lib/lyrics-line-runtime.ts +0 −5
src/lib/lyrics-playback-time.ts +0 −14
src/lib/lyrics-romanizer.test.ts +0 −2
src/lib/lyrics-romanizer.ts +0 −7
src/lib/native-context-menu.ts +0 −3
src/lib/notifications.test.ts +0 −2
src/lib/romanize-options.test.ts +0 −4
src/lib/romanize-options.ts +0 −12
src/lib/song-display.ts +0 −3
src/lib/song-sort.test.ts +0 −6
src/lib/song-sort.ts +0 −27
src/lib/tauri/library.ts +0 −3
src/lib/tauri/lyrics.ts +0 −3
src/lib/waveform-cache.test.ts +0 −2
src/lib/waveform-cache.ts +0 −5
src/locales/locales.test.ts +0 −32
src/mock/preview-songs.ts +0 −10
src/mock/tauri-mock-data.ts +0 −20
src/mock/tauri-mock-impl.ts +0 −30
src/playback/audience-projector.ts +0 −7
src/playback/position-clock.test.ts +0 −10
src/playback/position-clock.ts +0 −28
src/playback/session.test.ts +0 −6
src/playback/session.ts +0 −25
src/runtime/app-ready-runtime.test.tsx +0 −3
src/runtime/app-runtime.ts +0 −9
src/runtime/local-audience-romanize-runtime.ts +0 −25
src/runtime/menu-runtime.ts +0 −6
src/runtime/settings-runtime.ts +0 −2
src/runtime/shell-document.ts +0 −3
src/runtime/theme-runtime.test.tsx +0 −6
src/runtime/theme-runtime.ts +0 −11
src/stores/library-store.test.ts +0 −1
src/stores/library-store.ts +1 −8
src/stores/lyrics-store.test.ts +0 −10
src/stores/lyrics-store.ts +0 −41
src/stores/player-store.test.ts +0 −7
src/stores/player-store.ts +0 −17
src/stores/queue-store.ts +0 −3
src/stores/rotation-store.test.ts +0 −6
src/stores/rotation-store.ts +0 −6
src/stores/settings-store.test.ts +0 −12
src/stores/settings-store.ts +0 −21
src/types/ipc-contract.test.ts +0 −33
src/types/ipc.ts +0 −36
src/workers/romanize.worker.ts +0 −3