@master/css 2.0.0-rc.60 → 2.0.0-rc.62

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.
Files changed (122) hide show
  1. package/dist/animation-rule.cjs +24 -0
  2. package/dist/animation-rule.d.ts +11 -0
  3. package/dist/animation-rule.mjs +22 -0
  4. package/dist/common.cjs +50 -1
  5. package/dist/common.d.ts +14 -0
  6. package/dist/common.mjs +45 -2
  7. package/dist/config/at.cjs +13 -10
  8. package/dist/config/at.d.ts +4 -1
  9. package/dist/config/at.mjs +13 -10
  10. package/dist/config/index.cjs +3 -0
  11. package/dist/config/index.d.ts +2 -1
  12. package/dist/config/index.mjs +3 -1
  13. package/dist/config/modes.d.ts +4 -2
  14. package/dist/config/rules.cjs +28 -46
  15. package/dist/config/rules.d.ts +4 -2
  16. package/dist/config/rules.mjs +28 -46
  17. package/dist/config/screens.cjs +17 -0
  18. package/dist/config/screens.d.ts +14 -0
  19. package/dist/config/screens.mjs +15 -0
  20. package/dist/config/selectors.cjs +11 -15
  21. package/dist/config/selectors.d.ts +10 -8
  22. package/dist/config/selectors.mjs +11 -15
  23. package/dist/config/utilities.cjs +3 -0
  24. package/dist/config/utilities.d.ts +3 -0
  25. package/dist/config/utilities.mjs +3 -0
  26. package/dist/config/variables.cjs +0 -13
  27. package/dist/config/variables.d.ts +0 -13
  28. package/dist/config/variables.mjs +0 -13
  29. package/dist/core.cjs +438 -476
  30. package/dist/core.d.ts +14 -6
  31. package/dist/core.mjs +438 -476
  32. package/dist/factories/with-syntax-layer.cjs +37 -260
  33. package/dist/factories/with-syntax-layer.mjs +37 -260
  34. package/dist/index.cjs +38 -12
  35. package/dist/index.d.ts +19 -7
  36. package/dist/index.mjs +17 -7
  37. package/dist/layer.cjs +11 -7
  38. package/dist/layer.d.ts +4 -3
  39. package/dist/layer.mjs +11 -7
  40. package/dist/non-layer.cjs +10 -17
  41. package/dist/non-layer.d.ts +1 -1
  42. package/dist/non-layer.mjs +10 -17
  43. package/dist/rule.cjs +4 -6
  44. package/dist/rule.d.ts +3 -10
  45. package/dist/rule.mjs +4 -6
  46. package/dist/syntax-rule-type.cjs +7 -8
  47. package/dist/syntax-rule-type.d.ts +7 -7
  48. package/dist/syntax-rule-type.mjs +7 -8
  49. package/dist/syntax-rule.cjs +125 -315
  50. package/dist/syntax-rule.d.ts +18 -21
  51. package/dist/syntax-rule.mjs +126 -316
  52. package/dist/types/common.d.ts +2 -0
  53. package/dist/types/config.d.ts +12 -7
  54. package/dist/types/syntax.d.ts +5 -24
  55. package/dist/utils/compare-rule-priority.cjs +143 -0
  56. package/dist/utils/compare-rule-priority.d.ts +7 -0
  57. package/dist/utils/compare-rule-priority.mjs +138 -0
  58. package/dist/utils/equal-at-rules.cjs +22 -0
  59. package/dist/utils/equal-at-rules.d.ts +2 -0
  60. package/dist/utils/equal-at-rules.mjs +20 -0
  61. package/dist/utils/equal-declarations.cjs +10 -0
  62. package/dist/utils/equal-declarations.d.ts +2 -0
  63. package/dist/utils/equal-declarations.mjs +8 -0
  64. package/dist/utils/equal-selectors.cjs +70 -0
  65. package/dist/utils/equal-selectors.d.ts +2 -0
  66. package/dist/utils/equal-selectors.mjs +68 -0
  67. package/dist/utils/equal-variants.cjs +10 -0
  68. package/dist/utils/equal-variants.d.ts +2 -0
  69. package/dist/utils/equal-variants.mjs +8 -0
  70. package/dist/utils/extend-config.cjs +0 -1
  71. package/dist/utils/extend-config.mjs +0 -1
  72. package/dist/utils/generate-at.cjs +30 -0
  73. package/dist/utils/generate-at.d.ts +2 -0
  74. package/dist/utils/generate-at.mjs +28 -0
  75. package/dist/utils/generate-selector.cjs +49 -0
  76. package/dist/utils/generate-selector.d.ts +2 -0
  77. package/dist/utils/generate-selector.mjs +47 -0
  78. package/dist/utils/get-single-at-number-rule-node.cjs +9 -0
  79. package/dist/utils/get-single-at-number-rule-node.d.ts +2 -0
  80. package/dist/utils/get-single-at-number-rule-node.mjs +7 -0
  81. package/dist/utils/parse-at.cjs +157 -0
  82. package/dist/utils/parse-at.d.ts +39 -0
  83. package/dist/utils/parse-at.mjs +155 -0
  84. package/dist/utils/parse-pair.cjs +51 -0
  85. package/dist/utils/parse-pair.d.ts +8 -0
  86. package/dist/utils/parse-pair.mjs +49 -0
  87. package/dist/utils/parse-selector.cjs +112 -0
  88. package/dist/utils/parse-selector.d.ts +19 -0
  89. package/dist/utils/parse-selector.mjs +110 -0
  90. package/dist/utils/parse-value.cjs +39 -0
  91. package/dist/utils/parse-value.d.ts +2 -0
  92. package/dist/utils/parse-value.mjs +37 -0
  93. package/dist/utils/replace-char-outside-quotes.cjs +21 -0
  94. package/dist/utils/replace-char-outside-quotes.d.ts +1 -0
  95. package/dist/utils/replace-char-outside-quotes.mjs +19 -0
  96. package/dist/utils/sort-readable-classes.cjs +74 -0
  97. package/dist/utils/{reorder-for-readable-classes.d.ts → sort-readable-classes.d.ts} +1 -1
  98. package/dist/utils/sort-readable-classes.mjs +72 -0
  99. package/dist/utils/split-char-outside-quotes.cjs +29 -0
  100. package/dist/utils/split-char-outside-quotes.d.ts +1 -0
  101. package/dist/utils/split-char-outside-quotes.mjs +27 -0
  102. package/dist/variable-rule.cjs +86 -0
  103. package/dist/variable-rule.d.ts +23 -0
  104. package/dist/variable-rule.mjs +81 -0
  105. package/package.json +1 -1
  106. package/dist/utils/are-rule-at-equal.cjs +0 -22
  107. package/dist/utils/are-rule-at-equal.d.ts +0 -2
  108. package/dist/utils/are-rule-at-equal.mjs +0 -20
  109. package/dist/utils/are-rule-modes-equal.cjs +0 -7
  110. package/dist/utils/are-rule-modes-equal.d.ts +0 -2
  111. package/dist/utils/are-rule-modes-equal.mjs +0 -5
  112. package/dist/utils/are-rule-selectors-equal.cjs +0 -29
  113. package/dist/utils/are-rule-selectors-equal.d.ts +0 -2
  114. package/dist/utils/are-rule-selectors-equal.mjs +0 -27
  115. package/dist/utils/are-rule-states-equal.cjs +0 -11
  116. package/dist/utils/are-rule-states-equal.d.ts +0 -2
  117. package/dist/utils/are-rule-states-equal.mjs +0 -9
  118. package/dist/utils/are-rules-duplicated.cjs +0 -17
  119. package/dist/utils/are-rules-duplicated.d.ts +0 -2
  120. package/dist/utils/are-rules-duplicated.mjs +0 -15
  121. package/dist/utils/reorder-for-readable-classes.cjs +0 -62
  122. package/dist/utils/reorder-for-readable-classes.mjs +0 -60
@@ -0,0 +1,110 @@
1
+ import { SELECTOR_COMBINATORS } from '../common.mjs';
2
+ import MasterCSS from '../core.mjs';
3
+ import parsePair from './parse-pair.mjs';
4
+
5
+ const SELECTOR_REGEX = new RegExp(`(?:[a-zA-Z0-9-]+)|([${SELECTOR_COMBINATORS.join('')}.:,])|(a-zA-Z0-9-)`, 'g');
6
+ function parseSelector(token, css = new MasterCSS(), isRaw = true) {
7
+ const resolve = (eachToken)=>{
8
+ const nodes = [];
9
+ let currentPrefix = '';
10
+ let tokenIndex = 0;
11
+ for (const match of eachToken.matchAll(SELECTOR_REGEX)){
12
+ const raw = match[0];
13
+ tokenIndex += raw.length;
14
+ if (raw === ':' || raw === '.') {
15
+ currentPrefix += raw;
16
+ continue;
17
+ }
18
+ let type;
19
+ let value = raw;
20
+ const definedNodes = css.selectors.get(currentPrefix + raw);
21
+ if (definedNodes) {
22
+ const firstNode = definedNodes[definedNodes.length - 1];
23
+ nodes.push(definedNodes.length === 1 && firstNode.type ? {
24
+ ...firstNode,
25
+ raw: currentPrefix + raw
26
+ } : {
27
+ children: definedNodes,
28
+ raw: currentPrefix + raw
29
+ });
30
+ currentPrefix = '';
31
+ continue;
32
+ }
33
+ if (SELECTOR_COMBINATORS.includes(raw)) {
34
+ type = 'combinator';
35
+ if (raw === '_') {
36
+ const nextRawValue = eachToken[tokenIndex];
37
+ const prevRawValue = eachToken[tokenIndex - raw.length - 1];
38
+ if (prevRawValue !== '_' && nextRawValue !== '_') {
39
+ value = ' ' // support BEM __
40
+ ;
41
+ }
42
+ }
43
+ } else if (raw === ',') {
44
+ type = 'separator';
45
+ } else if (currentPrefix === ':') {
46
+ type = 'pseudo-class';
47
+ } else if (currentPrefix === '::') {
48
+ type = 'pseudo-element';
49
+ } else if (currentPrefix === '.') {
50
+ type = 'class';
51
+ }
52
+ nodes.push({
53
+ value,
54
+ ...isRaw && {
55
+ raw: currentPrefix + raw
56
+ },
57
+ ...type && {
58
+ type
59
+ }
60
+ });
61
+ currentPrefix = '';
62
+ }
63
+ return nodes;
64
+ };
65
+ const pair = (eachToken, nodes = [])=>{
66
+ const paired = parsePair(eachToken);
67
+ if (paired) {
68
+ let { pre, body, post } = paired;
69
+ let name;
70
+ if (body) {
71
+ const lastColonIndex = pre.lastIndexOf(':');
72
+ if (lastColonIndex !== -1) {
73
+ name = pre.slice(lastColonIndex);
74
+ pre = pre.slice(0, lastColonIndex);
75
+ }
76
+ }
77
+ if (pre) nodes.push(...pair(pre));
78
+ if (body) {
79
+ const children = pair(body);
80
+ if (name) {
81
+ const node = resolve(name)[0];
82
+ if (children.length) node.children = children;
83
+ nodes.push(node);
84
+ } else {
85
+ nodes.push(...children);
86
+ }
87
+ }
88
+ if (post) nodes.push(...pair(post));
89
+ return nodes;
90
+ }
91
+ const attrPaired = parsePair(eachToken, '[', ']');
92
+ if (attrPaired) {
93
+ const { pre, body, post } = attrPaired;
94
+ if (pre) nodes.push(...pair(pre));
95
+ nodes.push({
96
+ value: body,
97
+ type: 'attribute',
98
+ ...isRaw && {
99
+ raw: `[${body}]`
100
+ }
101
+ });
102
+ if (post) nodes.push(...pair(post));
103
+ return nodes;
104
+ }
105
+ return resolve(eachToken);
106
+ };
107
+ return pair(token);
108
+ }
109
+
110
+ export { parseSelector as default };
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ var common = require('../common.cjs');
4
+
5
+ function parseValue(token, unit = '', rootSize = 1) {
6
+ const isNumber = typeof token === 'number';
7
+ const defaultUnit = unit;
8
+ // 如果是純數字
9
+ if (isNumber) {
10
+ return {
11
+ unit: defaultUnit,
12
+ type: 'number',
13
+ value: defaultUnit === 'rem' || defaultUnit === 'em' ? token / rootSize : token
14
+ };
15
+ }
16
+ const matches = token.match(common.UNIT_REGEX);
17
+ if (matches) {
18
+ let value = parseFloat(matches[1]);
19
+ let parsedUnit = matches[2] || '';
20
+ if (!parsedUnit && (defaultUnit === 'rem' || defaultUnit === 'em')) {
21
+ value = value / rootSize;
22
+ parsedUnit = defaultUnit;
23
+ }
24
+ return {
25
+ token,
26
+ value,
27
+ unit: parsedUnit || defaultUnit,
28
+ type: 'number'
29
+ };
30
+ }
31
+ // 無法解析則當作純字串
32
+ return {
33
+ token,
34
+ value: token,
35
+ type: 'string'
36
+ };
37
+ }
38
+
39
+ module.exports = parseValue;
@@ -0,0 +1,2 @@
1
+ import { NumberValueComponent, StringValueComponent } from '../types/syntax';
2
+ export default function parseValue(token: string | number, unit?: string, rootSize?: number): StringValueComponent | NumberValueComponent;
@@ -0,0 +1,37 @@
1
+ import { UNIT_REGEX } from '../common.mjs';
2
+
3
+ function parseValue(token, unit = '', rootSize = 1) {
4
+ const isNumber = typeof token === 'number';
5
+ const defaultUnit = unit;
6
+ // 如果是純數字
7
+ if (isNumber) {
8
+ return {
9
+ unit: defaultUnit,
10
+ type: 'number',
11
+ value: defaultUnit === 'rem' || defaultUnit === 'em' ? token / rootSize : token
12
+ };
13
+ }
14
+ const matches = token.match(UNIT_REGEX);
15
+ if (matches) {
16
+ let value = parseFloat(matches[1]);
17
+ let parsedUnit = matches[2] || '';
18
+ if (!parsedUnit && (defaultUnit === 'rem' || defaultUnit === 'em')) {
19
+ value = value / rootSize;
20
+ parsedUnit = defaultUnit;
21
+ }
22
+ return {
23
+ token,
24
+ value,
25
+ unit: parsedUnit || defaultUnit,
26
+ type: 'number'
27
+ };
28
+ }
29
+ // 無法解析則當作純字串
30
+ return {
31
+ token,
32
+ value: token,
33
+ type: 'string'
34
+ };
35
+ }
36
+
37
+ export { parseValue as default };
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ function replaceCharOutsideQuotes(str, target, replace) {
4
+ let result = '';
5
+ let inSingle = false;
6
+ let inDouble = false;
7
+ for(let i = 0; i < str.length; i++){
8
+ const char = str[i];
9
+ const prev = str[i - 1];
10
+ if (char === '\'' && prev !== '\\' && !inDouble) inSingle = !inSingle;
11
+ else if (char === '"' && prev !== '\\' && !inSingle) inDouble = !inDouble;
12
+ if (char === target && !inSingle && !inDouble) {
13
+ result += replace;
14
+ } else {
15
+ result += char;
16
+ }
17
+ }
18
+ return result;
19
+ }
20
+
21
+ module.exports = replaceCharOutsideQuotes;
@@ -0,0 +1 @@
1
+ export default function replaceCharOutsideQuotes(str: string, target: string, replace: string): string;
@@ -0,0 +1,19 @@
1
+ function replaceCharOutsideQuotes(str, target, replace) {
2
+ let result = '';
3
+ let inSingle = false;
4
+ let inDouble = false;
5
+ for(let i = 0; i < str.length; i++){
6
+ const char = str[i];
7
+ const prev = str[i - 1];
8
+ if (char === '\'' && prev !== '\\' && !inDouble) inSingle = !inSingle;
9
+ else if (char === '"' && prev !== '\\' && !inSingle) inDouble = !inDouble;
10
+ if (char === target && !inSingle && !inDouble) {
11
+ result += replace;
12
+ } else {
13
+ result += char;
14
+ }
15
+ }
16
+ return result;
17
+ }
18
+
19
+ export { replaceCharOutsideQuotes as default };
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ var syntaxRuleType = require('../syntax-rule-type.cjs');
4
+ var core = require('../core.cjs');
5
+ var compareRulePriority = require('./compare-rule-priority.cjs');
6
+
7
+ /**
8
+ * Sorts classes in a consistent order
9
+ * @param classes
10
+ * @param options
11
+ * @returns consistent classes
12
+ */ function sortReadableClasses(classes, css = new core()) {
13
+ css.add(...classes);
14
+ // 先去重 fixedClass for componentsLayer
15
+ const seenFixed = new Set();
16
+ const dedupedComponentRules = css.componentsLayer.rules.filter((rule)=>{
17
+ if (!rule.fixedClass) return true;
18
+ if (seenFixed.has(rule.fixedClass)) return false;
19
+ seenFixed.add(rule.fixedClass);
20
+ return true;
21
+ });
22
+ const allRules = [
23
+ ...dedupedComponentRules,
24
+ ...css.generalLayer.rules,
25
+ ...css.baseLayer.rules,
26
+ ...css.presetLayer.rules
27
+ ];
28
+ const baseSet = new Set(css.baseLayer.rules);
29
+ const presetSet = new Set(css.presetLayer.rules);
30
+ const getGroupIndex = (rule)=>{
31
+ if (baseSet.has(rule)) return 4;
32
+ if (presetSet.has(rule)) return 5;
33
+ if (rule.atRules) return 3;
34
+ if (rule.mode) return 2;
35
+ if (rule.selectorNodes?.length) return 1;
36
+ return 0;
37
+ };
38
+ const getTypeScore = (rule)=>{
39
+ if (rule.fixedClass) return 0;
40
+ if (rule.type === syntaxRuleType.Utility) return 1;
41
+ return 2;
42
+ };
43
+ const rulesWithSortKey = allRules.map((rule)=>({
44
+ rule,
45
+ sortKey: [
46
+ getGroupIndex(rule),
47
+ getTypeScore(rule)
48
+ ]
49
+ }));
50
+ const sortedRules = rulesWithSortKey.sort((a, b)=>{
51
+ for(let i = 0; i < a.sortKey.length; i++){
52
+ if (a.sortKey[i] !== b.sortKey[i]) {
53
+ return a.sortKey[i] - b.sortKey[i];
54
+ }
55
+ }
56
+ if (a.rule.fixedClass && b.rule.fixedClass) {
57
+ return a.rule.fixedClass.localeCompare(b.rule.fixedClass, undefined, {
58
+ numeric: true
59
+ });
60
+ }
61
+ return compareRulePriority.default(a.rule, b.rule);
62
+ });
63
+ const orderedClasses = sortedRules.map((entry)=>entry.rule.fixedClass || entry.rule.name);
64
+ const unknownClasses = classes.filter((className)=>orderedClasses.indexOf(className) === -1).sort((a, b)=>a.localeCompare(b, undefined, {
65
+ numeric: true
66
+ }));
67
+ css.remove(...classes);
68
+ return [
69
+ ...orderedClasses,
70
+ ...unknownClasses
71
+ ];
72
+ }
73
+
74
+ module.exports = sortReadableClasses;
@@ -5,4 +5,4 @@ import MasterCSS from '../core';
5
5
  * @param options
6
6
  * @returns consistent classes
7
7
  */
8
- export default function reorderForReadableClasses(classes: string[], css?: MasterCSS): string[];
8
+ export default function sortReadableClasses(classes: string[], css?: MasterCSS): string[];
@@ -0,0 +1,72 @@
1
+ import SyntaxRuleType from '../syntax-rule-type.mjs';
2
+ import MasterCSS from '../core.mjs';
3
+ import compareRulePriority from './compare-rule-priority.mjs';
4
+
5
+ /**
6
+ * Sorts classes in a consistent order
7
+ * @param classes
8
+ * @param options
9
+ * @returns consistent classes
10
+ */ function sortReadableClasses(classes, css = new MasterCSS()) {
11
+ css.add(...classes);
12
+ // 先去重 fixedClass for componentsLayer
13
+ const seenFixed = new Set();
14
+ const dedupedComponentRules = css.componentsLayer.rules.filter((rule)=>{
15
+ if (!rule.fixedClass) return true;
16
+ if (seenFixed.has(rule.fixedClass)) return false;
17
+ seenFixed.add(rule.fixedClass);
18
+ return true;
19
+ });
20
+ const allRules = [
21
+ ...dedupedComponentRules,
22
+ ...css.generalLayer.rules,
23
+ ...css.baseLayer.rules,
24
+ ...css.presetLayer.rules
25
+ ];
26
+ const baseSet = new Set(css.baseLayer.rules);
27
+ const presetSet = new Set(css.presetLayer.rules);
28
+ const getGroupIndex = (rule)=>{
29
+ if (baseSet.has(rule)) return 4;
30
+ if (presetSet.has(rule)) return 5;
31
+ if (rule.atRules) return 3;
32
+ if (rule.mode) return 2;
33
+ if (rule.selectorNodes?.length) return 1;
34
+ return 0;
35
+ };
36
+ const getTypeScore = (rule)=>{
37
+ if (rule.fixedClass) return 0;
38
+ if (rule.type === SyntaxRuleType.Utility) return 1;
39
+ return 2;
40
+ };
41
+ const rulesWithSortKey = allRules.map((rule)=>({
42
+ rule,
43
+ sortKey: [
44
+ getGroupIndex(rule),
45
+ getTypeScore(rule)
46
+ ]
47
+ }));
48
+ const sortedRules = rulesWithSortKey.sort((a, b)=>{
49
+ for(let i = 0; i < a.sortKey.length; i++){
50
+ if (a.sortKey[i] !== b.sortKey[i]) {
51
+ return a.sortKey[i] - b.sortKey[i];
52
+ }
53
+ }
54
+ if (a.rule.fixedClass && b.rule.fixedClass) {
55
+ return a.rule.fixedClass.localeCompare(b.rule.fixedClass, undefined, {
56
+ numeric: true
57
+ });
58
+ }
59
+ return compareRulePriority(a.rule, b.rule);
60
+ });
61
+ const orderedClasses = sortedRules.map((entry)=>entry.rule.fixedClass || entry.rule.name);
62
+ const unknownClasses = classes.filter((className)=>orderedClasses.indexOf(className) === -1).sort((a, b)=>a.localeCompare(b, undefined, {
63
+ numeric: true
64
+ }));
65
+ css.remove(...classes);
66
+ return [
67
+ ...orderedClasses,
68
+ ...unknownClasses
69
+ ];
70
+ }
71
+
72
+ export { sortReadableClasses as default };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ function splitCharOutsideQuotes(str, char) {
4
+ const result = [];
5
+ let current = '';
6
+ let inSingle = false;
7
+ let inDouble = false;
8
+ for(let i = 0; i < str.length; i++){
9
+ const c = str[i];
10
+ const prev = str[i - 1];
11
+ // 處理 quote 開關
12
+ if (c === '\'' && !inDouble && prev !== '\\') {
13
+ inSingle = !inSingle;
14
+ } else if (c === '"' && !inSingle && prev !== '\\') {
15
+ inDouble = !inDouble;
16
+ }
17
+ // 在引號之外遇到目標字元就切分
18
+ if (c === char && !inSingle && !inDouble) {
19
+ result.push(current.trim());
20
+ current = '';
21
+ } else {
22
+ current += c;
23
+ }
24
+ }
25
+ if (current) result.push(current.trim());
26
+ return result;
27
+ }
28
+
29
+ module.exports = splitCharOutsideQuotes;
@@ -0,0 +1 @@
1
+ export default function splitCharOutsideQuotes(str: string, char: string): string[];
@@ -0,0 +1,27 @@
1
+ function splitCharOutsideQuotes(str, char) {
2
+ const result = [];
3
+ let current = '';
4
+ let inSingle = false;
5
+ let inDouble = false;
6
+ for(let i = 0; i < str.length; i++){
7
+ const c = str[i];
8
+ const prev = str[i - 1];
9
+ // 處理 quote 開關
10
+ if (c === '\'' && !inDouble && prev !== '\\') {
11
+ inSingle = !inSingle;
12
+ } else if (c === '"' && !inSingle && prev !== '\\') {
13
+ inDouble = !inDouble;
14
+ }
15
+ // 在引號之外遇到目標字元就切分
16
+ if (c === char && !inSingle && !inDouble) {
17
+ result.push(current.trim());
18
+ current = '';
19
+ } else {
20
+ current += c;
21
+ }
22
+ }
23
+ if (current) result.push(current.trim());
24
+ return result;
25
+ }
26
+
27
+ export { splitCharOutsideQuotes as default };
@@ -0,0 +1,86 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ class VariableRule {
6
+ name;
7
+ variable;
8
+ css;
9
+ nodes;
10
+ constructor(name, variable, css){
11
+ this.name = name;
12
+ this.variable = variable;
13
+ this.css = css;
14
+ this.nodes = [];
15
+ const hasDefaultValue = variable.value !== undefined;
16
+ if (hasDefaultValue) {
17
+ this.nodes.push(new VariableRuleNode(this.name, variable, css));
18
+ }
19
+ if (variable.modes) {
20
+ for(const mode in variable.modes){
21
+ const modeVariable = variable.modes[mode];
22
+ const variableRule = new VariableRuleNode(this.name, modeVariable, css, mode);
23
+ if (variableRule.modeTrigger) {
24
+ const isDefaultMode = hasDefaultValue ? false : this.css.config.defaultMode === mode;
25
+ variableRule.isDefaultMode = isDefaultMode;
26
+ if (isDefaultMode) {
27
+ this.nodes.unshift(variableRule);
28
+ } else {
29
+ this.nodes.push(variableRule);
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ get key() {
36
+ return this.name;
37
+ }
38
+ get text() {
39
+ return this.nodes.map(({ text })=>text).join('');
40
+ }
41
+ }
42
+ class VariableRuleNode {
43
+ name;
44
+ variable;
45
+ css;
46
+ mode;
47
+ native;
48
+ isDefaultMode;
49
+ constructor(name, variable, css, mode){
50
+ this.name = name;
51
+ this.variable = variable;
52
+ this.css = css;
53
+ this.mode = mode;
54
+ this.isDefaultMode = false;
55
+ }
56
+ get modeTrigger() {
57
+ return this.mode ? this.css.config.modes?.[this.mode] : undefined;
58
+ }
59
+ get selectorText() {
60
+ const isDefaultMode = this.isDefaultMode;
61
+ if (this.mode) {
62
+ switch(this.modeTrigger){
63
+ case 'media':
64
+ return ':root';
65
+ case 'host':
66
+ return `:host(.${this.mode})` + (isDefaultMode ? ',:host' : '');
67
+ case 'class':
68
+ return `.${this.mode}` + (isDefaultMode ? ',:root' : '');
69
+ default:
70
+ return '';
71
+ }
72
+ } else {
73
+ return ':root';
74
+ }
75
+ }
76
+ get text() {
77
+ let text = `${this.selectorText}{--${this.name}:${String(this.variable.value)}}`;
78
+ if (this.modeTrigger === 'media') {
79
+ text = `@media (prefers-color-scheme:${this.mode}){${text}}`;
80
+ }
81
+ return text;
82
+ }
83
+ }
84
+
85
+ exports.VariableRuleNode = VariableRuleNode;
86
+ exports.default = VariableRule;
@@ -0,0 +1,23 @@
1
+ import MasterCSS from './core';
2
+ import { LiteralVariable, Variable } from './types/syntax';
3
+ export default class VariableRule {
4
+ readonly name: string;
5
+ readonly variable: Variable;
6
+ readonly css: MasterCSS;
7
+ nodes: VariableRuleNode[];
8
+ constructor(name: string, variable: Variable, css: MasterCSS);
9
+ get key(): string;
10
+ get text(): string;
11
+ }
12
+ export declare class VariableRuleNode {
13
+ readonly name: string;
14
+ readonly variable: LiteralVariable;
15
+ readonly css: MasterCSS;
16
+ readonly mode?: string | undefined;
17
+ native?: CSSRule;
18
+ isDefaultMode: boolean;
19
+ constructor(name: string, variable: LiteralVariable, css: MasterCSS, mode?: string | undefined);
20
+ get modeTrigger(): false | "class" | "media" | "host" | undefined;
21
+ get selectorText(): string;
22
+ get text(): string;
23
+ }
@@ -0,0 +1,81 @@
1
+ class VariableRule {
2
+ name;
3
+ variable;
4
+ css;
5
+ nodes;
6
+ constructor(name, variable, css){
7
+ this.name = name;
8
+ this.variable = variable;
9
+ this.css = css;
10
+ this.nodes = [];
11
+ const hasDefaultValue = variable.value !== undefined;
12
+ if (hasDefaultValue) {
13
+ this.nodes.push(new VariableRuleNode(this.name, variable, css));
14
+ }
15
+ if (variable.modes) {
16
+ for(const mode in variable.modes){
17
+ const modeVariable = variable.modes[mode];
18
+ const variableRule = new VariableRuleNode(this.name, modeVariable, css, mode);
19
+ if (variableRule.modeTrigger) {
20
+ const isDefaultMode = hasDefaultValue ? false : this.css.config.defaultMode === mode;
21
+ variableRule.isDefaultMode = isDefaultMode;
22
+ if (isDefaultMode) {
23
+ this.nodes.unshift(variableRule);
24
+ } else {
25
+ this.nodes.push(variableRule);
26
+ }
27
+ }
28
+ }
29
+ }
30
+ }
31
+ get key() {
32
+ return this.name;
33
+ }
34
+ get text() {
35
+ return this.nodes.map(({ text })=>text).join('');
36
+ }
37
+ }
38
+ class VariableRuleNode {
39
+ name;
40
+ variable;
41
+ css;
42
+ mode;
43
+ native;
44
+ isDefaultMode;
45
+ constructor(name, variable, css, mode){
46
+ this.name = name;
47
+ this.variable = variable;
48
+ this.css = css;
49
+ this.mode = mode;
50
+ this.isDefaultMode = false;
51
+ }
52
+ get modeTrigger() {
53
+ return this.mode ? this.css.config.modes?.[this.mode] : undefined;
54
+ }
55
+ get selectorText() {
56
+ const isDefaultMode = this.isDefaultMode;
57
+ if (this.mode) {
58
+ switch(this.modeTrigger){
59
+ case 'media':
60
+ return ':root';
61
+ case 'host':
62
+ return `:host(.${this.mode})` + (isDefaultMode ? ',:host' : '');
63
+ case 'class':
64
+ return `.${this.mode}` + (isDefaultMode ? ',:root' : '');
65
+ default:
66
+ return '';
67
+ }
68
+ } else {
69
+ return ':root';
70
+ }
71
+ }
72
+ get text() {
73
+ let text = `${this.selectorText}{--${this.name}:${String(this.variable.value)}}`;
74
+ if (this.modeTrigger === 'media') {
75
+ text = `@media (prefers-color-scheme:${this.mode}){${text}}`;
76
+ }
77
+ return text;
78
+ }
79
+ }
80
+
81
+ export { VariableRuleNode, VariableRule as default };
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.2.0","csstype":"^3.1.3"},"devDependencies":{"shared":"^2.0.0-rc.60"},"version":"2.0.0-rc.60"}
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.1","@master/normal.css":"^3.1.0","@techor/extend":"^3.2.0","csstype":"^3.1.3"},"devDependencies":{"shared":"^2.0.0-rc.62"},"version":"2.0.0-rc.62"}
@@ -1,22 +0,0 @@
1
- 'use strict';
2
-
3
- function areRuleAtEqual(aSyntaxRule, bSyntaxRule) {
4
- const aQueryTypes = Object.keys(aSyntaxRule.at);
5
- const bQueryTypes = Object.keys(bSyntaxRule.at);
6
- if (aQueryTypes.length !== bQueryTypes.length) {
7
- return false;
8
- }
9
- for (const aQueryType of aQueryTypes){
10
- const aAtComponents = aSyntaxRule.at[aQueryType];
11
- const bAtComponents = bSyntaxRule.at[aQueryType];
12
- for (const aAtComponent of aAtComponents){
13
- const aAtComponentToken = aSyntaxRule.resolveAtComponent(aAtComponent);
14
- if (!bAtComponents.find((bAtComponent)=>bSyntaxRule.resolveAtComponent(bAtComponent) === aAtComponentToken)) {
15
- return false;
16
- }
17
- }
18
- }
19
- return true;
20
- }
21
-
22
- module.exports = areRuleAtEqual;