{"version":3,"file":"button.cjs","sources":["../../../src/components/button.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\nimport type {\n    AnchorHTMLAttributes,\n    ButtonHTMLAttributes,\n    ElementType,\n    ForwardedRef,\n    FunctionComponent,\n    ReactNode,\n    SVGProps,\n} from \"react\";\nimport Spinner from \"../icons/spinner\";\nimport { mergedCva, mergedCx } from \"../utils/components\";\n\nconst buttonStyles = mergedCva(\n    [\n        \"cui-relative\",\n        \"cui-w-fit\",\n        \"cui-flex cui-items-center cui-justify-center\",\n        \"cui-font-mono cui-uppercase\",\n        \"cui-border cui-border-black\",\n        \"cui-cursor-pointer\",\n        \"cui-group\",\n        \"cui-transition-colors\",\n        \"cui-rounded-xxl\",\n    ],\n    {\n        variants: {\n            size: {\n                big: \"cui-px-6 cui-py-5\",\n                small: \"cui-px-6 cui-py-4 cui-text-s\",\n                xsmall: \"cui-p-4 cui-text-xs\",\n            },\n            variant: {\n                primary: [],\n                secondary: [],\n            },\n            active: {\n                true: [],\n            },\n        },\n        defaultVariants: {\n            active: false,\n        },\n        compoundVariants: [\n            {\n                variant: \"primary\",\n                active: false,\n                className: [\n                    // light mode\n                    \"cui-bg-black cui-text-white\",\n                    \"hover:cui-bg-orange hover:cui-text-black\",\n                    \"disabled:cui-text-white disabled:cui-bg-gray-400 disabled:cui-border-gray-400\",\n                    // dark mode\n                    \"dark:cui-bg-orange dark:cui-text-black\",\n                    \"hover:dark:cui-bg-black hover:dark:cui-text-orange hover:dark:cui-border-orange\",\n                    \"disabled:dark:cui-text-gray-400 disabled:dark:cui-bg-gray-700 disabled:dark:cui-border-gray-700\",\n                ],\n            },\n            {\n                variant: \"secondary\",\n                active: false,\n                className: [\n                    \"cui-border-black cui-text-black\",\n                    // dark mode\n                    \"dark:cui-border-white dark:cui-text-white\",\n                    \"hover:dark:cui-border-black hover:dark:cui-bg-white hover:dark:cui-text-black\",\n                ],\n            },\n            // active styles\n            {\n                variant: [\"primary\", \"secondary\"],\n                active: true,\n                className: [\n                    \"cui-bg-green cui-border cui-text-black\",\n                    \"hover:cui-bg-black hover:cui-text-white\",\n                ],\n            },\n        ],\n    },\n);\n\nconst iconStyles = mergedCva(\n    [\"only:cui-m-0\", \"first:cui-mr-2\", \"last:cui-ml-2\"],\n    {\n        variants: {\n            size: {\n                big: [\"cui-w-6 cui-h-6\"],\n                small: [\"cui-w-5 cui-h-5\"],\n                xsmall: [\"cui-w-4 cui-h-4\"],\n            },\n            loading: {\n                true: [\"cui-animate-spin\"],\n            },\n        },\n    },\n);\n\nconst spinnerWrapperStyles = mergedCva(\n    [\"only:cui-m-0\", \"first:cui-mr-2\", \"last:cui-ml-2\"],\n    {\n        variants: {\n            hasIcon: {\n                false: [],\n            },\n            loading: {\n                true: [],\n            },\n            size: {\n                big: [\"cui-w-6 cui-h-6\"],\n                small: [\"cui-w-5 cui-h-5\"],\n                xsmall: [\"cui-w-4 cui-h-4\"],\n            },\n        },\n        compoundVariants: [\n            {\n                hasIcon: false,\n                loading: true,\n                className: [\n                    \"cui-absolute\",\n                    \"cui-left-1/2\",\n                    \"cui-transform\",\n                    \"-cui-translate-x-1/2\",\n                ],\n            },\n        ],\n    },\n);\n\nconst spinnerStyles = mergedCva([], {\n    variants: {\n        hasIcon: {\n            false: [\"!cui-m-0\"],\n        },\n        loading: {\n            true: [\"cui-animate-spin\"],\n        },\n    },\n});\n\nconst wrapperStyles = mergedCva([], {\n    variants: {\n        hasIcon: {\n            true: [],\n            false: [],\n        },\n        loading: {\n            true: [],\n        },\n    },\n    compoundVariants: [\n        {\n            hasIcon: false,\n            loading: true,\n            className: [\"cui-invisible\"],\n        },\n    ],\n});\n\nexport interface BaseButtonProps {\n    onClick?: (event: React.MouseEvent) => void;\n    disabled?: boolean;\n    loading?: boolean;\n    className?: {\n        root?: string;\n        iconWrapper?: string;\n        icon?: string;\n        contentWrapper?: string;\n    };\n    icon?: FunctionComponent<SVGProps<SVGSVGElement>>;\n    iconPlacement?: \"left\" | \"right\";\n    size?: \"big\" | \"small\" | \"xsmall\";\n    variant?: \"primary\" | \"secondary\";\n    active?: boolean;\n    children?: ReactNode;\n}\n\nexport type CleanHTMLButtonProps = BaseButtonProps &\n    Omit<ButtonHTMLAttributes<HTMLButtonElement>, keyof BaseButtonProps>;\nexport type CleanHTMLAnchorProps = BaseButtonProps &\n    Omit<AnchorHTMLAttributes<HTMLAnchorElement>, keyof BaseButtonProps>;\n\nexport type ButtonProps = CleanHTMLButtonProps | CleanHTMLAnchorProps;\n\nexport type RefType<P extends ButtonProps> = ForwardedRef<\n    \"href\" extends keyof P ? HTMLAnchorElement : HTMLButtonElement\n>;\n\nconst Component = (props: ButtonProps, ref: RefType<typeof props>) => {\n    const {\n        variant = \"primary\",\n        size = \"big\",\n        disabled,\n        onClick,\n        loading,\n        children,\n        className,\n        active = false,\n        icon: Icon,\n        iconPlacement = \"left\",\n        ...rest\n    } = props;\n\n    const sharedProps = {\n        className: buttonStyles({\n            active,\n            size,\n            variant,\n            className: className?.root,\n        }),\n    };\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const [Root, rootProps]: [ElementType, any] =\n        \"href\" in rest\n            ? [\"a\", { href: rest.href }]\n            : [\"button\", { onClick, disabled: disabled || loading }];\n\n    const hasIcon = !!Icon;\n    let resolvedIcon;\n    if (!!loading)\n        resolvedIcon = (\n            <div\n                className={spinnerWrapperStyles({\n                    hasIcon,\n                    loading,\n                    size,\n                    className: className?.iconWrapper,\n                })}\n            >\n                <Spinner\n                    className={mergedCx(\n                        iconStyles({\n                            size,\n                            loading,\n                        }),\n                        spinnerStyles({ hasIcon, loading }),\n                        className?.icon,\n                    )}\n                />\n            </div>\n        );\n    else if (!!hasIcon)\n        resolvedIcon = (\n            <Icon\n                className={iconStyles({\n                    size,\n                    className: className?.icon,\n                })}\n            />\n        );\n\n    return (\n        <Root {...sharedProps} {...rootProps} {...rest} ref={ref}>\n            {children && iconPlacement === \"left\" && resolvedIcon}\n            {children ? (\n                <div\n                    className={wrapperStyles({\n                        hasIcon,\n                        loading,\n                        className: className?.contentWrapper,\n                    })}\n                >\n                    {children}\n                </div>\n            ) : (\n                resolvedIcon\n            )}\n            {children && iconPlacement === \"right\" && resolvedIcon}\n        </Root>\n    );\n};\n\nexport const Button = forwardRef(Component) as <P extends ButtonProps>(\n    props: P & {\n        ref?: RefType<P>;\n    },\n) => ReturnType<typeof Component>;\n"],"names":["mergedCva","Spinner","mergedCx","forwardRef"],"mappings":"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"}