Skip to content

Touch message actions unreachable on hybrid hover+touch devices (kebab gated on @media hover:none) #405

Description

@sanity

Context

Follow-up from #402 / PR #403 (touch-friendly message actions). The kebab (⋮) message-action menu, and the touch-only pointer-events:none on the hover action bar, are gated on @media (hover: none) (see ui/assets/main.css .touch-actions / .hover-actions).

@media (hover: none) is the exact complement of Tailwind's automatic @media (hover: hover) wrapping on group-hover: utilities, and it correctly covers the issue's targets — phones, tablets, iPadOS Safari (all report hover: none).

The gap

Genuinely-hybrid devices that report hover: hover but are being driven by touch — Windows 2-in-1s in tablet mode, touchscreen Chromebooks, Android/tablet with a mouse attached, Samsung DeX. On those:

  • the kebab is display:none (because hover: none doesn't match), AND
  • the hover action bar needs a real hover a finger can't produce,

so a touch-only user has no path to reply / edit / delete / react.

Most such devices do have a pointing device (that's why they report hover: hover), so it's a real-but-minority stuck case, not a phone regression.

Options (needs a decision)

  1. Keep @media (hover: none) (current) — cleanest; hybrid touch-only users are unserved. Accept as a v1 tradeoff.
  2. @media (hover: none), (any-pointer: coarse) for the .touch-actions display — shows the kebab on anything with a touch capability. Downside: hybrid laptops (mostly mouse-driven) get always-visible kebabs on every message (clutter), and it re-opens the tap-interception question on the hover bar (whose pointer-events:none would then need the same widening, which breaks mouse use of the bar on those devices).
  3. JS pointer-type detection (pointerdown pointerType) to switch affordance per actual input — the only fully-correct fix, but more machinery than a media query.

No overlapping issue exists (checked open issues for hover/touch/pointer/kebab/any-pointer). Not urgent — the primary targets from #402 work.

[AI-assisted - Claude]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions