Calendar: pinned hover preview closes on mouse-leave #101

Closed
opened 2026-09-25 17:22:47 +00:00 by kayg · 2 comments
Owner

Reproduction

Against the local production server, Playwright created a real Log entry, hovered its Calendar block, moved into the preview, waited past the first grace period, clicked Pin preview, moved out of the preview, and waited 350 ms. The preview disappeared. Result: stillPresentAfterLeave=false. Screenshot: /home/kayg/Developer/calternal/target/popover-audit/screenshots/calendar-pin-after-mouseleave-1440-paper.png.

Root cause

The state is split between apps/web/src/routes/calendar/[view]/[date]/+page.svelte and packages/ui/src/components/calendar/CalendarPopover.svelte:

  • The route stores preview.hover separately from pinned (route lines 107–110).
  • Pin preview only toggles the bound pinned boolean (CalendarPopover lines 167–178). It does not change preview.hover or cancel the route timer.
  • The route’s hover-leave handler (lines 654–672) waits 220 ms and clears preview if preview.hover is true and .cal-popover is not hovered. It never checks pinned.

The hover-open path can also replace a pinned hover preview when another Calendar block receives pointer intent, because it guards clicked previews but does not check pinned.

Expected

Pinning must cancel hover cleanup and make the preview persistent. Unpinning returns it to hover behavior. X closes and unpins.

## Reproduction Against the local production server, Playwright created a real Log entry, hovered its Calendar block, moved into the preview, waited past the first grace period, clicked Pin preview, moved out of the preview, and waited 350 ms. The preview disappeared. Result: stillPresentAfterLeave=false. Screenshot: /home/kayg/Developer/calternal/target/popover-audit/screenshots/calendar-pin-after-mouseleave-1440-paper.png. ## Root cause The state is split between apps/web/src/routes/calendar/[view]/[date]/+page.svelte and packages/ui/src/components/calendar/CalendarPopover.svelte: - The route stores preview.hover separately from pinned (route lines 107–110). - Pin preview only toggles the bound pinned boolean (CalendarPopover lines 167–178). It does not change preview.hover or cancel the route timer. - The route’s hover-leave handler (lines 654–672) waits 220 ms and clears preview if preview.hover is true and .cal-popover is not hovered. It never checks pinned. The hover-open path can also replace a pinned hover preview when another Calendar block receives pointer intent, because it guards clicked previews but does not check pinned. ## Expected Pinning must cancel hover cleanup and make the preview persistent. Unpinning returns it to hover behavior. X closes and unpins.
Author
Owner

Superseded by the owner's decision: pinning is removed entirely (see #100). Selecting an item keeps the popover open. job/polish-menus-search is implementing this; close this issue when it merges.

Superseded by the owner's decision: pinning is removed entirely (see #100). Selecting an item keeps the popover open. job/polish-menus-search is implementing this; close this issue when it merges.
Author
Owner

Superseded by the owner decision in #100: selection keeps the preview open and the pin action is removed.

Superseded by the owner decision in #100: selection keeps the preview open and the pin action is removed.
kayg closed this issue 2026-10-03 11:55:07 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#101
No description provided.