stylelint-plugin-rhythmguard 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/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +349 -0
- package/assets/rhythmguard-banner.svg +42 -0
- package/assets/rhythmguard-rules.svg +45 -0
- package/package.json +68 -0
- package/src/configs/recommended.js +13 -0
- package/src/configs/strict.js +25 -0
- package/src/index.js +19 -0
- package/src/presets/index.js +13 -0
- package/src/presets/scales.js +122 -0
- package/src/rules/no-offscale-transform/index.js +169 -0
- package/src/rules/prefer-token/index.js +188 -0
- package/src/rules/use-scale/index.js +246 -0
- package/src/utils/constants.js +41 -0
- package/src/utils/length.js +139 -0
- package/src/utils/options.js +92 -0
- package/src/utils/value-utils.js +120 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `stylelint-plugin-rhythmguard` will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format follows Keep a Changelog principles and semantic versioning.
|
|
6
|
+
|
|
7
|
+
## [0.1.0] - 2026-02-16
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Core spacing governance rules:
|
|
12
|
+
- `rhythmguard/use-scale`
|
|
13
|
+
- `rhythmguard/prefer-token`
|
|
14
|
+
- `rhythmguard/no-offscale-transform`
|
|
15
|
+
- Autofix support for deterministic nearest-scale replacement and explicit token map replacement.
|
|
16
|
+
- Built-in config entry points:
|
|
17
|
+
- `stylelint-plugin-rhythmguard/configs/recommended`
|
|
18
|
+
- `stylelint-plugin-rhythmguard/configs/strict`
|
|
19
|
+
- Built-in scale presets and aliases across product, editorial, and modular/theory-driven systems.
|
|
20
|
+
- Preset helpers exported via `stylelint-plugin-rhythmguard/presets`.
|
|
21
|
+
- Unit tests, coverage reports, and benchmark scripts.
|
|
22
|
+
- Release workflow with npm provenance publishing.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="./assets/rhythmguard-banner.svg" width="100%" alt="Rhythmguard banner in Geist Pixel" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# stylelint-plugin-rhythmguard
|
|
6
|
+
|
|
7
|
+
High-precision spacing governance for CSS and design systems.
|
|
8
|
+
|
|
9
|
+
[](https://github.com/petrilahdelma/stylelint-plugin-rhythmguard/actions/workflows/ci.yml)
|
|
10
|
+
[](https://www.npmjs.com/package/stylelint-plugin-rhythmguard)
|
|
11
|
+
[](https://www.npmjs.com/package/stylelint-plugin-rhythmguard)
|
|
12
|
+
[](./LICENSE)
|
|
13
|
+
[](https://nodejs.org/)
|
|
14
|
+
|
|
15
|
+
`stylelint-plugin-rhythmguard` enforces spacing discipline across margin, padding, gap, inset, scroll spacing, and translate motion offsets.
|
|
16
|
+
|
|
17
|
+
It is built for teams that want:
|
|
18
|
+
|
|
19
|
+
- zero random spacing values in production CSS
|
|
20
|
+
- token-first spacing workflows
|
|
21
|
+
- predictable autofix behavior for large migrations
|
|
22
|
+
- consistent layout rhythm across web surfaces
|
|
23
|
+
|
|
24
|
+
## Rule Matrix
|
|
25
|
+
|
|
26
|
+
<p align="center">
|
|
27
|
+
<img src="./assets/rhythmguard-rules.svg" width="100%" alt="Rhythmguard rule matrix visual" />
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
| Rule | What it does | Autofix |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `rhythmguard/use-scale` | Enforces spacing values must be on your configured scale | Yes, nearest safe value |
|
|
33
|
+
| `rhythmguard/prefer-token` | Enforces token usage over raw spacing literals | Yes, with `tokenMap` |
|
|
34
|
+
| `rhythmguard/no-offscale-transform` | Enforces scale-aligned `translate*` motion offsets | Yes, nearest safe value |
|
|
35
|
+
|
|
36
|
+
## Installation
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install --save-dev stylelint stylelint-plugin-rhythmguard
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Quick Start
|
|
43
|
+
|
|
44
|
+
### Recommended config
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"plugins": ["stylelint-plugin-rhythmguard"],
|
|
49
|
+
"extends": ["stylelint-plugin-rhythmguard/configs/recommended"]
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Strict config
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"plugins": ["stylelint-plugin-rhythmguard"],
|
|
58
|
+
"extends": ["stylelint-plugin-rhythmguard/configs/strict"]
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Stable shared config entry points:
|
|
63
|
+
|
|
64
|
+
- `stylelint-plugin-rhythmguard/configs/recommended`
|
|
65
|
+
- `stylelint-plugin-rhythmguard/configs/strict`
|
|
66
|
+
|
|
67
|
+
### Full custom setup
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"plugins": ["stylelint-plugin-rhythmguard"],
|
|
72
|
+
"rules": {
|
|
73
|
+
"rhythmguard/use-scale": [
|
|
74
|
+
true,
|
|
75
|
+
{
|
|
76
|
+
"preset": "rhythmic-4",
|
|
77
|
+
"units": ["px", "rem", "em"],
|
|
78
|
+
"baseFontSize": 16,
|
|
79
|
+
"tokenPattern": "^--space-",
|
|
80
|
+
"tokenFunctions": ["var", "theme", "token"],
|
|
81
|
+
"allowNegative": true,
|
|
82
|
+
"allowPercentages": true,
|
|
83
|
+
"fixToScale": true
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"rhythmguard/prefer-token": [
|
|
87
|
+
true,
|
|
88
|
+
{
|
|
89
|
+
"tokenPattern": "^--space-",
|
|
90
|
+
"allowNumericScale": false,
|
|
91
|
+
"tokenMap": {
|
|
92
|
+
"4px": "var(--space-1)",
|
|
93
|
+
"8px": "var(--space-2)",
|
|
94
|
+
"12px": "var(--space-3)",
|
|
95
|
+
"16px": "var(--space-4)"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"rhythmguard/no-offscale-transform": [
|
|
100
|
+
true,
|
|
101
|
+
{
|
|
102
|
+
"scale": [0, 4, 8, 12, 16, 24, 32]
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Presets and custom scales
|
|
110
|
+
|
|
111
|
+
Preset-based setup:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"rules": {
|
|
116
|
+
"rhythmguard/use-scale": [true, { "preset": "fibonacci" }]
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Custom scale setup:
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"rules": {
|
|
126
|
+
"rhythmguard/use-scale": [true, { "customScale": [0, 6, 12, 18, 24, 36, 48] }]
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Scale resolution precedence:
|
|
132
|
+
|
|
133
|
+
1. `customScale` (highest priority)
|
|
134
|
+
2. `scale`
|
|
135
|
+
3. `preset`
|
|
136
|
+
4. default `rhythmic-4` scale
|
|
137
|
+
|
|
138
|
+
## Built-in Scale Presets
|
|
139
|
+
|
|
140
|
+
| Preset | Pattern | Scale |
|
|
141
|
+
| --- | --- | --- |
|
|
142
|
+
| `rhythmic-4` | 4pt rhythm | `[0,4,8,12,16,24,32,40,48,64]` |
|
|
143
|
+
| `rhythmic-8` | 8pt rhythm | `[0,8,16,24,32,40,48,64,80,96]` |
|
|
144
|
+
| `product-material-8dp` | Material 8dp baseline + 4dp increments | `[0,4,8,12,16,24,32,40,48,56,64,72,80]` |
|
|
145
|
+
| `product-atlassian-8px` | Atlassian-like product spacing progression | `[0,2,4,6,8,12,16,20,24,32,40,48,64,80]` |
|
|
146
|
+
| `product-carbon-2x` | Carbon 2x spacing progression | `[0,2,4,8,12,16,24,32,40,48,64,80]` |
|
|
147
|
+
| `editorial-baseline-4` | editorial baseline rhythm at 4-unit cadence | `[0,4,8,12,16,20,24,28,32,40,48,56,64]` |
|
|
148
|
+
| `editorial-baseline-6` | editorial baseline rhythm at 6-unit cadence | `[0,6,12,18,24,30,36,48,60,72]` |
|
|
149
|
+
| `compact` | dense UI spacing | `[0,2,4,6,8,12,16,20,24,32]` |
|
|
150
|
+
| `fibonacci` | Fibonacci progression | `[0,2,3,5,8,13,21,34,55,89]` |
|
|
151
|
+
| `powers-of-two` | geometric doubling | `[0,2,4,8,16,32,64,128]` |
|
|
152
|
+
| `golden-ratio` | ratio 1.618 | generated modular sequence |
|
|
153
|
+
| `modular-major-second` | ratio 1.125 | generated modular sequence |
|
|
154
|
+
| `modular-minor-third` | ratio 1.2 | generated modular sequence |
|
|
155
|
+
| `modular-major-third` | ratio 1.25 | generated modular sequence |
|
|
156
|
+
| `modular-augmented-fourth` | ratio 1.414 | generated modular sequence |
|
|
157
|
+
| `modular-perfect-fourth` | ratio 1.333 | generated modular sequence |
|
|
158
|
+
| `modular-perfect-fifth` | ratio 1.5 | generated modular sequence |
|
|
159
|
+
|
|
160
|
+
Aliases:
|
|
161
|
+
|
|
162
|
+
- `4pt` → `rhythmic-4`
|
|
163
|
+
- `8pt` → `rhythmic-8`
|
|
164
|
+
- `material` → `product-material-8dp`
|
|
165
|
+
- `atlassian-8` → `product-atlassian-8px`
|
|
166
|
+
- `carbon` → `product-carbon-2x`
|
|
167
|
+
- `baseline-4` → `editorial-baseline-4`
|
|
168
|
+
- `baseline-6` → `editorial-baseline-6`
|
|
169
|
+
- `golden` → `golden-ratio`
|
|
170
|
+
- `major-second` → `modular-major-second`
|
|
171
|
+
- `minor-third` → `modular-minor-third`
|
|
172
|
+
- `major-third` → `modular-major-third`
|
|
173
|
+
- `augmented-fourth` → `modular-augmented-fourth`
|
|
174
|
+
- `perfect-fourth` → `modular-perfect-fourth`
|
|
175
|
+
- `perfect-fifth` → `modular-perfect-fifth`
|
|
176
|
+
|
|
177
|
+
### Preset Rationale
|
|
178
|
+
|
|
179
|
+
- Product presets are based on widely-used design-system spacing frameworks.
|
|
180
|
+
- Editorial presets model baseline-grid cadence used in long-form typography and column layouts.
|
|
181
|
+
- Theory presets expose mathematically-derived modular scales from design theory and typographic proportion systems.
|
|
182
|
+
- Full research notes and sources are documented in [`docs/SCALE_RESEARCH.md`](./docs/SCALE_RESEARCH.md).
|
|
183
|
+
|
|
184
|
+
## Rule Details
|
|
185
|
+
|
|
186
|
+
### `rhythmguard/use-scale`
|
|
187
|
+
|
|
188
|
+
Enforces spacing literals to stay on a configured numeric scale.
|
|
189
|
+
|
|
190
|
+
Checks:
|
|
191
|
+
|
|
192
|
+
- `margin*`, `padding*`
|
|
193
|
+
- `gap`, `row-gap`, `column-gap`
|
|
194
|
+
- `inset*`, `scroll-margin*`, `scroll-padding*`
|
|
195
|
+
- `translate`, `translate-x`, `translate-y`, `translate-z`
|
|
196
|
+
- `transform` translation functions (`translate`, `translateX`, `translateY`, `translateZ`, `translate3d`)
|
|
197
|
+
|
|
198
|
+
Example:
|
|
199
|
+
|
|
200
|
+
```css
|
|
201
|
+
/* ❌ Off-scale */
|
|
202
|
+
.card {
|
|
203
|
+
margin: 13px;
|
|
204
|
+
transform: translateY(18px);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* ✅ On-scale */
|
|
208
|
+
.card {
|
|
209
|
+
margin: 12px;
|
|
210
|
+
transform: translateY(16px);
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Options:
|
|
215
|
+
|
|
216
|
+
| Option | Type | Default | Description |
|
|
217
|
+
| --- | --- | --- | --- |
|
|
218
|
+
| `preset` | `string` | `rhythmic-4` | Selects a built-in spacing scale |
|
|
219
|
+
| `customScale` | `Array<number|string>` | `undefined` | Highest-priority custom scale override |
|
|
220
|
+
| `scale` | `Array<number|string>` | `[0,4,8,12,16,24,32,40,48,64]` | Allowed spacing values |
|
|
221
|
+
| `units` | `string[]` | `['px','rem','em']` | Units considered for scale enforcement |
|
|
222
|
+
| `baseFontSize` | `number` | `16` | Used for `rem`/`em` conversion |
|
|
223
|
+
| `tokenPattern` | `string` | `^--space-` | Regex for accepted token variable names |
|
|
224
|
+
| `tokenFunctions` | `string[]` | `['var','theme','token']` | Functions treated as tokenized values |
|
|
225
|
+
| `allowNegative` | `boolean` | `true` | Allows negative scale values |
|
|
226
|
+
| `allowPercentages` | `boolean` | `true` | Allows `%` values without scale checks |
|
|
227
|
+
| `fixToScale` | `boolean` | `true` | Enables nearest-value autofix |
|
|
228
|
+
| `enforceInsideMathFunctions` | `boolean` | `false` | Lints `calc()/clamp()/min()/max()` internals |
|
|
229
|
+
| `properties` | `Array<string|RegExp>` | built-in spacing patterns | Override targeted property set |
|
|
230
|
+
|
|
231
|
+
### `rhythmguard/prefer-token`
|
|
232
|
+
|
|
233
|
+
Enforces token usage for spacing declarations. This is ideal once your token system is stable.
|
|
234
|
+
|
|
235
|
+
Example:
|
|
236
|
+
|
|
237
|
+
```css
|
|
238
|
+
/* ❌ Raw literals */
|
|
239
|
+
.stack {
|
|
240
|
+
gap: 12px;
|
|
241
|
+
padding: 16px;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* ✅ Tokenized */
|
|
245
|
+
.stack {
|
|
246
|
+
gap: var(--space-3);
|
|
247
|
+
padding: var(--space-4);
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Options:
|
|
252
|
+
|
|
253
|
+
| Option | Type | Default | Description |
|
|
254
|
+
| --- | --- | --- | --- |
|
|
255
|
+
| `tokenPattern` | `string` | `^--space-` | Regex for accepted token variable names |
|
|
256
|
+
| `tokenFunctions` | `string[]` | `['var','theme','token']` | Functions treated as tokenized values |
|
|
257
|
+
| `allowNumericScale` | `boolean` | `false` | Temporary migration mode to permit on-scale literals |
|
|
258
|
+
| `preset` | `string` | `rhythmic-4` | Selects a built-in scale used in migration mode |
|
|
259
|
+
| `customScale` | `Array<number|string>` | `undefined` | Highest-priority custom scale override |
|
|
260
|
+
| `scale` | `Array<number|string>` | `[0,4,8,12,16,24,32,40,48,64]` | Used when `allowNumericScale` is enabled |
|
|
261
|
+
| `baseFontSize` | `number` | `16` | Used for scale checks with `rem`/`em` |
|
|
262
|
+
| `tokenMap` | `Record<string,string>` | `{}` | Enables autofix from raw value to token |
|
|
263
|
+
| `ignoreValues` | `string[]` | CSS global keywords + `auto` | Skips keyword literals |
|
|
264
|
+
| `properties` | `Array<string|RegExp>` | built-in spacing patterns | Override targeted property set |
|
|
265
|
+
|
|
266
|
+
### `rhythmguard/no-offscale-transform`
|
|
267
|
+
|
|
268
|
+
Specialized guardrail for motion spacing consistency in translation transforms.
|
|
269
|
+
|
|
270
|
+
Example:
|
|
271
|
+
|
|
272
|
+
```css
|
|
273
|
+
/* ❌ Off-scale motion */
|
|
274
|
+
.toast {
|
|
275
|
+
transform: translateY(18px) scale(1);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* ✅ Motion on spacing scale */
|
|
279
|
+
.toast {
|
|
280
|
+
transform: translateY(16px) scale(1);
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
Options:
|
|
285
|
+
|
|
286
|
+
`rhythmguard/no-offscale-transform` accepts the same scale options as `rhythmguard/use-scale`, but only for transform translation properties.
|
|
287
|
+
|
|
288
|
+
## Programmatic Presets
|
|
289
|
+
|
|
290
|
+
```js
|
|
291
|
+
const rhythmguard = require('stylelint-plugin-rhythmguard');
|
|
292
|
+
|
|
293
|
+
console.log(rhythmguard.presets.listScalePresetNames());
|
|
294
|
+
console.log(rhythmguard.presets.scales['rhythmic-4']);
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Autofix Philosophy
|
|
298
|
+
|
|
299
|
+
Rhythmguard only applies deterministic fixes:
|
|
300
|
+
|
|
301
|
+
- nearest scale value for numeric off-scale literals
|
|
302
|
+
- explicit `tokenMap` replacements for token migration
|
|
303
|
+
|
|
304
|
+
It will not guess token mappings without your map.
|
|
305
|
+
|
|
306
|
+
## Compatibility
|
|
307
|
+
|
|
308
|
+
- Stylelint: `^16.0.0`
|
|
309
|
+
- Node.js: `>=18.18.0`
|
|
310
|
+
- Module format: CommonJS plugin package
|
|
311
|
+
|
|
312
|
+
## Development
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
npm install
|
|
316
|
+
npm run lint
|
|
317
|
+
npm test
|
|
318
|
+
npm run test:coverage
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Performance Benchmarking
|
|
322
|
+
|
|
323
|
+
Compare runtime against `stylelint-scales` on a deterministic spacing corpus:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
npm run bench:perf
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Benchmark with autofix enabled:
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
npm run bench:perf:fix
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
Detailed methodology and custom args are documented in [`docs/BENCHMARKING.md`](./docs/BENCHMARKING.md).
|
|
336
|
+
|
|
337
|
+
## Release Workflow
|
|
338
|
+
|
|
339
|
+
1. Create a GitHub release.
|
|
340
|
+
2. `release.yml` runs lint + tests.
|
|
341
|
+
3. The package is published to npm with provenance (`npm publish --provenance`).
|
|
342
|
+
|
|
343
|
+
## Visual System Note
|
|
344
|
+
|
|
345
|
+
The repository visuals are SVG-only, black/white only (`#000` / `#fff`), and use the locally installed **Vercel Geist Pixel** font.
|
|
346
|
+
|
|
347
|
+
## License
|
|
348
|
+
|
|
349
|
+
MIT. See [`LICENSE`](./LICENSE).
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<svg width="1400" height="420" viewBox="0 0 1400 420" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Rhythmguard</title>
|
|
3
|
+
<desc id="desc">Black and white banner using Geist Pixel font.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<style>
|
|
6
|
+
@font-face {
|
|
7
|
+
font-family: 'GeistPixel';
|
|
8
|
+
src: url("data:font/woff2;base64,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") format('woff2');
|
|
9
|
+
font-weight: 400;
|
|
10
|
+
font-style: normal;
|
|
11
|
+
}
|
|
12
|
+
.bg { fill: #000; }
|
|
13
|
+
.fg { fill: #fff; }
|
|
14
|
+
.line { stroke: #fff; stroke-width: 2; }
|
|
15
|
+
.stroke { stroke: #fff; stroke-width: 3; fill: none; }
|
|
16
|
+
.title { font-family: 'GeistPixel', monospace; font-size: 86px; letter-spacing: 1px; }
|
|
17
|
+
.subtitle { font-family: 'GeistPixel', monospace; font-size: 24px; letter-spacing: 1px; }
|
|
18
|
+
.meta { font-family: 'GeistPixel', monospace; font-size: 18px; }
|
|
19
|
+
</style>
|
|
20
|
+
</defs>
|
|
21
|
+
|
|
22
|
+
<rect class="bg" x="0" y="0" width="1400" height="420" />
|
|
23
|
+
<rect class="stroke" x="18" y="18" width="1364" height="384" />
|
|
24
|
+
|
|
25
|
+
<line class="line" x1="18" y1="96" x2="1382" y2="96" />
|
|
26
|
+
<line class="line" x1="18" y1="324" x2="1382" y2="324" />
|
|
27
|
+
|
|
28
|
+
<text class="meta fg" x="42" y="68">STYLELINT PLUGIN · SPACING GOVERNANCE · TOKEN-FIRST</text>
|
|
29
|
+
|
|
30
|
+
<text class="title fg" x="42" y="222">RHYTHMGUARD</text>
|
|
31
|
+
<text class="subtitle fg" x="42" y="275">NO RANDOM 13PX. SCALE OR TOKEN. PERIOD.</text>
|
|
32
|
+
|
|
33
|
+
<g>
|
|
34
|
+
<rect class="stroke" x="1010" y="130" width="330" height="170" />
|
|
35
|
+
<text class="meta fg" x="1034" y="168">RULES</text>
|
|
36
|
+
<text class="meta fg" x="1034" y="202">1. use-scale</text>
|
|
37
|
+
<text class="meta fg" x="1034" y="232">2. prefer-token</text>
|
|
38
|
+
<text class="meta fg" x="1034" y="262">3. no-offscale-transform</text>
|
|
39
|
+
</g>
|
|
40
|
+
|
|
41
|
+
<text class="meta fg" x="42" y="370">REAL-WORLD TOOLING / COPYRIGHT (C) 2026 PETRI LAHDELMA</text>
|
|
42
|
+
</svg>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<svg width="1400" height="560" viewBox="0 0 1400 560" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Rhythmguard Rule Matrix</title>
|
|
3
|
+
<desc id="desc">Rule coverage matrix visual in black and white with Geist Pixel font.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<style>
|
|
6
|
+
@font-face {
|
|
7
|
+
font-family: 'GeistPixel';
|
|
8
|
+
src: url("data:font/woff2;base64,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") format('woff2');
|
|
9
|
+
font-weight: 400;
|
|
10
|
+
font-style: normal;
|
|
11
|
+
}
|
|
12
|
+
.bg { fill: #000; }
|
|
13
|
+
.fg { fill: #fff; }
|
|
14
|
+
.stroke { stroke: #fff; stroke-width: 2; fill: none; }
|
|
15
|
+
.title { font-family: 'GeistPixel', monospace; font-size: 46px; }
|
|
16
|
+
.label { font-family: 'GeistPixel', monospace; font-size: 20px; dominant-baseline: middle; }
|
|
17
|
+
.body { font-family: 'GeistPixel', monospace; font-size: 18px; dominant-baseline: middle; }
|
|
18
|
+
</style>
|
|
19
|
+
</defs>
|
|
20
|
+
|
|
21
|
+
<rect class="bg" x="0" y="0" width="1400" height="560"/>
|
|
22
|
+
<rect class="stroke" x="18" y="18" width="1364" height="524"/>
|
|
23
|
+
|
|
24
|
+
<text class="title fg" x="42" y="76">RHYTHMGUARD RULE MATRIX</text>
|
|
25
|
+
|
|
26
|
+
<rect class="stroke" x="42" y="110" width="1316" height="96"/>
|
|
27
|
+
<text class="label fg" x="68" y="158">RULE</text>
|
|
28
|
+
<text class="label fg" x="418" y="158">WHAT IT ENFORCES</text>
|
|
29
|
+
<text class="label fg" x="940" y="158">FIX STRATEGY</text>
|
|
30
|
+
|
|
31
|
+
<rect class="stroke" x="42" y="206" width="1316" height="106"/>
|
|
32
|
+
<text class="body fg" x="68" y="259">rhythmguard/use-scale</text>
|
|
33
|
+
<text class="body fg" x="418" y="259">Spacing values must be on your scale</text>
|
|
34
|
+
<text class="body fg" x="940" y="259">Nearest safe scale value</text>
|
|
35
|
+
|
|
36
|
+
<rect class="stroke" x="42" y="312" width="1316" height="106"/>
|
|
37
|
+
<text class="body fg" x="68" y="365">rhythmguard/prefer-token</text>
|
|
38
|
+
<text class="body fg" x="418" y="365">Raw spacing replaced by tokens</text>
|
|
39
|
+
<text class="body fg" x="940" y="365">tokenMap-guided replacement</text>
|
|
40
|
+
|
|
41
|
+
<rect class="stroke" x="42" y="418" width="1316" height="106"/>
|
|
42
|
+
<text class="body fg" x="68" y="471">rhythmguard/no-offscale-transform</text>
|
|
43
|
+
<text class="body fg" x="418" y="471">translate() motion offset on scale</text>
|
|
44
|
+
<text class="body fg" x="940" y="471">Nearest translate value</text>
|
|
45
|
+
</svg>
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "stylelint-plugin-rhythmguard",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Enterprise-grade Stylelint plugin for spacing scale and token enforcement",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"stylelint",
|
|
7
|
+
"stylelint-plugin",
|
|
8
|
+
"css",
|
|
9
|
+
"design-system",
|
|
10
|
+
"design-tokens",
|
|
11
|
+
"spacing",
|
|
12
|
+
"linting"
|
|
13
|
+
],
|
|
14
|
+
"type": "commonjs",
|
|
15
|
+
"main": "src/index.js",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": "./src/index.js",
|
|
18
|
+
"./configs/recommended": "./src/configs/recommended.js",
|
|
19
|
+
"./configs/strict": "./src/configs/strict.js",
|
|
20
|
+
"./presets": "./src/presets/index.js",
|
|
21
|
+
"./rules/use-scale": "./src/rules/use-scale/index.js",
|
|
22
|
+
"./rules/prefer-token": "./src/rules/prefer-token/index.js",
|
|
23
|
+
"./rules/no-offscale-transform": "./src/rules/no-offscale-transform/index.js"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"assets",
|
|
27
|
+
"src",
|
|
28
|
+
"README.md",
|
|
29
|
+
"CHANGELOG.md",
|
|
30
|
+
"LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"bench:perf": "node scripts/bench/compare.mjs",
|
|
34
|
+
"bench:perf:fix": "node scripts/bench/compare.mjs --fix",
|
|
35
|
+
"lint": "eslint .",
|
|
36
|
+
"test": "node --test test/*.test.js",
|
|
37
|
+
"test:compat-floor": "node --test test/floor-compat.test.js",
|
|
38
|
+
"test:watch": "node --test --watch test/*.test.js",
|
|
39
|
+
"test:coverage": "c8 --reporter=text --reporter=lcov node --test test/*.test.js"
|
|
40
|
+
},
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/petrilahdelma/stylelint-plugin-rhythmguard.git"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/petrilahdelma/stylelint-plugin-rhythmguard#readme",
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/petrilahdelma/stylelint-plugin-rhythmguard/issues"
|
|
48
|
+
},
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"stylelint": "^16.0.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@eslint/js": "^9.22.0",
|
|
54
|
+
"c8": "^10.1.3",
|
|
55
|
+
"eslint": "^9.22.0",
|
|
56
|
+
"geist": "^1.7.0",
|
|
57
|
+
"postcss-value-parser": "^4.2.0",
|
|
58
|
+
"stylelint": "^16.15.0",
|
|
59
|
+
"stylelint-scales": "^5.0.0"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=18.18.0"
|
|
63
|
+
},
|
|
64
|
+
"publishConfig": {
|
|
65
|
+
"access": "public"
|
|
66
|
+
},
|
|
67
|
+
"license": "MIT"
|
|
68
|
+
}
|