@alexlit/lint-kit 198.5.1 → 198.7.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alexlit/lint-kit",
3
- "version": "198.5.1",
3
+ "version": "198.7.0",
4
4
  "private": false,
5
5
  "description": "Preset of configuration files and dependencies for linting web applications (designed for Vue.js with TypeScript)",
6
6
  "keywords": [
@@ -30,7 +30,7 @@ npm i @alexlit/config-stylelint -D
30
30
  'no-nested-media': false,
31
31
 
32
32
  // enable some optional plugins
33
- gamut: true,
33
+ 'gamut': true,
34
34
  'logical-css': true,
35
35
  },
36
36
  {
@@ -55,7 +55,7 @@ npm i @alexlit/config-stylelint -D
55
55
  npx stylelint-find-new-rules
56
56
  ```
57
57
 
58
- ## Usefull links
58
+ ## Useful links
59
59
 
60
60
  - [Awesome StyleLint](https://github.com/stylelint/awesome-stylelint)
61
61
  - [stylelint-scales](https://github.com/jeddy3/stylelint-scales)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alexlit/config-stylelint",
3
- "version": "60.19.6",
3
+ "version": "60.21.0",
4
4
  "private": false,
5
5
  "description": "Stylelint config",
6
6
  "keywords": [
@@ -38,9 +38,6 @@
38
38
  "dependencies": {
39
39
  "@double-great/stylelint-a11y": "^3.5.0",
40
40
  "@morev/stylelint-plugin": "^0.6.1",
41
- "postcss": "^8.5.24",
42
- "postcss-html": "^1.8.1",
43
- "prettier": "^3.9.6",
44
41
  "stylelint": "17.14.1",
45
42
  "stylelint-config-recommended-vue": "^1.6.1",
46
43
  "stylelint-config-standard": "^40.0.0",
@@ -60,6 +57,22 @@
60
57
  "stylelint-selector-no-empty": "^1.0.9",
61
58
  "stylelint-use-nesting": "^6.0.2"
62
59
  },
60
+ "peerDependencies": {
61
+ "postcss": "^8.5.24",
62
+ "postcss-html": "^1.8.1",
63
+ "prettier": "^3.9.6"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "postcss": {
67
+ "optional": true
68
+ },
69
+ "postcss-html": {
70
+ "optional": true
71
+ },
72
+ "prettier": {
73
+ "optional": true
74
+ }
75
+ },
63
76
  "publishConfig": {
64
77
  "access": "public",
65
78
  "registry": "https://registry.npmjs.org/"
@@ -1,3 +1,115 @@
1
+ const LETTERS = 'abcdefghijklmnopqrstuvwxyz'.split('');
2
+
3
+ const MEDIA_FEATURES = [
4
+ '--laptop',
5
+ '--tablet',
6
+ '--mobile',
7
+
8
+ '--reduce-motion',
9
+
10
+ 'any-hover',
11
+ 'any-pointer',
12
+ 'aspect-ratio',
13
+ 'color',
14
+ 'color-gamut',
15
+ 'color-index',
16
+ 'device-aspect-ratio',
17
+ 'device-height',
18
+ 'device-width',
19
+ 'display-mode',
20
+ 'dynamic-range',
21
+ 'environment-blending',
22
+ 'forced-colors',
23
+ 'grid',
24
+ 'height',
25
+ 'horizontal-viewport-segments',
26
+ 'hover',
27
+ 'inverted-colors',
28
+ 'monochrome',
29
+ 'nav-controls',
30
+ 'orientation',
31
+ 'overflow-block',
32
+ 'overflow-inline',
33
+ 'pointer',
34
+ 'prefers-color-scheme',
35
+ 'prefers-contrast',
36
+ 'prefers-reduced-data',
37
+ 'prefers-reduced-motion',
38
+ 'prefers-reduced-transparency',
39
+ 'resolution',
40
+ 'scan',
41
+ 'scripting',
42
+ 'update',
43
+ 'vertical-viewport-segments',
44
+ 'video-color-gamut',
45
+ 'video-dynamic-range',
46
+ 'width',
47
+ ];
48
+
49
+ const AT_RULES = [
50
+ 'annotation',
51
+ 'character-variant',
52
+ 'container',
53
+ 'counter-style',
54
+ 'document',
55
+ 'font-face',
56
+ 'font-feature-values',
57
+ 'keyframes',
58
+ 'media',
59
+ 'ornaments',
60
+ 'page',
61
+ 'screen',
62
+ 'starting-style',
63
+ 'styleset',
64
+ 'stylistic',
65
+ 'supports',
66
+ 'swash',
67
+ 'view-transition',
68
+ 'viewport',
69
+ ];
70
+
71
+ function buildAttributeRules() {
72
+ return [
73
+ ...LETTERS.map((letter) => ({
74
+ selector: new RegExp(String.raw`\[${letter}`),
75
+ type: 'rule',
76
+ })),
77
+ { selector: /\[/, type: 'rule' },
78
+ ];
79
+ }
80
+
81
+ function buildLetterRules(prefix) {
82
+ return [
83
+ ...LETTERS.map((letter) => ({
84
+ selector: new RegExp(`${prefix}${letter}`),
85
+ type: 'rule',
86
+ })),
87
+ { selector: new RegExp(prefix), type: 'rule' },
88
+ ];
89
+ }
90
+
91
+ function buildMediaFeatureRules() {
92
+ return MEDIA_FEATURES.map((parameter) => ({
93
+ name: 'media',
94
+ parameter,
95
+ type: 'at-rule',
96
+ }));
97
+ }
98
+
99
+ function buildPseudoClassRules() {
100
+ return [
101
+ ...LETTERS.map((letter) => ({ selector: `:${letter}`, type: 'rule' })),
102
+ { selector: ':', type: 'rule' },
103
+ ];
104
+ }
105
+
106
+ function buildPseudoElementRules() {
107
+ return [
108
+ ...LETTERS.map((letter) => ({ selector: `::${letter}`, type: 'rule' })),
109
+ { selector: '::', type: 'rule' },
110
+ ];
111
+ }
112
+
1
113
  /**
2
114
  * @type {import('stylelint').Config}
3
115
  *
@@ -18,7 +130,7 @@ export default {
18
130
  { name: 'extend', type: 'at-rule' },
19
131
 
20
132
  // SASS includes
21
- { name: 'include', type: 'at-rule' },
133
+ { hasBlock: false, name: 'include', type: 'at-rule' },
22
134
 
23
135
  // Tailwind applies
24
136
  { name: 'apply', type: 'at-rule' },
@@ -26,487 +138,47 @@ export default {
26
138
  // CSS custom properties
27
139
  'custom-properties',
28
140
 
29
- // SASS aliases
30
- { selector: '%', type: 'rule' },
31
-
32
141
  // Declarations
33
142
  'declarations',
34
143
 
35
- // Root
36
- { name: 'at-root', type: 'at-rule' }, // sass
37
- { name: 'nest', type: 'at-rule' }, // postcss
38
-
39
- // Bootstrap media mixins
40
- { name: 'include', parameter: 'media', type: 'at-rule' },
41
-
42
- // Tailwind@3 breakpoints (from large to small)
43
- { name: 'screen', parameter: '2xl', type: 'at-rule' },
44
- { name: 'screen', parameter: 'xl', type: 'at-rule' },
45
- { name: 'screen', parameter: 'lg', type: 'at-rule' },
46
- { name: 'screen', parameter: 'md', type: 'at-rule' },
47
- { name: 'screen', parameter: 'sm', type: 'at-rule' },
48
-
49
- // Tailwind@4 breakpoints (from large to small)
50
- { name: 'media', parameter: 'breakpoint-2xl', type: 'at-rule' },
51
- { name: 'media', parameter: 'breakpoint-xl', type: 'at-rule' },
52
- { name: 'media', parameter: 'breakpoint-lg', type: 'at-rule' },
53
- { name: 'media', parameter: 'breakpoint-md', type: 'at-rule' },
54
- { name: 'media', parameter: 'breakpoint-sm', type: 'at-rule' },
55
- { name: 'media', parameter: 'container-7xl', type: 'at-rule' },
56
- { name: 'media', parameter: 'container-6xl', type: 'at-rule' },
57
- { name: 'media', parameter: 'container-5xl', type: 'at-rule' },
58
- { name: 'media', parameter: 'container-4xl', type: 'at-rule' },
59
- { name: 'media', parameter: 'container-3xl', type: 'at-rule' },
60
- { name: 'media', parameter: 'container-2xl', type: 'at-rule' },
61
- { name: 'media', parameter: 'container-xl', type: 'at-rule' },
62
- { name: 'media', parameter: 'container-lg', type: 'at-rule' },
63
- { name: 'media', parameter: 'container-md', type: 'at-rule' },
64
- { name: 'media', parameter: 'container-sm', type: 'at-rule' },
65
- { name: 'media', parameter: 'container-xs', type: 'at-rule' },
66
- { name: 'media', parameter: 'container-2xs', type: 'at-rule' },
67
- { name: 'media', parameter: 'container-3xs', type: 'at-rule' },
68
-
69
- // Chrome breakpoints (from large to small)
70
- { name: 'media', parameter: 'laptop-4k', type: 'at-rule' },
71
- { name: 'media', parameter: 'laptop-xl', type: 'at-rule' },
72
- { name: 'media', parameter: 'laptop-l', type: 'at-rule' },
73
- { name: 'media', parameter: 'laptop', type: 'at-rule' },
74
- { name: 'media', parameter: 'tablet', type: 'at-rule' },
75
- { name: 'media', parameter: 'mobile-l', type: 'at-rule' },
76
- { name: 'media', parameter: 'mobile-m', type: 'at-rule' },
77
- { name: 'media', parameter: 'mobile-s', type: 'at-rule' },
78
- { name: 'media', parameter: 'mobile', type: 'at-rule' },
79
-
80
- // Bootstrap breakpoints (from large to small)
81
- { name: 'media', parameter: 'xxl', type: 'at-rule' },
82
- { name: 'media', parameter: 'xl', type: 'at-rule' },
83
- { name: 'media', parameter: 'lg', type: 'at-rule' },
84
- { name: 'media', parameter: 'md', type: 'at-rule' },
85
- { name: 'media', parameter: 'sm', type: 'at-rule' },
86
- { name: 'media', parameter: 'xs', type: 'at-rule' },
87
- { name: 'media', parameter: 'xxs', type: 'at-rule' },
88
-
89
- { name: 'media', type: 'at-rule' },
90
-
91
- { name: 'container', type: 'at-rule' },
92
- { name: 'supports', type: 'at-rule' },
93
- { name: 'document', type: 'at-rule' },
94
- { name: 'page', type: 'at-rule' },
95
-
96
- // Nested
97
- { name: 'font-face', type: 'at-rule' },
98
- { name: 'keyframes', type: 'at-rule' },
99
- { name: 'viewport', type: 'at-rule' },
100
- { name: 'counter-style', type: 'at-rule' },
101
-
102
- // Font-feature
103
- { name: 'font-feature-values', type: 'at-rule' },
104
- { name: 'swash', type: 'at-rule' },
105
- { name: 'ornaments', type: 'at-rule' },
106
- { name: 'annotation', type: 'at-rule' },
107
- { name: 'stylistic', type: 'at-rule' },
108
- { name: 'styleset', type: 'at-rule' },
109
- { name: 'character-variant', type: 'at-rule' },
110
-
111
- // Transition
112
- { name: 'starting-style', type: 'at-rule' },
113
- { name: 'view-transition', type: 'at-rule' },
144
+ // Media features
145
+ ...buildMediaFeatureRules(),
114
146
 
147
+ // At-rules
148
+ ...AT_RULES.map((name) => ({ name, type: 'at-rule' })),
115
149
  'at-rules',
116
150
 
117
- // Linguistic pseudo-classes
118
- { selector: ':dir', type: 'rule' },
119
- { selector: ':lang', type: 'rule' },
120
-
121
- // Location pseudo-classes
122
- { selector: ':any-link', type: 'rule' },
123
- { selector: ':link', type: 'rule' },
124
- { selector: ':visited', type: 'rule' },
125
- { selector: ':local-link', type: 'rule' },
126
- { selector: ':target', type: 'rule' },
127
- { selector: ':target-within', type: 'rule' },
128
- { selector: ':scope', type: 'rule' },
129
-
130
- // User action pseudo-classes
131
- { selector: ':hover', type: 'rule' },
132
- { selector: ':active', type: 'rule' },
133
- { selector: ':focus', type: 'rule' },
134
- { selector: ':focus-visible', type: 'rule' },
135
- { selector: ':focus-within', type: 'rule' },
136
-
137
- // Time-dimensional pseudo-classes
138
- { selector: ':current', type: 'rule' },
139
- { selector: ':past', type: 'rule' },
140
- { selector: ':future', type: 'rule' },
141
-
142
- // Resource state pseudo-classes
143
- { selector: ':playing', type: 'rule' },
144
- { selector: ':paused', type: 'rule' },
145
-
146
- // The input pseudo-classes
147
- { selector: ':enabled', type: 'rule' },
148
- { selector: ':disabled', type: 'rule' },
149
- { selector: ':read-only', type: 'rule' },
150
- { selector: ':read-write', type: 'rule' },
151
- { selector: ':placeholder-shown', type: 'rule' },
152
- { selector: ':default', type: 'rule' },
153
- { selector: ':checked', type: 'rule' },
154
- { selector: ':indeterminate', type: 'rule' },
155
- { selector: ':blank', type: 'rule' },
156
- { selector: ':valid', type: 'rule' },
157
- { selector: ':invalid', type: 'rule' },
158
- { selector: ':in-range', type: 'rule' },
159
- { selector: ':out-of-range', type: 'rule' },
160
- { selector: ':required', type: 'rule' },
161
- { selector: ':optional', type: 'rule' },
162
- { selector: ':user-invalid', type: 'rule' },
163
-
164
- // Tree-structural pseudo-classes
165
- { selector: ':root', type: 'rule' },
166
- { selector: ':empty', type: 'rule' },
167
- { selector: ':nth-child', type: 'rule' },
168
- { selector: ':nth-last-child', type: 'rule' },
169
- { selector: ':first-child', type: 'rule' },
170
- { selector: ':last-child', type: 'rule' },
171
- { selector: ':only-child', type: 'rule' },
172
- { selector: ':nth-of-type', type: 'rule' },
173
- { selector: ':nth-last-of-type', type: 'rule' },
174
- { selector: ':first-of-type', type: 'rule' },
175
- { selector: ':last-of-type', type: 'rule' },
176
- { selector: ':only-of-type', type: 'rule' },
177
-
178
- // Other pseudo-classes
179
- { selector: ':any', type: 'rule' },
180
- { selector: ':defined', type: 'rule' },
181
- { selector: ':first', type: 'rule' },
182
- { selector: ':fullscreen', type: 'rule' },
183
- { selector: ':has', type: 'rule' },
184
- { selector: ':host', type: 'rule' },
185
- { selector: ':host-context', type: 'rule' },
186
- { selector: ':is', type: 'rule' },
187
- { selector: ':left', type: 'rule' },
188
- { selector: ':matches', type: 'rule' },
189
- { selector: ':not', type: 'rule' },
190
- { selector: ':right', type: 'rule' },
191
- { selector: ':where', type: 'rule' },
151
+ // Pseudo-classes
152
+ ...buildPseudoClassRules(),
192
153
 
193
- // Pseudo elements
194
- { selector: '::before', type: 'rule' },
195
- { selector: '::after', type: 'rule' },
154
+ // Pseudo-elements
155
+ ...buildPseudoElementRules(),
196
156
 
197
- // Text
198
- { selector: '::first-letter', type: 'rule' },
199
- { selector: '::first-line', type: 'rule' },
200
-
201
- // Style
202
- { selector: '::selection', type: 'rule' },
203
- { selector: '::marker', type: 'rule' },
204
- { selector: '::placeholder', type: 'rule' },
205
- { selector: '::backdrop', type: 'rule' },
206
- { selector: '::file-selector-button', type: 'rule' },
207
-
208
- // Web video text tracks format
209
- { selector: '::cue', type: 'rule' },
210
- { selector: '::cue-region', type: 'rule' },
211
-
212
- // Web components
213
- { selector: '::part', type: 'rule' },
214
- { selector: '::slotted', type: 'rule' },
215
-
216
- // Spell checker
217
- { selector: '::grammar-error', type: 'rule' },
218
- { selector: '::spelling-error', type: 'rule' },
219
-
220
- // Vendors
221
- { selector: '::-khtml-', type: 'rule' },
222
- { selector: '::-moz-', type: 'rule' },
223
- { selector: '::-ms-', type: 'rule' },
224
- { selector: '::-o-', type: 'rule' },
225
- { selector: '::-webkit-', type: 'rule' },
226
-
227
- // Deep
228
- { selector: '::v-deep', type: 'rule' },
229
-
230
- { selector: '::', type: 'rule' },
157
+ // ID selector
158
+ { selector: /#/, type: 'rule' },
231
159
 
232
160
  // Selector list
233
161
  { selector: ',', type: 'rule' },
234
162
 
235
- // Class selector
236
- { selector: /\.a/, type: 'rule' },
237
- { selector: /\.b/, type: 'rule' },
238
- { selector: /\.c/, type: 'rule' },
239
- { selector: /\.d/, type: 'rule' },
240
- { selector: /\.e/, type: 'rule' },
241
- { selector: /\.f/, type: 'rule' },
242
- { selector: /\.g/, type: 'rule' },
243
- { selector: /\.h/, type: 'rule' },
244
- { selector: /\.i/, type: 'rule' },
245
- { selector: /\.j/, type: 'rule' },
246
- { selector: /\.k/, type: 'rule' },
247
- { selector: /\.l/, type: 'rule' },
248
- { selector: /\.m/, type: 'rule' },
249
- { selector: /\.n/, type: 'rule' },
250
- { selector: /\.o/, type: 'rule' },
251
- { selector: /\.p/, type: 'rule' },
252
- { selector: /\.q/, type: 'rule' },
253
- { selector: /\.r/, type: 'rule' },
254
- { selector: /\.s/, type: 'rule' },
255
- { selector: /\.t/, type: 'rule' },
256
- { selector: /\.u/, type: 'rule' },
257
- { selector: /\.v/, type: 'rule' },
258
- { selector: /\.w/, type: 'rule' },
259
- { selector: /\.x/, type: 'rule' },
260
- { selector: /\.w/, type: 'rule' },
261
- { selector: /\.z/, type: 'rule' },
262
- { selector: /\./, type: 'rule' },
163
+ // Class selectors
164
+ ...buildLetterRules(String.raw`\.`),
263
165
 
264
- // ID selector
265
- { selector: /#/, type: 'rule' },
166
+ // Attribute selectors
167
+ ...buildAttributeRules(),
266
168
 
267
- // Universal selector
169
+ // Combinators
268
170
  { selector: /\*/, type: 'rule' },
269
-
270
- // Attribute selector
271
- { selector: /\[accept/, type: 'rule' },
272
- { selector: /\[accept-charset/, type: 'rule' },
273
- { selector: /\[accesskey/, type: 'rule' },
274
- { selector: /\[action/, type: 'rule' },
275
- { selector: /\[align/, type: 'rule' },
276
- { selector: /\[alt/, type: 'rule' },
277
- { selector: /\[async/, type: 'rule' },
278
- { selector: /\[autocomplete/, type: 'rule' },
279
- { selector: /\[autofocus/, type: 'rule' },
280
- { selector: /\[autoplay/, type: 'rule' },
281
- { selector: /\[bgcolor/, type: 'rule' },
282
- { selector: /\[border/, type: 'rule' },
283
- { selector: /\[charset/, type: 'rule' },
284
- { selector: /\[checked/, type: 'rule' },
285
- { selector: /\[cite/, type: 'rule' },
286
- { selector: /\[class/, type: 'rule' },
287
- { selector: /\[color/, type: 'rule' },
288
- { selector: /\[cols/, type: 'rule' },
289
- { selector: /\[colspan/, type: 'rule' },
290
- { selector: /\[content/, type: 'rule' },
291
- { selector: /\[contenteditable/, type: 'rule' },
292
- { selector: /\[controls/, type: 'rule' },
293
- { selector: /\[coords/, type: 'rule' },
294
- { selector: /\[data/, type: 'rule' },
295
- { selector: /\[data-/, type: 'rule' },
296
- { selector: /\[datetime/, type: 'rule' },
297
- { selector: /\[default/, type: 'rule' },
298
- { selector: /\[defer/, type: 'rule' },
299
- { selector: /\[dir/, type: 'rule' },
300
- { selector: /\[dirname/, type: 'rule' },
301
- { selector: /\[disabled/, type: 'rule' },
302
- { selector: /\[download/, type: 'rule' },
303
- { selector: /\[draggable/, type: 'rule' },
304
- { selector: /\[enctype/, type: 'rule' },
305
- { selector: /\[for/, type: 'rule' },
306
- { selector: /\[form/, type: 'rule' },
307
- { selector: /\[formaction/, type: 'rule' },
308
- { selector: /\[headers/, type: 'rule' },
309
- { selector: /\[height/, type: 'rule' },
310
- { selector: /\[hidden/, type: 'rule' },
311
- { selector: /\[high/, type: 'rule' },
312
- { selector: /\[href/, type: 'rule' },
313
- { selector: /\[hreflang/, type: 'rule' },
314
- { selector: /\[http-equiv/, type: 'rule' },
315
- { selector: /\[id/, type: 'rule' },
316
- { selector: /\[ismap/, type: 'rule' },
317
- { selector: /\[kind/, type: 'rule' },
318
- { selector: /\[label/, type: 'rule' },
319
- { selector: /\[lang/, type: 'rule' },
320
- { selector: /\[list/, type: 'rule' },
321
- { selector: /\[loop/, type: 'rule' },
322
- { selector: /\[low/, type: 'rule' },
323
- { selector: /\[max/, type: 'rule' },
324
- { selector: /\[maxlength/, type: 'rule' },
325
- { selector: /\[media/, type: 'rule' },
326
- { selector: /\[method/, type: 'rule' },
327
- { selector: /\[min/, type: 'rule' },
328
- { selector: /\[multiple/, type: 'rule' },
329
- { selector: /\[muted/, type: 'rule' },
330
- { selector: /\[name/, type: 'rule' },
331
- { selector: /\[novalidate/, type: 'rule' },
332
- { selector: /\[onabort/, type: 'rule' },
333
- { selector: /\[onafterprint/, type: 'rule' },
334
- { selector: /\[onbeforeprint/, type: 'rule' },
335
- { selector: /\[onbeforeunload/, type: 'rule' },
336
- { selector: /\[onblur/, type: 'rule' },
337
- { selector: /\[oncanplay/, type: 'rule' },
338
- { selector: /\[oncanplaythrough/, type: 'rule' },
339
- { selector: /\[onchange/, type: 'rule' },
340
- { selector: /\[onclick/, type: 'rule' },
341
- { selector: /\[oncontextmenu/, type: 'rule' },
342
- { selector: /\[oncopy/, type: 'rule' },
343
- { selector: /\[oncuechange/, type: 'rule' },
344
- { selector: /\[oncut/, type: 'rule' },
345
- { selector: /\[ondblclick/, type: 'rule' },
346
- { selector: /\[ondrag/, type: 'rule' },
347
- { selector: /\[ondragend/, type: 'rule' },
348
- { selector: /\[ondragenter/, type: 'rule' },
349
- { selector: /\[ondragleave/, type: 'rule' },
350
- { selector: /\[ondragover/, type: 'rule' },
351
- { selector: /\[ondragstart/, type: 'rule' },
352
- { selector: /\[ondrop/, type: 'rule' },
353
- { selector: /\[ondurationchange/, type: 'rule' },
354
- { selector: /\[onemptied/, type: 'rule' },
355
- { selector: /\[onended/, type: 'rule' },
356
- { selector: /\[onerror/, type: 'rule' },
357
- { selector: /\[onfocus/, type: 'rule' },
358
- { selector: /\[onhashchange/, type: 'rule' },
359
- { selector: /\[oninput/, type: 'rule' },
360
- { selector: /\[oninvalid/, type: 'rule' },
361
- { selector: /\[onkeydown/, type: 'rule' },
362
- { selector: /\[onkeypress/, type: 'rule' },
363
- { selector: /\[onkeyup/, type: 'rule' },
364
- { selector: /\[onload/, type: 'rule' },
365
- { selector: /\[onloadeddata/, type: 'rule' },
366
- { selector: /\[onloadedmetadata/, type: 'rule' },
367
- { selector: /\[onloadstart/, type: 'rule' },
368
- { selector: /\[onmousedown/, type: 'rule' },
369
- { selector: /\[onmousemove/, type: 'rule' },
370
- { selector: /\[onmouseout/, type: 'rule' },
371
- { selector: /\[onmouseover/, type: 'rule' },
372
- { selector: /\[onmouseup/, type: 'rule' },
373
- { selector: /\[onmousewheel/, type: 'rule' },
374
- { selector: /\[onoffline/, type: 'rule' },
375
- { selector: /\[ononline/, type: 'rule' },
376
- { selector: /\[onpagehide/, type: 'rule' },
377
- { selector: /\[onpageshow/, type: 'rule' },
378
- { selector: /\[onpaste/, type: 'rule' },
379
- { selector: /\[onpause/, type: 'rule' },
380
- { selector: /\[onplay/, type: 'rule' },
381
- { selector: /\[onplaying/, type: 'rule' },
382
- { selector: /\[onpopstate/, type: 'rule' },
383
- { selector: /\[onprogress/, type: 'rule' },
384
- { selector: /\[onratechange/, type: 'rule' },
385
- { selector: /\[onreset/, type: 'rule' },
386
- { selector: /\[onresize/, type: 'rule' },
387
- { selector: /\[onscroll/, type: 'rule' },
388
- { selector: /\[onsearch/, type: 'rule' },
389
- { selector: /\[onseeked/, type: 'rule' },
390
- { selector: /\[onseeking/, type: 'rule' },
391
- { selector: /\[onselect/, type: 'rule' },
392
- { selector: /\[onstalled/, type: 'rule' },
393
- { selector: /\[onstorage/, type: 'rule' },
394
- { selector: /\[onsubmit/, type: 'rule' },
395
- { selector: /\[onsuspend/, type: 'rule' },
396
- { selector: /\[ontimeupdate/, type: 'rule' },
397
- { selector: /\[ontoggle/, type: 'rule' },
398
- { selector: /\[onunload/, type: 'rule' },
399
- { selector: /\[onvolumechange/, type: 'rule' },
400
- { selector: /\[onwaiting/, type: 'rule' },
401
- { selector: /\[onwheel/, type: 'rule' },
402
- { selector: /\[open/, type: 'rule' },
403
- { selector: /\[optimum/, type: 'rule' },
404
- { selector: /\[pattern/, type: 'rule' },
405
- { selector: /\[placeholder/, type: 'rule' },
406
- { selector: /\[poster/, type: 'rule' },
407
- { selector: /\[preload/, type: 'rule' },
408
- { selector: /\[readonly/, type: 'rule' },
409
- { selector: /\[rel/, type: 'rule' },
410
- { selector: /\[required/, type: 'rule' },
411
- { selector: /\[reversed/, type: 'rule' },
412
- { selector: /\[rows/, type: 'rule' },
413
- { selector: /\[rowspan/, type: 'rule' },
414
- { selector: /\[sandbox/, type: 'rule' },
415
- { selector: /\[scope/, type: 'rule' },
416
- { selector: /\[selected/, type: 'rule' },
417
- { selector: /\[shape/, type: 'rule' },
418
- { selector: /\[size/, type: 'rule' },
419
- { selector: /\[sizes/, type: 'rule' },
420
- { selector: /\[span/, type: 'rule' },
421
- { selector: /\[spellcheck/, type: 'rule' },
422
- { selector: /\[src/, type: 'rule' },
423
- { selector: /\[srcdoc/, type: 'rule' },
424
- { selector: /\[srclang/, type: 'rule' },
425
- { selector: /\[srcset/, type: 'rule' },
426
- { selector: /\[start/, type: 'rule' },
427
- { selector: /\[step/, type: 'rule' },
428
- { selector: /\[style/, type: 'rule' },
429
- { selector: /\[tabindex/, type: 'rule' },
430
- { selector: /\[target/, type: 'rule' },
431
- { selector: /\[title/, type: 'rule' },
432
- { selector: /\[translate/, type: 'rule' },
433
- { selector: /\[type/, type: 'rule' },
434
- { selector: /\[usemap/, type: 'rule' },
435
- { selector: /\[value/, type: 'rule' },
436
- { selector: /\[width/, type: 'rule' },
437
- { selector: /\[/, type: 'rule' },
438
-
439
- // Adjacent sibling combinator
440
171
  { selector: /\+/, type: 'rule' },
441
-
442
- // General sibling combinator
443
- { selector: /~/, type: 'rule' },
444
-
445
- // Child combinator
446
172
  { selector: />/, type: 'rule' },
447
-
448
- // Column combinator
449
173
  { selector: /\|\|/, type: 'rule' },
450
-
451
- // Other combinators
174
+ { selector: /~/, type: 'rule' },
452
175
  'rules',
453
176
 
454
- // BEM class
455
- { selector: /--a/, type: 'rule' },
456
- { selector: /--b/, type: 'rule' },
457
- { selector: /--c/, type: 'rule' },
458
- { selector: /--d/, type: 'rule' },
459
- { selector: /--e/, type: 'rule' },
460
- { selector: /--f/, type: 'rule' },
461
- { selector: /--g/, type: 'rule' },
462
- { selector: /--h/, type: 'rule' },
463
- { selector: /--i/, type: 'rule' },
464
- { selector: /--j/, type: 'rule' },
465
- { selector: /--k/, type: 'rule' },
466
- { selector: /--l/, type: 'rule' },
467
- { selector: /--m/, type: 'rule' },
468
- { selector: /--n/, type: 'rule' },
469
- { selector: /--o/, type: 'rule' },
470
- { selector: /--p/, type: 'rule' },
471
- { selector: /--q/, type: 'rule' },
472
- { selector: /--r/, type: 'rule' },
473
- { selector: /--s/, type: 'rule' },
474
- { selector: /--t/, type: 'rule' },
475
- { selector: /--u/, type: 'rule' },
476
- { selector: /--v/, type: 'rule' },
477
- { selector: /--w/, type: 'rule' },
478
- { selector: /--x/, type: 'rule' },
479
- { selector: /--w/, type: 'rule' },
480
- { selector: /--z/, type: 'rule' },
481
- { selector: /--/, type: 'rule' },
177
+ // BEM modifier
178
+ ...buildLetterRules('--'),
482
179
 
483
- { selector: /__a/, type: 'rule' },
484
- { selector: /__b/, type: 'rule' },
485
- { selector: /__c/, type: 'rule' },
486
- { selector: /__d/, type: 'rule' },
487
- { selector: /__e/, type: 'rule' },
488
- { selector: /__f/, type: 'rule' },
489
- { selector: /__g/, type: 'rule' },
490
- { selector: /__h/, type: 'rule' },
491
- { selector: /__i/, type: 'rule' },
492
- { selector: /__j/, type: 'rule' },
493
- { selector: /__k/, type: 'rule' },
494
- { selector: /__l/, type: 'rule' },
495
- { selector: /__m/, type: 'rule' },
496
- { selector: /__n/, type: 'rule' },
497
- { selector: /__o/, type: 'rule' },
498
- { selector: /__p/, type: 'rule' },
499
- { selector: /__q/, type: 'rule' },
500
- { selector: /__r/, type: 'rule' },
501
- { selector: /__s/, type: 'rule' },
502
- { selector: /__t/, type: 'rule' },
503
- { selector: /__u/, type: 'rule' },
504
- { selector: /__v/, type: 'rule' },
505
- { selector: /__w/, type: 'rule' },
506
- { selector: /__x/, type: 'rule' },
507
- { selector: /__w/, type: 'rule' },
508
- { selector: /__z/, type: 'rule' },
509
- { selector: /__/, type: 'rule' },
180
+ // BEM element
181
+ ...buildLetterRules('__'),
510
182
  ],
511
183
  'order/properties-alphabetical-order': true,
512
184
  },