@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
148 lines (144 loc) • 6.38 kB
JavaScript
"use client";
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
const require_ref = require('../../utils/ref.cjs');
const require_utils_index = require('../../utils/index.cjs');
const require_factory = require('../../core/system/factory.cjs');
const require_merge_css = require('../../core/css/merge-css.cjs');
const require_utils = require('../../core/components/utils.cjs');
const require_create_component = require('../../core/components/create-component.cjs');
const require_use_loading_component = require('../loading/use-loading-component.cjs');
const require_button_style = require('./button.style.cjs');
const require_ripple = require('../ripple/ripple.cjs');
const require_use_ripple = require('../ripple/use-ripple.cjs');
let react = require("react");
react = require_rolldown_runtime.__toESM(react);
let react_jsx_runtime = require("react/jsx-runtime");
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
//#region src/components/button/button.tsx
const useButtonType = (value) => {
const buttonRef = (0, react.useRef)(!value);
return {
ref: (0, react.useCallback)((node) => {
if (node) buttonRef.current = node.tagName === "BUTTON";
}, []),
type: buttonRef.current ? "button" : void 0
};
};
const { component, ComponentContext, PropsContext: ButtonPropsContext, useComponentContext, usePropsContext: useButtonPropsContext, withContext } = require_create_component.createComponent("button", require_button_style.buttonStyle);
/**
* `Button` is an interactive component that allows users to perform actions such as submitting forms and toggling modals.
*
* @see https://yamada-ui.com/docs/components/button
*/
const Button = withContext(({ ref, as, active, children, disabled, disableRipple, endIcon = null, loading, loadingIcon = "oval", loadingMessage, loadingPlacement = "start", startIcon = null, iconProps, loadingProps,...rest }) => {
const trulyDisabled = disabled || loading;
const { ref: buttonRef, type } = useButtonType(as);
const { onClick,...rippleProps } = require_use_ripple.useRipple({
...rest,
disabled: disableRipple || trulyDisabled
});
const startLoading = loading && loadingPlacement === "start";
const endLoading = loading && loadingPlacement === "end";
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ComponentContext, {
value: (0, react.useMemo)(() => ({
endIcon,
loadingIcon,
loadingMessage,
startIcon,
iconProps
}), [
loadingIcon,
loadingMessage,
startIcon,
endIcon,
iconProps
]),
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_factory.styled.button, {
ref: require_ref.mergeRefs(ref, buttonRef),
as,
type,
"data-active": (0, require_utils_index.utils_exports.dataAttr)(active),
"data-loading": (0, require_utils_index.utils_exports.dataAttr)(loading),
disabled: trulyDisabled,
...rest,
onClick,
children: [
startLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ButtonStartLoading, { ...loadingProps }) : null,
loading ? loadingMessage || /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_factory.styled.span, {
opacity: 0,
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ButtonContent, { children })
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ButtonContent, { children }),
endLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ButtonEndLoading, { ...loadingProps }) : null,
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ripple.Ripple, { ...rippleProps })
]
})
});
})();
const ButtonContent = component(({ children }) => {
const { endIcon, startIcon, iconProps } = useComponentContext();
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
startIcon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ButtonStartIcon, {
...iconProps,
children: startIcon
}) : null,
children,
endIcon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ButtonEndIcon, {
...iconProps,
children: endIcon
}) : null
] });
}, {
name: "ButtonContent",
className: require_utils.getClassName((0, require_utils_index.utils_exports.bem)("button", "content"))
})();
const ButtonLoading = component((props) => {
const { loadingIcon, loadingMessage } = useComponentContext();
const css = (0, react.useMemo)(() => ({ position: loadingMessage ? "relative" : "absolute" }), [loadingMessage]);
if (require_use_loading_component.isLoadingScheme(loadingIcon)) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_loading_component.getLoadingComponent(loadingIcon), {
color: "currentColor",
...props,
css: require_merge_css.mergeCSS(css, props.css)
});
if ((0, react.isValidElement)(loadingIcon)) return (0, react.cloneElement)(loadingIcon, {
...props,
...loadingIcon.props,
css: require_merge_css.mergeCSS(css, props.css, loadingIcon.props.css)
});
return null;
}, {
name: "ButtonLoading",
className: require_utils.getClassName((0, require_utils_index.utils_exports.bem)("button", "loading"))
})();
const ButtonStartLoading = component(ButtonLoading, {
name: "ButtonStartLoading",
className: require_utils.getClassName((0, require_utils_index.utils_exports.bem)("button", "loading", "start"))
})();
const ButtonEndLoading = component(ButtonLoading, {
name: "ButtonEndLoading",
className: require_utils.getClassName((0, require_utils_index.utils_exports.bem)("button", "loading", "end"))
})();
const ButtonIcon = component(({ children,...rest }) => {
if ((0, react.isValidElement)(children)) return (0, react.cloneElement)(children, {
"aria-hidden": true,
role: "img",
...rest,
...children.props
});
return react.Children.count(children) > 1 ? react.Children.only(null) : null;
}, {
name: "ButtonIcon",
className: require_utils.getClassName((0, require_utils_index.utils_exports.bem)("button", "icon"))
})();
const ButtonStartIcon = component(ButtonIcon, {
name: "ButtonStartIcon",
className: require_utils.getClassName((0, require_utils_index.utils_exports.bem)("button", "icon", "start"))
})();
const ButtonEndIcon = component(ButtonIcon, {
name: "ButtonEndIcon",
className: require_utils.getClassName((0, require_utils_index.utils_exports.bem)("button", "icon", "end"))
})();
//#endregion
exports.Button = Button;
exports.ButtonPropsContext = ButtonPropsContext;
exports.useButtonPropsContext = useButtonPropsContext;
//# sourceMappingURL=button.cjs.map