From 04cd530cc30e581ff372e7e1d2b25c5045240bd6 Mon Sep 17 00:00:00 2001 From: Alexander Akait <4567934+alexander-akait@users.noreply.github.com> Date: Tue, 2 Dec 2025 23:07:01 +0300 Subject: [PATCH] feat: handle more at-rules for CSS modules (#20198) --- .changeset/fifty-poets-play.md | 5 + lib/css/CssParser.js | 640 ++++++++++-- lib/css/walkCssTokens.js | 8 +- .../CssIcssFromIdentifierDependency.js | 9 +- .../ConfigCacheTestCases.longtest.js.snap | 945 +++++++++++++++++- .../ConfigTestCases.basictest.js.snap | 945 +++++++++++++++++- .../configCases/css/css-modules/img/shape.png | Bin 0 -> 78117 bytes test/configCases/css/css-modules/shared.css | 7 + .../css/css-modules/style.module.css | 272 +++++ test/configCases/css/css-modules/use-style.js | 1 + ...modules-local-by-default.local.modules.css | 2 +- ...-modules-local-by-default.pure.modules.css | 2 + 12 files changed, 2635 insertions(+), 201 deletions(-) create mode 100644 .changeset/fifty-poets-play.md create mode 100644 test/configCases/css/css-modules/img/shape.png create mode 100644 test/configCases/css/css-modules/shared.css diff --git a/.changeset/fifty-poets-play.md b/.changeset/fifty-poets-play.md new file mode 100644 index 000000000..5c6d05098 --- /dev/null +++ b/.changeset/fifty-poets-play.md @@ -0,0 +1,5 @@ +--- +"webpack": minor +--- + +Handle more at-rules for CSS modules diff --git a/lib/css/CssParser.js b/lib/css/CssParser.js index 5fd0aec78..b24c887b2 100644 --- a/lib/css/CssParser.js +++ b/lib/css/CssParser.js @@ -63,6 +63,9 @@ const IMAGE_SET_FUNCTION = /^(-\w+-)?image-set$/i; const OPTIONALLY_VENDOR_PREFIXED_KEYFRAMES_AT_RULE = /^@(-\w+-)?keyframes$/; const OPTIONALLY_VENDOR_PREFIXED_ANIMATION_PROPERTY = /^(-\w+-)?animation(-name)?$/i; +const LIST_STYLE_PROPERTY = /^(list-style(-type)?)$/i; +const COUNTER_STYLE_PROPERTIES = /^(system|fallback|speak-as)$/i; +const CONTAINER_PROPERTY = /^(container(-name)?)$/i; const COMPOSES_PROPERTY = /^(composes|compose-with)$/i; const IS_MODULES = /\.module(s)?\.[^.]+$/i; const CSS_COMMENT = /\/\*((?!\*\/).*?)\*\//g; @@ -238,6 +241,17 @@ const unescapeIdentifier = (str) => { return ret; }; +/** + * A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo. + * The production corresponds to this: + * it’s defined as any (a valid identifier that starts with two dashes), + * except -- itself, which is reserved for future use by CSS. + * @param {string} identifier identifier + * @returns {boolean} true when identifier is dashed, otherwise false + */ +const isDashedIdentifier = (identifier) => + identifier.startsWith("--") && identifier.length >= 3; + /** @type {Record} */ const ANIMATION_KEYWORDS = { // animation-direction @@ -272,6 +286,138 @@ const ANIMATION_KEYWORDS = { "revert-layer": Infinity }; +/** @type {Record} */ +const PREDEFINED_COUNTER_STYLES = { + decimal: 1, + "decimal-leading-zero": 1, + "arabic-indic": 1, + armenian: 1, + "upper-armenian": 1, + "lower-armenian": 1, + bengali: 1, + cambodian: 1, + khmer: 1, + "cjk-decimal": 1, + devanagari: 1, + georgian: 1, + gujarati: 1, + /* cspell:disable-next-line */ + gurmukhi: 1, + hebrew: 1, + kannada: 1, + lao: 1, + malayalam: 1, + mongolian: 1, + myanmar: 1, + oriya: 1, + persian: 1, + "lower-roman": 1, + "upper-roman": 1, + tamil: 1, + telugu: 1, + thai: 1, + tibetan: 1, + + "lower-alpha": 1, + "lower-latin": 1, + "upper-alpha": 1, + "upper-latin": 1, + "lower-greek": 1, + hiragana: 1, + /* cspell:disable-next-line */ + "hiragana-iroha": 1, + katakana: 1, + /* cspell:disable-next-line */ + "katakana-iroha": 1, + + disc: 1, + circle: 1, + square: 1, + "disclosure-open": 1, + "disclosure-closed": 1, + + "cjk-earthly-branch": 1, + "cjk-heavenly-stem": 1, + + "japanese-informal": 1, + "japanese-formal": 1, + + "korean-hangul-formal": 1, + /* cspell:disable-next-line */ + "korean-hanja-informal": 1, + /* cspell:disable-next-line */ + "korean-hanja-formal": 1, + + "simp-chinese-informal": 1, + "simp-chinese-formal": 1, + "trad-chinese-informal": 1, + "trad-chinese-formal": 1, + "cjk-ideographic": 1, + + "ethiopic-numeric": 1 +}; + +/** @type {Record} */ +const LIST_STYLE_KEYWORDS = { + // list-style-position + inside: 1, + outside: 1, + // list-style-type + ...PREDEFINED_COUNTER_STYLES, + // Special + none: Infinity, + // Global values + initial: Infinity, + inherit: Infinity, + unset: Infinity, + revert: Infinity, + "revert-layer": Infinity +}; + +/** @type {Record} */ +const SYSTEM_KEYWORDS = { + cyclic: 1, + numeric: 1, + alphabetic: 1, + symbolic: 1, + additive: 1, + fixed: 1, + extends: 1, + ...PREDEFINED_COUNTER_STYLES +}; + +/** @type {Record} */ +const FALLBACK_KEYWORDS = { + ...PREDEFINED_COUNTER_STYLES +}; + +/** @type {Record} */ +const SPEAK_AS_KEYWORDS = { + auto: 1, + bullets: 1, + numbers: 1, + words: 1, + "spell-out": 1, + ...PREDEFINED_COUNTER_STYLES +}; + +/** @type {Record} */ +const CONTAINER_KEYWORDS = { + // container-type + normal: 1, + size: 1, + "inline-size": 1, + "scroll-state": 1, + // Special + none: Infinity, + // Global values + initial: Infinity, + inherit: Infinity, + unset: Infinity, + revert: Infinity, + "revert-layer": Infinity +}; + class LocConverter { /** * @param {string} input input @@ -1152,11 +1298,18 @@ class CssParser extends Parser { /** * @param {string} input input * @param {1 | 2} type type of function + * @param {boolean} needExport true when we need to export value, otherwise false * @param {number} start start position * @param {number} end end position * @returns {number} position after handling */ - const processLocalOrGlobalFunction = (input, type, start, end) => { + const processLocalOrGlobalFunction = ( + input, + type, + needExport, + start, + end + ) => { // Replace `local(`/` or `global(` (handle legacy `:local(` or `:global(` too) { const isColon = input.charCodeAt(start - 1) === CC_COLON; @@ -1167,23 +1320,34 @@ class CssParser extends Parser { end = walkCssTokens.consumeUntil( input, start, - type === 1 - ? { - identifier(input, start, end) { - const name = unescapeIdentifier(input.slice(start, end)); - const { line: sl, column: sc } = locConverter.get(start); - const { line: el, column: ec } = locConverter.get(end); - const dep = new CssIcssLocalIdentifierDependency(name, [ - start, - end - ]); - dep.setLoc(sl, sc, el, ec); - module.addDependency(dep); + { + identifier(input, start, end) { + if (type === 1) { + const identifier = unescapeIdentifier(input.slice(start, end)); + const { line: sl, column: sc } = locConverter.get(start); + const { line: el, column: ec } = locConverter.get(end); + const isDashedIdent = isDashedIdentifier(identifier); + const dep = needExport + ? new CssIcssLocalIdentifierDependency( + isDashedIdent ? identifier.slice(2) : identifier, + [start, end], + isDashedIdent && identifier.length >= 3 ? "--" : "" + ) + : new CssIcssSelfLocalIdentifierDependency( + isDashedIdent ? identifier.slice(2) : identifier, + undefined, + [start, end], + isDashedIdent ? "--" : "", + isDashedIdent ? declaredCssVariables : undefined + ); - return end; - } + dep.setLoc(sl, sc, el, ec); + module.addDependency(dep); } - : {}, + + return end; + } + }, {}, { onlyTopLevel: true, functionValue: true } ); @@ -1200,29 +1364,63 @@ class CssParser extends Parser { /** * @param {string} input input * @param {number} end name end position - * @param {{ string?: boolean, identifier: boolean, validate?: (name: string) => boolean, dashed?: boolean }} options types which allowed to handle + * @param {{ string?: boolean, identifier?: boolean | RegExp, dashed?: boolean }} options types which allowed to handle * @returns {number} position after handling */ const processLocalAtRule = (input, end, options) => { - /** @type {[number, number, boolean] | undefined} */ - let value; let found = false; - walkCssTokens.consumeUntil( + return walkCssTokens.consumeUntil( input, end, { string(_input, start, end) { if (!found && options.string) { + const value = input.slice(start + 1, end - 1); + const { line: sl, column: sc } = locConverter.get(start); + const { line: el, column: ec } = locConverter.get(end); + const dep = new CssIcssLocalIdentifierDependency( + unescapeIdentifier(value), + [start, end] + ); + dep.setLoc(sl, sc, el, ec); + module.addDependency(dep); found = true; - value = [start, end, true]; } return end; }, - identifier(_input, start, end) { - if (!found && options.identifier) { - found = true; - value = [start, end, false]; + identifier(input, start, end) { + if (!found) { + const identifier = input.slice(start, end); + + if ( + options.identifier || + (options.dashed && isDashedIdentifier(identifier)) + ) { + const name = unescapeIdentifier(identifier); + + if ( + options.identifier instanceof RegExp && + options.identifier.test(identifier) + ) { + return end; + } + + const { line: sl, column: sc } = locConverter.get(start); + const { line: el, column: ec } = locConverter.get(end); + const dep = new CssIcssLocalIdentifierDependency( + options.dashed ? name.slice(2) : name, + [start, end], + options.dashed ? "--" : "" + ); + dep.setLoc(sl, sc, el, ec); + module.addDependency(dep); + found = true; + + if (options.dashed) { + declaredCssVariables.add(name.slice(2)); + } + } } return end; } @@ -1240,7 +1438,17 @@ class CssParser extends Parser { if (!found && type) { found = true; - return processLocalOrGlobalFunction(input, type, start, end); + return processLocalOrGlobalFunction( + input, + type, + true, + start, + end + ); + } + + if (isLocalMode() && (name === "var" || name === "style")) { + return processDashedIdent(input, end, end); } return end; @@ -1248,42 +1456,18 @@ class CssParser extends Parser { }, { onlyTopLevel: true, atRulePrelude: true } ); - if (!value) return end; - let name = value[2] - ? input.slice(value[0] + 1, value[1] - 1) - : input.slice(value[0], value[1]); - if (options.validate && !options.validate(name)) return end; - name = unescapeIdentifier(name); - const { line: sl, column: sc } = locConverter.get(value[0]); - const { line: el, column: ec } = locConverter.get(value[1]); - if (options.dashed) { - name = name.slice(2); - declaredCssVariables.add(name); - } - const dep = new CssIcssLocalIdentifierDependency( - name, - [value[0], value[1]], - options.dashed ? "--" : "" - ); - dep.setLoc(sl, sc, el, ec); - module.addDependency(dep); - return value[1]; }; /** * @param {string} input input + * @param {number} start start position * @param {number} end end position + * @param {boolean=} declaration true when in declaration, otherwise false * @returns {number} position after handling */ - const processVarFunction = (input, end) => { - const customIdent = walkCssTokens.eatIdentSequence(input, end); + const processDashedIdent = (input, start, end, declaration) => { + const customIdent = walkCssTokens.eatIdentSequence(input, start); if (!customIdent) return end; - let name = input.slice(customIdent[0], customIdent[1]); - // A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo. - // The production corresponds to this: - // it’s defined as any (a valid identifier that starts with two dashes), - // except -- itself, which is reserved for future use by CSS. - if (!name.startsWith("--") || name.length < 3) return end; - name = unescapeIdentifier( + const identifier = unescapeIdentifier( input.slice(customIdent[0] + 2, customIdent[1]) ); const afterCustomIdent = walkCssTokens.eatWhitespaceAndComments( @@ -1324,9 +1508,10 @@ class CssParser extends Parser { /** @type {"local" | "global"} */ (mode), [customIdent[0], from[1] - 1], - name, - name, - "--" + identifier, + identifier, + "--", + 0 ); dep.setLoc(sl, sc, el, ec); @@ -1339,10 +1524,14 @@ class CssParser extends Parser { } } } else { + if (declaration) { + declaredCssVariables.add(identifier); + } + const { line: sl, column: sc } = locConverter.get(customIdent[0]); const { line: el, column: ec } = locConverter.get(customIdent[1]); const dep = new CssIcssSelfLocalIdentifierDependency( - name, + identifier, undefined, [customIdent[0], customIdent[1]], "--", @@ -1372,26 +1561,11 @@ class CssParser extends Parser { ); if (input.charCodeAt(propertyNameEnd) !== CC_COLON) return end; pos = propertyNameEnd + 1; - if (propertyName.startsWith("--") && propertyName.length >= 3) { - // CSS Variable - const { line: sl, column: sc } = locConverter.get(propertyNameStart); - const { line: el, column: ec } = locConverter.get(propertyNameEnd); - const name = unescapeIdentifier(propertyName.slice(2)); - const dep = new CssIcssLocalIdentifierDependency( - name, - [propertyNameStart, propertyNameEnd], - "--" - ); - dep.setLoc(sl, sc, el, ec); - module.addDependency(dep); - declaredCssVariables.add(name); - } else if ( - OPTIONALLY_VENDOR_PREFIXED_ANIMATION_PROPERTY.test(propertyName) - ) { + if (OPTIONALLY_VENDOR_PREFIXED_ANIMATION_PROPERTY.test(propertyName)) { /** @type {[number, number, boolean][]} */ const animationNames = []; /** @type {Record} */ - let parsedAnimationKeywords = Object.create(null); + let parsedKeywords = Object.create(null); const end = walkCssTokens.consumeUntil( input, @@ -1403,16 +1577,17 @@ class CssParser extends Parser { return end; }, identifier(input, start, end) { - const keyword = input.slice(start, end).toLowerCase(); + const identifier = input.slice(start, end); + const keyword = identifier.toLowerCase(); - parsedAnimationKeywords[keyword] = - typeof parsedAnimationKeywords[keyword] !== "undefined" - ? parsedAnimationKeywords[keyword] + 1 + parsedKeywords[keyword] = + typeof parsedKeywords[keyword] !== "undefined" + ? parsedKeywords[keyword] + 1 : 0; if ( ANIMATION_KEYWORDS[keyword] && - parsedAnimationKeywords[keyword] < ANIMATION_KEYWORDS[keyword] + parsedKeywords[keyword] < ANIMATION_KEYWORDS[keyword] ) { return end; } @@ -1421,7 +1596,7 @@ class CssParser extends Parser { return end; }, comma(_input, _start, end) { - parsedAnimationKeywords = {}; + parsedKeywords = {}; return end; } @@ -1433,15 +1608,21 @@ class CssParser extends Parser { .replace(/\\/g, "") .toLowerCase(); - if (isLocalMode() && name === "var") { - return processVarFunction(input, end); - } - const type = name === "local" ? 1 : name === "global" ? 2 : undefined; if (type) { - return processLocalOrGlobalFunction(input, type, start, end); + return processLocalOrGlobalFunction( + input, + type, + false, + start, + end + ); + } + + if (isLocalMode() && name === "var") { + return processDashedIdent(input, end, end); } return end; @@ -1470,6 +1651,253 @@ class CssParser extends Parser { } } + return end; + } else if (LIST_STYLE_PROPERTY.test(propertyName)) { + /** @type {[number, number][]} */ + const counterStyleNames = []; + /** @type {Record} */ + const parsedKeywords = Object.create(null); + + const end = walkCssTokens.consumeUntil( + input, + pos, + { + identifier(input, start, end) { + const identifier = input.slice(start, end); + const keyword = identifier.toLowerCase(); + + parsedKeywords[keyword] = + typeof parsedKeywords[keyword] !== "undefined" + ? parsedKeywords[keyword] + 1 + : 0; + + if ( + LIST_STYLE_KEYWORDS[keyword] && + parsedKeywords[keyword] < LIST_STYLE_KEYWORDS[keyword] + ) { + return end; + } + + counterStyleNames.push([start, end]); + return end; + } + }, + { + function(input, start, end) { + const name = input + .slice(start, end - 1) + .replace(/\\/g, "") + .toLowerCase(); + + const type = + name === "local" ? 1 : name === "global" ? 2 : undefined; + + if (type) { + return processLocalOrGlobalFunction( + input, + type, + false, + start, + end + ); + } + + if (isLocalMode() && name === "var") { + return processDashedIdent(input, end, end); + } + + return end; + } + }, + { onlyTopLevel: true, declarationValue: true } + ); + + if (counterStyleNames.length > 0) { + for (const counterStyleName of counterStyleNames) { + const { line: sl, column: sc } = locConverter.get( + counterStyleName[0] + ); + const { line: el, column: ec } = locConverter.get( + counterStyleName[1] + ); + const [start, end] = counterStyleName; + const type = unescapeIdentifier(input.slice(start, end)); + const dep = new CssIcssSelfLocalIdentifierDependency( + type, + undefined, + [start, end] + ); + dep.setLoc(sl, sc, el, ec); + module.addDependency(dep); + } + } + + return end; + } else if (COUNTER_STYLE_PROPERTIES.test(propertyName)) { + /** @type {[number, number][]} */ + const counterStyleNames = []; + /** @type {Record} */ + const parsedKeywords = Object.create(null); + + const end = walkCssTokens.consumeUntil( + input, + pos, + { + identifier(input, start, end) { + const identifier = input.slice(start, end); + const keyword = identifier.toLowerCase(); + + parsedKeywords[keyword] = + typeof parsedKeywords[keyword] !== "undefined" + ? parsedKeywords[keyword] + 1 + : 0; + + const keywords = + propertyName.toLowerCase() === "system" + ? SYSTEM_KEYWORDS + : propertyName.toLowerCase() === "fallback" + ? FALLBACK_KEYWORDS + : SPEAK_AS_KEYWORDS; + + if ( + keywords[keyword] && + parsedKeywords[keyword] < keywords[keyword] + ) { + return end; + } + + counterStyleNames.push([start, end]); + return end; + } + }, + { + function(input, start, end) { + const name = input + .slice(start, end - 1) + .replace(/\\/g, "") + .toLowerCase(); + + const type = + name === "local" ? 1 : name === "global" ? 2 : undefined; + + if (type) { + return processLocalOrGlobalFunction( + input, + type, + false, + start, + end + ); + } + + if (isLocalMode() && name === "var") { + return processDashedIdent(input, end, end); + } + + return end; + } + }, + { onlyTopLevel: true, declarationValue: true } + ); + + if (counterStyleNames.length > 0) { + for (const counterName of counterStyleNames) { + const { line: sl, column: sc } = locConverter.get(counterName[0]); + const { line: el, column: ec } = locConverter.get(counterName[1]); + const [start, end] = counterName; + const type = unescapeIdentifier(input.slice(start, end)); + const dep = new CssIcssSelfLocalIdentifierDependency( + type, + undefined, + [start, end] + ); + dep.setLoc(sl, sc, el, ec); + module.addDependency(dep); + } + } + + return end; + } else if (CONTAINER_PROPERTY.test(propertyName)) { + /** @type {[number, number][]} */ + const counterNames = []; + /** @type {Record} */ + const parsedContainerKeywords = Object.create(null); + + const end = walkCssTokens.consumeUntil( + input, + pos, + { + identifier(input, start, end) { + const identifier = input.slice(start, end); + + if (isLocalMode() && isDashedIdentifier(identifier)) { + return processDashedIdent(input, start, end); + } + + const keyword = identifier.toLowerCase(); + + parsedContainerKeywords[keyword] = + typeof parsedContainerKeywords[keyword] !== "undefined" + ? parsedContainerKeywords[keyword] + 1 + : 0; + + if ( + CONTAINER_KEYWORDS[keyword] && + parsedContainerKeywords[keyword] < CONTAINER_KEYWORDS[keyword] + ) { + return end; + } + + counterNames.push([start, end]); + return end; + } + }, + { + function(input, start, end) { + const name = input + .slice(start, end - 1) + .replace(/\\/g, "") + .toLowerCase(); + + const type = + name === "local" ? 1 : name === "global" ? 2 : undefined; + + if (type) { + return processLocalOrGlobalFunction( + input, + type, + false, + start, + end + ); + } + + if (isLocalMode() && name === "var") { + return processDashedIdent(input, end, end); + } + + return end; + } + }, + { onlyTopLevel: true, declarationValue: true } + ); + + if (counterNames.length > 0) { + for (const counterName of counterNames) { + const { line: sl, column: sc } = locConverter.get(counterName[0]); + const { line: el, column: ec } = locConverter.get(counterName[1]); + const [start, end] = counterName; + const type = unescapeIdentifier(input.slice(start, end)); + const dep = new CssIcssSelfLocalIdentifierDependency( + type, + undefined, + [start, end] + ); + dep.setLoc(sl, sc, el, ec); + module.addDependency(dep); + } + } + return end; } else if (COMPOSES_PROPERTY.test(propertyName)) { if (lastLocalIdentifiers.length > 1) { @@ -1782,11 +2210,23 @@ class CssParser extends Parser { string: true, identifier: true }); - } else if (name === "@property" && isLocalMode()) { + } else if (name === "@counter-style") { return processLocalAtRule(input, end, { - identifier: true, - dashed: true, - validate: (name) => name.startsWith("--") && name.length >= 3 + identifier: true + }); + } else if (name === "@container") { + return processLocalAtRule(input, end, { + identifier: /^(none|and|or|not)$/ + }); + } else if ( + (name === "@color-profile" || + name === "@font-palette-values" || + name === "@position-try" || + name === "@property") && + isLocalMode() + ) { + return processLocalAtRule(input, end, { + dashed: true }); } else if (name === "@scope") { isNextRulePrelude = true; @@ -1808,10 +2248,20 @@ class CssParser extends Parser { }, identifier: (input, start, end) => { if (isModules) { - const name = input.slice(start, end); + const identifier = input.slice(start, end); - if (icssDefinitions.has(name)) { - return processICSSSymbol(name, start, end); + if (icssDefinitions.has(identifier)) { + return processICSSSymbol(identifier, start, end); + } + + if (isLocalMode() && isDashedIdentifier(identifier)) { + const isProperty = + scope === CSS_MODE_IN_BLOCK && + input.charCodeAt( + walkCssTokens.eatWhitespaceAndComments(input, end) + ) === CC_COLON; + + return processDashedIdent(input, start, end, isProperty); } switch (scope) { @@ -1972,8 +2422,6 @@ class CssParser extends Parser { default: { if (this.url && IMAGE_SET_FUNCTION.test(name)) { return processImageSetFunction(input, start, end); - } else if (isLocalMode() && name === "var") { - return processVarFunction(input, end); } } } diff --git a/lib/css/walkCssTokens.js b/lib/css/walkCssTokens.js index e5e2ecb7e..41fc48b65 100644 --- a/lib/css/walkCssTokens.js +++ b/lib/css/walkCssTokens.js @@ -1201,7 +1201,7 @@ module.exports = (input, pos = 0, callbacks = {}) => { * @param {string} input input css * @param {number} pos pos * @param {CssTokenCallbacks} callbacks callbacks - * @param {CssTokenCallbacks} additional additional callbacks + * @param {CssTokenCallbacks=} additional additional callbacks * @param {{ onlyTopLevel?: boolean, declarationValue?: boolean, atRulePrelude?: boolean, functionValue?: boolean }=} options options * @returns {number} pos */ @@ -1221,7 +1221,7 @@ const consumeUntil = (input, pos, callbacks, additional, options = {}) => { needHandle = false; } - if (additional.function !== undefined) { + if (additional && additional.function !== undefined) { return additional.function(input, start, end); } @@ -1265,6 +1265,10 @@ const consumeUntil = (input, pos, callbacks, additional, options = {}) => { needTerminate = true; return end; }; + servicedCallbacks.semicolon = (_input, _start, end) => { + needTerminate = true; + return end; + }; } while (pos < input.length) { diff --git a/lib/dependencies/CssIcssFromIdentifierDependency.js b/lib/dependencies/CssIcssFromIdentifierDependency.js index f7d57b71c..aced6f04d 100644 --- a/lib/dependencies/CssIcssFromIdentifierDependency.js +++ b/lib/dependencies/CssIcssFromIdentifierDependency.js @@ -24,6 +24,7 @@ const ModuleDependency = require("./ModuleDependency"); /** @typedef {import("../../declarations/WebpackOptions").CssGeneratorExportsConvention} CssGeneratorExportsConvention */ /** @typedef {import("../css/CssGenerator")} CssGenerator */ /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ +/** @typedef {import("./CssIcssExportDependency").ExportMode} ExportMode */ class CssIcssFromIdentifierDependency extends CssIcssImportDependency { /** @@ -33,14 +34,18 @@ class CssIcssFromIdentifierDependency extends CssIcssImportDependency { * @param {string} name import class name * @param {string} exportName export class name * @param {string=} prefix prefix + * @param {ExportMode=} exportMode override export mode */ - constructor(request, mode, range, name, exportName, prefix) { + constructor(request, mode, range, name, exportName, prefix, exportMode) { super(request, range, mode, name); this.exportName = exportName; this.value = name; this.prefix = prefix; this.interpolationMode = CssIcssExportDependency.INTERPOLATION_MODE.VALUE; - this.exportMode = CssIcssExportDependency.EXPORT_MODE.APPEND; + this.exportMode = + typeof exportMode !== "undefined" + ? exportMode + : CssIcssExportDependency.EXPORT_MODE.APPEND; } get type() { diff --git a/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap b/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap index faaa5b352..8f88b51da 100644 --- a/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap +++ b/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap @@ -179,6 +179,7 @@ Object { "supports": "style_module_css-displayGridInSupports", "supportsInMedia": "style_module_css-displayFlexInSupportsInMedia", "supportsWithOperator": "style_module_css-floatRightInNegativeSupports", + "textColor": "--style_module_css-text-color", "vars": "--style_module_css-local-color style_module_css-vars undefined style_module_css-globalVars", "webkitAnyWmultiParams": "style_module_css-local16", "whereWmultiParams": "style_module_css-local10", @@ -544,35 +545,35 @@ div { } .var-function_module_css-from { - color: var(--my-var-u1 ); + color: var(--var-function-export_modules_css-my-var-u1); } .var-function_module_css-from-1 { - color: var(--var-function_module_css-main-bg-color, var(--my-var-u1 )); + color: var(--var-function_module_css-main-bg-color, var(--var-function-export_modules_css-my-var-u1)); } .var-function_module_css-from-2 { - color: var(--my-var-u1 , var(--var-function_module_css-main-bg-color)); + color: var(--var-function-export_modules_css-my-var-u1, var(--var-function_module_css-main-bg-color)); } .var-function_module_css-from-3 { - color: var(--my-var-u1 , var(--my-var-u2 )); + color: var(--var-function-export_modules_css-my-var-u1, var(--var-function-export_modules_css-my-var-u2)); } .var-function_module_css-from-4 { - color: var(--1 ); + color: var(--var-function-export_modules_css-1); } .var-function_module_css-from-5 { - color: var(----a ); + color: var(--var-function-export_modules_css---a); } .var-function_module_css-from-6 { - color: var(--main-bg-color ); + color: var(--var-function-export_modules_css-main-bg-color); } .var-function_module_css-mixed { - color: var(--my-var-u1 , var(--my-global, var(--var-function_module_css-main-bg-color, red))); + color: var(--var-function-export_modules_css-my-var-u1, var(--my-global, var(--var-function_module_css-main-bg-color, red))); } .var-function_module_css-broken { @@ -588,7 +589,7 @@ div { } .var-function_module_css-not-override-class { - color: var(--not-override-class ) + color: var(--var-function-export_modules_css-not-override-class) } .var-function_module_css-theme-dark { @@ -794,6 +795,17 @@ div { color: tan; } +/*!************************!*\\\\ + !*** css ./shared.css ***! + \\\\************************/ +:root { + --shared_css-from-shared: --shared_css-custom-shared; +} + +@color-profile --shared_css-custom-shared { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + /*!******************************!*\\\\ !*** css ./style.module.css ***! \\\\******************************/ @@ -1076,7 +1088,7 @@ div { } } -@counter-style thumbs { +@counter-style style_module_css-thumbs { system: cyclic; symbols: \\"\\\\1F44D\\"; suffix: \\" \\"; @@ -1158,7 +1170,7 @@ div { } } - @container foo { + @container style_module_css-foo { background: red; .style_module_css-nested-layer { @@ -1270,7 +1282,7 @@ div { } } -@container summary (min-width: 400px) { +@container style_module_css-summary (min-width: 400px) { @container (width > 400px) { .style_module_css-deep-class-in-container { font-size: 1.5em; @@ -1569,14 +1581,67 @@ div { } } -@counter-style thumbs { +@counter-style style_module_css-thumbs { system: cyclic; symbols: \\"\\\\1F44D\\"; suffix: \\" \\"; } ul { - list-style: thumbs; + list-style: style_module_css-thumbs; +} + +@counter-style style_module_css-extend-thumbs { + fallback: style_module_css-thumbs; + system: extends style_module_css-thumbs; + speak-as: style_module_css-thumbs; +} + +div { + list-style: inside; + list-style: outside; + list-style: upper-roman inside; + list-style: circle outside; + list-style: none disc; + list-style: none url(img/shape.png); + list-style: none; + list-style: none disc url(img/shape.png); + list-style: lower-alpha; + list-style: disc; + list-style: square; + list-style: url(\\"./img/shape.png\\"); + list-style: georgian inside url(\\"./img/shape.png\\"); + list-style: georgian outside url(\\"./img/shape.png\\"); + /* type */ + list-style: square; + + /* image */ + list-style: url(\\"./img/shape.png\\"); + + /* position */ + list-style: inside; + + /* two values */ + list-style: georgian outside; + list-style: url(\\"img/shape.png\\") inside; + + /* three values */ + list-style: lower-roman url(\\"img/shape.png\\") outside; + + /* Keyword value */ + list-style: none; + + /* Global values */ + list-style: inherit; + list-style: initial; + list-style: revert; + list-style: revert-layer; + list-style: unset; + + list-style-type: \\"★\\"; + + list-style-type: style_module_css-extend-thumbs; + list-style: style_module_css-extend-thumbs; } @container (width > 400px) and style(--responsive: true) { @@ -1584,6 +1649,73 @@ ul { font-size: 1.5em; } } + +@container style_module_css-tall (height > 30rem) { + p { + line-height: 1.6; + } +} + +@container style_module_css-sticky-heading scroll-state(stuck: top) { + h2 { + background: purple; + color: white; + } +} + +@container style_module_css-card (width > 400px), style(--responsive: true), scroll-state(stuck: top) { + h2 { + font-size: 1.5em; + } +} + +@container (width > 400px) and (height > 400px) { + /* */ +} + +@container (width > 400px) or (height > 400px) { + /* */ +} + +@container not (width < 400px) { + /* */ +} + +@container (min-width: 400px) { + /* … */ +} +@container (orientation: landscape) and (width > 400px) { + /* … */ +} +@container (15em <= block-size <= 30em) { + /* … */ +} + +.style_module_css-post { + container-name: style_module_css-tall; + container-type: inline-size; + + container: none; + container: inherit; + container: style_module_css-sticky-heading / inline-size; + container: style_module_css-sticky-heading / size; + container: style_module_css-sticky-heading / scroll-state; + --style_module_css-my-var: local(sticky-heading); + + container: var(--style_module_css-my-var); + --style_module_css-cards: small; + container-type: inline-size; +} + + +@container style_module_css-summary style(--style_module_css-cards: small) { + .style_module_css-card { + border: thin solid silver; + border-radius: 0.5em; + padding: 1em; + } +} + /* At-rule for \\"nice-style\\" in Font One */ @font-feature-values Font One { @styleset { @@ -1591,12 +1723,12 @@ ul { } } -@font-palette-values --identifier { +@font-palette-values --style_module_css-identifier { font-family: Bixa; } .style_module_css-my-class { - font-palette: --identifier; + font-palette: --style_module_css-identifier; } @keyframes style_module_css-foo { /* ... */ } @@ -1637,27 +1769,27 @@ ul { & .style_module_css-class { opacity: 0; } } -@position-try --custom-left { +@position-try --style_module_css-custom-left { position-area: left; width: 100px; margin: 0 10px 0 0; } -@position-try --custom-bottom { +@position-try --style_module_css-custom-bottom { top: anchor(bottom); justify-self: anchor-center; margin: 10px 0 0 0; position-area: none; } -@position-try --custom-right { +@position-try --style_module_css-custom-right { left: calc(anchor(right) + 10px); align-self: anchor-center; width: 100px; position-area: none; } -@position-try --custom-bottom-right { +@position-try --style_module_css-custom-bottom-right { position-area: bottom right; margin: 10px 0 0 10px; } @@ -1669,8 +1801,8 @@ ul { width: 200px; margin: 0 0 10px 0; position-try-fallbacks: - --custom-left, --custom-bottom, - --custom-right, --custom-bottom-right; + --style_module_css-custom-left, --style_module_css-custom-bottom, + --style_module_css-custom-right, --style_module_css-custom-bottom-right; } @page { @@ -1678,12 +1810,12 @@ ul { margin-top: 4in; } -@color-profile --swop5c { +@color-profile --style_module_css-swop5c { src: url(https://example.org/SWOP2006_Coated5v2.icc); } .style_module_css-header { - background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(--style_module_css-swop5c 0% 70% 20% 0%); } .style_module_css-test { @@ -1822,6 +1954,31 @@ ul { initial-value: 40%; } +@property --style_module_css-progress { + syntax: \\"\\"; + inherits: false; + initial-value: 25%; +} + +.style_module_css-bar { + display: inline-block; + --style_module_css-progress: 25%; + width: 100%; + height: 5px; + background: linear-gradient( + to right, + #00d230 var(--style_module_css-progress), + black var(--style_module_css-progress) + ); + animation: style_module_css-progressAnimation 2.5s ease infinite; +} + +@keyframes style_module_css-progressAnimation { + to { + --style_module_css-progress: 100%; + } +} + @keyframes style_module_css-initial { /* ... */ } @keyframes/**test**/style_module_css-initial { /* ... */ } @keyframes/**test**/style_module_css-initial/**test**/{ /* ... */ } @@ -1960,6 +2117,133 @@ div { .style_module_css-exportNameWeirdCharacters { } +@function --transparent(--color , --alpha type( | )) returns { + result: oklch(from var(--color) l c h / var(--alpha)); +} + +section { + --style_module_css-base-color: #faa6ff; + background-color: --transparent(var(--style_module_css-base-color), 0.8); +} + +@function --max-plus-x(--list #, --x ) { + result: calc(max(var(--list)) + var(--x)); +} + +div { + width: --max-plus-x({1px, 7px, 2px}, 3px); /* 10px */ +} + +@function --anim-1s(--animation, --count) { + --style_module_css-duration: 1s; + --style_module_css-easing: linear; + result: var(--animation) var(--style_module_css-duration) var(--count) var(--style_module_css-easing); +} + +div { + animation: --anim-1s(style_module_css-bounce, 2); +} + +@function --outer(--outer-arg) { + --style_module_css-outer-local: 2; + result: --inner(); +} + +@function --inner() returns { + result: calc(var(--outer-arg) + var(--style_module_css-outer-local)); +} + +div { + z-index: --outer(1); /* 3 */ +} + +@function --narrow-wide(--narrow, --wide) { + result: var(--wide); + @media (width < 700px) { + result: var(--narrow); + } +} + +@function --narrow-wide-if-else(--narrow, --wide) { + result: if(media(width < 700px): var(--narrow) ; else: var(--wide)); +} + +:root { + --style_module_css-mode: sharp; +} + +.style_module_css-apply-sharp { + border-radius: if(style(--style_module_css-mode: sharp): 0px; else: revert-rule); +} + +@color-profile --style_module_css-swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --style_module_css-swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --style_module_css-swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.style_module_css-class { + background-color: color(--style_module_css-swop5c 0% 70% 20% 0%); + background-color: color(local(--style_module_css-swop5c) 0% 70% 20% 0%); + background-color: color(:local(--style_module_css-swop5c) 0% 70% 20% 0%); + background-color: color(global(--style_module_css-swop5c) 0% 70% 20% 0%); + background-color: color(:global(--style_module_css-swop5c) 0% 70% 20% 0%); + background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(--shared_css-from-shared 0% 70% 20% 0%); + background-color: color(local(--style_module_css-swop5c, \\"./shared.css\\") 0% 70% 20% 0%); + background-color: color(:local(--style_module_css-swop5c, \\"./shared.css\\") 0% 70% 20% 0%); +} + +:root { + --style_module_css-text-color: #eee; +} + +.style_module_css-simple { + color: var(--style_module_css-text-color); +} + +/* Just nesting */ +.style_module_css-theme-dark { + --style_module_css-text-color: #fff; + --style_module_css-bg-color: #333; + + .style_module_css-button { + --style_module_css-button-color: var(--style_module_css-text-color); + --style_module_css-button-bg: var(--style_module_css-bg-color); + color: var(--style_module_css-button-color); + background-color: var(--style_module_css-button-bg); + } +} + +/* A container context based on inline size */ +.style_module_css-post { + --style_module_css-themeColor: blue; + container-type: inline-size; +} + +/* Apply styles if the container is narrower than 650px */ +@container (width < 650px) and style(--style_module_css-themeColor: blue) { + .style_module_css-card { + width: 50%; + background-color: lightgray; + font-size: 1em; + } +} + /*!*********************************!*\\\\ !*** css ./style.module.my-css ***! \\\\*********************************/ @@ -2040,6 +2324,7 @@ Object { "supports": "qyhlLo", "supportsInMedia": "KHcaFg", "supportsWithOperator": "NQmDdm", + "textColor": "--PJiFhP", "vars": "--ZfGW2N I8Lkai undefined Uw64p0", "webkitAnyWmultiParams": "piVgU0", "whereWmultiParams": "n4-IgX", @@ -2405,35 +2690,35 @@ div { } .n7N3Yd { - color: var(--my-var-u1 ); + color: var(--IUIj4X); } .Cavu2H { - color: var(--ir5X1L, var(--my-var-u1 )); + color: var(--ir5X1L, var(--IUIj4X)); } ._6emYNM { - color: var(--my-var-u1 , var(--ir5X1L)); + color: var(--IUIj4X, var(--ir5X1L)); } .XNaXe3 { - color: var(--my-var-u1 , var(--my-var-u2 )); + color: var(--IUIj4X, var(--_89DIRX)); } .mGmB4l { - color: var(--1 ); + color: var(--_5g4K-I); } .znpqdH { - color: var(----a ); + color: var(--_31C3Gv); } .uSxmmJ { - color: var(--main-bg-color ); + color: var(--msAO3F); } .AfNRVE { - color: var(--my-var-u1 , var(--my-global, var(--ir5X1L, red))); + color: var(--IUIj4X, var(--my-global, var(--ir5X1L, red))); } .Y8L6uE { @@ -2449,7 +2734,7 @@ div { } ._96YRqM { - color: var(--not-override-class ) + color: var(--TSNC0A) } .fYc0TB { @@ -2655,6 +2940,17 @@ div { color: tan; } +/*!************************!*\\\\ + !*** css ./shared.css ***! + \\\\************************/ +:root { + --lKXG0f: --vyaIR5; +} + +@color-profile --vyaIR5 { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + /*!******************************!*\\\\ !*** css ./style.module.css ***! \\\\******************************/ @@ -2937,7 +3233,7 @@ div { } } -@counter-style thumbs { +@counter-style uwNNmq { system: cyclic; symbols: \\"\\\\1F44D\\"; suffix: \\" \\"; @@ -3019,7 +3315,7 @@ div { } } - @container foo { + @container Pns_CJ { background: red; .Sin_15 { @@ -3131,7 +3427,7 @@ div { } } -@container summary (min-width: 400px) { +@container qYFiUT (min-width: 400px) { @container (width > 400px) { ._0Kw8ER { font-size: 1.5em; @@ -3430,14 +3726,67 @@ div { } } -@counter-style thumbs { +@counter-style uwNNmq { system: cyclic; symbols: \\"\\\\1F44D\\"; suffix: \\" \\"; } ul { - list-style: thumbs; + list-style: uwNNmq; +} + +@counter-style _8HrqS4 { + fallback: uwNNmq; + system: extends uwNNmq; + speak-as: uwNNmq; +} + +div { + list-style: inside; + list-style: outside; + list-style: upper-roman inside; + list-style: circle outside; + list-style: none disc; + list-style: none url(img/shape.png); + list-style: none; + list-style: none disc url(img/shape.png); + list-style: lower-alpha; + list-style: disc; + list-style: square; + list-style: url(\\"./img/shape.png\\"); + list-style: georgian inside url(\\"./img/shape.png\\"); + list-style: georgian outside url(\\"./img/shape.png\\"); + /* type */ + list-style: square; + + /* image */ + list-style: url(\\"./img/shape.png\\"); + + /* position */ + list-style: inside; + + /* two values */ + list-style: georgian outside; + list-style: url(\\"img/shape.png\\") inside; + + /* three values */ + list-style: lower-roman url(\\"img/shape.png\\") outside; + + /* Keyword value */ + list-style: none; + + /* Global values */ + list-style: inherit; + list-style: initial; + list-style: revert; + list-style: revert-layer; + list-style: unset; + + list-style-type: \\"★\\"; + + list-style-type: _8HrqS4; + list-style: _8HrqS4; } @container (width > 400px) and style(--responsive: true) { @@ -3445,6 +3794,73 @@ ul { font-size: 1.5em; } } + +@container M6rjPY (height > 30rem) { + p { + line-height: 1.6; + } +} + +@container Jsj6BT scroll-state(stuck: top) { + h2 { + background: purple; + color: white; + } +} + +@container r3yzH0 (width > 400px), style(--responsive: true), scroll-state(stuck: top) { + h2 { + font-size: 1.5em; + } +} + +@container (width > 400px) and (height > 400px) { + /* */ +} + +@container (width > 400px) or (height > 400px) { + /* */ +} + +@container not (width < 400px) { + /* */ +} + +@container (min-width: 400px) { + /* … */ +} +@container (orientation: landscape) and (width > 400px) { + /* … */ +} +@container (15em <= block-size <= 30em) { + /* … */ +} + +.rPnlZa { + container-name: M6rjPY; + container-type: inline-size; + + container: none; + container: inherit; + container: Jsj6BT / inline-size; + container: Jsj6BT / size; + container: Jsj6BT / scroll-state; + --d1bVSO: local(sticky-heading); + + container: var(--d1bVSO); + --K6CLJ5: small; + container-type: inline-size; +} + + +@container qYFiUT style(--K6CLJ5: small) { + .r3yzH0 { + border: thin solid silver; + border-radius: 0.5em; + padding: 1em; + } +} + /* At-rule for \\"nice-style\\" in Font One */ @font-feature-values Font One { @styleset { @@ -3452,12 +3868,12 @@ ul { } } -@font-palette-values --identifier { +@font-palette-values --wdoIWt { font-family: Bixa; } .Fr8iIT { - font-palette: --identifier; + font-palette: --wdoIWt; } @keyframes Pns_CJ { /* ... */ } @@ -3498,27 +3914,27 @@ ul { & .Th9Hcz { opacity: 0; } } -@position-try --custom-left { +@position-try --PgMDE7 { position-area: left; width: 100px; margin: 0 10px 0 0; } -@position-try --custom-bottom { +@position-try --hhKfVV { top: anchor(bottom); justify-self: anchor-center; margin: 10px 0 0 0; position-area: none; } -@position-try --custom-right { +@position-try --KWLHtz { left: calc(anchor(right) + 10px); align-self: anchor-center; width: 100px; position-area: none; } -@position-try --custom-bottom-right { +@position-try --mwT4O_ { position-area: bottom right; margin: 10px 0 0 10px; } @@ -3530,8 +3946,8 @@ ul { width: 200px; margin: 0 0 10px 0; position-try-fallbacks: - --custom-left, --custom-bottom, - --custom-right, --custom-bottom-right; + --PgMDE7, --hhKfVV, + --KWLHtz, --mwT4O_; } @page { @@ -3539,12 +3955,12 @@ ul { margin-top: 4in; } -@color-profile --swop5c { +@color-profile --ROcANu { src: url(https://example.org/SWOP2006_Coated5v2.icc); } .Zq4Bgu { - background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(--ROcANu 0% 70% 20% 0%); } .w_hBjy { @@ -3683,6 +4099,31 @@ ul { initial-value: 40%; } +@property --_7d1iGg { + syntax: \\"\\"; + inherits: false; + initial-value: 25%; +} + +.b5xu71 { + display: inline-block; + --_7d1iGg: 25%; + width: 100%; + height: 5px; + background: linear-gradient( + to right, + #00d230 var(--_7d1iGg), + black var(--_7d1iGg) + ); + animation: _4FiJQA 2.5s ease infinite; +} + +@keyframes _4FiJQA { + to { + --_7d1iGg: 100%; + } +} + @keyframes _3XWMcj { /* ... */ } @keyframes/**test**/_3XWMcj { /* ... */ } @keyframes/**test**/_3XWMcj/**test**/{ /* ... */ } @@ -3761,7 +4202,7 @@ div { --pilraw: 10px; --Pns_CJ: 10px; --b5xu71: calc(var(--Pns_CJ) + 10px); - --_8NggIH: linear-gradient(to top, var(--cuyscJ), white); + --zMOaz9: linear-gradient(to top, var(--cuyscJ), white); --Xz8Zyw: \\"test\\"; --FWUVf6: yellow; --h5_X_2: red; @@ -3821,6 +4262,133 @@ div { .pfrK-J { } +@function --transparent(--color , --alpha type( | )) returns { + result: oklch(from var(--color) l c h / var(--alpha)); +} + +section { + --_5hZGZD: #faa6ff; + background-color: --transparent(var(--_5hZGZD), 0.8); +} + +@function --max-plus-x(--list #, --x ) { + result: calc(max(var(--list)) + var(--x)); +} + +div { + width: --max-plus-x({1px, 7px, 2px}, 3px); /* 10px */ +} + +@function --anim-1s(--animation, --count) { + --uRmi-O: 1s; + --_2c0Pw3: linear; + result: var(--animation) var(--uRmi-O) var(--count) var(--_2c0Pw3); +} + +div { + animation: --anim-1s(M0uhU5, 2); +} + +@function --outer(--outer-arg) { + --sVY4tR: 2; + result: --inner(); +} + +@function --inner() returns { + result: calc(var(--outer-arg) + var(--sVY4tR)); +} + +div { + z-index: --outer(1); /* 3 */ +} + +@function --narrow-wide(--narrow, --wide) { + result: var(--wide); + @media (width < 700px) { + result: var(--narrow); + } +} + +@function --narrow-wide-if-else(--narrow, --wide) { + result: if(media(width < 700px): var(--narrow) ; else: var(--wide)); +} + +:root { + --_93Jj1p: sharp; +} + +.Y4Gwu3 { + border-radius: if(style(--_93Jj1p: sharp): 0px; else: revert-rule); +} + +@color-profile --ROcANu { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --ROcANu { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --ROcANu { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.Th9Hcz { + background-color: color(--ROcANu 0% 70% 20% 0%); + background-color: color(local(--ROcANu) 0% 70% 20% 0%); + background-color: color(:local(--ROcANu) 0% 70% 20% 0%); + background-color: color(global(--ROcANu) 0% 70% 20% 0%); + background-color: color(:global(--ROcANu) 0% 70% 20% 0%); + background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(--lKXG0f 0% 70% 20% 0%); + background-color: color(local(--ROcANu, \\"./shared.css\\") 0% 70% 20% 0%); + background-color: color(:local(--ROcANu, \\"./shared.css\\") 0% 70% 20% 0%); +} + +:root { + --PJiFhP: #eee; +} + +.RRkM-G { + color: var(--PJiFhP); +} + +/* Just nesting */ +.yIfcPh { + --PJiFhP: #fff; + --YI1Kj3: #333; + + .mYBaWo { + --VLWr0L: var(--PJiFhP); + --I-Ywj4: var(--YI1Kj3); + color: var(--VLWr0L); + background-color: var(--I-Ywj4); + } +} + +/* A container context based on inline size */ +.rPnlZa { + --CSr0Ji: blue; + container-type: inline-size; +} + +/* Apply styles if the container is narrower than 650px */ +@container (width < 650px) and style(--CSr0Ji: blue) { + .r3yzH0 { + width: 50%; + background-color: lightgray; + font-size: 1em; + } +} + /*!*********************************!*\\\\ !*** css ./style.module.my-css ***! \\\\*********************************/ @@ -3907,6 +4475,7 @@ Object { "supports": "style_module_css-displayGridInSupports", "supportsInMedia": "style_module_css-displayFlexInSupportsInMedia", "supportsWithOperator": "style_module_css-floatRightInNegativeSupports", + "textColor": "--style_module_css-text-color", "vars": "--style_module_css-local-color style_module_css-vars undefined style_module_css-globalVars", "webkitAnyWmultiParams": "style_module_css-local16", "whereWmultiParams": "style_module_css-local10", @@ -3961,6 +4530,7 @@ Object { "supports": "qyhlLo", "supportsInMedia": "KHcaFg", "supportsWithOperator": "NQmDdm", + "textColor": "--PJiFhP", "vars": "--ZfGW2N I8Lkai undefined Uw64p0", "webkitAnyWmultiParams": "piVgU0", "whereWmultiParams": "n4-IgX", @@ -4015,6 +4585,7 @@ Object { "supports": "qyhlLo", "supportsInMedia": "KHcaFg", "supportsWithOperator": "NQmDdm", + "textColor": "--PJiFhP", "vars": "--ZfGW2N I8Lkai undefined Uw64p0", "webkitAnyWmultiParams": "piVgU0", "whereWmultiParams": "n4-IgX", @@ -8632,7 +9203,7 @@ Array [ /* localize animation using special characters */ .postcss-modules-local-by-default_local_modules_css-foo { animation: postcss-modules-local-by-default_local_modules_css-😃bounce😃; } -/* not localize custom property */ +/* localize custom property */ .postcss-modules-local-by-default_local_modules_css-foo { animation: postcss-modules-local-by-default_local_modules_css---foo; } /* not localize name in nested function */ @@ -9088,6 +9659,8 @@ input { a_value: some-value; } /* postcss-modules-local-by-default */ /* TODO not implemented yet */ +@keyframes postcss-modules-local-by-default_pure_modules_css-bounce {} +@keyframes postcss-modules-local-by-default_pure_modules_css-fly {} /* localize and not localize animation-name in mixed case #3 */ .postcss-modules-local-by-default_pure_modules_css-foo { animation-name: postcss-modules-local-by-default_pure_modules_css-fadeInOut, moveLeft300px, postcss-modules-local-by-default_pure_modules_css-bounce; } @@ -11726,11 +12299,131 @@ ul { list-style: thumbs; } +@counter-style extend-thumbs { + fallback: thumbs; + system: extends thumbs; + speak-as: thumbs; +} + +div { + list-style: inside; + list-style: outside; + list-style: upper-roman inside; + list-style: circle outside; + list-style: none disc; + list-style: none url(09a1a1112c577c279435.png); + list-style: none; + list-style: none disc url(09a1a1112c577c279435.png); + list-style: lower-alpha; + list-style: disc; + list-style: square; + list-style: url(09a1a1112c577c279435.png); + list-style: georgian inside url(09a1a1112c577c279435.png); + list-style: georgian outside url(09a1a1112c577c279435.png); + /* type */ + list-style: square; + + /* image */ + list-style: url(09a1a1112c577c279435.png); + + /* position */ + list-style: inside; + + /* two values */ + list-style: georgian outside; + list-style: url(09a1a1112c577c279435.png) inside; + + /* three values */ + list-style: lower-roman url(09a1a1112c577c279435.png) outside; + + /* Keyword value */ + list-style: none; + + /* Global values */ + list-style: inherit; + list-style: initial; + list-style: revert; + list-style: revert-layer; + list-style: unset; + + list-style-type: \\"★\\"; + + list-style-type: extend-thumbs; + list-style: extend-thumbs; +} + @container (width > 400px) and style(--responsive: true) { .class { font-size: 1.5em; } } + +@container tall (height > 30rem) { + p { + line-height: 1.6; + } +} + +@container sticky-heading scroll-state(stuck: top) { + h2 { + background: purple; + color: white; + } +} + +@container card (width > 400px), style(--responsive: true), scroll-state(stuck: top) { + h2 { + font-size: 1.5em; + } +} + +@container (width > 400px) and (height > 400px) { + /* */ +} + +@container (width > 400px) or (height > 400px) { + /* */ +} + +@container not (width < 400px) { + /* */ +} + +@container (min-width: 400px) { + /* … */ +} +@container (orientation: landscape) and (width > 400px) { + /* … */ +} +@container (15em <= block-size <= 30em) { + /* … */ +} + +.post { + container-name: tall; + container-type: inline-size; + + container: none; + container: inherit; + container: sticky-heading / inline-size; + container: sticky-heading / size; + container: sticky-heading / scroll-state; + --my-var: local(sticky-heading); + + container: var(--my-var); + --cards: small; + container-type: inline-size; +} + + +@container summary style(--cards: small) { + .card { + border: thin solid silver; + border-radius: 0.5em; + padding: 1em; + } +} + /* At-rule for \\"nice-style\\" in Font One */ @font-feature-values Font One { @styleset { @@ -11969,6 +12662,31 @@ ul { initial-value: 40%; } +@property --progress { + syntax: \\"\\"; + inherits: false; + initial-value: 25%; +} + +.bar { + display: inline-block; + --progress: 25%; + width: 100%; + height: 5px; + background: linear-gradient( + to right, + #00d230 var(--progress), + black var(--progress) + ); + animation: progressAnimation 2.5s ease infinite; +} + +@keyframes progressAnimation { + to { + --progress: 100%; + } +} + @keyframes \\"initial\\" { /* ... */ } @keyframes/**test**/\\"initial\\" { /* ... */ } @keyframes/**test**/\\"initial\\"/**test**/{ /* ... */ } @@ -12129,6 +12847,133 @@ div { composes: a -b b- --c c-- _d d\\\\% from \\"./classes.modules.css\\"; } +@function --transparent(--color , --alpha type( | )) returns { + result: oklch(from var(--color) l c h / var(--alpha)); +} + +section { + --base-color: #faa6ff; + background-color: --transparent(var(--base-color), 0.8); +} + +@function --max-plus-x(--list #, --x ) { + result: calc(max(var(--list)) + var(--x)); +} + +div { + width: --max-plus-x({1px, 7px, 2px}, 3px); /* 10px */ +} + +@function --anim-1s(--animation, --count) { + --duration: 1s; + --easing: linear; + result: var(--animation) var(--duration) var(--count) var(--easing); +} + +div { + animation: --anim-1s(local(bounce), 2); +} + +@function --outer(--outer-arg) { + --outer-local: 2; + result: --inner(); +} + +@function --inner() returns { + result: calc(var(--outer-arg) + var(--outer-local)); +} + +div { + z-index: --outer(1); /* 3 */ +} + +@function --narrow-wide(--narrow, --wide) { + result: var(--wide); + @media (width < 700px) { + result: var(--narrow); + } +} + +@function --narrow-wide-if-else(--narrow, --wide) { + result: if(media(width < 700px): var(--narrow) ; else: var(--wide)); +} + +:root { + --mode: sharp; +} + +.apply-sharp { + border-radius: if(style(--mode: sharp): 0px; else: revert-rule); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile local(--swop5c) { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile :local(--swop5c) { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile global(--swop5c) { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile :global(--swop5c) { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.class { + background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(local(--swop5c) 0% 70% 20% 0%); + background-color: color(:local(--swop5c) 0% 70% 20% 0%); + background-color: color(global(--swop5c) 0% 70% 20% 0%); + background-color: color(:global(--swop5c) 0% 70% 20% 0%); + background-color: color(--swop5c from global 0% 70% 20% 0%); + background-color: color(--from-shared from \\"./shared.css\\" 0% 70% 20% 0%); + background-color: color(local(--swop5c, \\"./shared.css\\") 0% 70% 20% 0%); + background-color: color(:local(--swop5c, \\"./shared.css\\") 0% 70% 20% 0%); +} + +:root { + --text-color: #eee; +} + +.simple { + color: var(--text-color); +} + +/* Just nesting */ +.theme-dark { + --text-color: #fff; + --bg-color: #333; + + .button { + --button-color: var(--text-color); + --button-bg: var(--bg-color); + color: var(--button-color); + background-color: var(--button-bg); + } +} + +/* A container context based on inline size */ +.post { + --themeColor: blue; + container-type: inline-size; +} + +/* Apply styles if the container is narrower than 650px */ +@container (width < 650px) and style(--themeColor: blue) { + .card { + width: 50%; + background-color: lightgray; + font-size: 1em; + } +} + /*!***********************!*\\\\ !*** css ./style.css ***! \\\\***********************/ diff --git a/test/__snapshots__/ConfigTestCases.basictest.js.snap b/test/__snapshots__/ConfigTestCases.basictest.js.snap index b93e69baa..5e1479cca 100644 --- a/test/__snapshots__/ConfigTestCases.basictest.js.snap +++ b/test/__snapshots__/ConfigTestCases.basictest.js.snap @@ -179,6 +179,7 @@ Object { "supports": "style_module_css-displayGridInSupports", "supportsInMedia": "style_module_css-displayFlexInSupportsInMedia", "supportsWithOperator": "style_module_css-floatRightInNegativeSupports", + "textColor": "--style_module_css-text-color", "vars": "--style_module_css-local-color style_module_css-vars undefined style_module_css-globalVars", "webkitAnyWmultiParams": "style_module_css-local16", "whereWmultiParams": "style_module_css-local10", @@ -544,35 +545,35 @@ div { } .var-function_module_css-from { - color: var(--my-var-u1 ); + color: var(--var-function-export_modules_css-my-var-u1); } .var-function_module_css-from-1 { - color: var(--var-function_module_css-main-bg-color, var(--my-var-u1 )); + color: var(--var-function_module_css-main-bg-color, var(--var-function-export_modules_css-my-var-u1)); } .var-function_module_css-from-2 { - color: var(--my-var-u1 , var(--var-function_module_css-main-bg-color)); + color: var(--var-function-export_modules_css-my-var-u1, var(--var-function_module_css-main-bg-color)); } .var-function_module_css-from-3 { - color: var(--my-var-u1 , var(--my-var-u2 )); + color: var(--var-function-export_modules_css-my-var-u1, var(--var-function-export_modules_css-my-var-u2)); } .var-function_module_css-from-4 { - color: var(--1 ); + color: var(--var-function-export_modules_css-1); } .var-function_module_css-from-5 { - color: var(----a ); + color: var(--var-function-export_modules_css---a); } .var-function_module_css-from-6 { - color: var(--main-bg-color ); + color: var(--var-function-export_modules_css-main-bg-color); } .var-function_module_css-mixed { - color: var(--my-var-u1 , var(--my-global, var(--var-function_module_css-main-bg-color, red))); + color: var(--var-function-export_modules_css-my-var-u1, var(--my-global, var(--var-function_module_css-main-bg-color, red))); } .var-function_module_css-broken { @@ -588,7 +589,7 @@ div { } .var-function_module_css-not-override-class { - color: var(--not-override-class ) + color: var(--var-function-export_modules_css-not-override-class) } .var-function_module_css-theme-dark { @@ -794,6 +795,17 @@ div { color: tan; } +/*!************************!*\\\\ + !*** css ./shared.css ***! + \\\\************************/ +:root { + --shared_css-from-shared: --shared_css-custom-shared; +} + +@color-profile --shared_css-custom-shared { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + /*!******************************!*\\\\ !*** css ./style.module.css ***! \\\\******************************/ @@ -1076,7 +1088,7 @@ div { } } -@counter-style thumbs { +@counter-style style_module_css-thumbs { system: cyclic; symbols: \\"\\\\1F44D\\"; suffix: \\" \\"; @@ -1158,7 +1170,7 @@ div { } } - @container foo { + @container style_module_css-foo { background: red; .style_module_css-nested-layer { @@ -1270,7 +1282,7 @@ div { } } -@container summary (min-width: 400px) { +@container style_module_css-summary (min-width: 400px) { @container (width > 400px) { .style_module_css-deep-class-in-container { font-size: 1.5em; @@ -1569,14 +1581,67 @@ div { } } -@counter-style thumbs { +@counter-style style_module_css-thumbs { system: cyclic; symbols: \\"\\\\1F44D\\"; suffix: \\" \\"; } ul { - list-style: thumbs; + list-style: style_module_css-thumbs; +} + +@counter-style style_module_css-extend-thumbs { + fallback: style_module_css-thumbs; + system: extends style_module_css-thumbs; + speak-as: style_module_css-thumbs; +} + +div { + list-style: inside; + list-style: outside; + list-style: upper-roman inside; + list-style: circle outside; + list-style: none disc; + list-style: none url(img/shape.png); + list-style: none; + list-style: none disc url(img/shape.png); + list-style: lower-alpha; + list-style: disc; + list-style: square; + list-style: url(\\"./img/shape.png\\"); + list-style: georgian inside url(\\"./img/shape.png\\"); + list-style: georgian outside url(\\"./img/shape.png\\"); + /* type */ + list-style: square; + + /* image */ + list-style: url(\\"./img/shape.png\\"); + + /* position */ + list-style: inside; + + /* two values */ + list-style: georgian outside; + list-style: url(\\"img/shape.png\\") inside; + + /* three values */ + list-style: lower-roman url(\\"img/shape.png\\") outside; + + /* Keyword value */ + list-style: none; + + /* Global values */ + list-style: inherit; + list-style: initial; + list-style: revert; + list-style: revert-layer; + list-style: unset; + + list-style-type: \\"★\\"; + + list-style-type: style_module_css-extend-thumbs; + list-style: style_module_css-extend-thumbs; } @container (width > 400px) and style(--responsive: true) { @@ -1584,6 +1649,73 @@ ul { font-size: 1.5em; } } + +@container style_module_css-tall (height > 30rem) { + p { + line-height: 1.6; + } +} + +@container style_module_css-sticky-heading scroll-state(stuck: top) { + h2 { + background: purple; + color: white; + } +} + +@container style_module_css-card (width > 400px), style(--responsive: true), scroll-state(stuck: top) { + h2 { + font-size: 1.5em; + } +} + +@container (width > 400px) and (height > 400px) { + /* */ +} + +@container (width > 400px) or (height > 400px) { + /* */ +} + +@container not (width < 400px) { + /* */ +} + +@container (min-width: 400px) { + /* … */ +} +@container (orientation: landscape) and (width > 400px) { + /* … */ +} +@container (15em <= block-size <= 30em) { + /* … */ +} + +.style_module_css-post { + container-name: style_module_css-tall; + container-type: inline-size; + + container: none; + container: inherit; + container: style_module_css-sticky-heading / inline-size; + container: style_module_css-sticky-heading / size; + container: style_module_css-sticky-heading / scroll-state; + --style_module_css-my-var: local(sticky-heading); + + container: var(--style_module_css-my-var); + --style_module_css-cards: small; + container-type: inline-size; +} + + +@container style_module_css-summary style(--style_module_css-cards: small) { + .style_module_css-card { + border: thin solid silver; + border-radius: 0.5em; + padding: 1em; + } +} + /* At-rule for \\"nice-style\\" in Font One */ @font-feature-values Font One { @styleset { @@ -1591,12 +1723,12 @@ ul { } } -@font-palette-values --identifier { +@font-palette-values --style_module_css-identifier { font-family: Bixa; } .style_module_css-my-class { - font-palette: --identifier; + font-palette: --style_module_css-identifier; } @keyframes style_module_css-foo { /* ... */ } @@ -1637,27 +1769,27 @@ ul { & .style_module_css-class { opacity: 0; } } -@position-try --custom-left { +@position-try --style_module_css-custom-left { position-area: left; width: 100px; margin: 0 10px 0 0; } -@position-try --custom-bottom { +@position-try --style_module_css-custom-bottom { top: anchor(bottom); justify-self: anchor-center; margin: 10px 0 0 0; position-area: none; } -@position-try --custom-right { +@position-try --style_module_css-custom-right { left: calc(anchor(right) + 10px); align-self: anchor-center; width: 100px; position-area: none; } -@position-try --custom-bottom-right { +@position-try --style_module_css-custom-bottom-right { position-area: bottom right; margin: 10px 0 0 10px; } @@ -1669,8 +1801,8 @@ ul { width: 200px; margin: 0 0 10px 0; position-try-fallbacks: - --custom-left, --custom-bottom, - --custom-right, --custom-bottom-right; + --style_module_css-custom-left, --style_module_css-custom-bottom, + --style_module_css-custom-right, --style_module_css-custom-bottom-right; } @page { @@ -1678,12 +1810,12 @@ ul { margin-top: 4in; } -@color-profile --swop5c { +@color-profile --style_module_css-swop5c { src: url(https://example.org/SWOP2006_Coated5v2.icc); } .style_module_css-header { - background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(--style_module_css-swop5c 0% 70% 20% 0%); } .style_module_css-test { @@ -1822,6 +1954,31 @@ ul { initial-value: 40%; } +@property --style_module_css-progress { + syntax: \\"\\"; + inherits: false; + initial-value: 25%; +} + +.style_module_css-bar { + display: inline-block; + --style_module_css-progress: 25%; + width: 100%; + height: 5px; + background: linear-gradient( + to right, + #00d230 var(--style_module_css-progress), + black var(--style_module_css-progress) + ); + animation: style_module_css-progressAnimation 2.5s ease infinite; +} + +@keyframes style_module_css-progressAnimation { + to { + --style_module_css-progress: 100%; + } +} + @keyframes style_module_css-initial { /* ... */ } @keyframes/**test**/style_module_css-initial { /* ... */ } @keyframes/**test**/style_module_css-initial/**test**/{ /* ... */ } @@ -1960,6 +2117,133 @@ div { .style_module_css-exportNameWeirdCharacters { } +@function --transparent(--color , --alpha type( | )) returns { + result: oklch(from var(--color) l c h / var(--alpha)); +} + +section { + --style_module_css-base-color: #faa6ff; + background-color: --transparent(var(--style_module_css-base-color), 0.8); +} + +@function --max-plus-x(--list #, --x ) { + result: calc(max(var(--list)) + var(--x)); +} + +div { + width: --max-plus-x({1px, 7px, 2px}, 3px); /* 10px */ +} + +@function --anim-1s(--animation, --count) { + --style_module_css-duration: 1s; + --style_module_css-easing: linear; + result: var(--animation) var(--style_module_css-duration) var(--count) var(--style_module_css-easing); +} + +div { + animation: --anim-1s(style_module_css-bounce, 2); +} + +@function --outer(--outer-arg) { + --style_module_css-outer-local: 2; + result: --inner(); +} + +@function --inner() returns { + result: calc(var(--outer-arg) + var(--style_module_css-outer-local)); +} + +div { + z-index: --outer(1); /* 3 */ +} + +@function --narrow-wide(--narrow, --wide) { + result: var(--wide); + @media (width < 700px) { + result: var(--narrow); + } +} + +@function --narrow-wide-if-else(--narrow, --wide) { + result: if(media(width < 700px): var(--narrow) ; else: var(--wide)); +} + +:root { + --style_module_css-mode: sharp; +} + +.style_module_css-apply-sharp { + border-radius: if(style(--style_module_css-mode: sharp): 0px; else: revert-rule); +} + +@color-profile --style_module_css-swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --style_module_css-swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --style_module_css-swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.style_module_css-class { + background-color: color(--style_module_css-swop5c 0% 70% 20% 0%); + background-color: color(local(--style_module_css-swop5c) 0% 70% 20% 0%); + background-color: color(:local(--style_module_css-swop5c) 0% 70% 20% 0%); + background-color: color(global(--style_module_css-swop5c) 0% 70% 20% 0%); + background-color: color(:global(--style_module_css-swop5c) 0% 70% 20% 0%); + background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(--shared_css-from-shared 0% 70% 20% 0%); + background-color: color(local(--style_module_css-swop5c, \\"./shared.css\\") 0% 70% 20% 0%); + background-color: color(:local(--style_module_css-swop5c, \\"./shared.css\\") 0% 70% 20% 0%); +} + +:root { + --style_module_css-text-color: #eee; +} + +.style_module_css-simple { + color: var(--style_module_css-text-color); +} + +/* Just nesting */ +.style_module_css-theme-dark { + --style_module_css-text-color: #fff; + --style_module_css-bg-color: #333; + + .style_module_css-button { + --style_module_css-button-color: var(--style_module_css-text-color); + --style_module_css-button-bg: var(--style_module_css-bg-color); + color: var(--style_module_css-button-color); + background-color: var(--style_module_css-button-bg); + } +} + +/* A container context based on inline size */ +.style_module_css-post { + --style_module_css-themeColor: blue; + container-type: inline-size; +} + +/* Apply styles if the container is narrower than 650px */ +@container (width < 650px) and style(--style_module_css-themeColor: blue) { + .style_module_css-card { + width: 50%; + background-color: lightgray; + font-size: 1em; + } +} + /*!*********************************!*\\\\ !*** css ./style.module.my-css ***! \\\\*********************************/ @@ -2040,6 +2324,7 @@ Object { "supports": "qyhlLo", "supportsInMedia": "KHcaFg", "supportsWithOperator": "NQmDdm", + "textColor": "--PJiFhP", "vars": "--ZfGW2N I8Lkai undefined Uw64p0", "webkitAnyWmultiParams": "piVgU0", "whereWmultiParams": "n4-IgX", @@ -2405,35 +2690,35 @@ div { } .n7N3Yd { - color: var(--my-var-u1 ); + color: var(--IUIj4X); } .Cavu2H { - color: var(--ir5X1L, var(--my-var-u1 )); + color: var(--ir5X1L, var(--IUIj4X)); } ._6emYNM { - color: var(--my-var-u1 , var(--ir5X1L)); + color: var(--IUIj4X, var(--ir5X1L)); } .XNaXe3 { - color: var(--my-var-u1 , var(--my-var-u2 )); + color: var(--IUIj4X, var(--_89DIRX)); } .mGmB4l { - color: var(--1 ); + color: var(--_5g4K-I); } .znpqdH { - color: var(----a ); + color: var(--_31C3Gv); } .uSxmmJ { - color: var(--main-bg-color ); + color: var(--msAO3F); } .AfNRVE { - color: var(--my-var-u1 , var(--my-global, var(--ir5X1L, red))); + color: var(--IUIj4X, var(--my-global, var(--ir5X1L, red))); } .Y8L6uE { @@ -2449,7 +2734,7 @@ div { } ._96YRqM { - color: var(--not-override-class ) + color: var(--TSNC0A) } .fYc0TB { @@ -2655,6 +2940,17 @@ div { color: tan; } +/*!************************!*\\\\ + !*** css ./shared.css ***! + \\\\************************/ +:root { + --lKXG0f: --vyaIR5; +} + +@color-profile --vyaIR5 { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + /*!******************************!*\\\\ !*** css ./style.module.css ***! \\\\******************************/ @@ -2937,7 +3233,7 @@ div { } } -@counter-style thumbs { +@counter-style uwNNmq { system: cyclic; symbols: \\"\\\\1F44D\\"; suffix: \\" \\"; @@ -3019,7 +3315,7 @@ div { } } - @container foo { + @container Pns_CJ { background: red; .Sin_15 { @@ -3131,7 +3427,7 @@ div { } } -@container summary (min-width: 400px) { +@container qYFiUT (min-width: 400px) { @container (width > 400px) { ._0Kw8ER { font-size: 1.5em; @@ -3430,14 +3726,67 @@ div { } } -@counter-style thumbs { +@counter-style uwNNmq { system: cyclic; symbols: \\"\\\\1F44D\\"; suffix: \\" \\"; } ul { - list-style: thumbs; + list-style: uwNNmq; +} + +@counter-style _8HrqS4 { + fallback: uwNNmq; + system: extends uwNNmq; + speak-as: uwNNmq; +} + +div { + list-style: inside; + list-style: outside; + list-style: upper-roman inside; + list-style: circle outside; + list-style: none disc; + list-style: none url(img/shape.png); + list-style: none; + list-style: none disc url(img/shape.png); + list-style: lower-alpha; + list-style: disc; + list-style: square; + list-style: url(\\"./img/shape.png\\"); + list-style: georgian inside url(\\"./img/shape.png\\"); + list-style: georgian outside url(\\"./img/shape.png\\"); + /* type */ + list-style: square; + + /* image */ + list-style: url(\\"./img/shape.png\\"); + + /* position */ + list-style: inside; + + /* two values */ + list-style: georgian outside; + list-style: url(\\"img/shape.png\\") inside; + + /* three values */ + list-style: lower-roman url(\\"img/shape.png\\") outside; + + /* Keyword value */ + list-style: none; + + /* Global values */ + list-style: inherit; + list-style: initial; + list-style: revert; + list-style: revert-layer; + list-style: unset; + + list-style-type: \\"★\\"; + + list-style-type: _8HrqS4; + list-style: _8HrqS4; } @container (width > 400px) and style(--responsive: true) { @@ -3445,6 +3794,73 @@ ul { font-size: 1.5em; } } + +@container M6rjPY (height > 30rem) { + p { + line-height: 1.6; + } +} + +@container Jsj6BT scroll-state(stuck: top) { + h2 { + background: purple; + color: white; + } +} + +@container r3yzH0 (width > 400px), style(--responsive: true), scroll-state(stuck: top) { + h2 { + font-size: 1.5em; + } +} + +@container (width > 400px) and (height > 400px) { + /* */ +} + +@container (width > 400px) or (height > 400px) { + /* */ +} + +@container not (width < 400px) { + /* */ +} + +@container (min-width: 400px) { + /* … */ +} +@container (orientation: landscape) and (width > 400px) { + /* … */ +} +@container (15em <= block-size <= 30em) { + /* … */ +} + +.rPnlZa { + container-name: M6rjPY; + container-type: inline-size; + + container: none; + container: inherit; + container: Jsj6BT / inline-size; + container: Jsj6BT / size; + container: Jsj6BT / scroll-state; + --d1bVSO: local(sticky-heading); + + container: var(--d1bVSO); + --K6CLJ5: small; + container-type: inline-size; +} + + +@container qYFiUT style(--K6CLJ5: small) { + .r3yzH0 { + border: thin solid silver; + border-radius: 0.5em; + padding: 1em; + } +} + /* At-rule for \\"nice-style\\" in Font One */ @font-feature-values Font One { @styleset { @@ -3452,12 +3868,12 @@ ul { } } -@font-palette-values --identifier { +@font-palette-values --wdoIWt { font-family: Bixa; } .Fr8iIT { - font-palette: --identifier; + font-palette: --wdoIWt; } @keyframes Pns_CJ { /* ... */ } @@ -3498,27 +3914,27 @@ ul { & .Th9Hcz { opacity: 0; } } -@position-try --custom-left { +@position-try --PgMDE7 { position-area: left; width: 100px; margin: 0 10px 0 0; } -@position-try --custom-bottom { +@position-try --hhKfVV { top: anchor(bottom); justify-self: anchor-center; margin: 10px 0 0 0; position-area: none; } -@position-try --custom-right { +@position-try --KWLHtz { left: calc(anchor(right) + 10px); align-self: anchor-center; width: 100px; position-area: none; } -@position-try --custom-bottom-right { +@position-try --mwT4O_ { position-area: bottom right; margin: 10px 0 0 10px; } @@ -3530,8 +3946,8 @@ ul { width: 200px; margin: 0 0 10px 0; position-try-fallbacks: - --custom-left, --custom-bottom, - --custom-right, --custom-bottom-right; + --PgMDE7, --hhKfVV, + --KWLHtz, --mwT4O_; } @page { @@ -3539,12 +3955,12 @@ ul { margin-top: 4in; } -@color-profile --swop5c { +@color-profile --ROcANu { src: url(https://example.org/SWOP2006_Coated5v2.icc); } .Zq4Bgu { - background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(--ROcANu 0% 70% 20% 0%); } .w_hBjy { @@ -3683,6 +4099,31 @@ ul { initial-value: 40%; } +@property --_7d1iGg { + syntax: \\"\\"; + inherits: false; + initial-value: 25%; +} + +.b5xu71 { + display: inline-block; + --_7d1iGg: 25%; + width: 100%; + height: 5px; + background: linear-gradient( + to right, + #00d230 var(--_7d1iGg), + black var(--_7d1iGg) + ); + animation: _4FiJQA 2.5s ease infinite; +} + +@keyframes _4FiJQA { + to { + --_7d1iGg: 100%; + } +} + @keyframes _3XWMcj { /* ... */ } @keyframes/**test**/_3XWMcj { /* ... */ } @keyframes/**test**/_3XWMcj/**test**/{ /* ... */ } @@ -3761,7 +4202,7 @@ div { --pilraw: 10px; --Pns_CJ: 10px; --b5xu71: calc(var(--Pns_CJ) + 10px); - --_8NggIH: linear-gradient(to top, var(--cuyscJ), white); + --zMOaz9: linear-gradient(to top, var(--cuyscJ), white); --Xz8Zyw: \\"test\\"; --FWUVf6: yellow; --h5_X_2: red; @@ -3821,6 +4262,133 @@ div { .pfrK-J { } +@function --transparent(--color , --alpha type( | )) returns { + result: oklch(from var(--color) l c h / var(--alpha)); +} + +section { + --_5hZGZD: #faa6ff; + background-color: --transparent(var(--_5hZGZD), 0.8); +} + +@function --max-plus-x(--list #, --x ) { + result: calc(max(var(--list)) + var(--x)); +} + +div { + width: --max-plus-x({1px, 7px, 2px}, 3px); /* 10px */ +} + +@function --anim-1s(--animation, --count) { + --uRmi-O: 1s; + --_2c0Pw3: linear; + result: var(--animation) var(--uRmi-O) var(--count) var(--_2c0Pw3); +} + +div { + animation: --anim-1s(M0uhU5, 2); +} + +@function --outer(--outer-arg) { + --sVY4tR: 2; + result: --inner(); +} + +@function --inner() returns { + result: calc(var(--outer-arg) + var(--sVY4tR)); +} + +div { + z-index: --outer(1); /* 3 */ +} + +@function --narrow-wide(--narrow, --wide) { + result: var(--wide); + @media (width < 700px) { + result: var(--narrow); + } +} + +@function --narrow-wide-if-else(--narrow, --wide) { + result: if(media(width < 700px): var(--narrow) ; else: var(--wide)); +} + +:root { + --_93Jj1p: sharp; +} + +.Y4Gwu3 { + border-radius: if(style(--_93Jj1p: sharp): 0px; else: revert-rule); +} + +@color-profile --ROcANu { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --ROcANu { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --ROcANu { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.Th9Hcz { + background-color: color(--ROcANu 0% 70% 20% 0%); + background-color: color(local(--ROcANu) 0% 70% 20% 0%); + background-color: color(:local(--ROcANu) 0% 70% 20% 0%); + background-color: color(global(--ROcANu) 0% 70% 20% 0%); + background-color: color(:global(--ROcANu) 0% 70% 20% 0%); + background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(--lKXG0f 0% 70% 20% 0%); + background-color: color(local(--ROcANu, \\"./shared.css\\") 0% 70% 20% 0%); + background-color: color(:local(--ROcANu, \\"./shared.css\\") 0% 70% 20% 0%); +} + +:root { + --PJiFhP: #eee; +} + +.RRkM-G { + color: var(--PJiFhP); +} + +/* Just nesting */ +.yIfcPh { + --PJiFhP: #fff; + --YI1Kj3: #333; + + .mYBaWo { + --VLWr0L: var(--PJiFhP); + --I-Ywj4: var(--YI1Kj3); + color: var(--VLWr0L); + background-color: var(--I-Ywj4); + } +} + +/* A container context based on inline size */ +.rPnlZa { + --CSr0Ji: blue; + container-type: inline-size; +} + +/* Apply styles if the container is narrower than 650px */ +@container (width < 650px) and style(--CSr0Ji: blue) { + .r3yzH0 { + width: 50%; + background-color: lightgray; + font-size: 1em; + } +} + /*!*********************************!*\\\\ !*** css ./style.module.my-css ***! \\\\*********************************/ @@ -3907,6 +4475,7 @@ Object { "supports": "style_module_css-displayGridInSupports", "supportsInMedia": "style_module_css-displayFlexInSupportsInMedia", "supportsWithOperator": "style_module_css-floatRightInNegativeSupports", + "textColor": "--style_module_css-text-color", "vars": "--style_module_css-local-color style_module_css-vars undefined style_module_css-globalVars", "webkitAnyWmultiParams": "style_module_css-local16", "whereWmultiParams": "style_module_css-local10", @@ -3961,6 +4530,7 @@ Object { "supports": "qyhlLo", "supportsInMedia": "KHcaFg", "supportsWithOperator": "NQmDdm", + "textColor": "--PJiFhP", "vars": "--ZfGW2N I8Lkai undefined Uw64p0", "webkitAnyWmultiParams": "piVgU0", "whereWmultiParams": "n4-IgX", @@ -4015,6 +4585,7 @@ Object { "supports": "qyhlLo", "supportsInMedia": "KHcaFg", "supportsWithOperator": "NQmDdm", + "textColor": "--PJiFhP", "vars": "--ZfGW2N I8Lkai undefined Uw64p0", "webkitAnyWmultiParams": "piVgU0", "whereWmultiParams": "n4-IgX", @@ -8632,7 +9203,7 @@ Array [ /* localize animation using special characters */ .postcss-modules-local-by-default_local_modules_css-foo { animation: postcss-modules-local-by-default_local_modules_css-😃bounce😃; } -/* not localize custom property */ +/* localize custom property */ .postcss-modules-local-by-default_local_modules_css-foo { animation: postcss-modules-local-by-default_local_modules_css---foo; } /* not localize name in nested function */ @@ -9088,6 +9659,8 @@ input { a_value: some-value; } /* postcss-modules-local-by-default */ /* TODO not implemented yet */ +@keyframes postcss-modules-local-by-default_pure_modules_css-bounce {} +@keyframes postcss-modules-local-by-default_pure_modules_css-fly {} /* localize and not localize animation-name in mixed case #3 */ .postcss-modules-local-by-default_pure_modules_css-foo { animation-name: postcss-modules-local-by-default_pure_modules_css-fadeInOut, moveLeft300px, postcss-modules-local-by-default_pure_modules_css-bounce; } @@ -11726,11 +12299,131 @@ ul { list-style: thumbs; } +@counter-style extend-thumbs { + fallback: thumbs; + system: extends thumbs; + speak-as: thumbs; +} + +div { + list-style: inside; + list-style: outside; + list-style: upper-roman inside; + list-style: circle outside; + list-style: none disc; + list-style: none url(09a1a1112c577c279435.png); + list-style: none; + list-style: none disc url(09a1a1112c577c279435.png); + list-style: lower-alpha; + list-style: disc; + list-style: square; + list-style: url(09a1a1112c577c279435.png); + list-style: georgian inside url(09a1a1112c577c279435.png); + list-style: georgian outside url(09a1a1112c577c279435.png); + /* type */ + list-style: square; + + /* image */ + list-style: url(09a1a1112c577c279435.png); + + /* position */ + list-style: inside; + + /* two values */ + list-style: georgian outside; + list-style: url(09a1a1112c577c279435.png) inside; + + /* three values */ + list-style: lower-roman url(09a1a1112c577c279435.png) outside; + + /* Keyword value */ + list-style: none; + + /* Global values */ + list-style: inherit; + list-style: initial; + list-style: revert; + list-style: revert-layer; + list-style: unset; + + list-style-type: \\"★\\"; + + list-style-type: extend-thumbs; + list-style: extend-thumbs; +} + @container (width > 400px) and style(--responsive: true) { .class { font-size: 1.5em; } } + +@container tall (height > 30rem) { + p { + line-height: 1.6; + } +} + +@container sticky-heading scroll-state(stuck: top) { + h2 { + background: purple; + color: white; + } +} + +@container card (width > 400px), style(--responsive: true), scroll-state(stuck: top) { + h2 { + font-size: 1.5em; + } +} + +@container (width > 400px) and (height > 400px) { + /* */ +} + +@container (width > 400px) or (height > 400px) { + /* */ +} + +@container not (width < 400px) { + /* */ +} + +@container (min-width: 400px) { + /* … */ +} +@container (orientation: landscape) and (width > 400px) { + /* … */ +} +@container (15em <= block-size <= 30em) { + /* … */ +} + +.post { + container-name: tall; + container-type: inline-size; + + container: none; + container: inherit; + container: sticky-heading / inline-size; + container: sticky-heading / size; + container: sticky-heading / scroll-state; + --my-var: local(sticky-heading); + + container: var(--my-var); + --cards: small; + container-type: inline-size; +} + + +@container summary style(--cards: small) { + .card { + border: thin solid silver; + border-radius: 0.5em; + padding: 1em; + } +} + /* At-rule for \\"nice-style\\" in Font One */ @font-feature-values Font One { @styleset { @@ -11969,6 +12662,31 @@ ul { initial-value: 40%; } +@property --progress { + syntax: \\"\\"; + inherits: false; + initial-value: 25%; +} + +.bar { + display: inline-block; + --progress: 25%; + width: 100%; + height: 5px; + background: linear-gradient( + to right, + #00d230 var(--progress), + black var(--progress) + ); + animation: progressAnimation 2.5s ease infinite; +} + +@keyframes progressAnimation { + to { + --progress: 100%; + } +} + @keyframes \\"initial\\" { /* ... */ } @keyframes/**test**/\\"initial\\" { /* ... */ } @keyframes/**test**/\\"initial\\"/**test**/{ /* ... */ } @@ -12129,6 +12847,133 @@ div { composes: a -b b- --c c-- _d d\\\\% from \\"./classes.modules.css\\"; } +@function --transparent(--color , --alpha type( | )) returns { + result: oklch(from var(--color) l c h / var(--alpha)); +} + +section { + --base-color: #faa6ff; + background-color: --transparent(var(--base-color), 0.8); +} + +@function --max-plus-x(--list #, --x ) { + result: calc(max(var(--list)) + var(--x)); +} + +div { + width: --max-plus-x({1px, 7px, 2px}, 3px); /* 10px */ +} + +@function --anim-1s(--animation, --count) { + --duration: 1s; + --easing: linear; + result: var(--animation) var(--duration) var(--count) var(--easing); +} + +div { + animation: --anim-1s(local(bounce), 2); +} + +@function --outer(--outer-arg) { + --outer-local: 2; + result: --inner(); +} + +@function --inner() returns { + result: calc(var(--outer-arg) + var(--outer-local)); +} + +div { + z-index: --outer(1); /* 3 */ +} + +@function --narrow-wide(--narrow, --wide) { + result: var(--wide); + @media (width < 700px) { + result: var(--narrow); + } +} + +@function --narrow-wide-if-else(--narrow, --wide) { + result: if(media(width < 700px): var(--narrow) ; else: var(--wide)); +} + +:root { + --mode: sharp; +} + +.apply-sharp { + border-radius: if(style(--mode: sharp): 0px; else: revert-rule); +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile local(--swop5c) { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile :local(--swop5c) { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile global(--swop5c) { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +@color-profile :global(--swop5c) { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.class { + background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(local(--swop5c) 0% 70% 20% 0%); + background-color: color(:local(--swop5c) 0% 70% 20% 0%); + background-color: color(global(--swop5c) 0% 70% 20% 0%); + background-color: color(:global(--swop5c) 0% 70% 20% 0%); + background-color: color(--swop5c from global 0% 70% 20% 0%); + background-color: color(--from-shared from \\"./shared.css\\" 0% 70% 20% 0%); + background-color: color(local(--swop5c, \\"./shared.css\\") 0% 70% 20% 0%); + background-color: color(:local(--swop5c, \\"./shared.css\\") 0% 70% 20% 0%); +} + +:root { + --text-color: #eee; +} + +.simple { + color: var(--text-color); +} + +/* Just nesting */ +.theme-dark { + --text-color: #fff; + --bg-color: #333; + + .button { + --button-color: var(--text-color); + --button-bg: var(--bg-color); + color: var(--button-color); + background-color: var(--button-bg); + } +} + +/* A container context based on inline size */ +.post { + --themeColor: blue; + container-type: inline-size; +} + +/* Apply styles if the container is narrower than 650px */ +@container (width < 650px) and style(--themeColor: blue) { + .card { + width: 50%; + background-color: lightgray; + font-size: 1em; + } +} + /*!***********************!*\\\\ !*** css ./style.css ***! \\\\***********************/ diff --git a/test/configCases/css/css-modules/img/shape.png b/test/configCases/css/css-modules/img/shape.png new file mode 100644 index 0000000000000000000000000000000000000000..b74b839e2b868d2df9ea33cc1747eb7803d2d69c GIT binary patch literal 78117 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

T}Ke+!9t-m?i2X-;f#-{#p<{2~ia zdcgIc-$Da~n#V;jyNzcrPviVY%c>uyv&<8FNmEhfKi~C3NVJ^uqvO#rX}8OdDcz8U zN2w0c-YMCP+_qwSdEt%U1Fa-_IwmF-?3p7HNhlHXp^J*-2bC=UPCD=!nh%`AwVLrE zcTouWr>nQCllRN}DEq?B_@b=Ud~&pDK%!dD2sX3ADv3?t3AfHWlWnv!RmVKHmvS_p zZ!Ps4tJw|?z9yE6o%Bhy{0DSk+1v=>iAMkQ<8-1t%wZRP`J1NS6CeG5byi4uWzjHW zjeQtP6-G?9b#0{2y%GXX4WR&|6RI zOcQA!Ep(iBax268m`jcf>Tb?IKEIoYu?$0sxY;)#?|S)tR;kL6@{(I-vmQMV&LPu| z=R{P`yX&a?u0tFIrP2d;<#N}}Gg9q-F(H`OjNTyi zxv3CdQ|jy5jjN$C$%%K~GTdeA+&})aZplcnaK7?vO?LmzP$zt4-5PBpD2hFh7CMxA zj7{!)Z_(X@gZp%Ng=sRzCT&(kMu(1ht6a=JW4W?ft65KHeRk{3h|}R^V)JpWe7y}$ zC2WitoP@G+0xa~X7qbUn*X^T8B3WhZPs3I>ug2jqq025M0Y?egxof8~MhpUltQNj0 zxAQdQPl9Fu9<=}lpP|7z`+}9 zYh8S0*QNyX%XyY%dXmh+0S4dVnm=3TB)5{p?r1f>o*QTA!JoOT4Hp|3unPYhdjZ+- zJc3Q8wUw0}ZbTXb*j}n;JLBl+HNp;H%+t`61n}!-&Co+>iHg!H=;|&PBE~9;`$HJG z_hcu1vd}QO!R+Yg|5mOW+?$sNGjJ4sRu9|=qy!G!6bF9b)9TRi$=*8e{pWalQbEHj zRDvBBF#!(6RyeDNf(XhbFRGlv@vKbWji4G4f0uV#w1<2WeD6>TCW@}ZPc_r(UC_CLc+qlq#dqbJ> z=zW{L?a{CQX4f@G_YMt>t6WJ|N;ha9e9w+DorRn_zpXDZ8ifqnR8*fUmqZaf^S%*p z?lT0XcB3DL9)Apo42+-Z_VT_aOjEi#f6#T+AWB)@9RE4dcNgFkhQo2YYLMukuzQ-u zC~LkYE@A=nx17Ai$5m=vk@b(xq#_$H7rm`c$SgztJ_+NB8 z_txE8@w1Aa#;7%{?H^Tqr=QQ}X=Vj3;`j?Se-v{?b(Yu9l$wvjY#<|k4!QpR)1T_w zXscm%0tf?_1vM{bU7%OQ$GTbc>xmeTQl!kZRU&d7!=YC}j){gb&{NuUI*U(m_Y$_W zVX(Tscz{ChPmC7Wzrqy1{CUOlh?;Kgl@s+nSJrDOv*?l3eQok9%%$h*b>V3AKlqoh zp_Vsx=82S?<+goPczst5ExS5q%LBRWJ=hf;@k(>AXBbT*brV&@x$qJv%)#1O@-PA2~ zVd3P!l?wb)CpY}QI{vBv_KjEs?cZgv!aA8y>ku*un=pT+kHQI7PIkFbPrf?KAOhJ0 z*l(r1439{2u7x`48sv;ygB1LYgC*C1!g|rjSOZzSL|rJtl0o_^14 zwnTrGKPPlb7Er-8utmYUstC`;|!ng(cjM3r3v>JPFCihUWLNNOwMw+ z1CZW}nGvS&xCckW+lp$B8r6@w|7ZOQ5G!p)C!;}+Gx78K0UG=Bh$6__4yk6OUxs_-h5#L)-(8wV3SjBNr(t*Yc6fGMC|&*K^7_O z_n@8MSppqJhK!GV5cBJ7KE=w}Va%m2;WI^qt+iqcc1X;xCPWV(i>Iqhr&?@eRS%2K zf6T&{xF|W~z!gU3`R?IctdX;Vm9@Ktc>SE@v{`Yf^b|E+uR_Qe_TcOc{dPyii!&i1 zLDjQ;?sz7jX(Q{)wSh^>5u7S4r3*6OX;naSgh=Kt0yv@w;K;OT(d|ns5`kmvc{E3f z+^E_B1{9V|8IC$ zp8c;@ii*c1f)i~FQnf2s?r9{rRj@#GT9{qJL@COjPl6Dv`>nsehX9u!o(Ueg;1xx5 zCUC1HJ1SM@;B_7U5v9zf5G=s+mIYGg7D--y%xEZl`ozQ~+1oyGKULeM@!=a3hA2}} z6+WLZNoy^T%#}m6aCx=VKZmtR=T?0yp?>Cy*q)PEsWk_8dQQ&imYQeKU05f)EI@^d zL6UA*C$U5aBKZ)%^u%DGqEGcOJ4lT0D)o2vr@7_UdO-sZU_3eJ5H5-#%zQ2Q=N3xV ztK>+bv26aVqtvD!jNkm?CYX734~frf(g5`w7!fGNhOYn26yHJ$ulcZmfS3f=OqaE z(RD7fp8hg74&(o#&`bCUb2yv-Sx+K`gq39xjcBKmGla|MxPYa@O_nr+)T*mzr?E<* z<4Byt`6@A`p_*aP4}}<2U5@`w3nW_7-@4bd2+cA3VW8SY%CcCn+>uLNr*c;xo4^xH zkRwy9{jtCw5ExFM8!<;Gnd44zgt<+q(K={`UhvRFCw^FI)OKf3#QD_E-`huSg}ZJ1 z&C&8RO-rXzInaOJdrtJFP+`Q#y)+gXyp$WGPPyJuCM4a(x+O0fmym4&?B6B_QG-=0 zJ-;UUa*ptJxi)>22lhA$cB{j0VwtPa&1Uggl7<=F09pmpiy*RsIJC>V)kl3tt&@21b&7;=k zb%)Ikc)@RoETX2R2rH$0u{J-Q##DsfrqkO3w#V#R$i^rePZ58{ z)94>kb4IW#;z%c%JHce)Flz>C%5{wM*IS@ws%|e;0tAep9`V7H>tjq{)P`p%5c~{C z3V>tnSc%Grts$dQnNb)#@1Zwv1S`PfcN_pltH|=a)4?*GHA^vl z8pGV{;3NQuymKm9Kr}a7N0}-el^aC^QPSt$4o1aEzGp1Sp66Lp4M*8!^Xd|~ zc22G;2}KOTfjK4@tv@K_ZkiIK6)~a8d3vP){P)II`v)S=wlUh6%?!9HcO>hw2u9I! zph6D^guy5CJrN$0yj;ezuie6YP$McTWl5r9bdz^JzidGVm=9x>;g2tg907r`^_JEt zeG{Q8-hSE9`(>xlCLGa5rd?I>|K@j}c}V6%6SI=xxo*EESH9_obFf~Yj0zvGnPsAc z&ptaIQ##P<>r;k6Wbc-AgXx)^w}|eUBchH=G-j|*z3J8OWNyS;BmH3-GW&n_Q=^(& zz0NnVl>pz^@e$JPZ9++CQ!B>Y#$oW!QEDyckM9#}1jXqsX9#9uZ-4qzfW$cRibQJs z*;`~e~c2j~+9)*7QP2AD;jqz%~U6ho# zoh4zp=#R7_ESH=2O&2#MEgbQKJ<&;?$JQ~ITa0F8!EL=4?m#p{N$B?jlIZG~z7oWt>iS?+)qq2yJkHu*{WcDOhbvNq57{pn5d34B_Gn9hqu+UrN@YO*54{dX02>%VFMJ%}C5eu} zjV&fcC{}FXerbYAPC^ue;&Hj_L6IZ4fqjhM%whLAx|rz>`?*8hfe^QowAZX2v`*Nw z>w|o~m48B)*|O1dhzVCsLNUv;>o{lQ;Z-0(Ztw@gUDg>Z5m38UvsnaQ2&Ad9g#)X) zqZvR~&1YARG9l?)67b{Sbs(aQP$@~$^+~IZz8M*-^Ux(&rrFt3*j{3={dt)b*`!X@ z#9!~#MxZIN+^N_&5h`u-RFhuuINus?vup0sG#T)=nbzS;MWDb;`Zc?sBMG`` z9(79pNGEeow&QrpRMAuLy%&jA)}2F3oO2iq%IHwYfWqjPO?%_B`BJz~0$NVqlTg{NP?T2R0 ziR^Mz?5Hyegdg>b+`n2V@b@$3SM|RlwLaMr3hL#!W^A|XUa0$CO+hsD>lzoqIKB25 zk>lO~g(q2p0Pu*(2f#zO11Y{{^2seS1$gNNL}$@kP3)65_X{XCGJHjAVjm*Ne#^kw zRm6E0bh;(w6`4S=NrPUdMhWho`~jSRtLiGt)zi4Dt{;Dy28;eM;?&+V(yFpK{sn(o zXJH*dH$AG@5y5PCe3fTH_BmHHegIKMJ(|5N4(C9ZVEoB?zGl)Oa=KD zg_+ar+#p?2pbC}~T_;gYy0>aWsXvaUwDlp*rPxlyHwNfX?XB^IKIzFO#RCu(@V?n` z(Q}u4LGTz>NrGv?=a|HsGC?z!u?d2rA&MZ&tHL=Upq8AO%n^m}!8e3lmyeY;tIv3Q|7gK#@Rg2{M4$yN{}n2x|APY1k7F`@z5ewf^=9_Ja>OLZ`+(!vd@ zP4Dn%vZ~Q2>T7VyfACH488E0A7O$ev#6v6maJsPBk z*r2z}?N4eucsAZ=6KgWN=9pxD z{sM5V;Gu{<9j!m3yew8o5TtC>Xf{V8lagXHd+k;HC-weMr5mz~LM9#_pRLJ>Euz zN#1qGJEWilSQsJ9J6Du8&9j!+oQ|r{;<{6{fex9W0PP zmt4|XEFolj+yG?=K#w^Xv&C^C49L_v(pzAcGvjqzk(m3!oMt=`O;5q|Ls}BF=Xa zR;bKh#<7<*a2r6*+K3>M>@zg~Ly6!zjT101Ckq;EfS_|?alJaMGIU{O0Bwg(bkB3< zboJamiQlihFq-RW^c>5dBYVSBCU7)Y$tQ7&8yUpXpuQOg$EnizsZ%8Qb~qp~IpYkx zOSD7&!-b5Kc99df)D<{$ZxBSEtG-2s&~lqWhPMOGeD2m%c~;11#m(beq9;HSzqzAYS zN5;-G0y_+JnAwgM^|-!#?`<)zx%DWBc=PK8X4k0(5bTYX1(I?^VRjBK(J=x!>eo6} zwE&OH8|rn8r%?}G=;@2wp5dq#=KzE^B2X}q1uv1^k0rPPcr1-Qu2siuFkb8-N_(3z z)+rx&oC#+hvo@(+ZATr-07xom=WQ>{?n6nzZ{@@6c8sF~%~R{b?qn2am8L-ll%eDx z`8@0;0?iG03~(7Sr3=Rj5HjAb_?u+om9x6aJmYa1PG>rg1p*X%s~aN|TeRAK(qQp5 z76Ao1+8a%?e$r)={d4Qx1D-1CFZe6csn8}QKIlG8yI2WE`w~55^-U1Wql(&Y;fM8P z5C7_lAhLP|oY>Z*R;pxOXdN|L!WS*=MV~_5OI5e()kMT3!w8*vkf%@|u zpukYLhO9Mx@?%ulx{bn44~e4+@x6;L4h@$@8ph@?cr^sMz;w**@9B?-gSJU?f`q@X zRk^SASRp8XokQ@?6mkoGH|pFkm}3E|DGDOdH*N(F#lew5Wl$&G`gP_Jp8S&6*u?;A zpXI=3F5VreZtL-Nb|nB|p%6G!fNLBFD1`c@u)1qf`cgzE&{27H$fYHwZ}hvV$}CNf zta!mG^c;FKU9ctC*a6zm@CGU-c`7PvruGEJw!2cTL9GL>3!Dk-pcsy?j(9uxv;}^11o4P_2 zplwn8zIo;t;4&&MO1vrETb)$`Qq?El$@C+TfO;dD$H&h&b~rb>_iC;vmF}(XJrb!* zNMKUR%2<8N!e#1TXCbQ`1bv-{t5FN^jDZt-MBLHkV?@GBZ|anK7=Rm%r(~W0Ztw`X z{k;Yr`%rUGA4pJN7MR$wd`5+Np59(Hm+_yi2E9-=4m3@EPN)uofMq4Kc5)c`xurM) zHQ`Am`jUGJYul+#j83w!PO+zzabduXHk70+3j;AUR26s$7ivu7eqEH8rRl$Jx^B@s zV?U*h3jPzBK@b!KIgpJSMFRyBRz&Na@ijUEX(ra0Ck7;+Tqjq%@srptKx#PThFQJ6 zNeVjNtm%TFHQ|pN&vJ6bE0=|H0KJ+l$4Qy{GZ0h(b@)(_kniw%XNbvT5;v@(m^kA6 zF8@QcF7=_-&a+ovcuzwmM<86U6pbRZb2cGG#Aa+Fh9nXubzH(|=r0=T-ITM01b3rT z{Jd+eezOo9WVKg(wUHY|X!EmM|6KHSPYcBFvH7CmRp=1jin@y0!3fy2%M9KiZN+_b zSg$8wx4f<1l}PuhTVIFvz!q9A>7%tDtUQQXC_Yf&F#!}AdXEYU#xo8X_vX7Z)GwGX z3;s(oNzh+?yaaJPmEt7>BA`WZg9O|~-T^(>0%CBV{i=ldUsv>!oQiI z$u#p-#p;>7h+V!Ow5!S{NybZ9gmfU*GX*r(h> z?~jcKpT_Wq;d_pv1*W5cOx0++tcU{sfSi6>;3*IY7b_$;&V>-P%a}WG^#UPud8>;s z-JQc<=#vOe=iZp-{(svC34St9n5(^>q2D?ZQF*xQJ6-|(q#g(JOKA~=SGYrgQYh<)5$#JljJ zh0K0^6FJIv>0kBYtsqSopc-D&1N|P&GZqQK*vgV`f|#upHgmgrvROC33mIfU9%!l; zALrqD>wb$YmOTBahI}>WRgoyWn<*sS`)N)4F-qc4^7bkz>rv>sFrIuC*2 zEb>LKnGs;qh`UulN`?SeoI?SfNQ%py00Kn37@_hA{WT!7H)&N8eo(WOm@-AFH^Wve zE`7B95b`+KP0T*a*88Fcuhb0t6G|ZBn<#6l{TeP-^l7iz^YA^^lS_1Vt`tsiFwj-ybi2TU&c- z3YB;@Ir|rSC3ADZo8veiGTunhuz{Y4w$O+unGMFVWB*?QDt`9zFy6ErkdqVbAP;~} zO*kaE{c+MoEN=k|kL`zkf$sEFk+z;cx(^(hPlSu{X1pg9k3mZWLl(>G-Xd~m;)p5~ ztc?=Jn|@OSo^ zA(AwIFOPL41LfmdVBU%;+UiX4AJ#ypA7xZI9a(~T&V-H|61c?x9bHsR&B~pCl@({F zQn9ZMy7SG|sw?LLYv_;|Hre-Xr~Z$BGeCl#qa1`80TA4MB69(urb%P@2B~v21*$Xe ze(d2j?Pto+6_6OpsG99>ftli~k@02RDXnAU#0-_AR=h|61dV3?TN4}f=_GEPsee}+ z)q=8{$BU+bBJioKpnH_%-2)>iF&X)vn0$mR#8ZA|4+k<%4kC~>crN0&A zn*;#!g+ZvzfustYXsCVF)<;Ykp5(CmuNba*Q)4^MjTC@;T2$J4j^&oHh=bjgS@HX^ zDvLK!-o>OiyO-5u%QI`HdX3l#5Y2oDP#cK4$hG_X&pn{w95v`ku0xz@VGOyIL~L9O zOrqq&OV zAv!_25NHc$lrWMo@TsvQ*jQuHdDTokTMT8o62Y6|$Hk#NNP(XHRa=-U2 zSRbE`6I%_|Sd#kXOM>s|CR&Zt#voJRBtSDhkV$O1!A4M0&go2;X^ z()dfK(LmpUht_cFwp=Lw8vJ_95j+$5xoZ3`tgSThNsOmW@a(GMWyec^#PZs`kJ=-B zC);a^L%r7@=NSBhSpEig>+_tl&wXaXl5~V zOsR^re>)GgA?XtDLD}WL+H!w$qkQ2O5LOVZw<>V)aTVf_ps=^p>jYNi5Ae|_HBX4VevB1UGzSNAXd+mtZtGe%+=hG#AvIaL zEw|9g%s~J`GHK6_l_=23CH$=9g)Kd!A5bxoa12#Y{kXqN`16NdC&X(sLg(S?$pq~3m@MT7k8}!? zip!Jrk%SPT(G+Skx5UJh)oPoFwYl@jDM5_7sNtWV6sB_jZzs}K<21N^pL zcWveaafUoAuZ?G9tZi749ae02UpB7A`$N_->-x>yyMy78d2g}1PJ!z6s7hSK!*Nr8 zS3~r=702P?$LHyL)gd9{i~i2LMY+i}+sHgJphR6J`dwp=!Qa24{Gul5KTqw-UFu2s z)o_19Q{lJPs@{22ZCe!B@%W+fv7P>KHTcBe>z;q(Q$qH|Re z@va7UO9<+Y7fYQKnhrG>Kh?Eo(V$lS;mxJ0&9PpGV5_}nmS^sv_*Zu!Z-ZP98qz?J zo8J!gHJef5Z5LF6J6Kv-H6k6K9vap20&mRLvY|NRz#qSQbIepnx~;*c?TJ;p9(kbK zl=pqCyh{r6An9#*(4yJgUI9=zj4gm};;&y~utX+6xxr(B)FP|Ad^s>5IYDrkH@NTb z__3{6dVe$Pjn*yXw27M)`Az3;GN z%nDcO(^2;Y5fqk?M-lc3?$mNt;))E(Z}ng^)m>h7J=!|?`$rq4=N}zE+PP5s4C>7M zfB)!JV`gYBN?VQI9)0P3e;oOop5@~&65X$#PZtjuA}P@}$x*#iW3FKYICfxSs277; zH~ZNQDoZW)$kwJ}3S$D2nwIA+qpp@q_eq_)ItDF6h6jTThv906kAf-$x<+c+CRL-) zG0;I10=+E|m}-XFS|T7E4#Kqs=E8$8?{Cb4y|XaG-I5|RbI%7l zYPQ9`-@~}*m|>Zh7RTd(bIOo{?2MJ4)g%fIRWc~(hT6eVe|8e7K;of}JVXV?TLuUf zt!np=`%cA$|kT@AFIv~vIk|9-)r!|l$!jf57ziPdpBjl?+B*RxX z9f&JZinA*f!4pcLgaY@>{bj4WjMP`J5JHNEmwbeLB^E!(odD;9>y$@fYG#qpMgT3h zwTC%LC8X+}BD)fqghBMrA z><&@`Efq3-Qb|mM9SbREM0@nU=@3d2g|`Y9)-e7T>I6@KeU`)7Gofg=D8~bT`dR#@ zpaij(xZU&5F6MX?3vlaw{cSCfB5hd;G=4;l@+1MRD!@D~>c#Ax7wK67^_Pi1hzwWV z{L#3sLoC*5voJzF3_Yx~&>Rof#F5rP;@`?=?I>1+taL3;F2o#b{=?{xuV$sb^raCF zrIfT(5+Idl3H%2r?$%3!ULOjuf&!=0-7S%2x5>xrk;4PA_kG3! z0!qBM+B5Y`_tmWgbSO2I_ije(EAb9;U(6P>!w(`kdla?~K9A?7j=v{@z_kS)VCXQN zJKFiM#pLZ8^p4O%r+>&6Nn8o)H*5yE!jPK_C76Yny}Xs`*SV_8l>g|@ z9GKymU^&lk_+73d7|w;zx9$jjBauY7^_TblxmVJt+$G94xa4$-QsrtM z$4$tW*1U1-%q76V{E?9J;1H1B6;gM_`^YD$1r2}utjMD!af{iLi=jfkhZS$BJA z#9gPIxjvm*)D~H75&yyvw07l%_uXfO={;6Q% ziU|g7dv4am+eMY=E}8JlB5aL_cyC~T=L5M`(19nC_RPrS8x1P~VVA<>l1?j!=?6L5R&Vw<8LU9Q6K#X`}8eN|(b5oLAx9kTr6C&pDs4_f5X& z8i=D*5;ADNyHS_mMLfZQ>>cz29`)B!BgCGC%BIFMWva#jZM%p=+szUYh28iFZJ)xT zAUxn85#^q$7MIFtVc3KV+`4OrY3R|oK~foRf>kscFdWNgbSeRV{P ziZ8iS7W%ymp4{W#mhiMgCtu-oT|zo@K(|tq`1Lgn6=jyOs{4=ONg?=3%n6rvW4z%{ zc+E;%n-*AW2IK%V$NPSX0_roEx$qk6>}I#f%G(+<+sYFX@pmmYea_>2C*(UN8cIw9 z>jxqUg3i}{k!Q{eB0=#JfPQuV55d%y>d{T_DOL)+qN?W|+vu8B4rRB*5a1Ia&OPi^ z?VtirxCgL&;qdP4HCwAdrAk+0tkJE4)%)l=@~3-Yhz|kkkC2?`@E%e+g8W%aq9C`a z{*xag#rsYtv_rhuOCp6i_5VTAeroSCd0mOuyn4Vk$Rr1!x(AKWJ_iXxP5mG% zTVw$o#JrU){dUm1=$i91s5%I=TrI4C6Cm2tpj_$Ii@-+!=zq_>sBkY4C-$Huq84y+3)Fd3aJoCsaV^=q3LC%8 zcYk~|(WG1;C^T?eMJpl@JP&E|yP6|(2bl}xQTa+Ns3@g}1` z3YpF4y%Eb)A?0*&_9^|1(euwaNgbgJyg2bssbv%F6uG8P#1I+c2J(UR)!1nU(&kp4TUtGMclh^og20peUZ`YYWg#R zfz#EFJ_t)Y@BlK>(h?tJ5uPqO=jSz@XJgqeQuLtI;J4K zm@2bAsYp)O*s+5m=<@KW{6)J3KOtXriRN8J2moNpf)b>rwYR=rH|ly2JLnzDzi1U1 zF4IaIw_UraE(K|F+s*IgVw8Deu58* z^?A?%94SaqUSpRwn27%WV|a@HCbADxkkh9-Ttbc9@oLl*o{?f zj1wWy>1WacGd1RB@2c%KjJGw<{(lPJil{QJy0&-Hx=hvYu*OonlSA60XC3$=|A!qy z0VSb8l)aCUs{5u}SbtHQakcb;*gQ1L_?p(J)XIM{zL@tBKGj^eGoihD>GaQhK0F|f zQ>1(P=5ge5wcly!>+Wm3Oy}d^D;f*R^w9|$w%3pMSSbd)59H 400px) and style(--responsive: true) { .class { font-size: 1.5em; } } + +@container tall (height > 30rem) { + p { + line-height: 1.6; + } +} + +@container sticky-heading scroll-state(stuck: top) { + h2 { + background: purple; + color: white; + } +} + +@container card (width > 400px), style(--responsive: true), scroll-state(stuck: top) { + h2 { + font-size: 1.5em; + } +} + +@container (width > 400px) and (height > 400px) { + /* */ +} + +@container (width > 400px) or (height > 400px) { + /* */ +} + +@container not (width < 400px) { + /* */ +} + +@container (min-width: 400px) { + /* … */ +} +@container (orientation: landscape) and (width > 400px) { + /* … */ +} +@container (15em <= block-size <= 30em) { + /* … */ +} + +.post { + container-name: tall; + container-type: inline-size; + + container: none; + container: inherit; + container: sticky-heading / inline-size; + container: sticky-heading / size; + container: sticky-heading / scroll-state; + --my-var: local(sticky-heading); + + container: var(--my-var); + --cards: small; + container-type: inline-size; +} + + +@container summary style(--cards: small) { + .card { + border: thin solid silver; + border-radius: 0.5em; + padding: 1em; + } +} + /* At-rule for "nice-style" in Font One */ @font-feature-values Font One { @styleset { @@ -1025,6 +1145,31 @@ ul { initial-value: 40%; } +@property --progress { + syntax: ""; + inherits: false; + initial-value: 25%; +} + +.bar { + display: inline-block; + --progress: 25%; + width: 100%; + height: 5px; + background: linear-gradient( + to right, + #00d230 var(--progress), + black var(--progress) + ); + animation: progressAnimation 2.5s ease infinite; +} + +@keyframes progressAnimation { + to { + --progress: 100%; + } +} + @keyframes "initial" { /* ... */ } @keyframes/**test**/"initial" { /* ... */ } @keyframes/**test**/"initial"/**test**/{ /* ... */ } @@ -1184,3 +1329,130 @@ div { .exportNameWeirdCharacters { composes: a -b b- --c c-- _d d\% from "./classes.modules.css"; } + +@function --transparent(--color , --alpha type( | )) returns { + result: oklch(from var(--color) l c h / var(--alpha)); +} + +section { + --base-color: #faa6ff; + background-color: --transparent(var(--base-color), 0.8); +} + +@function --max-plus-x(--list #, --x ) { + result: calc(max(var(--list)) + var(--x)); +} + +div { + width: --max-plus-x({1px, 7px, 2px}, 3px); /* 10px */ +} + +@function --anim-1s(--animation, --count) { + --duration: 1s; + --easing: linear; + result: var(--animation) var(--duration) var(--count) var(--easing); +} + +div { + animation: --anim-1s(local(bounce), 2); +} + +@function --outer(--outer-arg) { + --outer-local: 2; + result: --inner(); +} + +@function --inner() returns { + result: calc(var(--outer-arg) + var(--outer-local)); +} + +div { + z-index: --outer(1); /* 3 */ +} + +@function --narrow-wide(--narrow, --wide) { + result: var(--wide); + @media (width < 700px) { + result: var(--narrow); + } +} + +@function --narrow-wide-if-else(--narrow, --wide) { + result: if(media(width < 700px): var(--narrow) ; else: var(--wide)); +} + +:root { + --mode: sharp; +} + +.apply-sharp { + border-radius: if(style(--mode: sharp): 0px; else: revert-rule); +} + +@color-profile --swop5c { + src: url("https://example.org/SWOP2006_Coated5v2.icc"); +} + +@color-profile local(--swop5c) { + src: url("https://example.org/SWOP2006_Coated5v2.icc"); +} + +@color-profile :local(--swop5c) { + src: url("https://example.org/SWOP2006_Coated5v2.icc"); +} + +@color-profile global(--swop5c) { + src: url("https://example.org/SWOP2006_Coated5v2.icc"); +} + +@color-profile :global(--swop5c) { + src: url("https://example.org/SWOP2006_Coated5v2.icc"); +} + +.class { + background-color: color(--swop5c 0% 70% 20% 0%); + background-color: color(local(--swop5c) 0% 70% 20% 0%); + background-color: color(:local(--swop5c) 0% 70% 20% 0%); + background-color: color(global(--swop5c) 0% 70% 20% 0%); + background-color: color(:global(--swop5c) 0% 70% 20% 0%); + background-color: color(--swop5c from global 0% 70% 20% 0%); + background-color: color(--from-shared from "./shared.css" 0% 70% 20% 0%); + background-color: color(local(--swop5c, "./shared.css") 0% 70% 20% 0%); + background-color: color(:local(--swop5c, "./shared.css") 0% 70% 20% 0%); +} + +:root { + --text-color: #eee; +} + +.simple { + color: var(--text-color); +} + +/* Just nesting */ +.theme-dark { + --text-color: #fff; + --bg-color: #333; + + .button { + --button-color: var(--text-color); + --button-bg: var(--bg-color); + color: var(--button-color); + background-color: var(--button-bg); + } +} + +/* A container context based on inline size */ +.post { + --themeColor: blue; + container-type: inline-size; +} + +/* Apply styles if the container is narrower than 650px */ +@container (width < 650px) and style(--themeColor: blue) { + .card { + width: 50%; + background-color: lightgray; + font-size: 1em; + } +} diff --git a/test/configCases/css/css-modules/use-style.js b/test/configCases/css/css-modules/use-style.js index 73aa0fb68..b3b1f1a98 100644 --- a/test/configCases/css/css-modules/use-style.js +++ b/test/configCases/css/css-modules/use-style.js @@ -58,4 +58,5 @@ export default { exportNameOtherFromKeywordWithFrom1: style.exportNameOtherFromKeywordWithFrom1, exportNameOtherFromKeywordWithFrom2: style.exportNameOtherFromKeywordWithFrom2, exportNameWeirdCharacters: style.exportNameWeirdCharacters, + textColor: style['text-color'] }; diff --git a/test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.local.modules.css b/test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.local.modules.css index 352d27c92..e2004906c 100644 --- a/test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.local.modules.css +++ b/test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.local.modules.css @@ -183,7 +183,7 @@ /* localize animation using special characters */ .foo { animation: 😃bounce😃; } -/* not localize custom property */ +/* localize custom property */ .foo { animation: --foo; } /* not localize name in nested function */ diff --git a/test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.pure.modules.css b/test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.pure.modules.css index d79ce9873..1d0555529 100644 --- a/test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.pure.modules.css +++ b/test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.pure.modules.css @@ -1,6 +1,8 @@ /* postcss-modules-local-by-default */ /* TODO not implemented yet */ +@keyframes bounce {} +@keyframes fly {} /* localize and not localize animation-name in mixed case #3 */ .foo { animation-name: fadeInOut, global(moveLeft300px), local(bounce); }