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,1268 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // dist/plugin.js
31
+ var plugin_exports = {};
32
+ __export(plugin_exports, {
33
+ configNames: () => configNames,
34
+ default: () => plugin_default,
35
+ gridPluginConfigs: () => gridPluginConfigs,
36
+ meta: () => meta,
37
+ plugins: () => plugins,
38
+ ruleIds: () => ruleIds,
39
+ ruleNames: () => ruleNames,
40
+ rules: () => rules
41
+ });
42
+ module.exports = __toCommonJS(plugin_exports);
43
+ var import_ts_extras14 = require("ts-extras");
44
+
45
+ // dist/_internal/plugin-constants.js
46
+ var import_package = __toESM(require("stylelint-plugin-grid/package.json"), 1);
47
+ var import_ts_extras = require("ts-extras");
48
+ var PACKAGE_NAME = "stylelint-plugin-grid";
49
+ var PLUGIN_NAMESPACE = "grid";
50
+ var DOCS_SITE_URL = "https://nick2bad4u.github.io/stylelint-plugin-grid";
51
+ var DOCS_RULES_BASE_URL = `${DOCS_SITE_URL}/docs/rules`;
52
+ var CONFIG_NAMES = ["grid-all", "grid-recommended"];
53
+ function getPackageVersion(pkg) {
54
+ return hasStringVersion(pkg) ? pkg.version : "0.0.0";
55
+ }
56
+ function hasStringVersion(pkg) {
57
+ return isUnknownRecord(pkg) && (0, import_ts_extras.keyIn)(pkg, "version") && typeof pkg["version"] === "string";
58
+ }
59
+ function isUnknownRecord(pkg) {
60
+ return typeof pkg === "object" && pkg !== null && !Array.isArray(pkg);
61
+ }
62
+ var PACKAGE_VERSION = getPackageVersion(import_package.default);
63
+ function createRuleDocsUrl(ruleName14) {
64
+ return `${DOCS_RULES_BASE_URL}/${ruleName14}`;
65
+ }
66
+ function createRuleName(ruleName14) {
67
+ return `${PLUGIN_NAMESPACE}/${ruleName14}`;
68
+ }
69
+
70
+ // dist/rules/consistent-area-naming.js
71
+ var import_stylelint2 = __toESM(require("stylelint"), 1);
72
+ var import_ts_extras3 = require("ts-extras");
73
+
74
+ // dist/_internal/create-stylelint-rule.js
75
+ var import_stylelint = __toESM(require("stylelint"), 1);
76
+ var createStylelintRule = (options) => {
77
+ const { docs: docs14, messages: messages14, rule: rule14, ruleName: ruleName14 } = options;
78
+ const baseMeta = {
79
+ ...options.meta,
80
+ url: options.meta?.url ?? docs14.url
81
+ };
82
+ const meta2 = {
83
+ ...baseMeta,
84
+ docs: docs14
85
+ };
86
+ const typedRule = Object.assign(rule14, {
87
+ messages: messages14,
88
+ meta: meta2,
89
+ ruleName: ruleName14
90
+ });
91
+ if (options.primaryOptionArray === true) {
92
+ typedRule.primaryOptionArray = true;
93
+ }
94
+ const plugin = import_stylelint.default.createPlugin(ruleName14, typedRule);
95
+ return {
96
+ ...plugin,
97
+ docs: docs14,
98
+ messages: messages14,
99
+ meta: meta2,
100
+ rule: typedRule,
101
+ ruleName: ruleName14
102
+ };
103
+ };
104
+
105
+ // dist/_internal/grid-template-analysis.js
106
+ var import_ts_extras2 = require("ts-extras");
107
+ var cssWideKeywords = /* @__PURE__ */ new Set([
108
+ "inherit",
109
+ "initial",
110
+ "revert",
111
+ "revert-layer",
112
+ "unset"
113
+ ]);
114
+ var reservedGridAreaIdents = /* @__PURE__ */ new Set(["auto", "span"]);
115
+ var customIdentPattern = /^-?[A-Z_a-z][\w\-]*$/v;
116
+ var blankAreaPattern = /^\.+$/v;
117
+ function collectGridAreaUsages(root) {
118
+ const usages = [];
119
+ root.walkDecls("grid-area", (declaration) => {
120
+ const name = parseSingleGridAreaName(declaration.value);
121
+ if (!(0, import_ts_extras2.isDefined)(name)) {
122
+ return;
123
+ }
124
+ const selector = getOwningRule(declaration)?.selector;
125
+ usages.push({
126
+ declaration,
127
+ name,
128
+ ...(0, import_ts_extras2.isDefined)(selector) ? { selector } : {}
129
+ });
130
+ });
131
+ return usages;
132
+ }
133
+ function collectGridTemplateAreas(root) {
134
+ const templates = [];
135
+ root.walkDecls("grid-template-areas", (declaration) => {
136
+ const template = parseGridTemplateAreas(declaration);
137
+ if (template.rows.length > 0 || template.diagnostics.length > 0) {
138
+ templates.push(template);
139
+ }
140
+ });
141
+ return templates;
142
+ }
143
+ function countGridTracks(value) {
144
+ const tokens = [];
145
+ let count = 0;
146
+ for (const token of splitTopLevelWhitespace(value)) {
147
+ if (!isLineNameList(token)) {
148
+ tokens.push(token);
149
+ }
150
+ }
151
+ for (const token of tokens) {
152
+ const repeatCount = countRepeatTracks(token);
153
+ if (!(0, import_ts_extras2.isDefined)(repeatCount) && token.startsWith("repeat(")) {
154
+ return void 0;
155
+ }
156
+ count += repeatCount ?? 1;
157
+ }
158
+ return count;
159
+ }
160
+ function findSiblingDeclaration(declaration, propertyName) {
161
+ const parent = (0, import_ts_extras2.safeCastTo)(declaration.parent);
162
+ let match;
163
+ parent?.walkDecls(propertyName, (candidate) => {
164
+ if (candidate.parent === parent) {
165
+ match = candidate;
166
+ }
167
+ });
168
+ return match;
169
+ }
170
+ function findValueFunctionCalls(value, functionName) {
171
+ const calls = [];
172
+ const normalizedFunctionName = functionName.toLowerCase();
173
+ let index = 0;
174
+ while (index < value.length) {
175
+ const openParenthesisIndex = value.indexOf("(", index);
176
+ if (openParenthesisIndex === -1) {
177
+ break;
178
+ }
179
+ const nameStartIndex = findFunctionNameStart(value, openParenthesisIndex);
180
+ const name = value.slice(nameStartIndex, openParenthesisIndex);
181
+ const closeParenthesisIndex = findMatchingParenthesis(value, openParenthesisIndex);
182
+ if (closeParenthesisIndex < 0) {
183
+ break;
184
+ }
185
+ if (name.toLowerCase() === normalizedFunctionName) {
186
+ calls.push({
187
+ body: value.slice(openParenthesisIndex + 1, closeParenthesisIndex),
188
+ name,
189
+ source: value.slice(nameStartIndex, closeParenthesisIndex + 1)
190
+ });
191
+ }
192
+ index = closeParenthesisIndex + 1;
193
+ }
194
+ return calls;
195
+ }
196
+ function getAreaShapes(template) {
197
+ const shapes = /* @__PURE__ */ new Map();
198
+ for (const [rowIndex, row] of template.rows.entries()) {
199
+ for (const [columnIndex, token] of row.entries()) {
200
+ if (!isBlankAreaToken(token) && isGridAreaName(token)) {
201
+ const current = shapes.get(token);
202
+ shapes.set(token, (0, import_ts_extras2.isDefined)(current) ? {
203
+ ...current,
204
+ bottom: Math.max(current.bottom, rowIndex),
205
+ left: Math.min(current.left, columnIndex),
206
+ right: Math.max(current.right, columnIndex),
207
+ top: Math.min(current.top, rowIndex)
208
+ } : {
209
+ bottom: rowIndex,
210
+ left: columnIndex,
211
+ name: token,
212
+ right: columnIndex,
213
+ top: rowIndex
214
+ });
215
+ }
216
+ }
217
+ }
218
+ return [...shapes.values()].toSorted((left, right) => left.name.localeCompare(right.name));
219
+ }
220
+ function isBlankAreaToken(token) {
221
+ return blankAreaPattern.test(token);
222
+ }
223
+ function isGridAreaName(token) {
224
+ return customIdentPattern.test(token) && !(0, import_ts_extras2.setHas)(cssWideKeywords, token.toLowerCase()) && !(0, import_ts_extras2.setHas)(reservedGridAreaIdents, token.toLowerCase());
225
+ }
226
+ function isRectangularArea(template, shape) {
227
+ for (let rowIndex = shape.top; rowIndex <= shape.bottom; rowIndex += 1) {
228
+ const row = template.rows[rowIndex];
229
+ if (!(0, import_ts_extras2.isDefined)(row)) {
230
+ return false;
231
+ }
232
+ for (let columnIndex = shape.left; columnIndex <= shape.right; columnIndex += 1) {
233
+ if (row[columnIndex] !== shape.name) {
234
+ return false;
235
+ }
236
+ }
237
+ }
238
+ return true;
239
+ }
240
+ function parseGridTemplateAreas(declaration) {
241
+ const trimmedValue = declaration.value.trim();
242
+ if (trimmedValue === "" || trimmedValue.toLowerCase() === "none") {
243
+ return {
244
+ areaNames: [],
245
+ declaration,
246
+ diagnostics: [],
247
+ rows: []
248
+ };
249
+ }
250
+ const rowTexts = extractCssStringLiterals(trimmedValue);
251
+ const diagnostics = [];
252
+ if ((0, import_ts_extras2.isEmpty)(rowTexts)) {
253
+ diagnostics.push({
254
+ message: "`grid-template-areas` must contain one or more quoted row strings."
255
+ });
256
+ }
257
+ const rows = rowTexts.map((rowText) => rowText.trim().match(/\S+/gv) ?? [""]);
258
+ for (const [rowIndex, row] of rows.entries()) {
259
+ if (row.length === 1 && (0, import_ts_extras2.arrayFirst)(row) === "") {
260
+ diagnostics.push({
261
+ message: `Grid template row ${String(rowIndex + 1)} is empty.`
262
+ });
263
+ } else {
264
+ for (const token of row) {
265
+ if (!isBlankAreaToken(token) && !isGridAreaName(token)) {
266
+ diagnostics.push({
267
+ message: `Grid area token "${token}" is not a valid area name or blank "." marker.`,
268
+ token
269
+ });
270
+ }
271
+ }
272
+ }
273
+ }
274
+ const expectedWidth = (0, import_ts_extras2.arrayFirst)(rows)?.length;
275
+ if ((0, import_ts_extras2.isDefined)(expectedWidth)) {
276
+ for (const [rowIndex, row] of rows.entries()) {
277
+ if (row.length !== expectedWidth) {
278
+ diagnostics.push({
279
+ message: `Grid template row ${String(rowIndex + 1)} has ${String(row.length)} columns, but row 1 has ${String(expectedWidth)}.`
280
+ });
281
+ }
282
+ }
283
+ }
284
+ return {
285
+ areaNames: getAreaNames(rows),
286
+ declaration,
287
+ diagnostics,
288
+ rows
289
+ };
290
+ }
291
+ function splitTopLevelCommas(value) {
292
+ return splitTopLevel(value, /,/v);
293
+ }
294
+ function splitTopLevelWhitespace(value) {
295
+ return splitTopLevel(value, /\s/v);
296
+ }
297
+ function countRepeatTracks(token) {
298
+ if (!token.startsWith("repeat(") || !token.endsWith(")")) {
299
+ return void 0;
300
+ }
301
+ const body = token.slice("repeat(".length, -1);
302
+ const [repeatText, trackListText] = splitTopLevelCommas(body);
303
+ const repeat = Number.parseInt(repeatText?.trim() ?? "", 10);
304
+ if (!(0, import_ts_extras2.isInteger)(repeat) || repeat < 0 || String(repeat) !== repeatText?.trim() || !(0, import_ts_extras2.isDefined)(trackListText)) {
305
+ return void 0;
306
+ }
307
+ const innerTrackCount = countGridTracks(trackListText);
308
+ return (0, import_ts_extras2.isDefined)(innerTrackCount) ? repeat * innerTrackCount : void 0;
309
+ }
310
+ function extractCssStringLiterals(value) {
311
+ const rows = [];
312
+ const stringPattern = /"(?<doubleQuotedRow>(?:\\.|[^"\\])*)"|'(?<singleQuotedRow>(?:\\.|[^'\\])*)'/vy;
313
+ let index = 0;
314
+ while (index < value.length) {
315
+ while (/\s/v.test(value[index] ?? "")) {
316
+ index += 1;
317
+ }
318
+ stringPattern.lastIndex = index;
319
+ const match = stringPattern.exec(value);
320
+ if (match === null) {
321
+ return rows;
322
+ }
323
+ rows.push(match.groups?.["doubleQuotedRow"] ?? match.groups?.["singleQuotedRow"] ?? "");
324
+ index = stringPattern.lastIndex;
325
+ }
326
+ return rows;
327
+ }
328
+ function findFunctionNameStart(value, openParenthesisIndex) {
329
+ let index = openParenthesisIndex - 1;
330
+ while (index >= 0 && isFunctionNameCharacter(value[index] ?? "")) {
331
+ index -= 1;
332
+ }
333
+ return index + 1;
334
+ }
335
+ function findMatchingParenthesis(value, openParenthesisIndex) {
336
+ let parenthesisDepth = 0;
337
+ for (let index = openParenthesisIndex; index < value.length; index += 1) {
338
+ const character = value[index];
339
+ if (character === "(") {
340
+ parenthesisDepth += 1;
341
+ } else if (character === ")") {
342
+ parenthesisDepth -= 1;
343
+ if (parenthesisDepth === 0) {
344
+ return index;
345
+ }
346
+ }
347
+ }
348
+ return -1;
349
+ }
350
+ function getAreaNames(rows) {
351
+ const names = /* @__PURE__ */ new Set();
352
+ for (const row of rows) {
353
+ for (const token of row) {
354
+ if (!isBlankAreaToken(token) && isGridAreaName(token)) {
355
+ names.add(token);
356
+ }
357
+ }
358
+ }
359
+ return [...names].toSorted((left, right) => left.localeCompare(right));
360
+ }
361
+ function getOwningRule(declaration) {
362
+ return declaration.parent?.type === "rule" ? declaration.parent : void 0;
363
+ }
364
+ function isFunctionNameCharacter(character) {
365
+ return character === "-" || character === "_" || character >= "0" && character <= "9" || character >= "A" && character <= "Z" || character >= "a" && character <= "z";
366
+ }
367
+ function isLineNameList(token) {
368
+ return token.startsWith("[") && token.endsWith("]");
369
+ }
370
+ function parseSingleGridAreaName(value) {
371
+ const name = value.trim();
372
+ if (name.includes("/") || name.includes("(") || name.includes(")") || !isGridAreaName(name)) {
373
+ return void 0;
374
+ }
375
+ return name;
376
+ }
377
+ function splitTopLevel(value, separatorPattern) {
378
+ const tokens = [];
379
+ let bracketDepth = 0;
380
+ let parenthesisDepth = 0;
381
+ let tokenStart = 0;
382
+ for (let index = 0; index < value.length; index += 1) {
383
+ const character = value[index] ?? "";
384
+ switch (character) {
385
+ case "(": {
386
+ parenthesisDepth += 1;
387
+ break;
388
+ }
389
+ case ")": {
390
+ parenthesisDepth = Math.max(0, parenthesisDepth - 1);
391
+ break;
392
+ }
393
+ case "[": {
394
+ bracketDepth += 1;
395
+ break;
396
+ }
397
+ case "]": {
398
+ bracketDepth = Math.max(0, bracketDepth - 1);
399
+ break;
400
+ }
401
+ }
402
+ if (bracketDepth === 0 && parenthesisDepth === 0 && separatorPattern.test(character)) {
403
+ const token = value.slice(tokenStart, index).trim();
404
+ if (token.length > 0) {
405
+ tokens.push(token);
406
+ }
407
+ tokenStart = index + 1;
408
+ }
409
+ }
410
+ const finalToken = value.slice(tokenStart).trim();
411
+ if (finalToken.length > 0) {
412
+ tokens.push(finalToken);
413
+ }
414
+ return tokens;
415
+ }
416
+
417
+ // dist/rules/consistent-area-naming.js
418
+ var { report, ruleMessages, validateOptions } = import_stylelint2.default.utils;
419
+ var ruleName = createRuleName("consistent-area-naming");
420
+ var messages = ruleMessages(ruleName, {
421
+ rejected: (areaName, style) => `Grid area name "${areaName}" must use ${style}.`
422
+ });
423
+ var docs = {
424
+ description: "Require consistent naming for `grid-template-areas` and single-name `grid-area` identifiers.",
425
+ recommended: false,
426
+ url: createRuleDocsUrl("consistent-area-naming")
427
+ };
428
+ var patterns = {
429
+ "camel-case": /^[a-z][0-9A-Za-z]*$/v,
430
+ // eslint-disable-next-line security/detect-unsafe-regex -- Anchored naming-style pattern over short CSS identifiers.
431
+ "kebab-case": /^[a-z][0-9a-z]*(?:-[0-9a-z]+)*$/v,
432
+ // eslint-disable-next-line security/detect-unsafe-regex -- Anchored naming-style pattern over short CSS identifiers.
433
+ "snake-case": /^[a-z][0-9a-z]*(?:_[0-9a-z]+)*$/v
434
+ };
435
+ var allowedStyles = [
436
+ "camel-case",
437
+ "kebab-case",
438
+ "snake-case"
439
+ ];
440
+ function reportRejectedAreaName(input) {
441
+ const { areaName, node, result, style } = input;
442
+ report({
443
+ message: messages.rejected(areaName, style),
444
+ node,
445
+ result,
446
+ ruleName,
447
+ word: areaName
448
+ });
449
+ }
450
+ var ruleFunction = (primary, secondary) => (root, result) => {
451
+ if (!validateOptions(result, ruleName, {
452
+ actual: primary,
453
+ possible: [true]
454
+ }, {
455
+ actual: secondary,
456
+ optional: true,
457
+ possible: {
458
+ style: allowedStyles
459
+ }
460
+ })) {
461
+ return;
462
+ }
463
+ const style = secondary?.style ?? "kebab-case";
464
+ const pattern = patterns[style];
465
+ for (const template of collectGridTemplateAreas(root)) {
466
+ if ((0, import_ts_extras3.isEmpty)(template.diagnostics)) {
467
+ for (const areaName of template.areaNames) {
468
+ if (!pattern.test(areaName)) {
469
+ reportRejectedAreaName({
470
+ areaName,
471
+ node: template.declaration,
472
+ result,
473
+ style
474
+ });
475
+ }
476
+ }
477
+ }
478
+ }
479
+ for (const usage of collectGridAreaUsages(root)) {
480
+ if (!pattern.test(usage.name)) {
481
+ reportRejectedAreaName({
482
+ areaName: usage.name,
483
+ node: usage.declaration,
484
+ result,
485
+ style
486
+ });
487
+ }
488
+ }
489
+ };
490
+ var rule = createStylelintRule({
491
+ docs,
492
+ messages,
493
+ rule: ruleFunction,
494
+ ruleName
495
+ });
496
+ var consistent_area_naming_default = rule;
497
+
498
+ // dist/rules/no-dense-auto-flow.js
499
+ var import_stylelint3 = __toESM(require("stylelint"), 1);
500
+ var { report: report2, ruleMessages: ruleMessages2, validateOptions: validateOptions2 } = import_stylelint3.default.utils;
501
+ var ruleName2 = createRuleName("no-dense-auto-flow");
502
+ var messages2 = ruleMessages2(ruleName2, {
503
+ rejected: () => "Avoid `grid-auto-flow: dense`; dense packing can disconnect visual order from source order."
504
+ });
505
+ var docs2 = {
506
+ description: "Disallow `grid-auto-flow: dense` because it can reorder auto-placed grid items visually.",
507
+ recommended: false,
508
+ url: createRuleDocsUrl("no-dense-auto-flow")
509
+ };
510
+ var ruleFunction2 = (primary) => (root, result) => {
511
+ if (!validateOptions2(result, ruleName2, {
512
+ actual: primary,
513
+ possible: [true]
514
+ })) {
515
+ return;
516
+ }
517
+ root.walkDecls("grid-auto-flow", (declaration) => {
518
+ const hasDensePacking = splitTopLevelWhitespace(declaration.value).some((token) => token.toLowerCase() === "dense");
519
+ if (!hasDensePacking) {
520
+ return;
521
+ }
522
+ report2({
523
+ message: messages2.rejected(),
524
+ node: declaration,
525
+ result,
526
+ ruleName: ruleName2,
527
+ word: "dense"
528
+ });
529
+ });
530
+ };
531
+ var rule2 = createStylelintRule({
532
+ docs: docs2,
533
+ messages: messages2,
534
+ rule: ruleFunction2,
535
+ ruleName: ruleName2
536
+ });
537
+ var no_dense_auto_flow_default = rule2;
538
+
539
+ // dist/rules/no-invalid-areas.js
540
+ var import_stylelint4 = __toESM(require("stylelint"), 1);
541
+ var { report: report3, ruleMessages: ruleMessages3, validateOptions: validateOptions3 } = import_stylelint4.default.utils;
542
+ var ruleName3 = createRuleName("no-invalid-areas");
543
+ var messages3 = ruleMessages3(ruleName3, {
544
+ rejected: (message) => message
545
+ });
546
+ var docs3 = {
547
+ description: "Disallow malformed `grid-template-areas` declarations.",
548
+ recommended: true,
549
+ url: createRuleDocsUrl("no-invalid-areas")
550
+ };
551
+ var ruleFunction3 = (primary) => (root, result) => {
552
+ if (!validateOptions3(result, ruleName3, {
553
+ actual: primary,
554
+ possible: [true]
555
+ })) {
556
+ return;
557
+ }
558
+ for (const template of collectGridTemplateAreas(root)) {
559
+ for (const diagnostic of template.diagnostics) {
560
+ report3({
561
+ message: messages3.rejected(diagnostic.message),
562
+ node: template.declaration,
563
+ result,
564
+ ruleName: ruleName3,
565
+ word: diagnostic.token
566
+ });
567
+ }
568
+ }
569
+ };
570
+ var rule3 = createStylelintRule({
571
+ docs: docs3,
572
+ messages: messages3,
573
+ rule: ruleFunction3,
574
+ ruleName: ruleName3
575
+ });
576
+ var no_invalid_areas_default = rule3;
577
+
578
+ // dist/rules/no-invalid-auto-repeat.js
579
+ var import_stylelint5 = __toESM(require("stylelint"), 1);
580
+ var import_ts_extras4 = require("ts-extras");
581
+ var { report: report4, ruleMessages: ruleMessages4, validateOptions: validateOptions4 } = import_stylelint5.default.utils;
582
+ var ruleName4 = createRuleName("no-invalid-auto-repeat");
583
+ var messages4 = ruleMessages4(ruleName4, {
584
+ rejected: (token, repeatKeyword) => `Use a fixed track size inside \`repeat(${repeatKeyword}, ...)\`; \`${token}\` can make the grid template declaration invalid.`
585
+ });
586
+ var docs4 = {
587
+ description: "Disallow definitely invalid CSS Grid auto-repeat track sizes.",
588
+ recommended: true,
589
+ url: createRuleDocsUrl("no-invalid-auto-repeat")
590
+ };
591
+ var trackTemplateProperties = /* @__PURE__ */ new Set([
592
+ "grid-template-columns",
593
+ "grid-template-rows"
594
+ ]);
595
+ var invalidBareAutoRepeatTrackTokens = /* @__PURE__ */ new Set([
596
+ "auto",
597
+ "max-content",
598
+ "min-content"
599
+ ]);
600
+ var cssLengthUnits = /* @__PURE__ */ new Set([
601
+ "cap",
602
+ "ch",
603
+ "cm",
604
+ "dvb",
605
+ "dvh",
606
+ "dvi",
607
+ "dvmax",
608
+ "dvmin",
609
+ "dvw",
610
+ "em",
611
+ "ex",
612
+ "ic",
613
+ "in",
614
+ "lh",
615
+ "lvb",
616
+ "lvh",
617
+ "lvi",
618
+ "lvmax",
619
+ "lvmin",
620
+ "lvw",
621
+ "mm",
622
+ "pc",
623
+ "pt",
624
+ "px",
625
+ "q",
626
+ "rch",
627
+ "rem",
628
+ "rex",
629
+ "ric",
630
+ "rlh",
631
+ "svb",
632
+ "svh",
633
+ "svi",
634
+ "svmax",
635
+ "svmin",
636
+ "svw",
637
+ "vb",
638
+ "vh",
639
+ "vi",
640
+ "vmax",
641
+ "vmin",
642
+ "vw"
643
+ ]);
644
+ var lengthPercentagePattern = /^[+\-]?(?:\d+|\d*\.\d+)(?<unit>%|[A-Za-z]+)$/v;
645
+ var zeroPattern = /^[+\-]?(?:0|0?\.0+)$/v;
646
+ function containsRuntimeValue(token) {
647
+ const normalizedToken = token.toLowerCase();
648
+ return normalizedToken.includes("var(") || normalizedToken.includes("env(");
649
+ }
650
+ function getInvalidAutoRepeatTrack(trackList) {
651
+ for (const token of splitTopLevelWhitespace(trackList)) {
652
+ const normalizedToken = token.toLowerCase();
653
+ if (!isLineNameList2(token) && !containsRuntimeValue(token)) {
654
+ if ((0, import_ts_extras4.setHas)(invalidBareAutoRepeatTrackTokens, normalizedToken) || isFlexTrackBreadth(normalizedToken)) {
655
+ return token;
656
+ }
657
+ if (hasStringPrefix(normalizedToken, "minmax(") && isInvalidAutoRepeatMinmax(token)) {
658
+ return token;
659
+ }
660
+ }
661
+ }
662
+ return void 0;
663
+ }
664
+ function getMinmaxArguments(token) {
665
+ const minmaxCall = (0, import_ts_extras4.arrayFirst)(findValueFunctionCalls(token, "minmax"));
666
+ if (!(0, import_ts_extras4.isDefined)(minmaxCall)) {
667
+ return void 0;
668
+ }
669
+ const [minimum, maximum] = splitTopLevelCommas(minmaxCall.body).map((argument) => argument.trim());
670
+ if (!(0, import_ts_extras4.isDefined)(minimum) || !(0, import_ts_extras4.isDefined)(maximum)) {
671
+ return void 0;
672
+ }
673
+ return [minimum, maximum];
674
+ }
675
+ function getRepeatKeyword(repeatBody) {
676
+ const repeatCount = (0, import_ts_extras4.arrayFirst)(splitTopLevelCommas(repeatBody))?.trim().toLowerCase();
677
+ if (repeatCount === "auto-fill" || repeatCount === "auto-fit") {
678
+ return repeatCount;
679
+ }
680
+ return void 0;
681
+ }
682
+ function hasStringPrefix(value, prefix) {
683
+ return value.slice(0, prefix.length) === prefix;
684
+ }
685
+ function isFixedTrackBreadth(value) {
686
+ const normalizedValue = value.toLowerCase();
687
+ if (zeroPattern.test(normalizedValue)) {
688
+ return true;
689
+ }
690
+ if (hasStringPrefix(normalizedValue, "calc(") || hasStringPrefix(normalizedValue, "clamp(") || hasStringPrefix(normalizedValue, "max(") || hasStringPrefix(normalizedValue, "min(")) {
691
+ return true;
692
+ }
693
+ const match = lengthPercentagePattern.exec(normalizedValue);
694
+ const unit = match?.groups?.["unit"];
695
+ return unit === "%" || (0, import_ts_extras4.isDefined)(unit) && (0, import_ts_extras4.setHas)(cssLengthUnits, unit);
696
+ }
697
+ function isFlexTrackBreadth(value) {
698
+ return /^[+\-]?(?:\d+|\d*\.\d+)fr$/v.test(value);
699
+ }
700
+ function isIntrinsicTrackBreadth(value) {
701
+ const normalizedValue = value.toLowerCase();
702
+ return (0, import_ts_extras4.setHas)(invalidBareAutoRepeatTrackTokens, normalizedValue);
703
+ }
704
+ function isInvalidAutoRepeatMinmax(token) {
705
+ const args = getMinmaxArguments(token);
706
+ if (!(0, import_ts_extras4.isDefined)(args)) {
707
+ return false;
708
+ }
709
+ const [minimum, maximum] = args;
710
+ return isFlexTrackBreadth(minimum) || isIntrinsicTrackBreadth(minimum) && !isFixedTrackBreadth(maximum);
711
+ }
712
+ function isLineNameList2(token) {
713
+ return token.startsWith("[") && token.endsWith("]");
714
+ }
715
+ var ruleFunction4 = (primary) => (root, result) => {
716
+ if (!validateOptions4(result, ruleName4, {
717
+ actual: primary,
718
+ possible: [true]
719
+ })) {
720
+ return;
721
+ }
722
+ root.walkDecls((declaration) => {
723
+ if (!(0, import_ts_extras4.setHas)(trackTemplateProperties, declaration.prop.toLowerCase())) {
724
+ return;
725
+ }
726
+ for (const repeatCall of findValueFunctionCalls(declaration.value, "repeat")) {
727
+ const repeatKeyword = getRepeatKeyword(repeatCall.body);
728
+ if ((0, import_ts_extras4.isDefined)(repeatKeyword)) {
729
+ const trackList = splitTopLevelCommas(repeatCall.body).slice(1).join(",");
730
+ const invalidTrack = getInvalidAutoRepeatTrack(trackList);
731
+ if ((0, import_ts_extras4.isDefined)(invalidTrack)) {
732
+ report4({
733
+ message: messages4.rejected(invalidTrack, repeatKeyword),
734
+ node: declaration,
735
+ result,
736
+ ruleName: ruleName4,
737
+ word: invalidTrack
738
+ });
739
+ }
740
+ }
741
+ }
742
+ });
743
+ };
744
+ var rule4 = createStylelintRule({
745
+ docs: docs4,
746
+ messages: messages4,
747
+ rule: ruleFunction4,
748
+ ruleName: ruleName4
749
+ });
750
+ var no_invalid_auto_repeat_default = rule4;
751
+
752
+ // dist/rules/no-invalid-minmax.js
753
+ var import_stylelint6 = __toESM(require("stylelint"), 1);
754
+ var import_ts_extras5 = require("ts-extras");
755
+ var { report: report5, ruleMessages: ruleMessages5, validateOptions: validateOptions5 } = import_stylelint6.default.utils;
756
+ var ruleName5 = createRuleName("no-invalid-minmax");
757
+ var messages5 = ruleMessages5(ruleName5, {
758
+ 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.`
759
+ });
760
+ var docs5 = {
761
+ description: "Disallow flexible `fr` values as the minimum argument in CSS Grid `minmax()` track sizes.",
762
+ recommended: true,
763
+ url: createRuleDocsUrl("no-invalid-minmax")
764
+ };
765
+ var gridTrackProperties = /* @__PURE__ */ new Set([
766
+ "grid-auto-columns",
767
+ "grid-auto-rows",
768
+ "grid-template-columns",
769
+ "grid-template-rows"
770
+ ]);
771
+ function isFlexTrackBreadth2(value) {
772
+ return /^[+\-]?(?:\d+|\d*\.\d+)fr$/v.test(value.toLowerCase());
773
+ }
774
+ var ruleFunction5 = (primary) => (root, result) => {
775
+ if (!validateOptions5(result, ruleName5, {
776
+ actual: primary,
777
+ possible: [true]
778
+ })) {
779
+ return;
780
+ }
781
+ root.walkDecls((declaration) => {
782
+ if (!(0, import_ts_extras5.setHas)(gridTrackProperties, declaration.prop.toLowerCase())) {
783
+ return;
784
+ }
785
+ for (const minmaxCall of findValueFunctionCalls(declaration.value, "minmax")) {
786
+ const minimum = (0, import_ts_extras5.arrayFirst)(splitTopLevelCommas(minmaxCall.body))?.trim();
787
+ if ((0, import_ts_extras5.isDefined)(minimum) && isFlexTrackBreadth2(minimum)) {
788
+ report5({
789
+ message: messages5.rejected(minimum),
790
+ node: declaration,
791
+ result,
792
+ ruleName: ruleName5,
793
+ word: minimum
794
+ });
795
+ }
796
+ }
797
+ });
798
+ };
799
+ var rule5 = createStylelintRule({
800
+ docs: docs5,
801
+ messages: messages5,
802
+ rule: ruleFunction5,
803
+ ruleName: ruleName5
804
+ });
805
+ var no_invalid_minmax_default = rule5;
806
+
807
+ // dist/rules/no-mismatched-template-rows.js
808
+ var import_stylelint7 = __toESM(require("stylelint"), 1);
809
+ var import_ts_extras6 = require("ts-extras");
810
+ var { report: report6, ruleMessages: ruleMessages6, validateOptions: validateOptions6 } = import_stylelint7.default.utils;
811
+ var ruleName6 = createRuleName("no-mismatched-template-rows");
812
+ var messages6 = ruleMessages6(ruleName6, {
813
+ rejected: (areaRows, trackRows) => `\`grid-template-areas\` defines ${String(areaRows)} rows, but sibling \`grid-template-rows\` defines ${String(trackRows)} tracks.`
814
+ });
815
+ var docs6 = {
816
+ description: "Require `grid-template-rows` track count to match `grid-template-areas` row count.",
817
+ recommended: true,
818
+ url: createRuleDocsUrl("no-mismatched-template-rows")
819
+ };
820
+ var ruleFunction6 = (primary) => (root, result) => {
821
+ if (!validateOptions6(result, ruleName6, {
822
+ actual: primary,
823
+ possible: [true]
824
+ })) {
825
+ return;
826
+ }
827
+ for (const template of collectGridTemplateAreas(root)) {
828
+ if ((0, import_ts_extras6.isEmpty)(template.diagnostics)) {
829
+ const rowsDeclaration = findSiblingDeclaration(template.declaration, "grid-template-rows");
830
+ const trackRows = (0, import_ts_extras6.isDefined)(rowsDeclaration) ? countGridTracks(rowsDeclaration.value) : void 0;
831
+ if ((0, import_ts_extras6.isDefined)(rowsDeclaration) && (0, import_ts_extras6.isDefined)(trackRows) && trackRows !== template.rows.length) {
832
+ report6({
833
+ message: messages6.rejected(template.rows.length, trackRows),
834
+ node: rowsDeclaration,
835
+ result,
836
+ ruleName: ruleName6
837
+ });
838
+ }
839
+ }
840
+ }
841
+ };
842
+ var rule6 = createStylelintRule({
843
+ docs: docs6,
844
+ messages: messages6,
845
+ rule: ruleFunction6,
846
+ ruleName: ruleName6
847
+ });
848
+ var no_mismatched_template_rows_default = rule6;
849
+
850
+ // dist/rules/no-overlapping-areas.js
851
+ var import_stylelint8 = __toESM(require("stylelint"), 1);
852
+ var import_ts_extras7 = require("ts-extras");
853
+ var { report: report7, ruleMessages: ruleMessages7, validateOptions: validateOptions7 } = import_stylelint8.default.utils;
854
+ var ruleName7 = createRuleName("no-overlapping-areas");
855
+ var messages7 = ruleMessages7(ruleName7, {
856
+ rejected: (areaName, firstSelector) => `Grid area "${areaName}" is assigned by more than one selector; it may overlap the earlier "${firstSelector}" item at runtime.`
857
+ });
858
+ var docs7 = {
859
+ description: "Disallow multiple selectors assigning the same single-name `grid-area` value in one stylesheet.",
860
+ recommended: false,
861
+ url: createRuleDocsUrl("no-overlapping-areas")
862
+ };
863
+ var ruleFunction7 = (primary) => (root, result) => {
864
+ if (!validateOptions7(result, ruleName7, {
865
+ actual: primary,
866
+ possible: [true]
867
+ })) {
868
+ return;
869
+ }
870
+ const firstUsageByName = /* @__PURE__ */ new Map();
871
+ for (const usage of collectGridAreaUsages(root)) {
872
+ const firstUsage = firstUsageByName.get(usage.name);
873
+ if ((0, import_ts_extras7.isDefined)(firstUsage)) {
874
+ report7({
875
+ message: messages7.rejected(usage.name, firstUsage.selector ?? firstUsage.name),
876
+ node: usage.declaration,
877
+ result,
878
+ ruleName: ruleName7,
879
+ word: usage.name
880
+ });
881
+ } else {
882
+ firstUsageByName.set(usage.name, usage);
883
+ }
884
+ }
885
+ };
886
+ var rule7 = createStylelintRule({
887
+ docs: docs7,
888
+ messages: messages7,
889
+ rule: ruleFunction7,
890
+ ruleName: ruleName7
891
+ });
892
+ var no_overlapping_areas_default = rule7;
893
+
894
+ // dist/rules/no-unknown-areas.js
895
+ var import_stylelint9 = __toESM(require("stylelint"), 1);
896
+ var import_ts_extras8 = require("ts-extras");
897
+ var { report: report8, ruleMessages: ruleMessages8, validateOptions: validateOptions8 } = import_stylelint9.default.utils;
898
+ var ruleName8 = createRuleName("no-unknown-areas");
899
+ var messages8 = ruleMessages8(ruleName8, {
900
+ rejected: (areaName) => `Grid area "${areaName}" is referenced by \`grid-area\` but is not declared in any \`grid-template-areas\` template in this stylesheet.`
901
+ });
902
+ var docs8 = {
903
+ description: "Disallow single-name `grid-area` references that do not match any named area declared in the same stylesheet.",
904
+ recommended: true,
905
+ url: createRuleDocsUrl("no-unknown-areas")
906
+ };
907
+ var ruleFunction8 = (primary) => (root, result) => {
908
+ if (!validateOptions8(result, ruleName8, {
909
+ actual: primary,
910
+ possible: [true]
911
+ })) {
912
+ return;
913
+ }
914
+ const declaredAreaNames = new Set(collectGridTemplateAreas(root).flatMap((template) => (0, import_ts_extras8.isEmpty)(template.diagnostics) ? template.areaNames : []));
915
+ if (declaredAreaNames.size === 0) {
916
+ return;
917
+ }
918
+ for (const usage of collectGridAreaUsages(root)) {
919
+ if (!(0, import_ts_extras8.setHas)(declaredAreaNames, usage.name)) {
920
+ report8({
921
+ message: messages8.rejected(usage.name),
922
+ node: usage.declaration,
923
+ result,
924
+ ruleName: ruleName8,
925
+ word: usage.name
926
+ });
927
+ }
928
+ }
929
+ };
930
+ var rule8 = createStylelintRule({
931
+ docs: docs8,
932
+ messages: messages8,
933
+ rule: ruleFunction8,
934
+ ruleName: ruleName8
935
+ });
936
+ var no_unknown_areas_default = rule8;
937
+
938
+ // dist/rules/no-unused-areas.js
939
+ var import_stylelint10 = __toESM(require("stylelint"), 1);
940
+ var import_ts_extras9 = require("ts-extras");
941
+ var { report: report9, ruleMessages: ruleMessages9, validateOptions: validateOptions9 } = import_stylelint10.default.utils;
942
+ var ruleName9 = createRuleName("no-unused-areas");
943
+ var messages9 = ruleMessages9(ruleName9, {
944
+ rejected: (areaName) => `Grid template area "${areaName}" is declared but no single-name \`grid-area: ${areaName}\` declaration exists in this stylesheet.`
945
+ });
946
+ var docs9 = {
947
+ description: "Disallow named template areas that are never referenced by a single-name `grid-area` declaration in the same stylesheet.",
948
+ recommended: false,
949
+ url: createRuleDocsUrl("no-unused-areas")
950
+ };
951
+ var ruleFunction9 = (primary) => (root, result) => {
952
+ if (!validateOptions9(result, ruleName9, {
953
+ actual: primary,
954
+ possible: [true]
955
+ })) {
956
+ return;
957
+ }
958
+ const usedAreaNames = new Set(collectGridAreaUsages(root).map((usage) => usage.name));
959
+ for (const template of collectGridTemplateAreas(root)) {
960
+ if ((0, import_ts_extras9.isEmpty)(template.diagnostics)) {
961
+ for (const areaName of template.areaNames) {
962
+ if (!(0, import_ts_extras9.setHas)(usedAreaNames, areaName)) {
963
+ report9({
964
+ message: messages9.rejected(areaName),
965
+ node: template.declaration,
966
+ result,
967
+ ruleName: ruleName9,
968
+ word: areaName
969
+ });
970
+ }
971
+ }
972
+ }
973
+ }
974
+ };
975
+ var rule9 = createStylelintRule({
976
+ docs: docs9,
977
+ messages: messages9,
978
+ rule: ruleFunction9,
979
+ ruleName: ruleName9
980
+ });
981
+ var no_unused_areas_default = rule9;
982
+
983
+ // dist/rules/prefer-gap-properties.js
984
+ var import_stylelint11 = __toESM(require("stylelint"), 1);
985
+ var import_ts_extras10 = require("ts-extras");
986
+ var { report: report10, ruleMessages: ruleMessages10, validateOptions: validateOptions10 } = import_stylelint11.default.utils;
987
+ var ruleName10 = createRuleName("prefer-gap-properties");
988
+ var messages10 = ruleMessages10(ruleName10, {
989
+ rejected: (propertyName, replacement) => `Prefer \`${replacement}\` over legacy \`${propertyName}\`.`
990
+ });
991
+ var docs10 = {
992
+ description: "Prefer modern `gap`, `row-gap`, and `column-gap` properties over legacy grid gap aliases.",
993
+ recommended: true,
994
+ url: createRuleDocsUrl("prefer-gap-properties")
995
+ };
996
+ var replacements = {
997
+ "grid-column-gap": "column-gap",
998
+ "grid-gap": "gap",
999
+ "grid-row-gap": "row-gap"
1000
+ };
1001
+ function getReplacement(declaration) {
1002
+ return replacements[declaration.prop.toLowerCase()];
1003
+ }
1004
+ var ruleFunction10 = (primary) => (root, result) => {
1005
+ if (!validateOptions10(result, ruleName10, {
1006
+ actual: primary,
1007
+ possible: [true]
1008
+ })) {
1009
+ return;
1010
+ }
1011
+ root.walkDecls((declaration) => {
1012
+ const replacement = getReplacement(declaration);
1013
+ if (!(0, import_ts_extras10.isDefined)(replacement)) {
1014
+ return;
1015
+ }
1016
+ report10({
1017
+ fix: () => {
1018
+ declaration.prop = replacement;
1019
+ },
1020
+ message: messages10.rejected(declaration.prop, replacement),
1021
+ node: declaration,
1022
+ result,
1023
+ ruleName: ruleName10,
1024
+ word: declaration.prop
1025
+ });
1026
+ });
1027
+ };
1028
+ var rule10 = createStylelintRule({
1029
+ docs: docs10,
1030
+ messages: messages10,
1031
+ meta: {
1032
+ fixable: true
1033
+ },
1034
+ rule: ruleFunction10,
1035
+ ruleName: ruleName10
1036
+ });
1037
+ var prefer_gap_properties_default = rule10;
1038
+
1039
+ // dist/rules/require-explicit-rows-with-column-flow.js
1040
+ var import_stylelint12 = __toESM(require("stylelint"), 1);
1041
+ var import_ts_extras11 = require("ts-extras");
1042
+ var { report: report11, ruleMessages: ruleMessages11, validateOptions: validateOptions11 } = import_stylelint12.default.utils;
1043
+ var ruleName11 = createRuleName("require-explicit-rows-with-column-flow");
1044
+ var messages11 = ruleMessages11(ruleName11, {
1045
+ rejected: () => "Pair `grid-auto-flow: column` with explicit row sizing in the same block, such as `grid-template-rows` or `grid-auto-rows`."
1046
+ });
1047
+ var docs11 = {
1048
+ description: "Require explicit row sizing when a rule uses `grid-auto-flow: column`.",
1049
+ recommended: false,
1050
+ url: createRuleDocsUrl("require-explicit-rows-with-column-flow")
1051
+ };
1052
+ function hasColumnFlow(value) {
1053
+ return splitTopLevelWhitespace(value).some((token) => token.toLowerCase() === "column");
1054
+ }
1055
+ var ruleFunction11 = (primary) => (root, result) => {
1056
+ if (!validateOptions11(result, ruleName11, {
1057
+ actual: primary,
1058
+ possible: [true]
1059
+ })) {
1060
+ return;
1061
+ }
1062
+ root.walkDecls("grid-auto-flow", (declaration) => {
1063
+ if (!hasColumnFlow(declaration.value)) {
1064
+ return;
1065
+ }
1066
+ const hasExplicitRows = (0, import_ts_extras11.isDefined)(findSiblingDeclaration(declaration, "grid-template-rows")) || (0, import_ts_extras11.isDefined)(findSiblingDeclaration(declaration, "grid-auto-rows"));
1067
+ if (hasExplicitRows) {
1068
+ return;
1069
+ }
1070
+ report11({
1071
+ message: messages11.rejected(),
1072
+ node: declaration,
1073
+ result,
1074
+ ruleName: ruleName11,
1075
+ word: "column"
1076
+ });
1077
+ });
1078
+ };
1079
+ var rule11 = createStylelintRule({
1080
+ docs: docs11,
1081
+ messages: messages11,
1082
+ rule: ruleFunction11,
1083
+ ruleName: ruleName11
1084
+ });
1085
+ var require_explicit_rows_with_column_flow_default = rule11;
1086
+
1087
+ // dist/rules/validate-area-shapes.js
1088
+ var import_stylelint13 = __toESM(require("stylelint"), 1);
1089
+ var import_ts_extras12 = require("ts-extras");
1090
+ var { report: report12, ruleMessages: ruleMessages12, validateOptions: validateOptions12 } = import_stylelint13.default.utils;
1091
+ var ruleName12 = createRuleName("validate-area-shapes");
1092
+ var messages12 = ruleMessages12(ruleName12, {
1093
+ rejected: (areaName) => `Grid area "${areaName}" must form one contiguous rectangle in \`grid-template-areas\`.`
1094
+ });
1095
+ var docs12 = {
1096
+ description: "Require every named grid template area to form one contiguous rectangle.",
1097
+ recommended: true,
1098
+ url: createRuleDocsUrl("validate-area-shapes")
1099
+ };
1100
+ var ruleFunction12 = (primary) => (root, result) => {
1101
+ if (!validateOptions12(result, ruleName12, {
1102
+ actual: primary,
1103
+ possible: [true]
1104
+ })) {
1105
+ return;
1106
+ }
1107
+ for (const template of collectGridTemplateAreas(root)) {
1108
+ if ((0, import_ts_extras12.isEmpty)(template.diagnostics)) {
1109
+ for (const shape of getAreaShapes(template)) {
1110
+ if (!isRectangularArea(template, shape)) {
1111
+ report12({
1112
+ message: messages12.rejected(shape.name),
1113
+ node: template.declaration,
1114
+ result,
1115
+ ruleName: ruleName12,
1116
+ word: shape.name
1117
+ });
1118
+ }
1119
+ }
1120
+ }
1121
+ }
1122
+ };
1123
+ var rule12 = createStylelintRule({
1124
+ docs: docs12,
1125
+ messages: messages12,
1126
+ rule: ruleFunction12,
1127
+ ruleName: ruleName12
1128
+ });
1129
+ var validate_area_shapes_default = rule12;
1130
+
1131
+ // dist/rules/validate-track-counts.js
1132
+ var import_stylelint14 = __toESM(require("stylelint"), 1);
1133
+ var import_ts_extras13 = require("ts-extras");
1134
+ var { report: report13, ruleMessages: ruleMessages13, validateOptions: validateOptions13 } = import_stylelint14.default.utils;
1135
+ var ruleName13 = createRuleName("validate-track-counts");
1136
+ var messages13 = ruleMessages13(ruleName13, {
1137
+ columns: (areaColumns, trackColumns) => `\`grid-template-areas\` defines ${String(areaColumns)} columns, but sibling \`grid-template-columns\` defines ${String(trackColumns)} tracks.`,
1138
+ rows: (areaRows, trackRows) => `\`grid-template-areas\` defines ${String(areaRows)} rows, but sibling \`grid-template-rows\` defines ${String(trackRows)} tracks.`
1139
+ });
1140
+ var docs13 = {
1141
+ description: "Require template row and column track counts to match `grid-template-areas` dimensions.",
1142
+ recommended: true,
1143
+ url: createRuleDocsUrl("validate-track-counts")
1144
+ };
1145
+ var ruleFunction13 = (primary) => (root, result) => {
1146
+ if (!validateOptions13(result, ruleName13, {
1147
+ actual: primary,
1148
+ possible: [true]
1149
+ })) {
1150
+ return;
1151
+ }
1152
+ for (const template of collectGridTemplateAreas(root)) {
1153
+ const expectedColumns = (0, import_ts_extras13.arrayFirst)(template.rows)?.length;
1154
+ if ((0, import_ts_extras13.isEmpty)(template.diagnostics) && (0, import_ts_extras13.isDefined)(expectedColumns)) {
1155
+ const expectedRows = template.rows.length;
1156
+ const rowsDeclaration = findSiblingDeclaration(template.declaration, "grid-template-rows");
1157
+ const columnsDeclaration = findSiblingDeclaration(template.declaration, "grid-template-columns");
1158
+ const actualRows = (0, import_ts_extras13.isDefined)(rowsDeclaration) ? countGridTracks(rowsDeclaration.value) : void 0;
1159
+ const actualColumns = (0, import_ts_extras13.isDefined)(columnsDeclaration) ? countGridTracks(columnsDeclaration.value) : void 0;
1160
+ if ((0, import_ts_extras13.isDefined)(rowsDeclaration) && (0, import_ts_extras13.isDefined)(actualRows) && actualRows !== expectedRows) {
1161
+ report13({
1162
+ message: messages13.rows(expectedRows, actualRows),
1163
+ node: rowsDeclaration,
1164
+ result,
1165
+ ruleName: ruleName13
1166
+ });
1167
+ }
1168
+ if ((0, import_ts_extras13.isDefined)(columnsDeclaration) && (0, import_ts_extras13.isDefined)(actualColumns) && actualColumns !== expectedColumns) {
1169
+ report13({
1170
+ message: messages13.columns(expectedColumns, actualColumns),
1171
+ node: columnsDeclaration,
1172
+ result,
1173
+ ruleName: ruleName13
1174
+ });
1175
+ }
1176
+ }
1177
+ }
1178
+ };
1179
+ var rule13 = createStylelintRule({
1180
+ docs: docs13,
1181
+ messages: messages13,
1182
+ rule: ruleFunction13,
1183
+ ruleName: ruleName13
1184
+ });
1185
+ var validate_track_counts_default = rule13;
1186
+
1187
+ // dist/_internal/rules-registry.js
1188
+ var gridRules = {
1189
+ "consistent-area-naming": consistent_area_naming_default,
1190
+ "no-dense-auto-flow": no_dense_auto_flow_default,
1191
+ "no-invalid-areas": no_invalid_areas_default,
1192
+ "no-invalid-auto-repeat": no_invalid_auto_repeat_default,
1193
+ "no-invalid-minmax": no_invalid_minmax_default,
1194
+ "no-mismatched-template-rows": no_mismatched_template_rows_default,
1195
+ "no-overlapping-areas": no_overlapping_areas_default,
1196
+ "no-unknown-areas": no_unknown_areas_default,
1197
+ "no-unused-areas": no_unused_areas_default,
1198
+ "prefer-gap-properties": prefer_gap_properties_default,
1199
+ "require-explicit-rows-with-column-flow": require_explicit_rows_with_column_flow_default,
1200
+ "validate-area-shapes": validate_area_shapes_default,
1201
+ "validate-track-counts": validate_track_counts_default
1202
+ };
1203
+
1204
+ // dist/plugin.js
1205
+ var packageMetaName = PACKAGE_NAME;
1206
+ var packageMetaNamespace = PLUGIN_NAMESPACE;
1207
+ var packageMetaVersion = PACKAGE_VERSION;
1208
+ var runtimeRules = gridRules;
1209
+ var publicConfigNames = CONFIG_NAMES;
1210
+ var meta = {
1211
+ name: packageMetaName,
1212
+ namespace: packageMetaNamespace,
1213
+ version: packageMetaVersion
1214
+ };
1215
+ var rules = runtimeRules;
1216
+ var ruleNames = (0, import_ts_extras14.objectKeys)(rules).toSorted((left, right) => left.localeCompare(right));
1217
+ var gridRuleEntries = (() => {
1218
+ const entries = [];
1219
+ for (const ruleName14 of ruleNames) {
1220
+ const rule14 = rules[ruleName14];
1221
+ if ((0, import_ts_extras14.isDefined)(rule14)) {
1222
+ entries.push([ruleName14, rule14]);
1223
+ }
1224
+ }
1225
+ return entries;
1226
+ })();
1227
+ function isGridRuleId(ruleName14) {
1228
+ return ruleName14.startsWith(`${PLUGIN_NAMESPACE}/`);
1229
+ }
1230
+ function toGridRuleId(ruleName14) {
1231
+ if (!isGridRuleId(ruleName14)) {
1232
+ throw new Error(`Unexpected Stylelint rule id "${ruleName14}".`);
1233
+ }
1234
+ return ruleName14;
1235
+ }
1236
+ var plugins = gridRuleEntries.map(([, rule14]) => rule14);
1237
+ var ruleIds = gridRuleEntries.map(([, rule14]) => toGridRuleId(rule14.ruleName));
1238
+ var recommendedRuleIds = gridRuleEntries.filter(([, rule14]) => rule14.docs.recommended).map(([, rule14]) => toGridRuleId(rule14.ruleName));
1239
+ function createConfig(enabledRuleIds) {
1240
+ return {
1241
+ plugins: [...plugins],
1242
+ rules: (() => {
1243
+ const rulesConfig = {};
1244
+ for (const ruleId of enabledRuleIds) {
1245
+ rulesConfig[ruleId] = true;
1246
+ }
1247
+ return rulesConfig;
1248
+ })()
1249
+ };
1250
+ }
1251
+ var gridPluginConfigs = {
1252
+ "grid-all": createConfig(ruleIds),
1253
+ "grid-recommended": createConfig(recommendedRuleIds)
1254
+ };
1255
+ var configNames = publicConfigNames;
1256
+ var plugin_default = plugins;
1257
+ // Annotate the CommonJS export names for ESM import in node:
1258
+ 0 && (module.exports = {
1259
+ configNames,
1260
+ gridPluginConfigs,
1261
+ meta,
1262
+ plugins,
1263
+ ruleIds,
1264
+ ruleNames,
1265
+ rules
1266
+ });
1267
+ module.exports = Object.assign(module.exports.default, module.exports);
1268
+ //# sourceMappingURL=plugin.cjs.map