From b16387b2fbf0719afc5932615361bf7bd7c775fe Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Wed, 3 Jun 2026 03:35:25 +0200 Subject: [PATCH] fix: explicit non-overlapping mobile drawer close control MOBILE-SHELL-PARITY defect 2. PrimeVue's default drawer header close-X was leaking through 'header: hidden' (non-important 'hidden' lost to PrimeVue's base .p-drawer-header display in stylesheet order) and overlapping the brand row. Force-hide it with the important variant '!hidden' (matching the file's existing !w-64), and provide the mobile close affordance in SidebarHeader's brand row: on mobile the top-right control renders an X ('Sluit menu') and closes the drawer (handleCollapseClick already calls setMobileOpen(false) on mobile), mirroring the slot the desktop sidebar uses for its collapse chevron. Single, non-overlapping close control; showCloseIcon is left at its default. Co-Authored-By: Claude Opus 4.8 --- apps/app/src/components-v2/layout/AppSidebar.vue | 12 +++++++++++- .../src/components-v2/layout/SidebarHeader.vue | 15 +++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/apps/app/src/components-v2/layout/AppSidebar.vue b/apps/app/src/components-v2/layout/AppSidebar.vue index 03a7d061..f7680f35 100644 --- a/apps/app/src/components-v2/layout/AppSidebar.vue +++ b/apps/app/src/components-v2/layout/AppSidebar.vue @@ -114,6 +114,16 @@ const mobileVisible = computed({ The children are intentionally repeated (not factored into a slot or render-fn) — the 3-component block is short and the duplication is preferable to the indirection of a dynamic component or slot wiring. + + Close control (MOBILE-SHELL-PARITY defect 2): PrimeVue's default header + close-X is force-hidden via `header: '!hidden'`. Plain `hidden` lost to + PrimeVue's base `.p-drawer-header` display in stylesheet order, so the + default X leaked through and overlapped the brand row (the reported + defect). The important variant (`!hidden`, matching this file's existing + `!w-64`) wins. The mobile close affordance instead lives in + SidebarHeader's brand row, which renders an X ("Sluit menu") on mobile — + a single, non-overlapping control in the same top-right slot the desktop + sidebar uses for its collapse chevron. No duplicate, no overlap. --> ({ class="!w-64" :pt="{ content: { class: 'flex flex-col p-0 overflow-hidden h-full' }, - header: { class: 'hidden' }, + header: { class: '!hidden' }, }" > diff --git a/apps/app/src/components-v2/layout/SidebarHeader.vue b/apps/app/src/components-v2/layout/SidebarHeader.vue index 571b1418..a1bd544e 100644 --- a/apps/app/src/components-v2/layout/SidebarHeader.vue +++ b/apps/app/src/components-v2/layout/SidebarHeader.vue @@ -109,19 +109,26 @@ function handleCollapseClick(): void {