71 lines
2.5 KiB
JavaScript
71 lines
2.5 KiB
JavaScript
import { hyphenateProperty } from './utils/hyphenateProperty.esm.js';
|
|
import { normalizeNestedProperty } from './utils/normalizeNestedProperty.esm.js';
|
|
import { compileCSSRules } from './compileCSSRules.esm.js';
|
|
|
|
const PSEUDO_SELECTOR_REGEX = /,( *[^ &])/g;
|
|
/**
|
|
* Normalizes pseudo selectors to always contain &, requires to work properly with comma-separated selectors.
|
|
*
|
|
* @example
|
|
* ":hover" => "&:hover"
|
|
* " :hover" => "& :hover"
|
|
* ":hover,:focus" => "&:hover,&:focus"
|
|
* " :hover, :focus" => "& :hover,& :focus"
|
|
*/
|
|
function normalizePseudoSelector(pseudoSelector) {
|
|
return '&' + normalizeNestedProperty(
|
|
// Regex there replaces a comma, spaces and an ampersand if it's present with comma and an ampersand.
|
|
// This allows to normalize input, see examples in JSDoc.
|
|
pseudoSelector.replace(PSEUDO_SELECTOR_REGEX, ',&$1'));
|
|
}
|
|
function createCSSRule(classNameSelector, cssDeclaration, pseudos) {
|
|
let cssRule = cssDeclaration;
|
|
if (pseudos.length > 0) {
|
|
cssRule = pseudos.reduceRight((acc, selector) => {
|
|
return `${normalizePseudoSelector(selector)} { ${acc} }`;
|
|
}, cssDeclaration);
|
|
}
|
|
return `${classNameSelector}{${cssRule}}`;
|
|
}
|
|
function compileAtomicCSSRule(options, atRules) {
|
|
const {
|
|
className,
|
|
selectors,
|
|
property,
|
|
rtlClassName,
|
|
rtlProperty,
|
|
rtlValue,
|
|
value
|
|
} = options;
|
|
const {
|
|
container,
|
|
layer,
|
|
media,
|
|
supports
|
|
} = atRules;
|
|
const classNameSelector = `.${className}`;
|
|
const cssDeclaration = Array.isArray(value) ? `${value.map(v => `${hyphenateProperty(property)}: ${v}`).join(';')};` : `${hyphenateProperty(property)}: ${value};`;
|
|
let cssRule = createCSSRule(classNameSelector, cssDeclaration, selectors);
|
|
if (rtlProperty && rtlClassName) {
|
|
const rtlClassNameSelector = `.${rtlClassName}`;
|
|
const rtlCSSDeclaration = Array.isArray(rtlValue) ? `${rtlValue.map(v => `${hyphenateProperty(rtlProperty)}: ${v}`).join(';')};` : `${hyphenateProperty(rtlProperty)}: ${rtlValue};`;
|
|
cssRule += createCSSRule(rtlClassNameSelector, rtlCSSDeclaration, selectors);
|
|
}
|
|
if (media) {
|
|
cssRule = `@media ${media} { ${cssRule} }`;
|
|
}
|
|
if (layer) {
|
|
cssRule = `@layer ${layer} { ${cssRule} }`;
|
|
}
|
|
if (supports) {
|
|
cssRule = `@supports ${supports} { ${cssRule} }`;
|
|
}
|
|
if (container) {
|
|
cssRule = `@container ${container} { ${cssRule} }`;
|
|
}
|
|
return compileCSSRules(cssRule, true);
|
|
}
|
|
|
|
export { compileAtomicCSSRule, normalizePseudoSelector };
|
|
//# sourceMappingURL=compileAtomicCSSRule.esm.js.map
|