UNPKG

variance-authority

Version:
100 lines (99 loc) 5.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.va = void 0; const va = (config) => (props, extra) => { const { base } = config; if (typeof base === "string") { return mergeVariantsToString(config, props, extra); } else if (Array.isArray(base)) { return mergeVariantsToArray(config, props, extra); } else if (typeof base === "object" && base !== null) { return mergeVariantsToObject(config, props, extra); } return base; }; exports.va = va; const falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value; const getPropsWithoutUndefined = (props) => Object.entries(props || {}).reduce((acc, [key, value]) => { if (value === undefined) return acc; acc[key] = value; return acc; }, {}); const mergeVariantsToArray = (config, props, extra) => { if (!config.variants) return [config.base, extra].flat().filter(Boolean); const { variants, defaultVariants } = config; const vars = Object.keys(variants).map((variant) => { var _a; const variantProp = props === null || props === void 0 ? void 0 : props[variant]; const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant]; if (variantProp === null) return null; const variantKey = (falsyToString(variantProp) || falsyToString(defaultVariantProp)); return (_a = variants[variant]) === null || _a === void 0 ? void 0 : _a[variantKey]; }); const compoundVars = ((config === null || config === void 0 ? void 0 : config.compoundVariants) || []).reduce((acc, val) => { const propsWithDefaults = Object.assign(Object.assign({}, defaultVariants), getPropsWithoutUndefined(props)); return Object.entries(val[0]).every(([key, value]) => Array.isArray(value) ? value.includes(propsWithDefaults[key]) : propsWithDefaults[key] === value) ? [...acc, val[1]] : acc; }, []); return [config.base, ...vars, ...compoundVars, extra] .flat() .filter(Boolean); }; const mergeVariantsToObject = (config, props, extra) => { if (!config.variants) return getPropsWithoutUndefined(Object.assign(Object.assign({}, config.base), (extra || {}))); const { variants, defaultVariants } = config; const vars = Object.keys(variants).reduce((acc, variant) => { var _a; const variantProp = props === null || props === void 0 ? void 0 : props[variant]; const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant]; if (variantProp === null) return acc; const variantKey = (falsyToString(variantProp) || falsyToString(defaultVariantProp)); return Object.assign(Object.assign({}, acc), (((_a = variants[variant]) === null || _a === void 0 ? void 0 : _a[variantKey]) || {})); }, {}); const compoundVars = ((config === null || config === void 0 ? void 0 : config.compoundVariants) || []).reduce((acc, val) => { const propsWithDefaults = Object.assign(Object.assign({}, defaultVariants), getPropsWithoutUndefined(props)); return Object.entries(val[0]).every(([key, value]) => Array.isArray(value) ? value.includes(propsWithDefaults[key]) : propsWithDefaults[key] === value) ? Object.assign(Object.assign({}, acc), val[1]) : acc; }, {}); return Object.assign(Object.assign(Object.assign(Object.assign({}, config.base), vars), compoundVars), (extra || {})); }; const mergeVariantsToString = (config, props, extra) => { if (!config.variants) return [config.base, extra].filter(Boolean).join(" "); const { variants, defaultVariants } = config; const vars = Object.keys(variants).reduce((acc, variant) => { var _a; const variantProp = props === null || props === void 0 ? void 0 : props[variant]; const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant]; if (variantProp === null) return acc; const variantKey = (falsyToString(variantProp) || falsyToString(defaultVariantProp)); return `${acc} ${(_a = variants[variant]) === null || _a === void 0 ? void 0 : _a[variantKey]}`.trim(); }, ""); const compoundVars = ((config === null || config === void 0 ? void 0 : config.compoundVariants) || []).reduce((acc, val) => { const propsWithDefaults = Object.assign(Object.assign({}, defaultVariants), getPropsWithoutUndefined(props)); return Object.entries(val[0]).every(([key, value]) => Array.isArray(value) ? value.includes(propsWithDefaults[key]) : propsWithDefaults[key] === value) ? `${acc} ${val[1]}`.trim() : acc; }, ""); return [config.base, vars, compoundVars, extra] .filter(Boolean) .join(" "); };