@nex-ui/react
Version:
🎉 A beautiful, modern, and reliable React component library.
106 lines (102 loc) • 3.69 kB
JavaScript
"use client";
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var icons = require('@nex-ui/icons');
var Context = require('../provider/Context.cjs');
var useDefaultProps = require('../utils/useDefaultProps.cjs');
var useSlotClasses = require('../utils/useSlotClasses.cjs');
var useStyles = require('../utils/useStyles.cjs');
var useSlot = require('../utils/useSlot.cjs');
var ButtonBase = require('../buttonBase/ButtonBase.cjs');
var Ripple = require('../utils/ripple/Ripple.cjs');
var button = require('../../theme/recipes/button.cjs');
const slots = [
'root',
'startIcon',
'endIcon'
];
const Button = (inProps)=>{
const { primaryThemeColor } = Context.useNexUI();
const props = useDefaultProps.useDefaultProps({
name: 'Button',
props: inProps
});
const { children, slotProps, spinner, classNames, color = primaryThemeColor, variant = 'solid', size = 'md', radius = size, iconOnly = false, loading = false, disabled: disabledProp = false, fullWidth = false, rippleDisabled = false, startIcon: startIconProp, endIcon: endIconProp, spinnerPlacement = 'start', ...remainingProps } = props;
const disabled = loading || disabledProp;
const ownerState = {
...props,
spinnerPlacement,
variant,
size,
radius,
iconOnly,
loading,
fullWidth,
color,
rippleDisabled,
disabled: disabledProp
};
const slotClasses = useSlotClasses.useSlotClasses({
name: 'Button',
slots,
classNames
});
const styles = useStyles.useStyles({
ownerState,
name: 'Button',
recipe: button.buttonRecipe
});
const [ButtonRoot, getButtonRootProps] = useSlot.useSlot({
elementType: ButtonBase.ButtonBase,
externalForwardedProps: remainingProps,
classNames: slotClasses.root,
style: styles.root,
shouldForwardComponent: false,
additionalProps: {
disabled
},
dataAttrs: {
variant,
radius,
size,
color,
iconOnly,
loading,
disabled,
fullWidth,
rippleDisabled
}
});
const [ButtonStartIcon, getButtonStartIconProps] = useSlot.useSlot({
elementType: 'span',
externalSlotProps: slotProps?.startIcon,
classNames: slotClasses.startIcon,
style: styles.startIcon
});
const [ButtonEndIcon, getButtonEndIconProps] = useSlot.useSlot({
elementType: 'span',
externalSlotProps: slotProps?.endIcon,
classNames: slotClasses.endIcon,
style: styles.endIcon
});
const loadingIcon = spinner ?? /*#__PURE__*/ jsxRuntime.jsx(icons.LoadingOutlined, {});
return /*#__PURE__*/ jsxRuntime.jsx(Ripple.Ripple, {
disabled: rippleDisabled || disabled,
children: /*#__PURE__*/ jsxRuntime.jsxs(ButtonRoot, {
...getButtonRootProps(),
children: [
(spinnerPlacement === 'start' && loading || startIconProp) && /*#__PURE__*/ jsxRuntime.jsx(ButtonStartIcon, {
...getButtonStartIconProps(),
children: loading ? loadingIcon : startIconProp
}),
!loading || !iconOnly ? children : null,
(spinnerPlacement === 'end' && loading || endIconProp) && /*#__PURE__*/ jsxRuntime.jsx(ButtonEndIcon, {
...getButtonEndIconProps(),
children: loading ? loadingIcon : endIconProp
})
]
})
});
};
Button.displayName = 'Button';
exports.Button = Button;