'use client'; import { forwardRef, ButtonHTMLAttributes, AnchorHTMLAttributes, ReactNode } from 'react'; type BaseProps = { children: ReactNode; variant?: 'default' | 'gold' | 'outline' | 'ghost'; size?: 'sm' | 'md' | 'lg'; showArrow?: boolean; pulsing?: boolean; glitchOnHover?: boolean; iconLeft?: ReactNode; iconRight?: ReactNode; }; type ButtonProps = BaseProps & ButtonHTMLAttributes & { href?: never }; type AnchorProps = BaseProps & AnchorHTMLAttributes & { href: string }; export type DeeperButtonProps = ButtonProps | AnchorProps; const variantClasses: Record = { default: 'border-red-500 text-red-500 hover:text-black before:bg-red-500', gold: 'border-amber-500 text-amber-500 hover:text-black before:bg-amber-500', outline: 'border border-red-500 text-red-500 hover:border-2 hover:text-black before:bg-red-500', ghost: 'border-transparent border-b-red-500 text-red-500 hover:border-red-500 before:hidden', }; const sizeClasses: Record = { sm: 'py-4 px-8 text-base', md: 'py-8 px-16 text-2xl', lg: 'py-10 px-20 text-3xl', }; export const DeeperButton = forwardRef( ({ children, variant = 'default', size = 'md', showArrow = true, pulsing = false, glitchOnHover = false, iconLeft, iconRight, className, ...props }, ref) => { const classes = ` relative overflow-hidden border-2 bg-transparent font-display tracking-[0.1em] uppercase cursor-pointer transition-all inline-block no-underline before:content-[''] before:absolute before:top-0 before:-left-full before:w-full before:h-full before:transition-[left] before:duration-300 before:-z-10 hover:before:left-0 ${variantClasses[variant]} ${sizeClasses[size]} ${pulsing ? 'animate-[pulse_2s_ease-in-out_infinite]' : ''} ${glitchOnHover ? 'hover:animate-[glitchText_0.3s_infinite]' : ''} ${className || ''} `; const content = ( <> {iconLeft && {iconLeft}} {children} {iconRight && {iconRight}} {showArrow && ( )} ); if ('href' in props && props.href) { return ( {content} ); } return ( ); } ); DeeperButton.displayName = 'DeeperButton'; export default DeeperButton;