Mantine Hooks
Use this skill for @mantine/hooks only — the standalone React hooks package. Do not pull in @mantine/core, @mantine/form, or other @mantine/* packages unless the user explicitly asks for them outside this skill.
Prefer current docs over memory. Pin narrative to @mantine/hooks@9.x (npm latest snapshot: 9.5.0, peer react@^19.2.0).
Workflow
- Inspect the project before changing code:
- Installed
@mantine/hooksversion and React peer version. - Whether the app is SPA-only or SSR/hydrated (affects
getInitialValueInEffectand media/storage hooks). - Which hook families are in play: state, storage, events, observers, timing, or interaction builders.
- Installed
- Refresh versions and doc URLs from source-map.md when behavior or migration matters.
- For install, imports, utils, SSR defaults, types, and package boundaries, use setup-core.md.
- For boolean/list/object/Map/Set state, uncontrolled values, storage, queue, pagination, and history, use state-storage.md.
- For click-outside, hotkeys, focus, hover/mouse, clipboard, fullscreen, long-press, and window/document events, use ui-events.md.
- For media queries, observers, debounce/throttle, timers, idle/network/OS, and fetch, use observers-timing.md.
- For move/drag/radial, collapse, mask, roving index, splitter, floating window, selection, and scroll helpers, use advanced-interaction.md.
- For a full hook index with doc links, use catalog.md.
Implementation Judgment
- Import only from
@mantine/hooks. Prefer named imports:import { useDisclosure, clamp } from '@mantine/hooks'. - Package is standalone: React peer only. Safe in any React web app without other Mantine packages. State-management hooks (e.g.
usePagination,useQueue) also work in React Native; DOM/window hooks do not. - React 19.2+ is required for 9.x. Several hooks use React 19
useEffectEvent(usePageLeave,useWindowEvent,useHotkeys,useClickOutside,useCollapse) — do not forceuseCallbackwrappers just to keep listeners stable. - Prefer exported option/return types (
UseDisclosureOptions, or namespace forms likeuseDisclosure.Options) over reinventing shapes. - SSR-sensitive hooks (
useMediaQuery,useColorScheme,useReducedMotion,useLocalStorage/useSessionStorage, viewport size): default path calculates after mount viagetInitialValueInEffect: true. Pass an explicitinitialValue/defaultValuefor the server render; setgetInitialValueInEffect: falseonly for CSR-only apps that need the real value on first paint. - Combine ref-returning hooks with
useMergedRef/mergeRefs(e.g.useClickOutside+useFocusTrap+ local ref). - Debounce triad:
useDebouncedValue— controlled source value stays immediate; debounced copy for effects/search.useDebouncedState— setter itself is debounced (uncontrolled-style).useDebouncedCallback— debounce a function (flush/cancel/isPending).
- Same split for throttle:
useThrottledValue/useThrottledState/useThrottledCallback. - Fullscreen: use
useFullscreenDocumentoruseFullscreenElement— there is no singleuseFullscreenexport in 9.x. - Mouse:
useMouseis element-ref based;useMousePositiontracks document-level position. - Callback-ref hooks (
useResizeObserver,useMouse,useMutationObserver, many interaction hooks) tolerate dynamic node swaps — prefer the returned ref callback over staleuseRefassignment patterns. useFetchis a thin fetch helper, not a server-state library — fine for small one-off loads; do not treat it as Query/SWR.- Keep examples and generated code free of other Mantine packages unless the surrounding project already depends on them and the user asked for that surface.
Migration traps (8 → 9)
- Peer React 19.2+.
useFullscreen→useFullscreenDocument/useFullscreenElement.useMousesplit →useMouse+useMousePosition.useResizeObserver/useMutationObserver→ callback-ref APIs;useMutationObserverTargetfor external nodes.useDisclosuregainshandlers.set(boolean).- Renamed types:
UseScrollSpyReturnType→UseScrollSpyReturnValue,StateHistory→UseStateHistoryValue,OS→UseOSReturnValue. useMediaQuerydropped very-old SafarimatchMediafallbacks.
Verification
Prefer the repo's existing checks. For meaningful @mantine/hooks work, include the relevant subset:
- Typecheck against installed
@mantine/hooksdeclarations and exported option/return types. - Confirm imports resolve only from
@mantine/hooks(no accidental@mantine/corefor hook-only tasks). - SSR/hydration: assert server HTML uses intended initial values for media/storage hooks; no flash regressions when changing
getInitialValueInEffect. - Interaction tests: outside-click nodes (use state callbacks for multi-node lists), hotkey
modcross-platform, focus trap + merged refs, debouncecancel/flushon unmount. - Migration scan for removed
useFullscreen, old mouse/observer ref patterns, and renamed types.