{"version":3,"file":"Toggle.cjs","names":[],"sources":["../../../src/components/Toggle/Toggle.tsx"],"sourcesContent":["import { forwardRef, useCallback, useState } from \"react\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Toggle.module.css\";\n\nexport type ToggleSize = \"sm\" | \"md\" | \"lg\";\nexport type ToggleVariant = \"default\" | \"outline\";\n\nexport interface ToggleProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n    /** Controlled pressed state. When provided the component is controlled. */\n    pressed?: boolean;\n    /** Initial pressed state for the uncontrolled variant. Default `false`. */\n    defaultPressed?: boolean;\n    /** Fired with the next pressed state whenever the toggle is activated. */\n    onPressedChange?: (pressed: boolean) => void;\n    /** Visual size. Default `\"md\"`. */\n    size?: ToggleSize;\n    /** Visual style. Default `\"default\"`. */\n    variant?: ToggleVariant;\n}\n\n/**\n * A pressable two-state button — like a checkbox styled as a button.\n *\n * Works controlled (pass `pressed` + `onPressedChange`) or uncontrolled\n * (pass `defaultPressed`). Renders a native `<button type=\"button\">` exposing\n * its state through `aria-pressed`.\n *\n * @param props - {@link ToggleProps}.\n * @returns The toggle button element.\n */\nexport const Toggle = forwardRef<HTMLButtonElement, ToggleProps>(function Toggle(\n    {\n        pressed,\n        defaultPressed = false,\n        onPressedChange,\n        size = \"md\",\n        variant = \"default\",\n        className,\n        disabled,\n        onClick,\n        children,\n        ...props\n    },\n    ref,\n) {\n    const isControlled = pressed !== undefined;\n    const [internalPressed, setInternalPressed] = useState<boolean>(defaultPressed);\n    const isPressed = isControlled ? pressed : internalPressed;\n\n    const handleClick = useCallback(\n        (event: React.MouseEvent<HTMLButtonElement>): void => {\n            onClick?.(event);\n            if (event.defaultPrevented) return;\n            const next = !isPressed;\n            if (!isControlled) setInternalPressed(next);\n            onPressedChange?.(next);\n        },\n        [isPressed, isControlled, onClick, onPressedChange],\n    );\n\n    return (\n        <button\n            ref={ref}\n            type=\"button\"\n            aria-pressed={isPressed}\n            disabled={disabled}\n            data-state={isPressed ? \"on\" : \"off\"}\n            className={cn(\n                styles.toggle,\n                styles[size],\n                styles[variant],\n                isPressed && styles.pressed,\n                className,\n            )}\n            onClick={handleClick}\n            {...props}\n        >\n            {children}\n        </button>\n    );\n});\n"],"mappings":"6HA+BA,IAAa,GAAA,EAAS,EAAA,WAAA,CAA2C,SAC7D,CACI,UACA,iBAAiB,GACjB,kBACA,OAAO,KACP,UAAU,UACV,YACA,WACA,UACA,WACA,GAAG,GAEP,EACF,CACE,IAAM,EAAe,IAAY,IAAA,GAC3B,CAAC,EAAiB,IAAA,EAAsB,EAAA,SAAA,CAAkB,CAAc,EACxE,EAAY,EAAe,EAAU,EAErC,GAAA,EAAc,EAAA,YAAA,CACf,GAAqD,CAElD,GADA,IAAU,CAAK,EACX,EAAM,iBAAkB,OAC5B,IAAM,EAAO,CAAC,EACT,GAAc,EAAmB,CAAI,EAC1C,IAAkB,CAAI,CAC1B,EACA,CAAC,EAAW,EAAc,EAAS,CAAe,CACtD,EAEA,OACI,EAAA,EAAA,IAAA,CAAC,SAAD,CACS,MACL,KAAK,SACL,eAAc,EACJ,WACV,aAAY,EAAY,KAAO,MAC/B,UAAW,EAAA,GACP,EAAA,QAAO,OACP,EAAA,QAAO,GACP,EAAA,QAAO,GACP,GAAa,EAAA,QAAO,QACpB,CACJ,EACA,QAAS,EACT,GAAI,EAEH,UACG,CAAA,CAEhB,CAAC"}