A11Y: warm tooltip closes when the pointer moves onto its text #744

Open
opened 2026-10-02 13:08:11 +00:00 by kayg · 4 comments
Owner

Source audit from rev-a11y (#427), base c4a61e8cf090170f35b1bed3350d9de20c83ecd5. No product changes or production build were made.

A4 — Warm tooltips cannot stay open under the pointer

Priority: P2. Family: shared warm tooltips. Tracking: this issue.
Criterion: 1.4.13 Content on Hover or Focus.

Evidence:

  • packages/ui/src/components/tooltip/TooltipLayer.svelte:215: pointer
    exit hides the bubble unless the pointer stays inside the trigger.
  • packages/ui/src/components/tooltip/TooltipLayer.svelte:388: the bubble
    has pointer-events: none.

Effect: moving from a small toolbar control onto its tooltip closes the
text. A User who magnifies the interface cannot keep the text visible while
moving to read it. Escape dismissal already exists.

Fix: retain the tooltip while either the trigger or bubble is hovered.
Allow pointer entry to the bubble. Use a bounded grace period across the
gap. Preserve Escape dismissal, keyboard behavior and touch peek behavior.

Test: hover a toolbar action, move through the gap into the tooltip, and
check that it stays visible. Escape must close it without moving focus.
Leaving both regions must close it.

Duplicate check: searched all-state Forgejo issues for tooltip and accessibility. Existing chart-hover and tooltip styling issues do not cover pointer entry to the shared warm tooltip.

Use the existing component and tests. Check phone (390 px), tablet (820 px) and desktop (1440 px), light and dark, with macOS shortcut rendering. Keep keyboard and pointer motion durations equal; retain reduced-motion support.

Source audit from rev-a11y (#427), base `c4a61e8cf090170f35b1bed3350d9de20c83ecd5`. No product changes or production build were made. ### A4 — Warm tooltips cannot stay open under the pointer Priority: P2. Family: shared warm tooltips. Tracking: this issue. Criterion: 1.4.13 Content on Hover or Focus. Evidence: - `packages/ui/src/components/tooltip/TooltipLayer.svelte:215`: pointer exit hides the bubble unless the pointer stays inside the trigger. - `packages/ui/src/components/tooltip/TooltipLayer.svelte:388`: the bubble has `pointer-events: none`. Effect: moving from a small toolbar control onto its tooltip closes the text. A User who magnifies the interface cannot keep the text visible while moving to read it. Escape dismissal already exists. Fix: retain the tooltip while either the trigger or bubble is hovered. Allow pointer entry to the bubble. Use a bounded grace period across the gap. Preserve Escape dismissal, keyboard behavior and touch peek behavior. Test: hover a toolbar action, move through the gap into the tooltip, and check that it stays visible. Escape must close it without moving focus. Leaving both regions must close it. Duplicate check: searched all-state Forgejo issues for tooltip and accessibility. Existing chart-hover and tooltip styling issues do not cover pointer entry to the shared warm tooltip. Use the existing component and tests. Check phone (390 px), tablet (820 px) and desktop (1440 px), light and dark, with macOS shortcut rendering. Keep keyboard and pointer motion durations equal; retain reduced-motion support.
Author
Owner

Exact line anchors for the audited base c4a61e8cf090170f35b1bed3350d9de20c83ecd5: packages/ui/src/components/tooltip/TooltipLayer.svelte:208–216 is the exit handler and :391 is the bubble's pointer-events: none. The earlier body quoted nearby line numbers. The final report uses these exact anchors.

Exact line anchors for the audited base `c4a61e8cf090170f35b1bed3350d9de20c83ecd5`: `packages/ui/src/components/tooltip/TooltipLayer.svelte:208–216` is the exit handler and `:391` is the bubble's `pointer-events: none`. The earlier body quoted nearby line numbers. The final report uses these exact anchors.
Author
Owner

Additional source check: tooltip exit handling hides on trigger pointerout, and the bubble has pointer-events:none, so pointer entry cannot retain it. I am adding trigger-or-bubble hover ownership with a bounded bridge delay while preserving Escape and touch behavior.

Additional source check: tooltip exit handling hides on trigger `pointerout`, and the bubble has `pointer-events:none`, so pointer entry cannot retain it. I am adding trigger-or-bubble hover ownership with a bounded bridge delay while preserving Escape and touch behavior.
Author
Owner

Started work on job/undo-a11y-a11y, based on 9281e63b0164fd0297d959f37eb0008bfa0aa4d3. Scope: issues #740, #741, #744, #745, #819 and #820. I am reproducing each reported behavior with a regression test before changing implementation.

Started work on `job/undo-a11y-a11y`, based on `9281e63b0164fd0297d959f37eb0008bfa0aa4d3`. Scope: issues #740, #741, #744, #745, #819 and #820. I am reproducing each reported behavior with a regression test before changing implementation.
Author
Owner

Finding #744: a fine-pointer tooltip closed immediately on pointerout from its trigger, and the tooltip bubble used pointer-events: none, so users could not move into it to read or copy its label. The regression test failed against the old behavior at the visible-after-trigger-exit assertion. The fix keeps the visible bubble hoverable and adds a 180 ms exit grace; the focused suite now passes (3 tests).

Finding #744: a fine-pointer tooltip closed immediately on pointerout from its trigger, and the tooltip bubble used `pointer-events: none`, so users could not move into it to read or copy its label. The regression test failed against the old behavior at the visible-after-trigger-exit assertion. The fix keeps the visible bubble hoverable and adds a 180 ms exit grace; the focused suite now passes (3 tests).
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#744
No description provided.