{"version":3,"file":"use-clipboard.cjs","names":[],"sources":["../../src/hooks/use-clipboard.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardOptions {\n    /** Time (ms) before the `copied` flag resets back to false. Default: 1500. */\n    resetAfter?: number;\n}\n\nexport interface UseClipboardResult {\n    /** True briefly after a successful copy. */\n    copied: boolean;\n    /** Copy a string to the clipboard. Returns `true` on success. */\n    copy: (text: string) => Promise<boolean>;\n    /** Manually reset the `copied` flag. */\n    reset: () => void;\n}\n\n/**\n * Wrapper around `navigator.clipboard.writeText` with a transient `copied`\n * flag for UI feedback (\"Copied!\" toast). Falls back gracefully when the\n * Clipboard API is unavailable.\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardResult {\n    const { resetAfter = 1500 } = options;\n    const [copied, setCopied] = useState<boolean>(false);\n    const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n    const reset = useCallback((): void => {\n        if (timer.current) {\n            clearTimeout(timer.current);\n            timer.current = null;\n        }\n        setCopied(false);\n    }, []);\n\n    useEffect(() => () => reset(), [reset]);\n\n    const copy = useCallback(\n        async (text: string): Promise<boolean> => {\n            try {\n                if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n                    await navigator.clipboard.writeText(text);\n                } else if (typeof document !== \"undefined\") {\n                    const textarea = document.createElement(\"textarea\");\n                    textarea.value = text;\n                    textarea.style.position = \"fixed\";\n                    textarea.style.opacity = \"0\";\n                    document.body.appendChild(textarea);\n                    textarea.select();\n                    document.execCommand(\"copy\");\n                    document.body.removeChild(textarea);\n                } else {\n                    return false;\n                }\n                setCopied(true);\n                if (timer.current) clearTimeout(timer.current);\n                timer.current = setTimeout(() => setCopied(false), resetAfter);\n                return true;\n            } catch {\n                return false;\n            }\n        },\n        [resetAfter],\n    );\n\n    return { copied, copy, reset };\n}\n"],"mappings":"uBAqBA,SAAgB,EAAa,EAA+B,CAAC,EAAuB,CAChF,GAAM,CAAE,aAAa,MAAS,EACxB,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAkB,EAAK,EAC7C,GAAA,EAAQ,EAAA,OAAA,CAA6C,IAAI,EAEzD,GAAA,EAAQ,EAAA,YAAA,KAAwB,CAClC,AAEI,EAAM,WADN,aAAa,EAAM,OAAO,EACV,MAEpB,EAAU,EAAK,CACnB,EAAG,CAAC,CAAC,EAgCL,OA9BA,EAAA,EAAA,UAAA,SAAsB,EAAM,EAAG,CAAC,CAAK,CAAC,EA8B/B,CAAE,SAAQ,MAAA,EA5BJ,EAAA,YAAA,CACT,KAAO,IAAmC,CACtC,GAAI,CACA,GAAI,OAAO,UAAc,KAAe,UAAU,WAAW,UACzD,MAAM,UAAU,UAAU,UAAU,CAAI,OACrC,GAAI,OAAO,SAAa,IAAa,CACxC,IAAM,EAAW,SAAS,cAAc,UAAU,EAClD,EAAS,MAAQ,EACjB,EAAS,MAAM,SAAW,QAC1B,EAAS,MAAM,QAAU,IACzB,SAAS,KAAK,YAAY,CAAQ,EAClC,EAAS,OAAO,EAChB,SAAS,YAAY,MAAM,EAC3B,SAAS,KAAK,YAAY,CAAQ,CACtC,MACI,MAAO,GAKX,OAHA,EAAU,EAAI,EACV,EAAM,SAAS,aAAa,EAAM,OAAO,EAC7C,EAAM,QAAU,eAAiB,EAAU,EAAK,EAAG,CAAU,EACtD,EACX,MAAQ,CACJ,MAAO,EACX,CACJ,EACA,CAAC,CAAU,CAGE,EAAM,OAAM,CACjC"}