@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.
- package/.claude/skills/seven/SKILL.md +162 -0
- package/.claude/skills/seven/reference/audit.md +120 -0
- package/.claude/skills/seven/reference/brand.md +24 -0
- package/.claude/skills/seven/reference/clarify.md +76 -0
- package/.claude/skills/seven/reference/color-and-contrast.md +84 -0
- package/.claude/skills/seven/reference/motion-design.md +71 -0
- package/.claude/skills/seven/reference/polish.md +55 -0
- package/.claude/skills/seven/reference/product.md +45 -0
- package/.claude/skills/seven/reference/shape.md +85 -0
- package/.claude/skills/seven/reference/spatial-design.md +60 -0
- package/.claude/skills/seven/reference/typography.md +43 -0
- package/.claude/skills/seven/reference/ux-writing.md +47 -0
- package/.claude/skills/seven/scripts/load-context.mjs +84 -0
- package/.claude-plugin/marketplace.json +34 -0
- package/.claude-plugin/plugin.json +12 -0
- package/LICENSE +190 -0
- package/NOTICE.md +26 -0
- package/README.md +118 -0
- package/cli/bin/commands/skills.mjs +664 -0
- package/cli/bin/seven.mjs +68 -0
- package/cli/engine/browser/injected/index.mjs +84 -0
- package/cli/engine/cli/main.mjs +215 -0
- package/cli/engine/detect-antipatterns-browser.js +3014 -0
- package/cli/engine/detect-antipatterns.mjs +44 -0
- package/cli/engine/engines/browser/detect-url.mjs +108 -0
- package/cli/engine/engines/regex/detect-text.mjs +508 -0
- package/cli/engine/engines/static-html/css-cascade.mjs +957 -0
- package/cli/engine/engines/static-html/detect-html.mjs +211 -0
- package/cli/engine/engines/visual/screenshot-contrast.mjs +192 -0
- package/cli/engine/findings.mjs +28 -0
- package/cli/engine/node/file-system.mjs +212 -0
- package/cli/engine/profile/profiler.mjs +169 -0
- package/cli/engine/registry/seven-antipatterns.mjs +494 -0
- package/cli/engine/rules/checks.mjs +1518 -0
- package/cli/engine/shared/color.mjs +204 -0
- package/cli/engine/shared/constants.mjs +91 -0
- package/cli/engine/shared/page.mjs +9 -0
- package/cli/engine/shared/tokens.mjs +153 -0
- package/cli/engine/token-data.generated.mjs +691 -0
- package/docs/detector-rules.md +605 -0
- package/docs/figma-token-rule-exploration.md +185 -0
- 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.
|