diff --git a/src/gui/src/UI/UIWindow.js b/src/gui/src/UI/UIWindow.js index 6b03763be..50b9aae5e 100644 --- a/src/gui/src/UI/UIWindow.js +++ b/src/gui/src/UI/UIWindow.js @@ -4257,16 +4257,19 @@ window.addEventListener('popstate', () => { }); /** - * The control drawer for headless dashboard app windows: a slim glass tray + * The control drawer for headless dashboard app windows: one glass surface * flush with the top edge of the app (parent DOM, above the app's iframe) - * carrying the head's surviving controls — app identity, minimize, and - * close — with a tongue-shaped handle hanging from its bottom center like a - * drawer pull. It opens expanded so first-time and deep-link users see the - * controls, then the tray retracts off the top edge leaving only the tongue - * peeking in; hovering the tongue (mouse), tapping it, or keyboard-focusing - * the drawer pulls it back down. Timers rather than hover alone drive the - * collapse because mousemove inside the app's iframe is invisible to the - * parent — the drawer itself is the only hover surface there is. + * that MORPHS between two shapes. At rest it's a small tongue — a grabber + * bar peeking in from the edge; opened, the same surface swells into a + * tray carrying the head's surviving controls — app identity, minimize, + * and close — while the grabber settles into a slim strip along the + * tray's bottom edge as the dismiss handle. It opens expanded so + * first-time and deep-link users see the controls, then shrinks back into + * the tongue; hovering the tongue (mouse), tapping it, or keyboard- + * focusing the drawer opens it again. Timers rather than hover alone + * drive the collapse because mousemove inside the app's iframe is + * invisible to the parent — the drawer itself is the only hover surface + * there is. * * The drawer is a CHILD of the window element, so it shows/hides/scales with * the window for free (minimize morphs, display:none, fullscreen requests @@ -4277,28 +4280,30 @@ function attach_dashboard_app_drawer (el_window, options) { const icon = options.icon || window.icons['app.svg']; const title = options.title || app_name; - // The handle comes FIRST in the DOM so Tab reaches the toggle before - // the tray's buttons; flex column-reverse (see dashboard.css) puts it - // back below the tray visually. + // The toggle comes FIRST in the DOM so Tab reaches it before the + // controls' buttons; both layers are absolutely positioned (see + // dashboard.css), so DOM order doesn't affect the visuals. const $drawer = $(`