@etus/seven-skill 0.1.0-beta.1

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 (42) hide show
  1. package/.claude/skills/seven/SKILL.md +162 -0
  2. package/.claude/skills/seven/reference/audit.md +120 -0
  3. package/.claude/skills/seven/reference/brand.md +24 -0
  4. package/.claude/skills/seven/reference/clarify.md +76 -0
  5. package/.claude/skills/seven/reference/color-and-contrast.md +84 -0
  6. package/.claude/skills/seven/reference/motion-design.md +71 -0
  7. package/.claude/skills/seven/reference/polish.md +55 -0
  8. package/.claude/skills/seven/reference/product.md +45 -0
  9. package/.claude/skills/seven/reference/shape.md +85 -0
  10. package/.claude/skills/seven/reference/spatial-design.md +60 -0
  11. package/.claude/skills/seven/reference/typography.md +43 -0
  12. package/.claude/skills/seven/reference/ux-writing.md +47 -0
  13. package/.claude/skills/seven/scripts/load-context.mjs +84 -0
  14. package/.claude-plugin/marketplace.json +34 -0
  15. package/.claude-plugin/plugin.json +12 -0
  16. package/LICENSE +190 -0
  17. package/NOTICE.md +26 -0
  18. package/README.md +118 -0
  19. package/cli/bin/commands/skills.mjs +664 -0
  20. package/cli/bin/seven.mjs +68 -0
  21. package/cli/engine/browser/injected/index.mjs +84 -0
  22. package/cli/engine/cli/main.mjs +215 -0
  23. package/cli/engine/detect-antipatterns-browser.js +3014 -0
  24. package/cli/engine/detect-antipatterns.mjs +44 -0
  25. package/cli/engine/engines/browser/detect-url.mjs +108 -0
  26. package/cli/engine/engines/regex/detect-text.mjs +508 -0
  27. package/cli/engine/engines/static-html/css-cascade.mjs +957 -0
  28. package/cli/engine/engines/static-html/detect-html.mjs +211 -0
  29. package/cli/engine/engines/visual/screenshot-contrast.mjs +192 -0
  30. package/cli/engine/findings.mjs +28 -0
  31. package/cli/engine/node/file-system.mjs +212 -0
  32. package/cli/engine/profile/profiler.mjs +169 -0
  33. package/cli/engine/registry/seven-antipatterns.mjs +494 -0
  34. package/cli/engine/rules/checks.mjs +1518 -0
  35. package/cli/engine/shared/color.mjs +204 -0
  36. package/cli/engine/shared/constants.mjs +91 -0
  37. package/cli/engine/shared/page.mjs +9 -0
  38. package/cli/engine/shared/tokens.mjs +153 -0
  39. package/cli/engine/token-data.generated.mjs +691 -0
  40. package/docs/detector-rules.md +605 -0
  41. package/docs/figma-token-rule-exploration.md +185 -0
  42. package/package.json +76 -0
@@ -0,0 +1,605 @@
1
+ # Catálogo de regras do detector Seven
2
+
3
+ Referência canônica das 35 regras do detector determinístico `@etus/seven-skill`
4
+ (`npx seven detect`). Cada regra tem um ID estável, uma categoria, a
5
+ justificativa de design, um exemplo errado/certo e a referência ao documento
6
+ do design system que a fundamenta.
7
+
8
+ Este arquivo é gerado a partir do conhecimento de design; a fonte executável
9
+ das regras é `cli/engine/registry/seven-antipatterns.mjs` (catálogo) e
10
+ `cli/engine/rules/checks.mjs` (funções de check). Se divergirem, o código é a
11
+ verdade — atualize este doc.
12
+
13
+ ## Como ler
14
+
15
+ - **Categoria** — `quality` (drift de design real, problema de a11y) ou `slop`
16
+ (tell de UI gerada por IA, no sabor Seven).
17
+ - **Engines** — todas as 35 regras rodam nos três engines: `regex` (arquivos
18
+ de código), `static-html` (arquivos HTML, com a cascata CSS resolvida) e
19
+ `browser` (URLs vivas via Puppeteer, com `getComputedStyle` real).
20
+ - **Referência** — o documento em `source/reference/` que documenta a regra
21
+ de design para os agentes de IA. É onde a regra "vive" como guideline.
22
+ - **Exit codes** — `seven detect` sai com `0` limpo, `2` com findings, `1`
23
+ erro de uso.
24
+
25
+ ## Exemções
26
+
27
+ Algumas regras pulam código que legitimamente carrega o padrão:
28
+
29
+ - `non-inter-font`, `fuchsia-in-ui-chrome`, `pure-black-or-white`,
30
+ `hardcoded-color-not-token` pulam os pacotes internos `@etus/ui`,
31
+ `@etus/tokens`, `@etus/seven-skill` (resolvidos pelo `package.json` mais próximo).
32
+ - `hardcoded-color-not-token` e `pure-black-or-white` pulam
33
+ `packages/tokens/sources/` — são os arquivos que *definem* os tokens.
34
+ - Arquivos `.stories.*`, `.test.*`, `.spec.*` e `.md` nunca são escaneados:
35
+ scaffold de demo/teste e documentação carregam exemplos intencionais de
36
+ anti-pattern.
37
+ - Fixtures de teste (`/tests/fixtures/`) são sempre escaneadas, sem exemção.
38
+
39
+ ---
40
+
41
+ ## Grounding — token vs heurística
42
+
43
+ Cada uma das 35 regras tem um veredito de grounding, inspecionável via
44
+ `getRuleGrounding(id)` no registry:
45
+
46
+ - **`token`** — os dados da regra vêm do snapshot de `@etus/tokens`
47
+ (`token-data.generated.mjs`, gerado de `tokens.meta.json`). A regra
48
+ acompanha o design system automaticamente: quando o Figma muda um token e
49
+ `@etus/tokens` rebuilda, a regra se atualiza no próximo `build:tokens`.
50
+ - **`heuristic`** — a regra reforça um fato de linguagem, um mecanismo de
51
+ CSS/tooling, um padrão estrutural ou um standard de a11y que nenhum token
52
+ define. `heuristic` é um veredito deliberado, não uma regra inacabada.
53
+
54
+ **8 regras token-grounded:** `non-inter-font`, `hardcoded-color-not-token`,
55
+ `raw-tailwind-palette-color`, `pure-black-or-white`, `tiny-text`,
56
+ `radius-mixed-scales`, `pill-on-button`, `bounce-easing`. As outras 27 são
57
+ heurísticas — o veredito honesto da auditoria: nem toda regra de design tem
58
+ um token que a informe (em-dash, vocabulário pt-PT, ratio de contraste WCAG,
59
+ mecânica do Lightning CSS, geometria de a11y).
60
+
61
+ ---
62
+
63
+ ## Regras de texto — fundacionais (1-9)
64
+
65
+ Detectam drift que aparece direto no código-fonte.
66
+
67
+ ### 1. `non-inter-font` · `quality`
68
+
69
+ **O que detecta** — uma declaração `font-family` cuja face primária não é
70
+ Inter, JetBrains Mono ou um fallback de sistema.
71
+
72
+ **Justificativa** — Seven é Inter-only para sans e JetBrains Mono para código.
73
+ Uma face diferente quebra a identidade tipográfica na primeira olhada. Esta
74
+ regra é a *inversão* da `overused-font` do impeccable: o impeccable bane Inter
75
+ por ubiquidade; o Seven a exige.
76
+
77
+ **Exemplo**
78
+
79
+ ```css
80
+ /* errado */
81
+ .heading { font-family: 'Space Grotesk', sans-serif; }
82
+ /* certo */
83
+ .heading { font-family: Inter, system-ui, sans-serif; }
84
+ ```
85
+
86
+ **Referência** — `source/reference/typography.md`.
87
+
88
+ ### 2. `hardcoded-color-not-token` · `quality`
89
+
90
+ **O que detecta** — um literal de cor (hex, `rgb()`, `hsl()`, `oklch()`) em
91
+ código de runtime onde existe uma variável CSS de `@etus/tokens`.
92
+
93
+ **Justificativa** — código de runtime consome `var(--token)`. Cor literal não
94
+ participa do theming (light/dark) e diverge silenciosamente do Figma. Literais
95
+ só são válidos dentro de `packages/tokens/sources/`, onde os tokens nascem.
96
+
97
+ **Exemplo**
98
+
99
+ ```tsx
100
+ /* errado */
101
+ <div style={{ background: '#19e699' }} />
102
+ /* certo */
103
+ <div className="bg-[color:var(--primary)]" />
104
+ ```
105
+
106
+ **Referência** — `source/reference/color-and-contrast.md`.
107
+
108
+ ### 3. `raw-tailwind-palette-color` · `quality`
109
+
110
+ **O que detecta** — uma utility de cor da paleta default do Tailwind
111
+ (`bg-green-500`, `text-neutral-900`, `border-red-200`, `ring-blue-500`).
112
+
113
+ **Justificativa** — uma classe da paleta Tailwind pinta uma cor que fura
114
+ `@etus/tokens` exatamente como um literal hex faz: a escala de tokens nunca
115
+ vê aquela cor. O detector pegava `#19e699` mas deixava `bg-green-500` passar.
116
+ Token-grounded: cada família de hue mapeia pra um role semântico do Seven, e
117
+ a regra nomeia o token real do snapshot (`bg-green-500` aponta pra
118
+ `--status-success-background`, `text-red-700` pra `--status-destructive-background`).
119
+
120
+ **Exemplo**
121
+
122
+ ```tsx
123
+ /* errado */ <button className="bg-green-500 text-neutral-900" />
124
+ /* certo */ <button className="bg-[color:var(--brand-primary-background)]" />
125
+ ```
126
+
127
+ **Referência** — `source/reference/color-and-contrast.md`. Exime os pacotes
128
+ internos do Seven e os paths de definição de token, como as outras regras de
129
+ cor.
130
+
131
+ ### 4. `missing-color-type-hint` · `quality`
132
+
133
+ **O que detecta** — um valor arbitrário Tailwind v4 referenciando um token de
134
+ cor sem o hint `color:` (ex.: `bg-[var(--primary)]`).
135
+
136
+ **Justificativa** — o Tailwind v4 usa Lightning CSS, que exige type hints para
137
+ valores ambíguos. Sem o `color:`, o valor OKLCH é descartado silenciosamente —
138
+ o estilo simplesmente não aplica e não há erro.
139
+
140
+ **Exemplo**
141
+
142
+ ```tsx
143
+ /* errado */ <button className="bg-[var(--button-primary-bg)]" />
144
+ /* certo */ <button className="bg-[color:var(--button-primary-bg)]" />
145
+ ```
146
+
147
+ **Referência** — `source/reference/color-and-contrast.md`.
148
+
149
+ ### 5. `missing-length-type-hint` · `quality`
150
+
151
+ **O que detecta** — um `text-[var(--*)]` arbitrário que resolve para um length
152
+ (font-size) sem o hint `length:`.
153
+
154
+ **Justificativa** — mesma armadilha do Lightning CSS da regra 4, no eixo de
155
+ tamanho de fonte. `text-[var(--x)]` sem hint é dropado.
156
+
157
+ **Exemplo**
158
+
159
+ ```tsx
160
+ /* errado */ <h2 className="text-[var(--tabs-trigger-base-text)]" />
161
+ /* certo */ <h2 className="text-[length:var(--tabs-trigger-base-text)]" />
162
+ ```
163
+
164
+ **Referência** — `source/reference/color-and-contrast.md`.
165
+
166
+ ### 6. `leading-none-with-length-var` · `quality`
167
+
168
+ **O que detecta** — `leading-none` combinado com `text-[length:var(--*)]` na
169
+ mesma lista de classes.
170
+
171
+ **Justificativa** — no Tailwind v4 essa combinação zera a `line-height` (vira
172
+ `0px` em vez de `1`), escondendo o texto. É uma armadilha real já documentada
173
+ na memória do projeto. Use `leading-tight`, `leading-snug`, um literal
174
+ `leading-[1.1]`, ou estilo inline.
175
+
176
+ **Exemplo**
177
+
178
+ ```tsx
179
+ /* errado */ <span className="leading-none text-[length:var(--badge-text)]" />
180
+ /* certo */ <span className="leading-tight text-[length:var(--badge-text)]" />
181
+ ```
182
+
183
+ **Referência** — `source/reference/typography.md`.
184
+
185
+ ### 7. `fuchsia-in-ui-chrome` · `slop`
186
+
187
+ **O que detecta** — uma cor fuchsia em chrome de UI (botões, inputs, bordas).
188
+ Permitida dentro de `<svg>` e em elementos com `data-role="chart"`.
189
+
190
+ **Justificativa** — fuchsia no Seven é exclusiva de gráficos. Em chrome ela
191
+ lê como um acento "AI roxo/magenta" decorativo, não como identidade. A marca
192
+ é mint e lime.
193
+
194
+ **Exemplo**
195
+
196
+ ```tsx
197
+ /* errado */ <button style={{ background: '#d946ef' }}>Salvar</button>
198
+ /* certo */ <svg data-role="chart"><circle fill="#d946ef" /></svg>
199
+ ```
200
+
201
+ **Referência** — `source/reference/color-and-contrast.md`.
202
+
203
+ ### 8. `pt-pt-vocab` · `quality`
204
+
205
+ **O que detecta** — vocabulário de português europeu em chrome pt-BR
206
+ (`ficheiro`, `telemóvel`, `ecrã`, `utilizador`, ...).
207
+
208
+ **Justificativa** — o copy de produto do Seven é português brasileiro. Termos
209
+ pt-PT quebram a voz e soam estrangeiros para o usuário.
210
+
211
+ **Exemplo**
212
+
213
+ ```tsx
214
+ /* errado */ <p>Carregue o ficheiro.</p>
215
+ /* certo */ <p>Envie o arquivo.</p>
216
+ ```
217
+
218
+ **Referência** — `source/reference/ux-writing.md`.
219
+
220
+ ### 9. `pure-black-or-white` · `quality`
221
+
222
+ **O que detecta** — `#000`/`#fff` puro (ou `rgb(0,0,0)`/`rgb(255,255,255)`).
223
+
224
+ **Justificativa** — Seven usa neutros tintados do ramp OKLCH. Preto e branco
225
+ puros leem como duros e não-refinados; o ramp tintado dá profundidade.
226
+
227
+ **Exemplo**
228
+
229
+ ```css
230
+ /* errado */ .text { color: #000; }
231
+ /* certo */ .text { color: var(--foreground); }
232
+ ```
233
+
234
+ **Referência** — `source/reference/color-and-contrast.md`.
235
+
236
+ ---
237
+
238
+ ## Regras invertidas / retunadas do impeccable (10-12)
239
+
240
+ Regras do impeccable que existem no Seven mas com semântica adaptada.
241
+
242
+ ### 10. `side-stripe-border` · `slop`
243
+
244
+ **O que detecta** — uma `border-left`/`border-right` mais grossa que 1px usada
245
+ como stripe de acento colorido. (Funde as regras `side-tab` e
246
+ `border-accent-on-rounded` do impeccable.)
247
+
248
+ **Justificativa** — a faixa lateral colorida é o tell mais reconhecível de UI
249
+ gerada por IA. Seven carrega hierarquia com borda completa de 1px
250
+ `var(--border)`, tint de fundo, ícone-líder, ou reestruturando o elemento.
251
+
252
+ **Exemplo**
253
+
254
+ ```tsx
255
+ /* errado */ <div className="border-l-4 border-l-orange-500" />
256
+ /* certo */ <div className="border border-[color:var(--border)]" />
257
+ ```
258
+
259
+ **Referência** — `source/reference/spatial-design.md`. *Nota: o detector só
260
+ dispara quando há classe de cor acentuada; um `border-l-2` neutro é um
261
+ divisor estrutural, não um stripe.*
262
+
263
+ ### 11. `gradient-text-decorative` · `slop`
264
+
265
+ **O que detecta** — texto com gradiente (`background-clip: text` +
266
+ `linear-gradient`).
267
+
268
+ **Justificativa** — gradiente em texto é decoração, não significado. Seven usa
269
+ cor sólida do ramp OKLCH; ênfase vem de peso e escala, não de gradiente.
270
+
271
+ **Exemplo**
272
+
273
+ ```tsx
274
+ /* errado */ <h1 className="bg-gradient-to-r from-primary bg-clip-text text-transparent" />
275
+ /* certo */ <h1 className="text-[color:var(--foreground)] font-bold" />
276
+ ```
277
+
278
+ **Referência** — `source/reference/color-and-contrast.md`.
279
+
280
+ ### 12. `shadows-not-borders` · `slop`
281
+
282
+ **O que detecta** — um box-shadow colorido e borrado em superfície escura (o
283
+ "dark glow" da IA), ou um shadow fazendo o papel de chrome de card.
284
+
285
+ **Justificativa** — Seven dá hierarquia a cards com bordas de 1px. Shadow é
286
+ reservado para overlays (modais, dropdowns, popovers) e o plate do logo.
287
+
288
+ **Exemplo**
289
+
290
+ ```css
291
+ /* errado */ .card { box-shadow: 0 0 24px rgba(217,70,239,0.4); }
292
+ /* certo */ .card { border: 1px solid var(--border); }
293
+ ```
294
+
295
+ **Referência** — `source/reference/spatial-design.md`.
296
+
297
+ ---
298
+
299
+ ## Regras universais de qualidade / a11y (13-29)
300
+
301
+ Boas práticas de design e acessibilidade que valem para qualquer UI.
302
+
303
+ ### 13. `low-contrast` · `quality`
304
+
305
+ **O que detecta** — texto que não atinge o contraste WCAG 2.1 AA (4.5:1 corpo,
306
+ 3:1 texto grande).
307
+
308
+ **Justificativa** — contraste insuficiente é uma falha de acessibilidade real.
309
+ WCAG 2.1 AA é o baseline obrigatório do Seven.
310
+
311
+ **Exemplo** — par `var(--muted-foreground)` sobre `var(--background)` não passa
312
+ em corpo; use `var(--foreground)`.
313
+
314
+ **Referência** — `source/reference/color-and-contrast.md`.
315
+
316
+ ### 14. `gray-on-color` · `quality`
317
+
318
+ **O que detecta** — texto cinza sobre fundo colorido.
319
+
320
+ **Justificativa** — cinza fica lavado sobre cor. Use uma sombra mais escura do
321
+ próprio matiz do fundo, ou um foreground quase-branco, para contraste legível.
322
+
323
+ **Exemplo**
324
+
325
+ ```tsx
326
+ /* errado */ <div className="bg-blue-600 text-gray-400" />
327
+ /* certo */ <div className="bg-blue-600 text-white" />
328
+ ```
329
+
330
+ **Referência** — `source/reference/color-and-contrast.md`.
331
+
332
+ ### 15. `nested-cards` · `slop`
333
+
334
+ **O que detecta** — um card dentro de um card.
335
+
336
+ **Justificativa** — card aninhado cria ruído visual e profundidade excessiva.
337
+ Seven achata a hierarquia: use divisor de seção, lista rotulada, ou `Tabs`.
338
+
339
+ **Referência** — `source/reference/spatial-design.md`.
340
+
341
+ ### 16. `monotonous-spacing` · `quality`
342
+
343
+ **O que detecta** — o mesmo valor de espaçamento usado em todo lugar.
344
+
345
+ **Justificativa** — padding idêntico em tudo lê como wireframe. O ritmo do
346
+ Seven é intencional: mais apertado dentro de um card, mais solto entre cards,
347
+ mais solto ainda entre seções.
348
+
349
+ **Referência** — `source/reference/spatial-design.md`.
350
+
351
+ ### 17. `flat-type-hierarchy` · `quality`
352
+
353
+ **O que detecta** — tamanhos de fonte muito próximos entre si.
354
+
355
+ **Justificativa** — escala achatada não cria hierarquia. Caminhe o ramp
356
+ Text/Heading do Seven; combine escala com contraste de peso.
357
+
358
+ **Referência** — `source/reference/typography.md`.
359
+
360
+ ### 18. `layout-transition` · `quality`
361
+
362
+ **O que detecta** — animação de `width`, `height`, `padding` ou `margin`.
363
+
364
+ **Justificativa** — animar propriedades de layout dispara reflow e fica janky.
365
+ Seven anima só `transform` e `opacity`.
366
+
367
+ **Exemplo**
368
+
369
+ ```css
370
+ /* errado */ .x { transition: width 200ms; }
371
+ /* certo */ .x { transition: transform 200ms var(--ease-default); }
372
+ ```
373
+
374
+ **Referência** — `source/reference/motion-design.md`.
375
+
376
+ ### 19. `line-length` · `quality`
377
+
378
+ **O que detecta** — linhas de texto mais largas que ~80 caracteres.
379
+
380
+ **Justificativa** — linhas longas cansam: o olho perde o início da próxima.
381
+ Use `max-width` de 65ch a 75ch em containers de texto.
382
+
383
+ **Referência** — `source/reference/spatial-design.md`.
384
+
385
+ ### 20. `cramped-padding` · `quality`
386
+
387
+ **O que detecta** — texto colado na borda do container.
388
+
389
+ **Justificativa** — texto sem respiro dentro de um container com borda ou tint
390
+ lê como apertado. Padding deve escalar com o tamanho da fonte.
391
+
392
+ **Referência** — `source/reference/spatial-design.md`.
393
+
394
+ ### 21. `body-text-viewport-edge` · `quality`
395
+
396
+ **O que detecta** — parágrafo de corpo colado na borda da viewport, sem
397
+ container de padding.
398
+
399
+ **Justificativa** — texto rente à borda da tela é desconfortável de ler.
400
+ Envolva em container com padding horizontal, ou `max-width` com `mx-auto`.
401
+
402
+ **Referência** — `source/reference/spatial-design.md`.
403
+
404
+ ### 22. `tight-leading` · `quality`
405
+
406
+ **O que detecta** — `line-height` abaixo de 1.3x o tamanho da fonte.
407
+
408
+ **Justificativa** — leading apertado deixa texto multi-linha difícil de ler.
409
+ O corpo do Seven usa leading 1.5.
410
+
411
+ **Referência** — `source/reference/typography.md`.
412
+
413
+ ### 23. `skipped-heading` · `quality`
414
+
415
+ **O que detecta** — níveis de heading pulados (ex.: `h1` direto para `h3`).
416
+
417
+ **Justificativa** — leitores de tela usam a hierarquia de headings para
418
+ navegar. Pular nível quebra o outline do documento.
419
+
420
+ **Referência** — `source/reference/typography.md`.
421
+
422
+ ### 24. `justified-text` · `quality`
423
+
424
+ **O que detecta** — texto justificado sem hifenização.
425
+
426
+ **Justificativa** — justificar sem hífen cria "rios" de espaçamento irregular
427
+ entre palavras. Use `text-align: left` para corpo.
428
+
429
+ **Referência** — `source/reference/typography.md`.
430
+
431
+ ### 25. `tiny-text` · `quality`
432
+
433
+ **O que detecta** — texto de corpo abaixo de 12px.
434
+
435
+ **Justificativa** — corpo abaixo de 12px é difícil de ler, sobretudo em telas
436
+ de alta densidade. Corpo usa `--text-base` (16px); labels, `--text-xs` (12px)
437
+ no mínimo.
438
+
439
+ **Referência** — `source/reference/typography.md`.
440
+
441
+ ### 26. `all-caps-body` · `quality`
442
+
443
+ **O que detecta** — passagens longas de texto em maiúsculas.
444
+
445
+ **Justificativa** — reconhecemos palavras pela forma (ascendentes e
446
+ descendentes), que o caixa-alta remove. Seven reserva maiúsculas para labels
447
+ curtos de coluna de tabela monoespaçada; corpo é sentence case.
448
+
449
+ **Referência** — `source/reference/typography.md`.
450
+
451
+ ### 27. `wide-tracking` · `quality`
452
+
453
+ **O que detecta** — `letter-spacing` acima de 0.05em em texto de corpo.
454
+
455
+ **Justificativa** — tracking largo quebra os agrupamentos naturais de
456
+ caracteres e desacelera a leitura. Labels do Seven usam Inter no tracking
457
+ default; tracking largo é decisão Display-only.
458
+
459
+ **Referência** — `source/reference/typography.md`.
460
+
461
+ ### 28. `bounce-easing` · `slop`
462
+
463
+ **O que detecta** — easing bounce, elastic ou spring.
464
+
465
+ **Justificativa** — bounce/elastic soam datados. Objetos reais desaceleram
466
+ suavemente. Seven é decelerado e para — sem overshoot em chrome. Use
467
+ `var(--ease-default)` ou `var(--ease-out-quart)`.
468
+
469
+ **Exemplo**
470
+
471
+ ```css
472
+ /* errado */ .x { animation: bounce 300ms; }
473
+ /* certo */ .x { transition: transform 200ms var(--ease-default); }
474
+ ```
475
+
476
+ **Referência** — `source/reference/motion-design.md`.
477
+
478
+ ### 29. `everything-centered` · `slop`
479
+
480
+ **O que detecta** — todos os elementos de texto centralizados.
481
+
482
+ **Justificativa** — tudo centralizado lê como template. Chrome do Seven é
483
+ left-aligned com assimetria intencional; centralize só superfícies de display
484
+ deliberadas.
485
+
486
+ **Referência** — `source/reference/spatial-design.md`.
487
+
488
+ ---
489
+
490
+ ## Regras de elemento Seven-específicas (30-35)
491
+
492
+ Precisam de inspeção do DOM — é a razão de existir dos engines `static-html`
493
+ e `browser`.
494
+
495
+ ### 30. `missing-tactile-press` · `quality`
496
+
497
+ **O que detecta** — uma afordância clicável (`<button>`, `role="button"`, item
498
+ de lista interativo) sem transição de micro-press baseada em `transform`.
499
+
500
+ **Justificativa** — o micro-press tátil é system-wide no Seven: toda
501
+ afordância clicável recebe `hover:translate-y-px` + `active:translate-y-0.5` +
502
+ inset shadow. Um botão sem isso lê como morto.
503
+
504
+ **Exemplo**
505
+
506
+ ```tsx
507
+ /* errado */ <button className="bg-primary" />
508
+ /* certo */ <button className="bg-primary transition-transform hover:-translate-y-px active:translate-y-0.5" />
509
+ ```
510
+
511
+ **Referência** — `source/reference/motion-design.md`.
512
+
513
+ ### 31. `pill-on-button` · `slop`
514
+
515
+ **O que detecta** — um `<button>` com `border-radius: 9999` ou `rounded-full`.
516
+
517
+ **Justificativa** — botões ficam na escala de radius de componente (`md 8`).
518
+ Pill (9999) é para badges, status indicators e avatar triggers — nunca botões.
519
+
520
+ **Exemplo**
521
+
522
+ ```tsx
523
+ /* errado */ <button className="rounded-full" />
524
+ /* certo */ <button className="rounded-[var(--radius-md)]" />
525
+ ```
526
+
527
+ **Referência** — `source/reference/spatial-design.md`.
528
+
529
+ ### 32. `radius-mixed-scales` · `quality`
530
+
531
+ **O que detecta** — um radius de escala-componente (4/8/12) misturado com um
532
+ de escala-superfície (16/20/24/32) no mesmo elemento.
533
+
534
+ **Justificativa** — Seven roda duas pilhas de radius que não são
535
+ intercambiáveis. Misturar as duas produz o drift "quase parece certo" — o
536
+ anti-pattern mais comum do Seven.
537
+
538
+ **Referência** — `source/reference/spatial-design.md`.
539
+
540
+ ### 33. `non-lucide-icon` · `slop`
541
+
542
+ **O que detecta** — um `<svg>` inline que não é um ícone Lucide (Lucide usa
543
+ viewBox 24x24, stroke de 2px, line caps/joins redondos, sem fill).
544
+
545
+ **Justificativa** — Seven usa o set Lucide exclusivamente. Um SVG com outra
546
+ convenção de stroke quebra a consistência do sistema de ícones.
547
+
548
+ **Referência** — `source/reference/typography.md`.
549
+
550
+ ### 34. `emoji-in-chrome` · `slop`
551
+
552
+ **O que detecta** — um caractere emoji dentro de texto de botão, label ou
553
+ heading.
554
+
555
+ **Justificativa** — chrome do Seven usa ícones Lucide, não emoji. Emoji
556
+ renderiza inconsistente entre plataformas e quebra o tom.
557
+
558
+ **Exemplo**
559
+
560
+ ```tsx
561
+ /* errado */ <button>🔍 Procurar</button>
562
+ /* certo */ <button><SearchIcon /> Procurar</button>
563
+ ```
564
+
565
+ **Referência** — `source/reference/ux-writing.md`.
566
+
567
+ ### 35. `forbidden-em-dash` · `quality`
568
+
569
+ **O que detecta** — um em-dash (`—`) ou en-dash (`–`) em copy voltado ao
570
+ usuário.
571
+
572
+ **Justificativa** — Seven copy usa vírgula, dois-pontos ou quebra de frase. O
573
+ travessão longo lê como prosa gerada por máquina.
574
+
575
+ **Exemplo**
576
+
577
+ ```tsx
578
+ /* errado */ aria-label={`Menu do usuário — ${name}`}
579
+ /* certo */ aria-label={`Menu do usuário: ${name}`}
580
+ ```
581
+
582
+ **Referência** — `source/reference/ux-writing.md`.
583
+
584
+ ---
585
+
586
+ ## Regras do impeccable que o Seven NÃO porta
587
+
588
+ Quatro regras do impeccable foram deliberadamente descartadas — não fazem
589
+ sentido para um design system de produto:
590
+
591
+ - **`single-font`** — o impeccable pede pareamento de fontes. Seven É
592
+ single-font Inter por design; o pareamento seria o anti-pattern aqui.
593
+ - **`italic-serif-display`** — Seven não tem face serif. Inválida por
594
+ construção.
595
+ - **`hero-eyebrow-chip`** e **`repeated-section-kickers`** — tells de landing
596
+ page de marketing. Seven opera no register `product`, não `brand`.
597
+
598
+ ## Dívida conhecida em `@etus/ui`
599
+
600
+ Rodado contra o próprio `@etus/ui`, o detector encontra 8 findings reais em
601
+ código que precede estas regras: 4 `side-stripe-border` (stripes coloridos de
602
+ prioridade em KanbanBoard/DashboardBuilder), 2 `gradient-text-decorative`
603
+ (variante gradient do Heading), 2 `forbidden-em-dash`. São reais — corrigir
604
+ significa mexer em `@etus/ui`, fora do escopo do pacote `@etus/seven-skill`. O gate
605
+ de CI dá `--skip` nessas 3 regras com um baseline guard no teste de dogfood.