UNPKG

@engie-group/fluid-design-system-react

Version:

Fluid Design System React

61 lines (58 loc) 2.93 kB
import { jsxs, jsx } from 'react/jsx-runtime'; import { Root as Slot } from '../../node_modules/.pnpm/@radix-ui_react-slot@1.2.3_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-slot/dist/index.js'; import React__default from 'react'; import { isDefaultComponent } from '../../utils/typeHelpers.js'; import { Utils } from '../../utils/util.js'; import { NJIcon } from '../icon/NJIcon.js'; import { NJSpinner } from '../spinner/NJSpinner.js'; function getCustomIconWithClassName(customIcon) { if (!customIcon) { return; } const className = Utils.classNames(customIcon.props.className, 'nj-btn__icon'); return React__default.cloneElement(customIcon, { className }); } const NJButton = React__default.forwardRef((props, ref) => { const { variant, emphasis, scale, isLoading, icon, children, visuallyDisabled, asChild, ...defaultProps } = props; let btnClasses = Utils.classNames('nj-btn', { [`nj-btn--${scale}`]: scale && scale !== 'md', [`nj-btn--${variant}`]: variant && variant !== 'primary', [`nj-btn--${emphasis}`]: emphasis && emphasis !== 'bold', [`nj-btn--is-loading`]: isLoading, [`nj-btn--disabled`]: visuallyDisabled }); if (isDefaultComponent(asChild)) { let customIcon; let customLabel; React__default.Children.forEach(children, (child) => { if (!child) { return; } if (React__default.isValidElement(child)) { if (child.props['data-child-name'] === 'customIcon') { customIcon = child; } if (child.props['data-child-name'] === 'customLabel') { customLabel = child; } } }); const { label, iconClassName, className, ...htmlProps } = defaultProps; const hasLabel = label || customLabel; const iconClass = Utils.classNames('nj-btn__icon', iconClassName); const currentLabel = customLabel ? customLabel : label; btnClasses = Utils.classNames(btnClasses, className); return (jsxs("button", { type: "button", ref: ref, ...htmlProps, className: btnClasses, disabled: htmlProps.disabled || isLoading, children: [isLoading ? (jsx(NJSpinner, {})) : hasLabel && customIcon ? (getCustomIconWithClassName(customIcon)) : (icon && jsx(NJIcon, { name: icon, className: iconClass })), currentLabel] })); } const child = React__default.Children.only(children); if (!React__default.isValidElement(child)) { throw new Error('NJButton: When using asChild, a valid React element must be provided as a child.'); } const clonedChild = React__default.cloneElement(child, { className: Utils.classNames(btnClasses, child.props.className), ref: ref }); return jsx(Slot, { children: clonedChild }); }); NJButton.displayName = 'NJButton'; export { NJButton };