UNPKG

@yamada-ui/react

Version:

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

231 lines (227 loc) • 10.7 kB
"use client"; const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs'); const require_utils_index = require('../../utils/index.cjs'); const require_system_provider = require('../system/system-provider.cjs'); const require_styled = require('../system/styled.cjs'); const require_conditions = require('../css/conditions.cjs'); const require_merge_css = require('../css/merge-css.cjs'); const require_props = require('./props.cjs'); let react = require("react"); react = require_rolldown_runtime.__toESM(react); //#region src/core/components/use-component-style.ts function getSelectorStyle(selectors, style) { return selectors.reduceRight((prev, key) => key ? { [key]: prev } : prev, style); } function getStyle(style) { return function({ hasSlot = false, selectors = [] }) { if (!style || (0, require_utils_index.utils_exports.isEmptyObject)(style)) return; if (hasSlot) return Object.fromEntries(Object.entries(style).map(([name, style$1]) => { if (selectors.length) return [name, getSelectorStyle(selectors, style$1 ?? {})]; else return [name, style$1]; })); else if (selectors.length) return getSelectorStyle(selectors, style); else return style; }; } function getColorModeStyle(value, mergedStyle) { return function({ selectors = [],...rest }) { const [lightValue, darkValue] = value; return (0, require_utils_index.utils_exports.merge)(getModifierStyle(lightValue, mergedStyle)({ ...rest, selectors }), getModifierStyle(darkValue, mergedStyle)({ ...rest, selectors: [...selectors, require_conditions.conditions._dark] })); }; } function getConditionStyle(value, mergedStyle) { return function(options) { const { isResponsiveKey, queries = [], selectors = [] } = options; const conditionalKeys = Object.keys(value).filter((key) => !isResponsiveKey?.(key)); return (0, require_utils_index.utils_exports.merge)(queries.reduce((prev, { breakpoint, query }) => { if (!(0, require_utils_index.utils_exports.isUndefined)(value[breakpoint])) prev = (0, require_utils_index.utils_exports.merge)(prev, getModifierStyle(value[breakpoint], mergedStyle)({ ...options, selectors: [...selectors, query] })); return prev; }, {}), conditionalKeys.reduce((prev, key) => { prev = (0, require_utils_index.utils_exports.merge)(prev, getModifierStyle(value[key], mergedStyle)({ ...options, selectors: [...selectors, require_conditions.getCondition(key)] })); return prev; }, {})); }; } function getModifierStyle(value, mergedStyle) { return function(options) { let style = void 0; if (!value) return style; if ((0, require_utils_index.utils_exports.isArray)(value)) style = getColorModeStyle(value, mergedStyle)(options); else if ((0, require_utils_index.utils_exports.isObject)(value)) style = getConditionStyle(value, mergedStyle)(options); else style = getStyle(mergedStyle[value])(options); return style; }; } function getPropStyle(props, propVariants, style = {}) { const variants = Object.entries(propVariants); return function(options) { if (!variants.length) return style; variants.forEach(([name, variants$1]) => { const prop = props[name]; if (prop) { const propStyle = getModifierStyle(prop, variants$1)(options); if (propStyle) style = (0, require_utils_index.utils_exports.merge)(style, wrapStyle("props", propStyle)(options)); } else if (Object.keys(variants$1).every((key) => (0, require_utils_index.utils_exports.isBooleanish)(key))) { const propStyle = getModifierStyle("false", variants$1)(options); if (propStyle) style = (0, require_utils_index.utils_exports.merge)(style, wrapStyle("props", propStyle)(options)); } }); return style; }; } function getCompoundStyle(props, compounds, style = {}) { return function(options) { if (!compounds.length) return style; compounds.forEach(({ css, layer,...rest }) => { const conditions$1 = Object.entries(rest); if (!conditions$1.length) return; if (!conditions$1.every(([key, value]) => (0, require_utils_index.utils_exports.isArray)(value) ? value.includes(props[key]) : (0, require_utils_index.utils_exports.isRegExp)(value) ? value.test(props[key]) : props[key] === value)) return; style = (0, require_utils_index.utils_exports.merge)(style, wrapStyle(layer ?? "compounds", css)(options)); }); return style; }; } function getSlotClassName(className, slot) { if (!className || !slot) return className; if ((0, require_utils_index.utils_exports.isArray)(slot)) { const [element, modifier] = slot.map((value) => (0, require_utils_index.utils_exports.toKebabCase)(value)); return (0, require_utils_index.utils_exports.cx)((0, require_utils_index.utils_exports.bem)(className, element), (0, require_utils_index.utils_exports.bem)(className, element, modifier)); } else if ((0, require_utils_index.utils_exports.isObject)(slot)) { const [element, modifier] = (0, require_utils_index.utils_exports.toArray)(slot.slot).map((value) => (0, require_utils_index.utils_exports.toKebabCase)(value)); return (0, require_utils_index.utils_exports.cx)((0, require_utils_index.utils_exports.bem)(className, element), (0, require_utils_index.utils_exports.bem)(className, element, modifier)); } else return (0, require_utils_index.utils_exports.bem)(className, (0, require_utils_index.utils_exports.toKebabCase)(slot)); } function mergeSlotCSS(slot, style, css) { if (!style || !slot) return css; const temp = []; if ((0, require_utils_index.utils_exports.isArray)(slot)) temp.push(...slot.map((slot$1) => style[slot$1])); else if ((0, require_utils_index.utils_exports.isObject)(slot)) if ((0, require_utils_index.utils_exports.isArray)(slot.slot)) temp.push(...slot.slot.map((slot$1) => style[slot$1])); else temp.push(style[slot.slot]); else temp.push(style[slot]); if (css) temp.push(...(0, require_utils_index.utils_exports.toArray)(css)); const result = (0, require_utils_index.utils_exports.filterEmpty)(temp); return !!result.length ? result : void 0; } function omitThemeProps(props, omitKeys = [], transferProps) { if (transferProps) omitKeys = omitKeys.filter((key) => !transferProps.includes(key)); return (0, require_utils_index.utils_exports.omitObject)(props, omitKeys); } function wrapStyle(layer, style) { return function({ hasSlot, wrap }) { if (hasSlot) { if (!style) return void 0; return Object.fromEntries(Object.entries(style).map(([slot, style$1]) => [slot, wrap?.(layer, style$1) ?? style$1])); } else return wrap?.(layer, style) ?? style; }; } function getHasAtRuleStyle(css) { return (getAtRule) => { let hasVariant = false; let hasSize = false; if (!css || !getAtRule) return { hasSize, hasVariant }; const variantAtRule = getAtRule("variant"); const sizeAtRule = getAtRule("size"); css = (0, require_utils_index.utils_exports.toArray)(css); css.forEach((css$1) => { const keys = Object.keys(css$1); if (keys.includes(variantAtRule)) hasVariant = true; if (keys.includes(sizeAtRule)) hasSize = true; }); return { hasSize, hasVariant }; }; } function mergeDefaultProps(defaultProps, props) { return Object.entries(defaultProps ?? {}).reduce((prev, [key, value]) => { prev[key] ??= value; return prev; }, props); } function useStyle(props, { className: defaultClassName, style: componentStyle, hasSlot, slot, transferProps } = {}) { const system = require_system_provider.useSystem(); const { getAtRule, wrap } = system.layers; const rootColorScheme = require_styled.useColorSchemeContext(); const options = { ...system.breakpoints, hasSlot, wrap }; const propsRef = (0, react.useRef)({}); const mergedPropsRef = (0, react.useRef)({}); const styleRef = (0, react.useRef)(void 0); if (componentStyle && !!Object.keys(componentStyle).length) { const { className: customClassName, base, compounds, props: propVariants, sizes, variants, defaultProps: { colorScheme: defaultColorScheme,...defaultProps } = {} } = componentStyle; const colorScheme = props.colorScheme ?? rootColorScheme ?? defaultColorScheme; const className = (0, require_utils_index.utils_exports.cx)(defaultClassName ?? customClassName, props.className); const mergedProps = { ...mergeDefaultProps(defaultProps, props), className, colorScheme }; const omitProps = Object.keys(propVariants ?? {}); const { size, variant } = mergedProps; if (variants) omitProps.push("variant"); if (sizes) omitProps.push("size"); const computedProps = omitThemeProps(mergedProps, omitProps, transferProps); if (!require_props.isEqualProps(mergedPropsRef.current, mergedProps, ["css", "children"])) { const { hasSize, hasVariant } = getHasAtRuleStyle(props.css)(getAtRule); let style = {}; if (base) { const baseStyle = getStyle(base)(options); style = (0, require_utils_index.utils_exports.merge)(style, wrapStyle("base", baseStyle)(options)); } if (sizes && !hasSize) { const sizeStyle = (0, require_utils_index.utils_exports.merge)(sizes.base, getModifierStyle(size, sizes)(options)); style = (0, require_utils_index.utils_exports.merge)(style, wrapStyle("size", sizeStyle)(options)); } if (variants && !hasVariant) { const variantStyle = (0, require_utils_index.utils_exports.merge)(variants.base, getModifierStyle(variant, variants)(options)); style = (0, require_utils_index.utils_exports.merge)(style, wrapStyle("variant", variantStyle)(options)); } if (propVariants) style = getPropStyle(mergedProps, propVariants, style)(options); if (compounds) style = getCompoundStyle(mergedProps, compounds, style)(options); styleRef.current = style; if (hasSlot) computedProps.css = mergeSlotCSS(slot, style, computedProps.css); else computedProps.css = require_merge_css.mergeCSS(style, computedProps.css); } else computedProps.css = propsRef.current.css; mergedPropsRef.current = mergedProps; if (!require_props.isEqualProps(propsRef.current, computedProps)) propsRef.current = computedProps; } else { const className = (0, require_utils_index.utils_exports.cx)(defaultClassName, props.className); if (className) props.className = className; if (!require_props.isEqualProps(propsRef.current, props)) propsRef.current = props; } return [styleRef.current ?? {}, propsRef.current]; } function useComponentStyle(props, options = {}) { return useStyle(props, options); } function useComponentSlotStyle(props, options = {}) { return useStyle(props, { ...options, hasSlot: true }); } //#endregion exports.getSlotClassName = getSlotClassName; exports.mergeSlotCSS = mergeSlotCSS; exports.useComponentSlotStyle = useComponentSlotStyle; exports.useComponentStyle = useComponentStyle; //# sourceMappingURL=use-component-style.cjs.map