get-shit-pretty 0.7.0 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +301 -124
- package/bin/install.js +1 -1
- package/gsp/agents/gsp-accessibility-auditor.md +1 -60
- package/gsp/agents/gsp-brand-auditor.md +1 -61
- package/gsp/agents/gsp-brand-creative-director.md +10 -0
- package/gsp/agents/gsp-brand-engineer.md +1 -122
- package/gsp/agents/gsp-brand-researcher.md +11 -0
- package/gsp/agents/gsp-brand-strategist.md +1 -65
- package/gsp/agents/gsp-project-builder.md +17 -0
- package/gsp/agents/gsp-project-critic.md +11 -0
- package/gsp/agents/gsp-project-designer.md +11 -0
- package/gsp/agents/gsp-project-researcher.md +1 -74
- package/gsp/agents/gsp-project-reviewer.md +12 -0
- package/gsp/hooks/hooks.json +32 -14
- package/gsp/skills/get-shit-pretty/SKILL.md +2 -5
- package/gsp/skills/gsp-accessibility/SKILL.md +0 -1
- package/gsp/skills/gsp-accessibility-audit/SKILL.md +9 -8
- package/gsp/skills/gsp-accessibility-audit/methodology/gsp-accessibility-auditor.md +59 -0
- package/gsp/skills/gsp-add-reference/SKILL.md +0 -1
- package/gsp/skills/gsp-art/SKILL.md +13 -10
- package/gsp/skills/gsp-brand-audit/SKILL.md +4 -2
- package/gsp/skills/gsp-brand-audit/methodology/gsp-brand-auditor.md +61 -0
- package/gsp/skills/gsp-brand-brief/SKILL.md +129 -0
- package/gsp/skills/gsp-brand-guidelines/SKILL.md +13 -11
- package/gsp/skills/gsp-brand-guidelines/methodology/gsp-brand-engineer.md +122 -0
- package/gsp/skills/gsp-brand-identity/SKILL.md +19 -18
- package/gsp/{agents/gsp-creative-director.md → skills/gsp-brand-identity/methodology/gsp-brand-creative-director.md} +0 -9
- package/gsp/skills/gsp-brand-refine/SKILL.md +0 -1
- package/gsp/skills/gsp-brand-research/SKILL.md +13 -13
- package/gsp/{agents/gsp-researcher.md → skills/gsp-brand-research/methodology/gsp-brand-researcher.md} +0 -10
- package/gsp/skills/gsp-brand-strategy/SKILL.md +14 -14
- package/gsp/skills/gsp-brand-strategy/methodology/gsp-brand-strategist.md +65 -0
- package/gsp/skills/gsp-brand-sync/SKILL.md +60 -10
- package/gsp/skills/gsp-color/SKILL.md +0 -1
- package/gsp/skills/gsp-design-system/SKILL.md +0 -1
- package/gsp/skills/gsp-doctor/SKILL.md +0 -1
- package/gsp/skills/gsp-help/SKILL.md +10 -7
- package/gsp/skills/gsp-icons/SKILL.md +0 -1
- package/gsp/skills/gsp-logo/SKILL.md +0 -1
- package/gsp/skills/gsp-phase-transition/SKILL.md +0 -3
- package/gsp/skills/gsp-pretty/SKILL.md +25 -24
- package/gsp/skills/gsp-progress/SKILL.md +0 -1
- package/gsp/skills/gsp-project-brief/SKILL.md +51 -22
- package/gsp/skills/gsp-project-build/SKILL.md +216 -74
- package/gsp/skills/gsp-project-build/bento-grid.md +114 -0
- package/gsp/{agents/gsp-builder.md → skills/gsp-project-build/methodology/gsp-project-builder.md} +14 -16
- package/gsp/skills/gsp-project-critique/SKILL.md +21 -17
- package/gsp/{agents/gsp-critic.md → skills/gsp-project-critique/methodology/gsp-project-critic.md} +0 -11
- package/gsp/skills/gsp-project-design/SKILL.md +9 -6
- package/gsp/{agents/gsp-designer.md → skills/gsp-project-design/methodology/gsp-project-designer.md} +0 -11
- package/gsp/skills/gsp-project-research/SKILL.md +4 -2
- package/gsp/skills/gsp-project-research/methodology/gsp-project-researcher.md +73 -0
- package/gsp/skills/gsp-project-review/SKILL.md +8 -5
- package/gsp/{agents/gsp-reviewer.md → skills/gsp-project-review/methodology/gsp-project-reviewer.md} +0 -12
- package/gsp/skills/gsp-scaffold/SKILL.md +0 -1
- package/gsp/skills/gsp-start/SKILL.md +59 -210
- package/gsp/skills/gsp-style/SKILL.md +1 -2
- package/gsp/skills/gsp-style/styles/INDEX.yml +7 -1
- package/gsp/skills/gsp-style/styles/academia.md +751 -787
- package/gsp/skills/gsp-style/styles/art-deco.md +316 -352
- package/gsp/skills/gsp-style/styles/bauhaus.md +189 -225
- package/gsp/skills/gsp-style/styles/bold-typography.md +433 -469
- package/gsp/skills/gsp-style/styles/botanical.md +141 -177
- package/gsp/skills/gsp-style/styles/claymorphism.md +377 -413
- package/gsp/skills/gsp-style/styles/cyberpunk.md +419 -455
- package/gsp/skills/gsp-style/styles/enterprise.md +224 -260
- package/gsp/skills/gsp-style/styles/flat-design.md +119 -155
- package/gsp/skills/gsp-style/styles/fluent.md +0 -31
- package/gsp/skills/gsp-style/styles/glassmorphism.md +0 -36
- package/gsp/skills/gsp-style/styles/humanist-literary.md +0 -28
- package/gsp/skills/gsp-style/styles/industrial.md +406 -438
- package/gsp/skills/gsp-style/styles/kinetic.md +531 -563
- package/gsp/skills/gsp-style/styles/liquid-glass.md +0 -36
- package/gsp/skills/gsp-style/styles/luxury.md +402 -438
- package/gsp/skills/gsp-style/styles/material.md +555 -591
- package/gsp/skills/gsp-style/styles/maximalism.md +875 -911
- package/gsp/skills/gsp-style/styles/minimal-dark.md +442 -478
- package/gsp/skills/gsp-style/styles/modern-dark.md +390 -426
- package/gsp/skills/gsp-style/styles/monochrome.md +472 -504
- package/gsp/skills/gsp-style/styles/neubrutalism.md +354 -390
- package/gsp/skills/gsp-style/styles/neumorphism.md +195 -231
- package/gsp/skills/gsp-style/styles/newsprint.md +529 -565
- package/gsp/skills/gsp-style/styles/nothing.md +445 -0
- package/gsp/skills/gsp-style/styles/nothing.yml +146 -0
- package/gsp/skills/gsp-style/styles/organic.md +177 -213
- package/gsp/skills/gsp-style/styles/playful-geometric.md +211 -247
- package/gsp/skills/gsp-style/styles/professional.md +503 -539
- package/gsp/skills/gsp-style/styles/retro.md +664 -700
- package/gsp/skills/gsp-style/styles/saas.md +490 -526
- package/gsp/skills/gsp-style/styles/sketch.md +189 -225
- package/gsp/skills/gsp-style/styles/swiss-minimalist.md +195 -227
- package/gsp/skills/gsp-style/styles/terminal.md +99 -135
- package/gsp/skills/gsp-style/styles/vaporwave.md +356 -392
- package/gsp/skills/gsp-style/styles/web3.md +337 -373
- package/gsp/skills/gsp-typography/SKILL.md +0 -1
- package/gsp/skills/gsp-update/SKILL.md +0 -1
- package/gsp/skills/gsp-visuals/SKILL.md +0 -1
- package/gsp/templates/branding/config.json +3 -2
- package/gsp/templates/exports-index.md +0 -7
- package/gsp/templates/phases/build.md +13 -4
- package/gsp/templates/projects/config.json +3 -2
- package/gsp/templates/projects/roadmap.md +0 -7
- package/gsp/templates/projects/state.md +0 -4
- package/package.json +1 -1
- package/scripts/lint-check.sh +1 -1
- package/gsp/agents/gsp-ascii-artist.md +0 -66
- package/gsp/agents/gsp-brand-syncer.md +0 -126
- package/gsp/agents/gsp-campaign-director.md +0 -79
- package/gsp/agents/gsp-scoper.md +0 -85
- package/gsp/skills/gsp-launch/SKILL.md +0 -97
- package/gsp/skills/gsp-start/questioning.md +0 -87
- package/gsp/templates/phases/launch.md +0 -55
|
@@ -1,565 +1,529 @@
|
|
|
1
|
-
<
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
- **
|
|
54
|
-
-
|
|
55
|
-
- **
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
**
|
|
99
|
-
|
|
100
|
-
- **
|
|
101
|
-
|
|
102
|
-
- **
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
**
|
|
112
|
-
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
**
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
-
|
|
226
|
-
-
|
|
227
|
-
|
|
228
|
-
**
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
-
|
|
256
|
-
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
-
|
|
278
|
-
|
|
279
|
-
-
|
|
280
|
-
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
**
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
**
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
**
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
###
|
|
365
|
-
|
|
366
|
-
-
|
|
367
|
-
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
**
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
-
|
|
420
|
-
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
###
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
-
|
|
479
|
-
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
-
|
|
496
|
-
-
|
|
497
|
-
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
Use
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
```css
|
|
531
|
-
.font-serif { font-family: 'Playfair Display', serif; }
|
|
532
|
-
.font-body { font-family: 'Lora', serif; }
|
|
533
|
-
.font-sans { font-family: 'Inter', sans-serif; }
|
|
534
|
-
.font-mono { font-family: 'JetBrains Mono', monospace; }
|
|
535
|
-
```
|
|
536
|
-
|
|
537
|
-
### Tailwind Utilities
|
|
538
|
-
|
|
539
|
-
Create custom utilities in `<style>` block:
|
|
540
|
-
|
|
541
|
-
- `.sharp-corners { border-radius: 0px !important; }`
|
|
542
|
-
- `.newsprint-texture { ... }` (see Textures section)
|
|
543
|
-
- `.hard-shadow-hover:hover { ... }` (see Effects section)
|
|
544
|
-
|
|
545
|
-
### Border Collapse Logic
|
|
546
|
-
|
|
547
|
-
To avoid double borders in grids:
|
|
548
|
-
|
|
549
|
-
1. Use `border-l` and `border-t` on the container
|
|
550
|
-
2. Use `border-r` and `border-b` on children
|
|
551
|
-
3. Remove `border-r` on last column
|
|
552
|
-
4. Remove `border-b` on last row (if needed)
|
|
553
|
-
|
|
554
|
-
### Component Structure (React 19+)
|
|
555
|
-
|
|
556
|
-
- Use ref as prop, not `forwardRef`
|
|
557
|
-
- Use `class-variance-authority` for button/card variants
|
|
558
|
-
- Use `tailwind-merge` to merge className props
|
|
559
|
-
|
|
560
|
-
### Performance
|
|
561
|
-
|
|
562
|
-
- Lazy load images below the fold
|
|
563
|
-
- Use `transform` and `opacity` for animations (GPU accelerated)
|
|
564
|
-
- Avoid animating `box-shadow` directly (use `will-change` if needed)
|
|
565
|
-
`</design-system>`
|
|
1
|
+
<design-system>
|
|
2
|
+
# Design Style: Newsprint
|
|
3
|
+
|
|
4
|
+
## 1. Design Philosophy
|
|
5
|
+
|
|
6
|
+
**"All the News That's Fit to Print."**
|
|
7
|
+
|
|
8
|
+
This style is an ode to the golden age of print journalism, reimagined for the web. It embodies **absolute clarity, hierarchy, and structure** through its unwavering commitment to high-contrast typography, grid-based layouts, and sharp geometric precision.
|
|
9
|
+
|
|
10
|
+
### Core DNA
|
|
11
|
+
|
|
12
|
+
The newsprint aesthetic rejects modern web trends of soft shadows, blurred backgrounds, and rounded corners. Instead, it embraces:
|
|
13
|
+
|
|
14
|
+
- **Stark Geometry**: Zero border radius. Every element is a perfect rectangle with sharp 90-degree corners.
|
|
15
|
+
- **High Information Density**: Tight padding, collapsed grid borders, and efficient use of space mimic newspaper column layouts.
|
|
16
|
+
- **Typographic Drama**: Massive serif headlines (up to 9xl on desktop) paired with smaller, highly legible body text create extreme hierarchy.
|
|
17
|
+
- **Visible Structure**: Grid lines aren't hidden—they're celebrated. Borders between columns and sections are explicit and prominent.
|
|
18
|
+
- **Editorial Authority**: The design feels serious, timeless, and trustworthy—like a publication of record.
|
|
19
|
+
- **Paper Texture**: Subtle grain overlays and line patterns simulate the tactile quality of newsprint without being overly skeuomorphic.
|
|
20
|
+
|
|
21
|
+
### Vibe
|
|
22
|
+
|
|
23
|
+
Authoritative, intellectual, urgent, timeless. It feels like holding a fresh morning newspaper—crisp, organized, and information-rich. The design exudes confidence and credibility.
|
|
24
|
+
|
|
25
|
+
## 2. Design Token System (The DNA)
|
|
26
|
+
|
|
27
|
+
### Colors (Single Palette)
|
|
28
|
+
|
|
29
|
+
**Mode:** Light (Permanent - no dark mode)
|
|
30
|
+
|
|
31
|
+
- **Background:** `#F9F9F7` (Newsprint Off-White)
|
|
32
|
+
A warm off-white that mimics aged paper. Not pure white—adds subtle warmth and reduces eye strain.
|
|
33
|
+
- **Foreground:** `#111111` (Ink Black)
|
|
34
|
+
Very deep black, not pure `#000`. Used for all text and borders.
|
|
35
|
+
- **Muted:** `#E5E5E0` (Divider Grey)
|
|
36
|
+
Light grey for secondary borders and subtle backgrounds.
|
|
37
|
+
- **Accent:** `#CC0000` (Editorial Red)
|
|
38
|
+
Bright, unapologetic red used extremely sparingly—only for breaking news badges, CTAs, and hover states. 99% of the design is black and white.
|
|
39
|
+
- **Border:** `#111111` (Ink Black)
|
|
40
|
+
The primary structural element. Borders define the grid and create visual rhythm.
|
|
41
|
+
- **Neutral Shades:**
|
|
42
|
+
`neutral-100`: `#F5F5F5` (hover backgrounds)
|
|
43
|
+
`neutral-200`: `#E5E5E5` (image placeholders)
|
|
44
|
+
`neutral-400`: `#A3A3A3` (muted text in dark sections)
|
|
45
|
+
`neutral-500`: `#737373` (metadata, captions)
|
|
46
|
+
`neutral-600`: `#525252` (body text variations)
|
|
47
|
+
`neutral-700`: `#404040` (secondary headings)
|
|
48
|
+
|
|
49
|
+
### Typography
|
|
50
|
+
|
|
51
|
+
**Font Stack:**
|
|
52
|
+
|
|
53
|
+
- **Serif (Headlines & Display):** `'Playfair Display', 'Times New Roman', serif`
|
|
54
|
+
High-contrast, elegant, authoritative. Used for all major headings.
|
|
55
|
+
- **Serif (Body):** `'Lora', Georgia, serif`
|
|
56
|
+
Highly legible serif for long-form reading text and paragraphs.
|
|
57
|
+
- **Sans-Serif (UI):** `'Inter', 'Helvetica Neue', sans-serif`
|
|
58
|
+
Clean, modern sans for labels, buttons, navigation, and metadata.
|
|
59
|
+
- **Monospace (Data):** `'JetBrains Mono', 'Courier New', monospace`
|
|
60
|
+
For stats, dates, edition numbers, and technical information.
|
|
61
|
+
|
|
62
|
+
**Scale Strategy:**
|
|
63
|
+
|
|
64
|
+
- **H1 (Hero Headlines):** `text-5xl sm:text-6xl lg:text-9xl` (80px → 128px)
|
|
65
|
+
Massive, viewport-dominating. Use `leading-[0.9]` for ultra-tight line height. Apply `tracking-tighter` for condensed feel.
|
|
66
|
+
- **H2 (Section Headers):** `text-4xl lg:text-5xl` (36px → 48px)
|
|
67
|
+
Bold, `font-black`, uppercase or sentence case depending on context.
|
|
68
|
+
- **H3 (Card Titles):** `text-2xl lg:text-3xl` (24px → 30px)
|
|
69
|
+
`font-bold`, serif.
|
|
70
|
+
- **Body Text:** `text-sm` to `text-lg` (14px → 18px)
|
|
71
|
+
Body font (Lora), `leading-relaxed` (line-height: 1.625).
|
|
72
|
+
- **Metadata/Labels:** `text-xs` (12px)
|
|
73
|
+
Uppercase, `tracking-widest`, monospace or sans.
|
|
74
|
+
|
|
75
|
+
**Text Transform:**
|
|
76
|
+
|
|
77
|
+
- Uppercase for: Navigation, labels, metadata, badges, small caps for author bylines.
|
|
78
|
+
- Sentence case for: Headlines, article titles, body text.
|
|
79
|
+
|
|
80
|
+
### Radius & Border
|
|
81
|
+
|
|
82
|
+
**Border Radius:** `0px` everywhere. No exceptions.
|
|
83
|
+
Use inline styles or a `.sharp-corners` utility class to enforce zero radius on all components.
|
|
84
|
+
|
|
85
|
+
**Border Width:**
|
|
86
|
+
|
|
87
|
+
- Standard: `1px` solid black (`border`, `border-r`, `border-b`)
|
|
88
|
+
- Heavy emphasis: `border-b-4` or `border-4` (4px solid) for major section dividers
|
|
89
|
+
- Collapsed grids: Adjacent elements share borders to avoid double lines
|
|
90
|
+
|
|
91
|
+
**Border Style:**
|
|
92
|
+
Always solid. Never dashed or dotted except for rare decorative elements (e.g., `border-dashed` inside pricing cards for feature dividers).
|
|
93
|
+
|
|
94
|
+
### Shadows/Effects
|
|
95
|
+
|
|
96
|
+
**Philosophy:** Flat design. No soft drop shadows.
|
|
97
|
+
|
|
98
|
+
**Hover Effects:**
|
|
99
|
+
|
|
100
|
+
- **Hard Offset Shadow:** `box-shadow: 4px 4px 0px 0px #111111`
|
|
101
|
+
Applied on hover to blog cards or interactive elements. Creates a "lifted" newspaper cutout effect.
|
|
102
|
+
- **Implementation:**
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
.hard-shadow-hover:hover {
|
|
106
|
+
box-shadow: 4px 4px 0px 0px #111111;
|
|
107
|
+
transform: translate(-2px, -2px);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**No Effects:**
|
|
112
|
+
|
|
113
|
+
- No blur
|
|
114
|
+
- No inner shadows (except for rare decorative purposes)
|
|
115
|
+
- No gradient overlays
|
|
116
|
+
|
|
117
|
+
### Textures & Patterns
|
|
118
|
+
|
|
119
|
+
**Critical for Depth:** The newsprint style avoids "flat generic web design" through layered textures.
|
|
120
|
+
|
|
121
|
+
**1. Dot Grid Pattern (Main Background):**
|
|
122
|
+
|
|
123
|
+
```html
|
|
124
|
+
backgroundImage: `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3E%3Cpath fill='%23111111' fill-opacity='0.04' d='M1 3h1v1H1V3zm2-2h1v1H3V1z'%3E%3C/path%3E%3C/svg%3E")`
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Subtle 4×4px dot pattern applied to the body background.
|
|
128
|
+
|
|
129
|
+
**2. Line Grid Overlay (Section Texture):**
|
|
130
|
+
|
|
131
|
+
```css
|
|
132
|
+
.newsprint-texture {
|
|
133
|
+
position: relative;
|
|
134
|
+
}
|
|
135
|
+
.newsprint-texture::before {
|
|
136
|
+
content: '';
|
|
137
|
+
position: absolute;
|
|
138
|
+
inset: 0;
|
|
139
|
+
background-image:
|
|
140
|
+
linear-gradient(0deg, transparent 98%, rgba(0,0,0,0.02) 100%),
|
|
141
|
+
linear-gradient(90deg, transparent 98%, rgba(0,0,0,0.02) 100%);
|
|
142
|
+
background-size: 3px 3px;
|
|
143
|
+
pointer-events: none;
|
|
144
|
+
opacity: 0.5;
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Apply `.newsprint-texture` to major sections for a fine graph-paper effect.
|
|
149
|
+
|
|
150
|
+
**3. Radial Dot Pattern (Image Placeholders):**
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<div className="bg-[radial-gradient(#000_1px,transparent_1px)] opacity-10 [background-size:16px_16px]" />
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Used in placeholder images to simulate halftone printing.
|
|
157
|
+
|
|
158
|
+
**4. Ornamental Dividers:**
|
|
159
|
+
Use serif ornaments between major sections:
|
|
160
|
+
|
|
161
|
+
```html
|
|
162
|
+
<div className="py-8 text-center font-serif text-2xl text-neutral-400 tracking-[1em]">
|
|
163
|
+
✧ ✧ ✧
|
|
164
|
+
</div>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## 3. Component Stylings
|
|
168
|
+
|
|
169
|
+
### Buttons
|
|
170
|
+
|
|
171
|
+
**Primary Button (Default):**
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
className="bg-[#111111] text-[#F9F9F7] border border-transparent hover:bg-white hover:text-[#111111] hover:border-[#111111]"
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
- Solid black background, white text
|
|
178
|
+
- On hover: Inverts to white background, black text and border
|
|
179
|
+
- Sharp corners (enforced)
|
|
180
|
+
- Uppercase text with `tracking-widest`
|
|
181
|
+
- Transition: `transition-all duration-200`
|
|
182
|
+
|
|
183
|
+
**Secondary Button (Outline):**
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
className="border border-[#111111] bg-transparent hover:bg-[#111111] hover:text-[#F9F9F7]"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
- Transparent background, black border and text
|
|
190
|
+
- On hover: Fills with black, text turns white
|
|
191
|
+
|
|
192
|
+
**Ghost Button:**
|
|
193
|
+
|
|
194
|
+
```tsx
|
|
195
|
+
className="hover:bg-[#E5E5E0] hover:text-[#111111]"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
- No border, subtle grey background on hover
|
|
199
|
+
|
|
200
|
+
**Link Button:**
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
className="text-[#111111] underline-offset-4 decoration-2 decoration-[#CC0000] hover:underline"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
- Text-only, red underline on hover
|
|
207
|
+
|
|
208
|
+
**Touch Targets:**
|
|
209
|
+
Ensure minimum `min-h-[44px]` and `min-w-[44px]` for mobile accessibility.
|
|
210
|
+
|
|
211
|
+
### Cards/Containers
|
|
212
|
+
|
|
213
|
+
**Standard Card:**
|
|
214
|
+
|
|
215
|
+
```tsx
|
|
216
|
+
<div className="border border-[#111111] bg-[#F9F9F7] p-6">
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
- Sharp black border
|
|
220
|
+
- Off-white background
|
|
221
|
+
- Tight padding (p-4 to p-8)
|
|
222
|
+
|
|
223
|
+
**Newspaper Column Grid:**
|
|
224
|
+
|
|
225
|
+
- Use `border-r` and `border-b` to create collapsed grid layouts
|
|
226
|
+
- Example: 4-column feature grid where each cell has `border-r` except the last, and all have `border-b` on mobile
|
|
227
|
+
|
|
228
|
+
**Hover States:**
|
|
229
|
+
|
|
230
|
+
- Add `hover:bg-neutral-100` to interactive cards
|
|
231
|
+
- Optionally add `.hard-shadow-hover` for dramatic lift effect
|
|
232
|
+
|
|
233
|
+
### Inputs
|
|
234
|
+
|
|
235
|
+
**Style:**
|
|
236
|
+
|
|
237
|
+
```tsx
|
|
238
|
+
className="border-b-2 border-[#111111] bg-transparent px-3 py-2 font-mono text-sm focus-visible:bg-[#F0F0F0] focus-visible:outline-none"
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
- Transparent background
|
|
242
|
+
- Only bottom border (2px solid black)
|
|
243
|
+
- Monospace font
|
|
244
|
+
- On focus: Light grey background (`#F0F0F0`), no ring
|
|
245
|
+
|
|
246
|
+
**No Radius:** Enforce `borderRadius: 0px` inline.
|
|
247
|
+
|
|
248
|
+
### Icons
|
|
249
|
+
|
|
250
|
+
**Library:** `lucide-react`
|
|
251
|
+
|
|
252
|
+
**Style:**
|
|
253
|
+
|
|
254
|
+
- `stroke-width={1.5}` or `stroke-1` class
|
|
255
|
+
- Color: Always black (`text-[#111111]`) except in inverted sections (white)
|
|
256
|
+
- Size: `h-6 w-6` standard, `h-4 w-4` for small
|
|
257
|
+
|
|
258
|
+
**Icon Containers:**
|
|
259
|
+
|
|
260
|
+
- Wrap in bordered boxes: `border border-black h-12 w-12 flex items-center justify-center`
|
|
261
|
+
- Hover effect: `hover:bg-black hover:text-white transition-all`
|
|
262
|
+
|
|
263
|
+
## 4. Non-Genericness (The "Bold" Factor)
|
|
264
|
+
|
|
265
|
+
### Mandatory Bold Choices
|
|
266
|
+
|
|
267
|
+
**1. Vertical Grid Dividers:**
|
|
268
|
+
Don't just separate sections horizontally. Use `border-r` to create strict vertical columns even within the same row. The page should feel like a newspaper grid, not a typical website.
|
|
269
|
+
|
|
270
|
+
**2. Drop Caps:**
|
|
271
|
+
Apply massive drop caps (`text-7xl`, `float-left`) to the first letter of key paragraphs (hero intro, product detail). Accent color optional.
|
|
272
|
+
|
|
273
|
+
**3. Marquee Ticker:**
|
|
274
|
+
Use a horizontal scrolling ticker (e.g., `react-fast-marquee`) for stats. Black background, white text, red accent badges. Mimics stock ticker or breaking news crawl.
|
|
275
|
+
|
|
276
|
+
**4. Edition Metadata:**
|
|
277
|
+
Add newspaper-style metadata:
|
|
278
|
+
|
|
279
|
+
- "Vol. 1 | [Date] | New York Edition" in header
|
|
280
|
+
- "Edition: Vol 1.0 | Printed in NYC" in footer
|
|
281
|
+
- "Fig. 1.1" captions on images
|
|
282
|
+
|
|
283
|
+
**5. Justified Text:**
|
|
284
|
+
Use `text-justify` for multi-column body text (blog descriptions, product detail) to create that newspaper column look.
|
|
285
|
+
|
|
286
|
+
**6. Grayscale Images:**
|
|
287
|
+
Apply `grayscale` filter to all images by default. On hover, add `sepia-[50%]` for a vintage newspaper photo effect.
|
|
288
|
+
|
|
289
|
+
**7. Asymmetric Layouts:**
|
|
290
|
+
Don't default to 50/50 splits. Use 8-col/4-col, 5-col/7-col splits for editorial feel.
|
|
291
|
+
|
|
292
|
+
**8. Uppercase Labels:**
|
|
293
|
+
Liberally use `uppercase tracking-widest text-xs font-mono` for section labels, navigation, and metadata.
|
|
294
|
+
|
|
295
|
+
**9. Inverted Sections:**
|
|
296
|
+
Flip at least one major section to black background with white text (e.g., How It Works). Use red accent for numbered steps.
|
|
297
|
+
|
|
298
|
+
## 5. Layout Strategy
|
|
299
|
+
|
|
300
|
+
### Container
|
|
301
|
+
|
|
302
|
+
**Max Width:** `max-w-screen-xl` (1280px)
|
|
303
|
+
Centered with `mx-auto`, horizontal padding `px-4`
|
|
304
|
+
|
|
305
|
+
### Grid System
|
|
306
|
+
|
|
307
|
+
**Base:** 12-column grid
|
|
308
|
+
Use Tailwind's `grid-cols-12` with `col-span-*` for precise control.
|
|
309
|
+
|
|
310
|
+
**Common Splits:**
|
|
311
|
+
|
|
312
|
+
- Hero: `lg:col-span-8` / `lg:col-span-4`
|
|
313
|
+
- Benefits: `lg:col-span-5` / `lg:col-span-7`
|
|
314
|
+
- Footer: `col-span-2` for logo/description, `col-span-1` for link columns
|
|
315
|
+
|
|
316
|
+
**Collapsed Borders:**
|
|
317
|
+
Adjacent grid cells share borders. Use `border-r` on all but the last column, `border-b` on all rows.
|
|
318
|
+
|
|
319
|
+
### Spacing
|
|
320
|
+
|
|
321
|
+
**Philosophy:** High information density. Tighter than typical web design.
|
|
322
|
+
|
|
323
|
+
- Section padding: `py-16` (vertical)
|
|
324
|
+
- Card padding: `p-6` to `p-8`
|
|
325
|
+
- Gap between items: `gap-6` to `gap-8`
|
|
326
|
+
- Mobile: Reduce to `p-4`, `gap-4`
|
|
327
|
+
|
|
328
|
+
### Z-Index Layers
|
|
329
|
+
|
|
330
|
+
- Header (sticky): `z-40`
|
|
331
|
+
- Overlays/modals: `z-50`
|
|
332
|
+
|
|
333
|
+
## 6. Effects & Animation
|
|
334
|
+
|
|
335
|
+
### Motion Philosophy
|
|
336
|
+
|
|
337
|
+
Fast, snappy, mechanical. No bouncy or organic easing.
|
|
338
|
+
|
|
339
|
+
**Transition Classes:**
|
|
340
|
+
|
|
341
|
+
```tsx
|
|
342
|
+
"transition-all duration-200 ease-out"
|
|
343
|
+
"transition-colors duration-200"
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Hover Behaviors:**
|
|
347
|
+
|
|
348
|
+
1. **Color Inversion:** Buttons, icons flip between black/white instantly
|
|
349
|
+
2. **Hard Shadows:** Cards gain offset shadow + slight translate
|
|
350
|
+
3. **Underlines:** Links gain thick underline (`decoration-2 decoration-[#CC0000]`)
|
|
351
|
+
4. **Scale:** Small elements like dots can `hover:scale-150`
|
|
352
|
+
5. **Background:** Containers get subtle grey background (`hover:bg-neutral-100`)
|
|
353
|
+
|
|
354
|
+
**No Floating:** Elements don't "lift" with soft shadows. They snap into place with hard shadows.
|
|
355
|
+
|
|
356
|
+
**Accordion Animation:**
|
|
357
|
+
|
|
358
|
+
```tsx
|
|
359
|
+
className="grid transition-all duration-300 ease-in-out"
|
|
360
|
+
// Open: grid-rows-[1fr] opacity-100
|
|
361
|
+
// Closed: grid-rows-[0fr] opacity-0
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Micro-Interactions
|
|
365
|
+
|
|
366
|
+
- FAQ plus icons rotate 45° when open
|
|
367
|
+
- Blog card images scale 105% on hover
|
|
368
|
+
- Feature icon boxes invert colors on hover
|
|
369
|
+
- Navigation links turn red on hover
|
|
370
|
+
|
|
371
|
+
## 7. Spacing, Layout & Iconography
|
|
372
|
+
|
|
373
|
+
### Default Max-Width
|
|
374
|
+
|
|
375
|
+
`max-w-screen-xl` (1280px) for primary content container.
|
|
376
|
+
|
|
377
|
+
### Spacing System
|
|
378
|
+
|
|
379
|
+
Use an 8px grid system. Common values:
|
|
380
|
+
|
|
381
|
+
- Tight: `gap-2` (8px), `p-2` (8px)
|
|
382
|
+
- Standard: `gap-4` (16px), `p-4` (16px)
|
|
383
|
+
- Comfortable: `gap-8` (32px), `p-8` (32px)
|
|
384
|
+
- Spacious: `gap-16` (64px), `py-16` (64px)
|
|
385
|
+
|
|
386
|
+
**Mobile:** Reduce by one step (e.g., `p-8` → `p-6`)
|
|
387
|
+
|
|
388
|
+
### Iconography
|
|
389
|
+
|
|
390
|
+
**Integration:**
|
|
391
|
+
|
|
392
|
+
- Icons inside bordered boxes (feature cards)
|
|
393
|
+
- Icons as section markers (small squares, bullets)
|
|
394
|
+
- Icons in navigation (minimal use)
|
|
395
|
+
- Icons in social links (bordered boxes in footer)
|
|
396
|
+
|
|
397
|
+
**Style Consistency:**
|
|
398
|
+
|
|
399
|
+
- All icons from `lucide-react`
|
|
400
|
+
- Consistent stroke width (`stroke-1`)
|
|
401
|
+
- Black color by default, white in inverted sections
|
|
402
|
+
|
|
403
|
+
## 8. Responsive Strategy
|
|
404
|
+
|
|
405
|
+
### Breakpoints
|
|
406
|
+
|
|
407
|
+
- Mobile: `< 768px` (default)
|
|
408
|
+
- Tablet: `md:` (768px+)
|
|
409
|
+
- Desktop: `lg:` (1024px+)
|
|
410
|
+
|
|
411
|
+
### Mobile Adaptations
|
|
412
|
+
|
|
413
|
+
1. **Grid Collapse:**
|
|
414
|
+
Multi-column grids collapse to single column (`grid-cols-1`)
|
|
415
|
+
2. **Border Removal:**
|
|
416
|
+
Remove `border-r` on mobile, keep `border-b` for horizontal separators
|
|
417
|
+
|
|
418
|
+
```css
|
|
419
|
+
@media (max-width: 767px) {
|
|
420
|
+
.grid-border-r { border-right: none; }
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
3. **Typography Scaling:**
|
|
424
|
+
Headlines shrink dramatically: `text-5xl` → `text-6xl` → `text-9xl`
|
|
425
|
+
4. **Padding Reduction:**
|
|
426
|
+
`p-16` → `p-8` → `p-6` on smaller screens
|
|
427
|
+
5. **Touch Targets:**
|
|
428
|
+
All interactive elements minimum `44x44px` (`min-h-[44px] min-w-[44px]`)
|
|
429
|
+
6. **CTA Buttons:**
|
|
430
|
+
Full width on mobile (`w-full md:w-auto`)
|
|
431
|
+
7. **Navigation:**
|
|
432
|
+
Show hamburger menu icon on mobile (44px tap target)
|
|
433
|
+
Hide main nav links, show mobile menu
|
|
434
|
+
|
|
435
|
+
### Maintaining Aesthetic
|
|
436
|
+
|
|
437
|
+
Even on mobile, preserve:
|
|
438
|
+
|
|
439
|
+
- Sharp corners (zero radius)
|
|
440
|
+
- High contrast
|
|
441
|
+
- Grid-based layout (just single column)
|
|
442
|
+
- Horizontal rule separators between sections
|
|
443
|
+
- Uppercase labels and metadata
|
|
444
|
+
|
|
445
|
+
## 9. Accessibility & Best Practices
|
|
446
|
+
|
|
447
|
+
### Contrast Ratios
|
|
448
|
+
|
|
449
|
+
- Black `#111111` on Off-White `#F9F9F7`: **AAA compliant** (>17:1)
|
|
450
|
+
- Red `#CC0000` on Off-White: **AA compliant** (>5:1)
|
|
451
|
+
- Never put red text on black background
|
|
452
|
+
|
|
453
|
+
### Focus States
|
|
454
|
+
|
|
455
|
+
```tsx
|
|
456
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-950 focus-visible:ring-offset-2"
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
- Thick black ring (2px)
|
|
460
|
+
- 2px offset for visibility
|
|
461
|
+
- Only visible when using keyboard navigation (`:focus-visible`)
|
|
462
|
+
|
|
463
|
+
### Semantic HTML
|
|
464
|
+
|
|
465
|
+
- Use `<header>`, `<nav>`, `<section>`, `<footer>`
|
|
466
|
+
- Use `<h1>` through `<h6>` in proper hierarchy
|
|
467
|
+
- Use `<button>` for interactive elements, not divs
|
|
468
|
+
- Use `<a>` for links with proper `href`
|
|
469
|
+
|
|
470
|
+
### ARIA Labels
|
|
471
|
+
|
|
472
|
+
- Add `aria-label` to icon-only buttons
|
|
473
|
+
- Add `alt` text to all images (even decorative ones)
|
|
474
|
+
- Add `role="img"` and `aria-labelledby` to SVG icons
|
|
475
|
+
|
|
476
|
+
### Keyboard Navigation
|
|
477
|
+
|
|
478
|
+
- All interactive elements must be keyboard accessible
|
|
479
|
+
- Visible focus states (see above)
|
|
480
|
+
- Accordion items use `button` with proper `aria-expanded`
|
|
481
|
+
|
|
482
|
+
## 10. Implementation Constraints
|
|
483
|
+
|
|
484
|
+
### Font Import
|
|
485
|
+
|
|
486
|
+
Use `@import` in inline `<style>` tag:
|
|
487
|
+
|
|
488
|
+
```css
|
|
489
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Playfair+Display:ital,wght@0,400;0,600;0,700;0,900;1,400&family=Lora:ital,wght@0,400;0,600;1,400&display=block');
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
Define font classes:
|
|
493
|
+
|
|
494
|
+
```css
|
|
495
|
+
.font-serif { font-family: 'Playfair Display', serif; }
|
|
496
|
+
.font-body { font-family: 'Lora', serif; }
|
|
497
|
+
.font-sans { font-family: 'Inter', sans-serif; }
|
|
498
|
+
.font-mono { font-family: 'JetBrains Mono', monospace; }
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
### Tailwind Utilities
|
|
502
|
+
|
|
503
|
+
Create custom utilities in `<style>` block:
|
|
504
|
+
|
|
505
|
+
- `.sharp-corners { border-radius: 0px !important; }`
|
|
506
|
+
- `.newsprint-texture { ... }` (see Textures section)
|
|
507
|
+
- `.hard-shadow-hover:hover { ... }` (see Effects section)
|
|
508
|
+
|
|
509
|
+
### Border Collapse Logic
|
|
510
|
+
|
|
511
|
+
To avoid double borders in grids:
|
|
512
|
+
|
|
513
|
+
1. Use `border-l` and `border-t` on the container
|
|
514
|
+
2. Use `border-r` and `border-b` on children
|
|
515
|
+
3. Remove `border-r` on last column
|
|
516
|
+
4. Remove `border-b` on last row (if needed)
|
|
517
|
+
|
|
518
|
+
### Component Structure (React 19+)
|
|
519
|
+
|
|
520
|
+
- Use ref as prop, not `forwardRef`
|
|
521
|
+
- Use `class-variance-authority` for button/card variants
|
|
522
|
+
- Use `tailwind-merge` to merge className props
|
|
523
|
+
|
|
524
|
+
### Performance
|
|
525
|
+
|
|
526
|
+
- Lazy load images below the fold
|
|
527
|
+
- Use `transform` and `opacity` for animations (GPU accelerated)
|
|
528
|
+
- Avoid animating `box-shadow` directly (use `will-change` if needed)
|
|
529
|
+
`</design-system>`
|