@nex-ui/react
Version:
🎉 A beautiful, modern, and reliable React component library.
104 lines (101 loc) • 3.23 kB
JavaScript
"use client";
import { jsxs, jsx } from 'react/jsx-runtime';
import { CloseCircleFilled } from '@nex-ui/icons';
import { useNexUI } from '../provider/Context.mjs';
import { useDefaultProps } from '../utils/useDefaultProps.mjs';
import { useSlotClasses } from '../utils/useSlotClasses.mjs';
import { useStyles } from '../utils/useStyles.mjs';
import { useSlot } from '../utils/useSlot.mjs';
import { ButtonBase } from '../buttonBase/ButtonBase.mjs';
import { badgeRecipe } from '../../theme/recipes/badge.mjs';
const slots = [
'root',
'closeButton',
'startIcon',
'endIcon'
];
const Badge = (inProps)=>{
const { primaryThemeColor } = useNexUI();
const props = useDefaultProps({
name: 'Badge',
props: inProps
});
const { children, onClose, classNames, slotProps, startIcon, endIcon, disabled = false, closable = false, color = primaryThemeColor, size = 'md', variant = 'solid', radius = size, ...remainningProps } = props;
const ownerState = {
...props,
color,
size,
variant,
radius,
closable,
disabled
};
const slotClasses = useSlotClasses({
name: 'Badge',
slots,
classNames
});
const styles = useStyles({
name: 'Badge',
ownerState: ownerState,
recipe: badgeRecipe
});
const [BadgeRoot, getBadgeRootProps] = useSlot({
style: styles.root,
elementType: 'span',
externalForwardedProps: remainningProps,
classNames: slotClasses.root,
dataAttrs: {
color,
size,
variant,
radius,
closable,
disabled
}
});
const [BadgeCloseButton, getBadgeCloseButtonProps] = useSlot({
elementType: ButtonBase,
style: styles.closeButton,
shouldForwardComponent: false,
externalSlotProps: slotProps?.closeButton,
classNames: slotClasses.closeButton,
additionalProps: {
disabled,
onClick: onClose,
'aria-label': 'Close Badge'
}
});
const [BadgeStartIcon, getBadgeStartIconProps] = useSlot({
elementType: 'span',
style: styles.startIcon,
externalSlotProps: slotProps?.startIcon,
classNames: slotClasses.startIcon
});
const [BadgeEndIcon, getBadgeEndIconProps] = useSlot({
elementType: 'span',
style: styles.endIcon,
externalSlotProps: slotProps?.endIcon,
classNames: slotClasses.endIcon
});
return /*#__PURE__*/ jsxs(BadgeRoot, {
...getBadgeRootProps(),
children: [
startIcon && /*#__PURE__*/ jsx(BadgeStartIcon, {
...getBadgeStartIconProps(),
children: startIcon
}),
children,
endIcon && /*#__PURE__*/ jsx(BadgeEndIcon, {
...getBadgeEndIconProps(),
children: endIcon
}),
closable && /*#__PURE__*/ jsx(BadgeCloseButton, {
...getBadgeCloseButtonProps(),
children: /*#__PURE__*/ jsx(CloseCircleFilled, {})
})
]
});
};
Badge.displayName = 'Badge';
export { Badge };