You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Audit shared-architecture bugs from slopsmith's KNOWN_ISSUES.md against this repo #4
slopsmith-plugin-splitscreen (a sibling repo sharing this plugin's architecture, function names, and CLAUDE.md contract) has a KNOWN_ISSUES.md cataloging 7 UI bugs found in a frontend audit of its screen.js. Because both repos share the same panel lifecycle/state contracts, several of these likely reproduce here unfixed. This repo has since diverged (per-panel names, top-right Pop/Dock, exposed panels API — PR #20), so exact line numbers won't match; each item needs to be independently verified against this repo's current screen.js.
Items to check
Invert state not persisted/restored — panelToPrefs/prefs-restore path may carry lefty/lyrics but drop inverted, even though pop-out/dock/follower-config code paths thread it through. Repro: toggle Invert, reload or trigger rebuildLayout()/pop+dock — check if Invert silently resets.
Lyrics overlay toggle button not hidden in Lyrics-pane / Jumping-Tab-pane mode — CLAUDE.md says Invert/Lyrics/Tab buttons should be hidden in those modes; check if lyricsBtn specifically is exempted, causing overlay-on-overlay duplication.
Per-panel note detector not torn down/rebuilt across mode/arrangement switches — check if toggleDetect's captured panel.hw goes stale after recreatePanelHighway swaps the highway on lyrics/JT/viz/arrangement transitions, leaving an orphaned detector running.
popOutPanel() missing the _starting-style in-flight guard used by rebuildLayout()/redock — check for a race where a second quick pop-out can rip out a still-building startSplitScreen().
Docking a self-split popup only recovers one sub-panel — check whether the popups tracking structure holds one slot per popup window (not per sub-panel), so docking a popup that split itself into multiple panels loses the others.
Section-map offset can go stale outside the documented sizeCanvases() trigger list (activation, controls-bar toggle, window resize, layout change) — check behavior when the section-map bar's own height/visibility changes independently.
getCurrentTime callback missing null-check on #audio in tab-view wiring, inconsistent with the ternary-guarded pattern used elsewhere for #audio access.
Ask
For each item: confirm whether it reproduces in this repo's current code, and if so file/fix as appropriate (or note here if this repo's PR #20 changes already avoid it).
Item 1 (invert state not persisted/restored) — already fixed pre-existing in this repo (panelToPrefs/initPanel both handle inverted correctly); not a bug here.
Item 2 (lyrics overlay button not hidden in Lyrics-pane/Jumping-Tab-pane mode) — fixed. lyricsBtn/detectBtn/channelBtn are now hidden on mode entry and restored on exit; the per-panel lyrics overlay is now destroyed on entering Lyrics/JT mode and restored on exit if it was on.
Item 3 (per-panel note detector not torn down/rebuilt across mode/arrangement switches) — fixed. recreatePanelHighway() now rebuilds the detector against the fresh highway instance instead of leaving it orphaned on the discarded one.
Item 4 (popOutPanel() missing the _starting in-flight guard) — fixed. Mirrors the guard already used by rebuildLayout()/_redockPanel().
Item 7 (getCurrentTime missing null-check on #audio) — fixed.
Still open:
Item 5 — docking a self-split popup only recovers one sub-panel (the popups Map is keyed one-per-window, not one-per-sub-panel). Architectural, needs its own pass.
Item 6 — sizeCanvases()'s section-map offset can go stale if the section-map bar's own height/visibility changes independently of window resize/layout change/controls-toggle.
Leaving this open until items 5 and 6 are addressed.
Final update — items 5 and 6 are now fixed (branch fix/canvas-identity-notify, PR incoming):
Item 5 (docking a self-split popup only recovers one sub-panel) — dockFollowerPanel() now captures every current sub-panel in the popup (finalStates, plural) instead of just the one whose Dock button was clicked. _redockPanel() builds a prefs entry per sub-panel and grows layout to the smallest layout that fits them, with a toast + graceful truncation if even the largest layout can't hold them all.
Along the way, found and fixed a related bug: redocking a single panel into an already-full layout previously discarded it silently, since startSplitScreen() only ever builds LAYOUTS[layout].panels slots and ignores anything past that in savedPrefs.
Item 6 (sizeCanvases()'s section-map offset can go stale) — sizeCanvases() now lazily attaches a ResizeObserver to #section-map, so panels reflow when that independent plugin changes its bar's height/visibility on its own schedule, not just on the window-resize/activation/layout-change/controls-toggle triggers that were already wired up.
All 25 unit tests pass. Also separately fixed (see fix/canvas-identity-notify history): recreatePanelHighway() wasn't notifying window.feedBack when it replaced panel.canvas, which could silently break external plugins (e.g. Camera Director) caching a canvas reference across an arrangement switch or viz mode toggle.
Closing — all 7 audit items plus the two bugs found during the fix passes are resolved.
Activity
fix: hide mode-inappropriate buttons, dedupe lyrics overlay, rebind d…
cchacs commentedon Jul 22, 2026
Progress update from #5 (merged):
Resolved:
panelToPrefs/initPanelboth handleinvertedcorrectly); not a bug here.lyricsBtn/detectBtn/channelBtnare now hidden on mode entry and restored on exit; the per-panel lyrics overlay is now destroyed on entering Lyrics/JT mode and restored on exit if it was on.recreatePanelHighway()now rebuilds the detector against the fresh highway instance instead of leaving it orphaned on the discarded one.popOutPanel()missing the_startingin-flight guard) — fixed. Mirrors the guard already used byrebuildLayout()/_redockPanel().getCurrentTimemissing null-check on#audio) — fixed.Still open:
popupsMap is keyed one-per-window, not one-per-sub-panel). Architectural, needs its own pass.sizeCanvases()'s section-map offset can go stale if the section-map bar's own height/visibility changes independently of window resize/layout change/controls-toggle.Leaving this open until items 5 and 6 are addressed.
Generated by Claude Code
fix: recover all sub-panels when docking a self-split popup; reflow o…
cchacs commentedon Jul 22, 2026
Final update — items 5 and 6 are now fixed (branch
fix/canvas-identity-notify, PR incoming):dockFollowerPanel()now captures every current sub-panel in the popup (finalStates, plural) instead of just the one whose Dock button was clicked._redockPanel()builds a prefs entry per sub-panel and growslayoutto the smallest layout that fits them, with a toast + graceful truncation if even the largest layout can't hold them all.startSplitScreen()only ever buildsLAYOUTS[layout].panelsslots and ignores anything past that insavedPrefs.sizeCanvases()'s section-map offset can go stale) —sizeCanvases()now lazily attaches aResizeObserverto#section-map, so panels reflow when that independent plugin changes its bar's height/visibility on its own schedule, not just on the window-resize/activation/layout-change/controls-toggle triggers that were already wired up.All 25 unit tests pass. Also separately fixed (see
fix/canvas-identity-notifyhistory):recreatePanelHighway()wasn't notifyingwindow.feedBackwhen it replacedpanel.canvas, which could silently break external plugins (e.g. Camera Director) caching a canvas reference across an arrangement switch or viz mode toggle.Closing — all 7 audit items plus the two bugs found during the fix passes are resolved.
Generated by Claude Code
fix: canvas-identity notify, multi-panel dock recovery, section-map r…