import { isDefined } from '@o/utils' import { Theme } from 'gloss' import React, { memo, useCallback, useMemo } from 'react' import { memoIsEqualDeep } from '../helpers/memoHelpers' import { useUncontrolled } from '../helpers/useUncontrolled' import { Surface, SurfaceProps } from '../Surface' import { useSurfaceProps } from '../SurfacePropsContext' export type ButtonProps = React.HTMLAttributes & SurfaceProps & { /** use defaultActive/onChangeActive for easy active on/off */ onChangeActive?: (next: boolean) => any /** uncontrolled active state */ defaultActive?: boolean } export const Button = memoIsEqualDeep((direct: ButtonProps) => { const props = useSurfaceProps(direct) const { coat, subTheme = 'button', ...rest } = props const controlledProps = useUncontrolled(rest, { active: 'onChangeActive', }) return ( { if (isDefined(props.active) && props.onChangeActive) { props.onChangeActive(!props.active) } }, [props.onChangeActive, props.active])} {...rest} {...controlledProps} /> ) }) const buttonElementProps = { color: 'inherit', } Button['acceptsProps'] = { hover: true, } const borderWidthTheme = theme => theme.borderWidth ?? 1 const glowProps = { scale: 1.8, opacity: 0.15, }