UNPKG

@nex-ui/react

Version:

🎉 A beautiful, modern, and reliable React component library.

114 lines (110 loc) • 3.61 kB
'use strict'; var jsxRuntime = require('react/jsx-runtime'); var react = require('react'); var utils = require('@nex-ui/utils'); var styled = require('@nex-ui/styled'); var AvatarGroupContext = require('./AvatarGroupContext.cjs'); var Avatar = require('./Avatar.cjs'); var useDefaultProps = require('../utils/useDefaultProps.cjs'); var useStyles = require('../utils/useStyles.cjs'); var useSlotProps = require('../utils/useSlotProps.cjs'); var Context = require('../provider/Context.cjs'); var composeClasses = require('../utils/composeClasses.cjs'); var avatar = require('../../theme/recipes/avatar.cjs'); var getUtilityClass = require('../utils/getUtilityClass.cjs'); const useSlotClasses = (ownerState)=>{ const { prefix } = Context.useNexUI(); const avatarGroupRoot = `${prefix}-avatar-group`; const { color, size, radius, outlined, classes } = ownerState; const slots = { root: [ 'root', `radius-${radius}`, `size-${size}`, `color-${color}`, outlined && 'outlined' ], surplus: [ 'surplus' ] }; const composedClasses = composeClasses.composeClasses(slots, getUtilityClass.getUtilityClass(avatarGroupRoot), classes); return composedClasses; }; const AvatarGroup = (inProps)=>{ const props = useDefaultProps.useDefaultProps({ name: 'AvatarGroup', props: inProps }); const { children, total, slotProps, spacing, ref, renderSurplus, as = 'div', size = 'md', color = 'gray', outlined = false, radius = size, max: maxProp = 5, ...remainingProps } = props; const max = Math.max(1, maxProp); const ownerState = { ...props, size, color, outlined, radius, as, max }; const classes = useSlotClasses(ownerState); const styles = useStyles.useStyles({ name: 'AvatarGroup', ownerState, recipe: avatar.avatarGroupRecipe }); const rootProps = useSlotProps.useSlotProps({ ownerState, externalForwardedProps: remainingProps, sx: styles, classNames: classes.root, additionalProps: { ref, as, style: { [`--avatar-group-spacing`]: spacing !== undefined ? `${spacing}px` : undefined } } }); const surplusProps = useSlotProps.useSlotProps({ ownerState, externalSlotProps: slotProps?.surplus, classNames: classes.surplus }); const ctx = react.useMemo(()=>({ size, color, outlined, radius }), [ color, outlined, radius, size ]); if (!utils.isArray(children)) { return children; } const lastAvatar = Math.min(children.length, max); const totalAvatars = total ?? children.length; const extraAvatars = Math.max(0, totalAvatars - lastAvatar); const extraElement = renderSurplus ? renderSurplus(extraAvatars) : /*#__PURE__*/ jsxRuntime.jsxs(Avatar.Avatar, { ...surplusProps, children: [ "+", extraAvatars ] }); return /*#__PURE__*/ jsxRuntime.jsx(styled.nex.div, { ...rootProps, children: /*#__PURE__*/ jsxRuntime.jsxs(AvatarGroupContext.AvatarGroupProvider, { value: ctx, children: [ children.slice(0, lastAvatar), !!extraAvatars && extraElement ] }) }); }; AvatarGroup.displayName = 'AvatarGroup'; exports.AvatarGroup = AvatarGroup;