@jaimevalasek/aioson 1.30.0 → 1.30.2
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 +18 -0
- package/docs/design-previews/cognitive-core-ui-auth.html +95 -0
- package/docs/design-previews/cognitive-core-ui-kanban.html +231 -0
- package/docs/design-previews/cognitive-core-ui-list-detail.html +174 -0
- package/docs/design-previews/cognitive-core-ui-preview.css +1315 -0
- package/docs/design-previews/cognitive-core-ui-settings.html +142 -0
- package/docs/design-previews/cognitive-core-ui-website.html +190 -1009
- package/docs/design-previews/cognitive-core-ui.html +281 -463
- package/docs/design-previews/index.html +83 -31
- package/package.json +1 -1
- package/src/constants.js +578 -514
- package/template/.aioson/docs/integrations/dashboard-app-form-publish-mapping.md +183 -0
- package/template/.aioson/docs/play/README.md +74 -0
- package/template/.aioson/docs/play/agent-usage-guide.md +112 -0
- package/template/.aioson/docs/play/app-compatibility-guide.md +117 -0
- package/template/.aioson/docs/play/auth-services-and-testing.md +235 -0
- package/template/.aioson/docs/play/llm-data-and-bindings.md +238 -0
- package/template/.aioson/docs/play/manifest-and-runtime.md +267 -0
- package/template/.aioson/docs/play/source-map.md +104 -0
- package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
- package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
- package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
- package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
- package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
- package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
- package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
- package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
- package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
- package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
- package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
- package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
- package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
- package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
- package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
- package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
- package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
- package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
- package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
- package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
- package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
- package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
- package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
- package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
- package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
- package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
- package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
- package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
- package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
- package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
- package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
- package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
- package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
- package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
- package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
- package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
- package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
- package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
- package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
- package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
- package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
- package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
- package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
- package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
- package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
- package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
- package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
- package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
- package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
- package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
- package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
- package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
- package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
- package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
- package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
- package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
- package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
- package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
- package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
- package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
- package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
- package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
- package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
- package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
- package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
- package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
- package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
- package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
- package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
- package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
- package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
- package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
- package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
- package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -289
|
@@ -1,723 +1,723 @@
|
|
|
1
|
-
# Websites — Neo-Brutalist UI
|
|
2
|
-
|
|
3
|
-
Landing pages, marketing sites, personal sites, and product websites. The raw aesthetic applied to first impressions.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Navigation
|
|
8
|
-
|
|
9
|
-
```css
|
|
10
|
-
.site-nav {
|
|
11
|
-
position: sticky;
|
|
12
|
-
top: 0;
|
|
13
|
-
height: 60px;
|
|
14
|
-
background: var(--bg-surface);
|
|
15
|
-
border-bottom: var(--border-thicker);
|
|
16
|
-
display: flex;
|
|
17
|
-
align-items: center;
|
|
18
|
-
padding: 0 var(--space-8);
|
|
19
|
-
gap: var(--space-8);
|
|
20
|
-
justify-content: space-between;
|
|
21
|
-
z-index: var(--z-sticky);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
.site-nav__logo {
|
|
25
|
-
font-family: var(--font-display);
|
|
26
|
-
font-weight: var(--weight-extrabold);
|
|
27
|
-
font-size: var(--text-lg);
|
|
28
|
-
color: var(--text-heading);
|
|
29
|
-
text-decoration: none;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.site-nav__links {
|
|
33
|
-
display: flex;
|
|
34
|
-
gap: var(--space-6);
|
|
35
|
-
align-items: center;
|
|
36
|
-
list-style: none;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
.site-nav__link {
|
|
40
|
-
font-family: var(--font-mono);
|
|
41
|
-
font-size: var(--text-sm);
|
|
42
|
-
font-weight: var(--weight-medium);
|
|
43
|
-
color: var(--text-secondary);
|
|
44
|
-
text-decoration: none;
|
|
45
|
-
padding: var(--space-1) var(--space-3);
|
|
46
|
-
transition: color var(--transition-fast);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
.site-nav__link:hover {
|
|
50
|
-
color: var(--text-heading);
|
|
51
|
-
/* Thick underline via pseudo-element */
|
|
52
|
-
text-decoration: underline;
|
|
53
|
-
text-decoration-thickness: 2px;
|
|
54
|
-
text-underline-offset: 4px;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.site-nav__link--active {
|
|
58
|
-
background: var(--accent);
|
|
59
|
-
color: var(--accent-contrast);
|
|
60
|
-
border-radius: var(--radius-full); /* pill — playful nav active */
|
|
61
|
-
font-weight: var(--weight-bold);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/* CTA in nav: brutalist button */
|
|
65
|
-
.site-nav__cta {
|
|
66
|
-
/* use .btn-primary with border-thick */
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Mobile nav
|
|
71
|
-
Below `--breakpoint-lg`:
|
|
72
|
-
- Hamburger icon: 3 lines, 2px thick
|
|
73
|
-
- Menu: full-screen overlay, `bg-base`, nav items stacked large (`text-xl`), `border-bottom: var(--border-thick)` each item
|
|
74
|
-
- Close: `×` bold, top-right
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## Hero Patterns
|
|
79
|
-
|
|
80
|
-
### Hero A — Statement Hero
|
|
81
|
-
|
|
82
|
-
The text IS the visual. No images.
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
bg-base or bg-void
|
|
86
|
-
Optional: pattern-dots or pattern-grid on a background layer (opacity 0.10)
|
|
87
|
-
|
|
88
|
-
[sticker badge: "[OPEN BETA]" rotated] ← optional
|
|
89
|
-
|
|
90
|
-
h1: text-4xl to text-5xl, font-display, weight-extrabold, tracking-
|
|
91
|
-
|
|
92
|
-
p: text-lg, max-width 560px, color text-secondary, margin-top space-6
|
|
93
|
-
|
|
94
|
-
[btn-primary (accent, shadow-lg, control-lg)] [btn-secondary] ← row, gap space-4, margin-top space-8
|
|
95
|
-
|
|
96
|
-
[social proof strip: "★★★★★ Loved by 1,200+ indie hackers" in mono text-sm]
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
```css
|
|
100
|
-
.hero-statement {
|
|
101
|
-
padding: var(--space-24) var(--space-8);
|
|
102
|
-
max-width: 1200px;
|
|
103
|
-
margin: 0 auto;
|
|
104
|
-
position: relative;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
.hero-statement h1 {
|
|
108
|
-
font-family: var(--font-display);
|
|
109
|
-
font-size:
|
|
110
|
-
font-weight: var(--weight-extrabold);
|
|
111
|
-
color: var(--text-heading);
|
|
112
|
-
letter-spacing: var(--tracking-tight);
|
|
113
|
-
line-height: 1.1;
|
|
114
|
-
max-width: 720px;
|
|
115
|
-
margin-bottom: var(--space-6);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.hero-statement p {
|
|
119
|
-
font-size: var(--text-lg);
|
|
120
|
-
color: var(--text-secondary);
|
|
121
|
-
max-width: 560px;
|
|
122
|
-
line-height: 1.6;
|
|
123
|
-
margin-bottom: var(--space-8);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
.hero-statement__actions {
|
|
127
|
-
display: flex;
|
|
128
|
-
gap: var(--space-4);
|
|
129
|
-
flex-wrap: wrap;
|
|
130
|
-
align-items: center;
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
### Hero B — Product Brutalist Hero
|
|
137
|
-
|
|
138
|
-
Product screenshot in a brutalist browser frame.
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
Left column (50-55%):
|
|
142
|
-
h1: text-3xl, bold
|
|
143
|
-
p: text-base, text-secondary
|
|
144
|
-
[CTA buttons row]
|
|
145
|
-
|
|
146
|
-
Right column (45-50%):
|
|
147
|
-
[BRUTALIST BROWSER FRAME]
|
|
148
|
-
header bar: bg-elevated, border-bottom: thick, 40px height
|
|
149
|
-
● ● ● colored dots (red/amber/green) + URL bar mono
|
|
150
|
-
screenshot: border-thicker on the frame itself, shadow-xl
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
```css
|
|
154
|
-
.hero-product {
|
|
155
|
-
display: grid;
|
|
156
|
-
grid-template-columns: 1fr 1fr;
|
|
157
|
-
gap: var(--space-12);
|
|
158
|
-
align-items: center;
|
|
159
|
-
padding: var(--space-20) var(--space-8);
|
|
160
|
-
max-width: 1200px;
|
|
161
|
-
margin: 0 auto;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
.browser-frame {
|
|
165
|
-
border: var(--border-thicker);
|
|
166
|
-
box-shadow: var(--shadow-xl);
|
|
167
|
-
background: var(--bg-surface);
|
|
168
|
-
overflow: hidden;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
.browser-frame__bar {
|
|
172
|
-
height: 40px;
|
|
173
|
-
background: var(--bg-elevated);
|
|
174
|
-
border-bottom: var(--border-thick);
|
|
175
|
-
display: flex;
|
|
176
|
-
align-items: center;
|
|
177
|
-
padding: 0 var(--space-4);
|
|
178
|
-
gap: var(--space-2);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
.browser-frame__dot {
|
|
182
|
-
width: 12px;
|
|
183
|
-
height: 12px;
|
|
184
|
-
border-radius: var(--radius-full);
|
|
185
|
-
border: var(--border-thick);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
.browser-frame__dot--red { background: #EF4444; border-color: #B91C1C; }
|
|
189
|
-
.browser-frame__dot--amber { background: #F59E0B; border-color: #B45309; }
|
|
190
|
-
.browser-frame__dot--green { background: #22C55E; border-color: #15803D; }
|
|
191
|
-
|
|
192
|
-
.browser-frame__url {
|
|
193
|
-
flex: 1;
|
|
194
|
-
height: 24px;
|
|
195
|
-
background: var(--bg-surface);
|
|
196
|
-
border: var(--border-subtle);
|
|
197
|
-
margin: 0 var(--space-4);
|
|
198
|
-
padding: 0 var(--space-3);
|
|
199
|
-
font-family: var(--font-mono);
|
|
200
|
-
font-size: var(--text-xs);
|
|
201
|
-
color: var(--text-muted);
|
|
202
|
-
display: flex;
|
|
203
|
-
align-items: center;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
.browser-frame img {
|
|
207
|
-
display: block;
|
|
208
|
-
width: 100%;
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
### Hero C — Manifesto Hero
|
|
215
|
-
|
|
216
|
-
Typographic. Like the first page of a self-published zine.
|
|
217
|
-
|
|
218
|
-
```
|
|
219
|
-
bg-base (full width, minimal)
|
|
220
|
-
|
|
221
|
-
Large text block:
|
|
222
|
-
Mixed sizes: one phrase at text-4xl bold, continuation at text-xl regular
|
|
223
|
-
Specific words with inline highlight: <mark> bg-accent, no border-radius
|
|
224
|
-
|
|
225
|
-
No images. No decoration. The text is the composition.
|
|
226
|
-
|
|
227
|
-
CTA: ghost button or text link with thick underline (minimal — not a chunky CTA)
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
```css
|
|
231
|
-
.hero-manifesto {
|
|
232
|
-
padding: var(--space-24) var(--space-8);
|
|
233
|
-
max-width: 900px;
|
|
234
|
-
margin: 0 auto;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
.manifesto-text {
|
|
238
|
-
font-family: var(--font-display);
|
|
239
|
-
font-size: var(--text-3xl);
|
|
240
|
-
font-weight: var(--weight-bold);
|
|
241
|
-
line-height: 1.3;
|
|
242
|
-
color: var(--text-heading);
|
|
243
|
-
letter-spacing: var(--tracking-tight);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/* Inline highlight */
|
|
247
|
-
.manifesto-text mark {
|
|
248
|
-
background: var(--accent);
|
|
249
|
-
color: var(--accent-contrast);
|
|
250
|
-
border-radius: 0;
|
|
251
|
-
padding: 2px var(--space-2);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
.manifesto-cta {
|
|
255
|
-
display: inline-block;
|
|
256
|
-
margin-top: var(--space-10);
|
|
257
|
-
font-family: var(--font-mono);
|
|
258
|
-
font-size: var(--text-base);
|
|
259
|
-
font-weight: var(--weight-bold);
|
|
260
|
-
color: var(--text-heading);
|
|
261
|
-
text-decoration: underline;
|
|
262
|
-
text-decoration-thickness: 3px;
|
|
263
|
-
text-underline-offset: 4px;
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
### Hero D — Grid Mosaic Hero
|
|
270
|
-
|
|
271
|
-
Asymmetric grid of colored brutalist cards. Interactive.
|
|
272
|
-
|
|
273
|
-
```
|
|
274
|
-
headline above or overlaid
|
|
275
|
-
|
|
276
|
-
GRID (asymmetric, e.g. CSS Grid with named areas):
|
|
277
|
-
[2×1 accent card] [1×1 red card]
|
|
278
|
-
[1×1 blue card] [1×2 white card with product feature]
|
|
279
|
-
[1×1 green card] [1×1 accent-dim card]
|
|
280
|
-
|
|
281
|
-
All cards: border-thicker, shadow-md, hover → shadow-lg push
|
|
282
|
-
Background: bg-void
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
```css
|
|
286
|
-
.hero-mosaic {
|
|
287
|
-
padding: var(--space-20) var(--space-8);
|
|
288
|
-
background: var(--bg-void);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
.mosaic-headline {
|
|
292
|
-
font-family: var(--font-display);
|
|
293
|
-
font-size: var(--text-4xl);
|
|
294
|
-
font-weight: var(--weight-extrabold);
|
|
295
|
-
letter-spacing: var(--tracking-tight);
|
|
296
|
-
margin-bottom: var(--space-8);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
.mosaic-grid {
|
|
300
|
-
display: grid;
|
|
301
|
-
grid-template-columns: repeat(4, 1fr);
|
|
302
|
-
grid-template-rows: repeat(3, 160px);
|
|
303
|
-
gap: var(--space-4);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
.mosaic-card {
|
|
307
|
-
border: var(--border-thicker);
|
|
308
|
-
box-shadow: var(--shadow-md);
|
|
309
|
-
padding: var(--space-6);
|
|
310
|
-
cursor: pointer;
|
|
311
|
-
transition: box-shadow var(--transition-fast);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
.mosaic-card:hover { box-shadow: var(--shadow-lg); }
|
|
315
|
-
.mosaic-card:active { box-shadow: none; transform: translate(4px, 4px); }
|
|
316
|
-
|
|
317
|
-
.mosaic-card--accent { background: var(--accent); }
|
|
318
|
-
.mosaic-card--red { background: var(--accent-red); color: white; }
|
|
319
|
-
.mosaic-card--blue { background: var(--accent-blue); color: white; }
|
|
320
|
-
.mosaic-card--green { background: var(--accent-green); }
|
|
321
|
-
.mosaic-card--white { background: var(--bg-surface); }
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
---
|
|
325
|
-
|
|
326
|
-
## Section Patterns
|
|
327
|
-
|
|
328
|
-
### 1. Feature Grid
|
|
329
|
-
|
|
330
|
-
3-column grid of brutalist feature cards.
|
|
331
|
-
|
|
332
|
-
```css
|
|
333
|
-
.feature-grid {
|
|
334
|
-
display: grid;
|
|
335
|
-
grid-template-columns: repeat(3, 1fr);
|
|
336
|
-
gap: var(--space-6);
|
|
337
|
-
padding: var(--space-20) var(--space-8);
|
|
338
|
-
max-width: 1200px;
|
|
339
|
-
margin: 0 auto;
|
|
340
|
-
}
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
Cards: `.feature-card` component (icon area with bg-accent, title bold, description text-sm).
|
|
344
|
-
|
|
345
|
-
---
|
|
346
|
-
|
|
347
|
-
### 2. Alternating Feature
|
|
348
|
-
|
|
349
|
-
Image and text alternating sides. Images in brutalist frames.
|
|
350
|
-
|
|
351
|
-
```css
|
|
352
|
-
.alternating-feature {
|
|
353
|
-
display: grid;
|
|
354
|
-
grid-template-columns: 1fr 1fr;
|
|
355
|
-
gap: var(--space-12);
|
|
356
|
-
align-items: center;
|
|
357
|
-
padding: var(--space-16) var(--space-8);
|
|
358
|
-
max-width: 1200px;
|
|
359
|
-
margin: 0 auto;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
.alternating-feature:nth-child(even) {
|
|
363
|
-
direction: rtl; /* swap sides */
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
.alternating-feature img {
|
|
367
|
-
border: var(--border-thicker);
|
|
368
|
-
box-shadow: var(--shadow-lg);
|
|
369
|
-
display: block;
|
|
370
|
-
width: 100%;
|
|
371
|
-
}
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
---
|
|
375
|
-
|
|
376
|
-
### 3. Testimonial
|
|
377
|
-
|
|
378
|
-
Large centered quote card.
|
|
379
|
-
|
|
380
|
-
```css
|
|
381
|
-
.testimonial {
|
|
382
|
-
background: var(--bg-surface);
|
|
383
|
-
border: var(--border-thicker);
|
|
384
|
-
box-shadow: var(--shadow-md);
|
|
385
|
-
padding: var(--space-10) var(--space-12);
|
|
386
|
-
max-width: 720px;
|
|
387
|
-
margin: var(--space-20) auto;
|
|
388
|
-
text-align: center;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
.testimonial__quote {
|
|
392
|
-
font-size: var(--text-xl);
|
|
393
|
-
font-style: italic;
|
|
394
|
-
color: var(--text-heading);
|
|
395
|
-
line-height: 1.5;
|
|
396
|
-
margin-bottom: var(--space-6);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
.testimonial__attribution {
|
|
400
|
-
font-family: var(--font-mono);
|
|
401
|
-
font-size: var(--text-sm);
|
|
402
|
-
color: var(--text-secondary);
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
/* Sticker badge: "[★★★★★]" */
|
|
406
|
-
.testimonial__rating {
|
|
407
|
-
/* .sticker component */
|
|
408
|
-
margin-bottom: var(--space-6);
|
|
409
|
-
}
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
---
|
|
413
|
-
|
|
414
|
-
### 4. Stats Strip
|
|
415
|
-
|
|
416
|
-
Full-width accent band with bold numbers.
|
|
417
|
-
|
|
418
|
-
```css
|
|
419
|
-
.stats-strip {
|
|
420
|
-
background: var(--accent);
|
|
421
|
-
border-top: var(--border-thicker);
|
|
422
|
-
border-bottom: var(--border-thicker);
|
|
423
|
-
padding: var(--space-10) var(--space-8);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
.stats-strip__grid {
|
|
427
|
-
display: grid;
|
|
428
|
-
grid-template-columns: repeat(4, 1fr);
|
|
429
|
-
gap: var(--space-8);
|
|
430
|
-
max-width: 1200px;
|
|
431
|
-
margin: 0 auto;
|
|
432
|
-
text-align: center;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
.stats-strip__number {
|
|
436
|
-
font-family: var(--font-mono);
|
|
437
|
-
font-size: var(--text-3xl);
|
|
438
|
-
font-weight: var(--weight-extrabold);
|
|
439
|
-
color: var(--accent-contrast);
|
|
440
|
-
display: block;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
.stats-strip__label {
|
|
444
|
-
font-family: var(--font-mono);
|
|
445
|
-
font-size: var(--text-xs);
|
|
446
|
-
font-weight: var(--weight-medium);
|
|
447
|
-
text-transform: uppercase;
|
|
448
|
-
letter-spacing: var(--tracking-wider);
|
|
449
|
-
color: var(--accent-contrast);
|
|
450
|
-
opacity: 0.75;
|
|
451
|
-
}
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
---
|
|
455
|
-
|
|
456
|
-
### 5. Pricing
|
|
457
|
-
|
|
458
|
-
2–3 brutalist cards. Featured with sticker badge + shadow-xl.
|
|
459
|
-
|
|
460
|
-
```css
|
|
461
|
-
.pricing-grid {
|
|
462
|
-
display: grid;
|
|
463
|
-
grid-template-columns: repeat(3, 1fr);
|
|
464
|
-
gap: var(--space-6);
|
|
465
|
-
align-items: start;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
.pricing-card {
|
|
469
|
-
background: var(--bg-surface);
|
|
470
|
-
border: var(--border-thicker);
|
|
471
|
-
box-shadow: var(--shadow-md);
|
|
472
|
-
padding: var(--space-8);
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
.pricing-card--featured {
|
|
476
|
-
box-shadow: var(--shadow-xl);
|
|
477
|
-
position: relative;
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
/* "[BEST VALUE]" sticker — positioned at top-right */
|
|
481
|
-
.pricing-card--featured .sticker {
|
|
482
|
-
position: absolute;
|
|
483
|
-
top: calc(-1 * var(--space-3));
|
|
484
|
-
right: var(--space-4);
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
.pricing-price {
|
|
488
|
-
font-family: var(--font-mono);
|
|
489
|
-
font-size: var(--text-3xl);
|
|
490
|
-
font-weight: var(--weight-extrabold);
|
|
491
|
-
color: var(--text-heading);
|
|
492
|
-
margin-bottom: var(--space-6);
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
.pricing-feature {
|
|
496
|
-
display: flex;
|
|
497
|
-
align-items: center;
|
|
498
|
-
gap: var(--space-3);
|
|
499
|
-
padding: var(--space-2) 0;
|
|
500
|
-
font-size: var(--text-sm);
|
|
501
|
-
border-bottom: var(--border-subtle);
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
.pricing-feature:last-child { border-bottom: none; }
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
---
|
|
508
|
-
|
|
509
|
-
### 6. CTA Section
|
|
510
|
-
|
|
511
|
-
```css
|
|
512
|
-
.cta-section {
|
|
513
|
-
background: var(--bg-void);
|
|
514
|
-
padding: var(--space-24) var(--space-8);
|
|
515
|
-
text-align: center;
|
|
516
|
-
position: relative;
|
|
517
|
-
overflow: hidden;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
/* Optional pattern background */
|
|
521
|
-
.cta-section--pattern::before {
|
|
522
|
-
content: '';
|
|
523
|
-
position: absolute;
|
|
524
|
-
inset: 0;
|
|
525
|
-
background-image: radial-gradient(var(--border-color) 1px, transparent 1px);
|
|
526
|
-
background-size: 20px 20px;
|
|
527
|
-
opacity: 0.10;
|
|
528
|
-
pointer-events: none;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
.cta-section h2 {
|
|
532
|
-
font-family: var(--font-display);
|
|
533
|
-
font-size: var(--text-3xl);
|
|
534
|
-
font-weight: var(--weight-extrabold);
|
|
535
|
-
letter-spacing: var(--tracking-tight);
|
|
536
|
-
margin-bottom: var(--space-8);
|
|
537
|
-
position: relative;
|
|
538
|
-
}
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
---
|
|
542
|
-
|
|
543
|
-
### 7. FAQ
|
|
544
|
-
|
|
545
|
-
Brutalist accordion — `+` / `−` toggle, not chevron.
|
|
546
|
-
|
|
547
|
-
```css
|
|
548
|
-
.faq-item {
|
|
549
|
-
border: var(--border-thick);
|
|
550
|
-
margin-bottom: -1px; /* collapse adjacent borders */
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
.faq-trigger {
|
|
554
|
-
width: 100%;
|
|
555
|
-
background: none;
|
|
556
|
-
border: none;
|
|
557
|
-
padding: var(--space-5) var(--space-6);
|
|
558
|
-
display: flex;
|
|
559
|
-
justify-content: space-between;
|
|
560
|
-
align-items: center;
|
|
561
|
-
font-family: var(--font-display);
|
|
562
|
-
font-size: var(--text-base);
|
|
563
|
-
font-weight: var(--weight-bold);
|
|
564
|
-
color: var(--text-heading);
|
|
565
|
-
cursor: pointer;
|
|
566
|
-
text-align: left;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
.faq-trigger:hover { background: var(--bg-elevated); }
|
|
570
|
-
|
|
571
|
-
.faq-icon {
|
|
572
|
-
font-family: var(--font-mono);
|
|
573
|
-
font-size: var(--text-xl);
|
|
574
|
-
font-weight: var(--weight-bold);
|
|
575
|
-
line-height: 1;
|
|
576
|
-
flex-shrink: 0;
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
.faq-answer {
|
|
580
|
-
padding: 0 var(--space-6) var(--space-5);
|
|
581
|
-
font-size: var(--text-sm);
|
|
582
|
-
color: var(--text-secondary);
|
|
583
|
-
line-height: 1.7;
|
|
584
|
-
border-top: var(--border-subtle);
|
|
585
|
-
}
|
|
586
|
-
```
|
|
587
|
-
|
|
588
|
-
---
|
|
589
|
-
|
|
590
|
-
### 8. Logo Cloud
|
|
591
|
-
|
|
592
|
-
```css
|
|
593
|
-
.logo-cloud {
|
|
594
|
-
padding: var(--space-12) var(--space-8);
|
|
595
|
-
border-bottom: var(--border-thick);
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
.logo-cloud__label {
|
|
599
|
-
font-family: var(--font-mono);
|
|
600
|
-
font-size: var(--text-xs);
|
|
601
|
-
text-transform: uppercase;
|
|
602
|
-
letter-spacing: var(--tracking-wider);
|
|
603
|
-
color: var(--text-muted);
|
|
604
|
-
text-align: center;
|
|
605
|
-
margin-bottom: var(--space-6);
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
.logo-cloud__grid {
|
|
609
|
-
display: flex;
|
|
610
|
-
flex-wrap: wrap;
|
|
611
|
-
gap: var(--space-8);
|
|
612
|
-
justify-content: center;
|
|
613
|
-
align-items: center;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
.logo-cloud__logo {
|
|
617
|
-
/* Black/solid — not grayscale with opacity */
|
|
618
|
-
filter: brightness(0);
|
|
619
|
-
opacity: 0.7;
|
|
620
|
-
height: 28px;
|
|
621
|
-
object-fit: contain;
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
.logo-cloud__logo:hover { opacity: 1; }
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
---
|
|
628
|
-
|
|
629
|
-
## Footer
|
|
630
|
-
|
|
631
|
-
```css
|
|
632
|
-
.site-footer {
|
|
633
|
-
background: var(--bg-void);
|
|
634
|
-
border-top: var(--border-thickest);
|
|
635
|
-
padding-top: var(--space-12);
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
.site-footer__grid {
|
|
639
|
-
display: grid;
|
|
640
|
-
grid-template-columns: repeat(4, 1fr);
|
|
641
|
-
gap: var(--space-8);
|
|
642
|
-
max-width: 1200px;
|
|
643
|
-
margin: 0 auto;
|
|
644
|
-
padding: 0 var(--space-8) var(--space-12);
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
.footer-section__title {
|
|
648
|
-
font-family: var(--font-mono);
|
|
649
|
-
font-size: var(--text-xs);
|
|
650
|
-
font-weight: var(--weight-bold);
|
|
651
|
-
text-transform: uppercase;
|
|
652
|
-
letter-spacing: var(--tracking-wider);
|
|
653
|
-
color: var(--text-heading);
|
|
654
|
-
margin-bottom: var(--space-4);
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
.footer-section__link {
|
|
658
|
-
display: block;
|
|
659
|
-
font-size: var(--text-sm);
|
|
660
|
-
color: var(--text-secondary);
|
|
661
|
-
text-decoration: none;
|
|
662
|
-
padding: var(--space-1) 0;
|
|
663
|
-
transition: color var(--transition-fast);
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
.footer-section__link:hover {
|
|
667
|
-
color: var(--text-heading);
|
|
668
|
-
text-decoration: underline;
|
|
669
|
-
text-decoration-thickness: 2px;
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
.site-footer__bottom {
|
|
673
|
-
border-top: var(--border-thick);
|
|
674
|
-
padding: var(--space-4) var(--space-8);
|
|
675
|
-
max-width: 1200px;
|
|
676
|
-
margin: 0 auto;
|
|
677
|
-
display: flex;
|
|
678
|
-
justify-content: space-between;
|
|
679
|
-
align-items: center;
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
.site-footer__copyright {
|
|
683
|
-
font-family: var(--font-mono);
|
|
684
|
-
font-size: var(--text-xs);
|
|
685
|
-
color: var(--text-muted);
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
/* Social icons: square frames */
|
|
689
|
-
.social-icon {
|
|
690
|
-
width: 36px;
|
|
691
|
-
height: 36px;
|
|
692
|
-
border: var(--border-thick);
|
|
693
|
-
display: flex;
|
|
694
|
-
align-items: center;
|
|
695
|
-
justify-content: center;
|
|
696
|
-
color: var(--text-heading);
|
|
697
|
-
text-decoration: none;
|
|
698
|
-
transition: background var(--transition-fast);
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
.social-icon:hover { background: var(--bg-elevated); }
|
|
702
|
-
```
|
|
703
|
-
|
|
704
|
-
---
|
|
705
|
-
|
|
706
|
-
## Anti-Patterns
|
|
707
|
-
|
|
708
|
-
These patterns are common mistakes in brutalist UI. Avoid all of them.
|
|
709
|
-
|
|
710
|
-
| Anti-pattern | Why it's wrong | What to do instead |
|
|
711
|
-
|---|---|---|
|
|
712
|
-
| `box-shadow: 0 4px 12px rgba(0,0,0,0.15)` | Soft blur shadow = NOT brutalist | `box-shadow: 4px 4px 0 #1A1A1A` — zero blur |
|
|
713
|
-
| `backdrop-filter: blur(12px)` | Glassmorphism, opposite of brutalist | Remove entirely. No blur anywhere. |
|
|
714
|
-
| `border: 1px solid #e5e7eb` | Thin gray border = clean-saas | `border: 2px solid #1A1A1A` — thick, black |
|
|
715
|
-
| `border-radius: 8px` to `16px` | "Normal" radius = medium ground | Use `0` or `9999px` only |
|
|
716
|
-
| Pastel backgrounds | Soft pastels = glassmorphism | Saturated flat colors or off-white |
|
|
717
|
-
| Gradient fills | Gradients = polished SaaS | Flat solid colors only |
|
|
718
|
-
| Illustrated empty states | Cute illustrations = "corporate friendly" | `[NO DATA]` in mono |
|
|
719
|
-
| Card without border | Floating card = clean SaaS | Every card has a visible border |
|
|
720
|
-
| Thin line dividers (`1px #e5e7eb`) | Invisible separators = invisible structure | `border: 2px solid #1A1A1A` |
|
|
721
|
-
| Centered long-form body text | Editorial web convention | Left-aligned paragraphs |
|
|
722
|
-
| Muted status colors (`#86efac` light green) | Legibility, not signal strength | Full-saturation semantic colors |
|
|
723
|
-
| Hover state that only changes opacity | Too subtle | Change background AND border state |
|
|
1
|
+
# Websites — Neo-Brutalist UI
|
|
2
|
+
|
|
3
|
+
Landing pages, marketing sites, personal sites, and product websites. The raw aesthetic applied to first impressions.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Navigation
|
|
8
|
+
|
|
9
|
+
```css
|
|
10
|
+
.site-nav {
|
|
11
|
+
position: sticky;
|
|
12
|
+
top: 0;
|
|
13
|
+
height: 60px;
|
|
14
|
+
background: var(--bg-surface);
|
|
15
|
+
border-bottom: var(--border-thicker);
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
padding: 0 var(--space-8);
|
|
19
|
+
gap: var(--space-8);
|
|
20
|
+
justify-content: space-between;
|
|
21
|
+
z-index: var(--z-sticky);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.site-nav__logo {
|
|
25
|
+
font-family: var(--font-display);
|
|
26
|
+
font-weight: var(--weight-extrabold);
|
|
27
|
+
font-size: var(--text-lg);
|
|
28
|
+
color: var(--text-heading);
|
|
29
|
+
text-decoration: none;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.site-nav__links {
|
|
33
|
+
display: flex;
|
|
34
|
+
gap: var(--space-6);
|
|
35
|
+
align-items: center;
|
|
36
|
+
list-style: none;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.site-nav__link {
|
|
40
|
+
font-family: var(--font-mono);
|
|
41
|
+
font-size: var(--text-sm);
|
|
42
|
+
font-weight: var(--weight-medium);
|
|
43
|
+
color: var(--text-secondary);
|
|
44
|
+
text-decoration: none;
|
|
45
|
+
padding: var(--space-1) var(--space-3);
|
|
46
|
+
transition: color var(--transition-fast);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.site-nav__link:hover {
|
|
50
|
+
color: var(--text-heading);
|
|
51
|
+
/* Thick underline via pseudo-element */
|
|
52
|
+
text-decoration: underline;
|
|
53
|
+
text-decoration-thickness: 2px;
|
|
54
|
+
text-underline-offset: 4px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.site-nav__link--active {
|
|
58
|
+
background: var(--accent);
|
|
59
|
+
color: var(--accent-contrast);
|
|
60
|
+
border-radius: var(--radius-full); /* pill — playful nav active */
|
|
61
|
+
font-weight: var(--weight-bold);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* CTA in nav: brutalist button */
|
|
65
|
+
.site-nav__cta {
|
|
66
|
+
/* use .btn-primary with border-thick */
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Mobile nav
|
|
71
|
+
Below `--breakpoint-lg`:
|
|
72
|
+
- Hamburger icon: 3 lines, 2px thick
|
|
73
|
+
- Menu: full-screen overlay, `bg-base`, nav items stacked large (`text-xl`), `border-bottom: var(--border-thick)` each item
|
|
74
|
+
- Close: `×` bold, top-right
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Hero Patterns
|
|
79
|
+
|
|
80
|
+
### Hero A — Statement Hero
|
|
81
|
+
|
|
82
|
+
The text IS the visual. No images.
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
bg-base or bg-void
|
|
86
|
+
Optional: pattern-dots or pattern-grid on a background layer (opacity 0.10)
|
|
87
|
+
|
|
88
|
+
[sticker badge: "[OPEN BETA]" rotated] ← optional
|
|
89
|
+
|
|
90
|
+
h1: text-4xl to text-5xl, font-display, weight-extrabold, tracking-normal, max-width 720px
|
|
91
|
+
|
|
92
|
+
p: text-lg, max-width 560px, color text-secondary, margin-top space-6
|
|
93
|
+
|
|
94
|
+
[btn-primary (accent, shadow-lg, control-lg)] [btn-secondary] ← row, gap space-4, margin-top space-8
|
|
95
|
+
|
|
96
|
+
[social proof strip: "★★★★★ Loved by 1,200+ indie hackers" in mono text-sm]
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```css
|
|
100
|
+
.hero-statement {
|
|
101
|
+
padding: var(--space-24) var(--space-8);
|
|
102
|
+
max-width: 1200px;
|
|
103
|
+
margin: 0 auto;
|
|
104
|
+
position: relative;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.hero-statement h1 {
|
|
108
|
+
font-family: var(--font-display);
|
|
109
|
+
font-size: var(--text-5xl);
|
|
110
|
+
font-weight: var(--weight-extrabold);
|
|
111
|
+
color: var(--text-heading);
|
|
112
|
+
letter-spacing: var(--tracking-tight);
|
|
113
|
+
line-height: 1.1;
|
|
114
|
+
max-width: 720px;
|
|
115
|
+
margin-bottom: var(--space-6);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.hero-statement p {
|
|
119
|
+
font-size: var(--text-lg);
|
|
120
|
+
color: var(--text-secondary);
|
|
121
|
+
max-width: 560px;
|
|
122
|
+
line-height: 1.6;
|
|
123
|
+
margin-bottom: var(--space-8);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.hero-statement__actions {
|
|
127
|
+
display: flex;
|
|
128
|
+
gap: var(--space-4);
|
|
129
|
+
flex-wrap: wrap;
|
|
130
|
+
align-items: center;
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### Hero B — Product Brutalist Hero
|
|
137
|
+
|
|
138
|
+
Product screenshot in a brutalist browser frame.
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Left column (50-55%):
|
|
142
|
+
h1: text-3xl, bold
|
|
143
|
+
p: text-base, text-secondary
|
|
144
|
+
[CTA buttons row]
|
|
145
|
+
|
|
146
|
+
Right column (45-50%):
|
|
147
|
+
[BRUTALIST BROWSER FRAME]
|
|
148
|
+
header bar: bg-elevated, border-bottom: thick, 40px height
|
|
149
|
+
● ● ● colored dots (red/amber/green) + URL bar mono
|
|
150
|
+
screenshot: border-thicker on the frame itself, shadow-xl
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```css
|
|
154
|
+
.hero-product {
|
|
155
|
+
display: grid;
|
|
156
|
+
grid-template-columns: 1fr 1fr;
|
|
157
|
+
gap: var(--space-12);
|
|
158
|
+
align-items: center;
|
|
159
|
+
padding: var(--space-20) var(--space-8);
|
|
160
|
+
max-width: 1200px;
|
|
161
|
+
margin: 0 auto;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.browser-frame {
|
|
165
|
+
border: var(--border-thicker);
|
|
166
|
+
box-shadow: var(--shadow-xl);
|
|
167
|
+
background: var(--bg-surface);
|
|
168
|
+
overflow: hidden;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.browser-frame__bar {
|
|
172
|
+
height: 40px;
|
|
173
|
+
background: var(--bg-elevated);
|
|
174
|
+
border-bottom: var(--border-thick);
|
|
175
|
+
display: flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
padding: 0 var(--space-4);
|
|
178
|
+
gap: var(--space-2);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.browser-frame__dot {
|
|
182
|
+
width: 12px;
|
|
183
|
+
height: 12px;
|
|
184
|
+
border-radius: var(--radius-full);
|
|
185
|
+
border: var(--border-thick);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.browser-frame__dot--red { background: #EF4444; border-color: #B91C1C; }
|
|
189
|
+
.browser-frame__dot--amber { background: #F59E0B; border-color: #B45309; }
|
|
190
|
+
.browser-frame__dot--green { background: #22C55E; border-color: #15803D; }
|
|
191
|
+
|
|
192
|
+
.browser-frame__url {
|
|
193
|
+
flex: 1;
|
|
194
|
+
height: 24px;
|
|
195
|
+
background: var(--bg-surface);
|
|
196
|
+
border: var(--border-subtle);
|
|
197
|
+
margin: 0 var(--space-4);
|
|
198
|
+
padding: 0 var(--space-3);
|
|
199
|
+
font-family: var(--font-mono);
|
|
200
|
+
font-size: var(--text-xs);
|
|
201
|
+
color: var(--text-muted);
|
|
202
|
+
display: flex;
|
|
203
|
+
align-items: center;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.browser-frame img {
|
|
207
|
+
display: block;
|
|
208
|
+
width: 100%;
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### Hero C — Manifesto Hero
|
|
215
|
+
|
|
216
|
+
Typographic. Like the first page of a self-published zine.
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
bg-base (full width, minimal)
|
|
220
|
+
|
|
221
|
+
Large text block:
|
|
222
|
+
Mixed sizes: one phrase at text-4xl bold, continuation at text-xl regular
|
|
223
|
+
Specific words with inline highlight: <mark> bg-accent, no border-radius
|
|
224
|
+
|
|
225
|
+
No images. No decoration. The text is the composition.
|
|
226
|
+
|
|
227
|
+
CTA: ghost button or text link with thick underline (minimal — not a chunky CTA)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
```css
|
|
231
|
+
.hero-manifesto {
|
|
232
|
+
padding: var(--space-24) var(--space-8);
|
|
233
|
+
max-width: 900px;
|
|
234
|
+
margin: 0 auto;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.manifesto-text {
|
|
238
|
+
font-family: var(--font-display);
|
|
239
|
+
font-size: var(--text-3xl);
|
|
240
|
+
font-weight: var(--weight-bold);
|
|
241
|
+
line-height: 1.3;
|
|
242
|
+
color: var(--text-heading);
|
|
243
|
+
letter-spacing: var(--tracking-tight);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/* Inline highlight */
|
|
247
|
+
.manifesto-text mark {
|
|
248
|
+
background: var(--accent);
|
|
249
|
+
color: var(--accent-contrast);
|
|
250
|
+
border-radius: 0;
|
|
251
|
+
padding: 2px var(--space-2);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.manifesto-cta {
|
|
255
|
+
display: inline-block;
|
|
256
|
+
margin-top: var(--space-10);
|
|
257
|
+
font-family: var(--font-mono);
|
|
258
|
+
font-size: var(--text-base);
|
|
259
|
+
font-weight: var(--weight-bold);
|
|
260
|
+
color: var(--text-heading);
|
|
261
|
+
text-decoration: underline;
|
|
262
|
+
text-decoration-thickness: 3px;
|
|
263
|
+
text-underline-offset: 4px;
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### Hero D — Grid Mosaic Hero
|
|
270
|
+
|
|
271
|
+
Asymmetric grid of colored brutalist cards. Interactive.
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
headline above or overlaid
|
|
275
|
+
|
|
276
|
+
GRID (asymmetric, e.g. CSS Grid with named areas):
|
|
277
|
+
[2×1 accent card] [1×1 red card]
|
|
278
|
+
[1×1 blue card] [1×2 white card with product feature]
|
|
279
|
+
[1×1 green card] [1×1 accent-dim card]
|
|
280
|
+
|
|
281
|
+
All cards: border-thicker, shadow-md, hover → shadow-lg push
|
|
282
|
+
Background: bg-void
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
```css
|
|
286
|
+
.hero-mosaic {
|
|
287
|
+
padding: var(--space-20) var(--space-8);
|
|
288
|
+
background: var(--bg-void);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.mosaic-headline {
|
|
292
|
+
font-family: var(--font-display);
|
|
293
|
+
font-size: var(--text-4xl);
|
|
294
|
+
font-weight: var(--weight-extrabold);
|
|
295
|
+
letter-spacing: var(--tracking-tight);
|
|
296
|
+
margin-bottom: var(--space-8);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.mosaic-grid {
|
|
300
|
+
display: grid;
|
|
301
|
+
grid-template-columns: repeat(4, 1fr);
|
|
302
|
+
grid-template-rows: repeat(3, 160px);
|
|
303
|
+
gap: var(--space-4);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.mosaic-card {
|
|
307
|
+
border: var(--border-thicker);
|
|
308
|
+
box-shadow: var(--shadow-md);
|
|
309
|
+
padding: var(--space-6);
|
|
310
|
+
cursor: pointer;
|
|
311
|
+
transition: box-shadow var(--transition-fast);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
.mosaic-card:hover { box-shadow: var(--shadow-lg); }
|
|
315
|
+
.mosaic-card:active { box-shadow: none; transform: translate(4px, 4px); }
|
|
316
|
+
|
|
317
|
+
.mosaic-card--accent { background: var(--accent); }
|
|
318
|
+
.mosaic-card--red { background: var(--accent-red); color: white; }
|
|
319
|
+
.mosaic-card--blue { background: var(--accent-blue); color: white; }
|
|
320
|
+
.mosaic-card--green { background: var(--accent-green); }
|
|
321
|
+
.mosaic-card--white { background: var(--bg-surface); }
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Section Patterns
|
|
327
|
+
|
|
328
|
+
### 1. Feature Grid
|
|
329
|
+
|
|
330
|
+
3-column grid of brutalist feature cards.
|
|
331
|
+
|
|
332
|
+
```css
|
|
333
|
+
.feature-grid {
|
|
334
|
+
display: grid;
|
|
335
|
+
grid-template-columns: repeat(3, 1fr);
|
|
336
|
+
gap: var(--space-6);
|
|
337
|
+
padding: var(--space-20) var(--space-8);
|
|
338
|
+
max-width: 1200px;
|
|
339
|
+
margin: 0 auto;
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Cards: `.feature-card` component (icon area with bg-accent, title bold, description text-sm).
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
### 2. Alternating Feature
|
|
348
|
+
|
|
349
|
+
Image and text alternating sides. Images in brutalist frames.
|
|
350
|
+
|
|
351
|
+
```css
|
|
352
|
+
.alternating-feature {
|
|
353
|
+
display: grid;
|
|
354
|
+
grid-template-columns: 1fr 1fr;
|
|
355
|
+
gap: var(--space-12);
|
|
356
|
+
align-items: center;
|
|
357
|
+
padding: var(--space-16) var(--space-8);
|
|
358
|
+
max-width: 1200px;
|
|
359
|
+
margin: 0 auto;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.alternating-feature:nth-child(even) {
|
|
363
|
+
direction: rtl; /* swap sides */
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.alternating-feature img {
|
|
367
|
+
border: var(--border-thicker);
|
|
368
|
+
box-shadow: var(--shadow-lg);
|
|
369
|
+
display: block;
|
|
370
|
+
width: 100%;
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
### 3. Testimonial
|
|
377
|
+
|
|
378
|
+
Large centered quote card.
|
|
379
|
+
|
|
380
|
+
```css
|
|
381
|
+
.testimonial {
|
|
382
|
+
background: var(--bg-surface);
|
|
383
|
+
border: var(--border-thicker);
|
|
384
|
+
box-shadow: var(--shadow-md);
|
|
385
|
+
padding: var(--space-10) var(--space-12);
|
|
386
|
+
max-width: 720px;
|
|
387
|
+
margin: var(--space-20) auto;
|
|
388
|
+
text-align: center;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
.testimonial__quote {
|
|
392
|
+
font-size: var(--text-xl);
|
|
393
|
+
font-style: italic;
|
|
394
|
+
color: var(--text-heading);
|
|
395
|
+
line-height: 1.5;
|
|
396
|
+
margin-bottom: var(--space-6);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.testimonial__attribution {
|
|
400
|
+
font-family: var(--font-mono);
|
|
401
|
+
font-size: var(--text-sm);
|
|
402
|
+
color: var(--text-secondary);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/* Sticker badge: "[★★★★★]" */
|
|
406
|
+
.testimonial__rating {
|
|
407
|
+
/* .sticker component */
|
|
408
|
+
margin-bottom: var(--space-6);
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
### 4. Stats Strip
|
|
415
|
+
|
|
416
|
+
Full-width accent band with bold numbers.
|
|
417
|
+
|
|
418
|
+
```css
|
|
419
|
+
.stats-strip {
|
|
420
|
+
background: var(--accent);
|
|
421
|
+
border-top: var(--border-thicker);
|
|
422
|
+
border-bottom: var(--border-thicker);
|
|
423
|
+
padding: var(--space-10) var(--space-8);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.stats-strip__grid {
|
|
427
|
+
display: grid;
|
|
428
|
+
grid-template-columns: repeat(4, 1fr);
|
|
429
|
+
gap: var(--space-8);
|
|
430
|
+
max-width: 1200px;
|
|
431
|
+
margin: 0 auto;
|
|
432
|
+
text-align: center;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.stats-strip__number {
|
|
436
|
+
font-family: var(--font-mono);
|
|
437
|
+
font-size: var(--text-3xl);
|
|
438
|
+
font-weight: var(--weight-extrabold);
|
|
439
|
+
color: var(--accent-contrast);
|
|
440
|
+
display: block;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.stats-strip__label {
|
|
444
|
+
font-family: var(--font-mono);
|
|
445
|
+
font-size: var(--text-xs);
|
|
446
|
+
font-weight: var(--weight-medium);
|
|
447
|
+
text-transform: uppercase;
|
|
448
|
+
letter-spacing: var(--tracking-wider);
|
|
449
|
+
color: var(--accent-contrast);
|
|
450
|
+
opacity: 0.75;
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
### 5. Pricing
|
|
457
|
+
|
|
458
|
+
2–3 brutalist cards. Featured with sticker badge + shadow-xl.
|
|
459
|
+
|
|
460
|
+
```css
|
|
461
|
+
.pricing-grid {
|
|
462
|
+
display: grid;
|
|
463
|
+
grid-template-columns: repeat(3, 1fr);
|
|
464
|
+
gap: var(--space-6);
|
|
465
|
+
align-items: start;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
.pricing-card {
|
|
469
|
+
background: var(--bg-surface);
|
|
470
|
+
border: var(--border-thicker);
|
|
471
|
+
box-shadow: var(--shadow-md);
|
|
472
|
+
padding: var(--space-8);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.pricing-card--featured {
|
|
476
|
+
box-shadow: var(--shadow-xl);
|
|
477
|
+
position: relative;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/* "[BEST VALUE]" sticker — positioned at top-right */
|
|
481
|
+
.pricing-card--featured .sticker {
|
|
482
|
+
position: absolute;
|
|
483
|
+
top: calc(-1 * var(--space-3));
|
|
484
|
+
right: var(--space-4);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.pricing-price {
|
|
488
|
+
font-family: var(--font-mono);
|
|
489
|
+
font-size: var(--text-3xl);
|
|
490
|
+
font-weight: var(--weight-extrabold);
|
|
491
|
+
color: var(--text-heading);
|
|
492
|
+
margin-bottom: var(--space-6);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
.pricing-feature {
|
|
496
|
+
display: flex;
|
|
497
|
+
align-items: center;
|
|
498
|
+
gap: var(--space-3);
|
|
499
|
+
padding: var(--space-2) 0;
|
|
500
|
+
font-size: var(--text-sm);
|
|
501
|
+
border-bottom: var(--border-subtle);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.pricing-feature:last-child { border-bottom: none; }
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
### 6. CTA Section
|
|
510
|
+
|
|
511
|
+
```css
|
|
512
|
+
.cta-section {
|
|
513
|
+
background: var(--bg-void);
|
|
514
|
+
padding: var(--space-24) var(--space-8);
|
|
515
|
+
text-align: center;
|
|
516
|
+
position: relative;
|
|
517
|
+
overflow: hidden;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/* Optional pattern background */
|
|
521
|
+
.cta-section--pattern::before {
|
|
522
|
+
content: '';
|
|
523
|
+
position: absolute;
|
|
524
|
+
inset: 0;
|
|
525
|
+
background-image: radial-gradient(var(--border-color) 1px, transparent 1px);
|
|
526
|
+
background-size: 20px 20px;
|
|
527
|
+
opacity: 0.10;
|
|
528
|
+
pointer-events: none;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
.cta-section h2 {
|
|
532
|
+
font-family: var(--font-display);
|
|
533
|
+
font-size: var(--text-3xl);
|
|
534
|
+
font-weight: var(--weight-extrabold);
|
|
535
|
+
letter-spacing: var(--tracking-tight);
|
|
536
|
+
margin-bottom: var(--space-8);
|
|
537
|
+
position: relative;
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
---
|
|
542
|
+
|
|
543
|
+
### 7. FAQ
|
|
544
|
+
|
|
545
|
+
Brutalist accordion — `+` / `−` toggle, not chevron.
|
|
546
|
+
|
|
547
|
+
```css
|
|
548
|
+
.faq-item {
|
|
549
|
+
border: var(--border-thick);
|
|
550
|
+
margin-bottom: -1px; /* collapse adjacent borders */
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
.faq-trigger {
|
|
554
|
+
width: 100%;
|
|
555
|
+
background: none;
|
|
556
|
+
border: none;
|
|
557
|
+
padding: var(--space-5) var(--space-6);
|
|
558
|
+
display: flex;
|
|
559
|
+
justify-content: space-between;
|
|
560
|
+
align-items: center;
|
|
561
|
+
font-family: var(--font-display);
|
|
562
|
+
font-size: var(--text-base);
|
|
563
|
+
font-weight: var(--weight-bold);
|
|
564
|
+
color: var(--text-heading);
|
|
565
|
+
cursor: pointer;
|
|
566
|
+
text-align: left;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.faq-trigger:hover { background: var(--bg-elevated); }
|
|
570
|
+
|
|
571
|
+
.faq-icon {
|
|
572
|
+
font-family: var(--font-mono);
|
|
573
|
+
font-size: var(--text-xl);
|
|
574
|
+
font-weight: var(--weight-bold);
|
|
575
|
+
line-height: 1;
|
|
576
|
+
flex-shrink: 0;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
.faq-answer {
|
|
580
|
+
padding: 0 var(--space-6) var(--space-5);
|
|
581
|
+
font-size: var(--text-sm);
|
|
582
|
+
color: var(--text-secondary);
|
|
583
|
+
line-height: 1.7;
|
|
584
|
+
border-top: var(--border-subtle);
|
|
585
|
+
}
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
---
|
|
589
|
+
|
|
590
|
+
### 8. Logo Cloud
|
|
591
|
+
|
|
592
|
+
```css
|
|
593
|
+
.logo-cloud {
|
|
594
|
+
padding: var(--space-12) var(--space-8);
|
|
595
|
+
border-bottom: var(--border-thick);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.logo-cloud__label {
|
|
599
|
+
font-family: var(--font-mono);
|
|
600
|
+
font-size: var(--text-xs);
|
|
601
|
+
text-transform: uppercase;
|
|
602
|
+
letter-spacing: var(--tracking-wider);
|
|
603
|
+
color: var(--text-muted);
|
|
604
|
+
text-align: center;
|
|
605
|
+
margin-bottom: var(--space-6);
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
.logo-cloud__grid {
|
|
609
|
+
display: flex;
|
|
610
|
+
flex-wrap: wrap;
|
|
611
|
+
gap: var(--space-8);
|
|
612
|
+
justify-content: center;
|
|
613
|
+
align-items: center;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
.logo-cloud__logo {
|
|
617
|
+
/* Black/solid — not grayscale with opacity */
|
|
618
|
+
filter: brightness(0);
|
|
619
|
+
opacity: 0.7;
|
|
620
|
+
height: 28px;
|
|
621
|
+
object-fit: contain;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
.logo-cloud__logo:hover { opacity: 1; }
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
---
|
|
628
|
+
|
|
629
|
+
## Footer
|
|
630
|
+
|
|
631
|
+
```css
|
|
632
|
+
.site-footer {
|
|
633
|
+
background: var(--bg-void);
|
|
634
|
+
border-top: var(--border-thickest);
|
|
635
|
+
padding-top: var(--space-12);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
.site-footer__grid {
|
|
639
|
+
display: grid;
|
|
640
|
+
grid-template-columns: repeat(4, 1fr);
|
|
641
|
+
gap: var(--space-8);
|
|
642
|
+
max-width: 1200px;
|
|
643
|
+
margin: 0 auto;
|
|
644
|
+
padding: 0 var(--space-8) var(--space-12);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
.footer-section__title {
|
|
648
|
+
font-family: var(--font-mono);
|
|
649
|
+
font-size: var(--text-xs);
|
|
650
|
+
font-weight: var(--weight-bold);
|
|
651
|
+
text-transform: uppercase;
|
|
652
|
+
letter-spacing: var(--tracking-wider);
|
|
653
|
+
color: var(--text-heading);
|
|
654
|
+
margin-bottom: var(--space-4);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
.footer-section__link {
|
|
658
|
+
display: block;
|
|
659
|
+
font-size: var(--text-sm);
|
|
660
|
+
color: var(--text-secondary);
|
|
661
|
+
text-decoration: none;
|
|
662
|
+
padding: var(--space-1) 0;
|
|
663
|
+
transition: color var(--transition-fast);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
.footer-section__link:hover {
|
|
667
|
+
color: var(--text-heading);
|
|
668
|
+
text-decoration: underline;
|
|
669
|
+
text-decoration-thickness: 2px;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
.site-footer__bottom {
|
|
673
|
+
border-top: var(--border-thick);
|
|
674
|
+
padding: var(--space-4) var(--space-8);
|
|
675
|
+
max-width: 1200px;
|
|
676
|
+
margin: 0 auto;
|
|
677
|
+
display: flex;
|
|
678
|
+
justify-content: space-between;
|
|
679
|
+
align-items: center;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
.site-footer__copyright {
|
|
683
|
+
font-family: var(--font-mono);
|
|
684
|
+
font-size: var(--text-xs);
|
|
685
|
+
color: var(--text-muted);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/* Social icons: square frames */
|
|
689
|
+
.social-icon {
|
|
690
|
+
width: 36px;
|
|
691
|
+
height: 36px;
|
|
692
|
+
border: var(--border-thick);
|
|
693
|
+
display: flex;
|
|
694
|
+
align-items: center;
|
|
695
|
+
justify-content: center;
|
|
696
|
+
color: var(--text-heading);
|
|
697
|
+
text-decoration: none;
|
|
698
|
+
transition: background var(--transition-fast);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.social-icon:hover { background: var(--bg-elevated); }
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
---
|
|
705
|
+
|
|
706
|
+
## Anti-Patterns
|
|
707
|
+
|
|
708
|
+
These patterns are common mistakes in brutalist UI. Avoid all of them.
|
|
709
|
+
|
|
710
|
+
| Anti-pattern | Why it's wrong | What to do instead |
|
|
711
|
+
|---|---|---|
|
|
712
|
+
| `box-shadow: 0 4px 12px rgba(0,0,0,0.15)` | Soft blur shadow = NOT brutalist | `box-shadow: 4px 4px 0 #1A1A1A` — zero blur |
|
|
713
|
+
| `backdrop-filter: blur(12px)` | Glassmorphism, opposite of brutalist | Remove entirely. No blur anywhere. |
|
|
714
|
+
| `border: 1px solid #e5e7eb` | Thin gray border = clean-saas | `border: 2px solid #1A1A1A` — thick, black |
|
|
715
|
+
| `border-radius: 8px` to `16px` | "Normal" radius = medium ground | Use `0` or `9999px` only |
|
|
716
|
+
| Pastel backgrounds | Soft pastels = glassmorphism | Saturated flat colors or off-white |
|
|
717
|
+
| Gradient fills | Gradients = polished SaaS | Flat solid colors only |
|
|
718
|
+
| Illustrated empty states | Cute illustrations = "corporate friendly" | `[NO DATA]` in mono |
|
|
719
|
+
| Card without border | Floating card = clean SaaS | Every card has a visible border |
|
|
720
|
+
| Thin line dividers (`1px #e5e7eb`) | Invisible separators = invisible structure | `border: 2px solid #1A1A1A` |
|
|
721
|
+
| Centered long-form body text | Editorial web convention | Left-aligned paragraphs |
|
|
722
|
+
| Muted status colors (`#86efac` light green) | Legibility, not signal strength | Full-saturation semantic colors |
|
|
723
|
+
| Hover state that only changes opacity | Too subtle | Change background AND border state |
|