@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.
Files changed (93) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/docs/design-previews/cognitive-core-ui-auth.html +95 -0
  3. package/docs/design-previews/cognitive-core-ui-kanban.html +231 -0
  4. package/docs/design-previews/cognitive-core-ui-list-detail.html +174 -0
  5. package/docs/design-previews/cognitive-core-ui-preview.css +1315 -0
  6. package/docs/design-previews/cognitive-core-ui-settings.html +142 -0
  7. package/docs/design-previews/cognitive-core-ui-website.html +190 -1009
  8. package/docs/design-previews/cognitive-core-ui.html +281 -463
  9. package/docs/design-previews/index.html +83 -31
  10. package/package.json +1 -1
  11. package/src/constants.js +578 -514
  12. package/template/.aioson/docs/integrations/dashboard-app-form-publish-mapping.md +183 -0
  13. package/template/.aioson/docs/play/README.md +74 -0
  14. package/template/.aioson/docs/play/agent-usage-guide.md +112 -0
  15. package/template/.aioson/docs/play/app-compatibility-guide.md +117 -0
  16. package/template/.aioson/docs/play/auth-services-and-testing.md +235 -0
  17. package/template/.aioson/docs/play/llm-data-and-bindings.md +238 -0
  18. package/template/.aioson/docs/play/manifest-and-runtime.md +267 -0
  19. package/template/.aioson/docs/play/source-map.md +104 -0
  20. package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
  21. package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
  22. package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
  23. package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
  24. package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
  25. package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
  26. package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
  27. package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
  28. package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
  29. package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
  30. package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
  31. package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
  32. package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
  33. package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
  34. package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
  35. package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
  36. package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
  37. package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
  38. package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
  39. package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
  40. package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
  41. package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
  42. package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
  43. package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
  44. package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
  45. package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
  46. package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
  47. package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
  48. package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
  49. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
  50. package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
  51. package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
  52. package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
  53. package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
  54. package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
  55. package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
  56. package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
  57. package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
  58. package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
  59. package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
  60. package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
  61. package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
  62. package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
  63. package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
  64. package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
  65. package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
  66. package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
  67. package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
  68. package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
  69. package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
  70. package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
  71. package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
  72. package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
  73. package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
  74. package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
  75. package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
  76. package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
  77. package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
  78. package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
  79. package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
  80. package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
  81. package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
  82. package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
  83. package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
  84. package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
  85. package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
  86. package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
  87. package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
  88. package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
  89. package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
  90. package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
  91. package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
  92. package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
  93. 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-tight, 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: clamp(var(--text-3xl), 6vw, 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 |
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 |