{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "use-has-primary-touch",
  "title": "Use has primary touch",
  "description": "Hook utility: use-has-primary-touch",
  "dependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/optics/hooks/use-has-primary-touch.jsx",
      "content": "import { useEffect, useState } from \"react\";\n\nexport function useTouchPrimary() {\n\tconst [isTouchPrimary, setIsTouchPrimary] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") return;\n\n\t\tconst controller = new AbortController();\n\t\tconst { signal } = controller;\n\n\t\tconst handleTouch = () => {\n\t\t\tconst hasTouch = \"ontouchstart\" in window || navigator.maxTouchPoints > 0;\n\t\t\tconst prefersTouch = window.matchMedia(\"(pointer: coarse)\").matches;\n\t\t\tsetIsTouchPrimary(hasTouch && prefersTouch);\n\t\t};\n\n\t\tconst mq = window.matchMedia(\"(pointer: coarse)\");\n\t\tmq.addEventListener(\"change\", handleTouch, { signal });\n\t\twindow.addEventListener(\"pointerdown\", handleTouch, { signal });\n\n\t\thandleTouch();\n\n\t\treturn () => controller.abort();\n\t}, []);\n\n\treturn isTouchPrimary;\n}\n",
      "type": "registry:lib",
      "target": "hooks/use-has-primary-touch.jsx"
    }
  ],
  "type": "registry:lib"
}