@engie-group/fluid-design-system-react
Version:
Fluid Design System React
61 lines (58 loc) • 2.93 kB
JavaScript
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 };