@chakra-ui/react
Version:
Responsive and accessible React UI components built with React and Emotion
204 lines (200 loc) • 6.3 kB
JavaScript
var isValidProp = require('@pandacss/is-valid-prop');
var compact = require('../utils/compact.cjs');
var flatten = require('../utils/flatten.cjs');
var is = require('../utils/is.cjs');
var memo = require('../utils/memo.cjs');
var merge = require('../utils/merge.cjs');
var splitProps = require('../utils/split-props.cjs');
var breakpoints = require('./breakpoints.cjs');
var conditions = require('./conditions.cjs');
var config = require('./config.cjs');
var css = require('./css.cjs');
var cva = require('./cva.cjs');
var layers = require('./layers.cjs');
var normalize = require('./normalize.cjs');
var preflight = require('./preflight.cjs');
var serialize = require('./serialize.cjs');
var sva = require('./sva.cjs');
var tokenDictionary = require('./token-dictionary.cjs');
var utility = require('./utility.cjs');
function createSystem(...configs) {
const config$1 = config.mergeConfigs(...configs);
const {
theme = {},
utilities = {},
globalCss = {},
cssVarsRoot = ":where(:root, :host)",
cssVarsPrefix = "chakra",
preflight: preflight$1
} = config$1;
const layers$1 = layers.createLayers(config$1);
const tokens = tokenDictionary.createTokenDictionary({
breakpoints: theme.breakpoints,
tokens: theme.tokens,
semanticTokens: theme.semanticTokens,
prefix: cssVarsPrefix
});
const breakpoints$1 = breakpoints.createBreakpoints(theme.breakpoints ?? {});
const conditions$1 = conditions.createConditions({
conditions: config$1.conditions ?? {},
breakpoints: breakpoints$1
});
const utility$1 = utility.createUtility({
config: utilities,
tokens
});
function assignComposition() {
const { textStyles, layerStyles, animationStyles } = theme;
const compositions = compact.compact({
textStyle: textStyles,
layerStyle: layerStyles,
animationStyle: animationStyles
});
for (const [key, values] of Object.entries(compositions)) {
const flatValues = flatten.flatten(
values ?? {},
(v) => is.isObject(v) && "value" in v
);
utility$1.register(key, {
values: Object.keys(flatValues),
transform(value) {
return css$1(flatValues[value]);
}
});
}
}
assignComposition();
utility$1.addPropertyType("animationName", Object.keys(theme.keyframes ?? {}));
const properties = /* @__PURE__ */ new Set(["css", ...utility$1.keys(), ...conditions$1.keys()]);
const isValidProperty = memo.memo(
(prop) => properties.has(prop) || isValidProp.isCssProperty(prop)
);
const normalizeValue = (value) => {
if (Array.isArray(value)) {
return value.reduce((acc, current, index) => {
const key = conditions$1.breakpoints[index];
if (current != null) acc[key] = current;
return acc;
}, {});
}
return value;
};
const normalizeFn = normalize.createNormalizeFn({
utility: utility$1,
normalize: normalizeValue
});
const serialize$1 = serialize.createSerializeFn({
conditions: conditions$1,
isValidProperty
});
const css$1 = css.createCssFn({
transform: utility$1.transform,
conditions: conditions$1,
normalize: normalizeFn
});
const cva$1 = cva.createRecipeFn({
css: css$1,
conditions: conditions$1,
normalize: normalizeFn,
layers: layers$1
});
const sva$1 = sva.createSlotRecipeFn({ cva: cva$1 });
function getTokenCss() {
const result = {};
for (const [key, values] of tokens.cssVarMap.entries()) {
const varsObj = Object.fromEntries(values);
if (Object.keys(varsObj).length === 0) continue;
const selector = key === "base" ? cssVarsRoot : conditions$1.resolve(key);
const isAtRule = selector.startsWith("@");
const cssObject = css$1(
serialize$1({
[selector]: isAtRule ? { [cssVarsRoot]: varsObj } : varsObj
})
);
merge.mergeWith(result, cssObject);
}
return layers$1.wrap("tokens", result);
}
function getGlobalCss() {
const keyframes = Object.fromEntries(
Object.entries(theme.keyframes ?? {}).map(([key, value]) => [
`@keyframes ${key}`,
value
])
);
const result = Object.assign({}, keyframes, css$1(serialize$1(globalCss)));
return layers$1.wrap("base", result);
}
function splitCssProps(props) {
return splitProps.splitProps(props, isValidProperty);
}
function getPreflightCss() {
const result = preflight.createPreflight({ preflight: preflight$1 });
return layers$1.wrap("reset", result);
}
const tokenMap = getTokenMap(tokens);
const tokenFn = (path, fallback) => {
return tokenMap.get(path)?.value || fallback;
};
tokenFn.var = (path, fallback) => {
return tokenMap.get(path)?.variable || fallback;
};
function getRecipe(key, fallback) {
return theme.recipes?.[key] ?? fallback;
}
function getSlotRecipe(key, fallback) {
return theme.slotRecipes?.[key] ?? fallback;
}
function isRecipe(key) {
return Object.hasOwnProperty.call(theme.recipes ?? {}, key);
}
function isSlotRecipe(key) {
return Object.hasOwnProperty.call(theme.slotRecipes ?? {}, key);
}
function hasRecipe(key) {
return isRecipe(key) || isSlotRecipe(key);
}
const _global = [getPreflightCss(), getGlobalCss(), getTokenCss()];
return {
$$chakra: true,
_config: config$1,
_global,
breakpoints: breakpoints$1,
tokens,
conditions: conditions$1,
utility: utility$1,
token: tokenFn,
properties,
layers: layers$1,
isValidProperty,
splitCssProps,
normalizeValue,
getTokenCss,
getGlobalCss,
getPreflightCss,
css: css$1,
cva: cva$1,
sva: sva$1,
getRecipe,
getSlotRecipe,
hasRecipe,
isRecipe,
isSlotRecipe
};
}
function getTokenMap(tokens) {
const map = /* @__PURE__ */ new Map();
tokens.allTokens.forEach((token) => {
const { cssVar, virtual, conditions } = token.extensions;
const value = !!conditions || virtual ? cssVar.ref : token.value;
map.set(token.name, { value, variable: cssVar.ref });
});
return map;
}
const isValidSystem = (mod) => {
return is.isObject(mod) && !!Reflect.get(mod, "$$chakra");
};
exports.createSystem = createSystem;
exports.isValidSystem = isValidSystem;
;
;