Skip to content

Commit aa07187

Browse files
Copilotsiddharthkp
andcommitted
Fix responsive format to use Primer CSS style (mx-sm-2, mx-md-4)
Co-authored-by: siddharthkp <1863771+siddharthkp@users.noreply.github.com>
1 parent 505646c commit aa07187

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

docs/rules/namespace-spacing-utils.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ The following patterns are detected:
1313
- Margin: `m-{size}`, `mx-{size}`, `my-{size}`, `mt-{size}`, `mr-{size}`, `mb-{size}`, `ml-{size}`
1414
- Padding: `p-{size}`, `px-{size}`, `py-{size}`, `pt-{size}`, `pr-{size}`, `pb-{size}`, `pl-{size}`
1515
- Sizes: `0-12`, `auto`, `n1-n12` (negative values)
16-
- Responsive variants: `sm:`, `md:`, `lg:`, `xl:` prefixes
16+
- Responsive variants: `mx-sm-2`, `mx-md-4`, `p-lg-3`, `mt-xl-6` (breakpoint embedded in class name)
1717

1818
👎 Examples of **incorrect** code for this rule:
1919

@@ -36,7 +36,8 @@ The following patterns are detected:
3636
<div className="mx-auto" />
3737

3838
// ❌ Responsive variants without namespace
39-
<div className="md:m-4" />
39+
<div className="mx-sm-2" />
40+
<div className="mx-md-4" />
4041
```
4142

4243
👍 Examples of **correct** code for this rule:
@@ -60,7 +61,8 @@ The following patterns are detected:
6061
<div className="pr-mx-auto" />
6162

6263
// ✅ Responsive variants with namespace
63-
<div className="md:pr-m-4" />
64+
<div className="pr-mx-sm-2" />
65+
<div className="pr-mx-md-4" />
6466

6567
// ✅ Non-spacing classes are not affected
6668
<div className="text-bold color-fg-default" />

src/rules/__tests__/namespace-spacing-utils.test.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@ ruleTester.run('namespace-spacing-utils', rule, {
6363
// Template literal with namespaced classes
6464
'<div className={`pr-m-4 pr-p-2`} />',
6565

66-
// Responsive variants (already namespaced)
67-
'<div className="md:pr-m-4" />',
68-
'<div className="lg:pr-p-2" />',
66+
// Responsive variants (already namespaced) - Primer CSS format: mx-sm-2, mx-md-4
67+
'<div className="pr-mx-sm-2" />',
68+
'<div className="pr-mx-md-4" />',
69+
'<div className="pr-p-lg-3" />',
6970
],
7071
invalid: [
7172
// Basic margin classes without namespace
@@ -185,16 +186,21 @@ ruleTester.run('namespace-spacing-utils', rule, {
185186
errors: [{messageId: 'namespaceRequired', data: {className: 'm-4', replacement: 'pr-m-4'}}],
186187
},
187188

188-
// Responsive variants
189+
// Responsive variants - Primer CSS format: mx-sm-2, mx-md-4
189190
{
190-
code: '<div className="md:m-4" />',
191-
output: '<div className="md:pr-m-4" />',
192-
errors: [{messageId: 'namespaceRequired', data: {className: 'md:m-4', replacement: 'md:pr-m-4'}}],
191+
code: '<div className="mx-sm-2" />',
192+
output: '<div className="pr-mx-sm-2" />',
193+
errors: [{messageId: 'namespaceRequired', data: {className: 'mx-sm-2', replacement: 'pr-mx-sm-2'}}],
193194
},
194195
{
195-
code: '<div className="lg:p-2" />',
196-
output: '<div className="lg:pr-p-2" />',
197-
errors: [{messageId: 'namespaceRequired', data: {className: 'lg:p-2', replacement: 'lg:pr-p-2'}}],
196+
code: '<div className="mx-md-4" />',
197+
output: '<div className="pr-mx-md-4" />',
198+
errors: [{messageId: 'namespaceRequired', data: {className: 'mx-md-4', replacement: 'pr-mx-md-4'}}],
199+
},
200+
{
201+
code: '<div className="p-lg-3" />',
202+
output: '<div className="pr-p-lg-3" />',
203+
errors: [{messageId: 'namespaceRequired', data: {className: 'p-lg-3', replacement: 'pr-p-lg-3'}}],
198204
},
199205

200206
// Size 0 classes

src/rules/namespace-spacing-utils.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// Regex pattern to match margin/padding utility classes from Primer CSS
22
// Matches: m-{size}, mx-{size}, my-{size}, mt-{size}, mr-{size}, mb-{size}, ml-{size}
33
// p-{size}, px-{size}, py-{size}, pt-{size}, pr-{size}, pb-{size}, pl-{size}
4-
// Sizes: 0-12, auto, n1-n12 (negative), responsive variants like md:m-4
5-
const spacingUtilPattern = /(?<!\S)(?:(?:sm|md|lg|xl):)?([mp][xytblr]?-(?:auto|n?[0-9]+))(?!\S)/g
4+
// Sizes: 0-12, auto, n1-n12 (negative)
5+
// Responsive variants: mx-sm-2, mx-md-4, etc. (breakpoint embedded in class name)
6+
const spacingUtilPattern = /(?<!\S)([mp][xytblr]?-(?:sm-|md-|lg-|xl-)?(?:auto|n?[0-9]+))(?!\S)/g
67

78
// Process a class name string and find unnamespaced spacing utilities
89
const findUnNamespacedClasses = classNameStr => {
@@ -18,7 +19,7 @@ const findUnNamespacedClasses = classNameStr => {
1819
if (!prefix.endsWith('pr-')) {
1920
matches.push({
2021
original: fullMatch,
21-
replacement: fullMatch.includes(':') ? fullMatch.replace(/:([mp])/, ':pr-$1') : `pr-${fullMatch}`,
22+
replacement: `pr-${fullMatch}`,
2223
index: startIndex,
2324
})
2425
}

0 commit comments

Comments
 (0)