diff --git a/backend/config/window.go b/backend/config/window.go index 03f9876..2e61c05 100644 --- a/backend/config/window.go +++ b/backend/config/window.go @@ -13,13 +13,31 @@ const ( // enforces this at runtime; it is also the floor below which a // reported size is treated as bogus and not persisted. // - // 800x600 is where the shell was measured to still work, rather - // than a round number: below ~780 the header's subtitle wraps and - // pushes the title out of the 4em top bar, and below ~600 tall the - // eleven sidebar items no longer fit at once. The previous - // 512x384 was aspirational — at 700x480 the sidebar overflowed - // behind the player bar with no scroll and Settings and Jobs could - // not be reached at all. + // **Both reasons this comment used to give have expired**, and the + // value is right for a third one. It said the floor was 800x600 + // because "below ~780 the header's subtitle wraps and pushes the + // title out of the 4em top bar" and "below ~600 tall the eleven + // sidebar items no longer fit at once". Neither mechanism can + // happen now: the subtitle is display:none from 899px down + // (index.css), and the sidebar host is overflow-y:auto — measured + // at 600x460, its scrollHeight is 434 against a 332px client and + // Settings is reachable after scrolling. A floor defended by two + // mechanisms that no longer exist is a number nobody can argue + // with, which is worse than either answer. + // + // It stays 800x600 because that is where the *desktop* chrome + // stops being comfortable — the Compact band of plan 018's size + // matrix (#24) — and not because the app breaks below it. It does + // not: under 600px wide the phone layout takes over (bottom-nav, + // no sidebar) and the shell fits 320px exactly, which is what + // makes this a comfort floor rather than a correctness one, and + // why a very small window reflows instead of becoming a + // mini-player (#12 is a second always-on-top window, not a mode of + // this one). + // + // The previous 512x384 was aspirational — at 700x480 the sidebar + // overflowed behind the player bar with no scroll and Settings and + // Jobs could not be reached at all. MinWidth = 800 // MinHeight is the smallest allowed window height in pixels. MinHeight = 600 diff --git a/e2e/specs/layout-overflow.spec.ts b/e2e/specs/layout-overflow.spec.ts index f5cd20a..da0a296 100644 --- a/e2e/specs/layout-overflow.spec.ts +++ b/e2e/specs/layout-overflow.spec.ts @@ -26,6 +26,12 @@ const MIN_VIEWPORT = { width: 800, height: 600 }; const VIEWPORTS = [ { name: '1440×900', width: 1440, height: 900 }, { name: '1024×768', width: 1024, height: 768 }, + // Not the minimum, and that is the point (#24). The sidebar collapses + // to icons *below* 900, so the main panel is 843px at 899 and 700px + // at 900 — the narrowest content area any desktop width produces is + // here, not at the enforced floor. A list that stopped at the minimum + // was missing its own worst case. + { name: '900×600 (the widest sidebar, so the narrowest content)', width: 900, height: 600 }, { name: `the minimum (${MIN_VIEWPORT.width}×${MIN_VIEWPORT.height})`, ...MIN_VIEWPORT }, ];