biome-plugin-css-prefer-logical-property 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +217 -0
- package/package.json +41 -0
- package/rules/prefer-logical-properties.grit +396 -0
- package/rules/prefer-logical-units.grit +85 -0
- package/rules/prefer-logical-values.grit +100 -0
package/README.md
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# biome-plugin-css-prefer-logical-property
|
|
2
|
+
|
|
3
|
+
Biome plugin that detects physical CSS properties, values, and units and suggests their logical equivalents. Built with [GritQL](https://biomejs.dev/linter/plugins/) for [Biome](https://biomejs.dev) v2.0+.
|
|
4
|
+
|
|
5
|
+
> **Note:** This plugin is diagnostic-only (detect and warn). Autofix is not yet supported by Biome's plugin system. For autofix support, see [eslint-plugin-css-logical-property-autofix](https://www.npmjs.com/package/eslint-plugin-css-logical-property-autofix).
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -D biome-plugin-css-prefer-logical-property @biomejs/biome
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
Add the plugin rules to your `biome.json`:
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"$schema": "https://biomejs.dev/schemas/2.0.0/schema.json",
|
|
20
|
+
"plugins": [
|
|
21
|
+
"./node_modules/biome-plugin-css-prefer-logical-property/rules/prefer-logical-properties.grit",
|
|
22
|
+
"./node_modules/biome-plugin-css-prefer-logical-property/rules/prefer-logical-values.grit",
|
|
23
|
+
"./node_modules/biome-plugin-css-prefer-logical-property/rules/prefer-logical-units.grit"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
You can also enable individual rules instead of all three:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"plugins": [
|
|
33
|
+
"./node_modules/biome-plugin-css-prefer-logical-property/rules/prefer-logical-properties.grit"
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Then run:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
biome lint "**/*.css"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Rules
|
|
45
|
+
|
|
46
|
+
### `prefer-logical-properties.grit`
|
|
47
|
+
|
|
48
|
+
Detects physical CSS properties and suggests logical alternatives.
|
|
49
|
+
|
|
50
|
+
```css
|
|
51
|
+
/* Warns */
|
|
52
|
+
.box {
|
|
53
|
+
width: 100px; /* Use 'inline-size' */
|
|
54
|
+
margin-left: 10px; /* Use 'margin-inline-start' */
|
|
55
|
+
border-top: 1px solid; /* Use 'border-block-start' */
|
|
56
|
+
top: 0; /* Use 'inset-block-start' */
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* OK */
|
|
60
|
+
.box {
|
|
61
|
+
inline-size: 100px;
|
|
62
|
+
margin-inline-start: 10px;
|
|
63
|
+
border-block-start: 1px solid;
|
|
64
|
+
inset-block-start: 0;
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
<details>
|
|
69
|
+
<summary>Full property mapping (52 properties)</summary>
|
|
70
|
+
|
|
71
|
+
| Physical | Logical |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `top` | `inset-block-start` |
|
|
74
|
+
| `right` | `inset-inline-end` |
|
|
75
|
+
| `bottom` | `inset-block-end` |
|
|
76
|
+
| `left` | `inset-inline-start` |
|
|
77
|
+
| `width` | `inline-size` |
|
|
78
|
+
| `height` | `block-size` |
|
|
79
|
+
| `min-width` | `min-inline-size` |
|
|
80
|
+
| `min-height` | `min-block-size` |
|
|
81
|
+
| `max-width` | `max-inline-size` |
|
|
82
|
+
| `max-height` | `max-block-size` |
|
|
83
|
+
| `contain-intrinsic-width` | `contain-intrinsic-inline-size` |
|
|
84
|
+
| `contain-intrinsic-height` | `contain-intrinsic-block-size` |
|
|
85
|
+
| `margin-top` | `margin-block-start` |
|
|
86
|
+
| `margin-right` | `margin-inline-end` |
|
|
87
|
+
| `margin-bottom` | `margin-block-end` |
|
|
88
|
+
| `margin-left` | `margin-inline-start` |
|
|
89
|
+
| `padding-top` | `padding-block-start` |
|
|
90
|
+
| `padding-right` | `padding-inline-end` |
|
|
91
|
+
| `padding-bottom` | `padding-block-end` |
|
|
92
|
+
| `padding-left` | `padding-inline-start` |
|
|
93
|
+
| `border-top` | `border-block-start` |
|
|
94
|
+
| `border-right` | `border-inline-end` |
|
|
95
|
+
| `border-bottom` | `border-block-end` |
|
|
96
|
+
| `border-left` | `border-inline-start` |
|
|
97
|
+
| `border-top-color` | `border-block-start-color` |
|
|
98
|
+
| `border-right-color` | `border-inline-end-color` |
|
|
99
|
+
| `border-bottom-color` | `border-block-end-color` |
|
|
100
|
+
| `border-left-color` | `border-inline-start-color` |
|
|
101
|
+
| `border-top-style` | `border-block-start-style` |
|
|
102
|
+
| `border-right-style` | `border-inline-end-style` |
|
|
103
|
+
| `border-bottom-style` | `border-block-end-style` |
|
|
104
|
+
| `border-left-style` | `border-inline-start-style` |
|
|
105
|
+
| `border-top-width` | `border-block-start-width` |
|
|
106
|
+
| `border-right-width` | `border-inline-end-width` |
|
|
107
|
+
| `border-bottom-width` | `border-block-end-width` |
|
|
108
|
+
| `border-left-width` | `border-inline-start-width` |
|
|
109
|
+
| `border-top-left-radius` | `border-start-start-radius` |
|
|
110
|
+
| `border-top-right-radius` | `border-start-end-radius` |
|
|
111
|
+
| `border-bottom-right-radius` | `border-end-end-radius` |
|
|
112
|
+
| `border-bottom-left-radius` | `border-end-start-radius` |
|
|
113
|
+
| `overflow-x` | `overflow-inline` |
|
|
114
|
+
| `overflow-y` | `overflow-block` |
|
|
115
|
+
| `overscroll-behavior-x` | `overscroll-behavior-inline` |
|
|
116
|
+
| `overscroll-behavior-y` | `overscroll-behavior-block` |
|
|
117
|
+
| `scroll-margin-top` | `scroll-margin-block-start` |
|
|
118
|
+
| `scroll-margin-right` | `scroll-margin-inline-end` |
|
|
119
|
+
| `scroll-margin-bottom` | `scroll-margin-block-end` |
|
|
120
|
+
| `scroll-margin-left` | `scroll-margin-inline-start` |
|
|
121
|
+
| `scroll-padding-top` | `scroll-padding-block-start` |
|
|
122
|
+
| `scroll-padding-right` | `scroll-padding-inline-end` |
|
|
123
|
+
| `scroll-padding-bottom` | `scroll-padding-block-end` |
|
|
124
|
+
| `scroll-padding-left` | `scroll-padding-inline-start` |
|
|
125
|
+
|
|
126
|
+
</details>
|
|
127
|
+
|
|
128
|
+
### `prefer-logical-values.grit`
|
|
129
|
+
|
|
130
|
+
Detects physical CSS values and suggests logical alternatives.
|
|
131
|
+
|
|
132
|
+
```css
|
|
133
|
+
/* Warns */
|
|
134
|
+
.text { text-align: left; } /* Use 'start' */
|
|
135
|
+
.float { float: right; } /* Use 'inline-end' */
|
|
136
|
+
.resize { resize: horizontal; } /* Use 'inline' */
|
|
137
|
+
|
|
138
|
+
/* OK */
|
|
139
|
+
.text { text-align: start; }
|
|
140
|
+
.float { float: inline-end; }
|
|
141
|
+
.resize { resize: inline; }
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
<details>
|
|
145
|
+
<summary>Full value mapping (6 properties)</summary>
|
|
146
|
+
|
|
147
|
+
| Property | Physical value | Logical value |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| `text-align` | `left` | `start` |
|
|
150
|
+
| `text-align` | `right` | `end` |
|
|
151
|
+
| `float` | `left` | `inline-start` |
|
|
152
|
+
| `float` | `right` | `inline-end` |
|
|
153
|
+
| `clear` | `left` | `inline-start` |
|
|
154
|
+
| `clear` | `right` | `inline-end` |
|
|
155
|
+
| `resize` | `horizontal` | `inline` |
|
|
156
|
+
| `resize` | `vertical` | `block` |
|
|
157
|
+
| `caption-side` | `left` | `inline-start` |
|
|
158
|
+
| `caption-side` | `right` | `inline-end` |
|
|
159
|
+
| `box-orient` | `horizontal` | `inline-axis` |
|
|
160
|
+
| `box-orient` | `vertical` | `block-axis` |
|
|
161
|
+
|
|
162
|
+
</details>
|
|
163
|
+
|
|
164
|
+
### `prefer-logical-units.grit`
|
|
165
|
+
|
|
166
|
+
Detects physical CSS units and suggests logical alternatives.
|
|
167
|
+
|
|
168
|
+
```css
|
|
169
|
+
/* Warns */
|
|
170
|
+
.box {
|
|
171
|
+
block-size: 100vh; /* Use 'vb' */
|
|
172
|
+
inline-size: 50vw; /* Use 'vi' */
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* OK */
|
|
176
|
+
.box {
|
|
177
|
+
block-size: 100vb;
|
|
178
|
+
inline-size: 50vi;
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
<details>
|
|
183
|
+
<summary>Full unit mapping (10 units)</summary>
|
|
184
|
+
|
|
185
|
+
| Physical | Logical | Description |
|
|
186
|
+
|---|---|---|
|
|
187
|
+
| `vw` | `vi` | Viewport inline size |
|
|
188
|
+
| `vh` | `vb` | Viewport block size |
|
|
189
|
+
| `dvw` | `dvi` | Dynamic viewport inline size |
|
|
190
|
+
| `dvh` | `dvb` | Dynamic viewport block size |
|
|
191
|
+
| `svw` | `svi` | Small viewport inline size |
|
|
192
|
+
| `svh` | `svb` | Small viewport block size |
|
|
193
|
+
| `lvw` | `lvi` | Large viewport inline size |
|
|
194
|
+
| `lvh` | `lvb` | Large viewport block size |
|
|
195
|
+
| `cqw` | `cqi` | Container query inline size |
|
|
196
|
+
| `cqh` | `cqb` | Container query block size |
|
|
197
|
+
|
|
198
|
+
</details>
|
|
199
|
+
|
|
200
|
+
## Comparison with ESLint plugin
|
|
201
|
+
|
|
202
|
+
| Feature | This plugin (Biome) | eslint-plugin-css-logical-property-autofix |
|
|
203
|
+
|---|---|---|
|
|
204
|
+
| Detect physical properties | Yes | Yes |
|
|
205
|
+
| Detect physical values | Yes | Yes |
|
|
206
|
+
| Detect physical units | Yes | Yes |
|
|
207
|
+
| Autofix | No (not yet supported by Biome plugins) | **Yes** |
|
|
208
|
+
| Configuration | GritQL `.grit` files | ESLint flat config |
|
|
209
|
+
| Allow-list options | Not available | `allowProperties`, `allowValues`, `allowUnits` |
|
|
210
|
+
|
|
211
|
+
## Requirements
|
|
212
|
+
|
|
213
|
+
- Biome >= 2.0.0
|
|
214
|
+
|
|
215
|
+
## License
|
|
216
|
+
|
|
217
|
+
MIT
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "biome-plugin-css-prefer-logical-property",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Biome plugin that detects physical CSS properties, values, and units and suggests logical alternatives",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"biome",
|
|
7
|
+
"biome-plugin",
|
|
8
|
+
"css",
|
|
9
|
+
"gritql",
|
|
10
|
+
"i18n",
|
|
11
|
+
"logical-properties",
|
|
12
|
+
"ltr",
|
|
13
|
+
"rtl"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://github.com/kkkaoru/eslint-plugin-css-logical-property#readme",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/kkkaoru/eslint-plugin-css-logical-property/issues"
|
|
18
|
+
},
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"author": "kkkaoru",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/kkkaoru/eslint-plugin-css-logical-property",
|
|
24
|
+
"directory": "packages/biome-plugin-css-prefer-logical-property"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"rules"
|
|
28
|
+
],
|
|
29
|
+
"type": "module",
|
|
30
|
+
"scripts": {
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:coverage": "vitest run --coverage"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@biomejs/biome": "2.0.0",
|
|
36
|
+
"@vitest/coverage-v8": "4.1.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@biomejs/biome": ">=2.0.0"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
language css;
|
|
2
|
+
|
|
3
|
+
// Detect physical CSS properties that should use logical equivalents
|
|
4
|
+
or {
|
|
5
|
+
// Inset
|
|
6
|
+
`top: $val` as $decl where {
|
|
7
|
+
register_diagnostic(
|
|
8
|
+
span = $decl,
|
|
9
|
+
message = "Use logical property 'inset-block-start' instead of 'top'.",
|
|
10
|
+
severity = "warning"
|
|
11
|
+
)
|
|
12
|
+
},
|
|
13
|
+
`right: $val` as $decl where {
|
|
14
|
+
register_diagnostic(
|
|
15
|
+
span = $decl,
|
|
16
|
+
message = "Use logical property 'inset-inline-end' instead of 'right'.",
|
|
17
|
+
severity = "warning"
|
|
18
|
+
)
|
|
19
|
+
},
|
|
20
|
+
`bottom: $val` as $decl where {
|
|
21
|
+
register_diagnostic(
|
|
22
|
+
span = $decl,
|
|
23
|
+
message = "Use logical property 'inset-block-end' instead of 'bottom'.",
|
|
24
|
+
severity = "warning"
|
|
25
|
+
)
|
|
26
|
+
},
|
|
27
|
+
`left: $val` as $decl where {
|
|
28
|
+
register_diagnostic(
|
|
29
|
+
span = $decl,
|
|
30
|
+
message = "Use logical property 'inset-inline-start' instead of 'left'.",
|
|
31
|
+
severity = "warning"
|
|
32
|
+
)
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
// Size
|
|
36
|
+
`width: $val` as $decl where {
|
|
37
|
+
register_diagnostic(
|
|
38
|
+
span = $decl,
|
|
39
|
+
message = "Use logical property 'inline-size' instead of 'width'.",
|
|
40
|
+
severity = "warning"
|
|
41
|
+
)
|
|
42
|
+
},
|
|
43
|
+
`height: $val` as $decl where {
|
|
44
|
+
register_diagnostic(
|
|
45
|
+
span = $decl,
|
|
46
|
+
message = "Use logical property 'block-size' instead of 'height'.",
|
|
47
|
+
severity = "warning"
|
|
48
|
+
)
|
|
49
|
+
},
|
|
50
|
+
`min-width: $val` as $decl where {
|
|
51
|
+
register_diagnostic(
|
|
52
|
+
span = $decl,
|
|
53
|
+
message = "Use logical property 'min-inline-size' instead of 'min-width'.",
|
|
54
|
+
severity = "warning"
|
|
55
|
+
)
|
|
56
|
+
},
|
|
57
|
+
`min-height: $val` as $decl where {
|
|
58
|
+
register_diagnostic(
|
|
59
|
+
span = $decl,
|
|
60
|
+
message = "Use logical property 'min-block-size' instead of 'min-height'.",
|
|
61
|
+
severity = "warning"
|
|
62
|
+
)
|
|
63
|
+
},
|
|
64
|
+
`max-width: $val` as $decl where {
|
|
65
|
+
register_diagnostic(
|
|
66
|
+
span = $decl,
|
|
67
|
+
message = "Use logical property 'max-inline-size' instead of 'max-width'.",
|
|
68
|
+
severity = "warning"
|
|
69
|
+
)
|
|
70
|
+
},
|
|
71
|
+
`max-height: $val` as $decl where {
|
|
72
|
+
register_diagnostic(
|
|
73
|
+
span = $decl,
|
|
74
|
+
message = "Use logical property 'max-block-size' instead of 'max-height'.",
|
|
75
|
+
severity = "warning"
|
|
76
|
+
)
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
// Contain intrinsic size
|
|
80
|
+
`contain-intrinsic-width: $val` as $decl where {
|
|
81
|
+
register_diagnostic(
|
|
82
|
+
span = $decl,
|
|
83
|
+
message = "Use logical property 'contain-intrinsic-inline-size' instead of 'contain-intrinsic-width'.",
|
|
84
|
+
severity = "warning"
|
|
85
|
+
)
|
|
86
|
+
},
|
|
87
|
+
`contain-intrinsic-height: $val` as $decl where {
|
|
88
|
+
register_diagnostic(
|
|
89
|
+
span = $decl,
|
|
90
|
+
message = "Use logical property 'contain-intrinsic-block-size' instead of 'contain-intrinsic-height'.",
|
|
91
|
+
severity = "warning"
|
|
92
|
+
)
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
// Margin
|
|
96
|
+
`margin-top: $val` as $decl where {
|
|
97
|
+
register_diagnostic(
|
|
98
|
+
span = $decl,
|
|
99
|
+
message = "Use logical property 'margin-block-start' instead of 'margin-top'.",
|
|
100
|
+
severity = "warning"
|
|
101
|
+
)
|
|
102
|
+
},
|
|
103
|
+
`margin-right: $val` as $decl where {
|
|
104
|
+
register_diagnostic(
|
|
105
|
+
span = $decl,
|
|
106
|
+
message = "Use logical property 'margin-inline-end' instead of 'margin-right'.",
|
|
107
|
+
severity = "warning"
|
|
108
|
+
)
|
|
109
|
+
},
|
|
110
|
+
`margin-bottom: $val` as $decl where {
|
|
111
|
+
register_diagnostic(
|
|
112
|
+
span = $decl,
|
|
113
|
+
message = "Use logical property 'margin-block-end' instead of 'margin-bottom'.",
|
|
114
|
+
severity = "warning"
|
|
115
|
+
)
|
|
116
|
+
},
|
|
117
|
+
`margin-left: $val` as $decl where {
|
|
118
|
+
register_diagnostic(
|
|
119
|
+
span = $decl,
|
|
120
|
+
message = "Use logical property 'margin-inline-start' instead of 'margin-left'.",
|
|
121
|
+
severity = "warning"
|
|
122
|
+
)
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
// Padding
|
|
126
|
+
`padding-top: $val` as $decl where {
|
|
127
|
+
register_diagnostic(
|
|
128
|
+
span = $decl,
|
|
129
|
+
message = "Use logical property 'padding-block-start' instead of 'padding-top'.",
|
|
130
|
+
severity = "warning"
|
|
131
|
+
)
|
|
132
|
+
},
|
|
133
|
+
`padding-right: $val` as $decl where {
|
|
134
|
+
register_diagnostic(
|
|
135
|
+
span = $decl,
|
|
136
|
+
message = "Use logical property 'padding-inline-end' instead of 'padding-right'.",
|
|
137
|
+
severity = "warning"
|
|
138
|
+
)
|
|
139
|
+
},
|
|
140
|
+
`padding-bottom: $val` as $decl where {
|
|
141
|
+
register_diagnostic(
|
|
142
|
+
span = $decl,
|
|
143
|
+
message = "Use logical property 'padding-block-end' instead of 'padding-bottom'.",
|
|
144
|
+
severity = "warning"
|
|
145
|
+
)
|
|
146
|
+
},
|
|
147
|
+
`padding-left: $val` as $decl where {
|
|
148
|
+
register_diagnostic(
|
|
149
|
+
span = $decl,
|
|
150
|
+
message = "Use logical property 'padding-inline-start' instead of 'padding-left'.",
|
|
151
|
+
severity = "warning"
|
|
152
|
+
)
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
// Border shorthand
|
|
156
|
+
`border-top: $val` as $decl where {
|
|
157
|
+
register_diagnostic(
|
|
158
|
+
span = $decl,
|
|
159
|
+
message = "Use logical property 'border-block-start' instead of 'border-top'.",
|
|
160
|
+
severity = "warning"
|
|
161
|
+
)
|
|
162
|
+
},
|
|
163
|
+
`border-right: $val` as $decl where {
|
|
164
|
+
register_diagnostic(
|
|
165
|
+
span = $decl,
|
|
166
|
+
message = "Use logical property 'border-inline-end' instead of 'border-right'.",
|
|
167
|
+
severity = "warning"
|
|
168
|
+
)
|
|
169
|
+
},
|
|
170
|
+
`border-bottom: $val` as $decl where {
|
|
171
|
+
register_diagnostic(
|
|
172
|
+
span = $decl,
|
|
173
|
+
message = "Use logical property 'border-block-end' instead of 'border-bottom'.",
|
|
174
|
+
severity = "warning"
|
|
175
|
+
)
|
|
176
|
+
},
|
|
177
|
+
`border-left: $val` as $decl where {
|
|
178
|
+
register_diagnostic(
|
|
179
|
+
span = $decl,
|
|
180
|
+
message = "Use logical property 'border-inline-start' instead of 'border-left'.",
|
|
181
|
+
severity = "warning"
|
|
182
|
+
)
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
// Border color
|
|
186
|
+
`border-top-color: $val` as $decl where {
|
|
187
|
+
register_diagnostic(
|
|
188
|
+
span = $decl,
|
|
189
|
+
message = "Use logical property 'border-block-start-color' instead of 'border-top-color'.",
|
|
190
|
+
severity = "warning"
|
|
191
|
+
)
|
|
192
|
+
},
|
|
193
|
+
`border-right-color: $val` as $decl where {
|
|
194
|
+
register_diagnostic(
|
|
195
|
+
span = $decl,
|
|
196
|
+
message = "Use logical property 'border-inline-end-color' instead of 'border-right-color'.",
|
|
197
|
+
severity = "warning"
|
|
198
|
+
)
|
|
199
|
+
},
|
|
200
|
+
`border-bottom-color: $val` as $decl where {
|
|
201
|
+
register_diagnostic(
|
|
202
|
+
span = $decl,
|
|
203
|
+
message = "Use logical property 'border-block-end-color' instead of 'border-bottom-color'.",
|
|
204
|
+
severity = "warning"
|
|
205
|
+
)
|
|
206
|
+
},
|
|
207
|
+
`border-left-color: $val` as $decl where {
|
|
208
|
+
register_diagnostic(
|
|
209
|
+
span = $decl,
|
|
210
|
+
message = "Use logical property 'border-inline-start-color' instead of 'border-left-color'.",
|
|
211
|
+
severity = "warning"
|
|
212
|
+
)
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
// Border style
|
|
216
|
+
`border-top-style: $val` as $decl where {
|
|
217
|
+
register_diagnostic(
|
|
218
|
+
span = $decl,
|
|
219
|
+
message = "Use logical property 'border-block-start-style' instead of 'border-top-style'.",
|
|
220
|
+
severity = "warning"
|
|
221
|
+
)
|
|
222
|
+
},
|
|
223
|
+
`border-right-style: $val` as $decl where {
|
|
224
|
+
register_diagnostic(
|
|
225
|
+
span = $decl,
|
|
226
|
+
message = "Use logical property 'border-inline-end-style' instead of 'border-right-style'.",
|
|
227
|
+
severity = "warning"
|
|
228
|
+
)
|
|
229
|
+
},
|
|
230
|
+
`border-bottom-style: $val` as $decl where {
|
|
231
|
+
register_diagnostic(
|
|
232
|
+
span = $decl,
|
|
233
|
+
message = "Use logical property 'border-block-end-style' instead of 'border-bottom-style'.",
|
|
234
|
+
severity = "warning"
|
|
235
|
+
)
|
|
236
|
+
},
|
|
237
|
+
`border-left-style: $val` as $decl where {
|
|
238
|
+
register_diagnostic(
|
|
239
|
+
span = $decl,
|
|
240
|
+
message = "Use logical property 'border-inline-start-style' instead of 'border-left-style'.",
|
|
241
|
+
severity = "warning"
|
|
242
|
+
)
|
|
243
|
+
},
|
|
244
|
+
|
|
245
|
+
// Border width
|
|
246
|
+
`border-top-width: $val` as $decl where {
|
|
247
|
+
register_diagnostic(
|
|
248
|
+
span = $decl,
|
|
249
|
+
message = "Use logical property 'border-block-start-width' instead of 'border-top-width'.",
|
|
250
|
+
severity = "warning"
|
|
251
|
+
)
|
|
252
|
+
},
|
|
253
|
+
`border-right-width: $val` as $decl where {
|
|
254
|
+
register_diagnostic(
|
|
255
|
+
span = $decl,
|
|
256
|
+
message = "Use logical property 'border-inline-end-width' instead of 'border-right-width'.",
|
|
257
|
+
severity = "warning"
|
|
258
|
+
)
|
|
259
|
+
},
|
|
260
|
+
`border-bottom-width: $val` as $decl where {
|
|
261
|
+
register_diagnostic(
|
|
262
|
+
span = $decl,
|
|
263
|
+
message = "Use logical property 'border-block-end-width' instead of 'border-bottom-width'.",
|
|
264
|
+
severity = "warning"
|
|
265
|
+
)
|
|
266
|
+
},
|
|
267
|
+
`border-left-width: $val` as $decl where {
|
|
268
|
+
register_diagnostic(
|
|
269
|
+
span = $decl,
|
|
270
|
+
message = "Use logical property 'border-inline-start-width' instead of 'border-left-width'.",
|
|
271
|
+
severity = "warning"
|
|
272
|
+
)
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
// Border radius
|
|
276
|
+
`border-top-left-radius: $val` as $decl where {
|
|
277
|
+
register_diagnostic(
|
|
278
|
+
span = $decl,
|
|
279
|
+
message = "Use logical property 'border-start-start-radius' instead of 'border-top-left-radius'.",
|
|
280
|
+
severity = "warning"
|
|
281
|
+
)
|
|
282
|
+
},
|
|
283
|
+
`border-top-right-radius: $val` as $decl where {
|
|
284
|
+
register_diagnostic(
|
|
285
|
+
span = $decl,
|
|
286
|
+
message = "Use logical property 'border-start-end-radius' instead of 'border-top-right-radius'.",
|
|
287
|
+
severity = "warning"
|
|
288
|
+
)
|
|
289
|
+
},
|
|
290
|
+
`border-bottom-right-radius: $val` as $decl where {
|
|
291
|
+
register_diagnostic(
|
|
292
|
+
span = $decl,
|
|
293
|
+
message = "Use logical property 'border-end-end-radius' instead of 'border-bottom-right-radius'.",
|
|
294
|
+
severity = "warning"
|
|
295
|
+
)
|
|
296
|
+
},
|
|
297
|
+
`border-bottom-left-radius: $val` as $decl where {
|
|
298
|
+
register_diagnostic(
|
|
299
|
+
span = $decl,
|
|
300
|
+
message = "Use logical property 'border-end-start-radius' instead of 'border-bottom-left-radius'.",
|
|
301
|
+
severity = "warning"
|
|
302
|
+
)
|
|
303
|
+
},
|
|
304
|
+
|
|
305
|
+
// Overflow
|
|
306
|
+
`overflow-x: $val` as $decl where {
|
|
307
|
+
register_diagnostic(
|
|
308
|
+
span = $decl,
|
|
309
|
+
message = "Use logical property 'overflow-inline' instead of 'overflow-x'.",
|
|
310
|
+
severity = "warning"
|
|
311
|
+
)
|
|
312
|
+
},
|
|
313
|
+
`overflow-y: $val` as $decl where {
|
|
314
|
+
register_diagnostic(
|
|
315
|
+
span = $decl,
|
|
316
|
+
message = "Use logical property 'overflow-block' instead of 'overflow-y'.",
|
|
317
|
+
severity = "warning"
|
|
318
|
+
)
|
|
319
|
+
},
|
|
320
|
+
|
|
321
|
+
// Overscroll behavior
|
|
322
|
+
`overscroll-behavior-x: $val` as $decl where {
|
|
323
|
+
register_diagnostic(
|
|
324
|
+
span = $decl,
|
|
325
|
+
message = "Use logical property 'overscroll-behavior-inline' instead of 'overscroll-behavior-x'.",
|
|
326
|
+
severity = "warning"
|
|
327
|
+
)
|
|
328
|
+
},
|
|
329
|
+
`overscroll-behavior-y: $val` as $decl where {
|
|
330
|
+
register_diagnostic(
|
|
331
|
+
span = $decl,
|
|
332
|
+
message = "Use logical property 'overscroll-behavior-block' instead of 'overscroll-behavior-y'.",
|
|
333
|
+
severity = "warning"
|
|
334
|
+
)
|
|
335
|
+
},
|
|
336
|
+
|
|
337
|
+
// Scroll margin
|
|
338
|
+
`scroll-margin-top: $val` as $decl where {
|
|
339
|
+
register_diagnostic(
|
|
340
|
+
span = $decl,
|
|
341
|
+
message = "Use logical property 'scroll-margin-block-start' instead of 'scroll-margin-top'.",
|
|
342
|
+
severity = "warning"
|
|
343
|
+
)
|
|
344
|
+
},
|
|
345
|
+
`scroll-margin-right: $val` as $decl where {
|
|
346
|
+
register_diagnostic(
|
|
347
|
+
span = $decl,
|
|
348
|
+
message = "Use logical property 'scroll-margin-inline-end' instead of 'scroll-margin-right'.",
|
|
349
|
+
severity = "warning"
|
|
350
|
+
)
|
|
351
|
+
},
|
|
352
|
+
`scroll-margin-bottom: $val` as $decl where {
|
|
353
|
+
register_diagnostic(
|
|
354
|
+
span = $decl,
|
|
355
|
+
message = "Use logical property 'scroll-margin-block-end' instead of 'scroll-margin-bottom'.",
|
|
356
|
+
severity = "warning"
|
|
357
|
+
)
|
|
358
|
+
},
|
|
359
|
+
`scroll-margin-left: $val` as $decl where {
|
|
360
|
+
register_diagnostic(
|
|
361
|
+
span = $decl,
|
|
362
|
+
message = "Use logical property 'scroll-margin-inline-start' instead of 'scroll-margin-left'.",
|
|
363
|
+
severity = "warning"
|
|
364
|
+
)
|
|
365
|
+
},
|
|
366
|
+
|
|
367
|
+
// Scroll padding
|
|
368
|
+
`scroll-padding-top: $val` as $decl where {
|
|
369
|
+
register_diagnostic(
|
|
370
|
+
span = $decl,
|
|
371
|
+
message = "Use logical property 'scroll-padding-block-start' instead of 'scroll-padding-top'.",
|
|
372
|
+
severity = "warning"
|
|
373
|
+
)
|
|
374
|
+
},
|
|
375
|
+
`scroll-padding-right: $val` as $decl where {
|
|
376
|
+
register_diagnostic(
|
|
377
|
+
span = $decl,
|
|
378
|
+
message = "Use logical property 'scroll-padding-inline-end' instead of 'scroll-padding-right'.",
|
|
379
|
+
severity = "warning"
|
|
380
|
+
)
|
|
381
|
+
},
|
|
382
|
+
`scroll-padding-bottom: $val` as $decl where {
|
|
383
|
+
register_diagnostic(
|
|
384
|
+
span = $decl,
|
|
385
|
+
message = "Use logical property 'scroll-padding-block-end' instead of 'scroll-padding-bottom'.",
|
|
386
|
+
severity = "warning"
|
|
387
|
+
)
|
|
388
|
+
},
|
|
389
|
+
`scroll-padding-left: $val` as $decl where {
|
|
390
|
+
register_diagnostic(
|
|
391
|
+
span = $decl,
|
|
392
|
+
message = "Use logical property 'scroll-padding-inline-start' instead of 'scroll-padding-left'.",
|
|
393
|
+
severity = "warning"
|
|
394
|
+
)
|
|
395
|
+
}
|
|
396
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
language css;
|
|
2
|
+
|
|
3
|
+
// Detect physical CSS units that should use logical equivalents
|
|
4
|
+
// Longer unit patterns must come before shorter ones to prevent false matches
|
|
5
|
+
or {
|
|
6
|
+
// Dynamic viewport units
|
|
7
|
+
r"[0-9]+\.?[0-9]*dvw" as $val where {
|
|
8
|
+
register_diagnostic(
|
|
9
|
+
span = $val,
|
|
10
|
+
message = "Use logical unit 'dvi' instead of 'dvw'.",
|
|
11
|
+
severity = "warning"
|
|
12
|
+
)
|
|
13
|
+
},
|
|
14
|
+
r"[0-9]+\.?[0-9]*dvh" as $val where {
|
|
15
|
+
register_diagnostic(
|
|
16
|
+
span = $val,
|
|
17
|
+
message = "Use logical unit 'dvb' instead of 'dvh'.",
|
|
18
|
+
severity = "warning"
|
|
19
|
+
)
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
// Small viewport units
|
|
23
|
+
r"[0-9]+\.?[0-9]*svw" as $val where {
|
|
24
|
+
register_diagnostic(
|
|
25
|
+
span = $val,
|
|
26
|
+
message = "Use logical unit 'svi' instead of 'svw'.",
|
|
27
|
+
severity = "warning"
|
|
28
|
+
)
|
|
29
|
+
},
|
|
30
|
+
r"[0-9]+\.?[0-9]*svh" as $val where {
|
|
31
|
+
register_diagnostic(
|
|
32
|
+
span = $val,
|
|
33
|
+
message = "Use logical unit 'svb' instead of 'svh'.",
|
|
34
|
+
severity = "warning"
|
|
35
|
+
)
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
// Large viewport units
|
|
39
|
+
r"[0-9]+\.?[0-9]*lvw" as $val where {
|
|
40
|
+
register_diagnostic(
|
|
41
|
+
span = $val,
|
|
42
|
+
message = "Use logical unit 'lvi' instead of 'lvw'.",
|
|
43
|
+
severity = "warning"
|
|
44
|
+
)
|
|
45
|
+
},
|
|
46
|
+
r"[0-9]+\.?[0-9]*lvh" as $val where {
|
|
47
|
+
register_diagnostic(
|
|
48
|
+
span = $val,
|
|
49
|
+
message = "Use logical unit 'lvb' instead of 'lvh'.",
|
|
50
|
+
severity = "warning"
|
|
51
|
+
)
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
// Container query units
|
|
55
|
+
r"[0-9]+\.?[0-9]*cqw" as $val where {
|
|
56
|
+
register_diagnostic(
|
|
57
|
+
span = $val,
|
|
58
|
+
message = "Use logical unit 'cqi' instead of 'cqw'.",
|
|
59
|
+
severity = "warning"
|
|
60
|
+
)
|
|
61
|
+
},
|
|
62
|
+
r"[0-9]+\.?[0-9]*cqh" as $val where {
|
|
63
|
+
register_diagnostic(
|
|
64
|
+
span = $val,
|
|
65
|
+
message = "Use logical unit 'cqb' instead of 'cqh'.",
|
|
66
|
+
severity = "warning"
|
|
67
|
+
)
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
// Standard viewport units (must come after longer prefixed units)
|
|
71
|
+
r"[0-9]+\.?[0-9]*vw" as $val where {
|
|
72
|
+
register_diagnostic(
|
|
73
|
+
span = $val,
|
|
74
|
+
message = "Use logical unit 'vi' instead of 'vw'.",
|
|
75
|
+
severity = "warning"
|
|
76
|
+
)
|
|
77
|
+
},
|
|
78
|
+
r"[0-9]+\.?[0-9]*vh" as $val where {
|
|
79
|
+
register_diagnostic(
|
|
80
|
+
span = $val,
|
|
81
|
+
message = "Use logical unit 'vb' instead of 'vh'.",
|
|
82
|
+
severity = "warning"
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
language css;
|
|
2
|
+
|
|
3
|
+
// Detect physical CSS values that should use logical equivalents
|
|
4
|
+
or {
|
|
5
|
+
// text-align: left/right
|
|
6
|
+
`text-align: left` as $decl where {
|
|
7
|
+
register_diagnostic(
|
|
8
|
+
span = $decl,
|
|
9
|
+
message = "Use logical value 'start' instead of 'left' for 'text-align'.",
|
|
10
|
+
severity = "warning"
|
|
11
|
+
)
|
|
12
|
+
},
|
|
13
|
+
`text-align: right` as $decl where {
|
|
14
|
+
register_diagnostic(
|
|
15
|
+
span = $decl,
|
|
16
|
+
message = "Use logical value 'end' instead of 'right' for 'text-align'.",
|
|
17
|
+
severity = "warning"
|
|
18
|
+
)
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
// float: left/right
|
|
22
|
+
`float: left` as $decl where {
|
|
23
|
+
register_diagnostic(
|
|
24
|
+
span = $decl,
|
|
25
|
+
message = "Use logical value 'inline-start' instead of 'left' for 'float'.",
|
|
26
|
+
severity = "warning"
|
|
27
|
+
)
|
|
28
|
+
},
|
|
29
|
+
`float: right` as $decl where {
|
|
30
|
+
register_diagnostic(
|
|
31
|
+
span = $decl,
|
|
32
|
+
message = "Use logical value 'inline-end' instead of 'right' for 'float'.",
|
|
33
|
+
severity = "warning"
|
|
34
|
+
)
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
// clear: left/right
|
|
38
|
+
`clear: left` as $decl where {
|
|
39
|
+
register_diagnostic(
|
|
40
|
+
span = $decl,
|
|
41
|
+
message = "Use logical value 'inline-start' instead of 'left' for 'clear'.",
|
|
42
|
+
severity = "warning"
|
|
43
|
+
)
|
|
44
|
+
},
|
|
45
|
+
`clear: right` as $decl where {
|
|
46
|
+
register_diagnostic(
|
|
47
|
+
span = $decl,
|
|
48
|
+
message = "Use logical value 'inline-end' instead of 'right' for 'clear'.",
|
|
49
|
+
severity = "warning"
|
|
50
|
+
)
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
// resize: horizontal/vertical
|
|
54
|
+
`resize: horizontal` as $decl where {
|
|
55
|
+
register_diagnostic(
|
|
56
|
+
span = $decl,
|
|
57
|
+
message = "Use logical value 'inline' instead of 'horizontal' for 'resize'.",
|
|
58
|
+
severity = "warning"
|
|
59
|
+
)
|
|
60
|
+
},
|
|
61
|
+
`resize: vertical` as $decl where {
|
|
62
|
+
register_diagnostic(
|
|
63
|
+
span = $decl,
|
|
64
|
+
message = "Use logical value 'block' instead of 'vertical' for 'resize'.",
|
|
65
|
+
severity = "warning"
|
|
66
|
+
)
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
// caption-side: left/right
|
|
70
|
+
`caption-side: left` as $decl where {
|
|
71
|
+
register_diagnostic(
|
|
72
|
+
span = $decl,
|
|
73
|
+
message = "Use logical value 'inline-start' instead of 'left' for 'caption-side'.",
|
|
74
|
+
severity = "warning"
|
|
75
|
+
)
|
|
76
|
+
},
|
|
77
|
+
`caption-side: right` as $decl where {
|
|
78
|
+
register_diagnostic(
|
|
79
|
+
span = $decl,
|
|
80
|
+
message = "Use logical value 'inline-end' instead of 'right' for 'caption-side'.",
|
|
81
|
+
severity = "warning"
|
|
82
|
+
)
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
// box-orient: horizontal/vertical
|
|
86
|
+
`box-orient: horizontal` as $decl where {
|
|
87
|
+
register_diagnostic(
|
|
88
|
+
span = $decl,
|
|
89
|
+
message = "Use logical value 'inline-axis' instead of 'horizontal' for 'box-orient'.",
|
|
90
|
+
severity = "warning"
|
|
91
|
+
)
|
|
92
|
+
},
|
|
93
|
+
`box-orient: vertical` as $decl where {
|
|
94
|
+
register_diagnostic(
|
|
95
|
+
span = $decl,
|
|
96
|
+
message = "Use logical value 'block-axis' instead of 'vertical' for 'box-orient'.",
|
|
97
|
+
severity = "warning"
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
}
|