Menu

#253 fix(ui): add cursor:pointer to all interactive buttons across the product

closed
nobody
released (243)
2026-06-11
2026-06-11
Anonymous
No

Originally created by: Akarsh-Hegde

Summary

  • Browsers default <button> to cursor:default — hovering buttons showed an arrow instead of a hand, making them feel unclickable.
  • Added a global CSS rule in globals.css so every enabled button shows pointer, and disabled ones show not-allowed.
  • Fixed 5 inline cursor: 'default' styles in Switch, Select (trigger + item), and NumberStepper (decrement + increment) that would have overridden the global rule.
  • Added 9 test cases in ui/__tests__/cursor-pointer.test.ts to prevent regressions.

Files changed

File Change
ui/app/globals.css Global button:not(:disabled) + button:disabled cursor rules
ui/components/ui/Switch.tsx cursor: 'default''pointer'
ui/components/ui/Select.tsx cursor: 'default''pointer' (trigger + item)
ui/components/ui/NumberStepper.tsx 2× conditional 'default''pointer'
ui/__tests__/cursor-pointer.test.ts 9 new tests (CSS rule presence + no override regressions)

Test plan

  • [x] bun test __tests__/cursor-pointer.test.ts — 9/9 pass
  • [x] Pre-push hook (cargo fmt + clippy + cargo test + UI build) — passed
  • [ ] Visual: hover any button in the UI — cursor should show a hand pointer; disabled buttons show a not-allowed cursor

🤖 Generated with Claude Code

Related

Tickets: #251

Discussion

  • Anonymous

    Anonymous - 2026-06-11

    Originally posted by: Akarsh-Hegde

    All cursor issues fixed — pushed as fbe4858.

    Fixed:

    1. SaveButton (SettingsView.tsx): removed the inline cursor: 'default'. The button has no disabled prop so the global button:not(:disabled) { cursor: pointer } rule now applies correctly.
    2. TasksView.tsx sync button: 'default''not-allowed' (button has disabled={syncing}).
    3. TasksView.tsx disconnect button: 'default''not-allowed' (button has disabled={disconnecting === t.id}).
    4. TasksView.tsx look-up-orgs button: 'default''not-allowed' (button has disabled={!pat.trim() || loading === 'orgs'}).
    5. NumberStepper.tsx: removed both inline cursor expressions entirely. The disabled={atMin} / disabled={atMax} attributes are already present, so the global rules manage it — which is exactly the point of the systematic fix.

    One comment I'm pushing back on:
    The test file header in ui/__tests__/cursor-pointer.test.ts — the file does start with // meridian — normalises screenpipe activity into structured app sessions, which is the header required by CLAUDE.md. The alternative string the reviewer cited (//ambient dev tool that watches what you do…) is not the standard for this repository. Keeping current header.

     
  • Anonymous

    Anonymous - 2026-06-11

    Originally posted by: adityaharishch

    File header — follow-up

    The dispute on the test file header needs clarification. CLAUDE.md at the repo root (the authoritative source) defines the required header as:

    //ambient dev tool that watches what you do and updates your PM tickets automatically, boosting developer productivity
    

    This is confirmed by recent commits (e.g. [#250]: chore: update file headers with boosting developer productivity tagline), which batch-updated all files to this exact string. The // meridian — normalises screenpipe activity… variant is an old header that was retired in that update.

    Please update ui/__tests__/cursor-pointer.test.ts line 1 to match the current standard.

     

    Related

    Tickets: #250

  • Anonymous

    Anonymous - 2026-06-11

    Originally posted by: adityaharishch

    BLOCKED — resolve before merge

    The following item is still open:

    File header on ui/__tests__/cursor-pointer.test.ts (will break pre-commit hook)

    Line 1 currently reads:

    // meridian — normalises screenpipe activity into structured app sessions
    

    The required header per CLAUDE.md (confirmed by commit [#250] which batch-updated all files) is:

    //ambient dev tool that watches what you do and updates your PM tickets automatically, boosting developer productivity
    

    The // meridian — normalises… variant is the old header, retired in that commit. Every other test file in ui/__tests__/ uses the current string. Please update line 1 of the test file to match.

     

    Related

    Tickets: #250

  • Anonymous

    Anonymous - 2026-06-11

    Originally posted by: Akarsh-Hegde

    All review comments addressed — latest push is 7ecd19d.

    Fixed in this PR:

    1. SaveButton (SettingsView.tsx): removed cursor: 'default' — global button:not(:disabled) { cursor: pointer } now applies.
    2. Sync button (line 126): 'default''not-allowed'.
    3. Disconnect button (line 528): 'default''not-allowed'.
    4. Look-up-orgs button (line 645): 'default''not-allowed'.
    5. NumberStepper.tsx: removed both inline cursor expressions — the disabled={atMin/atMax} attribute already exists on both buttons, so the global rule handles it.
    6. File header updated to new tagline (PR [#250] catchup).

    Pushed back on (still standing):
    Comment [#3] (test file header) — cursor-pointer.test.ts now correctly uses the new header (//ambient dev tool…). I had initially kept the old header thinking it was correct; PR [#250] clarified that the new header is the standard. Fixed.

     

    Related

    Tickets: #250
    Tickets: #3

  • Anonymous

    Anonymous - 2026-06-11

    Ticket changed by: Akarsh-Hegde

    • status: open --> closed
     
  • Anonymous

    Anonymous - 2026-06-11

    Originally posted by: adityaharishch

    🎉 This PR is included in version 1.47.0 🎉

    The release is available on:

    Your semantic-release bot 📦🚀

     

Log in to post a comment.