{"version":3,"sources":["../../../src/lib/copy-button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { IconButton, Button } from \"./elements.js\";\nimport { CheckIcon, CopyIcon } from \"@radix-ui/react-icons\";\nimport { Slot, Slottable } from \"@radix-ui/themes\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface CopyButtonOwnProps {\n  value: string;\n  withIcon?: boolean;\n}\n\ninterface CopyButtonProps\n  extends\n    CopyButtonOwnProps,\n    Omit<React.ComponentProps<typeof Button>, keyof CopyButtonOwnProps> {}\n\nexport const CopyButton = React.forwardRef<HTMLButtonElement, CopyButtonProps>(\n  function CopyButton(\n    { value, asChild, children, style, withIcon = false, ...props },\n    ref,\n  ) {\n    const Comp = asChild ? Slot : Button;\n    const [hasCopied, copy] = useCopy(value);\n    return (\n      <Comp type=\"button\" onPointerUp={copy} ref={ref} {...props}>\n        {withIcon &&\n          (hasCopied ? <CheckIcon aria-hidden /> : <CopyIcon aria-hidden />)}\n        <Slottable>{children}</Slottable>\n      </Comp>\n    );\n  },\n);\n\ninterface CopyIconButtonOwnProps {\n  value: string;\n}\n\ninterface CopyIconButtonProps\n  extends\n    CopyIconButtonOwnProps,\n    Omit<\n      React.ComponentProps<typeof IconButton>,\n      \"asChild\" | \"children\" | \"title\" | keyof CopyIconButtonOwnProps\n    > {\n  title?: string;\n}\n\nexport const CopyIconButton = React.forwardRef<\n  HTMLButtonElement,\n  CopyIconButtonProps\n>(function CopyIconButton({ value, style, ...props }, ref) {\n  const [hasCopied, copy] = useCopy(value);\n  const translate = useTranslation();\n  const copiedText = translate({\n    defaultMessage: \"Copied\",\n    id: \"xgUx3Z\",\n    description: \"Text shown after content has been copied\",\n  });\n  const copyToClipboardText = translate({\n    defaultMessage: \"Copy to clipboard\",\n    id: \"h9d9dv\",\n    description: \"Button text to copy content to clipboard\",\n  });\n  return (\n    <IconButton\n      type=\"button\"\n      onPointerUp={copy}\n      ref={ref}\n      title={hasCopied ? copiedText : copyToClipboardText}\n      aria-label={copyToClipboardText}\n      {...props}\n    >\n      {hasCopied ? <CheckIcon /> : <CopyIcon />}\n    </IconButton>\n  );\n});\n\nfunction useCopy(value: string) {\n  const [hasCopied, setHasCopied] = React.useState(false);\n  const timeoutRef = React.useRef<number | undefined>(undefined);\n\n  const copy = async () => {\n    try {\n      await navigator.clipboard.writeText(value);\n      setHasCopied(true);\n\n      // Clear any existing timeout\n      if (timeoutRef.current) {\n        window.clearTimeout(timeoutRef.current);\n      }\n\n      // Set new timeout\n      timeoutRef.current = window.setTimeout(() => {\n        setHasCopied(false);\n      }, 3000);\n    } catch (err) {\n      console.error(\"Failed to copy text:\", err);\n    }\n  };\n\n  // Cleanup timeout on unmount\n  React.useEffect(() => {\n    return () => {\n      if (timeoutRef.current) {\n        window.clearTimeout(timeoutRef.current);\n      }\n    };\n  }, []);\n\n  return [hasCopied, copy] as const;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAxBN,YAAuB;AACvB,sBAAmC;AACnC,yBAAoC;AACpC,oBAAgC;AAChC,6BAA+B;AAYxB,MAAM,aAAa,MAAM;AAAA,EAC9B,SAASA,YACP,EAAE,OAAO,SAAS,UAAU,OAAO,WAAW,OAAO,GAAG,MAAM,GAC9D,KACA;AACA,UAAM,OAAO,UAAU,qBAAO;AAC9B,UAAM,CAAC,WAAW,IAAI,IAAI,QAAQ,KAAK;AACvC,WACE,6CAAC,QAAK,MAAK,UAAS,aAAa,MAAM,KAAW,GAAG,OAClD;AAAA,mBACE,YAAY,4CAAC,gCAAU,eAAW,MAAC,IAAK,4CAAC,+BAAS,eAAW,MAAC;AAAA,MACjE,4CAAC,2BAAW,UAAS;AAAA,OACvB;AAAA,EAEJ;AACF;AAgBO,MAAM,iBAAiB,MAAM,WAGlC,SAASC,gBAAe,EAAE,OAAO,OAAO,GAAG,MAAM,GAAG,KAAK;AACzD,QAAM,CAAC,WAAW,IAAI,IAAI,QAAQ,KAAK;AACvC,QAAM,gBAAY,uCAAe;AACjC,QAAM,aAAa,UAAU;AAAA,IAC3B,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AACD,QAAM,sBAAsB,UAAU;AAAA,IACpC,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb;AAAA,MACA,OAAO,YAAY,aAAa;AAAA,MAChC,cAAY;AAAA,MACX,GAAG;AAAA,MAEH,sBAAY,4CAAC,gCAAU,IAAK,4CAAC,+BAAS;AAAA;AAAA,EACzC;AAEJ,CAAC;AAED,SAAS,QAAQ,OAAe;AAC9B,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,aAAa,MAAM,OAA2B,MAAS;AAE7D,QAAM,OAAO,YAAY;AACvB,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK;AACzC,mBAAa,IAAI;AAGjB,UAAI,WAAW,SAAS;AACtB,eAAO,aAAa,WAAW,OAAO;AAAA,MACxC;AAGA,iBAAW,UAAU,OAAO,WAAW,MAAM;AAC3C,qBAAa,KAAK;AAAA,MACpB,GAAG,GAAI;AAAA,IACT,SAAS,KAAK;AACZ,cAAQ,MAAM,wBAAwB,GAAG;AAAA,IAC3C;AAAA,EACF;AAGA,QAAM,UAAU,MAAM;AACpB,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,eAAO,aAAa,WAAW,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,WAAW,IAAI;AACzB;","names":["CopyButton","CopyIconButton"]}