{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "use-reduced-motion",
  "type": "registry:hook",
  "title": "useReducedMotion",
  "description": "SSR-safe hook that tracks prefers-reduced-motion. Required by every animated Crucible component.",
  "dependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/default/hooks/use-reduced-motion/use-reduced-motion.ts",
      "type": "registry:hook",
      "target": "hooks/use-reduced-motion.ts",
      "content": "\"use client\";\n\nimport * as React from \"react\";\n\nconst QUERY = \"(prefers-reduced-motion: reduce)\";\n\n/**\n * Returns true when the user prefers reduced motion. SSR-safe: returns false\n * on the server and during hydration, then syncs to the real media query.\n *\n * Every animated Crucible component must consume this and either freeze at a\n * tasteful static frame or fall back to a simple fade.\n */\nexport function useReducedMotion(): boolean {\n  return React.useSyncExternalStore(\n    subscribe,\n    () => window.matchMedia(QUERY).matches,\n    () => false\n  );\n}\n\nfunction subscribe(callback: () => void): () => void {\n  const mql = window.matchMedia(QUERY);\n  mql.addEventListener(\"change\", callback);\n  return () => mql.removeEventListener(\"change\", callback);\n}\n"
    }
  ]
}