UNPKG

@yamada-ui/react

Version:

React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion

212 lines (208 loc) • 7.52 kB
"use client"; const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs'); const require_effect = require('../../utils/effect.cjs'); const require_utils_index = require('../../utils/index.cjs'); const require_var = require('../../core/system/var.cjs'); const require_create_component = require('../../core/components/create-component.cjs'); const require_factory = require('../motion/factory.cjs'); const require_transition = require('../motion/transition.cjs'); const require_hooks_use_timeout_index = require('../../hooks/use-timeout/index.cjs'); const require_alert = require('../alert/alert.cjs'); const require_close_button = require('../close-button/close-button.cjs'); const require_snacks_style = require('./snacks.style.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); let motion_react = require("motion/react"); motion_react = require_rolldown_runtime.__toESM(motion_react); //#region src/components/snacks/snacks.tsx const { ComponentContext, PropsContext: SnacksPropsContext, useComponentContext, usePropsContext: useSnacksPropsContext, withContext, withProvider } = require_create_component.createSlotComponent("snacks", require_snacks_style.snacksStyle); const Snacks = withProvider(({ snacks: { direction = "start", items, startIndex = 0 }, listProps,...rest }) => { const count = items.length; const elMapRef = (0, react.useRef)(/* @__PURE__ */ new Map()); const [height, setHeight] = (0, react.useState)(0); const [exist, setExist] = (0, react.useState)(!!count); const show = !!count || exist; const context = (0, react.useMemo)(() => ({ direction, elMapRef, setExist, startIndex }), [direction, startIndex]); const onExitComplete = (0, react.useCallback)(() => { if (!count) setExist(false); }, [count]); (0, react.useEffect)(() => { let height$1 = 0; if (!count) return; const els = [...elMapRef.current.values()].slice(0, count); for (const el of els) { if (!el) continue; let { offsetHeight, offsetTop } = el; offsetHeight += offsetTop; if (offsetHeight > height$1) height$1 = offsetHeight; } setHeight(height$1); }, [count, direction]); require_effect.useUpdateEffect(() => { if (!!count) setExist(true); }, [count]); return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ComponentContext, { value: context, children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(motion_react.AnimatePresence, { initial: false, children: show ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_factory.motion.div, { ...rest, children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SnackList, { custom: { height }, ...listProps, children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(motion_react.AnimatePresence, { onExitComplete, children: items.map((props, index) => { return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Snack, { index, lastIndex: count - index - 1, ...props }, props.id); }) }) }) }) : null }) }); }, "root")({ animate: "animate", exit: "exit", initial: "initial", variants: { animate: { padding: "var(--top) 0 var(--bottom)", transition: { duration: .4 } }, exit: { padding: 0 }, initial: { padding: 0 } } }, ({ gap, gutter = [0, "lg"], negativeMargins = true,...rest }) => ({ "data-negative": (0, require_utils_index.utils_exports.dataAttr)(negativeMargins), "--bottom": require_var.varAttr(gutter[1], "spaces", "0px"), "--gap": require_var.varAttr(gap, "spaces"), "--top": require_var.varAttr(gutter[0], "spaces", "0px"), ...rest })); const SnackList = withContext(require_factory.motion.div, "list")({ animate: "animate", exit: "exit", initial: "initial", role: "list", variants: { animate: ({ height }) => ({ height, opacity: 1, transition: { duration: .4 } }), exit: { height: 0, opacity: 0 }, initial: { height: 0, opacity: 1 } } }); const Snack = withContext(({ variant = "plain", closable = true, description, duration: durationProp = null, loadingScheme, status, title, withIcon = true, closeButtonProps, contentProps, descriptionProps, iconProps, loadingProps, titleProps, onClose: onCloseProp, onCloseComplete,...rest }) => { const [duration, setDuration] = (0, react.useState)(durationProp); const present = (0, motion_react.useIsPresent)(); const onClose = present ? onCloseProp : require_utils_index.utils_exports.noop; const onMouseEnter = (0, react.useCallback)(() => { setDuration(null); }, []); const onMouseLeave = (0, react.useCallback)(() => { setDuration(durationProp); }, [durationProp]); require_effect.useUpdateEffect(() => { if (!present) onCloseComplete?.(); }, [present]); require_effect.useUpdateEffect(() => { setDuration(durationProp); }, [durationProp]); require_hooks_use_timeout_index.useTimeout(onClose, duration); return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_alert.AlertRoot, { as: require_factory.motion.div, variant, status, ...rest, onMouseEnter: (0, require_utils_index.utils_exports.handlerAll)(rest.onMouseEnter, onMouseEnter), onMouseLeave: (0, require_utils_index.utils_exports.handlerAll)(rest.onMouseLeave, onMouseLeave), children: [ withIcon ? loadingScheme ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_alert.AlertLoading, { loadingScheme, ...loadingProps }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_alert.AlertIcon, { ...iconProps }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(SnackContent, { "data-close-button": (0, require_utils_index.utils_exports.dataAttr)(closable), ...contentProps, children: [title ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_alert.AlertTitle, { me: "0", ...titleProps, children: title }) : null, description ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_alert.AlertDescription, { ...descriptionProps, children: description }) : null] }), closable ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SnackCloseButton, { "data-variant": variant, ...closeButtonProps, onClick: (0, require_utils_index.utils_exports.handlerAll)(closeButtonProps?.onClick, onClose) }) : null ] }); }, "item")({ animate: "animate", exit: "exit", initial: "initial", layout: true, role: "listitem", variants: { animate: ({ index }) => ({ opacity: 1, transition: require_transition.createTransition.enter()(!index ? .2 : 0, .4), y: 0 }), exit: { opacity: 0, transition: require_transition.createTransition.exit()(void 0, .2) }, initial: ({ direction, index }) => ({ opacity: 0, ...index ? { y: (direction === "start" ? -1 : 1) * 16 } : {} }) } }, ({ index, lastIndex,...rest }) => { const ref = (0, react.useRef)(null); const { direction, elMapRef, startIndex } = useComponentContext(); (0, react.useEffect)(() => { const elMap = elMapRef.current; elMap.set(index, ref.current); return () => { elMap.delete(index); }; }, [elMapRef, index]); return { ref, "--index": direction === "start" ? lastIndex : index, "--z-index": startIndex + index, custom: { direction, index }, ...rest }; }); const SnackContent = withContext("div", "content")(); const SnackCloseButton = withContext(require_close_button.CloseButton, "closeButton")(); //#endregion exports.Snacks = Snacks; //# sourceMappingURL=snacks.cjs.map