stylelint-plugin-grid 1.0.0 → 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
package/dist/plugin.cjs CHANGED
@@ -40,7 +40,7 @@ __export(plugin_exports, {
40
40
  rules: () => rules
41
41
  });
42
42
  module.exports = __toCommonJS(plugin_exports);
43
- var import_ts_extras14 = require("ts-extras");
43
+ var import_ts_extras22 = require("ts-extras");
44
44
 
45
45
  // dist/_internal/plugin-constants.js
46
46
  var import_package = __toESM(require("stylelint-plugin-grid/package.json"), 1);
@@ -60,11 +60,11 @@ function isUnknownRecord(pkg) {
60
60
  return typeof pkg === "object" && pkg !== null && !Array.isArray(pkg);
61
61
  }
62
62
  var PACKAGE_VERSION = getPackageVersion(import_package.default);
63
- function createRuleDocsUrl(ruleName14) {
64
- return `${DOCS_RULES_BASE_URL}/${ruleName14}`;
63
+ function createRuleDocsUrl(ruleName22) {
64
+ return `${DOCS_RULES_BASE_URL}/${ruleName22}`;
65
65
  }
66
- function createRuleName(ruleName14) {
67
- return `${PLUGIN_NAMESPACE}/${ruleName14}`;
66
+ function createRuleName(ruleName22) {
67
+ return `${PLUGIN_NAMESPACE}/${ruleName22}`;
68
68
  }
69
69
 
70
70
  // dist/rules/consistent-area-naming.js
@@ -74,31 +74,31 @@ var import_ts_extras3 = require("ts-extras");
74
74
  // dist/_internal/create-stylelint-rule.js
75
75
  var import_stylelint = __toESM(require("stylelint"), 1);
76
76
  var createStylelintRule = (options) => {
77
- const { docs: docs14, messages: messages14, rule: rule14, ruleName: ruleName14 } = options;
77
+ const { docs: docs22, messages: messages22, rule: rule22, ruleName: ruleName22 } = options;
78
78
  const baseMeta = {
79
79
  ...options.meta,
80
- url: options.meta?.url ?? docs14.url
80
+ url: options.meta?.url ?? docs22.url
81
81
  };
82
82
  const meta2 = {
83
83
  ...baseMeta,
84
- docs: docs14
84
+ docs: docs22
85
85
  };
86
- const typedRule = Object.assign(rule14, {
87
- messages: messages14,
86
+ const typedRule = Object.assign(rule22, {
87
+ messages: messages22,
88
88
  meta: meta2,
89
- ruleName: ruleName14
89
+ ruleName: ruleName22
90
90
  });
91
91
  if (options.primaryOptionArray === true) {
92
92
  typedRule.primaryOptionArray = true;
93
93
  }
94
- const plugin = import_stylelint.default.createPlugin(ruleName14, typedRule);
94
+ const plugin = import_stylelint.default.createPlugin(ruleName22, typedRule);
95
95
  return {
96
96
  ...plugin,
97
- docs: docs14,
98
- messages: messages14,
97
+ docs: docs22,
98
+ messages: messages22,
99
99
  meta: meta2,
100
100
  rule: typedRule,
101
- ruleName: ruleName14
101
+ ruleName: ruleName22
102
102
  };
103
103
  };
104
104
 
@@ -291,6 +291,9 @@ function parseGridTemplateAreas(declaration) {
291
291
  function splitTopLevelCommas(value) {
292
292
  return splitTopLevel(value, /,/v);
293
293
  }
294
+ function splitTopLevelSlashes(value) {
295
+ return splitTopLevel(value, /\//v);
296
+ }
294
297
  function splitTopLevelWhitespace(value) {
295
298
  return splitTopLevel(value, /\s/v);
296
299
  }
@@ -495,20 +498,137 @@ var rule = createStylelintRule({
495
498
  });
496
499
  var consistent_area_naming_default = rule;
497
500
 
498
- // dist/rules/no-dense-auto-flow.js
501
+ // dist/rules/no-conflicting-placement.js
499
502
  var import_stylelint3 = __toESM(require("stylelint"), 1);
503
+ var import_ts_extras5 = require("ts-extras");
504
+
505
+ // dist/_internal/grid-placement-analysis.js
506
+ var import_ts_extras4 = require("ts-extras");
507
+ var gridPlacementProperties = /* @__PURE__ */ new Set([
508
+ "grid-area",
509
+ "grid-column",
510
+ "grid-column-end",
511
+ "grid-column-start",
512
+ "grid-row",
513
+ "grid-row-end",
514
+ "grid-row-start"
515
+ ]);
516
+ var strictIntegerPattern = /^[+\-]?\d+$/v;
517
+ function getDirectDeclarations(rule22) {
518
+ return rule22.nodes.filter((node) => node.type === "decl");
519
+ }
520
+ function getGridLineIntegerTokens(value) {
521
+ const integers = [];
522
+ for (const token of splitTopLevelWhitespace(value)) {
523
+ const integer = parseStrictInteger(token);
524
+ if ((0, import_ts_extras4.isDefined)(integer)) {
525
+ integers.push(integer);
526
+ }
527
+ }
528
+ return integers;
529
+ }
530
+ function getGridLineSpanCounts(value) {
531
+ const tokens = splitTopLevelWhitespace(value);
532
+ const hasSpan = tokens.some((token) => token.toLowerCase() === "span");
533
+ if (!hasSpan) {
534
+ return [];
535
+ }
536
+ return tokens.map((token) => parseStrictInteger(token)).filter(import_ts_extras4.isDefined);
537
+ }
538
+ function getGridPlacementSlots(value) {
539
+ return splitTopLevelSlashes(value);
540
+ }
541
+ function isGridPlacementDeclaration(declaration) {
542
+ return (0, import_ts_extras4.setHas)(gridPlacementProperties, declaration.prop.toLowerCase());
543
+ }
544
+ function parseStandaloneGridLineInteger(value) {
545
+ const tokens = splitTopLevelWhitespace(value);
546
+ return tokens.length === 1 ? parseStrictInteger((0, import_ts_extras4.arrayFirst)(tokens) ?? "") : void 0;
547
+ }
548
+ function parseStrictInteger(value) {
549
+ if (!strictIntegerPattern.test(value)) {
550
+ return void 0;
551
+ }
552
+ return Number.parseInt(value, 10);
553
+ }
554
+
555
+ // dist/rules/no-conflicting-placement.js
500
556
  var { report: report2, ruleMessages: ruleMessages2, validateOptions: validateOptions2 } = import_stylelint3.default.utils;
501
- var ruleName2 = createRuleName("no-dense-auto-flow");
557
+ var ruleName2 = createRuleName("no-conflicting-placement");
502
558
  var messages2 = ruleMessages2(ruleName2, {
503
- rejected: () => "Avoid `grid-auto-flow: dense`; dense packing can disconnect visual order from source order."
559
+ rejected: (propertyName, previousPropertyName) => `Avoid conflicting Grid placement declarations; \`${propertyName}\` writes the same placement slot as earlier \`${previousPropertyName}\` in this block.`
504
560
  });
505
561
  var docs2 = {
562
+ description: "Disallow same-block CSS Grid placement declarations that write the same placement slot.",
563
+ recommended: true,
564
+ url: createRuleDocsUrl("no-conflicting-placement")
565
+ };
566
+ var propertySlots = {
567
+ "grid-area": [
568
+ "row-start",
569
+ "column-start",
570
+ "row-end",
571
+ "column-end"
572
+ ],
573
+ "grid-column": ["column-start", "column-end"],
574
+ "grid-column-end": ["column-end"],
575
+ "grid-column-start": ["column-start"],
576
+ "grid-row": ["row-start", "row-end"],
577
+ "grid-row-end": ["row-end"],
578
+ "grid-row-start": ["row-start"]
579
+ };
580
+ var ruleFunction2 = (primary) => (root, result) => {
581
+ if (!validateOptions2(result, ruleName2, {
582
+ actual: primary,
583
+ possible: [true]
584
+ })) {
585
+ return;
586
+ }
587
+ root.walkRules((ruleNode) => {
588
+ const slotDeclarations = /* @__PURE__ */ new Map();
589
+ for (const declaration of getDirectDeclarations(ruleNode)) {
590
+ if (isGridPlacementDeclaration(declaration)) {
591
+ const propertyName = declaration.prop.toLowerCase();
592
+ const slots = propertySlots[propertyName] ?? [];
593
+ const previousDeclaration = slots.map((slot) => slotDeclarations.get(slot)).find(import_ts_extras5.isDefined);
594
+ if ((0, import_ts_extras5.isDefined)(previousDeclaration)) {
595
+ report2({
596
+ message: messages2.rejected(propertyName, previousDeclaration.prop),
597
+ node: declaration,
598
+ result,
599
+ ruleName: ruleName2,
600
+ word: declaration.prop
601
+ });
602
+ }
603
+ for (const slot of slots) {
604
+ slotDeclarations.set(slot, declaration);
605
+ }
606
+ }
607
+ }
608
+ });
609
+ };
610
+ var rule2 = createStylelintRule({
611
+ docs: docs2,
612
+ messages: messages2,
613
+ rule: ruleFunction2,
614
+ ruleName: ruleName2
615
+ });
616
+ var no_conflicting_placement_default = rule2;
617
+
618
+ // dist/rules/no-dense-auto-flow.js
619
+ var import_stylelint4 = __toESM(require("stylelint"), 1);
620
+ var { report: report3, ruleMessages: ruleMessages3, validateOptions: validateOptions3 } = import_stylelint4.default.utils;
621
+ var ruleName3 = createRuleName("no-dense-auto-flow");
622
+ var messages3 = ruleMessages3(ruleName3, {
623
+ rejected: () => "Avoid `grid-auto-flow: dense`; dense packing can disconnect visual order from source order."
624
+ });
625
+ var docs3 = {
506
626
  description: "Disallow `grid-auto-flow: dense` because it can reorder auto-placed grid items visually.",
507
627
  recommended: false,
508
628
  url: createRuleDocsUrl("no-dense-auto-flow")
509
629
  };
510
- var ruleFunction2 = (primary) => (root, result) => {
511
- if (!validateOptions2(result, ruleName2, {
630
+ var ruleFunction3 = (primary) => (root, result) => {
631
+ if (!validateOptions3(result, ruleName3, {
512
632
  actual: primary,
513
633
  possible: [true]
514
634
  })) {
@@ -519,37 +639,122 @@ var ruleFunction2 = (primary) => (root, result) => {
519
639
  if (!hasDensePacking) {
520
640
  return;
521
641
  }
522
- report2({
523
- message: messages2.rejected(),
642
+ report3({
643
+ message: messages3.rejected(),
524
644
  node: declaration,
525
645
  result,
526
- ruleName: ruleName2,
646
+ ruleName: ruleName3,
527
647
  word: "dense"
528
648
  });
529
649
  });
530
650
  };
531
- var rule2 = createStylelintRule({
532
- docs: docs2,
533
- messages: messages2,
534
- rule: ruleFunction2,
535
- ruleName: ruleName2
651
+ var rule3 = createStylelintRule({
652
+ docs: docs3,
653
+ messages: messages3,
654
+ rule: ruleFunction3,
655
+ ruleName: ruleName3
656
+ });
657
+ var no_dense_auto_flow_default = rule3;
658
+
659
+ // dist/rules/no-ineffective-container-properties.js
660
+ var import_stylelint5 = __toESM(require("stylelint"), 1);
661
+ var import_ts_extras6 = require("ts-extras");
662
+ var { report: report4, ruleMessages: ruleMessages4, validateOptions: validateOptions4 } = import_stylelint5.default.utils;
663
+ var ruleName4 = createRuleName("no-ineffective-container-properties");
664
+ var messages4 = ruleMessages4(ruleName4, {
665
+ rejected: (propertyName, display) => `\`${propertyName}\` has no grid-container effect when the final same-block \`display\` value is \`${display}\`; use \`grid\` or \`inline-grid\`, or remove the grid container declaration.`
666
+ });
667
+ var docs4 = {
668
+ description: "Disallow CSS Grid container declarations in blocks whose final literal display value is not grid-capable.",
669
+ recommended: true,
670
+ url: createRuleDocsUrl("no-ineffective-container-properties")
671
+ };
672
+ var gridContainerProperties = /* @__PURE__ */ new Set([
673
+ "grid",
674
+ "grid-auto-columns",
675
+ "grid-auto-flow",
676
+ "grid-auto-rows",
677
+ "grid-template",
678
+ "grid-template-areas",
679
+ "grid-template-columns",
680
+ "grid-template-rows"
681
+ ]);
682
+ var gridDisplayValues = /* @__PURE__ */ new Set(["grid", "inline-grid"]);
683
+ var nonGridDisplayValues = /* @__PURE__ */ new Set([
684
+ "block",
685
+ "contents",
686
+ "flex",
687
+ "flow-root",
688
+ "inline",
689
+ "inline-block",
690
+ "inline-flex",
691
+ "inline-table",
692
+ "list-item",
693
+ "none",
694
+ "table"
695
+ ]);
696
+ function getLastLiteralDisplay(declarations) {
697
+ return declarations.findLast((declaration) => declaration.prop.toLowerCase() === "display" && (0, import_ts_extras6.isDefined)(getLiteralDisplayValue(declaration.value)));
698
+ }
699
+ function getLiteralDisplayValue(value) {
700
+ const normalizedValue = value.trim().toLowerCase();
701
+ if (normalizedValue.includes("(") || normalizedValue.includes(")")) {
702
+ return void 0;
703
+ }
704
+ return normalizedValue;
705
+ }
706
+ var ruleFunction4 = (primary) => (root, result) => {
707
+ if (!validateOptions4(result, ruleName4, {
708
+ actual: primary,
709
+ possible: [true]
710
+ })) {
711
+ return;
712
+ }
713
+ root.walkRules((ruleNode) => {
714
+ const declarations = getDirectDeclarations(ruleNode);
715
+ const displayDeclaration = getLastLiteralDisplay(declarations);
716
+ const displayValue = (0, import_ts_extras6.isDefined)(displayDeclaration) ? getLiteralDisplayValue(displayDeclaration.value) : void 0;
717
+ const isGridCapableDisplay = (0, import_ts_extras6.isDefined)(displayValue) ? (0, import_ts_extras6.setHas)(gridDisplayValues, displayValue) : false;
718
+ const isKnownNonGridDisplay = (0, import_ts_extras6.isDefined)(displayValue) ? (0, import_ts_extras6.setHas)(nonGridDisplayValues, displayValue) : false;
719
+ if (!(0, import_ts_extras6.isDefined)(displayValue) || isGridCapableDisplay || !isKnownNonGridDisplay) {
720
+ return;
721
+ }
722
+ for (const declaration of declarations) {
723
+ const propertyName = declaration.prop.toLowerCase();
724
+ if ((0, import_ts_extras6.setHas)(gridContainerProperties, propertyName)) {
725
+ report4({
726
+ message: messages4.rejected(propertyName, displayValue),
727
+ node: declaration,
728
+ result,
729
+ ruleName: ruleName4,
730
+ word: declaration.prop
731
+ });
732
+ }
733
+ }
734
+ });
735
+ };
736
+ var rule4 = createStylelintRule({
737
+ docs: docs4,
738
+ messages: messages4,
739
+ rule: ruleFunction4,
740
+ ruleName: ruleName4
536
741
  });
537
- var no_dense_auto_flow_default = rule2;
742
+ var no_ineffective_container_properties_default = rule4;
538
743
 
539
744
  // 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, {
745
+ var import_stylelint6 = __toESM(require("stylelint"), 1);
746
+ var { report: report5, ruleMessages: ruleMessages5, validateOptions: validateOptions5 } = import_stylelint6.default.utils;
747
+ var ruleName5 = createRuleName("no-invalid-areas");
748
+ var messages5 = ruleMessages5(ruleName5, {
544
749
  rejected: (message) => message
545
750
  });
546
- var docs3 = {
751
+ var docs5 = {
547
752
  description: "Disallow malformed `grid-template-areas` declarations.",
548
753
  recommended: true,
549
754
  url: createRuleDocsUrl("no-invalid-areas")
550
755
  };
551
- var ruleFunction3 = (primary) => (root, result) => {
552
- if (!validateOptions3(result, ruleName3, {
756
+ var ruleFunction5 = (primary) => (root, result) => {
757
+ if (!validateOptions5(result, ruleName5, {
553
758
  actual: primary,
554
759
  possible: [true]
555
760
  })) {
@@ -557,33 +762,33 @@ var ruleFunction3 = (primary) => (root, result) => {
557
762
  }
558
763
  for (const template of collectGridTemplateAreas(root)) {
559
764
  for (const diagnostic of template.diagnostics) {
560
- report3({
561
- message: messages3.rejected(diagnostic.message),
765
+ report5({
766
+ message: messages5.rejected(diagnostic.message),
562
767
  node: template.declaration,
563
768
  result,
564
- ruleName: ruleName3,
769
+ ruleName: ruleName5,
565
770
  word: diagnostic.token
566
771
  });
567
772
  }
568
773
  }
569
774
  };
570
- var rule3 = createStylelintRule({
571
- docs: docs3,
572
- messages: messages3,
573
- rule: ruleFunction3,
574
- ruleName: ruleName3
775
+ var rule5 = createStylelintRule({
776
+ docs: docs5,
777
+ messages: messages5,
778
+ rule: ruleFunction5,
779
+ ruleName: ruleName5
575
780
  });
576
- var no_invalid_areas_default = rule3;
781
+ var no_invalid_areas_default = rule5;
577
782
 
578
783
  // 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, {
784
+ var import_stylelint7 = __toESM(require("stylelint"), 1);
785
+ var import_ts_extras7 = require("ts-extras");
786
+ var { report: report6, ruleMessages: ruleMessages6, validateOptions: validateOptions6 } = import_stylelint7.default.utils;
787
+ var ruleName6 = createRuleName("no-invalid-auto-repeat");
788
+ var messages6 = ruleMessages6(ruleName6, {
584
789
  rejected: (token, repeatKeyword) => `Use a fixed track size inside \`repeat(${repeatKeyword}, ...)\`; \`${token}\` can make the grid template declaration invalid.`
585
790
  });
586
- var docs4 = {
791
+ var docs6 = {
587
792
  description: "Disallow definitely invalid CSS Grid auto-repeat track sizes.",
588
793
  recommended: true,
589
794
  url: createRuleDocsUrl("no-invalid-auto-repeat")
@@ -651,7 +856,7 @@ function getInvalidAutoRepeatTrack(trackList) {
651
856
  for (const token of splitTopLevelWhitespace(trackList)) {
652
857
  const normalizedToken = token.toLowerCase();
653
858
  if (!isLineNameList2(token) && !containsRuntimeValue(token)) {
654
- if ((0, import_ts_extras4.setHas)(invalidBareAutoRepeatTrackTokens, normalizedToken) || isFlexTrackBreadth(normalizedToken)) {
859
+ if ((0, import_ts_extras7.setHas)(invalidBareAutoRepeatTrackTokens, normalizedToken) || isFlexTrackBreadth(normalizedToken)) {
655
860
  return token;
656
861
  }
657
862
  if (hasStringPrefix(normalizedToken, "minmax(") && isInvalidAutoRepeatMinmax(token)) {
@@ -662,18 +867,18 @@ function getInvalidAutoRepeatTrack(trackList) {
662
867
  return void 0;
663
868
  }
664
869
  function getMinmaxArguments(token) {
665
- const minmaxCall = (0, import_ts_extras4.arrayFirst)(findValueFunctionCalls(token, "minmax"));
666
- if (!(0, import_ts_extras4.isDefined)(minmaxCall)) {
870
+ const minmaxCall = (0, import_ts_extras7.arrayFirst)(findValueFunctionCalls(token, "minmax"));
871
+ if (!(0, import_ts_extras7.isDefined)(minmaxCall)) {
667
872
  return void 0;
668
873
  }
669
874
  const [minimum, maximum] = splitTopLevelCommas(minmaxCall.body).map((argument) => argument.trim());
670
- if (!(0, import_ts_extras4.isDefined)(minimum) || !(0, import_ts_extras4.isDefined)(maximum)) {
875
+ if (!(0, import_ts_extras7.isDefined)(minimum) || !(0, import_ts_extras7.isDefined)(maximum)) {
671
876
  return void 0;
672
877
  }
673
878
  return [minimum, maximum];
674
879
  }
675
880
  function getRepeatKeyword(repeatBody) {
676
- const repeatCount = (0, import_ts_extras4.arrayFirst)(splitTopLevelCommas(repeatBody))?.trim().toLowerCase();
881
+ const repeatCount = (0, import_ts_extras7.arrayFirst)(splitTopLevelCommas(repeatBody))?.trim().toLowerCase();
677
882
  if (repeatCount === "auto-fill" || repeatCount === "auto-fit") {
678
883
  return repeatCount;
679
884
  }
@@ -692,18 +897,18 @@ function isFixedTrackBreadth(value) {
692
897
  }
693
898
  const match = lengthPercentagePattern.exec(normalizedValue);
694
899
  const unit = match?.groups?.["unit"];
695
- return unit === "%" || (0, import_ts_extras4.isDefined)(unit) && (0, import_ts_extras4.setHas)(cssLengthUnits, unit);
900
+ return unit === "%" || (0, import_ts_extras7.isDefined)(unit) && (0, import_ts_extras7.setHas)(cssLengthUnits, unit);
696
901
  }
697
902
  function isFlexTrackBreadth(value) {
698
903
  return /^[+\-]?(?:\d+|\d*\.\d+)fr$/v.test(value);
699
904
  }
700
905
  function isIntrinsicTrackBreadth(value) {
701
906
  const normalizedValue = value.toLowerCase();
702
- return (0, import_ts_extras4.setHas)(invalidBareAutoRepeatTrackTokens, normalizedValue);
907
+ return (0, import_ts_extras7.setHas)(invalidBareAutoRepeatTrackTokens, normalizedValue);
703
908
  }
704
909
  function isInvalidAutoRepeatMinmax(token) {
705
910
  const args = getMinmaxArguments(token);
706
- if (!(0, import_ts_extras4.isDefined)(args)) {
911
+ if (!(0, import_ts_extras7.isDefined)(args)) {
707
912
  return false;
708
913
  }
709
914
  const [minimum, maximum] = args;
@@ -712,28 +917,28 @@ function isInvalidAutoRepeatMinmax(token) {
712
917
  function isLineNameList2(token) {
713
918
  return token.startsWith("[") && token.endsWith("]");
714
919
  }
715
- var ruleFunction4 = (primary) => (root, result) => {
716
- if (!validateOptions4(result, ruleName4, {
920
+ var ruleFunction6 = (primary) => (root, result) => {
921
+ if (!validateOptions6(result, ruleName6, {
717
922
  actual: primary,
718
923
  possible: [true]
719
924
  })) {
720
925
  return;
721
926
  }
722
927
  root.walkDecls((declaration) => {
723
- if (!(0, import_ts_extras4.setHas)(trackTemplateProperties, declaration.prop.toLowerCase())) {
928
+ if (!(0, import_ts_extras7.setHas)(trackTemplateProperties, declaration.prop.toLowerCase())) {
724
929
  return;
725
930
  }
726
931
  for (const repeatCall of findValueFunctionCalls(declaration.value, "repeat")) {
727
932
  const repeatKeyword = getRepeatKeyword(repeatCall.body);
728
- if ((0, import_ts_extras4.isDefined)(repeatKeyword)) {
933
+ if ((0, import_ts_extras7.isDefined)(repeatKeyword)) {
729
934
  const trackList = splitTopLevelCommas(repeatCall.body).slice(1).join(",");
730
935
  const invalidTrack = getInvalidAutoRepeatTrack(trackList);
731
- if ((0, import_ts_extras4.isDefined)(invalidTrack)) {
732
- report4({
733
- message: messages4.rejected(invalidTrack, repeatKeyword),
936
+ if ((0, import_ts_extras7.isDefined)(invalidTrack)) {
937
+ report6({
938
+ message: messages6.rejected(invalidTrack, repeatKeyword),
734
939
  node: declaration,
735
940
  result,
736
- ruleName: ruleName4,
941
+ ruleName: ruleName6,
737
942
  word: invalidTrack
738
943
  });
739
944
  }
@@ -741,23 +946,23 @@ var ruleFunction4 = (primary) => (root, result) => {
741
946
  }
742
947
  });
743
948
  };
744
- var rule4 = createStylelintRule({
745
- docs: docs4,
746
- messages: messages4,
747
- rule: ruleFunction4,
748
- ruleName: ruleName4
949
+ var rule6 = createStylelintRule({
950
+ docs: docs6,
951
+ messages: messages6,
952
+ rule: ruleFunction6,
953
+ ruleName: ruleName6
749
954
  });
750
- var no_invalid_auto_repeat_default = rule4;
955
+ var no_invalid_auto_repeat_default = rule6;
751
956
 
752
957
  // 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, {
958
+ var import_stylelint8 = __toESM(require("stylelint"), 1);
959
+ var import_ts_extras8 = require("ts-extras");
960
+ var { report: report7, ruleMessages: ruleMessages7, validateOptions: validateOptions7 } = import_stylelint8.default.utils;
961
+ var ruleName7 = createRuleName("no-invalid-minmax");
962
+ var messages7 = ruleMessages7(ruleName7, {
758
963
  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
964
  });
760
- var docs5 = {
965
+ var docs7 = {
761
966
  description: "Disallow flexible `fr` values as the minimum argument in CSS Grid `minmax()` track sizes.",
762
967
  recommended: true,
763
968
  url: createRuleDocsUrl("no-invalid-minmax")
@@ -771,185 +976,423 @@ var gridTrackProperties = /* @__PURE__ */ new Set([
771
976
  function isFlexTrackBreadth2(value) {
772
977
  return /^[+\-]?(?:\d+|\d*\.\d+)fr$/v.test(value.toLowerCase());
773
978
  }
774
- var ruleFunction5 = (primary) => (root, result) => {
775
- if (!validateOptions5(result, ruleName5, {
979
+ var ruleFunction7 = (primary) => (root, result) => {
980
+ if (!validateOptions7(result, ruleName7, {
776
981
  actual: primary,
777
982
  possible: [true]
778
983
  })) {
779
984
  return;
780
985
  }
781
986
  root.walkDecls((declaration) => {
782
- if (!(0, import_ts_extras5.setHas)(gridTrackProperties, declaration.prop.toLowerCase())) {
987
+ if (!(0, import_ts_extras8.setHas)(gridTrackProperties, declaration.prop.toLowerCase())) {
783
988
  return;
784
989
  }
785
990
  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),
991
+ const minimum = (0, import_ts_extras8.arrayFirst)(splitTopLevelCommas(minmaxCall.body))?.trim();
992
+ if ((0, import_ts_extras8.isDefined)(minimum) && isFlexTrackBreadth2(minimum)) {
993
+ report7({
994
+ message: messages7.rejected(minimum),
790
995
  node: declaration,
791
996
  result,
792
- ruleName: ruleName5,
997
+ ruleName: ruleName7,
793
998
  word: minimum
794
999
  });
795
1000
  }
796
1001
  }
797
1002
  });
798
1003
  };
799
- var rule5 = createStylelintRule({
800
- docs: docs5,
801
- messages: messages5,
802
- rule: ruleFunction5,
803
- ruleName: ruleName5
1004
+ var rule7 = createStylelintRule({
1005
+ docs: docs7,
1006
+ messages: messages7,
1007
+ rule: ruleFunction7,
1008
+ ruleName: ruleName7
804
1009
  });
805
- var no_invalid_minmax_default = rule5;
1010
+ var no_invalid_minmax_default = rule7;
806
1011
 
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.`
1012
+ // dist/rules/no-invalid-repeat-count.js
1013
+ var import_stylelint9 = __toESM(require("stylelint"), 1);
1014
+ var import_ts_extras9 = require("ts-extras");
1015
+ var { report: report8, ruleMessages: ruleMessages8, validateOptions: validateOptions8 } = import_stylelint9.default.utils;
1016
+ var ruleName8 = createRuleName("no-invalid-repeat-count");
1017
+ var messages8 = ruleMessages8(ruleName8, {
1018
+ rejected: (count) => `Use a positive integer repeat count; \`${count}\` is not a valid fixed \`repeat()\` count.`
814
1019
  });
815
- var docs6 = {
816
- description: "Require `grid-template-rows` track count to match `grid-template-areas` row count.",
1020
+ var docs8 = {
1021
+ description: "Disallow invalid fixed repeat counts in CSS Grid track templates.",
817
1022
  recommended: true,
818
- url: createRuleDocsUrl("no-mismatched-template-rows")
1023
+ url: createRuleDocsUrl("no-invalid-repeat-count")
819
1024
  };
820
- var ruleFunction6 = (primary) => (root, result) => {
821
- if (!validateOptions6(result, ruleName6, {
1025
+ var trackTemplateProperties2 = /* @__PURE__ */ new Set([
1026
+ "grid-template-columns",
1027
+ "grid-template-rows"
1028
+ ]);
1029
+ var nonFixedRepeatCounts = /* @__PURE__ */ new Set([
1030
+ "auto-fill",
1031
+ "auto-fit"
1032
+ ]);
1033
+ var integerPattern = /^\+?\d+$/v;
1034
+ var numericPattern = /^[+\-]?(?:\d+|\d*\.\d+)$/v;
1035
+ function getInvalidRepeatCount(repeatBody) {
1036
+ const count = (0, import_ts_extras9.arrayFirst)(splitTopLevelCommas(repeatBody))?.trim();
1037
+ if (!(0, import_ts_extras9.isDefined)(count)) {
1038
+ return void 0;
1039
+ }
1040
+ const normalizedCount = count.toLowerCase();
1041
+ if ((0, import_ts_extras9.setHas)(nonFixedRepeatCounts, normalizedCount)) {
1042
+ return void 0;
1043
+ }
1044
+ return numericPattern.test(count) && !isPositiveIntegerToken(count) ? count : void 0;
1045
+ }
1046
+ function isPositiveIntegerToken(value) {
1047
+ return integerPattern.test(value) && Number.parseInt(value, 10) > 0;
1048
+ }
1049
+ var ruleFunction8 = (primary) => (root, result) => {
1050
+ if (!validateOptions8(result, ruleName8, {
822
1051
  actual: primary,
823
1052
  possible: [true]
824
1053
  })) {
825
1054
  return;
826
1055
  }
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,
1056
+ root.walkDecls((declaration) => {
1057
+ if (!(0, import_ts_extras9.setHas)(trackTemplateProperties2, declaration.prop.toLowerCase())) {
1058
+ return;
1059
+ }
1060
+ for (const repeatCall of findValueFunctionCalls(declaration.value, "repeat")) {
1061
+ const invalidCount = getInvalidRepeatCount(repeatCall.body);
1062
+ if ((0, import_ts_extras9.isDefined)(invalidCount)) {
1063
+ report8({
1064
+ message: messages8.rejected(invalidCount),
1065
+ node: declaration,
835
1066
  result,
836
- ruleName: ruleName6
1067
+ ruleName: ruleName8,
1068
+ word: invalidCount
837
1069
  });
838
1070
  }
839
1071
  }
840
- }
1072
+ });
841
1073
  };
842
- var rule6 = createStylelintRule({
843
- docs: docs6,
844
- messages: messages6,
845
- rule: ruleFunction6,
846
- ruleName: ruleName6
1074
+ var rule8 = createStylelintRule({
1075
+ docs: docs8,
1076
+ messages: messages8,
1077
+ rule: ruleFunction8,
1078
+ ruleName: ruleName8
847
1079
  });
848
- var no_mismatched_template_rows_default = rule6;
1080
+ var no_invalid_repeat_count_default = rule8;
849
1081
 
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.`
1082
+ // dist/rules/no-invalid-span.js
1083
+ var import_stylelint10 = __toESM(require("stylelint"), 1);
1084
+ var { report: report9, ruleMessages: ruleMessages9, validateOptions: validateOptions9 } = import_stylelint10.default.utils;
1085
+ var ruleName9 = createRuleName("no-invalid-span");
1086
+ var messages9 = ruleMessages9(ruleName9, {
1087
+ rejected: (span) => `Use a positive Grid span count; \`span ${String(span)}\` cannot place a grid item.`
857
1088
  });
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")
1089
+ var docs9 = {
1090
+ description: "Disallow non-positive `span` counts in CSS Grid placement declarations.",
1091
+ recommended: true,
1092
+ url: createRuleDocsUrl("no-invalid-span")
862
1093
  };
863
- var ruleFunction7 = (primary) => (root, result) => {
864
- if (!validateOptions7(result, ruleName7, {
1094
+ var ruleFunction9 = (primary) => (root, result) => {
1095
+ if (!validateOptions9(result, ruleName9, {
865
1096
  actual: primary,
866
1097
  possible: [true]
867
1098
  })) {
868
1099
  return;
869
1100
  }
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);
1101
+ root.walkDecls((declaration) => {
1102
+ if (!isGridPlacementDeclaration(declaration)) {
1103
+ return;
1104
+ }
1105
+ for (const slot of getGridPlacementSlots(declaration.value)) {
1106
+ for (const span of getGridLineSpanCounts(slot)) {
1107
+ if (span <= 0) {
1108
+ report9({
1109
+ message: messages9.rejected(span),
1110
+ node: declaration,
1111
+ result,
1112
+ ruleName: ruleName9,
1113
+ word: String(span)
1114
+ });
1115
+ }
1116
+ }
1117
+ }
1118
+ });
1119
+ };
1120
+ var rule9 = createStylelintRule({
1121
+ docs: docs9,
1122
+ messages: messages9,
1123
+ rule: ruleFunction9,
1124
+ ruleName: ruleName9
1125
+ });
1126
+ var no_invalid_span_default = rule9;
1127
+
1128
+ // dist/rules/no-mismatched-template-rows.js
1129
+ var import_stylelint11 = __toESM(require("stylelint"), 1);
1130
+ var import_ts_extras10 = require("ts-extras");
1131
+ var { report: report10, ruleMessages: ruleMessages10, validateOptions: validateOptions10 } = import_stylelint11.default.utils;
1132
+ var ruleName10 = createRuleName("no-mismatched-template-rows");
1133
+ var messages10 = ruleMessages10(ruleName10, {
1134
+ rejected: (areaRows, trackRows) => `\`grid-template-areas\` defines ${String(areaRows)} rows, but sibling \`grid-template-rows\` defines ${String(trackRows)} tracks.`
1135
+ });
1136
+ var docs10 = {
1137
+ description: "Require `grid-template-rows` track count to match `grid-template-areas` row count.",
1138
+ recommended: true,
1139
+ url: createRuleDocsUrl("no-mismatched-template-rows")
1140
+ };
1141
+ var ruleFunction10 = (primary) => (root, result) => {
1142
+ if (!validateOptions10(result, ruleName10, {
1143
+ actual: primary,
1144
+ possible: [true]
1145
+ })) {
1146
+ return;
1147
+ }
1148
+ for (const template of collectGridTemplateAreas(root)) {
1149
+ if ((0, import_ts_extras10.isEmpty)(template.diagnostics)) {
1150
+ const rowsDeclaration = findSiblingDeclaration(template.declaration, "grid-template-rows");
1151
+ const trackRows = (0, import_ts_extras10.isDefined)(rowsDeclaration) ? countGridTracks(rowsDeclaration.value) : void 0;
1152
+ if ((0, import_ts_extras10.isDefined)(rowsDeclaration) && (0, import_ts_extras10.isDefined)(trackRows) && trackRows !== template.rows.length) {
1153
+ report10({
1154
+ message: messages10.rejected(template.rows.length, trackRows),
1155
+ node: rowsDeclaration,
1156
+ result,
1157
+ ruleName: ruleName10
1158
+ });
1159
+ }
883
1160
  }
884
1161
  }
885
1162
  };
886
- var rule7 = createStylelintRule({
887
- docs: docs7,
888
- messages: messages7,
889
- rule: ruleFunction7,
890
- ruleName: ruleName7
1163
+ var rule10 = createStylelintRule({
1164
+ docs: docs10,
1165
+ messages: messages10,
1166
+ rule: ruleFunction10,
1167
+ ruleName: ruleName10
1168
+ });
1169
+ var no_mismatched_template_rows_default = rule10;
1170
+
1171
+ // dist/rules/no-overlapping-areas.js
1172
+ var import_stylelint12 = __toESM(require("stylelint"), 1);
1173
+ var import_ts_extras11 = require("ts-extras");
1174
+ var { report: report11, ruleMessages: ruleMessages11, validateOptions: validateOptions11 } = import_stylelint12.default.utils;
1175
+ var ruleName11 = createRuleName("no-overlapping-areas");
1176
+ var messages11 = ruleMessages11(ruleName11, {
1177
+ rejected: (areaName, firstSelector) => `Grid area "${areaName}" is assigned by more than one selector; it may overlap the earlier "${firstSelector}" item at runtime.`
1178
+ });
1179
+ var docs11 = {
1180
+ description: "Disallow multiple selectors assigning the same single-name `grid-area` value in one stylesheet.",
1181
+ recommended: false,
1182
+ url: createRuleDocsUrl("no-overlapping-areas")
1183
+ };
1184
+ var ruleFunction11 = (primary) => (root, result) => {
1185
+ if (!validateOptions11(result, ruleName11, {
1186
+ actual: primary,
1187
+ possible: [true]
1188
+ })) {
1189
+ return;
1190
+ }
1191
+ const firstUsageByName = /* @__PURE__ */ new Map();
1192
+ for (const usage of collectGridAreaUsages(root)) {
1193
+ const firstUsage = firstUsageByName.get(usage.name);
1194
+ if ((0, import_ts_extras11.isDefined)(firstUsage)) {
1195
+ report11({
1196
+ message: messages11.rejected(usage.name, firstUsage.selector ?? firstUsage.name),
1197
+ node: usage.declaration,
1198
+ result,
1199
+ ruleName: ruleName11,
1200
+ word: usage.name
1201
+ });
1202
+ } else {
1203
+ firstUsageByName.set(usage.name, usage);
1204
+ }
1205
+ }
1206
+ };
1207
+ var rule11 = createStylelintRule({
1208
+ docs: docs11,
1209
+ messages: messages11,
1210
+ rule: ruleFunction11,
1211
+ ruleName: ruleName11
1212
+ });
1213
+ var no_overlapping_areas_default = rule11;
1214
+
1215
+ // dist/rules/no-reversed-placement-lines.js
1216
+ var import_stylelint13 = __toESM(require("stylelint"), 1);
1217
+ var import_ts_extras12 = require("ts-extras");
1218
+ var { report: report12, ruleMessages: ruleMessages12, validateOptions: validateOptions12 } = import_stylelint13.default.utils;
1219
+ var ruleName12 = createRuleName("no-reversed-placement-lines");
1220
+ var messages12 = ruleMessages12(ruleName12, {
1221
+ rejected: (propertyName, start, end) => `Use an end line after the start line for \`${propertyName}\`; \`${String(end)}\` is not after \`${String(start)}\`.`
1222
+ });
1223
+ var docs12 = {
1224
+ description: "Disallow reversed or zero-width numeric CSS Grid placement line ranges.",
1225
+ recommended: true,
1226
+ url: createRuleDocsUrl("no-reversed-placement-lines")
1227
+ };
1228
+ var shorthandProperties = /* @__PURE__ */ new Set([
1229
+ "grid-column",
1230
+ "grid-row"
1231
+ ]);
1232
+ var gridAreaPropertyName = "grid-area";
1233
+ var longhandPairs = [
1234
+ {
1235
+ end: "grid-column-end",
1236
+ name: "grid-column",
1237
+ start: "grid-column-start"
1238
+ },
1239
+ {
1240
+ end: "grid-row-end",
1241
+ name: "grid-row",
1242
+ start: "grid-row-start"
1243
+ }
1244
+ ];
1245
+ function getComparableLinePair(startValue, endValue) {
1246
+ const start = parseStandaloneGridLineInteger(startValue);
1247
+ const end = parseStandaloneGridLineInteger(endValue);
1248
+ if (!(0, import_ts_extras12.isDefined)(start) || !(0, import_ts_extras12.isDefined)(end) || start === 0 || end === 0) {
1249
+ return void 0;
1250
+ }
1251
+ if (Math.sign(start) !== Math.sign(end)) {
1252
+ return void 0;
1253
+ }
1254
+ return [start, end];
1255
+ }
1256
+ function isReversedOrZeroWidth(pair) {
1257
+ const [start, end] = pair;
1258
+ return end <= start;
1259
+ }
1260
+ var ruleFunction12 = (primary) => (root, result) => {
1261
+ if (!validateOptions12(result, ruleName12, {
1262
+ actual: primary,
1263
+ possible: [true]
1264
+ })) {
1265
+ return;
1266
+ }
1267
+ root.walkDecls((declaration) => {
1268
+ const propertyName = declaration.prop.toLowerCase();
1269
+ if (!(0, import_ts_extras12.setHas)(shorthandProperties, propertyName) && propertyName !== gridAreaPropertyName) {
1270
+ return;
1271
+ }
1272
+ const slots = getGridPlacementSlots(declaration.value);
1273
+ const shorthandPairs = propertyName === gridAreaPropertyName ? [
1274
+ {
1275
+ endValue: (0, import_ts_extras12.arrayAt)(slots, 2),
1276
+ propertyName: "grid-row",
1277
+ startValue: (0, import_ts_extras12.arrayFirst)(slots)
1278
+ },
1279
+ {
1280
+ endValue: (0, import_ts_extras12.arrayAt)(slots, 3),
1281
+ propertyName: "grid-column",
1282
+ startValue: (0, import_ts_extras12.arrayAt)(slots, 1)
1283
+ }
1284
+ ] : [
1285
+ {
1286
+ endValue: (0, import_ts_extras12.arrayAt)(slots, 1),
1287
+ propertyName,
1288
+ startValue: (0, import_ts_extras12.arrayFirst)(slots)
1289
+ }
1290
+ ];
1291
+ for (const shorthandPair of shorthandPairs) {
1292
+ const { endValue, propertyName: pairName, startValue } = shorthandPair;
1293
+ if ((0, import_ts_extras12.isDefined)(startValue) && (0, import_ts_extras12.isDefined)(endValue)) {
1294
+ const pair = getComparableLinePair(startValue, endValue);
1295
+ if ((0, import_ts_extras12.isDefined)(pair) && isReversedOrZeroWidth(pair)) {
1296
+ const [start, end] = pair;
1297
+ report12({
1298
+ message: messages12.rejected(pairName, start, end),
1299
+ node: declaration,
1300
+ result,
1301
+ ruleName: ruleName12,
1302
+ word: endValue
1303
+ });
1304
+ }
1305
+ }
1306
+ }
1307
+ });
1308
+ root.walkRules((ruleNode) => {
1309
+ const declarations = getDirectDeclarations(ruleNode);
1310
+ for (const pair of longhandPairs) {
1311
+ const startDeclaration = declarations.find((declaration) => declaration.prop.toLowerCase() === pair.start);
1312
+ const endDeclaration = declarations.find((declaration) => declaration.prop.toLowerCase() === pair.end);
1313
+ if ((0, import_ts_extras12.isDefined)(startDeclaration) && (0, import_ts_extras12.isDefined)(endDeclaration)) {
1314
+ const linePair = getComparableLinePair(startDeclaration.value, endDeclaration.value);
1315
+ if ((0, import_ts_extras12.isDefined)(linePair) && isReversedOrZeroWidth(linePair)) {
1316
+ const [start, end] = linePair;
1317
+ report12({
1318
+ message: messages12.rejected(pair.name, start, end),
1319
+ node: endDeclaration,
1320
+ result,
1321
+ ruleName: ruleName12,
1322
+ word: endDeclaration.value
1323
+ });
1324
+ }
1325
+ }
1326
+ }
1327
+ });
1328
+ };
1329
+ var rule12 = createStylelintRule({
1330
+ docs: docs12,
1331
+ messages: messages12,
1332
+ rule: ruleFunction12,
1333
+ ruleName: ruleName12
891
1334
  });
892
- var no_overlapping_areas_default = rule7;
1335
+ var no_reversed_placement_lines_default = rule12;
893
1336
 
894
1337
  // 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, {
1338
+ var import_stylelint14 = __toESM(require("stylelint"), 1);
1339
+ var import_ts_extras13 = require("ts-extras");
1340
+ var { report: report13, ruleMessages: ruleMessages13, validateOptions: validateOptions13 } = import_stylelint14.default.utils;
1341
+ var ruleName13 = createRuleName("no-unknown-areas");
1342
+ var messages13 = ruleMessages13(ruleName13, {
900
1343
  rejected: (areaName) => `Grid area "${areaName}" is referenced by \`grid-area\` but is not declared in any \`grid-template-areas\` template in this stylesheet.`
901
1344
  });
902
- var docs8 = {
1345
+ var docs13 = {
903
1346
  description: "Disallow single-name `grid-area` references that do not match any named area declared in the same stylesheet.",
904
1347
  recommended: true,
905
1348
  url: createRuleDocsUrl("no-unknown-areas")
906
1349
  };
907
- var ruleFunction8 = (primary) => (root, result) => {
908
- if (!validateOptions8(result, ruleName8, {
1350
+ var ruleFunction13 = (primary) => (root, result) => {
1351
+ if (!validateOptions13(result, ruleName13, {
909
1352
  actual: primary,
910
1353
  possible: [true]
911
1354
  })) {
912
1355
  return;
913
1356
  }
914
- const declaredAreaNames = new Set(collectGridTemplateAreas(root).flatMap((template) => (0, import_ts_extras8.isEmpty)(template.diagnostics) ? template.areaNames : []));
1357
+ const declaredAreaNames = new Set(collectGridTemplateAreas(root).flatMap((template) => (0, import_ts_extras13.isEmpty)(template.diagnostics) ? template.areaNames : []));
915
1358
  if (declaredAreaNames.size === 0) {
916
1359
  return;
917
1360
  }
918
1361
  for (const usage of collectGridAreaUsages(root)) {
919
- if (!(0, import_ts_extras8.setHas)(declaredAreaNames, usage.name)) {
920
- report8({
921
- message: messages8.rejected(usage.name),
1362
+ if (!(0, import_ts_extras13.setHas)(declaredAreaNames, usage.name)) {
1363
+ report13({
1364
+ message: messages13.rejected(usage.name),
922
1365
  node: usage.declaration,
923
1366
  result,
924
- ruleName: ruleName8,
1367
+ ruleName: ruleName13,
925
1368
  word: usage.name
926
1369
  });
927
1370
  }
928
1371
  }
929
1372
  };
930
- var rule8 = createStylelintRule({
931
- docs: docs8,
932
- messages: messages8,
933
- rule: ruleFunction8,
934
- ruleName: ruleName8
1373
+ var rule13 = createStylelintRule({
1374
+ docs: docs13,
1375
+ messages: messages13,
1376
+ rule: ruleFunction13,
1377
+ ruleName: ruleName13
935
1378
  });
936
- var no_unknown_areas_default = rule8;
1379
+ var no_unknown_areas_default = rule13;
937
1380
 
938
1381
  // 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, {
1382
+ var import_stylelint15 = __toESM(require("stylelint"), 1);
1383
+ var import_ts_extras14 = require("ts-extras");
1384
+ var { report: report14, ruleMessages: ruleMessages14, validateOptions: validateOptions14 } = import_stylelint15.default.utils;
1385
+ var ruleName14 = createRuleName("no-unused-areas");
1386
+ var messages14 = ruleMessages14(ruleName14, {
944
1387
  rejected: (areaName) => `Grid template area "${areaName}" is declared but no single-name \`grid-area: ${areaName}\` declaration exists in this stylesheet.`
945
1388
  });
946
- var docs9 = {
1389
+ var docs14 = {
947
1390
  description: "Disallow named template areas that are never referenced by a single-name `grid-area` declaration in the same stylesheet.",
948
1391
  recommended: false,
949
1392
  url: createRuleDocsUrl("no-unused-areas")
950
1393
  };
951
- var ruleFunction9 = (primary) => (root, result) => {
952
- if (!validateOptions9(result, ruleName9, {
1394
+ var ruleFunction14 = (primary) => (root, result) => {
1395
+ if (!validateOptions14(result, ruleName14, {
953
1396
  actual: primary,
954
1397
  possible: [true]
955
1398
  })) {
@@ -957,14 +1400,14 @@ var ruleFunction9 = (primary) => (root, result) => {
957
1400
  }
958
1401
  const usedAreaNames = new Set(collectGridAreaUsages(root).map((usage) => usage.name));
959
1402
  for (const template of collectGridTemplateAreas(root)) {
960
- if ((0, import_ts_extras9.isEmpty)(template.diagnostics)) {
1403
+ if ((0, import_ts_extras14.isEmpty)(template.diagnostics)) {
961
1404
  for (const areaName of template.areaNames) {
962
- if (!(0, import_ts_extras9.setHas)(usedAreaNames, areaName)) {
963
- report9({
964
- message: messages9.rejected(areaName),
1405
+ if (!(0, import_ts_extras14.setHas)(usedAreaNames, areaName)) {
1406
+ report14({
1407
+ message: messages14.rejected(areaName),
965
1408
  node: template.declaration,
966
1409
  result,
967
- ruleName: ruleName9,
1410
+ ruleName: ruleName14,
968
1411
  word: areaName
969
1412
  });
970
1413
  }
@@ -972,23 +1415,68 @@ var ruleFunction9 = (primary) => (root, result) => {
972
1415
  }
973
1416
  }
974
1417
  };
975
- var rule9 = createStylelintRule({
976
- docs: docs9,
977
- messages: messages9,
978
- rule: ruleFunction9,
979
- ruleName: ruleName9
1418
+ var rule14 = createStylelintRule({
1419
+ docs: docs14,
1420
+ messages: messages14,
1421
+ rule: ruleFunction14,
1422
+ ruleName: ruleName14
1423
+ });
1424
+ var no_unused_areas_default = rule14;
1425
+
1426
+ // dist/rules/no-zero-grid-lines.js
1427
+ var import_stylelint16 = __toESM(require("stylelint"), 1);
1428
+ var import_ts_extras15 = require("ts-extras");
1429
+ var { report: report15, ruleMessages: ruleMessages15, validateOptions: validateOptions15 } = import_stylelint16.default.utils;
1430
+ var ruleName15 = createRuleName("no-zero-grid-lines");
1431
+ var messages15 = ruleMessages15(ruleName15, {
1432
+ rejected: () => "Do not use Grid line `0`; CSS Grid line numbering starts at `1` and `-1`."
980
1433
  });
981
- var no_unused_areas_default = rule9;
1434
+ var docs15 = {
1435
+ description: "Disallow line `0` in CSS Grid placement declarations.",
1436
+ recommended: true,
1437
+ url: createRuleDocsUrl("no-zero-grid-lines")
1438
+ };
1439
+ var ruleFunction15 = (primary) => (root, result) => {
1440
+ if (!validateOptions15(result, ruleName15, {
1441
+ actual: primary,
1442
+ possible: [true]
1443
+ })) {
1444
+ return;
1445
+ }
1446
+ root.walkDecls((declaration) => {
1447
+ if (!isGridPlacementDeclaration(declaration)) {
1448
+ return;
1449
+ }
1450
+ for (const slot of getGridPlacementSlots(declaration.value)) {
1451
+ if ((0, import_ts_extras15.arrayIncludes)(getGridLineIntegerTokens(slot), 0)) {
1452
+ report15({
1453
+ message: messages15.rejected(),
1454
+ node: declaration,
1455
+ result,
1456
+ ruleName: ruleName15,
1457
+ word: "0"
1458
+ });
1459
+ }
1460
+ }
1461
+ });
1462
+ };
1463
+ var rule15 = createStylelintRule({
1464
+ docs: docs15,
1465
+ messages: messages15,
1466
+ rule: ruleFunction15,
1467
+ ruleName: ruleName15
1468
+ });
1469
+ var no_zero_grid_lines_default = rule15;
982
1470
 
983
1471
  // 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, {
1472
+ var import_stylelint17 = __toESM(require("stylelint"), 1);
1473
+ var import_ts_extras16 = require("ts-extras");
1474
+ var { report: report16, ruleMessages: ruleMessages16, validateOptions: validateOptions16 } = import_stylelint17.default.utils;
1475
+ var ruleName16 = createRuleName("prefer-gap-properties");
1476
+ var messages16 = ruleMessages16(ruleName16, {
989
1477
  rejected: (propertyName, replacement) => `Prefer \`${replacement}\` over legacy \`${propertyName}\`.`
990
1478
  });
991
- var docs10 = {
1479
+ var docs16 = {
992
1480
  description: "Prefer modern `gap`, `row-gap`, and `column-gap` properties over legacy grid gap aliases.",
993
1481
  recommended: true,
994
1482
  url: createRuleDocsUrl("prefer-gap-properties")
@@ -1001,8 +1489,8 @@ var replacements = {
1001
1489
  function getReplacement(declaration) {
1002
1490
  return replacements[declaration.prop.toLowerCase()];
1003
1491
  }
1004
- var ruleFunction10 = (primary) => (root, result) => {
1005
- if (!validateOptions10(result, ruleName10, {
1492
+ var ruleFunction16 = (primary) => (root, result) => {
1493
+ if (!validateOptions16(result, ruleName16, {
1006
1494
  actual: primary,
1007
1495
  possible: [true]
1008
1496
  })) {
@@ -1010,41 +1498,93 @@ var ruleFunction10 = (primary) => (root, result) => {
1010
1498
  }
1011
1499
  root.walkDecls((declaration) => {
1012
1500
  const replacement = getReplacement(declaration);
1013
- if (!(0, import_ts_extras10.isDefined)(replacement)) {
1501
+ if (!(0, import_ts_extras16.isDefined)(replacement)) {
1014
1502
  return;
1015
1503
  }
1016
- report10({
1504
+ report16({
1017
1505
  fix: () => {
1018
1506
  declaration.prop = replacement;
1019
1507
  },
1020
- message: messages10.rejected(declaration.prop, replacement),
1508
+ message: messages16.rejected(declaration.prop, replacement),
1021
1509
  node: declaration,
1022
1510
  result,
1023
- ruleName: ruleName10,
1511
+ ruleName: ruleName16,
1024
1512
  word: declaration.prop
1025
1513
  });
1026
1514
  });
1027
1515
  };
1028
- var rule10 = createStylelintRule({
1029
- docs: docs10,
1030
- messages: messages10,
1516
+ var rule16 = createStylelintRule({
1517
+ docs: docs16,
1518
+ messages: messages16,
1031
1519
  meta: {
1032
1520
  fixable: true
1033
1521
  },
1034
- rule: ruleFunction10,
1035
- ruleName: ruleName10
1522
+ rule: ruleFunction16,
1523
+ ruleName: ruleName16
1036
1524
  });
1037
- var prefer_gap_properties_default = rule10;
1525
+ var prefer_gap_properties_default = rule16;
1526
+
1527
+ // dist/rules/prefer-minmax-zero-fr.js
1528
+ var import_stylelint18 = __toESM(require("stylelint"), 1);
1529
+ var import_ts_extras17 = require("ts-extras");
1530
+ var { report: report17, ruleMessages: ruleMessages17, validateOptions: validateOptions17 } = import_stylelint18.default.utils;
1531
+ var ruleName17 = createRuleName("prefer-minmax-zero-fr");
1532
+ var messages17 = ruleMessages17(ruleName17, {
1533
+ rejected: (track) => `Wrap bare flexible column track \`${track}\` in \`minmax(0, ${track})\` to avoid content-driven overflow.`
1534
+ });
1535
+ var docs17 = {
1536
+ description: "Prefer `minmax(0, <flex>)` for bare flexible CSS Grid column tracks.",
1537
+ recommended: false,
1538
+ url: createRuleDocsUrl("prefer-minmax-zero-fr")
1539
+ };
1540
+ var ignoredTrackKeywords = /* @__PURE__ */ new Set([
1541
+ "masonry",
1542
+ "none",
1543
+ "subgrid"
1544
+ ]);
1545
+ var flexTrackPattern = /^\+?(?:\d+|\d*\.\d+)fr$/v;
1546
+ function isBareFlexibleTrack(token) {
1547
+ const normalizedToken = token.toLowerCase();
1548
+ return !(0, import_ts_extras17.setHas)(ignoredTrackKeywords, normalizedToken) && flexTrackPattern.test(normalizedToken);
1549
+ }
1550
+ var ruleFunction17 = (primary) => (root, result) => {
1551
+ if (!validateOptions17(result, ruleName17, {
1552
+ actual: primary,
1553
+ possible: [true]
1554
+ })) {
1555
+ return;
1556
+ }
1557
+ root.walkDecls("grid-template-columns", (declaration) => {
1558
+ for (const token of splitTopLevelWhitespace(declaration.value)) {
1559
+ if (isBareFlexibleTrack(token)) {
1560
+ report17({
1561
+ message: messages17.rejected(token),
1562
+ node: declaration,
1563
+ result,
1564
+ ruleName: ruleName17,
1565
+ word: token
1566
+ });
1567
+ }
1568
+ }
1569
+ });
1570
+ };
1571
+ var rule17 = createStylelintRule({
1572
+ docs: docs17,
1573
+ messages: messages17,
1574
+ rule: ruleFunction17,
1575
+ ruleName: ruleName17
1576
+ });
1577
+ var prefer_minmax_zero_fr_default = rule17;
1038
1578
 
1039
1579
  // 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, {
1580
+ var import_stylelint19 = __toESM(require("stylelint"), 1);
1581
+ var import_ts_extras18 = require("ts-extras");
1582
+ var { report: report18, ruleMessages: ruleMessages18, validateOptions: validateOptions18 } = import_stylelint19.default.utils;
1583
+ var ruleName18 = createRuleName("require-explicit-rows-with-column-flow");
1584
+ var messages18 = ruleMessages18(ruleName18, {
1045
1585
  rejected: () => "Pair `grid-auto-flow: column` with explicit row sizing in the same block, such as `grid-template-rows` or `grid-auto-rows`."
1046
1586
  });
1047
- var docs11 = {
1587
+ var docs18 = {
1048
1588
  description: "Require explicit row sizing when a rule uses `grid-auto-flow: column`.",
1049
1589
  recommended: false,
1050
1590
  url: createRuleDocsUrl("require-explicit-rows-with-column-flow")
@@ -1052,8 +1592,8 @@ var docs11 = {
1052
1592
  function hasColumnFlow(value) {
1053
1593
  return splitTopLevelWhitespace(value).some((token) => token.toLowerCase() === "column");
1054
1594
  }
1055
- var ruleFunction11 = (primary) => (root, result) => {
1056
- if (!validateOptions11(result, ruleName11, {
1595
+ var ruleFunction18 = (primary) => (root, result) => {
1596
+ if (!validateOptions18(result, ruleName18, {
1057
1597
  actual: primary,
1058
1598
  possible: [true]
1059
1599
  })) {
@@ -1063,56 +1603,116 @@ var ruleFunction11 = (primary) => (root, result) => {
1063
1603
  if (!hasColumnFlow(declaration.value)) {
1064
1604
  return;
1065
1605
  }
1066
- const hasExplicitRows = (0, import_ts_extras11.isDefined)(findSiblingDeclaration(declaration, "grid-template-rows")) || (0, import_ts_extras11.isDefined)(findSiblingDeclaration(declaration, "grid-auto-rows"));
1606
+ const hasExplicitRows = (0, import_ts_extras18.isDefined)(findSiblingDeclaration(declaration, "grid-template-rows")) || (0, import_ts_extras18.isDefined)(findSiblingDeclaration(declaration, "grid-auto-rows"));
1067
1607
  if (hasExplicitRows) {
1068
1608
  return;
1069
1609
  }
1070
- report11({
1071
- message: messages11.rejected(),
1610
+ report18({
1611
+ message: messages18.rejected(),
1072
1612
  node: declaration,
1073
1613
  result,
1074
- ruleName: ruleName11,
1614
+ ruleName: ruleName18,
1075
1615
  word: "column"
1076
1616
  });
1077
1617
  });
1078
1618
  };
1079
- var rule11 = createStylelintRule({
1080
- docs: docs11,
1081
- messages: messages11,
1082
- rule: ruleFunction11,
1083
- ruleName: ruleName11
1619
+ var rule18 = createStylelintRule({
1620
+ docs: docs18,
1621
+ messages: messages18,
1622
+ rule: ruleFunction18,
1623
+ ruleName: ruleName18
1084
1624
  });
1085
- var require_explicit_rows_with_column_flow_default = rule11;
1625
+ var require_explicit_rows_with_column_flow_default = rule18;
1626
+
1627
+ // dist/rules/require-explicit-tracks-with-areas.js
1628
+ var import_stylelint20 = __toESM(require("stylelint"), 1);
1629
+ var import_ts_extras19 = require("ts-extras");
1630
+ var { report: report19, ruleMessages: ruleMessages19, validateOptions: validateOptions19 } = import_stylelint20.default.utils;
1631
+ var ruleName19 = createRuleName("require-explicit-tracks-with-areas");
1632
+ var messages19 = ruleMessages19(ruleName19, {
1633
+ rejected: (propertyName) => `Pair \`grid-template-areas\` with \`${propertyName}\` in the same block so named areas have explicit track sizing.`
1634
+ });
1635
+ var docs19 = {
1636
+ description: "Require explicit track sizing alongside CSS Grid named area templates.",
1637
+ recommended: false,
1638
+ url: createRuleDocsUrl("require-explicit-tracks-with-areas")
1639
+ };
1640
+ var ruleFunction19 = (primary, secondary) => (root, result) => {
1641
+ if (!validateOptions19(result, ruleName19, {
1642
+ actual: primary,
1643
+ possible: [true]
1644
+ }, {
1645
+ actual: secondary,
1646
+ optional: true,
1647
+ possible: {
1648
+ columns: [true, false],
1649
+ rows: [true, false]
1650
+ }
1651
+ })) {
1652
+ return;
1653
+ }
1654
+ const requireColumns = secondary?.columns ?? true;
1655
+ const requireRows = secondary?.rows ?? false;
1656
+ for (const template of collectGridTemplateAreas(root)) {
1657
+ if ((0, import_ts_extras19.isEmpty)(template.diagnostics)) {
1658
+ if (requireColumns && !findSiblingDeclaration(template.declaration, "grid-template-columns")) {
1659
+ report19({
1660
+ message: messages19.rejected("grid-template-columns"),
1661
+ node: template.declaration,
1662
+ result,
1663
+ ruleName: ruleName19,
1664
+ word: template.declaration.prop
1665
+ });
1666
+ }
1667
+ if (requireRows && !findSiblingDeclaration(template.declaration, "grid-template-rows")) {
1668
+ report19({
1669
+ message: messages19.rejected("grid-template-rows"),
1670
+ node: template.declaration,
1671
+ result,
1672
+ ruleName: ruleName19,
1673
+ word: template.declaration.prop
1674
+ });
1675
+ }
1676
+ }
1677
+ }
1678
+ };
1679
+ var rule19 = createStylelintRule({
1680
+ docs: docs19,
1681
+ messages: messages19,
1682
+ rule: ruleFunction19,
1683
+ ruleName: ruleName19
1684
+ });
1685
+ var require_explicit_tracks_with_areas_default = rule19;
1086
1686
 
1087
1687
  // 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, {
1688
+ var import_stylelint21 = __toESM(require("stylelint"), 1);
1689
+ var import_ts_extras20 = require("ts-extras");
1690
+ var { report: report20, ruleMessages: ruleMessages20, validateOptions: validateOptions20 } = import_stylelint21.default.utils;
1691
+ var ruleName20 = createRuleName("validate-area-shapes");
1692
+ var messages20 = ruleMessages20(ruleName20, {
1093
1693
  rejected: (areaName) => `Grid area "${areaName}" must form one contiguous rectangle in \`grid-template-areas\`.`
1094
1694
  });
1095
- var docs12 = {
1695
+ var docs20 = {
1096
1696
  description: "Require every named grid template area to form one contiguous rectangle.",
1097
1697
  recommended: true,
1098
1698
  url: createRuleDocsUrl("validate-area-shapes")
1099
1699
  };
1100
- var ruleFunction12 = (primary) => (root, result) => {
1101
- if (!validateOptions12(result, ruleName12, {
1700
+ var ruleFunction20 = (primary) => (root, result) => {
1701
+ if (!validateOptions20(result, ruleName20, {
1102
1702
  actual: primary,
1103
1703
  possible: [true]
1104
1704
  })) {
1105
1705
  return;
1106
1706
  }
1107
1707
  for (const template of collectGridTemplateAreas(root)) {
1108
- if ((0, import_ts_extras12.isEmpty)(template.diagnostics)) {
1708
+ if ((0, import_ts_extras20.isEmpty)(template.diagnostics)) {
1109
1709
  for (const shape of getAreaShapes(template)) {
1110
1710
  if (!isRectangularArea(template, shape)) {
1111
- report12({
1112
- message: messages12.rejected(shape.name),
1711
+ report20({
1712
+ message: messages20.rejected(shape.name),
1113
1713
  node: template.declaration,
1114
1714
  result,
1115
- ruleName: ruleName12,
1715
+ ruleName: ruleName20,
1116
1716
  word: shape.name
1117
1717
  });
1118
1718
  }
@@ -1120,83 +1720,91 @@ var ruleFunction12 = (primary) => (root, result) => {
1120
1720
  }
1121
1721
  }
1122
1722
  };
1123
- var rule12 = createStylelintRule({
1124
- docs: docs12,
1125
- messages: messages12,
1126
- rule: ruleFunction12,
1127
- ruleName: ruleName12
1723
+ var rule20 = createStylelintRule({
1724
+ docs: docs20,
1725
+ messages: messages20,
1726
+ rule: ruleFunction20,
1727
+ ruleName: ruleName20
1128
1728
  });
1129
- var validate_area_shapes_default = rule12;
1729
+ var validate_area_shapes_default = rule20;
1130
1730
 
1131
1731
  // 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, {
1732
+ var import_stylelint22 = __toESM(require("stylelint"), 1);
1733
+ var import_ts_extras21 = require("ts-extras");
1734
+ var { report: report21, ruleMessages: ruleMessages21, validateOptions: validateOptions21 } = import_stylelint22.default.utils;
1735
+ var ruleName21 = createRuleName("validate-track-counts");
1736
+ var messages21 = ruleMessages21(ruleName21, {
1137
1737
  columns: (areaColumns, trackColumns) => `\`grid-template-areas\` defines ${String(areaColumns)} columns, but sibling \`grid-template-columns\` defines ${String(trackColumns)} tracks.`,
1138
1738
  rows: (areaRows, trackRows) => `\`grid-template-areas\` defines ${String(areaRows)} rows, but sibling \`grid-template-rows\` defines ${String(trackRows)} tracks.`
1139
1739
  });
1140
- var docs13 = {
1740
+ var docs21 = {
1141
1741
  description: "Require template row and column track counts to match `grid-template-areas` dimensions.",
1142
1742
  recommended: true,
1143
1743
  url: createRuleDocsUrl("validate-track-counts")
1144
1744
  };
1145
- var ruleFunction13 = (primary) => (root, result) => {
1146
- if (!validateOptions13(result, ruleName13, {
1745
+ var ruleFunction21 = (primary) => (root, result) => {
1746
+ if (!validateOptions21(result, ruleName21, {
1147
1747
  actual: primary,
1148
1748
  possible: [true]
1149
1749
  })) {
1150
1750
  return;
1151
1751
  }
1152
1752
  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)) {
1753
+ const expectedColumns = (0, import_ts_extras21.arrayFirst)(template.rows)?.length;
1754
+ if ((0, import_ts_extras21.isEmpty)(template.diagnostics) && (0, import_ts_extras21.isDefined)(expectedColumns)) {
1155
1755
  const expectedRows = template.rows.length;
1156
1756
  const rowsDeclaration = findSiblingDeclaration(template.declaration, "grid-template-rows");
1157
1757
  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),
1758
+ const actualRows = (0, import_ts_extras21.isDefined)(rowsDeclaration) ? countGridTracks(rowsDeclaration.value) : void 0;
1759
+ const actualColumns = (0, import_ts_extras21.isDefined)(columnsDeclaration) ? countGridTracks(columnsDeclaration.value) : void 0;
1760
+ if ((0, import_ts_extras21.isDefined)(rowsDeclaration) && (0, import_ts_extras21.isDefined)(actualRows) && actualRows !== expectedRows) {
1761
+ report21({
1762
+ message: messages21.rows(expectedRows, actualRows),
1163
1763
  node: rowsDeclaration,
1164
1764
  result,
1165
- ruleName: ruleName13
1765
+ ruleName: ruleName21
1166
1766
  });
1167
1767
  }
1168
- if ((0, import_ts_extras13.isDefined)(columnsDeclaration) && (0, import_ts_extras13.isDefined)(actualColumns) && actualColumns !== expectedColumns) {
1169
- report13({
1170
- message: messages13.columns(expectedColumns, actualColumns),
1768
+ if ((0, import_ts_extras21.isDefined)(columnsDeclaration) && (0, import_ts_extras21.isDefined)(actualColumns) && actualColumns !== expectedColumns) {
1769
+ report21({
1770
+ message: messages21.columns(expectedColumns, actualColumns),
1171
1771
  node: columnsDeclaration,
1172
1772
  result,
1173
- ruleName: ruleName13
1773
+ ruleName: ruleName21
1174
1774
  });
1175
1775
  }
1176
1776
  }
1177
1777
  }
1178
1778
  };
1179
- var rule13 = createStylelintRule({
1180
- docs: docs13,
1181
- messages: messages13,
1182
- rule: ruleFunction13,
1183
- ruleName: ruleName13
1779
+ var rule21 = createStylelintRule({
1780
+ docs: docs21,
1781
+ messages: messages21,
1782
+ rule: ruleFunction21,
1783
+ ruleName: ruleName21
1184
1784
  });
1185
- var validate_track_counts_default = rule13;
1785
+ var validate_track_counts_default = rule21;
1186
1786
 
1187
1787
  // dist/_internal/rules-registry.js
1188
1788
  var gridRules = {
1189
1789
  "consistent-area-naming": consistent_area_naming_default,
1790
+ "no-conflicting-placement": no_conflicting_placement_default,
1190
1791
  "no-dense-auto-flow": no_dense_auto_flow_default,
1792
+ "no-ineffective-container-properties": no_ineffective_container_properties_default,
1191
1793
  "no-invalid-areas": no_invalid_areas_default,
1192
1794
  "no-invalid-auto-repeat": no_invalid_auto_repeat_default,
1193
1795
  "no-invalid-minmax": no_invalid_minmax_default,
1796
+ "no-invalid-repeat-count": no_invalid_repeat_count_default,
1797
+ "no-invalid-span": no_invalid_span_default,
1194
1798
  "no-mismatched-template-rows": no_mismatched_template_rows_default,
1195
1799
  "no-overlapping-areas": no_overlapping_areas_default,
1800
+ "no-reversed-placement-lines": no_reversed_placement_lines_default,
1196
1801
  "no-unknown-areas": no_unknown_areas_default,
1197
1802
  "no-unused-areas": no_unused_areas_default,
1803
+ "no-zero-grid-lines": no_zero_grid_lines_default,
1198
1804
  "prefer-gap-properties": prefer_gap_properties_default,
1805
+ "prefer-minmax-zero-fr": prefer_minmax_zero_fr_default,
1199
1806
  "require-explicit-rows-with-column-flow": require_explicit_rows_with_column_flow_default,
1807
+ "require-explicit-tracks-with-areas": require_explicit_tracks_with_areas_default,
1200
1808
  "validate-area-shapes": validate_area_shapes_default,
1201
1809
  "validate-track-counts": validate_track_counts_default
1202
1810
  };
@@ -1213,29 +1821,29 @@ var meta = {
1213
1821
  version: packageMetaVersion
1214
1822
  };
1215
1823
  var rules = runtimeRules;
1216
- var ruleNames = (0, import_ts_extras14.objectKeys)(rules).toSorted((left, right) => left.localeCompare(right));
1824
+ var ruleNames = (0, import_ts_extras22.objectKeys)(rules).toSorted((left, right) => left.localeCompare(right));
1217
1825
  var gridRuleEntries = (() => {
1218
1826
  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]);
1827
+ for (const ruleName22 of ruleNames) {
1828
+ const rule22 = rules[ruleName22];
1829
+ if ((0, import_ts_extras22.isDefined)(rule22)) {
1830
+ entries.push([ruleName22, rule22]);
1223
1831
  }
1224
1832
  }
1225
1833
  return entries;
1226
1834
  })();
1227
- function isGridRuleId(ruleName14) {
1228
- return ruleName14.startsWith(`${PLUGIN_NAMESPACE}/`);
1835
+ function isGridRuleId(ruleName22) {
1836
+ return ruleName22.startsWith(`${PLUGIN_NAMESPACE}/`);
1229
1837
  }
1230
- function toGridRuleId(ruleName14) {
1231
- if (!isGridRuleId(ruleName14)) {
1232
- throw new Error(`Unexpected Stylelint rule id "${ruleName14}".`);
1838
+ function toGridRuleId(ruleName22) {
1839
+ if (!isGridRuleId(ruleName22)) {
1840
+ throw new Error(`Unexpected Stylelint rule id "${ruleName22}".`);
1233
1841
  }
1234
- return ruleName14;
1842
+ return ruleName22;
1235
1843
  }
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));
1844
+ var plugins = gridRuleEntries.map(([, rule22]) => rule22);
1845
+ var ruleIds = gridRuleEntries.map(([, rule22]) => toGridRuleId(rule22.ruleName));
1846
+ var recommendedRuleIds = gridRuleEntries.filter(([, rule22]) => rule22.docs.recommended).map(([, rule22]) => toGridRuleId(rule22.ruleName));
1239
1847
  function createConfig(enabledRuleIds) {
1240
1848
  return {
1241
1849
  plugins: [...plugins],