/** * ButtonBase Component - Lynx 版 MUI ButtonBase * 一比一对应 MUI ButtonBase * * ButtonBase 是所有按钮组件的基础,提供: * - 样式重置 * - 禁用状态处理 * - 焦点可见状态 * - 点击事件处理 * - 涟漪效果(使用 CSS @keyframes 动画实现) */ import './ButtonBase.css' import '../TouchRipple/TouchRipple.css' // ============================================= // ButtonBase 类型定义 // ============================================= export interface ButtonBaseProps { /** 子元素 */ children?: any /** 自定义类名 */ className?: string /** 内联样式 */ style?: Record /** 是否禁用 */ disabled?: boolean /** 是否禁用涟漪效果 */ disableRipple?: boolean /** 是否禁用触摸涟漪 */ disableTouchRipple?: boolean /** 焦点涟漪 */ focusRipple?: boolean /** 焦点可见时的类名 */ focusVisibleClassName?: string /** tabIndex */ tabIndex?: number /** 按钮类型 */ type?: 'button' | 'submit' | 'reset' /** 链接地址 (如果提供则渲染为链接) */ href?: string /** 是否居中涟漪 */ centerRipple?: boolean /** sx 属性 */ sx?: Record /** 点击事件 */ bindtap?: () => void onClick?: () => void /** 焦点事件 */ onFocus?: () => void onBlur?: () => void /** 其他属性 */ [key: string]: any } // ============================================= // ButtonBase 类名 // ============================================= export const buttonBaseClasses = { root: 'MuiButtonBase-root', disabled: 'Mui-disabled', focusVisible: 'Mui-focusVisible', } // ============================================= // ButtonBase 组件实现 // ============================================= export function ButtonBase(props: ButtonBaseProps) { const { children, className, style, disabled = false, disableRipple = false, disableTouchRipple = false, focusRipple = false, focusVisibleClassName, tabIndex = 0, type, href, centerRipple = false, sx, bindtap, onClick, onFocus, onBlur, ...other } = props // 处理点击事件 const handleTap = () => { if (disabled) return if (bindtap) bindtap() if (onClick) onClick() } // 构建类名 const classes = [ buttonBaseClasses.root, disabled && buttonBaseClasses.disabled, className, ].filter(Boolean).join(' ') // 计算样式 - 对应 MUI ButtonBaseRoot 样式 const computedStyle: Record = { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', position: 'relative', boxSizing: 'border-box', backgroundColor: 'transparent', borderWidth: 0, margin: 0, borderRadius: 0, padding: 0, color: 'inherit', ...(disabled && { cursor: 'default', opacity: 0.5, }), ...sx, ...style, } return ( {children} ) } export default ButtonBase