import React, { MouseEventHandler } from 'react'; import { combineClasses } from '../../utils'; import { withClasses } from '../../utils/styles'; import './Button.css'; // TODO add a way to send styles interface StyledButtonProps { /** * Variant */ variant?: 'standard' | 'danger' | 'emphasized' | 'no-fill' | 'icon-only'; /** * Size */ size?: 'sm' | 'md' | 'lg'; /** * Shape */ shape?: 'circle' | 'rectangle'; /** * Variable denoting active state */ active?: boolean; /** * Variable denoting disabled state */ disabled?: boolean; /** * Method to call on click */ onClick?: MouseEventHandler; /** * Default class names */ defaultClasses?: ButtonClasses; /** * Extra class names */ classes?: ButtonClasses; /** * */ children?: (JSX.Element | string)[] | JSX.Element | string | boolean | number; } export interface ButtonClasses { root?: string; rootStandard?: string; rootDanger?: string; rootEmphasized?: string; rootNoFill?: string; rootIconOnly?: string; rootSm?: string; rootMd?: string; rootLg?: string; rootCircle?: string; rootRectangle?: string; rootDisabled?: string; iconOnlyActive?: string; noFillDisabled?: string; iconOnlyDisabled?: string; iconOnlySm?: string; iconOnlyMd?: string; iconOnlyLg?: string; container?: string; } const defaultClasses = { root: 'box-border focus:outline-none focus:border-brand-tint overflow-hidden flex flex-row items-center overflow-hidden rounded-lg', rootStandard: 'text-gray-100 dark:text-white bg-gray-600 dark:bg-gray-200 hover:gray-500 dark:hovergray-300 focus:gray-600 dark:focus:gray-200', rootDanger: 'text-gray-100 dark:text-white bg-red-main hover:bg-red-tint text-white', rootEmphasized: 'text-gray-100 dark:text-white bg-brand-main hover:bg-brand-tint text-white', rootNoFill: 'light:text-brand-main light:hover:text-brand-tint dark:text-white', rootIconOnly: 'text-gray-100 dark:text-white hover:bg-transparent-300 focus:bg-none', iconOnlyActive: 'bg-gray-200 text-white dark:bg-white dark:text-black', rootDisabled: 'text-transaprent-700 bg-transparent-800 dark:text-transparent-300 dark:bg-transparent-200', noFillDisabled: 'text-brand-shade dark:text-transparent-300', iconOnlySm: 'px-0.5 py-0.5', iconOnlyMd: 'px-1.5 py-1.5', iconOnlyLg: 'px-2 py-2', // TODO add back focus for keyboard users rootSm: 'px-2 py-0.5 text-sm', rootMd: 'px-3.5 py-1 text-md', rootLg: 'px-5 py-2.5 text-lg', rootCircle: 'rounded-full', }; export const StyledButton = ({ variant = 'standard', size = 'lg', shape = 'rectangle', active = false, disabled = false, onClick, defaultClasses, classes: extraClasses, children, }: StyledButtonProps) => { //@ts-expect-error const combinedClasses = combineClasses(defaultClasses, extraClasses); return ( <> ); }; export type ButtonProps = Omit; export const Button = withClasses( defaultClasses, 'button', )(StyledButton);