@jaimevalasek/aioson 1.30.1 → 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 (90) hide show
  1. package/CHANGELOG.md +9 -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 +567 -511
  12. package/template/.aioson/docs/play/README.md +2 -0
  13. package/template/.aioson/docs/play/agent-usage-guide.md +7 -1
  14. package/template/.aioson/docs/play/app-compatibility-guide.md +6 -1
  15. package/template/.aioson/docs/play/auth-services-and-testing.md +16 -1
  16. package/template/.aioson/docs/play/manifest-and-runtime.md +23 -0
  17. package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
  18. package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
  19. package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
  20. package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
  21. package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
  22. package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
  23. package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
  24. package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
  25. package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
  26. package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
  27. package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
  28. package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
  29. package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
  30. package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
  31. package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
  32. package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
  33. package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
  34. package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
  35. package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
  36. package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
  37. package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
  38. package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
  39. package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
  40. package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
  41. package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
  42. package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
  43. package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
  44. package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
  45. package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
  46. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
  47. package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
  48. package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
  49. package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
  50. package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
  51. package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
  52. package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
  53. package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
  54. package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
  55. package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
  56. package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
  57. package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
  58. package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
  59. package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
  60. package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
  61. package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
  62. package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
  63. package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
  64. package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
  65. package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
  66. package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
  67. package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
  68. package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
  69. package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
  70. package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
  71. package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
  72. package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
  73. package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
  74. package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
  75. package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
  76. package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
  77. package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
  78. package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
  79. package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
  80. package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
  81. package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
  82. package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
  83. package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
  84. package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
  85. package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
  86. package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
  87. package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
  88. package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
  89. package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
  90. 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 |