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)
- Keep
@media (hover: none) (current) — cleanest; hybrid touch-only users are unserved. Accept as a v1 tradeoff.
@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).
- 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]
Context
Follow-up from #402 / PR #403 (touch-friendly message actions). The kebab (⋮) message-action menu, and the touch-only
pointer-events:noneon the hover action bar, are gated on@media (hover: none)(seeui/assets/main.css.touch-actions/.hover-actions).@media (hover: none)is the exact complement of Tailwind's automatic@media (hover: hover)wrapping ongroup-hover:utilities, and it correctly covers the issue's targets — phones, tablets, iPadOS Safari (all reporthover: none).The gap
Genuinely-hybrid devices that report
hover: hoverbut are being driven by touch — Windows 2-in-1s in tablet mode, touchscreen Chromebooks, Android/tablet with a mouse attached, Samsung DeX. On those:display:none(becausehover: nonedoesn't match), ANDso 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)
@media (hover: none)(current) — cleanest; hybrid touch-only users are unserved. Accept as a v1 tradeoff.@media (hover: none), (any-pointer: coarse)for the.touch-actionsdisplay — 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 (whosepointer-events:nonewould then need the same widening, which breaks mouse use of the bar on those devices).pointerdownpointerType) 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]