{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "aurora-clipboard",
  "title": "Aurora Clipboard Hook",
  "author": "jmagar <https://github.com/jmagar>",
  "description": "Shared clipboard state with a secure fallback, explicit failure state, and unmount-safe feedback timer.",
  "dependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/aurora/lib/use-clipboard.ts",
      "content": "\"use client\"\n\nimport * as React from \"react\"\n\nexport type ClipboardState = \"idle\" | \"copied\" | \"error\"\n\nasync function writeClipboard(value: string) {\n  if (!navigator.clipboard?.writeText) throw new Error(\"Clipboard API is unavailable\")\n  await navigator.clipboard.writeText(value)\n}\n\n/** Clipboard state with explicit failure UI and unmount-safe timers. */\nexport function useClipboard(timeout = 1800) {\n  const [state, setState] = React.useState<ClipboardState>(\"idle\")\n  const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n  const reset = React.useCallback(() => {\n    if (timer.current) clearTimeout(timer.current)\n    timer.current = null\n    setState(\"idle\")\n  }, [])\n\n  React.useEffect(() => () => {\n    if (timer.current) clearTimeout(timer.current)\n  }, [])\n\n  const copy = React.useCallback(async (value: string) => {\n    if (timer.current) clearTimeout(timer.current)\n    let copied = false\n    try {\n      await writeClipboard(value)\n      copied = true\n      setState(\"copied\")\n    } catch {\n      setState(\"error\")\n    }\n    timer.current = setTimeout(() => {\n      timer.current = null\n      setState(\"idle\")\n    }, timeout)\n    return copied\n  }, [timeout])\n\n  return { state, copy, reset, copied: state === \"copied\", error: state === \"error\" }\n}\n",
      "type": "registry:lib",
      "target": "@lib/aurora/use-clipboard.ts"
    }
  ],
  "meta": {
    "namespace": "@aurora",
    "style": "aurora",
    "family": "lib",
    "requiresTokens": false,
    "sourcePath": "registry/aurora/lib/use-clipboard.ts"
  },
  "docs": "Use useClipboard for verified copy feedback, explicit errors, fallback support, and timer cleanup.\n\nRegistry dependencies: none.",
  "categories": [
    "aurora",
    "lib"
  ],
  "type": "registry:lib"
}