Skip to content

fix(ui): add cursor pointer to buttons and link-buttons - #136

Merged
pmaxhogan merged 1 commit into
mainfrom
fix/ui-cursor-pointer
Jul 20, 2026
Merged

pmaxhogan merged 1 commit into
mainfrom
fix/ui-cursor-pointer

Conversation

@pmaxhogan

Copy link
Copy Markdown
Owner

Summary

Every interactive control in ui/src is a native <button> (this includes tab headers, icon buttons, and buttons styled to look like links) - Tailwind v3+ dropped the preflight cursor: pointer reset for buttons, so they were all falling back to the browser's default arrow cursor on hover.

Approach

Global rule, not per-component: one addition to ui/src/style.css's @layer base:

button:not(:disabled) {
  cursor: pointer;
}

:not(:disabled) keeps disabled buttons on the existing disabled:cursor-not-allowed Tailwind utility already present on the shared button-class constants (primaryButtonClasses / secondaryBtn / destructiveBtn etc. across AccountList.vue, SourceTable.vue, Restore.vue, About.vue, Activity.vue, SetupWizard.vue, ...) - both layers cascade correctly since Tailwind's utilities layer always wins over base regardless of source order/specificity.

No per-component changes were needed: a full sweep of ui/src found no @click handlers, role="button", or tabindex outside of native <button> elements, and the app's only other clickable-looking control (RouterLink, which renders <a href>) already gets a pointer cursor from the browser's default UA stylesheet. <select> and checkbox/toggle inputs were left alone - out of scope (native controls, not reported).

Verification

  • pnpm -C ui lint - clean (only pre-existing i18n unused-key warnings, 0 errors)
  • pnpm -C ui test:unit - 264/265 passing; router-first-run.test.ts's "lands a fresh install on the setup wizard" case timed out under full-suite load but passes cleanly in isolation (pre-existing flake, unrelated to a CSS-only change)
  • pnpm -C ui build (vue-tsc --noEmit && vite build) - clean; confirmed compiled CSS contains button:not(:disabled){cursor:pointer}
  • Ran the real dev server and drove it via claude-in-chrome, checking getComputedStyle(...).cursor on every <button> across Activity, About, Restore, and Setup Wizard: every enabled button reports pointer, every disabled button keeps its prior cursor (not-allowed via the existing utility, or the browser's disabled default where no utility applies) - zero regressions, zero visual changes beyond the cursor.

Refs #34


Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01QZQVP2tUuTLh8oL31D8heC

Every interactive control in ui/src is a native <button> (tab headers,
icon buttons, and link-styled buttons included) - Tailwind v3+ dropped
the preflight cursor:pointer reset for buttons, so they all fell back
to the browser's default arrow cursor on hover.

Adds a single global rule to style.css instead of sprinkling
per-component styles: `button:not(:disabled) { cursor: pointer; }` in
the base layer. :not(:disabled) keeps disabled buttons on their
existing disabled:cursor-not-allowed utility.

Refs #34
@github-actions

Copy link
Copy Markdown
Contributor

Coverage

Area main this PR delta
Rust (lib crates) 78.70% 78.70% +0.00 (OK)
UI (vue/ts) 88.58% 88.58% +0.00 (OK)

Gate: passed - no coverage regression (epsilon 0.1 pp).

@pmaxhogan
pmaxhogan enabled auto-merge (squash) July 20, 2026 17:35
@pmaxhogan
pmaxhogan merged commit dbd4809 into main Jul 20, 2026
18 checks passed
@pmaxhogan
pmaxhogan deleted the fix/ui-cursor-pointer branch July 20, 2026 17:41
@github-project-automation github-project-automation Bot moved this from Todo to Done in Driven Jul 20, 2026
pmaxhogan added a commit that referenced this pull request Jul 24, 2026
🤖 I have created a release *beep* *boop*
---


## [2.1.0](v2.0.1...v2.1.0)
(2026-07-24)


### Features

* **core:** adaptive upload parallelism with throughput probe and
disk-saturation gate
([#143](#143))
([8ecced6](8ecced6))
* **core:** filesystem timestamp-granularity probe with ctime fallback
and per-directory gitignore cascade
([#141](#141))
([344262c](344262c))
* **drive:** support Google Shared Drive destinations end-to-end
([#142](#142))
([d9c3161](d9c3161))
* **net:** native OS reachability backends with automatic fallback
([#138](#138))
([319e85f](319e85f))
* **net:** SOCKS5 and PAC proxy support for all outbound connections
([#145](#145))
([2f0b7d1](2f0b7d1))
* **net:** support a custom corporate root CA for all outbound
connections ([#134](#134))
([929e93d](929e93d))
* per-source toggle to back up OneDrive cloud-only placeholder files
([#133](#133))
([6863ea3](6863ea3))
* **telemetry:** capture latency percentiles and add rollup query
endpoint ([#132](#132))
([4e9fde6](4e9fde6))
* **telemetry:** preview exactly what a telemetry ping sends
([#139](#139))
([95fbd9a](95fbd9a))


### Bug Fixes

* **core:** commit file_state for a create that skipped post-upload so
the next scan updates instead of re-creating
([#146](#146))
([f5230d1](f5230d1))
* **deps:** bump tauri-winrt-notification to drop vulnerable quick-xml
(closes [#89](#89))
([#129](#129))
([232fd8f](232fd8f))
* **telemetry:** exclude pre-schema rows from latency rollup
([#137](#137))
([1ae6220](1ae6220))
* **ui:** add cursor pointer to buttons and link-buttons
([#136](#136))
([dbd4809](dbd4809))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant