From 49035cfd08a7e1c099213f5f1f3aadb4e7cf75d9 Mon Sep 17 00:00:00 2001 From: Guilhem Lemouel Date: Wed, 23 Sep 2026 14:51:06 +0200 Subject: [PATCH] feat: one corner control for the chrome an app page hides MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hovering the button overlaid on a deployed app brings back whatever that page is hiding: the band always, and the sidebar card too when the sidebar is detached. The card hangs from this button rather than from the header's own handle, which is off-screen with the band. The handle in the band no longer attaches the sidebar — it reveals it and nothing more. A control that hides the thing it sits on cannot also be the way to bring it back, so attaching stays with the toggle in the sidebar's own footer, where detaching happens. The band's two buttons go in the order the things nest: the sidebar's handle, then the header's pin. The overlaid button stands where the pin will be once pinned — same 28px box, and a slot further along when the sidebar's handle takes the first — so pinning moves nothing. It wears the panel pair the sidebar's toggle uses: solid while the band is away, dashed while it is shown. Co-Authored-By: Claude Opus 5 (1M context) --- .../src/lib/components/PageHeaderBar.svelte | 41 +++++++++---------- .../sidebar/navHandlePlacement.svelte.ts | 15 ++++--- .../src/routes/(root)/(logged)/+layout.svelte | 24 ++++++++--- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/frontend/src/lib/components/PageHeaderBar.svelte b/frontend/src/lib/components/PageHeaderBar.svelte index c4f9287970..6842a5a836 100644 --- a/frontend/src/lib/components/PageHeaderBar.svelte +++ b/frontend/src/lib/components/PageHeaderBar.svelte @@ -7,7 +7,7 @@ section name — and the route's own buttons at the far end. The row's height matches the sidebar's own header row, so the two read as one band. -->
- {#if onUnpin} - - - {/if} - {#if navDetached.val && !navHidden} - +
onDock?.()} + onclick={() => navHandleSlot.open()} >
{/if} + {#if onUnpin} + + + {/if} +
{ bandHandleHot = true cancelBandHide() bandPeeked = true + // The one control for the chrome this page is hiding: the band always, and + // the sidebar too when it is detached — hung from this button, since the + // header's own handle is off-screen with the band. + if (navDetached.val) navHandleSlot.open(bandHandleEl) }} onmouseleave={() => { bandHandleHot = false scheduleBandHide() + navHandleSlot.scheduleClose() }} > +