Skip to content

fix(web): use --surface-hover token for menu and listbox elements#31273

Merged
ashleeradka merged 2 commits into
mainfrom
devin/1779283700-fix-ghost-hover-tokens
May 20, 2026
Merged

fix(web): use --surface-hover token for menu and listbox elements#31273
ashleeradka merged 2 commits into
mainfrom
devin/1779283700-fix-ghost-hover-tokens

Conversation

@ashleeradka
Copy link
Copy Markdown
Contributor

@ashleeradka ashleeradka commented May 20, 2026

Prompt / plan

Follow-up from #31271 review: several elements in the skills domain used --ghost-hover, which is semantically intended for ghost Button hover states only. Menus, list rows, card rows, and file tree entries should use --surface-hover per the design token conventions.

Four occurrences fixed across three files:

  • skills-tab.tsx:463 — filter dropdown trigger (<button aria-haspopup="listbox">)
  • skills-tab.tsx:544 — listbox option rows
  • skill-row.tsx:46 — skill card row (<div role="button">)
  • skill-detail.tsx:184 — file tree entry (<button>)

One usage intentionally left unchanged:

  • category-sidebar.tsx:80<Button variant="ghost"> — this IS a ghost Button, so --ghost-hover is semantically correct.

Test plan

  • bunx tsc --noEmit — passes
  • bun run lint — passes
  • CI checks

Link to Devin session: https://app.devin.ai/sessions/c4696ace57fe43649f2475d7661ac273
Requested by: @ashleeradka


Open in Devin Review

Replace --ghost-hover with --surface-hover on the skills filter
dropdown trigger and listbox option rows. Per semantic token
conventions, --ghost-hover is for ghost Button hover states only;
menus and list rows should use --surface-hover.

Co-Authored-By: ashlee@vellum.ai <ashlee@vellum.ai>
@devin-ai-integration
Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

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

Devin Review found 1 potential issue.

Open in Devin Review

aria-haspopup="listbox"
aria-expanded={open}
className="inline-flex w-40 items-center justify-between gap-2 rounded-lg border bg-[var(--surface-active)] px-3 py-2 text-body-medium-lighter transition-colors hover:bg-[var(--ghost-hover)]"
className="inline-flex w-40 items-center justify-between gap-2 rounded-lg border bg-[var(--surface-active)] px-3 py-2 text-body-medium-lighter transition-colors hover:bg-[var(--surface-hover)]"
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.

🚩 Inconsistent hover token usage within the skills domain after this change

This PR changes --ghost-hover--surface-hover in FilterDropdown (line 463) and FilterGroup (line 544), but three sibling files in the same skills/ directory still use --ghost-hover:

  • category-sidebar.tsx:80hover:bg-[var(--ghost-hover)]
  • skill-row.tsx:46hover:bg-[var(--ghost-hover)]
  • skill-detail.tsx:184hover:bg-[var(--ghost-hover)]

These tokens resolve to different values: --ghost-hover is solid (e.g. #F2F0EE in light mode via --surface-active), while --surface-hover is semi-transparent (rgba(185, 180, 172, 0.08)). The visual difference is noticeable. If this is an intentional migration toward --surface-hover, CONVENTIONS.md:905-906 says "When fixing a convention violation, audit the broader codebase for the same violation and fix all instances." If the intent is design-specific (only these two components should change), the inconsistency within the same feature area is worth confirming with the designer.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

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.

Good catch — audited the three sibling files:

  • skill-row.tsx:46<div role="button"> card row → changed to --surface-hover
  • skill-detail.tsx:184<button> file tree entry → changed to --surface-hover
  • category-sidebar.tsx:80<Button variant="ghost"> → this IS a ghost Button, so --ghost-hover is semantically correct here. No change needed.

Pushed the fix.

vex-assistant-bot[bot]
vex-assistant-bot Bot previously approved these changes May 20, 2026
Copy link
Copy Markdown
Contributor

@vex-assistant-bot vex-assistant-bot Bot left a comment

Choose a reason for hiding this comment

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

APPROVE

Value: Closes the semantic token gap flagged in #31271 — menus and listbox rows now use the correct hover token.

What this does: Swaps --ghost-hover--surface-hover on two elements in skills-tab.tsx: the filter dropdown trigger and the listbox option rows.

Both changes are correct per our design token conventions. --ghost-hover is for ghost Button states only; --surface-hover is the right token for menus, list rows, and popovers. Two-line diff, nothing else touched.

CI: ✅ Lint/Type/Build, Socket Security · Reviewed at dc81e37f

Vellum Constitution — Inviting: consistent, intentional token usage makes the UI feel coherent rather than assembled.

skill-row.tsx uses a div[role=button] card row and skill-detail.tsx
uses a button for file tree entries — neither is a ghost Button, so
--surface-hover is the correct token.

Co-Authored-By: ashlee@vellum.ai <ashlee@vellum.ai>
@ashleeradka ashleeradka merged commit 7e9b588 into main May 20, 2026
3 checks passed
@ashleeradka ashleeradka deleted the devin/1779283700-fix-ghost-hover-tokens branch May 20, 2026 13:42
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