@master/css 2.0.0-rc.51 → 2.0.0-rc.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/rules.mjs +1 -1
- package/dist/core.cjs +86 -2
- package/dist/core.d.ts +3 -0
- package/dist/core.mjs +86 -2
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +1 -1
- package/dist/layer.cjs +7 -6
- package/dist/layer.mjs +7 -6
- package/dist/rule.d.ts +3 -0
- package/dist/syntax-layer.cjs +7 -4
- package/dist/syntax-layer.mjs +7 -4
- package/dist/syntax-rule.cjs +36 -110
- package/dist/syntax-rule.mjs +36 -110
- package/dist/types/common.cjs +2 -0
- package/dist/types/common.d.ts +1 -0
- package/dist/types/common.mjs +1 -0
- package/dist/utils/are-rule-selectors-equal.cjs +6 -6
- package/dist/utils/are-rule-selectors-equal.mjs +6 -6
- package/package.json +1 -1
package/dist/config/rules.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import cssEscape from '../shared/utils/css-escape.mjs';
|
|
2
2
|
import SyntaxRuleType from '../syntax-rule-type.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import { NUMBER_VALUE_REGEX, BORDER_STYLE_VALUES, COLOR_VALUE_REGEX, IMAGE_VALUE_REGEX, VALUE_DELIMITERS } from '../common.mjs';
|
|
4
4
|
import autofillSolidStyle from '../utils/autofill-solid-style.mjs';
|
|
5
5
|
|
|
6
6
|
const rules = {
|
package/dist/core.cjs
CHANGED
|
@@ -90,7 +90,7 @@ class MasterCSS {
|
|
|
90
90
|
for (const eachNewSelectorText of Array.isArray(eachResolvedSelectorText) ? eachResolvedSelectorText : [
|
|
91
91
|
eachResolvedSelectorText
|
|
92
92
|
]){
|
|
93
|
-
const vendor = eachNewSelectorText.match(
|
|
93
|
+
const vendor = eachNewSelectorText.match(/^:(?::)?-(webkit|moz|ms|o)-/m)?.[1] ?? '';
|
|
94
94
|
let selectorValues = this.selectors[vendor];
|
|
95
95
|
if (!selectorValues) {
|
|
96
96
|
selectorValues = this.selectors[vendor] = [];
|
|
@@ -522,6 +522,89 @@ class MasterCSS {
|
|
|
522
522
|
}
|
|
523
523
|
return syntaxRules.filter((eachSyntax)=>eachSyntax?.text);
|
|
524
524
|
}
|
|
525
|
+
generateVendorSelectors(selectorText) {
|
|
526
|
+
const vendorSelectors = {};
|
|
527
|
+
const transformSelector = (selectorText, selectorValues, selectors, matched)=>{
|
|
528
|
+
for (const [regexp, newSelectorTexts] of selectorValues){
|
|
529
|
+
if (regexp.test(selectorText)) {
|
|
530
|
+
for (const eachNewSelectorText of newSelectorTexts){
|
|
531
|
+
transformSelector(selectorText.replace(regexp, eachNewSelectorText), selectorValues, selectors, true);
|
|
532
|
+
}
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
if (matched) {
|
|
537
|
+
selectors.push(selectorText);
|
|
538
|
+
}
|
|
539
|
+
};
|
|
540
|
+
const spacedSelectorToken = (selectorText)=>{
|
|
541
|
+
// 1. \'123\'
|
|
542
|
+
// 2. [href='http://localhost']
|
|
543
|
+
const transformedSelectorText = selectorText.split(/(\\'(?:.*?)[^\\]\\')(?=[*_>~+,)])|(\[[^=]+='(?:.*?)[^\\]'\])/).map((eachToken, i)=>i % 3 ? eachToken : eachToken.replace(/(^|[^_])_(?!_)/g, '$1 ')).join('');
|
|
544
|
+
const selectors = [];
|
|
545
|
+
let currentSelector = '';
|
|
546
|
+
let symbolCount = 0;
|
|
547
|
+
for(let i = 0; i < transformedSelectorText.length; i++){
|
|
548
|
+
const char = transformedSelectorText[i];
|
|
549
|
+
if (char === '\\') {
|
|
550
|
+
currentSelector += char + transformedSelectorText[++i];
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
if (!symbolCount && char === ',') {
|
|
554
|
+
selectors.push(currentSelector);
|
|
555
|
+
currentSelector = '';
|
|
556
|
+
} else {
|
|
557
|
+
currentSelector += char;
|
|
558
|
+
if (symbolCount && char === ')') {
|
|
559
|
+
symbolCount--;
|
|
560
|
+
} else if (char === '(') {
|
|
561
|
+
symbolCount++;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
if (currentSelector) {
|
|
566
|
+
selectors.push(currentSelector);
|
|
567
|
+
}
|
|
568
|
+
return selectors;
|
|
569
|
+
};
|
|
570
|
+
const transformedSelectors = [];
|
|
571
|
+
if ('' in this.selectors) {
|
|
572
|
+
transformSelector(selectorText, this.selectors[''], transformedSelectors, true);
|
|
573
|
+
} else {
|
|
574
|
+
transformedSelectors.push(selectorText);
|
|
575
|
+
}
|
|
576
|
+
const unspacedVendorSelectors = {};
|
|
577
|
+
for (const [vendor, selectorValues] of Object.entries(this.selectors)){
|
|
578
|
+
if (!vendor) continue;
|
|
579
|
+
const newUnspacedVendorSelectors = [];
|
|
580
|
+
for (const eachTransformedSelector of transformedSelectors){
|
|
581
|
+
transformSelector(eachTransformedSelector, selectorValues, newUnspacedVendorSelectors, false);
|
|
582
|
+
}
|
|
583
|
+
if (newUnspacedVendorSelectors.length) {
|
|
584
|
+
unspacedVendorSelectors[vendor] = newUnspacedVendorSelectors;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
const insertVendorSelectors = (vendor, selectorTexts)=>{
|
|
588
|
+
const groupedSelectorTexts = selectorTexts.reduce((arr, eachSuffixSelector)=>{
|
|
589
|
+
arr.push(...spacedSelectorToken(eachSuffixSelector));
|
|
590
|
+
return arr;
|
|
591
|
+
}, []);
|
|
592
|
+
if (vendor in vendorSelectors) {
|
|
593
|
+
vendorSelectors[vendor].push(...groupedSelectorTexts);
|
|
594
|
+
} else {
|
|
595
|
+
vendorSelectors[vendor] = groupedSelectorTexts;
|
|
596
|
+
}
|
|
597
|
+
};
|
|
598
|
+
const vendors = Object.keys(unspacedVendorSelectors);
|
|
599
|
+
if (vendors.length) {
|
|
600
|
+
for (const eachVendor of vendors){
|
|
601
|
+
insertVendorSelectors(eachVendor, unspacedVendorSelectors[eachVendor]);
|
|
602
|
+
}
|
|
603
|
+
} else {
|
|
604
|
+
insertVendorSelectors('', transformedSelectors);
|
|
605
|
+
}
|
|
606
|
+
return vendorSelectors;
|
|
607
|
+
}
|
|
525
608
|
/**
|
|
526
609
|
* Create syntax rule from given class name
|
|
527
610
|
* @param className
|
|
@@ -562,7 +645,8 @@ class MasterCSS {
|
|
|
562
645
|
'>',
|
|
563
646
|
'+',
|
|
564
647
|
'~',
|
|
565
|
-
':'
|
|
648
|
+
':',
|
|
649
|
+
','
|
|
566
650
|
].includes(char)) {
|
|
567
651
|
break;
|
|
568
652
|
}
|
package/dist/core.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import Layer from './layer';
|
|
|
6
6
|
import NonLayer from './non-layer';
|
|
7
7
|
import { DefinedRule, Variable } from './types/syntax';
|
|
8
8
|
import { AnimationDefinitions, Config } from './types/config';
|
|
9
|
+
import { Vendors } from './types/common';
|
|
9
10
|
export default class MasterCSS {
|
|
10
11
|
customConfig?: Config | undefined;
|
|
11
12
|
static config: Config;
|
|
@@ -35,6 +36,7 @@ export default class MasterCSS {
|
|
|
35
36
|
* @returns SyntaxRule[]
|
|
36
37
|
*/
|
|
37
38
|
generate(className: string, mode?: string): SyntaxRule[];
|
|
39
|
+
generateVendorSelectors(selectorText: string): Record<string, string[]>;
|
|
38
40
|
/**
|
|
39
41
|
* Create syntax rule from given class name
|
|
40
42
|
* @param className
|
|
@@ -58,6 +60,7 @@ export default class MasterCSS {
|
|
|
58
60
|
}
|
|
59
61
|
export declare const masterCSSs: MasterCSS[];
|
|
60
62
|
export default interface MasterCSS {
|
|
63
|
+
supportVendors: Set<Vendors>;
|
|
61
64
|
style: HTMLStyleElement | null;
|
|
62
65
|
components: Record<string, string[]>;
|
|
63
66
|
selectors: Record<string, [RegExp, string[]][]>;
|
package/dist/core.mjs
CHANGED
|
@@ -86,7 +86,7 @@ class MasterCSS {
|
|
|
86
86
|
for (const eachNewSelectorText of Array.isArray(eachResolvedSelectorText) ? eachResolvedSelectorText : [
|
|
87
87
|
eachResolvedSelectorText
|
|
88
88
|
]){
|
|
89
|
-
const vendor = eachNewSelectorText.match(
|
|
89
|
+
const vendor = eachNewSelectorText.match(/^:(?::)?-(webkit|moz|ms|o)-/m)?.[1] ?? '';
|
|
90
90
|
let selectorValues = this.selectors[vendor];
|
|
91
91
|
if (!selectorValues) {
|
|
92
92
|
selectorValues = this.selectors[vendor] = [];
|
|
@@ -518,6 +518,89 @@ class MasterCSS {
|
|
|
518
518
|
}
|
|
519
519
|
return syntaxRules.filter((eachSyntax)=>eachSyntax?.text);
|
|
520
520
|
}
|
|
521
|
+
generateVendorSelectors(selectorText) {
|
|
522
|
+
const vendorSelectors = {};
|
|
523
|
+
const transformSelector = (selectorText, selectorValues, selectors, matched)=>{
|
|
524
|
+
for (const [regexp, newSelectorTexts] of selectorValues){
|
|
525
|
+
if (regexp.test(selectorText)) {
|
|
526
|
+
for (const eachNewSelectorText of newSelectorTexts){
|
|
527
|
+
transformSelector(selectorText.replace(regexp, eachNewSelectorText), selectorValues, selectors, true);
|
|
528
|
+
}
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
if (matched) {
|
|
533
|
+
selectors.push(selectorText);
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
const spacedSelectorToken = (selectorText)=>{
|
|
537
|
+
// 1. \'123\'
|
|
538
|
+
// 2. [href='http://localhost']
|
|
539
|
+
const transformedSelectorText = selectorText.split(/(\\'(?:.*?)[^\\]\\')(?=[*_>~+,)])|(\[[^=]+='(?:.*?)[^\\]'\])/).map((eachToken, i)=>i % 3 ? eachToken : eachToken.replace(/(^|[^_])_(?!_)/g, '$1 ')).join('');
|
|
540
|
+
const selectors = [];
|
|
541
|
+
let currentSelector = '';
|
|
542
|
+
let symbolCount = 0;
|
|
543
|
+
for(let i = 0; i < transformedSelectorText.length; i++){
|
|
544
|
+
const char = transformedSelectorText[i];
|
|
545
|
+
if (char === '\\') {
|
|
546
|
+
currentSelector += char + transformedSelectorText[++i];
|
|
547
|
+
continue;
|
|
548
|
+
}
|
|
549
|
+
if (!symbolCount && char === ',') {
|
|
550
|
+
selectors.push(currentSelector);
|
|
551
|
+
currentSelector = '';
|
|
552
|
+
} else {
|
|
553
|
+
currentSelector += char;
|
|
554
|
+
if (symbolCount && char === ')') {
|
|
555
|
+
symbolCount--;
|
|
556
|
+
} else if (char === '(') {
|
|
557
|
+
symbolCount++;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
if (currentSelector) {
|
|
562
|
+
selectors.push(currentSelector);
|
|
563
|
+
}
|
|
564
|
+
return selectors;
|
|
565
|
+
};
|
|
566
|
+
const transformedSelectors = [];
|
|
567
|
+
if ('' in this.selectors) {
|
|
568
|
+
transformSelector(selectorText, this.selectors[''], transformedSelectors, true);
|
|
569
|
+
} else {
|
|
570
|
+
transformedSelectors.push(selectorText);
|
|
571
|
+
}
|
|
572
|
+
const unspacedVendorSelectors = {};
|
|
573
|
+
for (const [vendor, selectorValues] of Object.entries(this.selectors)){
|
|
574
|
+
if (!vendor) continue;
|
|
575
|
+
const newUnspacedVendorSelectors = [];
|
|
576
|
+
for (const eachTransformedSelector of transformedSelectors){
|
|
577
|
+
transformSelector(eachTransformedSelector, selectorValues, newUnspacedVendorSelectors, false);
|
|
578
|
+
}
|
|
579
|
+
if (newUnspacedVendorSelectors.length) {
|
|
580
|
+
unspacedVendorSelectors[vendor] = newUnspacedVendorSelectors;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
const insertVendorSelectors = (vendor, selectorTexts)=>{
|
|
584
|
+
const groupedSelectorTexts = selectorTexts.reduce((arr, eachSuffixSelector)=>{
|
|
585
|
+
arr.push(...spacedSelectorToken(eachSuffixSelector));
|
|
586
|
+
return arr;
|
|
587
|
+
}, []);
|
|
588
|
+
if (vendor in vendorSelectors) {
|
|
589
|
+
vendorSelectors[vendor].push(...groupedSelectorTexts);
|
|
590
|
+
} else {
|
|
591
|
+
vendorSelectors[vendor] = groupedSelectorTexts;
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
const vendors = Object.keys(unspacedVendorSelectors);
|
|
595
|
+
if (vendors.length) {
|
|
596
|
+
for (const eachVendor of vendors){
|
|
597
|
+
insertVendorSelectors(eachVendor, unspacedVendorSelectors[eachVendor]);
|
|
598
|
+
}
|
|
599
|
+
} else {
|
|
600
|
+
insertVendorSelectors('', transformedSelectors);
|
|
601
|
+
}
|
|
602
|
+
return vendorSelectors;
|
|
603
|
+
}
|
|
521
604
|
/**
|
|
522
605
|
* Create syntax rule from given class name
|
|
523
606
|
* @param className
|
|
@@ -558,7 +641,8 @@ class MasterCSS {
|
|
|
558
641
|
'>',
|
|
559
642
|
'+',
|
|
560
643
|
'~',
|
|
561
|
-
':'
|
|
644
|
+
':',
|
|
645
|
+
','
|
|
562
646
|
].includes(char)) {
|
|
563
647
|
break;
|
|
564
648
|
}
|
package/dist/index.cjs
CHANGED
|
@@ -23,11 +23,11 @@ var isCoreRule = require('./utils/is-core-rule.cjs');
|
|
|
23
23
|
var at = require('./config/at.cjs');
|
|
24
24
|
var selectors = require('./config/selectors.cjs');
|
|
25
25
|
var utilities = require('./config/utilities.cjs');
|
|
26
|
+
var rules = require('./config/rules.cjs');
|
|
26
27
|
var functions = require('./config/functions.cjs');
|
|
27
28
|
var animations = require('./config/animations.cjs');
|
|
28
29
|
var variables = require('./config/variables.cjs');
|
|
29
30
|
var modes = require('./config/modes.cjs');
|
|
30
|
-
var rules = require('./config/rules.cjs');
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
|
|
@@ -74,8 +74,8 @@ exports.isCoreRule = isCoreRule;
|
|
|
74
74
|
exports.at = at;
|
|
75
75
|
exports.selectors = selectors;
|
|
76
76
|
exports.utilities = utilities;
|
|
77
|
+
exports.rules = rules;
|
|
77
78
|
exports.functions = functions;
|
|
78
79
|
exports.animations = animations;
|
|
79
80
|
exports.variables = variables;
|
|
80
81
|
exports.modes = modes;
|
|
81
|
-
exports.rules = rules;
|
package/dist/index.mjs
CHANGED
|
@@ -19,8 +19,8 @@ export { default as isCoreRule } from './utils/is-core-rule.mjs';
|
|
|
19
19
|
export { default as at } from './config/at.mjs';
|
|
20
20
|
export { default as selectors } from './config/selectors.mjs';
|
|
21
21
|
export { default as utilities } from './config/utilities.mjs';
|
|
22
|
+
export { default as rules } from './config/rules.mjs';
|
|
22
23
|
export { default as functions } from './config/functions.mjs';
|
|
23
24
|
export { default as animations } from './config/animations.mjs';
|
|
24
25
|
export { default as variables } from './config/variables.mjs';
|
|
25
26
|
export { default as modes } from './config/modes.mjs';
|
|
26
|
-
export { default as rules } from './config/rules.mjs';
|
package/dist/layer.cjs
CHANGED
|
@@ -20,7 +20,7 @@ class Layer {
|
|
|
20
20
|
if (!this.css.rules.includes(this)) {
|
|
21
21
|
this.css.rules.push(this);
|
|
22
22
|
const nativeSheet = this.css.style?.sheet;
|
|
23
|
-
if (nativeSheet && !this.native) {
|
|
23
|
+
if (nativeSheet && !this.native?.parentStyleSheet) {
|
|
24
24
|
const insertedIndex = nativeSheet.insertRule(this.text, nativeSheet.cssRules.length);
|
|
25
25
|
this.native = nativeSheet.cssRules.item(insertedIndex);
|
|
26
26
|
}
|
|
@@ -50,12 +50,13 @@ class Layer {
|
|
|
50
50
|
}
|
|
51
51
|
for(let i = 0; i < rule.nodes.length;){
|
|
52
52
|
try {
|
|
53
|
-
const
|
|
54
|
-
this.native.insertRule(
|
|
55
|
-
|
|
53
|
+
const node = rule.nodes[i];
|
|
54
|
+
const insertedIndex = this.native.insertRule(node.text, cssRuleIndex);
|
|
55
|
+
node.native = this.native.cssRules.item(insertedIndex);
|
|
56
|
+
cssRuleIndex++;
|
|
56
57
|
i++;
|
|
57
58
|
} catch (error) {
|
|
58
|
-
console.error(error);
|
|
59
|
+
console.error(error, rule.nodes[i]);
|
|
59
60
|
rule.nodes.splice(i, 1);
|
|
60
61
|
}
|
|
61
62
|
}
|
|
@@ -70,7 +71,7 @@ class Layer {
|
|
|
70
71
|
const indexOfLayer = this.css.rules.indexOf(this);
|
|
71
72
|
this.css.rules.splice(indexOfLayer, 1);
|
|
72
73
|
const nativeSheet = this.css.style?.sheet;
|
|
73
|
-
if (nativeSheet && this.native) {
|
|
74
|
+
if (nativeSheet && this.native?.parentStyleSheet) {
|
|
74
75
|
const foundIndex = findNativeCssRuleIndex(nativeSheet.cssRules, this.native);
|
|
75
76
|
if (foundIndex !== -1) {
|
|
76
77
|
nativeSheet.deleteRule(foundIndex);
|
package/dist/layer.mjs
CHANGED
|
@@ -18,7 +18,7 @@ class Layer {
|
|
|
18
18
|
if (!this.css.rules.includes(this)) {
|
|
19
19
|
this.css.rules.push(this);
|
|
20
20
|
const nativeSheet = this.css.style?.sheet;
|
|
21
|
-
if (nativeSheet && !this.native) {
|
|
21
|
+
if (nativeSheet && !this.native?.parentStyleSheet) {
|
|
22
22
|
const insertedIndex = nativeSheet.insertRule(this.text, nativeSheet.cssRules.length);
|
|
23
23
|
this.native = nativeSheet.cssRules.item(insertedIndex);
|
|
24
24
|
}
|
|
@@ -48,12 +48,13 @@ class Layer {
|
|
|
48
48
|
}
|
|
49
49
|
for(let i = 0; i < rule.nodes.length;){
|
|
50
50
|
try {
|
|
51
|
-
const
|
|
52
|
-
this.native.insertRule(
|
|
53
|
-
|
|
51
|
+
const node = rule.nodes[i];
|
|
52
|
+
const insertedIndex = this.native.insertRule(node.text, cssRuleIndex);
|
|
53
|
+
node.native = this.native.cssRules.item(insertedIndex);
|
|
54
|
+
cssRuleIndex++;
|
|
54
55
|
i++;
|
|
55
56
|
} catch (error) {
|
|
56
|
-
console.error(error);
|
|
57
|
+
console.error(error, rule.nodes[i]);
|
|
57
58
|
rule.nodes.splice(i, 1);
|
|
58
59
|
}
|
|
59
60
|
}
|
|
@@ -68,7 +69,7 @@ class Layer {
|
|
|
68
69
|
const indexOfLayer = this.css.rules.indexOf(this);
|
|
69
70
|
this.css.rules.splice(indexOfLayer, 1);
|
|
70
71
|
const nativeSheet = this.css.style?.sheet;
|
|
71
|
-
if (nativeSheet && this.native) {
|
|
72
|
+
if (nativeSheet && this.native?.parentStyleSheet) {
|
|
72
73
|
const foundIndex = findNativeCSSRuleIndex(nativeSheet.cssRules, this.native);
|
|
73
74
|
if (foundIndex !== -1) {
|
|
74
75
|
nativeSheet.deleteRule(foundIndex);
|
package/dist/rule.d.ts
CHANGED
package/dist/syntax-layer.cjs
CHANGED
|
@@ -218,22 +218,24 @@ class SyntaxLayer extends layer {
|
|
|
218
218
|
const addNative = (mode, _variable)=>{
|
|
219
219
|
let isDefaultMode = false;
|
|
220
220
|
let preifxCssRuleText;
|
|
221
|
+
let selectorText;
|
|
221
222
|
let endCurlyBracketCount = 1;
|
|
222
223
|
if (mode) {
|
|
223
224
|
switch(this.css.config.modes?.[mode]){
|
|
224
225
|
case 'media':
|
|
225
|
-
|
|
226
|
+
selectorText = ':root';
|
|
227
|
+
preifxCssRuleText = `@media(prefers-color-scheme:${mode}){${selectorText}`;
|
|
226
228
|
endCurlyBracketCount++;
|
|
227
229
|
break;
|
|
228
230
|
case 'host':
|
|
229
|
-
preifxCssRuleText = `:host(.${mode})`;
|
|
231
|
+
preifxCssRuleText = selectorText = `:host(.${mode})`;
|
|
230
232
|
if (!variable.value && this.css.config.defaultMode === mode) {
|
|
231
233
|
preifxCssRuleText += ',:host';
|
|
232
234
|
isDefaultMode = true;
|
|
233
235
|
}
|
|
234
236
|
break;
|
|
235
237
|
case 'class':
|
|
236
|
-
preifxCssRuleText = `.${mode}`;
|
|
238
|
+
preifxCssRuleText = selectorText = `.${mode}`;
|
|
237
239
|
if (!variable.value && this.css.config.defaultMode === mode) {
|
|
238
240
|
preifxCssRuleText += ',:root';
|
|
239
241
|
isDefaultMode = true;
|
|
@@ -243,11 +245,12 @@ class SyntaxLayer extends layer {
|
|
|
243
245
|
return;
|
|
244
246
|
}
|
|
245
247
|
} else {
|
|
246
|
-
preifxCssRuleText = ':root';
|
|
248
|
+
preifxCssRuleText = selectorText = ':root';
|
|
247
249
|
}
|
|
248
250
|
const cssRuleText = `${preifxCssRuleText}{--${eachVariableName}:${String(_variable.value)}${'}'.repeat(endCurlyBracketCount)}`;
|
|
249
251
|
if (isDefaultMode) {
|
|
250
252
|
newRule.nodes.unshift({
|
|
253
|
+
selectorText,
|
|
251
254
|
text: cssRuleText
|
|
252
255
|
});
|
|
253
256
|
} else {
|
package/dist/syntax-layer.mjs
CHANGED
|
@@ -216,22 +216,24 @@ class SyntaxLayer extends Layer {
|
|
|
216
216
|
const addNative = (mode, _variable)=>{
|
|
217
217
|
let isDefaultMode = false;
|
|
218
218
|
let preifxCssRuleText;
|
|
219
|
+
let selectorText;
|
|
219
220
|
let endCurlyBracketCount = 1;
|
|
220
221
|
if (mode) {
|
|
221
222
|
switch(this.css.config.modes?.[mode]){
|
|
222
223
|
case 'media':
|
|
223
|
-
|
|
224
|
+
selectorText = ':root';
|
|
225
|
+
preifxCssRuleText = `@media(prefers-color-scheme:${mode}){${selectorText}`;
|
|
224
226
|
endCurlyBracketCount++;
|
|
225
227
|
break;
|
|
226
228
|
case 'host':
|
|
227
|
-
preifxCssRuleText = `:host(.${mode})`;
|
|
229
|
+
preifxCssRuleText = selectorText = `:host(.${mode})`;
|
|
228
230
|
if (!variable.value && this.css.config.defaultMode === mode) {
|
|
229
231
|
preifxCssRuleText += ',:host';
|
|
230
232
|
isDefaultMode = true;
|
|
231
233
|
}
|
|
232
234
|
break;
|
|
233
235
|
case 'class':
|
|
234
|
-
preifxCssRuleText = `.${mode}`;
|
|
236
|
+
preifxCssRuleText = selectorText = `.${mode}`;
|
|
235
237
|
if (!variable.value && this.css.config.defaultMode === mode) {
|
|
236
238
|
preifxCssRuleText += ',:root';
|
|
237
239
|
isDefaultMode = true;
|
|
@@ -241,11 +243,12 @@ class SyntaxLayer extends Layer {
|
|
|
241
243
|
return;
|
|
242
244
|
}
|
|
243
245
|
} else {
|
|
244
|
-
preifxCssRuleText = ':root';
|
|
246
|
+
preifxCssRuleText = selectorText = ':root';
|
|
245
247
|
}
|
|
246
248
|
const cssRuleText = `${preifxCssRuleText}{--${eachVariableName}:${String(_variable.value)}${'}'.repeat(endCurlyBracketCount)}`;
|
|
247
249
|
if (isDefaultMode) {
|
|
248
250
|
newRule.nodes.unshift({
|
|
251
|
+
selectorText,
|
|
249
252
|
text: cssRuleText
|
|
250
253
|
});
|
|
251
254
|
} else {
|
package/dist/syntax-rule.cjs
CHANGED
|
@@ -255,7 +255,7 @@ class SyntaxRule extends rule.Rule {
|
|
|
255
255
|
const { analyze, transformValue, declare, transformValueComponents, create, type, unit } = definition;
|
|
256
256
|
this.type = type;
|
|
257
257
|
const { scope, important, modes } = css.config;
|
|
258
|
-
const {
|
|
258
|
+
const { at, animations } = css;
|
|
259
259
|
if (create) create.call(this, name);
|
|
260
260
|
// 1. value / selectorToken
|
|
261
261
|
this.declarations = definition.declarations;
|
|
@@ -285,92 +285,14 @@ class SyntaxRule extends rule.Rule {
|
|
|
285
285
|
}
|
|
286
286
|
this.stateToken = stateToken;
|
|
287
287
|
// 3. prefix selector
|
|
288
|
-
const generateVendorSelectors = (selectorText, vendorSelectors)=>{
|
|
289
|
-
const transformSelector = (selectorText, selectorValues, selectors, matched)=>{
|
|
290
|
-
for (const [regexp, newSelectorTexts] of selectorValues){
|
|
291
|
-
if (regexp.test(selectorText)) {
|
|
292
|
-
for (const eachNewSelectorText of newSelectorTexts){
|
|
293
|
-
transformSelector(selectorText.replace(regexp, eachNewSelectorText), selectorValues, selectors, true);
|
|
294
|
-
}
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
if (matched) {
|
|
299
|
-
selectors.push(selectorText);
|
|
300
|
-
}
|
|
301
|
-
};
|
|
302
|
-
const spacedSelectorToken = (selectorText)=>{
|
|
303
|
-
// 1. \'123\'
|
|
304
|
-
// 2. [href='http://localhost']
|
|
305
|
-
const transformedSelectorText = selectorText.split(/(\\'(?:.*?)[^\\]\\')(?=[*_>~+,)])|(\[[^=]+='(?:.*?)[^\\]'\])/).map((eachToken, i)=>i % 3 ? eachToken : eachToken.replace(/(^|[^_])_(?!_)/g, '$1 ')).join('');
|
|
306
|
-
const selectors = [];
|
|
307
|
-
let currentSelector = '';
|
|
308
|
-
for(let i = 0; i < transformedSelectorText.length; i++){
|
|
309
|
-
const char = transformedSelectorText[i];
|
|
310
|
-
if (char === '\\') {
|
|
311
|
-
currentSelector += char + transformedSelectorText[++i];
|
|
312
|
-
continue;
|
|
313
|
-
}
|
|
314
|
-
currentSelector += char;
|
|
315
|
-
}
|
|
316
|
-
if (currentSelector) {
|
|
317
|
-
selectors.push(currentSelector);
|
|
318
|
-
}
|
|
319
|
-
return selectors;
|
|
320
|
-
};
|
|
321
|
-
const transformedSelectors = [];
|
|
322
|
-
if ('' in selectors) {
|
|
323
|
-
transformSelector(selectorText, selectors[''], transformedSelectors, true);
|
|
324
|
-
} else {
|
|
325
|
-
transformedSelectors.push(selectorText);
|
|
326
|
-
}
|
|
327
|
-
const unspacedVendorSelectors = {};
|
|
328
|
-
for (const [vendor, selectorValues] of Object.entries(selectors)){
|
|
329
|
-
if (!vendor) continue;
|
|
330
|
-
const newUnspacedVendorSelectors = [];
|
|
331
|
-
for (const eachTransformedSelector of transformedSelectors){
|
|
332
|
-
transformSelector(eachTransformedSelector, selectorValues, newUnspacedVendorSelectors, false);
|
|
333
|
-
}
|
|
334
|
-
if (newUnspacedVendorSelectors.length) {
|
|
335
|
-
unspacedVendorSelectors[vendor] = newUnspacedVendorSelectors;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
const insertVendorSelectors = (vendor, selectorTexts)=>{
|
|
339
|
-
const groupedSelectorTexts = selectorTexts.reduce((arr, eachSuffixSelector)=>{
|
|
340
|
-
arr.push(...spacedSelectorToken(eachSuffixSelector));
|
|
341
|
-
return arr;
|
|
342
|
-
}, []);
|
|
343
|
-
if (vendor in vendorSelectors) {
|
|
344
|
-
vendorSelectors[vendor].push(...groupedSelectorTexts);
|
|
345
|
-
} else {
|
|
346
|
-
vendorSelectors[vendor] = groupedSelectorTexts;
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
|
-
const vendors = Object.keys(unspacedVendorSelectors);
|
|
350
|
-
if (vendors.length) {
|
|
351
|
-
for (const eachVendor of vendors){
|
|
352
|
-
insertVendorSelectors(eachVendor, unspacedVendorSelectors[eachVendor]);
|
|
353
|
-
}
|
|
354
|
-
} else {
|
|
355
|
-
insertVendorSelectors('', transformedSelectors);
|
|
356
|
-
}
|
|
357
|
-
};
|
|
358
288
|
if (prefixToken) {
|
|
359
|
-
this.vendorPrefixSelectors =
|
|
360
|
-
generateVendorSelectors(prefixToken, this.vendorPrefixSelectors);
|
|
361
|
-
} else {
|
|
362
|
-
this.vendorPrefixSelectors = {
|
|
363
|
-
'': [
|
|
364
|
-
''
|
|
365
|
-
]
|
|
366
|
-
};
|
|
289
|
+
this.vendorPrefixSelectors = css.generateVendorSelectors(prefixToken);
|
|
367
290
|
}
|
|
368
291
|
// 4. suffix selector
|
|
369
292
|
const stateTokens = stateToken.split('@');
|
|
370
293
|
const suffixSelector = stateTokens[0];
|
|
371
294
|
if (suffixSelector) {
|
|
372
|
-
this.vendorSuffixSelectors =
|
|
373
|
-
generateVendorSelectors(suffixSelector, this.vendorSuffixSelectors);
|
|
295
|
+
this.vendorSuffixSelectors = css.generateVendorSelectors(suffixSelector);
|
|
374
296
|
for (const suffixSelectors of Object.values(this.vendorSuffixSelectors)){
|
|
375
297
|
for (const eachSuffixSelector of suffixSelectors){
|
|
376
298
|
const SORTED_SELECTORS = [
|
|
@@ -389,29 +311,11 @@ class SyntaxRule extends rule.Rule {
|
|
|
389
311
|
}
|
|
390
312
|
}
|
|
391
313
|
}
|
|
392
|
-
} else {
|
|
393
|
-
this.vendorSuffixSelectors = {
|
|
394
|
-
'': [
|
|
395
|
-
''
|
|
396
|
-
]
|
|
397
|
-
};
|
|
398
314
|
}
|
|
399
315
|
// selector combinations
|
|
400
316
|
const suffixSelectorVendorsByPrefixSelectorVendor = {};
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
if (isPrefixSelectorWithoutVendor) {
|
|
404
|
-
suffixSelectorVendorsByPrefixSelectorVendor[''] = isSuffixSelectorWithoutVendor ? [
|
|
405
|
-
''
|
|
406
|
-
] : Object.keys(this.vendorSuffixSelectors);
|
|
407
|
-
} else {
|
|
408
|
-
if (isSuffixSelectorWithoutVendor) {
|
|
409
|
-
for(const vendor in this.vendorPrefixSelectors){
|
|
410
|
-
suffixSelectorVendorsByPrefixSelectorVendor[vendor] = [
|
|
411
|
-
''
|
|
412
|
-
];
|
|
413
|
-
}
|
|
414
|
-
} else {
|
|
317
|
+
if (this.vendorPrefixSelectors) {
|
|
318
|
+
if (this.vendorSuffixSelectors) {
|
|
415
319
|
for(const prefixSelectorVendor in this.vendorPrefixSelectors){
|
|
416
320
|
const suffixSelectorVendors = suffixSelectorVendorsByPrefixSelectorVendor[prefixSelectorVendor] = [];
|
|
417
321
|
if (Object.prototype.hasOwnProperty.call(this.vendorSuffixSelectors, prefixSelectorVendor)) {
|
|
@@ -422,7 +326,17 @@ class SyntaxRule extends rule.Rule {
|
|
|
422
326
|
}
|
|
423
327
|
}
|
|
424
328
|
}
|
|
329
|
+
} else {
|
|
330
|
+
for(const vendor in this.vendorPrefixSelectors){
|
|
331
|
+
suffixSelectorVendorsByPrefixSelectorVendor[vendor] = [
|
|
332
|
+
''
|
|
333
|
+
];
|
|
334
|
+
}
|
|
425
335
|
}
|
|
336
|
+
} else {
|
|
337
|
+
suffixSelectorVendorsByPrefixSelectorVendor[''] = this.vendorSuffixSelectors ? Object.keys(this.vendorSuffixSelectors) : [
|
|
338
|
+
''
|
|
339
|
+
];
|
|
426
340
|
}
|
|
427
341
|
// 5. atTokens
|
|
428
342
|
for(let i = 1; i < stateTokens.length; i++){
|
|
@@ -600,13 +514,20 @@ class SyntaxRule extends rule.Rule {
|
|
|
600
514
|
if (propertiesText.length) {
|
|
601
515
|
for(const prefixSelectorVendor in suffixSelectorVendorsByPrefixSelectorVendor){
|
|
602
516
|
for (const eachSuffixSelectorVendor of suffixSelectorVendorsByPrefixSelectorVendor[prefixSelectorVendor]){
|
|
517
|
+
const prefixSelectors = this.vendorPrefixSelectors?.[prefixSelectorVendor];
|
|
518
|
+
const suffixSelectors = this.vendorSuffixSelectors?.[eachSuffixSelectorVendor];
|
|
519
|
+
if (this.css.supportVendors) {
|
|
520
|
+
if (prefixSelectorVendor && !this.css.supportVendors?.has(prefixSelectorVendor) || eachSuffixSelectorVendor && !this.css.supportVendors?.has(eachSuffixSelectorVendor)) {
|
|
521
|
+
continue;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
603
524
|
let prefixText = '';
|
|
604
525
|
if (this.direction) {
|
|
605
526
|
prefixText += '[dir=' + this.direction + '] ';
|
|
606
527
|
}
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
528
|
+
const prefixTexts = prefixSelectors ? prefixSelectors.map((eachPrefixSelector)=>eachPrefixSelector + prefixText) : [
|
|
529
|
+
prefixText
|
|
530
|
+
];
|
|
610
531
|
const getCssText = (name)=>prefixTexts.map((eachPrefixText)=>{
|
|
611
532
|
let modePrefix = '';
|
|
612
533
|
if (this.mode) {
|
|
@@ -617,22 +538,27 @@ class SyntaxRule extends rule.Rule {
|
|
|
617
538
|
}
|
|
618
539
|
return modePrefix + (scope ? scope + ' ' : '') + eachPrefixText;
|
|
619
540
|
}).reduce((arr, eachPrefixText)=>{
|
|
620
|
-
arr.push(suffixSelectors.reduce((_arr, eachSuffixSelector)=>{
|
|
541
|
+
arr.push(suffixSelectors ? suffixSelectors.reduce((_arr, eachSuffixSelector)=>{
|
|
621
542
|
_arr.push(eachPrefixText + '.' + cssEscape(name) + eachSuffixSelector);
|
|
622
543
|
return _arr;
|
|
623
|
-
}, []).join(','));
|
|
544
|
+
}, []).join(',') : eachPrefixText + '.' + cssEscape(name));
|
|
624
545
|
return arr;
|
|
625
546
|
}, []).join(',');
|
|
626
|
-
|
|
547
|
+
const selectorText = getCssText(fixedClass ?? name);
|
|
548
|
+
let cssText = selectorText + '{' + propertiesText.join(';') + '}';
|
|
627
549
|
for (const key of Object.keys(this.at).sort((_a, b)=>b === 'supports' ? -1 : 1)){
|
|
628
550
|
cssText = '@' + key + (key.includes(' ') ? '' : ' ') + this.at[key].map((eachAtComponent)=>this.resolveAtComponent(eachAtComponent)).join(' ') + '{' + cssText + '}';
|
|
629
551
|
}
|
|
630
552
|
if (this.mode && modes?.[this.mode] === 'media') {
|
|
631
553
|
cssText = `@media(prefers-color-scheme:${this.mode}){` + cssText + '}';
|
|
632
554
|
}
|
|
633
|
-
|
|
634
|
-
text: cssText
|
|
635
|
-
|
|
555
|
+
const node = {
|
|
556
|
+
text: cssText,
|
|
557
|
+
selectorText
|
|
558
|
+
};
|
|
559
|
+
if (prefixSelectors) node.prefixSelectors = prefixSelectors;
|
|
560
|
+
if (suffixSelectors) node.suffixSelectors = suffixSelectors;
|
|
561
|
+
this.nodes.push(node);
|
|
636
562
|
}
|
|
637
563
|
}
|
|
638
564
|
}
|
package/dist/syntax-rule.mjs
CHANGED
|
@@ -253,7 +253,7 @@ class SyntaxRule extends Rule {
|
|
|
253
253
|
const { analyze, transformValue, declare, transformValueComponents, create, type, unit } = definition;
|
|
254
254
|
this.type = type;
|
|
255
255
|
const { scope, important, modes } = css.config;
|
|
256
|
-
const {
|
|
256
|
+
const { at, animations } = css;
|
|
257
257
|
if (create) create.call(this, name);
|
|
258
258
|
// 1. value / selectorToken
|
|
259
259
|
this.declarations = definition.declarations;
|
|
@@ -283,92 +283,14 @@ class SyntaxRule extends Rule {
|
|
|
283
283
|
}
|
|
284
284
|
this.stateToken = stateToken;
|
|
285
285
|
// 3. prefix selector
|
|
286
|
-
const generateVendorSelectors = (selectorText, vendorSelectors)=>{
|
|
287
|
-
const transformSelector = (selectorText, selectorValues, selectors, matched)=>{
|
|
288
|
-
for (const [regexp, newSelectorTexts] of selectorValues){
|
|
289
|
-
if (regexp.test(selectorText)) {
|
|
290
|
-
for (const eachNewSelectorText of newSelectorTexts){
|
|
291
|
-
transformSelector(selectorText.replace(regexp, eachNewSelectorText), selectorValues, selectors, true);
|
|
292
|
-
}
|
|
293
|
-
return;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
if (matched) {
|
|
297
|
-
selectors.push(selectorText);
|
|
298
|
-
}
|
|
299
|
-
};
|
|
300
|
-
const spacedSelectorToken = (selectorText)=>{
|
|
301
|
-
// 1. \'123\'
|
|
302
|
-
// 2. [href='http://localhost']
|
|
303
|
-
const transformedSelectorText = selectorText.split(/(\\'(?:.*?)[^\\]\\')(?=[*_>~+,)])|(\[[^=]+='(?:.*?)[^\\]'\])/).map((eachToken, i)=>i % 3 ? eachToken : eachToken.replace(/(^|[^_])_(?!_)/g, '$1 ')).join('');
|
|
304
|
-
const selectors = [];
|
|
305
|
-
let currentSelector = '';
|
|
306
|
-
for(let i = 0; i < transformedSelectorText.length; i++){
|
|
307
|
-
const char = transformedSelectorText[i];
|
|
308
|
-
if (char === '\\') {
|
|
309
|
-
currentSelector += char + transformedSelectorText[++i];
|
|
310
|
-
continue;
|
|
311
|
-
}
|
|
312
|
-
currentSelector += char;
|
|
313
|
-
}
|
|
314
|
-
if (currentSelector) {
|
|
315
|
-
selectors.push(currentSelector);
|
|
316
|
-
}
|
|
317
|
-
return selectors;
|
|
318
|
-
};
|
|
319
|
-
const transformedSelectors = [];
|
|
320
|
-
if ('' in selectors) {
|
|
321
|
-
transformSelector(selectorText, selectors[''], transformedSelectors, true);
|
|
322
|
-
} else {
|
|
323
|
-
transformedSelectors.push(selectorText);
|
|
324
|
-
}
|
|
325
|
-
const unspacedVendorSelectors = {};
|
|
326
|
-
for (const [vendor, selectorValues] of Object.entries(selectors)){
|
|
327
|
-
if (!vendor) continue;
|
|
328
|
-
const newUnspacedVendorSelectors = [];
|
|
329
|
-
for (const eachTransformedSelector of transformedSelectors){
|
|
330
|
-
transformSelector(eachTransformedSelector, selectorValues, newUnspacedVendorSelectors, false);
|
|
331
|
-
}
|
|
332
|
-
if (newUnspacedVendorSelectors.length) {
|
|
333
|
-
unspacedVendorSelectors[vendor] = newUnspacedVendorSelectors;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
const insertVendorSelectors = (vendor, selectorTexts)=>{
|
|
337
|
-
const groupedSelectorTexts = selectorTexts.reduce((arr, eachSuffixSelector)=>{
|
|
338
|
-
arr.push(...spacedSelectorToken(eachSuffixSelector));
|
|
339
|
-
return arr;
|
|
340
|
-
}, []);
|
|
341
|
-
if (vendor in vendorSelectors) {
|
|
342
|
-
vendorSelectors[vendor].push(...groupedSelectorTexts);
|
|
343
|
-
} else {
|
|
344
|
-
vendorSelectors[vendor] = groupedSelectorTexts;
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
const vendors = Object.keys(unspacedVendorSelectors);
|
|
348
|
-
if (vendors.length) {
|
|
349
|
-
for (const eachVendor of vendors){
|
|
350
|
-
insertVendorSelectors(eachVendor, unspacedVendorSelectors[eachVendor]);
|
|
351
|
-
}
|
|
352
|
-
} else {
|
|
353
|
-
insertVendorSelectors('', transformedSelectors);
|
|
354
|
-
}
|
|
355
|
-
};
|
|
356
286
|
if (prefixToken) {
|
|
357
|
-
this.vendorPrefixSelectors =
|
|
358
|
-
generateVendorSelectors(prefixToken, this.vendorPrefixSelectors);
|
|
359
|
-
} else {
|
|
360
|
-
this.vendorPrefixSelectors = {
|
|
361
|
-
'': [
|
|
362
|
-
''
|
|
363
|
-
]
|
|
364
|
-
};
|
|
287
|
+
this.vendorPrefixSelectors = css.generateVendorSelectors(prefixToken);
|
|
365
288
|
}
|
|
366
289
|
// 4. suffix selector
|
|
367
290
|
const stateTokens = stateToken.split('@');
|
|
368
291
|
const suffixSelector = stateTokens[0];
|
|
369
292
|
if (suffixSelector) {
|
|
370
|
-
this.vendorSuffixSelectors =
|
|
371
|
-
generateVendorSelectors(suffixSelector, this.vendorSuffixSelectors);
|
|
293
|
+
this.vendorSuffixSelectors = css.generateVendorSelectors(suffixSelector);
|
|
372
294
|
for (const suffixSelectors of Object.values(this.vendorSuffixSelectors)){
|
|
373
295
|
for (const eachSuffixSelector of suffixSelectors){
|
|
374
296
|
const SORTED_SELECTORS = [
|
|
@@ -387,29 +309,11 @@ class SyntaxRule extends Rule {
|
|
|
387
309
|
}
|
|
388
310
|
}
|
|
389
311
|
}
|
|
390
|
-
} else {
|
|
391
|
-
this.vendorSuffixSelectors = {
|
|
392
|
-
'': [
|
|
393
|
-
''
|
|
394
|
-
]
|
|
395
|
-
};
|
|
396
312
|
}
|
|
397
313
|
// selector combinations
|
|
398
314
|
const suffixSelectorVendorsByPrefixSelectorVendor = {};
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
if (isPrefixSelectorWithoutVendor) {
|
|
402
|
-
suffixSelectorVendorsByPrefixSelectorVendor[''] = isSuffixSelectorWithoutVendor ? [
|
|
403
|
-
''
|
|
404
|
-
] : Object.keys(this.vendorSuffixSelectors);
|
|
405
|
-
} else {
|
|
406
|
-
if (isSuffixSelectorWithoutVendor) {
|
|
407
|
-
for(const vendor in this.vendorPrefixSelectors){
|
|
408
|
-
suffixSelectorVendorsByPrefixSelectorVendor[vendor] = [
|
|
409
|
-
''
|
|
410
|
-
];
|
|
411
|
-
}
|
|
412
|
-
} else {
|
|
315
|
+
if (this.vendorPrefixSelectors) {
|
|
316
|
+
if (this.vendorSuffixSelectors) {
|
|
413
317
|
for(const prefixSelectorVendor in this.vendorPrefixSelectors){
|
|
414
318
|
const suffixSelectorVendors = suffixSelectorVendorsByPrefixSelectorVendor[prefixSelectorVendor] = [];
|
|
415
319
|
if (Object.prototype.hasOwnProperty.call(this.vendorSuffixSelectors, prefixSelectorVendor)) {
|
|
@@ -420,7 +324,17 @@ class SyntaxRule extends Rule {
|
|
|
420
324
|
}
|
|
421
325
|
}
|
|
422
326
|
}
|
|
327
|
+
} else {
|
|
328
|
+
for(const vendor in this.vendorPrefixSelectors){
|
|
329
|
+
suffixSelectorVendorsByPrefixSelectorVendor[vendor] = [
|
|
330
|
+
''
|
|
331
|
+
];
|
|
332
|
+
}
|
|
423
333
|
}
|
|
334
|
+
} else {
|
|
335
|
+
suffixSelectorVendorsByPrefixSelectorVendor[''] = this.vendorSuffixSelectors ? Object.keys(this.vendorSuffixSelectors) : [
|
|
336
|
+
''
|
|
337
|
+
];
|
|
424
338
|
}
|
|
425
339
|
// 5. atTokens
|
|
426
340
|
for(let i = 1; i < stateTokens.length; i++){
|
|
@@ -598,13 +512,20 @@ class SyntaxRule extends Rule {
|
|
|
598
512
|
if (propertiesText.length) {
|
|
599
513
|
for(const prefixSelectorVendor in suffixSelectorVendorsByPrefixSelectorVendor){
|
|
600
514
|
for (const eachSuffixSelectorVendor of suffixSelectorVendorsByPrefixSelectorVendor[prefixSelectorVendor]){
|
|
515
|
+
const prefixSelectors = this.vendorPrefixSelectors?.[prefixSelectorVendor];
|
|
516
|
+
const suffixSelectors = this.vendorSuffixSelectors?.[eachSuffixSelectorVendor];
|
|
517
|
+
if (this.css.supportVendors) {
|
|
518
|
+
if (prefixSelectorVendor && !this.css.supportVendors?.has(prefixSelectorVendor) || eachSuffixSelectorVendor && !this.css.supportVendors?.has(eachSuffixSelectorVendor)) {
|
|
519
|
+
continue;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
601
522
|
let prefixText = '';
|
|
602
523
|
if (this.direction) {
|
|
603
524
|
prefixText += '[dir=' + this.direction + '] ';
|
|
604
525
|
}
|
|
605
|
-
const
|
|
606
|
-
|
|
607
|
-
|
|
526
|
+
const prefixTexts = prefixSelectors ? prefixSelectors.map((eachPrefixSelector)=>eachPrefixSelector + prefixText) : [
|
|
527
|
+
prefixText
|
|
528
|
+
];
|
|
608
529
|
const getCssText = (name)=>prefixTexts.map((eachPrefixText)=>{
|
|
609
530
|
let modePrefix = '';
|
|
610
531
|
if (this.mode) {
|
|
@@ -615,22 +536,27 @@ class SyntaxRule extends Rule {
|
|
|
615
536
|
}
|
|
616
537
|
return modePrefix + (scope ? scope + ' ' : '') + eachPrefixText;
|
|
617
538
|
}).reduce((arr, eachPrefixText)=>{
|
|
618
|
-
arr.push(suffixSelectors.reduce((_arr, eachSuffixSelector)=>{
|
|
539
|
+
arr.push(suffixSelectors ? suffixSelectors.reduce((_arr, eachSuffixSelector)=>{
|
|
619
540
|
_arr.push(eachPrefixText + '.' + cssEscape(name) + eachSuffixSelector);
|
|
620
541
|
return _arr;
|
|
621
|
-
}, []).join(','));
|
|
542
|
+
}, []).join(',') : eachPrefixText + '.' + cssEscape(name));
|
|
622
543
|
return arr;
|
|
623
544
|
}, []).join(',');
|
|
624
|
-
|
|
545
|
+
const selectorText = getCssText(fixedClass ?? name);
|
|
546
|
+
let cssText = selectorText + '{' + propertiesText.join(';') + '}';
|
|
625
547
|
for (const key of Object.keys(this.at).sort((_a, b)=>b === 'supports' ? -1 : 1)){
|
|
626
548
|
cssText = '@' + key + (key.includes(' ') ? '' : ' ') + this.at[key].map((eachAtComponent)=>this.resolveAtComponent(eachAtComponent)).join(' ') + '{' + cssText + '}';
|
|
627
549
|
}
|
|
628
550
|
if (this.mode && modes?.[this.mode] === 'media') {
|
|
629
551
|
cssText = `@media(prefers-color-scheme:${this.mode}){` + cssText + '}';
|
|
630
552
|
}
|
|
631
|
-
|
|
632
|
-
text: cssText
|
|
633
|
-
|
|
553
|
+
const node = {
|
|
554
|
+
text: cssText,
|
|
555
|
+
selectorText
|
|
556
|
+
};
|
|
557
|
+
if (prefixSelectors) node.prefixSelectors = prefixSelectors;
|
|
558
|
+
if (suffixSelectors) node.suffixSelectors = suffixSelectors;
|
|
559
|
+
this.nodes.push(node);
|
|
634
560
|
}
|
|
635
561
|
}
|
|
636
562
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Vendors = 'webkit' | 'moz' | 'ms' | 'o';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
function areRuleSelectorsEqual(aSyntaxRule, bSyntaxRule) {
|
|
4
4
|
// suffix
|
|
5
|
-
const aVendorSuffixSelectorKeys = Object.keys(aSyntaxRule.vendorSuffixSelectors);
|
|
6
|
-
const bVendorSuffixSelectorKeys = Object.keys(bSyntaxRule.vendorSuffixSelectors);
|
|
5
|
+
const aVendorSuffixSelectorKeys = aSyntaxRule.vendorSuffixSelectors ? Object.keys(aSyntaxRule.vendorSuffixSelectors) : [];
|
|
6
|
+
const bVendorSuffixSelectorKeys = bSyntaxRule.vendorSuffixSelectors ? Object.keys(bSyntaxRule.vendorSuffixSelectors) : [];
|
|
7
7
|
if (aVendorSuffixSelectorKeys.length !== bVendorSuffixSelectorKeys.length) return false;
|
|
8
8
|
const isSameVendorSuffixSelectors = aVendorSuffixSelectorKeys.every((eachAKey)=>{
|
|
9
9
|
if (!Object.prototype.hasOwnProperty.call(bSyntaxRule.vendorSuffixSelectors, eachAKey)) return false;
|
|
@@ -13,13 +13,13 @@ function areRuleSelectorsEqual(aSyntaxRule, bSyntaxRule) {
|
|
|
13
13
|
});
|
|
14
14
|
if (!isSameVendorSuffixSelectors) return false;
|
|
15
15
|
// prefix
|
|
16
|
-
const aVendorPrefixSelectorKeys = Object.keys(aSyntaxRule.vendorPrefixSelectors);
|
|
17
|
-
const bVendorPrefixSelectorKeys = Object.keys(bSyntaxRule.vendorPrefixSelectors);
|
|
16
|
+
const aVendorPrefixSelectorKeys = aSyntaxRule.vendorPrefixSelectors ? Object.keys(aSyntaxRule.vendorPrefixSelectors) : [];
|
|
17
|
+
const bVendorPrefixSelectorKeys = bSyntaxRule.vendorPrefixSelectors ? Object.keys(bSyntaxRule.vendorPrefixSelectors) : [];
|
|
18
18
|
if (aVendorPrefixSelectorKeys.length !== bVendorPrefixSelectorKeys.length) return false;
|
|
19
19
|
const isSameVendorPrefixSelectors = aVendorPrefixSelectorKeys.every((eachAKey)=>{
|
|
20
20
|
if (!Object.prototype.hasOwnProperty.call(bSyntaxRule.vendorPrefixSelectors, eachAKey)) return false;
|
|
21
|
-
const aValues = aSyntaxRule.vendorPrefixSelectors[eachAKey];
|
|
22
|
-
const bValues = bSyntaxRule.vendorPrefixSelectors[eachAKey];
|
|
21
|
+
const aValues = aSyntaxRule.vendorPrefixSelectors?.[eachAKey] || [];
|
|
22
|
+
const bValues = bSyntaxRule.vendorPrefixSelectors?.[eachAKey] || [];
|
|
23
23
|
return aValues.length === bValues.length && aValues.every((eachAValue)=>bValues.includes(eachAValue));
|
|
24
24
|
});
|
|
25
25
|
if (!isSameVendorPrefixSelectors) return false;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
function areRuleSelectorsEqual(aSyntaxRule, bSyntaxRule) {
|
|
2
2
|
// suffix
|
|
3
|
-
const aVendorSuffixSelectorKeys = Object.keys(aSyntaxRule.vendorSuffixSelectors);
|
|
4
|
-
const bVendorSuffixSelectorKeys = Object.keys(bSyntaxRule.vendorSuffixSelectors);
|
|
3
|
+
const aVendorSuffixSelectorKeys = aSyntaxRule.vendorSuffixSelectors ? Object.keys(aSyntaxRule.vendorSuffixSelectors) : [];
|
|
4
|
+
const bVendorSuffixSelectorKeys = bSyntaxRule.vendorSuffixSelectors ? Object.keys(bSyntaxRule.vendorSuffixSelectors) : [];
|
|
5
5
|
if (aVendorSuffixSelectorKeys.length !== bVendorSuffixSelectorKeys.length) return false;
|
|
6
6
|
const isSameVendorSuffixSelectors = aVendorSuffixSelectorKeys.every((eachAKey)=>{
|
|
7
7
|
if (!Object.prototype.hasOwnProperty.call(bSyntaxRule.vendorSuffixSelectors, eachAKey)) return false;
|
|
@@ -11,13 +11,13 @@ function areRuleSelectorsEqual(aSyntaxRule, bSyntaxRule) {
|
|
|
11
11
|
});
|
|
12
12
|
if (!isSameVendorSuffixSelectors) return false;
|
|
13
13
|
// prefix
|
|
14
|
-
const aVendorPrefixSelectorKeys = Object.keys(aSyntaxRule.vendorPrefixSelectors);
|
|
15
|
-
const bVendorPrefixSelectorKeys = Object.keys(bSyntaxRule.vendorPrefixSelectors);
|
|
14
|
+
const aVendorPrefixSelectorKeys = aSyntaxRule.vendorPrefixSelectors ? Object.keys(aSyntaxRule.vendorPrefixSelectors) : [];
|
|
15
|
+
const bVendorPrefixSelectorKeys = bSyntaxRule.vendorPrefixSelectors ? Object.keys(bSyntaxRule.vendorPrefixSelectors) : [];
|
|
16
16
|
if (aVendorPrefixSelectorKeys.length !== bVendorPrefixSelectorKeys.length) return false;
|
|
17
17
|
const isSameVendorPrefixSelectors = aVendorPrefixSelectorKeys.every((eachAKey)=>{
|
|
18
18
|
if (!Object.prototype.hasOwnProperty.call(bSyntaxRule.vendorPrefixSelectors, eachAKey)) return false;
|
|
19
|
-
const aValues = aSyntaxRule.vendorPrefixSelectors[eachAKey];
|
|
20
|
-
const bValues = bSyntaxRule.vendorPrefixSelectors[eachAKey];
|
|
19
|
+
const aValues = aSyntaxRule.vendorPrefixSelectors?.[eachAKey] || [];
|
|
20
|
+
const bValues = bSyntaxRule.vendorPrefixSelectors?.[eachAKey] || [];
|
|
21
21
|
return aValues.length === bValues.length && aValues.every((eachAValue)=>bValues.includes(eachAValue));
|
|
22
22
|
});
|
|
23
23
|
if (!isSameVendorPrefixSelectors) return false;
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@master/css","type":"module","scripts":{"build":"techor build \"src/**/*.ts\"","dev":"pnpm build --watch","test":"vitest","type-check":"tsc --noEmit","lint":"eslint"},"license":"MIT","description":"The CSS language and framework for rapidly building modern and high-performance websites","author":"Aoyue Design LLC.","funding":"https://rc.css.master.co/sponsor","homepage":"https://css.master.co","bugs":{"url":"https://github.com/master-co/css/issues"},"repository":{"type":"git","url":"https://github.com/master-co/css.git","directory":"packages/core"},"keywords":["style","styles","html","variants","virtual","virtual-css","utility","css","ui","lightweight","class","webpack","plugin","integration","vite","parcel","build-tools","mastercss"],"sideEffects":false,"main":"./dist/index.cjs","jsnext:main":"./dist/index.mjs","esnext":"./dist/index.mjs","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.cjs","import":"./dist/index.mjs"}},"bin":"./dist/bin/index.mjs","files":["dist"],"publishConfig":{"access":"public","provenance":true},"dependencies":{"@master/colors":"^2.1.0","@master/normal.css":"^3.1.0","@techor/extend":"^3.1.7","csstype":"^3.1.3"},"devDependencies":{"shared":"^2.0.0-rc.
|
|
1
|
+
{"name":"@master/css","type":"module","scripts":{"build":"techor build \"src/**/*.ts\"","dev":"pnpm build --watch","test":"vitest","type-check":"tsc --noEmit","lint":"eslint"},"license":"MIT","description":"The CSS language and framework for rapidly building modern and high-performance websites","author":"Aoyue Design LLC.","funding":"https://rc.css.master.co/sponsor","homepage":"https://css.master.co","bugs":{"url":"https://github.com/master-co/css/issues"},"repository":{"type":"git","url":"https://github.com/master-co/css.git","directory":"packages/core"},"keywords":["style","styles","html","variants","virtual","virtual-css","utility","css","ui","lightweight","class","webpack","plugin","integration","vite","parcel","build-tools","mastercss"],"sideEffects":false,"main":"./dist/index.cjs","jsnext:main":"./dist/index.mjs","esnext":"./dist/index.mjs","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.cjs","import":"./dist/index.mjs"}},"bin":"./dist/bin/index.mjs","files":["dist"],"publishConfig":{"access":"public","provenance":true},"dependencies":{"@master/colors":"^2.1.0","@master/normal.css":"^3.1.0","@techor/extend":"^3.1.7","csstype":"^3.1.3"},"devDependencies":{"shared":"^2.0.0-rc.53"},"version":"2.0.0-rc.53"}
|