{"version":3,"sources":["../src/utils/classes.ts","../src/utils/cn.ts","../src/utils/deepMerge.ts","../src/utils/isTouchDevice.ts","../src/utils/textCenterEllipsis.ts","../src/components/ChevronArrowWithAnim.tsx","../src/components/CloseIcon.tsx","../src/components/Modal.tsx","../src/components/StarsBackground.tsx","../src/components/ToastCloseButton.tsx","../src/hooks/useCopyToClipboard.ts","../src/hooks/useMediaQuery.ts"],"names":["standardButtonClasses","cn","inputs","twMerge","clsx","isObject","item","deepMerge","target","source","output","key","targetValue","sourceValue","isTouchDevice","maxWidth","hasTouchStart","hasMaxTouchPoints","hasCoarsePointer","supportsTouch","isSmallScreen","textCenterEllipsis","str","from","to","start","end","ChevronArrowWithAnim","className","strokeWidth","isOpen","jsxs","jsx","AnimatePresence","motion","CloseIcon","D","props","ref","Dialog","r","DialogTrigger","DialogPortal","DialogClose","defaultModalAnimation","mobileModalAnimation","defaultModalBackdropAnimation","DialogOverlay","backdropAnimation","l","DialogContent","children","modalAnimation","isMobile","setIsMobile","selectedAnimation","DialogHeader","DialogFooter","DialogTitle","DialogDescription","StarsBackground","starsCount","isMounted","setIsMounted","useState","useEffect","stars","useMemo","numStars","star","ToastCloseButton","closeToast","useCopyToClipboard","timeout","isCopied","setIsCopied","error","setError","copy","useCallback","text","e","copyError","useMediaQuery","query","getMatches","q","matches","setMatches","media","listener"],"mappings":"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","file":"index.cjs","sourcesContent":["export const standardButtonClasses =\n  'novacore:cursor-pointer novacore:rounded-md novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50';\n","/**\n * @file This file contains a utility function for conditionally merging Tailwind CSS classes.\n */\n\nimport { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * A utility function to conditionally join class names together and resolve\n * conflicting Tailwind CSS classes.\n *\n * It combines the functionality of `clsx` and `tailwind-merge`.\n *\n * @param {...ClassValue[]} inputs - A list of class values to be combined.\n * This can include strings, numbers, objects, arrays, and booleans.\n * @returns {string} The final, merged class name string.\n *\n * @example\n * cn('p-4', 'bg-red-500', { 'font-bold': true }); // => 'p-4 bg-red-500 font-bold'\n * cn('p-2', 'p-4'); // => 'p-4' (tailwind-merge resolves the conflict)\n *\n * @see https://github.com/dcastil/tailwind-merge\n * @see https://github.com/lukeed/clsx\n */\nexport function cn(...inputs: ClassValue[]): string {\n  return twMerge(clsx(inputs));\n}\n","/**\n * @file This file contains a utility for performing a deep (recursive) merge of two objects.\n */\n\n/**\n * Checks if the provided item is a plain object (i.e., not null and not an array).\n *\n * @param {any} item - The item to check.\n * @returns {item is Record<string, any>} True if the item is a plain object, otherwise false.\n */\nconst isObject = (item: any): item is Record<string, any> => {\n  return item && typeof item === 'object' && !Array.isArray(item);\n};\n\n/**\n * Recursively merges the properties of a source object into a target object.\n * This function creates a new object and does not mutate the original target.\n *\n * @template T - The type of the objects being merged.\n * @param {T} target - The base object.\n * @param {Partial<T>} source - The object with properties to merge into the target.\n * @returns {T} A new object representing the merged result.\n *\n * @example\n * const defaults = { a: 1, b: { c: 2, d: 3 } };\n * const custom = { b: { c: 99 } };\n * const result = deepMerge(defaults, custom);\n * // result will be { a: 1, b: { c: 99, d: 3 } }\n */\nexport function deepMerge<T extends object>(target: T, source: Partial<T>): T {\n  // Start with a shallow copy of the target to avoid mutation.\n  const output = { ...target };\n\n  if (isObject(target) && isObject(source)) {\n    // Iterate over the keys in the source object.\n    Object.keys(source).forEach((key) => {\n      const targetValue = target[key as keyof T];\n      const sourceValue = source[key as keyof T];\n\n      // If the value is an object in both target and source, merge them recursively.\n      if (isObject(targetValue) && isObject(sourceValue)) {\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-expect-error\n        (output as Record<string, any>)[key] = deepMerge(targetValue, sourceValue);\n      } else {\n        // Otherwise, the source value overwrites the target value.\n        (output as Record<string, any>)[key] = sourceValue;\n      }\n    });\n  }\n\n  return output;\n}\n","/**\n * @fileoverview Utility function to determine if the current environment supports touch input.\n * This is safe to use in Next.js applications as it checks for the `window` object existence.\n */\n\n/**\n * Determines if the current browsing device supports touch input,\n * while also excluding large screens (typically desktop-sized touch monitors).\n *\n * It checks for:\n * 1. The presence of 'ontouchstart' or navigator.maxTouchPoints > 0 or '(pointer: coarse)'.\n * 2. ONLY returns true if the screen width is less than or equal to the specified threshold (e.g., 1200px).\n *\n * This function is safe for server-side rendering (SSR) environments like Next.js.\n *\n * @param {number} [maxWidth=1200] The maximum screen width (in pixels) for a device to be considered 'touch' (default is 1200).\n * @returns {boolean} Returns true if the environment is determined to support touch input AND is within the width limit, otherwise false.\n */\nexport function isTouchDevice(maxWidth: number = 1200): boolean {\n  // 1. Check if we are running in a browser environment (Client Side).\n  if (typeof window === 'undefined') {\n    // If not in a browser (SSR), we assume no touch support for safety.\n    return false;\n  }\n\n  // --- Core Touch Support Checks (Client Side Only) ---\n\n  // A. Check for 'ontouchstart' event property (classic check).\n  const hasTouchStart = 'ontouchstart' in window;\n\n  // B. Check for maxTouchPoints (reliable modern check).\n  const hasMaxTouchPoints = navigator.maxTouchPoints > 0;\n\n  // C. Check for 'pointer: coarse' media query (detects \"rough\" pointer like a finger).\n  let hasCoarsePointer = false;\n  if (window.matchMedia) {\n    hasCoarsePointer = window.matchMedia('(pointer: coarse)').matches;\n  }\n\n  // Determine if the device inherently supports touch input.\n  const supportsTouch = hasTouchStart || hasMaxTouchPoints || hasCoarsePointer;\n\n  // 2. Check the screen size condition.\n  // The device must support touch AND its current width must be less than or equal to the defined maxWidth.\n  const isSmallScreen = window.innerWidth <= maxWidth;\n\n  // Return true only if both conditions are met.\n  return supportsTouch && isSmallScreen;\n}\n","/**\n * @file This file contains a utility function for truncating a string with a center ellipsis.\n */\n\n/**\n * Truncates a string by showing a specified number of characters from the start and end,\n * with an ellipsis in the middle. If the string is too short to be truncated, it's returned as is.\n *\n * @param {string} str - The string to truncate.\n * @param {number} from - The number of characters to show from the beginning of the string.\n * @param {number} to - The number of characters to show from the end of the string.\n * @returns {string} The truncated string, or the original string if it's too short.\n *\n * @example\n * const hash = '0x1234567890abcdef1234567890abcdef';\n * textCenterEllipsis(hash, 6, 4); // => \"0x1234...cdef\"\n *\n * textCenterEllipsis('short', 6, 4); // => \"short\"\n */\nexport function textCenterEllipsis(str: string | undefined | null, from: number, to: number): string {\n  if (!str) {\n    return '';\n  }\n\n  // If the string is short enough, don't truncate it.\n  if (str.length <= from + to) {\n    return str;\n  }\n\n  const start = str.slice(0, from);\n  const end = str.slice(str.length - to);\n\n  return `${start}...${end}`;\n}\n","import { AnimatePresence, motion } from 'framer-motion';\n\nimport { cn } from '../utils';\n\nexport function ChevronArrowWithAnim({\n  className,\n  strokeWidth,\n  isOpen,\n}: {\n  className?: string;\n  strokeWidth?: number;\n  isOpen?: boolean;\n}) {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      fill=\"none\"\n      viewBox=\"0 0 24 24\"\n      strokeWidth={strokeWidth ?? 2}\n      stroke=\"currentColor\"\n      className={cn('novacore:w-4 novacore:h-4 novacore:text-[var(--tuwa-text-secondary)]', className)}\n    >\n      <AnimatePresence>\n        {isOpen && (\n          <motion.path\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            d=\"m4.5 15.75 7.5-7.5 7.5 7.5\"\n            variants={{\n              hidden: { translateY: 3, scaleY: 0.8, opacity: 0 },\n              visible: { translateY: 0, scaleY: 1, opacity: 1 },\n            }}\n            initial=\"hidden\"\n            animate=\"visible\"\n            transition={{ duration: 0.4 }}\n          />\n        )}\n      </AnimatePresence>\n\n      <AnimatePresence>\n        {!isOpen && (\n          <motion.path\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"\n            className=\"novacore:relative\"\n            variants={{\n              hidden: { translateY: -3, scaleY: 0.8, opacity: 0 },\n              visible: { translateY: 0, scaleY: 1, opacity: 1 },\n            }}\n            initial=\"hidden\"\n            animate=\"visible\"\n            transition={{ duration: 0.4 }}\n          />\n        )}\n      </AnimatePresence>\n    </svg>\n  );\n}\n","import * as React from 'react';\n\nimport { cn } from '../utils';\n\n/**\n * A reusable close button icon (X mark) styled with TUWA color scheme.\n */\nexport const CloseIcon = React.forwardRef<SVGSVGElement, React.SVGAttributes<SVGSVGElement>>(\n  ({ className, ...props }, ref) => (\n    <svg\n      ref={ref}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      className={cn(\n        'novacore:h-5 novacore:w-5 novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors',\n        className,\n      )}\n      {...props}\n    >\n      <path d=\"M18 6 6 18\" />\n      <path d=\"m6 6 12 12\" />\n    </svg>\n  ),\n);\nCloseIcon.displayName = 'CloseIcon';\n","import * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { AnimatePresence, motion, Variants } from 'framer-motion';\nimport * as React from 'react';\n\nimport { cn, isTouchDevice } from '../utils';\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst defaultModalAnimation: Variants = {\n  initial: { opacity: 0, scale: 0.9, y: 20 },\n  animate: { opacity: 1, scale: 1, y: 0 },\n  exit: {\n    opacity: 0,\n    scale: 0.9,\n    transition: {\n      duration: 0.2,\n    },\n  },\n};\n\nconst mobileModalAnimation: Variants = {\n  initial: { opacity: 0, y: '100%' },\n  animate: { opacity: 1, y: '0%' },\n  exit: {\n    opacity: 0,\n    y: '100%',\n    transition: {\n      duration: 0.2,\n    },\n  },\n};\n\nconst defaultModalBackdropAnimation: Variants = {\n  initial: { opacity: 0 },\n  animate: { opacity: 1 },\n  exit: { opacity: 0 },\n};\n\nconst DialogOverlay = ({ className, backdropAnimation }: { backdropAnimation?: Variants; className?: string }) => {\n  React.useEffect(() => {\n    if (typeof window !== 'undefined') {\n      window.document.body.classList.add('NovaModalOpen');\n    }\n    return () => {\n      if (typeof window !== 'undefined') {\n        window.document.body.classList.remove('NovaModalOpen');\n      }\n    };\n  }, []);\n  return (\n    <AnimatePresence>\n      <motion.div\n        variants={backdropAnimation ?? defaultModalBackdropAnimation}\n        transition={{ duration: 0.2, ease: 'easeInOut' }}\n        animate=\"animate\"\n        initial=\"initial\"\n        exit=\"exit\"\n        className=\"novacore:relative novacore:rounded-t-2xl novacore:sm:rounded-2xl novacore:overflow-hidden\"\n      >\n        <div\n          className={cn(\n            'novacore:fixed novacore:inset-0 novacore:z-50 novacore:bg-black/55 novacore:backdrop-blur-sm novacore:backdrop-saturate-150',\n            className,\n          )}\n        />\n      </motion.div>\n    </AnimatePresence>\n  );\n};\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n    modalAnimation?: Variants;\n    backdropAnimation?: Variants;\n  }\n>(({ className, children, modalAnimation, backdropAnimation, ...props }, ref) => {\n  const [isMobile, setIsMobile] = React.useState(false);\n\n  React.useEffect(() => {\n    setIsMobile(isTouchDevice());\n  }, []);\n\n  const selectedAnimation = modalAnimation ?? (isMobile ? mobileModalAnimation : defaultModalAnimation);\n\n  return (\n    <DialogPortal>\n      <DialogOverlay backdropAnimation={backdropAnimation} />\n\n      <DialogPrimitive.Content\n        aria-describedby=\"tuwa:modal-content\"\n        ref={ref}\n        className={cn(\n          'NovaNoScrolling novacore:fixed novacore:bottom-0 novacore:left-0 novacore:p-0 novacore:sm:bottom-auto novacore:sm:left-[50%] novacore:sm:top-[50%] novacore:sm:translate-x-[-50%] novacore:sm:translate-y-[-50%] novacore:z-50 novacore:sm:p-4 novacore:outline-none',\n          className,\n        )}\n        {...props}\n      >\n        <motion.div\n          layout\n          className=\"NovaNoScrolling novacore:relative novacore:overflow-hidden\"\n          transition={{\n            layout: {\n              duration: 0.2,\n              ease: [0.1, 0.1, 0.2, 1],\n            },\n          }}\n        >\n          <AnimatePresence>\n            <motion.div\n              variants={selectedAnimation}\n              transition={{ duration: 0.2, ease: 'easeInOut' }}\n              animate=\"animate\"\n              initial=\"initial\"\n              exit=\"exit\"\n              className=\"NovaNoScrolling novacore:relative novacore:rounded-t-2xl novacore:sm:rounded-2xl novacore:overflow-hidden\"\n            >\n              <div\n                className={cn(\n                  'NovaNoScrolling novacore:relative novacore:flex novacore:max-h-[98dvh] novacore:w-full novacore:flex-col novacore:gap-3 novacore:overflow-y-auto novacore:rounded-t-2xl novacore:sm:rounded-2xl novacore:shadow-2xl',\n                  'novacore:border novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)]',\n                )}\n              >\n                {children}\n              </div>\n            </motion.div>\n          </AnimatePresence>\n        </motion.div>\n      </DialogPrimitive.Content>\n    </DialogPortal>\n  );\n});\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    aria-describedby=\"tuwa:modal-header\"\n    className={cn(\n      'novacore:sticky novacore:flex novacore:top-0 novacore:z-11 novacore:w-full novacore:flex-row novacore:items-center novacore:justify-between',\n      'novacore:border-b novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)] novacore:p-4',\n      className,\n    )}\n    {...props}\n  />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    aria-describedby=\"tuwa:modal-footer\"\n    className={cn(\n      'novacore:flex novacore:flex-col-reverse novacore:sm:flex-row novacore:sm:justify-end novacore:sm:space-x-2',\n      className,\n    )}\n    {...props}\n  />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Title\n    ref={ref}\n    aria-describedby=\"tuwa:modal-title\"\n    className={cn(\n      'novacore:text-lg novacore:font-bold novacore:leading-none novacore:tracking-tight novacore:text-[var(--tuwa-text-primary)] novacore:m-0',\n      className,\n    )}\n    {...props}\n  />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Description\n    aria-describedby=\"tuwa:modal-description\"\n    ref={ref}\n    className={cn('novacore:text-sm novacore:text-[var(--tuwa-text-secondary)]', className)}\n    {...props}\n  />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogOverlay,\n  DialogPortal,\n  DialogTitle,\n  DialogTrigger,\n};\n","import { useEffect, useMemo, useState } from 'react';\n\nexport function StarsBackground({ starsCount }: { starsCount?: number }) {\n  const [isMounted, setIsMounted] = useState(false);\n  useEffect(() => setIsMounted(true), []);\n\n  const stars = useMemo(() => {\n    if (!isMounted) {\n      return [];\n    }\n\n    const numStars = starsCount ?? 200;\n    return Array.from({ length: numStars }).map(() => ({\n      x: Math.random() * window.innerWidth,\n      y: Math.random() * window.innerHeight,\n      r: Math.random() * 1 + 0.5,\n      isSupernova: Math.random() < 0.1,\n      delay: Math.random() * 10,\n      duration: 5 + Math.random() * 5,\n    }));\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [isMounted]);\n\n  return (\n    <div className=\"novacore:absolute novacore:inset-0 novacore:z-1 novacore:h-full novacore:w-full novacore:overflow-hidden\">\n      <svg width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\">\n        <defs>\n          <style>\n            {`\n              /* Pulse animation now includes scale for a more organic feel. */\n              @keyframes pulse {\n                0%, 100% { \n                  opacity: 0.2;\n                  transform: scale(0.9);\n                }\n                50% {\n                  opacity: 0.8;\n                  transform: scale(1.2);\n                }\n              }\n              \n              /* Supernova animation remains impactful. */\n              @keyframes supernova {\n                0% { \n                  transform: scale(1);\n                  stroke: rgba(var(--tuwa-bg-primary), 0.5);\n                  opacity: 0.8;\n                }\n                20% { \n                  transform: scale(3);\n                  stroke: var(--tuwa-button-gradient-from);\n                  opacity: 1;\n                }\n                100% { \n                  transform: scale(0.8);\n                  stroke: var(--tuwa-button-gradient-to);\n                  opacity: 0;\n                }\n              }\n\n              .pulsar {\n                animation-name: pulse;\n                animation-timing-function: ease-in-out;\n                animation-iteration-count: infinite;\n                transform-origin: center;\n              }\n\n              .supernova {\n                animation-name: supernova;\n                animation-timing-function: ease-out;\n                animation-iteration-count: infinite;\n                transform-origin: center;\n                stroke-width: 2;\n              }\n            `}\n          </style>\n        </defs>\n\n        {stars.map((star, i) => (\n          <circle\n            key={i}\n            cx={star.x}\n            cy={star.y}\n            r={star.r}\n            fill={`rgba(var(--tuwa-bg-primary), 0.7)`}\n            className={star.isSupernova ? 'supernova' : 'pulsar'}\n            style={{\n              animationDelay: `${star.delay}s`,\n              animationDuration: `${star.duration}s`,\n            }}\n          />\n        ))}\n      </svg>\n    </div>\n  );\n}\n","/**\n * @file This file contains a reusable close button component, designed primarily for toast notifications.\n */\n\nimport { cn } from '../utils';\n\n/**\n * Defines the props for the ToastCloseButton component.\n */\nexport type ToastCloseButtonProps = {\n  /**\n   * The function to call when the button is clicked. This is typically provided by the\n   * toast library (e.g., react-toastify) to dismiss the notification.\n   */\n  closeToast?: (e: React.MouseEvent<HTMLElement>) => void;\n};\n\n/**\n * A simple, styled close button component ('X' icon) intended for use within toast notifications.\n * It uses theme-aware CSS variables for styling and i18n labels for accessibility.\n */\nexport function ToastCloseButton({ closeToast }: ToastCloseButtonProps) {\n  return (\n    <button\n      type=\"button\"\n      onClick={closeToast}\n      aria-label=\"Close toast notification\"\n      title=\"Close toast notification\"\n      className={cn(\n        'novacore:absolute novacore:top-2 novacore:right-2 novacore:cursor-pointer novacore:rounded-full novacore:p-1',\n        'novacore:text-[var(--tuwa-text-tertiary)] novacore:transition-colors',\n        'novacore:hover:bg-[var(--tuwa-bg-muted)] novacore:hover:text-[var(--tuwa-text-primary)]',\n      )}\n    >\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"novacore:h-5 novatx:w-5\"\n      >\n        <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\" />\n      </svg>\n    </button>\n  );\n}\n","/**\n * @file This file contains a custom React hook for copying text to the clipboard.\n */\n\nimport { useCallback, useState } from 'react';\n\n/**\n * A custom React hook that provides functionality to copy text to the clipboard.\n * It also manages a \"copied\" state with a timeout for user feedback.\n *\n * @param {number} [timeout=2000] - The duration in milliseconds to keep the `isCopied` state as true.\n * @returns {{\n * isCopied: boolean;\n * copy: (text: string) => Promise<void>;\n * error: Error | null;\n * }} An object containing the `isCopied` state, the `copy` function, and any potential error.\n *\n * @example\n * const MyComponent = () => {\n * const { isCopied, copy } = useCopyToClipboard();\n * const textToCopy = '0x123...';\n *\n * return (\n * <button onClick={() => copy(textToCopy)}>\n * {isCopied ? 'Copied!' : 'Copy Address'}\n * </button>\n * );\n * }\n */\nexport function useCopyToClipboard(timeout = 2000): {\n  isCopied: boolean;\n  copy: (text: string) => Promise<void>;\n  error: Error | null;\n} {\n  const [isCopied, setIsCopied] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const copy = useCallback(\n    async (text: string) => {\n      if (!text) return;\n\n      try {\n        await navigator.clipboard.writeText(text);\n        setIsCopied(true);\n        setError(null);\n\n        setTimeout(() => setIsCopied(false), timeout);\n      } catch (e) {\n        const copyError = e instanceof Error ? e : new Error('Failed to copy text.');\n        console.error(copyError);\n        setError(copyError);\n\n        // Reset error state after timeout as well\n        setTimeout(() => setError(null), timeout);\n      }\n    },\n    [timeout],\n  );\n\n  return { isCopied, copy, error };\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * A custom hook to detect if a media query matches the current screen dimensions.\n * Handles SSR gracefully.\n * @param {string} query - The media query string (e.g., '(max-width: 767px)').\n * @returns {boolean} Whether the query matches or not.\n */\nexport function useMediaQuery(query: string): boolean {\n  const getMatches = (q: string): boolean => {\n    if (typeof window !== 'undefined') {\n      return window.matchMedia(q).matches;\n    }\n    return false;\n  };\n\n  const [matches, setMatches] = useState<boolean>(getMatches(query));\n\n  useEffect(() => {\n    const media = window.matchMedia(query);\n    const listener = () => setMatches(media.matches);\n\n    // Re-check on mount and subscribe to changes\n    listener();\n    window.addEventListener('resize', listener);\n\n    return () => window.removeEventListener('resize', listener);\n  }, [query]);\n\n  return matches;\n}\n"]}