# Cursor Utilities for controlling the mouse cursor shown when the pointer is over an element on web and desktop targets. - [Basic Usage](#basic-usage) - [Quick Reference](#quick-reference) - [How It Works](#how-it-works) - [Responsive Design](#responsive-design) - [Dark Mode](#dark-mode) - [Related Documentation](#related-documentation) ## Basic Usage `cursor-*` maps a Tailwind cursor name to the matching native cursor and applies it through a `MouseRegion`. A plain `WDiv` can show a pointer cursor without being wrapped in `WAnchor` or a manual `MouseRegion`. ```dart // A clickable-feeling row without WAnchor WDiv( className: 'cursor-pointer px-4 py-3 rounded-lg bg-blue-500 dark:bg-blue-600', child: WText('Click me', className: 'text-white'), ) ``` The cursor is a hover affordance only; it changes how the pointer looks, not how taps are handled. Wire taps through `WAnchor` / `WButton` as usual. ## Quick Reference | Class | Flutter cursor | |:------|:---------------| | `cursor-auto` / `cursor-default` | `SystemMouseCursors.basic` | | `cursor-pointer` | `SystemMouseCursors.click` | | `cursor-wait` | `SystemMouseCursors.wait` | | `cursor-progress` | `SystemMouseCursors.progress` | | `cursor-text` | `SystemMouseCursors.text` | | `cursor-vertical-text` | `SystemMouseCursors.verticalText` | | `cursor-move` | `SystemMouseCursors.move` | | `cursor-help` | `SystemMouseCursors.help` | | `cursor-not-allowed` | `SystemMouseCursors.forbidden` | | `cursor-none` | `SystemMouseCursors.none` | | `cursor-context-menu` | `SystemMouseCursors.contextMenu` | | `cursor-cell` | `SystemMouseCursors.cell` | | `cursor-crosshair` | `SystemMouseCursors.precise` | | `cursor-alias` | `SystemMouseCursors.alias` | | `cursor-copy` | `SystemMouseCursors.copy` | | `cursor-no-drop` | `SystemMouseCursors.noDrop` | | `cursor-grab` | `SystemMouseCursors.grab` | | `cursor-grabbing` | `SystemMouseCursors.grabbing` | | `cursor-all-scroll` | `SystemMouseCursors.allScroll` | | `cursor-col-resize` | `SystemMouseCursors.resizeColumn` | | `cursor-row-resize` | `SystemMouseCursors.resizeRow` | | `cursor-n-resize` / `cursor-e-resize` / `cursor-s-resize` / `cursor-w-resize` | `resizeUp` / `resizeRight` / `resizeDown` / `resizeLeft` | | `cursor-ne-resize` / `cursor-nw-resize` / `cursor-se-resize` / `cursor-sw-resize` | `resizeUpRight` / `resizeUpLeft` / `resizeDownRight` / `resizeDownLeft` | | `cursor-ew-resize` / `cursor-ns-resize` | `resizeLeftRight` / `resizeUpDown` | | `cursor-nesw-resize` / `cursor-nwse-resize` | `resizeUpRightDownLeft` / `resizeUpLeftDownRight` | | `cursor-zoom-in` / `cursor-zoom-out` | `zoomIn` / `zoomOut` | Flutter has no "auto" cursor, so `cursor-auto` resolves to the same basic arrow as `cursor-default`. ## How It Works `WDiv` wraps its content in a `MouseRegion` when a `cursor-*` token is present. When the `WDiv` also carries `hover:` / `focus:` / `active:` classes it is already wrapped in `WAnchor` (whose `MouseRegion` uses `click` only when the anchor has gesture callbacks, otherwise `basic`); the `cursor-*` `MouseRegion` sits deeper in the tree, so its cursor wins for the area it covers regardless of the anchor's default. Last token wins: `cursor-pointer cursor-text` resolves to text. Cursors are a no-op on touch platforms (there is no pointer to style); the token is simply inert there. ## Responsive Design Combine `cursor-*` with breakpoint prefixes to change the affordance per viewport. ```dart WDiv(className: 'cursor-default md:cursor-pointer') ``` ## Dark Mode The cursor itself is theme-independent, but pair the surrounding color tokens with their `dark:` peers as usual. ```dart WDiv(className: 'cursor-pointer bg-white dark:bg-gray-800') ``` ## Related Documentation - [WAnchor](../widgets/w-anchor.md): exposes a `mouseCursor` constructor prop for fully imperative control. - [Transitions](./transition.md): smooth state changes on hover.