Skip to content

fix: reveal hover-gated controls on touch devices - #471

Open
pat-s wants to merge 2 commits into
abhinavxd:mainfrom
pat-s:pr/touch-affordances
Open

fix: reveal hover-gated controls on touch devices#471
pat-s wants to merge 2 commits into
abhinavxd:mainfrom
pat-s:pr/touch-affordances

Conversation

@pat-s

@pat-s pat-s commented Aug 6, 2026

Copy link
Copy Markdown

These controls are opacity-0 group-hover:opacity-100. Touch has no hover state, so they stay invisible while still being hit-testable — invisible targets rather than absent ones, and the action can't be performed at all:

  • download an attachment, and its name/size
  • edit or delete a custom attribute
  • select a conversation, which gates every bulk action

Uses the [@media(hover:hover)] guard already used by DataTable.vue, so pointer devices are unaffected. For selection on touch the overlay is always live (tap the avatar to select) while the checkbox stays transparent until selection starts, so the avatar stays readable.

Independent of the layout work — applies to touch laptops and tablets today. Refs #470

Summary by CodeRabbit

  • Bug Fixes
    • Improved conversation selection on touch devices, keeping selection controls visible when tapping avatars.
    • Ensured attachment metadata and download controls remain visible on touch devices.
    • Kept attribute action controls accessible on devices without hover support.
    • Preserved existing hover interactions on desktop devices.

These controls are `opacity-0 group-hover:opacity-100`. Touch has no hover
state, so they stay invisible while remaining hit-testable: invisible
targets rather than absent ones, and the actions behind them cannot be
performed at all.

Use the `[@media(hover:hover)]` guard already established by
`DataTable.vue`, so reveal-on-hover applies only where hover exists.

- Download an attachment, and its name and size.
- Edit or delete a custom attribute.
- Select a conversation, which gates every bulk action. On touch the
  overlay is always live so tapping the avatar selects, while the checkbox
  stays transparent until selection is under way, keeping the avatar
  readable until then.
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b476dfbc-37d1-4b6a-bf76-0a49465fd96b

📥 Commits

Reviewing files that changed from the base of the PR and between 1d682cc and 8d883d7.

📒 Files selected for processing (1)
  • frontend/apps/main/src/features/conversation/list/ConversationListItem.vue
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/apps/main/src/features/conversation/list/ConversationListItem.vue

📝 Walkthrough

Walkthrough

Conversation controls now remain visible on touch devices. Hover-only visibility and opacity behavior applies only to devices that support hover. Desktop hover behavior remains unchanged.

Changes

Touch device conversation controls

Layer / File(s) Summary
Conversation selection overlay
frontend/apps/main/src/features/conversation/list/ConversationListItem.vue
The selection overlay remains available on non-hover devices. Checkbox visibility and avatar fading remain hover-specific.
Attachment and attribute actions
frontend/apps/main/src/features/conversation/message/attachment/BubbleAttachmentItem.vue, frontend/apps/main/src/features/conversation/sidebar/CustomAttributes.vue
Metadata, download controls, and attribute actions remain visible on non-hover devices. Hover-capable devices retain hover-only visibility.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: making hover-gated controls available on touch devices.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/apps/main/src/features/conversation/list/ConversationListItem.vue`:
- Around line 31-46: Update the Checkbox opacity classes in ConversationListItem
so keyboard-focused checkboxes become visible by adding the focus-visible
opacity behavior alongside the existing hover and selection states, while
preserving the current non-focused appearance.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: d6f28f04-0caf-4296-804e-61c1cd851c7c

📥 Commits

Reviewing files that changed from the base of the PR and between a482f07 and 1d682cc.

📒 Files selected for processing (3)
  • frontend/apps/main/src/features/conversation/list/ConversationListItem.vue
  • frontend/apps/main/src/features/conversation/message/attachment/BubbleAttachmentItem.vue
  • frontend/apps/main/src/features/conversation/sidebar/CustomAttributes.vue

Comment thread frontend/apps/main/src/features/conversation/list/ConversationListItem.vue Outdated
On a device without hover the selection overlay is always interactive, so
the checkbox is in the tab order while sitting at `opacity-0`. Keyboard
focus therefore landed on an invisible control, with only its focus ring
drawn.

Add `focus-visible:opacity-100`. On hover devices the overlay is
`display: none` until hover, so the checkbox is not focusable there and
nothing changes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant