stylelint-plugin-grid 1.0.1 → 1.0.2

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 (58) hide show
  1. package/README.md +8 -0
  2. package/dist/_internal/grid-placement-analysis.d.ts +20 -0
  3. package/dist/_internal/grid-placement-analysis.d.ts.map +1 -0
  4. package/dist/_internal/grid-placement-analysis.js +59 -0
  5. package/dist/_internal/grid-placement-analysis.js.map +1 -0
  6. package/dist/_internal/grid-template-analysis.d.ts +2 -0
  7. package/dist/_internal/grid-template-analysis.d.ts.map +1 -1
  8. package/dist/_internal/grid-template-analysis.js +4 -0
  9. package/dist/_internal/grid-template-analysis.js.map +1 -1
  10. package/dist/_internal/rules-registry.d.ts.map +1 -1
  11. package/dist/_internal/rules-registry.js +16 -0
  12. package/dist/_internal/rules-registry.js.map +1 -1
  13. package/dist/plugin.cjs +893 -285
  14. package/dist/plugin.cjs.map +4 -4
  15. package/dist/rules/no-conflicting-placement.d.ts +8 -0
  16. package/dist/rules/no-conflicting-placement.d.ts.map +1 -0
  17. package/dist/rules/no-conflicting-placement.js +70 -0
  18. package/dist/rules/no-conflicting-placement.js.map +1 -0
  19. package/dist/rules/no-ineffective-container-properties.d.ts +8 -0
  20. package/dist/rules/no-ineffective-container-properties.d.ts.map +1 -0
  21. package/dist/rules/no-ineffective-container-properties.js +97 -0
  22. package/dist/rules/no-ineffective-container-properties.js.map +1 -0
  23. package/dist/rules/no-invalid-repeat-count.d.ts +8 -0
  24. package/dist/rules/no-invalid-repeat-count.d.ts.map +1 -0
  25. package/dist/rules/no-invalid-repeat-count.js +75 -0
  26. package/dist/rules/no-invalid-repeat-count.js.map +1 -0
  27. package/dist/rules/no-invalid-span.d.ts +8 -0
  28. package/dist/rules/no-invalid-span.d.ts.map +1 -0
  29. package/dist/rules/no-invalid-span.js +49 -0
  30. package/dist/rules/no-invalid-span.js.map +1 -0
  31. package/dist/rules/no-reversed-placement-lines.d.ts +8 -0
  32. package/dist/rules/no-reversed-placement-lines.d.ts.map +1 -0
  33. package/dist/rules/no-reversed-placement-lines.js +129 -0
  34. package/dist/rules/no-reversed-placement-lines.js.map +1 -0
  35. package/dist/rules/no-zero-grid-lines.d.ts +8 -0
  36. package/dist/rules/no-zero-grid-lines.d.ts.map +1 -0
  37. package/dist/rules/no-zero-grid-lines.js +48 -0
  38. package/dist/rules/no-zero-grid-lines.js.map +1 -0
  39. package/dist/rules/prefer-minmax-zero-fr.d.ts +8 -0
  40. package/dist/rules/prefer-minmax-zero-fr.d.ts.map +1 -0
  41. package/dist/rules/prefer-minmax-zero-fr.js +56 -0
  42. package/dist/rules/prefer-minmax-zero-fr.js.map +1 -0
  43. package/dist/rules/require-explicit-tracks-with-areas.d.ts +12 -0
  44. package/dist/rules/require-explicit-tracks-with-areas.d.ts.map +1 -0
  45. package/dist/rules/require-explicit-tracks-with-areas.js +65 -0
  46. package/dist/rules/require-explicit-tracks-with-areas.js.map +1 -0
  47. package/docs/rules/configs/grid-all.md +8 -0
  48. package/docs/rules/configs/grid-recommended.md +6 -0
  49. package/docs/rules/configs/index.md +8 -0
  50. package/docs/rules/no-conflicting-placement.md +59 -0
  51. package/docs/rules/no-ineffective-container-properties.md +63 -0
  52. package/docs/rules/no-invalid-repeat-count.md +56 -0
  53. package/docs/rules/no-invalid-span.md +55 -0
  54. package/docs/rules/no-reversed-placement-lines.md +56 -0
  55. package/docs/rules/no-zero-grid-lines.md +53 -0
  56. package/docs/rules/prefer-minmax-zero-fr.md +49 -0
  57. package/docs/rules/require-explicit-tracks-with-areas.md +80 -0
  58. package/package.json +1 -1
@@ -0,0 +1,56 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { setHas } from "ts-extras";
3
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
4
+ import { 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("prefer-minmax-zero-fr");
8
+ const messages = ruleMessages(ruleName, {
9
+ rejected: (track) => `Wrap bare flexible column track \`${track}\` in \`minmax(0, ${track})\` to avoid content-driven overflow.`,
10
+ });
11
+ const docs = {
12
+ description: "Prefer `minmax(0, <flex>)` for bare flexible CSS Grid column tracks.",
13
+ recommended: false,
14
+ url: createRuleDocsUrl("prefer-minmax-zero-fr"),
15
+ };
16
+ const ignoredTrackKeywords = new Set([
17
+ "masonry",
18
+ "none",
19
+ "subgrid",
20
+ ]);
21
+ const flexTrackPattern = /^\+?(?:\d+|\d*\.\d+)fr$/v;
22
+ function isBareFlexibleTrack(token) {
23
+ const normalizedToken = token.toLowerCase();
24
+ return (!setHas(ignoredTrackKeywords, normalizedToken) &&
25
+ flexTrackPattern.test(normalizedToken));
26
+ }
27
+ const ruleFunction = (primary) => (root, result) => {
28
+ if (!validateOptions(result, ruleName, {
29
+ actual: primary,
30
+ possible: [true],
31
+ })) {
32
+ return;
33
+ }
34
+ root.walkDecls("grid-template-columns", (declaration) => {
35
+ for (const token of splitTopLevelWhitespace(declaration.value)) {
36
+ if (isBareFlexibleTrack(token)) {
37
+ report({
38
+ message: messages.rejected(token),
39
+ node: declaration,
40
+ result,
41
+ ruleName,
42
+ word: token,
43
+ });
44
+ }
45
+ }
46
+ });
47
+ };
48
+ /** Public Stylelint rule definition. */
49
+ const rule = createStylelintRule({
50
+ docs,
51
+ messages,
52
+ rule: ruleFunction,
53
+ ruleName,
54
+ });
55
+ export default rule;
56
+ //# sourceMappingURL=prefer-minmax-zero-fr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-minmax-zero-fr.js","sourceRoot":"","sources":["../../src/rules/prefer-minmax-zero-fr.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAiB,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EACH,mBAAmB,GAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,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,uBAAuB,CAAC,CAAC;AACzD,MAAM,QAAQ,GAA4C,YAAY,CAClE,QAAQ,EACR;IACI,QAAQ,EAAE,CAAC,KAAa,EAAU,EAAE,CAChC,qCAAqC,KAAK,qBAAqB,KAAK,uCAAuC;CAClH,CACJ,CAAC;AAEF,MAAM,IAAI,GAAG;IACT,WAAW,EACP,sEAAsE;IAC1E,WAAW,EAAE,KAAK;IAClB,GAAG,EAAE,iBAAiB,CAAC,uBAAuB,CAAC;CACzC,CAAC;AAEX,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACtD,SAAS;IACT,MAAM;IACN,SAAS;CACZ,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAEpD,SAAS,mBAAmB,CAAC,KAAa;IACtC,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAE5C,OAAO,CACH,CAAC,MAAM,CAAC,oBAAoB,EAAE,eAAe,CAAC;QAC9C,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CACzC,CAAC;AACN,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,uBAAuB,EAAE,CAAC,WAAW,EAAE,EAAE;QACpD,KAAK,MAAM,KAAK,IAAI,uBAAuB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7D,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC;oBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACjC,IAAI,EAAE,WAAW;oBACjB,MAAM;oBACN,QAAQ;oBACR,IAAI,EAAE,KAAK;iBACd,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,12 @@
1
+ import { type StylelintPluginRule } from "../_internal/create-stylelint-rule.js";
2
+ type SecondaryOptions = Readonly<{
3
+ columns?: boolean;
4
+ rows?: boolean;
5
+ }>;
6
+ declare const messages: {
7
+ rejected: (propertyName: string) => string;
8
+ };
9
+ /** Public Stylelint rule definition. */
10
+ declare const rule: StylelintPluginRule<boolean, SecondaryOptions | undefined, typeof messages>;
11
+ export default rule;
12
+ //# sourceMappingURL=require-explicit-tracks-with-areas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-explicit-tracks-with-areas.d.ts","sourceRoot":"","sources":["../../src/rules/require-explicit-tracks-with-areas.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,mBAAmB,EAC3B,MAAM,uCAAuC,CAAC;AAc/C,KAAK,gBAAgB,GAAG,QAAQ,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC,CAAC;AAEH,QAAA,MAAM,QAAQ,EAAE;IAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;CAM3D,CAAC;AAwEF,wCAAwC;AACxC,QAAA,MAAM,IAAI,EAAE,mBAAmB,CAC3B,OAAO,EACP,gBAAgB,GAAG,SAAS,EAC5B,OAAO,QAAQ,CAQlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,65 @@
1
+ import stylelint, {} from "stylelint";
2
+ import { isEmpty } from "ts-extras";
3
+ import { createStylelintRule, } from "../_internal/create-stylelint-rule.js";
4
+ import { collectGridTemplateAreas, 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("require-explicit-tracks-with-areas");
8
+ const messages = ruleMessages(ruleName, {
9
+ rejected: (propertyName) => `Pair \`grid-template-areas\` with \`${propertyName}\` in the same block so named areas have explicit track sizing.`,
10
+ });
11
+ const docs = {
12
+ description: "Require explicit track sizing alongside CSS Grid named area templates.",
13
+ recommended: false,
14
+ url: createRuleDocsUrl("require-explicit-tracks-with-areas"),
15
+ };
16
+ const ruleFunction = (primary, secondary) => (root, result) => {
17
+ if (!validateOptions(result, ruleName, {
18
+ actual: primary,
19
+ possible: [true],
20
+ }, {
21
+ actual: secondary,
22
+ optional: true,
23
+ possible: {
24
+ columns: [true, false],
25
+ rows: [true, false],
26
+ },
27
+ })) {
28
+ return;
29
+ }
30
+ const requireColumns = secondary?.columns ?? true;
31
+ const requireRows = secondary?.rows ?? false;
32
+ for (const template of collectGridTemplateAreas(root)) {
33
+ if (isEmpty(template.diagnostics)) {
34
+ if (requireColumns &&
35
+ !findSiblingDeclaration(template.declaration, "grid-template-columns")) {
36
+ report({
37
+ message: messages.rejected("grid-template-columns"),
38
+ node: template.declaration,
39
+ result,
40
+ ruleName,
41
+ word: template.declaration.prop,
42
+ });
43
+ }
44
+ if (requireRows &&
45
+ !findSiblingDeclaration(template.declaration, "grid-template-rows")) {
46
+ report({
47
+ message: messages.rejected("grid-template-rows"),
48
+ node: template.declaration,
49
+ result,
50
+ ruleName,
51
+ word: template.declaration.prop,
52
+ });
53
+ }
54
+ }
55
+ }
56
+ };
57
+ /** Public Stylelint rule definition. */
58
+ const rule = createStylelintRule({
59
+ docs,
60
+ messages,
61
+ rule: ruleFunction,
62
+ ruleName,
63
+ });
64
+ export default rule;
65
+ //# sourceMappingURL=require-explicit-tracks-with-areas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-explicit-tracks-with-areas.js","sourceRoot":"","sources":["../../src/rules/require-explicit-tracks-with-areas.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAiB,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACH,mBAAmB,GAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,wBAAwB,EACxB,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,oCAAoC,CAAC,CAAC;AAOtE,MAAM,QAAQ,GAAmD,YAAY,CACzE,QAAQ,EACR;IACI,QAAQ,EAAE,CAAC,YAAoB,EAAU,EAAE,CACvC,uCAAuC,YAAY,iEAAiE;CAC3H,CACJ,CAAC;AAEF,MAAM,IAAI,GAAG;IACT,WAAW,EACP,wEAAwE;IAC5E,WAAW,EAAE,KAAK;IAClB,GAAG,EAAE,iBAAiB,CAAC,oCAAoC,CAAC;CACtD,CAAC;AAEX,MAAM,YAAY,GACd,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;IACrC,IACI,CAAC,eAAe,CACZ,MAAM,EACN,QAAQ,EACR;QACI,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB,EACD;QACI,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE;YACN,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;YACtB,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;SACtB;KACJ,CACJ,EACH,CAAC;QACC,OAAO;IACX,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC;IAClD,MAAM,WAAW,GAAG,SAAS,EAAE,IAAI,IAAI,KAAK,CAAC;IAE7C,KAAK,MAAM,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,IACI,cAAc;gBACd,CAAC,sBAAsB,CACnB,QAAQ,CAAC,WAAW,EACpB,uBAAuB,CAC1B,EACH,CAAC;gBACC,MAAM,CAAC;oBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAAC;oBACnD,IAAI,EAAE,QAAQ,CAAC,WAAW;oBAC1B,MAAM;oBACN,QAAQ;oBACR,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI;iBAClC,CAAC,CAAC;YACP,CAAC;YAED,IACI,WAAW;gBACX,CAAC,sBAAsB,CACnB,QAAQ,CAAC,WAAW,EACpB,oBAAoB,CACvB,EACH,CAAC;gBACC,MAAM,CAAC;oBACH,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC;oBAChD,IAAI,EAAE,QAAQ,CAAC,WAAW;oBAC1B,MAAM;oBACN,QAAQ;oBACR,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI;iBAClC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEN,wCAAwC;AACxC,MAAM,IAAI,GAIN,mBAAmB,CACnB;IACI,IAAI;IACJ,QAAQ;IACR,IAAI,EAAE,YAAY;IAClB,QAAQ;CACX,CACJ,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -28,15 +28,23 @@ split grid containers and items across files may prefer
28
28
  | Rule | Fix | Description |
29
29
  | --- | :-: | --- |
30
30
  | [`consistent-area-naming`](../consistent-area-naming.md) | — | Require consistent naming for `grid-template-areas` and single-name `grid-area` identifiers. |
31
+ | [`no-conflicting-placement`](../no-conflicting-placement.md) | — | Disallow same-block CSS Grid placement declarations that write the same placement slot. |
31
32
  | [`no-dense-auto-flow`](../no-dense-auto-flow.md) | — | Disallow `grid-auto-flow: dense` because it can reorder auto-placed grid items visually. |
33
+ | [`no-ineffective-container-properties`](../no-ineffective-container-properties.md) | — | Disallow CSS Grid container declarations in blocks whose final literal display value is not grid-capable. |
32
34
  | [`no-invalid-areas`](../no-invalid-areas.md) | — | Disallow malformed `grid-template-areas` declarations. |
33
35
  | [`no-invalid-auto-repeat`](../no-invalid-auto-repeat.md) | — | Disallow definitely invalid CSS Grid auto-repeat track sizes. |
34
36
  | [`no-invalid-minmax`](../no-invalid-minmax.md) | — | Disallow flexible `fr` values as the minimum argument in CSS Grid `minmax()` track sizes. |
37
+ | [`no-invalid-repeat-count`](../no-invalid-repeat-count.md) | — | Disallow invalid fixed repeat counts in CSS Grid track templates. |
38
+ | [`no-invalid-span`](../no-invalid-span.md) | — | Disallow non-positive `span` counts in CSS Grid placement declarations. |
35
39
  | [`no-mismatched-template-rows`](../no-mismatched-template-rows.md) | — | Require `grid-template-rows` track count to match `grid-template-areas` row count. |
36
40
  | [`no-overlapping-areas`](../no-overlapping-areas.md) | — | Disallow multiple selectors assigning the same single-name `grid-area` value in one stylesheet. |
41
+ | [`no-reversed-placement-lines`](../no-reversed-placement-lines.md) | — | Disallow reversed or zero-width numeric CSS Grid placement line ranges. |
37
42
  | [`no-unknown-areas`](../no-unknown-areas.md) | — | Disallow single-name `grid-area` references that do not match any named area declared in the same stylesheet. |
38
43
  | [`no-unused-areas`](../no-unused-areas.md) | — | Disallow named template areas that are never referenced by a single-name `grid-area` declaration in the same stylesheet. |
44
+ | [`no-zero-grid-lines`](../no-zero-grid-lines.md) | — | Disallow line `0` in CSS Grid placement declarations. |
39
45
  | [`prefer-gap-properties`](../prefer-gap-properties.md) | 🔧 | Prefer modern `gap`, `row-gap`, and `column-gap` properties over legacy grid gap aliases. |
46
+ | [`prefer-minmax-zero-fr`](../prefer-minmax-zero-fr.md) | — | Prefer `minmax(0, <flex>)` for bare flexible CSS Grid column tracks. |
40
47
  | [`require-explicit-rows-with-column-flow`](../require-explicit-rows-with-column-flow.md) | — | Require explicit row sizing when a rule uses `grid-auto-flow: column`. |
48
+ | [`require-explicit-tracks-with-areas`](../require-explicit-tracks-with-areas.md) | — | Require explicit track sizing alongside CSS Grid named area templates. |
41
49
  | [`validate-area-shapes`](../validate-area-shapes.md) | — | Require every named grid template area to form one contiguous rectangle. |
42
50
  | [`validate-track-counts`](../validate-track-counts.md) | — | Require template row and column track counts to match `grid-template-areas` dimensions. |
@@ -27,11 +27,17 @@ after checking the same-file assumptions documented in
27
27
 
28
28
  | Rule | Fix | Description |
29
29
  | --- | :-: | --- |
30
+ | [`no-conflicting-placement`](../no-conflicting-placement.md) | — | Disallow same-block CSS Grid placement declarations that write the same placement slot. |
31
+ | [`no-ineffective-container-properties`](../no-ineffective-container-properties.md) | — | Disallow CSS Grid container declarations in blocks whose final literal display value is not grid-capable. |
30
32
  | [`no-invalid-areas`](../no-invalid-areas.md) | — | Disallow malformed `grid-template-areas` declarations. |
31
33
  | [`no-invalid-auto-repeat`](../no-invalid-auto-repeat.md) | — | Disallow definitely invalid CSS Grid auto-repeat track sizes. |
32
34
  | [`no-invalid-minmax`](../no-invalid-minmax.md) | — | Disallow flexible `fr` values as the minimum argument in CSS Grid `minmax()` track sizes. |
35
+ | [`no-invalid-repeat-count`](../no-invalid-repeat-count.md) | — | Disallow invalid fixed repeat counts in CSS Grid track templates. |
36
+ | [`no-invalid-span`](../no-invalid-span.md) | — | Disallow non-positive `span` counts in CSS Grid placement declarations. |
33
37
  | [`no-mismatched-template-rows`](../no-mismatched-template-rows.md) | — | Require `grid-template-rows` track count to match `grid-template-areas` row count. |
38
+ | [`no-reversed-placement-lines`](../no-reversed-placement-lines.md) | — | Disallow reversed or zero-width numeric CSS Grid placement line ranges. |
34
39
  | [`no-unknown-areas`](../no-unknown-areas.md) | — | Disallow single-name `grid-area` references that do not match any named area declared in the same stylesheet. |
40
+ | [`no-zero-grid-lines`](../no-zero-grid-lines.md) | — | Disallow line `0` in CSS Grid placement declarations. |
35
41
  | [`prefer-gap-properties`](../prefer-gap-properties.md) | 🔧 | Prefer modern `gap`, `row-gap`, and `column-gap` properties over legacy grid gap aliases. |
36
42
  | [`validate-area-shapes`](../validate-area-shapes.md) | — | Require every named grid template area to form one contiguous rectangle. |
37
43
  | [`validate-track-counts`](../validate-track-counts.md) | — | Require template row and column track counts to match `grid-template-areas` dimensions. |
@@ -32,15 +32,23 @@ config after confirming they match your project's file boundaries.
32
32
  | Rule | Fix | [`grid-all`](./grid-all.md) | [`grid-recommended`](./grid-recommended.md) | Description |
33
33
  | --- | :-: | :-: | :-: | --- |
34
34
  | [`consistent-area-naming`](../consistent-area-naming.md) | — | ✅ | — | Require consistent naming for `grid-template-areas` and single-name `grid-area` identifiers. |
35
+ | [`no-conflicting-placement`](../no-conflicting-placement.md) | — | ✅ | ✅ | Disallow same-block CSS Grid placement declarations that write the same placement slot. |
35
36
  | [`no-dense-auto-flow`](../no-dense-auto-flow.md) | — | ✅ | — | Disallow `grid-auto-flow: dense` because it can reorder auto-placed grid items visually. |
37
+ | [`no-ineffective-container-properties`](../no-ineffective-container-properties.md) | — | ✅ | ✅ | Disallow CSS Grid container declarations in blocks whose final literal display value is not grid-capable. |
36
38
  | [`no-invalid-areas`](../no-invalid-areas.md) | — | ✅ | ✅ | Disallow malformed `grid-template-areas` declarations. |
37
39
  | [`no-invalid-auto-repeat`](../no-invalid-auto-repeat.md) | — | ✅ | ✅ | Disallow definitely invalid CSS Grid auto-repeat track sizes. |
38
40
  | [`no-invalid-minmax`](../no-invalid-minmax.md) | — | ✅ | ✅ | Disallow flexible `fr` values as the minimum argument in CSS Grid `minmax()` track sizes. |
41
+ | [`no-invalid-repeat-count`](../no-invalid-repeat-count.md) | — | ✅ | ✅ | Disallow invalid fixed repeat counts in CSS Grid track templates. |
42
+ | [`no-invalid-span`](../no-invalid-span.md) | — | ✅ | ✅ | Disallow non-positive `span` counts in CSS Grid placement declarations. |
39
43
  | [`no-mismatched-template-rows`](../no-mismatched-template-rows.md) | — | ✅ | ✅ | Require `grid-template-rows` track count to match `grid-template-areas` row count. |
40
44
  | [`no-overlapping-areas`](../no-overlapping-areas.md) | — | ✅ | — | Disallow multiple selectors assigning the same single-name `grid-area` value in one stylesheet. |
45
+ | [`no-reversed-placement-lines`](../no-reversed-placement-lines.md) | — | ✅ | ✅ | Disallow reversed or zero-width numeric CSS Grid placement line ranges. |
41
46
  | [`no-unknown-areas`](../no-unknown-areas.md) | — | ✅ | ✅ | Disallow single-name `grid-area` references that do not match any named area declared in the same stylesheet. |
42
47
  | [`no-unused-areas`](../no-unused-areas.md) | — | ✅ | — | Disallow named template areas that are never referenced by a single-name `grid-area` declaration in the same stylesheet. |
48
+ | [`no-zero-grid-lines`](../no-zero-grid-lines.md) | — | ✅ | ✅ | Disallow line `0` in CSS Grid placement declarations. |
43
49
  | [`prefer-gap-properties`](../prefer-gap-properties.md) | 🔧 | ✅ | ✅ | Prefer modern `gap`, `row-gap`, and `column-gap` properties over legacy grid gap aliases. |
50
+ | [`prefer-minmax-zero-fr`](../prefer-minmax-zero-fr.md) | — | ✅ | — | Prefer `minmax(0, <flex>)` for bare flexible CSS Grid column tracks. |
44
51
  | [`require-explicit-rows-with-column-flow`](../require-explicit-rows-with-column-flow.md) | — | ✅ | — | Require explicit row sizing when a rule uses `grid-auto-flow: column`. |
52
+ | [`require-explicit-tracks-with-areas`](../require-explicit-tracks-with-areas.md) | — | ✅ | — | Require explicit track sizing alongside CSS Grid named area templates. |
45
53
  | [`validate-area-shapes`](../validate-area-shapes.md) | — | ✅ | ✅ | Require every named grid template area to form one contiguous rectangle. |
46
54
  | [`validate-track-counts`](../validate-track-counts.md) | — | ✅ | ✅ | Require template row and column track counts to match `grid-template-areas` dimensions. |
@@ -0,0 +1,59 @@
1
+ # no-conflicting-placement
2
+
3
+ Disallow same-block CSS Grid placement declarations that write the same
4
+ placement slot.
5
+
6
+ Grid placement shorthands and longhands override shared row and column slots.
7
+ Keeping competing declarations in one block usually leaves stale CSS behind and
8
+ makes later edits risky. Use one placement strategy per block.
9
+
10
+ ## Incorrect
11
+
12
+ ```css
13
+ .item {
14
+ grid-area: sidebar;
15
+ grid-column: 2 / 4;
16
+ }
17
+ ```
18
+
19
+ ```css
20
+ .item {
21
+ grid-column: 1 / 3;
22
+ grid-column-start: 2;
23
+ }
24
+ ```
25
+
26
+ ## Correct
27
+
28
+ ```css
29
+ .item {
30
+ grid-area: sidebar;
31
+ }
32
+ ```
33
+
34
+ ```css
35
+ .item {
36
+ grid-row: 1 / 3;
37
+ grid-column: 2 / 4;
38
+ }
39
+ ```
40
+
41
+ ## Stylelint Config
42
+
43
+ ```js
44
+ export default {
45
+ plugins: ["stylelint-plugin-grid"],
46
+ rules: {
47
+ "grid/no-conflicting-placement": true
48
+ }
49
+ };
50
+ ```
51
+
52
+ ## Related Rules
53
+
54
+ - [`no-reversed-placement-lines`](./no-reversed-placement-lines.md) checks
55
+ numeric placement ranges.
56
+ - [`no-zero-grid-lines`](./no-zero-grid-lines.md) rejects line `0` in placement
57
+ values.
58
+ - [`grid-recommended`](./configs/grid-recommended.md) enables this rule by
59
+ default.
@@ -0,0 +1,63 @@
1
+ # no-ineffective-container-properties
2
+
3
+ Disallow CSS Grid container declarations in blocks whose final literal
4
+ `display` value is not grid-capable.
5
+
6
+ Properties such as `grid-template-columns` and `grid-auto-flow` only define a
7
+ grid container when the element computes to `display: grid` or
8
+ `display: inline-grid`. If the same block ends with `display: contents`,
9
+ `display: flex`, or another known non-grid value, those declarations are
10
+ ineffective.
11
+
12
+ ## Incorrect
13
+
14
+ ```css
15
+ .layout {
16
+ display: contents;
17
+ grid-template-columns: 1fr 1fr;
18
+ }
19
+ ```
20
+
21
+ ```css
22
+ .layout {
23
+ display: grid;
24
+ display: flex;
25
+ grid-template-areas: "main side";
26
+ }
27
+ ```
28
+
29
+ ## Correct
30
+
31
+ ```css
32
+ .layout {
33
+ display: grid;
34
+ grid-template-columns: minmax(0, 1fr) 16rem;
35
+ }
36
+ ```
37
+
38
+ ```css
39
+ .layout {
40
+ display: var(--layout-display);
41
+ grid-template-areas: "main";
42
+ }
43
+ ```
44
+
45
+ ## Stylelint Config
46
+
47
+ ```js
48
+ export default {
49
+ plugins: ["stylelint-plugin-grid"],
50
+ rules: {
51
+ "grid/no-ineffective-container-properties": true
52
+ }
53
+ };
54
+ ```
55
+
56
+ ## Related Rules
57
+
58
+ - [`validate-track-counts`](./validate-track-counts.md) compares explicit track
59
+ counts with named area templates.
60
+ - [`require-explicit-tracks-with-areas`](./require-explicit-tracks-with-areas.md)
61
+ requires explicit track sizing for named area templates.
62
+ - [`grid-recommended`](./configs/grid-recommended.md) enables this rule by
63
+ default.
@@ -0,0 +1,56 @@
1
+ # no-invalid-repeat-count
2
+
3
+ Disallow invalid fixed repeat counts in CSS Grid track templates.
4
+
5
+ The first argument to a fixed `repeat()` must be a positive integer. Counts such
6
+ as `0`, negative numbers, and decimals make the track template invalid. This
7
+ rule leaves `auto-fit`, `auto-fill`, and dynamic values to the rules that own
8
+ those cases.
9
+
10
+ ## Incorrect
11
+
12
+ ```css
13
+ .layout {
14
+ grid-template-columns: repeat(0, 1fr);
15
+ }
16
+ ```
17
+
18
+ ```css
19
+ .layout {
20
+ grid-template-rows: repeat(2.5, auto);
21
+ }
22
+ ```
23
+
24
+ ## Correct
25
+
26
+ ```css
27
+ .layout {
28
+ grid-template-columns: repeat(3, minmax(0, 1fr));
29
+ }
30
+ ```
31
+
32
+ ```css
33
+ .layout {
34
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
35
+ }
36
+ ```
37
+
38
+ ## Stylelint Config
39
+
40
+ ```js
41
+ export default {
42
+ plugins: ["stylelint-plugin-grid"],
43
+ rules: {
44
+ "grid/no-invalid-repeat-count": true
45
+ }
46
+ };
47
+ ```
48
+
49
+ ## Related Rules
50
+
51
+ - [`no-invalid-auto-repeat`](./no-invalid-auto-repeat.md) checks track sizes
52
+ inside `repeat(auto-fit, ...)` and `repeat(auto-fill, ...)`.
53
+ - [`validate-track-counts`](./validate-track-counts.md) compares expanded track
54
+ counts with named area templates.
55
+ - [`grid-recommended`](./configs/grid-recommended.md) enables this rule by
56
+ default.
@@ -0,0 +1,55 @@
1
+ # no-invalid-span
2
+
3
+ Disallow non-positive `span` counts in CSS Grid placement declarations.
4
+
5
+ Grid spans must move across at least one track. Values such as `span 0` and
6
+ `span -1` cannot place an item usefully and usually make the declaration
7
+ invalid or ignored.
8
+
9
+ ## Incorrect
10
+
11
+ ```css
12
+ .item {
13
+ grid-column: span 0 / span 2;
14
+ }
15
+ ```
16
+
17
+ ```css
18
+ .item {
19
+ grid-row-start: span -1;
20
+ }
21
+ ```
22
+
23
+ ## Correct
24
+
25
+ ```css
26
+ .item {
27
+ grid-column: span 2 / sidebar-end;
28
+ }
29
+ ```
30
+
31
+ ```css
32
+ .item {
33
+ grid-row-start: span var(--rows);
34
+ }
35
+ ```
36
+
37
+ ## Stylelint Config
38
+
39
+ ```js
40
+ export default {
41
+ plugins: ["stylelint-plugin-grid"],
42
+ rules: {
43
+ "grid/no-invalid-span": true
44
+ }
45
+ };
46
+ ```
47
+
48
+ ## Related Rules
49
+
50
+ - [`no-zero-grid-lines`](./no-zero-grid-lines.md) rejects line `0` in placement
51
+ values.
52
+ - [`no-reversed-placement-lines`](./no-reversed-placement-lines.md) checks
53
+ numeric placement ranges.
54
+ - [`grid-recommended`](./configs/grid-recommended.md) enables this rule by
55
+ default.
@@ -0,0 +1,56 @@
1
+ # no-reversed-placement-lines
2
+
3
+ Disallow reversed or zero-width numeric CSS Grid placement line ranges.
4
+
5
+ Numeric line ranges such as `grid-column: 4 / 2` and `grid-row: 3 / 3` do not
6
+ describe a forward span across tracks. This rule only compares plain numeric
7
+ line pairs in the same block and ignores named lines, spans, mixed signs, and
8
+ dynamic values.
9
+
10
+ ## Incorrect
11
+
12
+ ```css
13
+ .item {
14
+ grid-column: 4 / 2;
15
+ }
16
+ ```
17
+
18
+ ```css
19
+ .item {
20
+ grid-row-start: 7;
21
+ grid-row-end: 6;
22
+ }
23
+ ```
24
+
25
+ ## Correct
26
+
27
+ ```css
28
+ .item {
29
+ grid-column: 2 / 4;
30
+ }
31
+ ```
32
+
33
+ ```css
34
+ .item {
35
+ grid-row: span 2 / 5;
36
+ }
37
+ ```
38
+
39
+ ## Stylelint Config
40
+
41
+ ```js
42
+ export default {
43
+ plugins: ["stylelint-plugin-grid"],
44
+ rules: {
45
+ "grid/no-reversed-placement-lines": true
46
+ }
47
+ };
48
+ ```
49
+
50
+ ## Related Rules
51
+
52
+ - [`no-invalid-span`](./no-invalid-span.md) rejects non-positive span counts.
53
+ - [`no-zero-grid-lines`](./no-zero-grid-lines.md) rejects line `0` in placement
54
+ values.
55
+ - [`grid-recommended`](./configs/grid-recommended.md) enables this rule by
56
+ default.
@@ -0,0 +1,53 @@
1
+ # no-zero-grid-lines
2
+
3
+ Disallow line `0` in CSS Grid placement declarations.
4
+
5
+ CSS Grid line numbering starts at `1` from the start edge and `-1` from the end
6
+ edge. Line `0` does not exist, so placement values using `0` are invalid.
7
+
8
+ ## Incorrect
9
+
10
+ ```css
11
+ .item {
12
+ grid-column: 0 / 2;
13
+ }
14
+ ```
15
+
16
+ ```css
17
+ .item {
18
+ grid-row-end: 0;
19
+ }
20
+ ```
21
+
22
+ ## Correct
23
+
24
+ ```css
25
+ .item {
26
+ grid-column: 1 / -1;
27
+ }
28
+ ```
29
+
30
+ ```css
31
+ .item {
32
+ grid-row: var(--row-start) / var(--row-end);
33
+ }
34
+ ```
35
+
36
+ ## Stylelint Config
37
+
38
+ ```js
39
+ export default {
40
+ plugins: ["stylelint-plugin-grid"],
41
+ rules: {
42
+ "grid/no-zero-grid-lines": true
43
+ }
44
+ };
45
+ ```
46
+
47
+ ## Related Rules
48
+
49
+ - [`no-invalid-span`](./no-invalid-span.md) rejects non-positive span counts.
50
+ - [`no-reversed-placement-lines`](./no-reversed-placement-lines.md) checks
51
+ numeric placement ranges.
52
+ - [`grid-recommended`](./configs/grid-recommended.md) enables this rule by
53
+ default.
@@ -0,0 +1,49 @@
1
+ # prefer-minmax-zero-fr
2
+
3
+ Prefer `minmax(0, <flex>)` for bare flexible CSS Grid column tracks.
4
+
5
+ Bare `fr` column tracks use an automatic minimum size, so long content can
6
+ force columns wider than intended. Wrapping the flexible track in `minmax(0, …)`
7
+ keeps the column flexible while allowing content to shrink or overflow according
8
+ to the rest of the layout rules.
9
+
10
+ ## Incorrect
11
+
12
+ ```css
13
+ .layout {
14
+ grid-template-columns: 1fr 2fr;
15
+ }
16
+ ```
17
+
18
+ ## Correct
19
+
20
+ ```css
21
+ .layout {
22
+ grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
23
+ }
24
+ ```
25
+
26
+ ```css
27
+ .layout {
28
+ grid-template-columns: repeat(2, 1fr);
29
+ }
30
+ ```
31
+
32
+ ## Stylelint Config
33
+
34
+ ```js
35
+ export default {
36
+ plugins: ["stylelint-plugin-grid"],
37
+ rules: {
38
+ "grid/prefer-minmax-zero-fr": true
39
+ }
40
+ };
41
+ ```
42
+
43
+ ## Related Rules
44
+
45
+ - [`no-invalid-minmax`](./no-invalid-minmax.md) rejects flexible minimums inside
46
+ `minmax()`.
47
+ - [`no-invalid-auto-repeat`](./no-invalid-auto-repeat.md) checks auto-repeat
48
+ track sizes.
49
+ - [`grid-all`](./configs/grid-all.md) enables this optional rule.