stylelint-plugin-grid 1.0.0

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 (110) hide show
  1. package/CHANGELOG.md +0 -0
  2. package/LICENSE +21 -0
  3. package/README.md +93 -0
  4. package/dist/_internal/create-stylelint-rule.d.ts +49 -0
  5. package/dist/_internal/create-stylelint-rule.d.ts.map +1 -0
  6. package/dist/_internal/create-stylelint-rule.js +34 -0
  7. package/dist/_internal/create-stylelint-rule.js.map +1 -0
  8. package/dist/_internal/grid-template-analysis.d.ts +62 -0
  9. package/dist/_internal/grid-template-analysis.d.ts.map +1 -0
  10. package/dist/_internal/grid-template-analysis.js +346 -0
  11. package/dist/_internal/grid-template-analysis.js.map +1 -0
  12. package/dist/_internal/plugin-constants.d.ts +30 -0
  13. package/dist/_internal/plugin-constants.d.ts.map +1 -0
  14. package/dist/_internal/plugin-constants.js +47 -0
  15. package/dist/_internal/plugin-constants.js.map +1 -0
  16. package/dist/_internal/rules-registry.d.ts +10 -0
  17. package/dist/_internal/rules-registry.d.ts.map +1 -0
  18. package/dist/_internal/rules-registry.js +31 -0
  19. package/dist/_internal/rules-registry.js.map +1 -0
  20. package/dist/configs/grid-all.cjs +3 -0
  21. package/dist/configs/grid-all.d.cts +3 -0
  22. package/dist/configs/grid-all.d.ts +9 -0
  23. package/dist/configs/grid-all.d.ts.map +1 -0
  24. package/dist/configs/grid-all.js +9 -0
  25. package/dist/configs/grid-all.js.map +1 -0
  26. package/dist/configs/grid-recommended.cjs +3 -0
  27. package/dist/configs/grid-recommended.d.cts +3 -0
  28. package/dist/configs/grid-recommended.d.ts +9 -0
  29. package/dist/configs/grid-recommended.d.ts.map +1 -0
  30. package/dist/configs/grid-recommended.js +9 -0
  31. package/dist/configs/grid-recommended.js.map +1 -0
  32. package/dist/plugin.cjs +1268 -0
  33. package/dist/plugin.cjs.map +7 -0
  34. package/dist/plugin.d.cts +45 -0
  35. package/dist/plugin.d.ts +45 -0
  36. package/dist/plugin.d.ts.map +1 -0
  37. package/dist/plugin.js +78 -0
  38. package/dist/plugin.js.map +1 -0
  39. package/dist/rules/consistent-area-naming.d.ts +12 -0
  40. package/dist/rules/consistent-area-naming.d.ts.map +1 -0
  41. package/dist/rules/consistent-area-naming.js +86 -0
  42. package/dist/rules/consistent-area-naming.js.map +1 -0
  43. package/dist/rules/no-dense-auto-flow.d.ts +8 -0
  44. package/dist/rules/no-dense-auto-flow.d.ts.map +1 -0
  45. package/dist/rules/no-dense-auto-flow.js +44 -0
  46. package/dist/rules/no-dense-auto-flow.js.map +1 -0
  47. package/dist/rules/no-invalid-areas.d.ts +8 -0
  48. package/dist/rules/no-invalid-areas.d.ts.map +1 -0
  49. package/dist/rules/no-invalid-areas.js +42 -0
  50. package/dist/rules/no-invalid-areas.js.map +1 -0
  51. package/dist/rules/no-invalid-auto-repeat.d.ts +8 -0
  52. package/dist/rules/no-invalid-auto-repeat.d.ts.map +1 -0
  53. package/dist/rules/no-invalid-auto-repeat.js +189 -0
  54. package/dist/rules/no-invalid-auto-repeat.js.map +1 -0
  55. package/dist/rules/no-invalid-minmax.d.ts +8 -0
  56. package/dist/rules/no-invalid-minmax.d.ts.map +1 -0
  57. package/dist/rules/no-invalid-minmax.js +58 -0
  58. package/dist/rules/no-invalid-minmax.js.map +1 -0
  59. package/dist/rules/no-mismatched-template-rows.d.ts +8 -0
  60. package/dist/rules/no-mismatched-template-rows.d.ts.map +1 -0
  61. package/dist/rules/no-mismatched-template-rows.js +50 -0
  62. package/dist/rules/no-mismatched-template-rows.js.map +1 -0
  63. package/dist/rules/no-overlapping-areas.d.ts +8 -0
  64. package/dist/rules/no-overlapping-areas.d.ts.map +1 -0
  65. package/dist/rules/no-overlapping-areas.js +48 -0
  66. package/dist/rules/no-overlapping-areas.js.map +1 -0
  67. package/dist/rules/no-unknown-areas.d.ts +8 -0
  68. package/dist/rules/no-unknown-areas.d.ts.map +1 -0
  69. package/dist/rules/no-unknown-areas.js +47 -0
  70. package/dist/rules/no-unknown-areas.js.map +1 -0
  71. package/dist/rules/no-unused-areas.d.ts +8 -0
  72. package/dist/rules/no-unused-areas.d.ts.map +1 -0
  73. package/dist/rules/no-unused-areas.js +48 -0
  74. package/dist/rules/no-unused-areas.js.map +1 -0
  75. package/dist/rules/prefer-gap-properties.d.ts +8 -0
  76. package/dist/rules/prefer-gap-properties.d.ts.map +1 -0
  77. package/dist/rules/prefer-gap-properties.js +58 -0
  78. package/dist/rules/prefer-gap-properties.js.map +1 -0
  79. package/dist/rules/require-explicit-rows-with-column-flow.d.ts +8 -0
  80. package/dist/rules/require-explicit-rows-with-column-flow.d.ts.map +1 -0
  81. package/dist/rules/require-explicit-rows-with-column-flow.js +52 -0
  82. package/dist/rules/require-explicit-rows-with-column-flow.js.map +1 -0
  83. package/dist/rules/validate-area-shapes.d.ts +8 -0
  84. package/dist/rules/validate-area-shapes.d.ts.map +1 -0
  85. package/dist/rules/validate-area-shapes.js +47 -0
  86. package/dist/rules/validate-area-shapes.js.map +1 -0
  87. package/dist/rules/validate-track-counts.d.ts +9 -0
  88. package/dist/rules/validate-track-counts.d.ts.map +1 -0
  89. package/dist/rules/validate-track-counts.js +67 -0
  90. package/dist/rules/validate-track-counts.js.map +1 -0
  91. package/docs/rules/configs/grid-all.md +42 -0
  92. package/docs/rules/configs/grid-recommended.md +37 -0
  93. package/docs/rules/configs/index.md +46 -0
  94. package/docs/rules/consistent-area-naming.md +41 -0
  95. package/docs/rules/getting-started.md +55 -0
  96. package/docs/rules/guides/current-status.md +44 -0
  97. package/docs/rules/no-dense-auto-flow.md +57 -0
  98. package/docs/rules/no-invalid-areas.md +55 -0
  99. package/docs/rules/no-invalid-auto-repeat.md +58 -0
  100. package/docs/rules/no-invalid-minmax.md +57 -0
  101. package/docs/rules/no-mismatched-template-rows.md +36 -0
  102. package/docs/rules/no-overlapping-areas.md +40 -0
  103. package/docs/rules/no-unknown-areas.md +39 -0
  104. package/docs/rules/no-unused-areas.md +44 -0
  105. package/docs/rules/overview.md +54 -0
  106. package/docs/rules/prefer-gap-properties.md +45 -0
  107. package/docs/rules/require-explicit-rows-with-column-flow.md +56 -0
  108. package/docs/rules/validate-area-shapes.md +46 -0
  109. package/docs/rules/validate-track-counts.md +39 -0
  110. package/package.json +355 -0
@@ -0,0 +1,42 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
3
+ import { collectGridTemplateAreas } from "../_internal/grid-template-analysis.js";
4
+ import { createRuleDocsUrl, createRuleName, } from "../_internal/plugin-constants.js";
5
+ const { report, ruleMessages, validateOptions } = stylelint.utils;
6
+ const ruleName = createRuleName("no-invalid-areas");
7
+ const messages = ruleMessages(ruleName, {
8
+ rejected: (message) => message,
9
+ });
10
+ const docs = {
11
+ description: "Disallow malformed `grid-template-areas` declarations.",
12
+ recommended: true,
13
+ url: createRuleDocsUrl("no-invalid-areas"),
14
+ };
15
+ const ruleFunction = (primary) => (root, result) => {
16
+ if (!validateOptions(result, ruleName, {
17
+ actual: primary,
18
+ possible: [true],
19
+ })) {
20
+ return;
21
+ }
22
+ for (const template of collectGridTemplateAreas(root)) {
23
+ for (const diagnostic of template.diagnostics) {
24
+ report({
25
+ message: messages.rejected(diagnostic.message),
26
+ node: template.declaration,
27
+ result,
28
+ ruleName,
29
+ word: diagnostic.token,
30
+ });
31
+ }
32
+ }
33
+ };
34
+ /** Public Stylelint rule definition. */
35
+ const rule = createStylelintRule({
36
+ docs,
37
+ messages,
38
+ rule: ruleFunction,
39
+ ruleName,
40
+ });
41
+ export default rule;
42
+ //# sourceMappingURL=no-invalid-areas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-invalid-areas.js","sourceRoot":"","sources":["../../src/rules/no-invalid-areas.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAiB,MAAM,WAAW,CAAC;AAErD,OAAO,EACH,mBAAmB,GAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EACH,iBAAiB,EACjB,cAAc,GACjB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;AAElE,MAAM,QAAQ,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;AACpD,MAAM,QAAQ,GAA8C,YAAY,CACpE,QAAQ,EACR;IACI,QAAQ,EAAE,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO;CACjD,CACJ,CAAC;AAEF,MAAM,IAAI,GAAG;IACT,WAAW,EAAE,wDAAwD;IACrE,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,iBAAiB,CAAC,kBAAkB,CAAC;CACpC,CAAC;AAEX,MAAM,YAAY,GACd,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;IAC1B,IACI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE;QAC/B,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB,CAAC,EACJ,CAAC;QACC,OAAO;IACX,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,CAAC;gBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC9C,IAAI,EAAE,QAAQ,CAAC,WAAW;gBAC1B,MAAM;gBACN,QAAQ;gBACR,IAAI,EAAE,UAAU,CAAC,KAAK;aACzB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEN,wCAAwC;AACxC,MAAM,IAAI,GACN,mBAAmB,CAAsC;IACrD,IAAI;IACJ,QAAQ;IACR,IAAI,EAAE,YAAY;IAClB,QAAQ;CACX,CAAC,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type StylelintPluginRule } from "../_internal/create-stylelint-rule.js";
2
+ declare const messages: {
3
+ rejected: (token: string, repeatKeyword: string) => string;
4
+ };
5
+ /** Public Stylelint rule definition. */
6
+ declare const rule: StylelintPluginRule<boolean, undefined, typeof messages>;
7
+ export default rule;
8
+ //# sourceMappingURL=no-invalid-auto-repeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-invalid-auto-repeat.d.ts","sourceRoot":"","sources":["../../src/rules/no-invalid-auto-repeat.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,mBAAmB,EAC3B,MAAM,uCAAuC,CAAC;AAc/C,QAAA,MAAM,QAAQ,EAAE;IACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;CAI7D,CAAC;AA4OH,wCAAwC;AACxC,QAAA,MAAM,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,QAAQ,CAM7D,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,189 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { arrayFirst, isDefined, setHas } from "ts-extras";
3
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
4
+ import { findValueFunctionCalls, splitTopLevelCommas, splitTopLevelWhitespace, } from "../_internal/grid-template-analysis.js";
5
+ import { createRuleDocsUrl, createRuleName, } from "../_internal/plugin-constants.js";
6
+ const { report, ruleMessages, validateOptions } = stylelint.utils;
7
+ const ruleName = createRuleName("no-invalid-auto-repeat");
8
+ const messages = ruleMessages(ruleName, {
9
+ rejected: (token, repeatKeyword) => `Use a fixed track size inside \`repeat(${repeatKeyword}, ...)\`; \`${token}\` can make the grid template declaration invalid.`,
10
+ });
11
+ const docs = {
12
+ description: "Disallow definitely invalid CSS Grid auto-repeat track sizes.",
13
+ recommended: true,
14
+ url: createRuleDocsUrl("no-invalid-auto-repeat"),
15
+ };
16
+ const trackTemplateProperties = new Set([
17
+ "grid-template-columns",
18
+ "grid-template-rows",
19
+ ]);
20
+ const invalidBareAutoRepeatTrackTokens = new Set([
21
+ "auto",
22
+ "max-content",
23
+ "min-content",
24
+ ]);
25
+ const cssLengthUnits = new Set([
26
+ "cap",
27
+ "ch",
28
+ "cm",
29
+ "dvb",
30
+ "dvh",
31
+ "dvi",
32
+ "dvmax",
33
+ "dvmin",
34
+ "dvw",
35
+ "em",
36
+ "ex",
37
+ "ic",
38
+ "in",
39
+ "lh",
40
+ "lvb",
41
+ "lvh",
42
+ "lvi",
43
+ "lvmax",
44
+ "lvmin",
45
+ "lvw",
46
+ "mm",
47
+ "pc",
48
+ "pt",
49
+ "px",
50
+ "q",
51
+ "rch",
52
+ "rem",
53
+ "rex",
54
+ "ric",
55
+ "rlh",
56
+ "svb",
57
+ "svh",
58
+ "svi",
59
+ "svmax",
60
+ "svmin",
61
+ "svw",
62
+ "vb",
63
+ "vh",
64
+ "vi",
65
+ "vmax",
66
+ "vmin",
67
+ "vw",
68
+ ]);
69
+ const lengthPercentagePattern = /^[+\-]?(?:\d+|\d*\.\d+)(?<unit>%|[A-Za-z]+)$/v;
70
+ const zeroPattern = /^[+\-]?(?:0|0?\.0+)$/v;
71
+ function containsRuntimeValue(token) {
72
+ const normalizedToken = token.toLowerCase();
73
+ return normalizedToken.includes("var(") || normalizedToken.includes("env(");
74
+ }
75
+ function getInvalidAutoRepeatTrack(trackList) {
76
+ for (const token of splitTopLevelWhitespace(trackList)) {
77
+ const normalizedToken = token.toLowerCase();
78
+ if (!isLineNameList(token) && !containsRuntimeValue(token)) {
79
+ if (setHas(invalidBareAutoRepeatTrackTokens, normalizedToken) ||
80
+ isFlexTrackBreadth(normalizedToken)) {
81
+ return token;
82
+ }
83
+ if (hasStringPrefix(normalizedToken, "minmax(") &&
84
+ isInvalidAutoRepeatMinmax(token)) {
85
+ return token;
86
+ }
87
+ }
88
+ }
89
+ return undefined;
90
+ }
91
+ function getMinmaxArguments(token) {
92
+ const minmaxCall = arrayFirst(findValueFunctionCalls(token, "minmax"));
93
+ if (!isDefined(minmaxCall)) {
94
+ return undefined;
95
+ }
96
+ const [minimum, maximum] = splitTopLevelCommas(minmaxCall.body).map((argument) => argument.trim());
97
+ if (!isDefined(minimum) || !isDefined(maximum)) {
98
+ return undefined;
99
+ }
100
+ return [minimum, maximum];
101
+ }
102
+ function getRepeatKeyword(repeatBody) {
103
+ const repeatCount = arrayFirst(splitTopLevelCommas(repeatBody))
104
+ ?.trim()
105
+ .toLowerCase();
106
+ if (repeatCount === "auto-fill" || repeatCount === "auto-fit") {
107
+ return repeatCount;
108
+ }
109
+ return undefined;
110
+ }
111
+ function hasStringPrefix(value, prefix) {
112
+ // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with -- `startsWith` is falsely flagged as unsafe in this typed lint context.
113
+ return value.slice(0, prefix.length) === prefix;
114
+ }
115
+ function isFixedTrackBreadth(value) {
116
+ const normalizedValue = value.toLowerCase();
117
+ if (zeroPattern.test(normalizedValue)) {
118
+ return true;
119
+ }
120
+ if (hasStringPrefix(normalizedValue, "calc(") ||
121
+ hasStringPrefix(normalizedValue, "clamp(") ||
122
+ hasStringPrefix(normalizedValue, "max(") ||
123
+ hasStringPrefix(normalizedValue, "min(")) {
124
+ return true;
125
+ }
126
+ const match = lengthPercentagePattern.exec(normalizedValue);
127
+ const unit = match?.groups?.["unit"];
128
+ return unit === "%" || (isDefined(unit) && setHas(cssLengthUnits, unit));
129
+ }
130
+ function isFlexTrackBreadth(value) {
131
+ return /^[+\-]?(?:\d+|\d*\.\d+)fr$/v.test(value);
132
+ }
133
+ function isIntrinsicTrackBreadth(value) {
134
+ const normalizedValue = value.toLowerCase();
135
+ return setHas(invalidBareAutoRepeatTrackTokens, normalizedValue);
136
+ }
137
+ function isInvalidAutoRepeatMinmax(token) {
138
+ const args = getMinmaxArguments(token);
139
+ if (!isDefined(args)) {
140
+ return false;
141
+ }
142
+ const [minimum, maximum] = args;
143
+ return (isFlexTrackBreadth(minimum) ||
144
+ (isIntrinsicTrackBreadth(minimum) && !isFixedTrackBreadth(maximum)));
145
+ }
146
+ function isLineNameList(token) {
147
+ return token.startsWith("[") && token.endsWith("]");
148
+ }
149
+ const ruleFunction = (primary) => (root, result) => {
150
+ if (!validateOptions(result, ruleName, {
151
+ actual: primary,
152
+ possible: [true],
153
+ })) {
154
+ return;
155
+ }
156
+ root.walkDecls((declaration) => {
157
+ if (!setHas(trackTemplateProperties, declaration.prop.toLowerCase())) {
158
+ return;
159
+ }
160
+ for (const repeatCall of findValueFunctionCalls(declaration.value, "repeat")) {
161
+ const repeatKeyword = getRepeatKeyword(repeatCall.body);
162
+ if (isDefined(repeatKeyword)) {
163
+ // eslint-disable-next-line typefest/prefer-ts-extras-array-join -- ts-extras does not expose a typed arrayJoin in this project setup.
164
+ const trackList = splitTopLevelCommas(repeatCall.body)
165
+ .slice(1)
166
+ .join(",");
167
+ const invalidTrack = getInvalidAutoRepeatTrack(trackList);
168
+ if (isDefined(invalidTrack)) {
169
+ report({
170
+ message: messages.rejected(invalidTrack, repeatKeyword),
171
+ node: declaration,
172
+ result,
173
+ ruleName,
174
+ word: invalidTrack,
175
+ });
176
+ }
177
+ }
178
+ }
179
+ });
180
+ };
181
+ /** Public Stylelint rule definition. */
182
+ const rule = createStylelintRule({
183
+ docs,
184
+ messages,
185
+ rule: ruleFunction,
186
+ ruleName,
187
+ });
188
+ export default rule;
189
+ //# sourceMappingURL=no-invalid-auto-repeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-invalid-auto-repeat.js","sourceRoot":"","sources":["../../src/rules/no-invalid-auto-repeat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type StylelintPluginRule } from "../_internal/create-stylelint-rule.js";
2
+ declare const messages: {
3
+ rejected: (minimum: string) => string;
4
+ };
5
+ /** Public Stylelint rule definition. */
6
+ declare const rule: StylelintPluginRule<boolean, undefined, typeof messages>;
7
+ export default rule;
8
+ //# sourceMappingURL=no-invalid-minmax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-invalid-minmax.d.ts","sourceRoot":"","sources":["../../src/rules/no-invalid-minmax.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,mBAAmB,EAC3B,MAAM,uCAAuC,CAAC;AAa/C,QAAA,MAAM,QAAQ,EAAE;IAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;CAMtD,CAAC;AAyDF,wCAAwC;AACxC,QAAA,MAAM,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,QAAQ,CAM7D,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,58 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { arrayFirst, isDefined, setHas } from "ts-extras";
3
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
4
+ import { findValueFunctionCalls, splitTopLevelCommas, } from "../_internal/grid-template-analysis.js";
5
+ import { createRuleDocsUrl, createRuleName, } from "../_internal/plugin-constants.js";
6
+ const { report, ruleMessages, validateOptions } = stylelint.utils;
7
+ const ruleName = createRuleName("no-invalid-minmax");
8
+ const messages = ruleMessages(ruleName, {
9
+ rejected: (minimum) => `Do not use flexible track breadth \`${minimum}\` as the minimum in \`minmax()\`; use an inflexible minimum such as \`0\`, a length, or a percentage.`,
10
+ });
11
+ const docs = {
12
+ description: "Disallow flexible `fr` values as the minimum argument in CSS Grid `minmax()` track sizes.",
13
+ recommended: true,
14
+ url: createRuleDocsUrl("no-invalid-minmax"),
15
+ };
16
+ const gridTrackProperties = new Set([
17
+ "grid-auto-columns",
18
+ "grid-auto-rows",
19
+ "grid-template-columns",
20
+ "grid-template-rows",
21
+ ]);
22
+ function isFlexTrackBreadth(value) {
23
+ return /^[+\-]?(?:\d+|\d*\.\d+)fr$/v.test(value.toLowerCase());
24
+ }
25
+ const ruleFunction = (primary) => (root, result) => {
26
+ if (!validateOptions(result, ruleName, {
27
+ actual: primary,
28
+ possible: [true],
29
+ })) {
30
+ return;
31
+ }
32
+ root.walkDecls((declaration) => {
33
+ if (!setHas(gridTrackProperties, declaration.prop.toLowerCase())) {
34
+ return;
35
+ }
36
+ for (const minmaxCall of findValueFunctionCalls(declaration.value, "minmax")) {
37
+ const minimum = arrayFirst(splitTopLevelCommas(minmaxCall.body))?.trim();
38
+ if (isDefined(minimum) && isFlexTrackBreadth(minimum)) {
39
+ report({
40
+ message: messages.rejected(minimum),
41
+ node: declaration,
42
+ result,
43
+ ruleName,
44
+ word: minimum,
45
+ });
46
+ }
47
+ }
48
+ });
49
+ };
50
+ /** Public Stylelint rule definition. */
51
+ const rule = createStylelintRule({
52
+ docs,
53
+ messages,
54
+ rule: ruleFunction,
55
+ ruleName,
56
+ });
57
+ export default rule;
58
+ //# sourceMappingURL=no-invalid-minmax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-invalid-minmax.js","sourceRoot":"","sources":["../../src/rules/no-invalid-minmax.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAiB,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EACH,mBAAmB,GAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,sBAAsB,EACtB,mBAAmB,GACtB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACH,iBAAiB,EACjB,cAAc,GACjB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;AAElE,MAAM,QAAQ,GAAG,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACrD,MAAM,QAAQ,GAA8C,YAAY,CACpE,QAAQ,EACR;IACI,QAAQ,EAAE,CAAC,OAAe,EAAU,EAAE,CAClC,uCAAuC,OAAO,wGAAwG;CAC7J,CACJ,CAAC;AAEF,MAAM,IAAI,GAAG;IACT,WAAW,EACP,2FAA2F;IAC/F,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,iBAAiB,CAAC,mBAAmB,CAAC;CACrC,CAAC;AAEX,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC;IACrD,mBAAmB;IACnB,gBAAgB;IAChB,uBAAuB;IACvB,oBAAoB;CACvB,CAAC,CAAC;AAEH,SAAS,kBAAkB,CAAC,KAAa;IACrC,OAAO,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,YAAY,GACd,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;IAC1B,IACI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE;QAC/B,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB,CAAC,EACJ,CAAC;QACC,OAAO;IACX,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;QAC3B,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC/D,OAAO;QACX,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,sBAAsB,CAC3C,WAAW,CAAC,KAAK,EACjB,QAAQ,CACX,EAAE,CAAC;YACA,MAAM,OAAO,GAAG,UAAU,CACtB,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CACvC,EAAE,IAAI,EAAE,CAAC;YAEV,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC;oBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACnC,IAAI,EAAE,WAAW;oBACjB,MAAM;oBACN,QAAQ;oBACR,IAAI,EAAE,OAAO;iBAChB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEN,wCAAwC;AACxC,MAAM,IAAI,GACN,mBAAmB,CAAsC;IACrD,IAAI;IACJ,QAAQ;IACR,IAAI,EAAE,YAAY;IAClB,QAAQ;CACX,CAAC,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type StylelintPluginRule } from "../_internal/create-stylelint-rule.js";
2
+ declare const messages: {
3
+ rejected: (areaRows: number, trackRows: number) => string;
4
+ };
5
+ /** Public Stylelint rule definition. */
6
+ declare const rule: StylelintPluginRule<boolean, undefined, typeof messages>;
7
+ export default rule;
8
+ //# sourceMappingURL=no-mismatched-template-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-mismatched-template-rows.d.ts","sourceRoot":"","sources":["../../src/rules/no-mismatched-template-rows.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,mBAAmB,EAC3B,MAAM,uCAAuC,CAAC;AAc/C,QAAA,MAAM,QAAQ,EAAE;IACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;CAI5D,CAAC;AAiDH,wCAAwC;AACxC,QAAA,MAAM,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,QAAQ,CAM7D,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,50 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { isDefined, isEmpty } from "ts-extras";
3
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
4
+ import { collectGridTemplateAreas, countGridTracks, findSiblingDeclaration, } from "../_internal/grid-template-analysis.js";
5
+ import { createRuleDocsUrl, createRuleName, } from "../_internal/plugin-constants.js";
6
+ const { report, ruleMessages, validateOptions } = stylelint.utils;
7
+ const ruleName = createRuleName("no-mismatched-template-rows");
8
+ const messages = ruleMessages(ruleName, {
9
+ rejected: (areaRows, trackRows) => `\`grid-template-areas\` defines ${String(areaRows)} rows, but sibling \`grid-template-rows\` defines ${String(trackRows)} tracks.`,
10
+ });
11
+ const docs = {
12
+ description: "Require `grid-template-rows` track count to match `grid-template-areas` row count.",
13
+ recommended: true,
14
+ url: createRuleDocsUrl("no-mismatched-template-rows"),
15
+ };
16
+ const ruleFunction = (primary) => (root, result) => {
17
+ if (!validateOptions(result, ruleName, {
18
+ actual: primary,
19
+ possible: [true],
20
+ })) {
21
+ return;
22
+ }
23
+ for (const template of collectGridTemplateAreas(root)) {
24
+ if (isEmpty(template.diagnostics)) {
25
+ const rowsDeclaration = findSiblingDeclaration(template.declaration, "grid-template-rows");
26
+ const trackRows = isDefined(rowsDeclaration)
27
+ ? countGridTracks(rowsDeclaration.value)
28
+ : undefined;
29
+ if (isDefined(rowsDeclaration) &&
30
+ isDefined(trackRows) &&
31
+ trackRows !== template.rows.length) {
32
+ report({
33
+ message: messages.rejected(template.rows.length, trackRows),
34
+ node: rowsDeclaration,
35
+ result,
36
+ ruleName,
37
+ });
38
+ }
39
+ }
40
+ }
41
+ };
42
+ /** Public Stylelint rule definition. */
43
+ const rule = createStylelintRule({
44
+ docs,
45
+ messages,
46
+ rule: ruleFunction,
47
+ ruleName,
48
+ });
49
+ export default rule;
50
+ //# sourceMappingURL=no-mismatched-template-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-mismatched-template-rows.js","sourceRoot":"","sources":["../../src/rules/no-mismatched-template-rows.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAiB,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EACH,mBAAmB,GAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACH,iBAAiB,EACjB,cAAc,GACjB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;AAElE,MAAM,QAAQ,GAAG,cAAc,CAAC,6BAA6B,CAAC,CAAC;AAC/D,MAAM,QAAQ,GAEV,YAAY,CAAC,QAAQ,EAAE;IACvB,QAAQ,EAAE,CAAC,QAAgB,EAAE,SAAiB,EAAU,EAAE,CACtD,mCAAmC,MAAM,CAAC,QAAQ,CAAC,qDAAqD,MAAM,CAAC,SAAS,CAAC,UAAU;CAC1I,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG;IACT,WAAW,EACP,oFAAoF;IACxF,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,iBAAiB,CAAC,6BAA6B,CAAC;CAC/C,CAAC;AAEX,MAAM,YAAY,GACd,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;IAC1B,IACI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE;QAC/B,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB,CAAC,EACJ,CAAC;QACC,OAAO;IACX,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,eAAe,GAAG,sBAAsB,CAC1C,QAAQ,CAAC,WAAW,EACpB,oBAAoB,CACvB,CAAC;YACF,MAAM,SAAS,GAAG,SAAS,CAAC,eAAe,CAAC;gBACxC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC;gBACxC,CAAC,CAAC,SAAS,CAAC;YAEhB,IACI,SAAS,CAAC,eAAe,CAAC;gBAC1B,SAAS,CAAC,SAAS,CAAC;gBACpB,SAAS,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,EACpC,CAAC;gBACC,MAAM,CAAC;oBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CACtB,QAAQ,CAAC,IAAI,CAAC,MAAM,EACpB,SAAS,CACZ;oBACD,IAAI,EAAE,eAAe;oBACrB,MAAM;oBACN,QAAQ;iBACX,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEN,wCAAwC;AACxC,MAAM,IAAI,GACN,mBAAmB,CAAsC;IACrD,IAAI;IACJ,QAAQ;IACR,IAAI,EAAE,YAAY;IAClB,QAAQ;CACX,CAAC,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type StylelintPluginRule } from "../_internal/create-stylelint-rule.js";
2
+ declare const messages: {
3
+ rejected: (areaName: string, firstSelector: string) => string;
4
+ };
5
+ /** Public Stylelint rule definition. */
6
+ declare const rule: StylelintPluginRule<boolean, undefined, typeof messages>;
7
+ export default rule;
8
+ //# sourceMappingURL=no-overlapping-areas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-overlapping-areas.d.ts","sourceRoot":"","sources":["../../src/rules/no-overlapping-areas.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,mBAAmB,EAC3B,MAAM,uCAAuC,CAAC;AAU/C,QAAA,MAAM,QAAQ,EAAE;IACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;CAIhE,CAAC;AA6CH,wCAAwC;AACxC,QAAA,MAAM,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,QAAQ,CAM7D,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,48 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { isDefined } from "ts-extras";
3
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
4
+ import { collectGridAreaUsages } from "../_internal/grid-template-analysis.js";
5
+ import { createRuleDocsUrl, createRuleName, } from "../_internal/plugin-constants.js";
6
+ const { report, ruleMessages, validateOptions } = stylelint.utils;
7
+ const ruleName = createRuleName("no-overlapping-areas");
8
+ const messages = ruleMessages(ruleName, {
9
+ rejected: (areaName, firstSelector) => `Grid area "${areaName}" is assigned by more than one selector; it may overlap the earlier "${firstSelector}" item at runtime.`,
10
+ });
11
+ const docs = {
12
+ description: "Disallow multiple selectors assigning the same single-name `grid-area` value in one stylesheet.",
13
+ recommended: false,
14
+ url: createRuleDocsUrl("no-overlapping-areas"),
15
+ };
16
+ const ruleFunction = (primary) => (root, result) => {
17
+ if (!validateOptions(result, ruleName, {
18
+ actual: primary,
19
+ possible: [true],
20
+ })) {
21
+ return;
22
+ }
23
+ const firstUsageByName = new Map();
24
+ for (const usage of collectGridAreaUsages(root)) {
25
+ const firstUsage = firstUsageByName.get(usage.name);
26
+ if (isDefined(firstUsage)) {
27
+ report({
28
+ message: messages.rejected(usage.name, firstUsage.selector ?? firstUsage.name),
29
+ node: usage.declaration,
30
+ result,
31
+ ruleName,
32
+ word: usage.name,
33
+ });
34
+ }
35
+ else {
36
+ firstUsageByName.set(usage.name, usage);
37
+ }
38
+ }
39
+ };
40
+ /** Public Stylelint rule definition. */
41
+ const rule = createStylelintRule({
42
+ docs,
43
+ messages,
44
+ rule: ruleFunction,
45
+ ruleName,
46
+ });
47
+ export default rule;
48
+ //# sourceMappingURL=no-overlapping-areas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-overlapping-areas.js","sourceRoot":"","sources":["../../src/rules/no-overlapping-areas.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAiB,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACH,mBAAmB,GAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EACH,iBAAiB,EACjB,cAAc,GACjB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;AAElE,MAAM,QAAQ,GAAG,cAAc,CAAC,sBAAsB,CAAC,CAAC;AACxD,MAAM,QAAQ,GAEV,YAAY,CAAC,QAAQ,EAAE;IACvB,QAAQ,EAAE,CAAC,QAAgB,EAAE,aAAqB,EAAU,EAAE,CAC1D,cAAc,QAAQ,wEAAwE,aAAa,oBAAoB;CACtI,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG;IACT,WAAW,EACP,iGAAiG;IACrG,WAAW,EAAE,KAAK;IAClB,GAAG,EAAE,iBAAiB,CAAC,sBAAsB,CAAC;CACxC,CAAC;AAEX,MAAM,YAAY,GACd,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;IAC1B,IACI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE;QAC/B,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB,CAAC,EACJ,CAAC;QACC,OAAO;IACX,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAG7B,CAAC;IAEJ,KAAK,MAAM,KAAK,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC;gBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CACtB,KAAK,CAAC,IAAI,EACV,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAI,CACzC;gBACD,IAAI,EAAE,KAAK,CAAC,WAAW;gBACvB,MAAM;gBACN,QAAQ;gBACR,IAAI,EAAE,KAAK,CAAC,IAAI;aACnB,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEN,wCAAwC;AACxC,MAAM,IAAI,GACN,mBAAmB,CAAsC;IACrD,IAAI;IACJ,QAAQ;IACR,IAAI,EAAE,YAAY;IAClB,QAAQ;CACX,CAAC,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type StylelintPluginRule } from "../_internal/create-stylelint-rule.js";
2
+ declare const messages: {
3
+ rejected: (areaName: string) => string;
4
+ };
5
+ /** Public Stylelint rule definition. */
6
+ declare const rule: StylelintPluginRule<boolean, undefined, typeof messages>;
7
+ export default rule;
8
+ //# sourceMappingURL=no-unknown-areas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unknown-areas.d.ts","sourceRoot":"","sources":["../../src/rules/no-unknown-areas.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,mBAAmB,EAC3B,MAAM,uCAAuC,CAAC;AAa/C,QAAA,MAAM,QAAQ,EAAE;IAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;CAMvD,CAAC;AA2CF,wCAAwC;AACxC,QAAA,MAAM,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,QAAQ,CAM7D,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,47 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { isEmpty, setHas } from "ts-extras";
3
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
4
+ import { collectGridAreaUsages, collectGridTemplateAreas, } from "../_internal/grid-template-analysis.js";
5
+ import { createRuleDocsUrl, createRuleName, } from "../_internal/plugin-constants.js";
6
+ const { report, ruleMessages, validateOptions } = stylelint.utils;
7
+ const ruleName = createRuleName("no-unknown-areas");
8
+ const messages = ruleMessages(ruleName, {
9
+ rejected: (areaName) => `Grid area "${areaName}" is referenced by \`grid-area\` but is not declared in any \`grid-template-areas\` template in this stylesheet.`,
10
+ });
11
+ const docs = {
12
+ description: "Disallow single-name `grid-area` references that do not match any named area declared in the same stylesheet.",
13
+ recommended: true,
14
+ url: createRuleDocsUrl("no-unknown-areas"),
15
+ };
16
+ const ruleFunction = (primary) => (root, result) => {
17
+ if (!validateOptions(result, ruleName, {
18
+ actual: primary,
19
+ possible: [true],
20
+ })) {
21
+ return;
22
+ }
23
+ const declaredAreaNames = new Set(collectGridTemplateAreas(root).flatMap((template) => isEmpty(template.diagnostics) ? template.areaNames : []));
24
+ if (declaredAreaNames.size === 0) {
25
+ return;
26
+ }
27
+ for (const usage of collectGridAreaUsages(root)) {
28
+ if (!setHas(declaredAreaNames, usage.name)) {
29
+ report({
30
+ message: messages.rejected(usage.name),
31
+ node: usage.declaration,
32
+ result,
33
+ ruleName,
34
+ word: usage.name,
35
+ });
36
+ }
37
+ }
38
+ };
39
+ /** Public Stylelint rule definition. */
40
+ const rule = createStylelintRule({
41
+ docs,
42
+ messages,
43
+ rule: ruleFunction,
44
+ ruleName,
45
+ });
46
+ export default rule;
47
+ //# sourceMappingURL=no-unknown-areas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unknown-areas.js","sourceRoot":"","sources":["../../src/rules/no-unknown-areas.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAiB,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EACH,mBAAmB,GAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,qBAAqB,EACrB,wBAAwB,GAC3B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACH,iBAAiB,EACjB,cAAc,GACjB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;AAElE,MAAM,QAAQ,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;AACpD,MAAM,QAAQ,GAA+C,YAAY,CACrE,QAAQ,EACR;IACI,QAAQ,EAAE,CAAC,QAAgB,EAAU,EAAE,CACnC,cAAc,QAAQ,kHAAkH;CAC/I,CACJ,CAAC;AAEF,MAAM,IAAI,GAAG;IACT,WAAW,EACP,+GAA+G;IACnH,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,iBAAiB,CAAC,kBAAkB,CAAC;CACpC,CAAC;AAEX,MAAM,YAAY,GACd,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;IAC1B,IACI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE;QAC/B,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB,CAAC,EACJ,CAAC;QACC,OAAO;IACX,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC7B,wBAAwB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAC1D,CACJ,CAAC;IAEF,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACX,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC;gBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtC,IAAI,EAAE,KAAK,CAAC,WAAW;gBACvB,MAAM;gBACN,QAAQ;gBACR,IAAI,EAAE,KAAK,CAAC,IAAI;aACnB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEN,wCAAwC;AACxC,MAAM,IAAI,GACN,mBAAmB,CAAsC;IACrD,IAAI;IACJ,QAAQ;IACR,IAAI,EAAE,YAAY;IAClB,QAAQ;CACX,CAAC,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type StylelintPluginRule } from "../_internal/create-stylelint-rule.js";
2
+ declare const messages: {
3
+ rejected: (areaName: string) => string;
4
+ };
5
+ /** Public Stylelint rule definition. */
6
+ declare const rule: StylelintPluginRule<boolean, undefined, typeof messages>;
7
+ export default rule;
8
+ //# sourceMappingURL=no-unused-areas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unused-areas.d.ts","sourceRoot":"","sources":["../../src/rules/no-unused-areas.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,mBAAmB,EAC3B,MAAM,uCAAuC,CAAC;AAa/C,QAAA,MAAM,QAAQ,EAAE;IAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;CAMvD,CAAC;AAyCF,wCAAwC;AACxC,QAAA,MAAM,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,QAAQ,CAM7D,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,48 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { isEmpty, setHas } from "ts-extras";
3
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
4
+ import { collectGridAreaUsages, collectGridTemplateAreas, } from "../_internal/grid-template-analysis.js";
5
+ import { createRuleDocsUrl, createRuleName, } from "../_internal/plugin-constants.js";
6
+ const { report, ruleMessages, validateOptions } = stylelint.utils;
7
+ const ruleName = createRuleName("no-unused-areas");
8
+ const messages = ruleMessages(ruleName, {
9
+ rejected: (areaName) => `Grid template area "${areaName}" is declared but no single-name \`grid-area: ${areaName}\` declaration exists in this stylesheet.`,
10
+ });
11
+ const docs = {
12
+ description: "Disallow named template areas that are never referenced by a single-name `grid-area` declaration in the same stylesheet.",
13
+ recommended: false,
14
+ url: createRuleDocsUrl("no-unused-areas"),
15
+ };
16
+ const ruleFunction = (primary) => (root, result) => {
17
+ if (!validateOptions(result, ruleName, {
18
+ actual: primary,
19
+ possible: [true],
20
+ })) {
21
+ return;
22
+ }
23
+ const usedAreaNames = new Set(collectGridAreaUsages(root).map((usage) => usage.name));
24
+ for (const template of collectGridTemplateAreas(root)) {
25
+ if (isEmpty(template.diagnostics)) {
26
+ for (const areaName of template.areaNames) {
27
+ if (!setHas(usedAreaNames, areaName)) {
28
+ report({
29
+ message: messages.rejected(areaName),
30
+ node: template.declaration,
31
+ result,
32
+ ruleName,
33
+ word: areaName,
34
+ });
35
+ }
36
+ }
37
+ }
38
+ }
39
+ };
40
+ /** Public Stylelint rule definition. */
41
+ const rule = createStylelintRule({
42
+ docs,
43
+ messages,
44
+ rule: ruleFunction,
45
+ ruleName,
46
+ });
47
+ export default rule;
48
+ //# sourceMappingURL=no-unused-areas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unused-areas.js","sourceRoot":"","sources":["../../src/rules/no-unused-areas.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAiB,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EACH,mBAAmB,GAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,qBAAqB,EACrB,wBAAwB,GAC3B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACH,iBAAiB,EACjB,cAAc,GACjB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;AAElE,MAAM,QAAQ,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnD,MAAM,QAAQ,GAA+C,YAAY,CACrE,QAAQ,EACR;IACI,QAAQ,EAAE,CAAC,QAAgB,EAAU,EAAE,CACnC,uBAAuB,QAAQ,iDAAiD,QAAQ,2CAA2C;CAC1I,CACJ,CAAC;AAEF,MAAM,IAAI,GAAG;IACT,WAAW,EACP,0HAA0H;IAC9H,WAAW,EAAE,KAAK;IAClB,GAAG,EAAE,iBAAiB,CAAC,iBAAiB,CAAC;CACnC,CAAC;AAEX,MAAM,YAAY,GACd,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;IAC1B,IACI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE;QAC/B,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB,CAAC,EACJ,CAAC;QACC,OAAO;IACX,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,CACzB,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CACzD,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC;oBACnC,MAAM,CAAC;wBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBACpC,IAAI,EAAE,QAAQ,CAAC,WAAW;wBAC1B,MAAM;wBACN,QAAQ;wBACR,IAAI,EAAE,QAAQ;qBACjB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEN,wCAAwC;AACxC,MAAM,IAAI,GACN,mBAAmB,CAAsC;IACrD,IAAI;IACJ,QAAQ;IACR,IAAI,EAAE,YAAY;IAClB,QAAQ;CACX,CAAC,CAAC;AAEP,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type StylelintPluginRule } from "../_internal/create-stylelint-rule.js";
2
+ declare const messages: {
3
+ rejected: (propertyName: string, replacement: string) => string;
4
+ };
5
+ /** Public Stylelint rule definition. */
6
+ declare const rule: StylelintPluginRule<boolean, undefined, typeof messages>;
7
+ export default rule;
8
+ //# sourceMappingURL=prefer-gap-properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-gap-properties.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-gap-properties.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,mBAAmB,EAC3B,MAAM,uCAAuC,CAAC;AAS/C,QAAA,MAAM,QAAQ,EAAE;IACZ,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;CAIlE,CAAC;AAoDH,wCAAwC;AACxC,QAAA,MAAM,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,QAAQ,CAS7D,CAAC;AAEP,eAAe,IAAI,CAAC"}