From d8692343f2a62f597b676ead1c8adeaff038ceff Mon Sep 17 00:00:00 2001 From: usrnk1 <7547651+usrnk1@users.noreply.github.com> Date: Tue, 30 Jun 2026 23:43:44 +0200 Subject: [PATCH] feat(desktop): align tab preview popover animation with tooltip - Skip the open delay when hovering a neighbouring tab within 300ms of a previous close, mirroring the tooltip's skipDelayDuration so sliding across tabs doesn't re-wait the full delay. - Add ignoreSafeArea so the non-interactive preview hides immediately on mouse-out (design: 0ms mouse-out delay). - Tighten the reduced-motion rule to also cover [data-closed], matching tooltip-v2. --- .../src/components/titlebar-tab-popover.css | 3 ++- .../src/components/titlebar-tab-popover.tsx | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/app/src/components/titlebar-tab-popover.css b/packages/app/src/components/titlebar-tab-popover.css index a80ef1e576..2710caf39e 100644 --- a/packages/app/src/components/titlebar-tab-popover.css +++ b/packages/app/src/components/titlebar-tab-popover.css @@ -115,7 +115,8 @@ } @media (prefers-reduced-motion: reduce) { - [data-component="session-tab-popover"] { + [data-component="session-tab-popover"], + [data-component="session-tab-popover"][data-closed] { animation: none; } } diff --git a/packages/app/src/components/titlebar-tab-popover.tsx b/packages/app/src/components/titlebar-tab-popover.tsx index 11c38beee9..247a957298 100644 --- a/packages/app/src/components/titlebar-tab-popover.tsx +++ b/packages/app/src/components/titlebar-tab-popover.tsx @@ -7,6 +7,11 @@ import "./titlebar-tab-popover.css" const OPEN_DELAY = 200 // Mouse-out delay: hide instantly. const CLOSE_DELAY = 0 +// After a preview closes, hovering a neighbouring tab within this window skips +// the open delay — mirrors the tooltip's skipDelayDuration so moving across +// tabs doesn't re-wait the full delay each time. +const SKIP_WINDOW = 300 +let lastClosedAt = 0 export interface TabPreviewData { projectName?: string @@ -24,12 +29,23 @@ export function TabPreviewPopover(props: { }) { let triggerEl: HTMLDivElement | undefined + // Kobalte reads openDelay lazily when the pointer enters the trigger, so this + // resolves the skip window per-hover. + const resolveOpenDelay = () => (Date.now() - lastClosedAt < SKIP_WINDOW ? 0 : OPEN_DELAY) + const handleOpenChange = (open: boolean) => { + if (!open) lastClosedAt = Date.now() + props.onOpenChange(open) + } + return (