variance-authority
Version:
Variance Authority
100 lines (99 loc) • 5.06 kB
JavaScript
;
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(" ");
};