Skip to content

fix(footer): wrap the clusters instead of scrolling them out of sight - #843

Merged
thcp merged 2 commits into
big-releasefrom
fix/footer-clipped-desktop
Oct 23, 2026
Merged

thcp merged 2 commits into
big-releasefrom
fix/footer-clipped-desktop

Conversation

@thcp

@thcp thcp commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #842

What changed

  • footerFit.js: a fourth collapse level, rows, after tight. Whole clusters wrap onto a second line (packed left, dividers hidden). Before it, a row still too wide after tight scrolled sideways inside the strip with no scrollbar.
  • At rows, Master and Export Mix move to their own line under the strip (collapse-stack on .footer-row-controls) only when that makes the controls row shorter. At 1024 with the library open this is 2 cluster lines plus the actions, instead of 4 cluster lines.
  • Analysis cards: .meta-card-value no longer shrinks before its qualifier, so LUFS "-25.2" stops showing as "-25...". The key card keeps shrinking and wrapping as before.
  • New spec footer-no-clip at 1280x820, 1024x720, 1100x820, 1440x900: no footer control clipped by the strip or the viewport, no two overlapping, nothing under Export Mix, each control is what the hit test finds at its centre. Plus one test that a wide window undoes rows. Fails on plain big-release at all four sizes.
  • tests/js/footer-fit.test.mjs: the strip model gets its controls row and wraps at rows; new checks for the tight/rows boundary and reopening.

What did not change

  • No control's behaviour, markup, label or Guide entry. Tab order is the DOM order, unchanged.
  • The wrap, click and tight levels, and the hysteresis ([Bug]: UI distorted #633).
  • Analysis card labels still ellipsize at 1024 and 1100 (Dynamic Range, Tempo Stability, the presence labels). That is the existing floor for those labels, not touched here.

Strategy

The footer already measures in JS because the room depends on the library sidebar, not the window (#586), so this extends that ladder rather than adding a media or container query. Wrapping whole clusters was the only option that covers the deficit: at 1280 the tight row is 910px for 671px, and no spacing or caption change frees 239px. Collapsing a group behind a button would move controls behind a click; wrapping hides nothing and costs one control line of lane height.

Verified

Same backend, a 20 s sine imported through POST /api/jobs, studio in DAW mode, library open. Footer controls clipped or overlapping:

Size WKWebView before WKWebView after Chromium before Chromium after
1280x820 9 clipped 0 9 clipped 0
1024x720 16 clipped 0 16 clipped 0
1100x820 13 clipped 0 13 clipped 0
1440x900 4 clipped 0 4 clipped 0

Both engines measured identical cluster widths (Inter), so the cause was width, not WKWebView text metrics.

Risks

  • The footer is taller when it wraps (54px to 118px for the controls at 1280), so the lanes get less height.
  • Not verified in WebKitGTK, WebView2 or a packaged app. Only WKWebView (snapshot harness, not the app) and Chromium.
  • A single cluster wider than the whole strip (a window below the 1024 minimum, with the library open) still scrolls.

thcp added 2 commits October 23, 2026 00:13
With the library open, the tightest one-line controls row is 910px and
the strip had 671px at the desktop app's default 1280x820 window (415px
at the 1024x720 minimum). Past the "tight" level the row scrolled
sideways with no scrollbar showing, cutting Global key mid-label and
hiding the click track behind Export Mix. Same in WKWebView and
Chromium.

footerFit.js gets a fourth level, "rows": whole clusters wrap onto a
second line, packed left, dividers hidden. When Master and Export Mix
beside the strip would push it to more lines, they move to their own
line under it, kept only when that makes the controls row shorter.

The LUFS value no longer loses digits to the Peak qualifier beside it:
the qualifier gives up its width first.

New spec footer-no-clip checks 1280, 1024, 1100 and 1440 for clipped,
overlapping or covered footer controls.

Closes #842
The node model of the strip had no parent, so the new collapse-stack
check threw before any assertion ran. It now has the controls row
around the strip, wraps clusters at the rows level, and checks that
a strip too short for the tight row wraps, that nothing runs past
its edge, and that the tight/rows boundary settles and opens back up.

Closes #842
@thcp
thcp marked this pull request as ready for review October 23, 2026 22:22
@thcp
thcp merged commit ac72e17 into big-release Oct 23, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant