@luanpdd/kit-mcp 1.32.0 → 1.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/kit/agents/designer-ui.md +216 -0
- package/kit/file-manifest.json +10 -2
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -0
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -0
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -0
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -0
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -0
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -0
- package/kit/skills/ui-tipografia/SKILL.md +211 -0
- package/package.json +1 -1
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-ritmo-espacial
|
|
3
|
+
description: Use ao definir spacing, padding, layout, grid ou alinhamento — escala canônica em base 4 (4/8/16/24/32/48/64/96), alinhamento óptico ≠ matemático (ícones, glifos), breathing room obrigatório no viewport edge, container width via ch unit em texto, evita arbitrary values [13px] e padding cramped em interactive.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI — Ritmo Espacial
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
LLM carrega esta skill quando:
|
|
11
|
+
|
|
12
|
+
- "Espaçamento parece estranho / cramped / inconsistente"
|
|
13
|
+
- "Alinhar elementos / grid / layout"
|
|
14
|
+
- "Padding em botão / card / dialog"
|
|
15
|
+
- "Container width / max-width"
|
|
16
|
+
- "Optical alignment" / "está 1px off"
|
|
17
|
+
- Preenchendo seção **Componentes** com spacing rules
|
|
18
|
+
|
|
19
|
+
## Regras absolutas
|
|
20
|
+
|
|
21
|
+
**REGRA #1 (escala base-4):** Spacing apenas em múltiplos de 4. Permitidos: `4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128`. **Proibidos:** valores arbitrários `[13px]`, `[27px]`, `[1.7rem]`. Se você precisa de um, problema é de escala não documentada.
|
|
22
|
+
|
|
23
|
+
**REGRA #2 (3 níveis de densidade):**
|
|
24
|
+
- **Densa** (`gap-1`/`p-2`/`px-3`): tables, data grids, command palettes
|
|
25
|
+
- **Padrão** (`gap-4`/`p-4`/`px-6`): cards, forms, sections
|
|
26
|
+
- **Generosa** (`gap-8`/`p-8`/`px-12`): heroes, marketing, empty states
|
|
27
|
+
|
|
28
|
+
Misturar densa + generosa na mesma seção = ritmo quebrado.
|
|
29
|
+
|
|
30
|
+
**REGRA #3 (no edge flush):** Texto e UI sempre com padding lateral mínimo `px-4` (mobile) → `px-6` (tablet) → `px-8` (desktop). Conteúdo nunca encosta na viewport.
|
|
31
|
+
|
|
32
|
+
**REGRA #4 (container width em ch):** Containers de texto têm `max-width` em `ch` unit (50-75ch body). Container de UI em `max-w-7xl` (1280px) ou `max-w-5xl` (1024px) padrão.
|
|
33
|
+
|
|
34
|
+
**REGRA #5 (alinhamento óptico):** Ícones e glifos têm bounding box que ≠ shape óptico. Centralização matemática vê desalinhada. Compense: setas/triângulos shift -1 ou -2 px na direção oposta da ponta. Texto + ícone vertical alinha pela `cap-height`, não pela baseline.
|
|
35
|
+
|
|
36
|
+
## Escala canônica
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
// tailwind.config.js — restrinja explicit, esconda o resto
|
|
40
|
+
module.exports = {
|
|
41
|
+
theme: {
|
|
42
|
+
spacing: {
|
|
43
|
+
'0': '0',
|
|
44
|
+
'px': '1px',
|
|
45
|
+
'0.5': '2px', // só para borders/dividers
|
|
46
|
+
'1': '4px',
|
|
47
|
+
'2': '8px',
|
|
48
|
+
'3': '12px',
|
|
49
|
+
'4': '16px',
|
|
50
|
+
'5': '20px',
|
|
51
|
+
'6': '24px',
|
|
52
|
+
'8': '32px',
|
|
53
|
+
'10': '40px',
|
|
54
|
+
'12': '48px',
|
|
55
|
+
'16': '64px',
|
|
56
|
+
'20': '80px',
|
|
57
|
+
'24': '96px',
|
|
58
|
+
'32': '128px',
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Não inclua `7`, `9`, `11`, `14`, etc — força escolha de uma escala vizinha em vez de "tô em dúvida, vou de meio termo".
|
|
65
|
+
|
|
66
|
+
## Patterns canônicos
|
|
67
|
+
|
|
68
|
+
### Padding interno por componente
|
|
69
|
+
|
|
70
|
+
| Componente | Padding | Notas |
|
|
71
|
+
|------------|---------|-------|
|
|
72
|
+
| Button (padrão) | `px-4 py-2` (h-10) | min 44px touch target |
|
|
73
|
+
| Button (sm) | `px-3 py-1.5` (h-9) | minimum, densidade-tight |
|
|
74
|
+
| Button (lg) | `px-6 py-3` (h-12) | CTA hero |
|
|
75
|
+
| Input | `px-3 py-2` (h-10) | espaço para focus ring outside |
|
|
76
|
+
| Card (padrão) | `p-6` | conteúdo respira |
|
|
77
|
+
| Card (denso) | `p-4` | em lista de muitos |
|
|
78
|
+
| Dialog | `p-6` (mobile) / `p-8` (desktop) | conteúdo central |
|
|
79
|
+
| Badge / Chip | `px-2 py-0.5` | exceção à base-4, ok |
|
|
80
|
+
| Section (vertical) | `py-16` (mobile) / `py-24` (desktop) | hero/marketing |
|
|
81
|
+
| Section (vertical, produto) | `py-8` / `py-12` | denso |
|
|
82
|
+
|
|
83
|
+
### Container patterns
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
// Layout shell
|
|
87
|
+
<div className="min-h-screen">
|
|
88
|
+
<header className="border-b">
|
|
89
|
+
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 h-16 flex items-center">
|
|
90
|
+
{/* nav */}
|
|
91
|
+
</div>
|
|
92
|
+
</header>
|
|
93
|
+
|
|
94
|
+
<main>
|
|
95
|
+
{/* Marketing section */}
|
|
96
|
+
<section className="mx-auto max-w-5xl px-4 sm:px-6 lg:px-8 py-16 lg:py-24">
|
|
97
|
+
<h1 className="max-w-[18ch] text-balance text-6xl">…</h1>
|
|
98
|
+
<p className="max-w-[50ch] mt-6 text-lg text-muted-foreground">…</p>
|
|
99
|
+
</section>
|
|
100
|
+
|
|
101
|
+
{/* Produto dashboard */}
|
|
102
|
+
<section className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-8">
|
|
103
|
+
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">…</div>
|
|
104
|
+
</section>
|
|
105
|
+
|
|
106
|
+
{/* Prose article */}
|
|
107
|
+
<article className="mx-auto max-w-prose px-4 sm:px-6 py-12">
|
|
108
|
+
{/* max-w-prose = 65ch */}
|
|
109
|
+
</article>
|
|
110
|
+
</main>
|
|
111
|
+
</div>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Ritmo vertical em prose
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
<article className="prose">
|
|
118
|
+
<h1 className="mb-8">…</h1> {/* h1 + spacing maior abaixo */}
|
|
119
|
+
<h2 className="mt-12 mb-4">…</h2> {/* h2 separa seções */}
|
|
120
|
+
<p className="mb-4 leading-7">…</p>{/* p body */}
|
|
121
|
+
<ul className="my-4 space-y-2">…</ul>
|
|
122
|
+
</article>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Regra: spacing acima de heading > spacing abaixo. Senão heading "flutua" no meio.
|
|
126
|
+
|
|
127
|
+
### Alinhamento óptico
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
// Texto + ícone: align pelo center vertical, não baseline
|
|
131
|
+
<button className="inline-flex items-center gap-2">
|
|
132
|
+
<ArrowRight className="size-4 -translate-y-px" /> {/* -1px opcional para cap-height match */}
|
|
133
|
+
<span>Próximo</span>
|
|
134
|
+
</button>
|
|
135
|
+
|
|
136
|
+
// Heading + ícone decorativo: ícone alinha pelo x-height, não top
|
|
137
|
+
<h2 className="flex items-baseline gap-2">
|
|
138
|
+
<Sparkles className="size-5 translate-y-1" /> {/* push down to baseline-ish */}
|
|
139
|
+
<span>Feature</span>
|
|
140
|
+
</h2>
|
|
141
|
+
|
|
142
|
+
// Pill button: padding horizontal mais leve que vertical estaria — compense
|
|
143
|
+
<button className="rounded-full px-4 py-2"> {/* px-4 não px-3 — pill rouba H */}
|
|
144
|
+
Ação
|
|
145
|
+
</button>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Anti-patterns
|
|
149
|
+
|
|
150
|
+
### Anti-pattern 1: arbitrary values salpicados
|
|
151
|
+
|
|
152
|
+
**Errado:**
|
|
153
|
+
```tsx
|
|
154
|
+
<div className="p-[13px] mt-[27px] gap-[18px]">…</div>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Por quê:** REGRA #1 — escala se desfaz. Outro dev vê `13px` e adiciona `15px` ao lado. Em 6 meses ninguém sabe o que é "spacing default".
|
|
158
|
+
|
|
159
|
+
**Certo:** `p-3 mt-6 gap-4` (12/24/16, todos na escala). Se realmente precisa de um valor fora, adicione ao theme em vez de inline.
|
|
160
|
+
|
|
161
|
+
### Anti-pattern 2: padding cramped em interactive
|
|
162
|
+
|
|
163
|
+
**Errado:** `<button className="px-2 py-1">Salvar</button>`
|
|
164
|
+
|
|
165
|
+
**Por quê:** Q06 — touch hit area pequena + densidade desconfortável. Botão difícil de clicar.
|
|
166
|
+
|
|
167
|
+
**Certo:** `px-4 py-2` mínimo. Botão denso `px-3 py-1.5` apenas em toolbar.
|
|
168
|
+
|
|
169
|
+
### Anti-pattern 3: section sem padding lateral em mobile
|
|
170
|
+
|
|
171
|
+
**Errado:**
|
|
172
|
+
```tsx
|
|
173
|
+
<section className="max-w-7xl mx-auto py-16">
|
|
174
|
+
<h1 className="text-4xl">Title</h1> {/* encosta na borda em mobile */}
|
|
175
|
+
</section>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Por quê:** REGRA #3 — texto sem ar para respirar + acessibilidade em landscape narrow.
|
|
179
|
+
|
|
180
|
+
**Certo:**
|
|
181
|
+
```tsx
|
|
182
|
+
<section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Anti-pattern 4: hero text sem max-width
|
|
186
|
+
|
|
187
|
+
**Errado:**
|
|
188
|
+
```tsx
|
|
189
|
+
<h1 className="text-6xl">Build amazing products with our platform today</h1>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Por quê:** REGRA #4 — line-length destruído em widescreen, leitura interrompida.
|
|
193
|
+
|
|
194
|
+
**Certo:**
|
|
195
|
+
```tsx
|
|
196
|
+
<h1 className="text-6xl max-w-[18ch] text-balance leading-tight">
|
|
197
|
+
Build amazing products
|
|
198
|
+
</h1>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Anti-pattern 5: misturar densidades sem motivo
|
|
202
|
+
|
|
203
|
+
**Errado:**
|
|
204
|
+
```tsx
|
|
205
|
+
<Card className="p-2"> {/* densa */}
|
|
206
|
+
<CardHeader className="p-8"> {/* generosa */}
|
|
207
|
+
<CardTitle>...</CardTitle>
|
|
208
|
+
</CardHeader>
|
|
209
|
+
<CardContent className="p-4"> {/* padrão */}
|
|
210
|
+
...
|
|
211
|
+
</CardContent>
|
|
212
|
+
</Card>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Por quê:** REGRA #2 — ritmo quebrado, agente IA depois não sabe qual densidade replicar.
|
|
216
|
+
|
|
217
|
+
**Certo:** uma densidade por componente. Card denso = todo o card `p-4` máximo. Card padrão = todo o card `p-6`.
|
|
218
|
+
|
|
219
|
+
### Anti-pattern 6: alinhar centro com texto
|
|
220
|
+
|
|
221
|
+
**Errado:**
|
|
222
|
+
```tsx
|
|
223
|
+
<div className="flex items-center">
|
|
224
|
+
<Icon />
|
|
225
|
+
<h2>Heading</h2>
|
|
226
|
+
</div>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Pixel-perfect: ícone tem `cap-height` diferente do texto.
|
|
230
|
+
|
|
231
|
+
**Certo:**
|
|
232
|
+
```tsx
|
|
233
|
+
<div className="flex items-baseline gap-2"> {/* ou items-center + ícone -translate-y-px */}
|
|
234
|
+
<Icon className="translate-y-0.5" />
|
|
235
|
+
<h2>Heading</h2>
|
|
236
|
+
</div>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Detecção
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# Arbitrary spacing values
|
|
243
|
+
grep -rnE "(p|m|gap|space)-(x|y)?-\[[0-9]+(px|rem)\]" src --include="*.tsx" 2>/dev/null
|
|
244
|
+
|
|
245
|
+
# Edge flush
|
|
246
|
+
grep -rnE "max-w-7xl.*mx-auto.*py-" src --include="*.tsx" 2>/dev/null | grep -v "px-"
|
|
247
|
+
|
|
248
|
+
# Botão cramped
|
|
249
|
+
grep -rnE "<(button|Button)[^>]*\bp[xy]?-(1|2)\b" src --include="*.tsx" 2>/dev/null
|
|
250
|
+
|
|
251
|
+
# Hero sem max-w em ch
|
|
252
|
+
grep -rnE "text-(5xl|6xl|7xl|8xl|9xl)" src --include="*.tsx" 2>/dev/null | grep -v "max-w-\["
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Ver também
|
|
256
|
+
|
|
257
|
+
- [ui-anti-padroes-ia](../ui-anti-padroes-ia/SKILL.md) — Q02 (edge flush), Q06 (padding cramped)
|
|
258
|
+
- [ui-tipografia](../ui-tipografia/SKILL.md) — line-length em ch
|
|
259
|
+
- [ui-contexto-produto](../ui-contexto-produto/SKILL.md) — escala vai em DESIGN.json
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-tipografia
|
|
3
|
+
description: Use ao escolher fontes, tamanhos, pesos ou hierarquia tipográfica — sistema canônico Display + Body + Mono distintos (sem monocultura Inter), max 4 tamanhos × 2 pesos, line-height 1.5 body / 1.2 heading, line-length 50-75ch body / 30-50ch hero, banidas Fraunces/Geist/Mona Sans/Plus Jakarta Sans/Space Grotesk/Recoleta/Instrument Sans em produto novo (fontes saturadas no default IA).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI — Tipografia
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
LLM carrega esta skill quando:
|
|
11
|
+
|
|
12
|
+
- "Que fonte uso?" / "Escolher tipografia"
|
|
13
|
+
- "Hierarquia tipográfica" / "type scale"
|
|
14
|
+
- "Heading parece genérico" / "tipo parece acidental"
|
|
15
|
+
- Preenchendo seção **Tipografia** de DESIGN.md
|
|
16
|
+
- Editando `tailwind.config.*` font tokens
|
|
17
|
+
|
|
18
|
+
## Regras absolutas
|
|
19
|
+
|
|
20
|
+
**REGRA #1 (3 famílias distintas):** Sistema canônico tem **display + body + mono**, três tipos visualmente distintos. Inter como todas as três = monocultura (T07).
|
|
21
|
+
|
|
22
|
+
**REGRA #2 (max 4 sizes × 2 weights):** Exatamente 3-4 tamanhos em uso ativo, máximo 2 pesos. Se você precisa de mais, há um problema de hierarquia, não de escala tipográfica.
|
|
23
|
+
|
|
24
|
+
**REGRA #3 (line-length real):** Body 50-75 chars per line. Hero 30-50 chars. Container width = `ch` unit, não pixel. Texto que estica viewport inteira = ilegível.
|
|
25
|
+
|
|
26
|
+
**REGRA #4 (line-height por contexto):** Body 1.5, headings 1.2, mono/code 1.4. Não 1.6 "para respirar" (afrouxa demais).
|
|
27
|
+
|
|
28
|
+
**REGRA #5 (defaults banidos em produto novo):** Fraunces, Geist, Mona Sans, Plus Jakarta Sans, Space Grotesk, Recoleta, Instrument Sans — saturadas no default IA. Use só com justificativa em MARCA.md (ex: "Geist intencional para match com infra cloud space").
|
|
29
|
+
|
|
30
|
+
## Escala canônica
|
|
31
|
+
|
|
32
|
+
### Type scale (em px, base 16)
|
|
33
|
+
|
|
34
|
+
| Nome | px | uso |
|
|
35
|
+
|------|----|----|
|
|
36
|
+
| `xs` | 12 | Microcopy, labels secundárias, badges |
|
|
37
|
+
| `sm` | 14 | UI controls, table cells, dense lists |
|
|
38
|
+
| `base` | 16 | Body padrão, paragraphs |
|
|
39
|
+
| `lg` | 20 | Lead paragraph, dialog title |
|
|
40
|
+
| `xl` | 24 | h3 |
|
|
41
|
+
| `2xl` | 32 | h2 |
|
|
42
|
+
| `4xl` | 48 | h1 (produto) |
|
|
43
|
+
| `6xl` | 72 | h1 (hero marca) |
|
|
44
|
+
|
|
45
|
+
**Use 3-4 destas em ativo.** Esconda o resto do Tailwind via `fontSize` override no config.
|
|
46
|
+
|
|
47
|
+
### Pesos
|
|
48
|
+
|
|
49
|
+
Apenas 2 pesos por família:
|
|
50
|
+
- **Body:** `400` (regular) + `600` (semibold para emphasis)
|
|
51
|
+
- **Display:** `400` (regular) + `700` (bold) OU peso único caracteristicamente forte
|
|
52
|
+
|
|
53
|
+
Pesos proibidos sem justificativa: `300` (light), `100` (thin) — fica frágil em LCD comum + baixa legibilidade.
|
|
54
|
+
|
|
55
|
+
### Line-height
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
--lh-tight: 1.1; /* hero 6xl+ */
|
|
59
|
+
--lh-heading: 1.2; /* h1, h2 */
|
|
60
|
+
--lh-snug: 1.35; /* lg lead */
|
|
61
|
+
--lh-body: 1.5; /* base body */
|
|
62
|
+
--lh-mono: 1.4; /* code */
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Line-length
|
|
66
|
+
|
|
67
|
+
```css
|
|
68
|
+
.prose { max-width: 65ch; } /* body content */
|
|
69
|
+
.hero { max-width: 18ch; } /* big heading */
|
|
70
|
+
.lead { max-width: 50ch; } /* large intro paragraph */
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`ch` unit > pixel para textos. Em mono use `30em`.
|
|
74
|
+
|
|
75
|
+
## Pareamentos canônicos (com nome próprio)
|
|
76
|
+
|
|
77
|
+
### Marca editorial
|
|
78
|
+
- Display: **GT Sectra** (Grilli Type) ou **Söhne Breit** (Klim)
|
|
79
|
+
- Body: **Söhne** (Klim) ou **Inter Display**
|
|
80
|
+
- Mono: **JetBrains Mono** ou **Berkeley Mono**
|
|
81
|
+
|
|
82
|
+
### Produto calm/clinical
|
|
83
|
+
- Display: **Söhne Breit** (Klim) ou **ABC Diatype** (Dinamo)
|
|
84
|
+
- Body: **Söhne** ou **ABC Diatype**
|
|
85
|
+
- Mono: **JetBrains Mono**
|
|
86
|
+
|
|
87
|
+
### Produto warm/playful
|
|
88
|
+
- Display: **GT Maru** (Grilli) ou **Söhne Schmal**
|
|
89
|
+
- Body: **GT Walsheim** ou **Söhne**
|
|
90
|
+
- Mono: **MD IO** (Mass-Driver)
|
|
91
|
+
|
|
92
|
+
### Editorial serif moment
|
|
93
|
+
- Display: **Tiempos Headline** (Klim) ou **GT Sectra**
|
|
94
|
+
- Body: **Tiempos Text** ou **Söhne**
|
|
95
|
+
- Mono: **JetBrains Mono**
|
|
96
|
+
|
|
97
|
+
### Free / open-source fallback (justificar em MARCA.md)
|
|
98
|
+
- Display: **Manrope** (free) ou **Inter Display** (free variante!)
|
|
99
|
+
- Body: **Inter** OK como único free se for **apenas** body
|
|
100
|
+
- Mono: **JetBrains Mono** (free)
|
|
101
|
+
|
|
102
|
+
> **Inter no display** é sempre tell de IA. Inter Display (variante distinta) é aceitável.
|
|
103
|
+
|
|
104
|
+
## Hierarquia — patterns
|
|
105
|
+
|
|
106
|
+
### Hierarquia por size + weight + color (3 alavancas)
|
|
107
|
+
|
|
108
|
+
```tsx
|
|
109
|
+
// Bom — 3 alavancas, claramente diferenciado
|
|
110
|
+
<h2 className="text-2xl font-semibold text-foreground">Section</h2>
|
|
111
|
+
<p className="text-sm font-normal text-muted-foreground">Caption</p>
|
|
112
|
+
|
|
113
|
+
// Ruim — só size, peso body, muddy
|
|
114
|
+
<h2 className="text-base text-foreground">Section</h2>
|
|
115
|
+
<p className="text-sm text-foreground">Caption</p>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Widow/orphan em heading
|
|
119
|
+
|
|
120
|
+
Last word sozinho em line = widow. Use `text-wrap: balance` ou ` ` no penúltimo separator.
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
<h1 className="text-balance">Build better software with one calm tool</h1>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Letter-spacing
|
|
127
|
+
|
|
128
|
+
- Display tamanhos grandes (`4xl`+): `tracking-tight` (-0.01em) ou `-0.02em`
|
|
129
|
+
- Body: default `tracking-normal`
|
|
130
|
+
- All-caps: `tracking-wider` mas SOMENTE em badge pequena (rótulo uppercase decorativo acima de heading é proibido — ver T04 em anti-padroes-ia)
|
|
131
|
+
|
|
132
|
+
## Anti-patterns
|
|
133
|
+
|
|
134
|
+
### Anti-pattern 1: 6+ tamanhos diferentes em uma tela
|
|
135
|
+
|
|
136
|
+
**Errado:** `text-xs`, `text-sm`, `text-base`, `text-lg`, `text-xl`, `text-2xl` todos numa página.
|
|
137
|
+
|
|
138
|
+
**Por quê:** REGRA #2 — hierarquia inflacionada, agente IA depois perde sinal sobre o que é importante.
|
|
139
|
+
|
|
140
|
+
**Certo:** restringir a 4. Se "preciso de mais", problema é decisão de info architecture, não de tipo.
|
|
141
|
+
|
|
142
|
+
### Anti-pattern 2: Inter em display + body + mono
|
|
143
|
+
|
|
144
|
+
**Errado:**
|
|
145
|
+
```css
|
|
146
|
+
:root {
|
|
147
|
+
--font-display: Inter;
|
|
148
|
+
--font-sans: Inter;
|
|
149
|
+
--font-mono: Inter;
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Por quê:** T07 — monocultura é tell #1 de "IA gerou isto".
|
|
154
|
+
|
|
155
|
+
**Certo:** display + body distintos, mesmo que ambos sans. Mono é monospace, sempre distinto.
|
|
156
|
+
|
|
157
|
+
### Anti-pattern 3: weight `300` para hero
|
|
158
|
+
|
|
159
|
+
**Errado:** `<h1 className="font-light text-6xl">Build it</h1>`
|
|
160
|
+
|
|
161
|
+
**Por quê:** thin no display falha em retina baixa + perde presença. Era moda 2015-2018, agora datado.
|
|
162
|
+
|
|
163
|
+
**Certo:** `font-medium` ou `font-semibold`. Hero quer presença, não fragilidade.
|
|
164
|
+
|
|
165
|
+
### Anti-pattern 4: body em 14px porque "fica clean"
|
|
166
|
+
|
|
167
|
+
**Errado:** `<body class="text-sm">`
|
|
168
|
+
|
|
169
|
+
**Por quê:** 14px body falha em legibilidade > 40 anos + cansa em sessões longas. AA exige 16px effective.
|
|
170
|
+
|
|
171
|
+
**Certo:** 16px body min. 14px só em controls densos, tables, captions.
|
|
172
|
+
|
|
173
|
+
### Anti-pattern 5: hero text estica viewport
|
|
174
|
+
|
|
175
|
+
**Errado:**
|
|
176
|
+
```tsx
|
|
177
|
+
<h1 className="text-7xl">Build something amazing with our platform today and ship faster than ever</h1>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Por quê:** REGRA #3 — line-length destruído, leitura interrompida múltiplas vezes.
|
|
181
|
+
|
|
182
|
+
**Certo:** wrap container 18-25ch + balance:
|
|
183
|
+
```tsx
|
|
184
|
+
<h1 className="text-7xl max-w-[18ch] text-balance leading-[1.05] tracking-tight">
|
|
185
|
+
Ship faster.
|
|
186
|
+
</h1>
|
|
187
|
+
<p className="text-lg max-w-[50ch] mt-4 text-muted-foreground">
|
|
188
|
+
Sub-headline com contexto em line-length confortável.
|
|
189
|
+
</p>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Detecção
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# tamanhos em uso (deveria ser 3-4)
|
|
196
|
+
grep -rohE "text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)\b" src --include="*.tsx" 2>/dev/null | sort -u | wc -l
|
|
197
|
+
|
|
198
|
+
# pesos em uso (deveria ser 2)
|
|
199
|
+
grep -rohE "font-(thin|extralight|light|normal|medium|semibold|bold|extrabold|black)\b" src --include="*.tsx" 2>/dev/null | sort -u
|
|
200
|
+
|
|
201
|
+
# Inter monocultura
|
|
202
|
+
grep -rohE "Inter\b" src --include="*.css" --include="*.ts" 2>/dev/null | wc -l
|
|
203
|
+
|
|
204
|
+
# defaults banidos
|
|
205
|
+
grep -rohE "(Fraunces|Geist|Mona Sans|Plus Jakarta Sans|Space Grotesk|Recoleta|Instrument Sans)" src 2>/dev/null
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Ver também
|
|
209
|
+
|
|
210
|
+
- [ui-anti-padroes-ia](../ui-anti-padroes-ia/SKILL.md) — T03, T04, T07, T08 detalhados
|
|
211
|
+
- [ui-contexto-produto](../ui-contexto-produto/SKILL.md) — onde Display/Body/Mono são declarados
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luanpdd/kit-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.33.0",
|
|
4
4
|
"description": "Generic infrastructure to ship YOUR personal kit of agents/commands/skills as an MCP server, with cross-IDE sync (Claude Code, Cursor, Codex, Gemini, Windsurf, Antigravity, Copilot, Trae).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|