@invisibleloop/pulse 0.14.1 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.claude/commands/build-page.md +5 -1
  2. package/.claude/commands/verify.md +23 -13
  3. package/docs/.claude/pulse-checklist.md +5 -3
  4. package/docs/public/.pulse-ui-version +1 -1
  5. package/docs/public/docs.css +236 -0
  6. package/docs/public/home-brut.css +998 -0
  7. package/docs/public/menu.js +237 -6
  8. package/docs/public/pulse-ui.css +44 -0
  9. package/docs/public/theme.css +8 -0
  10. package/docs/server.js +24 -0
  11. package/docs/src/lib/layout.js +51 -3
  12. package/docs/src/pages/getting-started.js +1 -1
  13. package/docs/src/pages/home.js +231 -312
  14. package/docs/src/pages/how-it-works.js +67 -12
  15. package/examples/.claude/commands/pulse-build.md +7 -0
  16. package/examples/.claude/commands/pulse-dev.md +7 -0
  17. package/examples/.claude/commands/pulse-start.md +9 -0
  18. package/examples/.claude/commands/pulse-stop.md +5 -0
  19. package/examples/.claude/commands/verify.md +84 -0
  20. package/examples/.claude/coverage-check.js +127 -0
  21. package/examples/.claude/pulse-checklist.md +177 -0
  22. package/examples/public/.pulse-ui-version +1 -0
  23. package/examples/public/pulse-ui.css +4031 -0
  24. package/examples/public/pulse-ui.js +257 -0
  25. package/package.json +1 -1
  26. package/public/.pulse-ui-version +1 -1
  27. package/public/pulse-ui.css +44 -0
  28. package/scripts/build.js +127 -21
  29. package/src/agent/checklist.md +5 -3
  30. package/src/agent/guide-components.md +2 -2
  31. package/src/agent/guide-examples.md +310 -32
  32. package/src/agent/guide-styles.md +15 -0
  33. package/src/agent/guide-templates.md +3 -0
  34. package/src/agent/identity.md +2 -1
  35. package/src/agent/skills/verify/SKILL.md +64 -28
  36. package/src/agent/workflow.md +53 -17
  37. package/src/cli/dev.js +49 -13
  38. package/src/cli/index.js +4 -10
  39. package/src/cli/logger.js +145 -0
  40. package/src/cli/scaffold.js +55 -1
  41. package/src/mcp/server.js +174 -26
  42. package/src/mcp/validate-worker.js +21 -6
  43. package/src/server/index.js +20 -16
  44. package/src/spec/schema.js +19 -3
  45. package/src/spec/schema.test.js +28 -0
  46. package/src/ui/button.js +1 -1
@@ -0,0 +1,998 @@
1
+ /* home-brut.css — brutalist home page layout */
2
+ /* No hex values here — all colour values are in docs.css tokens */
3
+
4
+ /* ─── Layout root ─────────────────────────────────────────────────────────── */
5
+ .brut {
6
+ min-height: 100vh;
7
+ background: var(--brut-yellow);
8
+ color: var(--brut-ink);
9
+ font-family: "Inter", var(--font);
10
+ --brut-muted: var(--brut-ink);
11
+ }
12
+
13
+ /* ─── Nav ─────────────────────────────────────────────────────────────────── */
14
+ .brut-nav {
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: space-between;
18
+ padding: 0 2rem;
19
+ height: 52px;
20
+ background: var(--brut-ink);
21
+ border-bottom: 3px solid var(--brut-yellow);
22
+ position: sticky;
23
+ top: 0;
24
+ z-index: 100;
25
+ }
26
+
27
+ .brut-nav-logo {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 0.5rem;
31
+ color: var(--brut-yellow);
32
+ font-weight: 900;
33
+ font-size: 1rem;
34
+ letter-spacing: 0.12em;
35
+ text-decoration: none;
36
+ }
37
+ .brut-nav-logo:hover {
38
+ color: var(--brut-surface);
39
+ }
40
+
41
+ .brut-nav-links {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 0;
45
+ }
46
+
47
+ .brut-nav-links a {
48
+ color: rgba(255, 255, 255, 0.7);
49
+ font-size: 0.875rem;
50
+ font-weight: 600;
51
+ text-decoration: none;
52
+ padding: 0 1rem;
53
+ height: 52px;
54
+ display: flex;
55
+ align-items: center;
56
+ border-left: 1px solid rgba(255, 255, 255, 0.1);
57
+ transition:
58
+ color 0.1s,
59
+ background 0.1s;
60
+ }
61
+ .brut-nav-links a:hover {
62
+ color: var(--brut-surface);
63
+ background: rgba(255, 255, 255, 0.06);
64
+ }
65
+
66
+ .brut-nav-cta {
67
+ background: var(--brut-yellow) !important;
68
+ color: var(--brut-ink) !important;
69
+ font-weight: 800 !important;
70
+ letter-spacing: 0.04em;
71
+ }
72
+ .brut-nav-cta:hover {
73
+ background: var(--brut-surface) !important;
74
+ color: var(--brut-ink) !important;
75
+ }
76
+
77
+ /* ─── Hero ────────────────────────────────────────────────────────────────── */
78
+ .brut-hero {
79
+ display: grid;
80
+ grid-template-columns: 1fr 50%;
81
+ grid-template-rows: auto 1fr;
82
+ gap: 0;
83
+ border-bottom: 3px solid var(--brut-ink);
84
+ min-height: 60vh;
85
+ position: relative;
86
+ }
87
+
88
+ .brut-hero-tag {
89
+ grid-column: 1 / -1;
90
+ background: var(--brut-ink);
91
+ color: var(--brut-yellow);
92
+ font-size: 0.72rem;
93
+ font-weight: 800;
94
+ letter-spacing: 0.15em;
95
+ text-transform: uppercase;
96
+ padding: 0.55rem 2.5rem;
97
+ border-bottom: 3px solid var(--brut-yellow);
98
+ }
99
+
100
+ .brut-hero-h1 {
101
+ grid-column: 1;
102
+ grid-row: 2;
103
+ padding: 3rem 2.5rem 3rem;
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: 0;
107
+ line-height: 0.88;
108
+ font-weight: 900;
109
+ letter-spacing: -0.04em;
110
+ border-right: 3px solid var(--brut-ink);
111
+ align-self: stretch;
112
+ }
113
+
114
+ .brut-hero-kicker {
115
+ display: block;
116
+ font-size: 1.5rem;
117
+ font-weight: 600;
118
+ letter-spacing: 0.08em;
119
+ text-transform: lowercase;
120
+ color: var(--brut-muted);
121
+ margin-bottom: 1rem;
122
+ }
123
+
124
+ .brut-hero-line1 {
125
+ font-size: clamp(4rem, 11vw, 10rem);
126
+ display: block;
127
+ }
128
+ .brut-hero-line2 {
129
+ display: block;
130
+ font-size: clamp(4rem, 11vw, 10rem);
131
+ line-height: 0.88;
132
+ }
133
+ .brut-hero-svg {
134
+ display: block;
135
+ width: auto;
136
+ height: 0.88em;
137
+ font-size: inherit;
138
+ overflow: visible;
139
+ }
140
+ .brut-hero-svg-text {
141
+ font-size: clamp(4rem, 11vw, 10rem);
142
+ letter-spacing: 0.01em;
143
+ }
144
+ .brut-hero-line3 {
145
+ font-size: clamp(2rem, 5.5vw, 5rem);
146
+ display: block;
147
+ line-height: 1;
148
+ margin-top: 0.5rem;
149
+ }
150
+
151
+ .brut-hero-aside {
152
+ grid-column: 2;
153
+ grid-row: 2;
154
+ padding: 3rem 2.5rem 3rem;
155
+ display: flex;
156
+ flex-direction: column;
157
+ gap: 1.5rem;
158
+ justify-content: flex-end;
159
+ }
160
+
161
+ .brut-hero-tag-inline {
162
+ font-size: 0.72rem;
163
+ font-weight: 900;
164
+ letter-spacing: 0.15em;
165
+ text-transform: uppercase;
166
+ color: var(--brut-muted);
167
+ }
168
+
169
+ .brut-hero-desc {
170
+ font-size: 1.05rem;
171
+ line-height: 1.7;
172
+ color: var(--brut-ink);
173
+ }
174
+
175
+ .brut-hero-sub {
176
+ font-size: 0.95rem;
177
+ color: var(--brut-ink);
178
+ border-left: 4px solid var(--brut-ink);
179
+ padding-left: 1rem;
180
+ }
181
+
182
+ .brut-hero-ctas {
183
+ display: flex;
184
+ gap: 0;
185
+ margin-top: 0.5rem;
186
+ }
187
+
188
+ /* ─── Buttons ─────────────────────────────────────────────────────────────── */
189
+ .brut-btn-primary {
190
+ display: inline-flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ padding: 0.85rem 1.75rem;
194
+ background: var(--brut-ink);
195
+ color: var(--brut-yellow);
196
+ font-size: 0.9rem;
197
+ font-weight: 800;
198
+ letter-spacing: 0.08em;
199
+ text-transform: uppercase;
200
+ text-decoration: none;
201
+ border: 3px solid var(--brut-ink);
202
+ transition:
203
+ background 0.1s,
204
+ color 0.1s;
205
+ }
206
+ .brut-btn-primary:hover {
207
+ background: var(--brut-yellow);
208
+ color: var(--brut-ink);
209
+ }
210
+ .brut-btn-primary--inv {
211
+ background: var(--brut-yellow);
212
+ color: var(--brut-ink);
213
+ border-color: var(--brut-yellow);
214
+ }
215
+ .brut-btn-primary--inv:hover {
216
+ background: var(--brut-ink);
217
+ color: var(--brut-yellow);
218
+ border-color: var(--brut-ink);
219
+ }
220
+
221
+ .brut-btn-ghost {
222
+ display: inline-flex;
223
+ align-items: center;
224
+ justify-content: center;
225
+ padding: 0.85rem 1.75rem;
226
+ background: transparent;
227
+ color: var(--brut-ink);
228
+ font-size: 0.9rem;
229
+ font-weight: 800;
230
+ letter-spacing: 0.08em;
231
+ text-transform: uppercase;
232
+ text-decoration: none;
233
+ border: 3px solid var(--brut-ink);
234
+ border-left: none;
235
+ transition: background 0.1s;
236
+ }
237
+ .brut-btn-ghost:hover {
238
+ background: rgba(10, 10, 10, 0.08);
239
+ color: var(--brut-ink);
240
+ }
241
+
242
+ .brut-btn-ghost--light {
243
+ color: var(--brut-yellow);
244
+ border-color: var(--brut-yellow);
245
+ border-left: none;
246
+ }
247
+ .brut-btn-ghost--light:hover {
248
+ background: rgba(240, 230, 66, 0.12);
249
+ color: var(--brut-yellow);
250
+ }
251
+
252
+ /* ─── Stats bar ───────────────────────────────────────────────────────────── */
253
+ .brut-stats-bar {
254
+ display: grid;
255
+ grid-template-columns: repeat(4, 1fr);
256
+ background: var(--brut-ink);
257
+ border-bottom: 3px solid var(--brut-yellow);
258
+ }
259
+
260
+ .brut-stat {
261
+ display: flex;
262
+ flex-direction: column;
263
+ gap: 0.3rem;
264
+ padding: 1.75rem 2rem;
265
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
266
+ }
267
+ .brut-stat:last-child {
268
+ border-right: none;
269
+ }
270
+
271
+ .brut-stat-val {
272
+ font-size: 2.25rem;
273
+ font-weight: 900;
274
+ color: var(--brut-yellow);
275
+ letter-spacing: -0.03em;
276
+ line-height: 1;
277
+ }
278
+
279
+ .brut-stat-lbl {
280
+ font-size: 0.78rem;
281
+ color: rgba(255, 255, 255, 0.55);
282
+ font-weight: 500;
283
+ line-height: 1.4;
284
+ }
285
+
286
+ /* ─── The idea ────────────────────────────────────────────────────────────── */
287
+ .brut-idea {
288
+ border-bottom: 3px solid var(--brut-ink);
289
+ padding: 4rem 2.5rem;
290
+ }
291
+
292
+ .brut-idea-label {
293
+ font-size: 0.72rem;
294
+ font-weight: 900;
295
+ letter-spacing: 0.18em;
296
+ text-transform: uppercase;
297
+ margin-bottom: 2.5rem;
298
+ padding-bottom: 1rem;
299
+ border-bottom: 1px solid var(--brut-ink);
300
+ }
301
+
302
+ .brut-idea-grid {
303
+ display: grid;
304
+ grid-template-columns: repeat(3, 1fr);
305
+ gap: 0;
306
+ }
307
+
308
+ .brut-idea-step {
309
+ padding: 2rem 2.5rem 2rem 0;
310
+ border-right: 3px solid var(--brut-ink);
311
+ padding-right: 2.5rem;
312
+ }
313
+ .brut-idea-step:first-child {
314
+ padding-left: 0;
315
+ }
316
+ .brut-idea-step:last-child {
317
+ border-right: none;
318
+ padding-left: 2.5rem;
319
+ padding-right: 0;
320
+ }
321
+ .brut-idea-step:not(:first-child):not(:last-child) {
322
+ padding-left: 2.5rem;
323
+ }
324
+
325
+ .brut-idea-num {
326
+ font-size: 3.5rem;
327
+ font-weight: 900;
328
+ line-height: 1;
329
+ letter-spacing: -0.04em;
330
+ color: transparent;
331
+ -webkit-text-stroke: 2px var(--brut-ink);
332
+ margin-bottom: 1rem;
333
+ }
334
+
335
+ .brut-idea-step h2 {
336
+ font-size: 1.1rem;
337
+ font-weight: 800;
338
+ letter-spacing: -0.01em;
339
+ margin-bottom: 0.75rem;
340
+ }
341
+
342
+ .brut-idea-step p {
343
+ font-size: 0.95rem;
344
+ line-height: 1.7;
345
+ color: var(--brut-muted);
346
+ }
347
+
348
+ /* ─── Code section ────────────────────────────────────────────────────────── */
349
+ .brut-code-section {
350
+ background: var(--brut-dark);
351
+ border-bottom: 3px solid var(--brut-yellow);
352
+ padding: 5rem 2.5rem 6rem;
353
+ }
354
+
355
+ .brut-code-header {
356
+ margin-bottom: 3rem;
357
+ max-width: 600px;
358
+ }
359
+
360
+ .brut-code-header h2 {
361
+ font-size: clamp(1.8rem, 3.5vw, 2.6rem);
362
+ font-weight: 900;
363
+ line-height: 1.1;
364
+ letter-spacing: -0.03em;
365
+ color: var(--brut-surface);
366
+ margin-bottom: 1rem;
367
+ }
368
+
369
+ .brut-code-header p {
370
+ font-size: 1.05rem;
371
+ color: rgba(255, 255, 255, 0.5);
372
+ line-height: 1.7;
373
+ }
374
+
375
+ .brut-code-block {
376
+ max-width: 900px;
377
+ }
378
+
379
+ /* ─── Constraint / AI section ─────────────────────────────────────────────── */
380
+ .brut-constraint {
381
+ border-bottom: 3px solid var(--brut-ink);
382
+ }
383
+
384
+ .brut-constraint-inner {
385
+ padding: 5rem 2.5rem;
386
+ }
387
+
388
+ .brut-constraint-label {
389
+ font-size: 0.72rem;
390
+ font-weight: 900;
391
+ letter-spacing: 0.18em;
392
+ text-transform: uppercase;
393
+ margin-bottom: 1.5rem;
394
+ }
395
+
396
+ .brut-constraint-h2 {
397
+ font-size: clamp(2.5rem, 6vw, 5rem);
398
+ font-weight: 900;
399
+ line-height: 0.95;
400
+ letter-spacing: -0.04em;
401
+ margin-bottom: 2rem;
402
+ }
403
+
404
+ .brut-constraint-lead {
405
+ font-size: 1.1rem;
406
+ line-height: 1.75;
407
+ color: var(--brut-muted);
408
+ max-width: 68ch;
409
+ margin-bottom: 3rem;
410
+ }
411
+
412
+ .brut-constraint-cols {
413
+ display: grid;
414
+ grid-template-columns: 1fr 1fr;
415
+ gap: 0;
416
+ border-top: 3px solid var(--brut-ink);
417
+ }
418
+
419
+ .brut-col {
420
+ padding: 2rem 2.5rem 2rem 0;
421
+ border-right: 3px solid var(--brut-ink);
422
+ }
423
+
424
+ .brut-col--hi {
425
+ padding: 2rem 0 2rem 2.5rem;
426
+ border-right: none;
427
+ background: var(--brut-ink);
428
+ color: var(--brut-surface);
429
+ margin: 0;
430
+ padding: 2rem 2.5rem;
431
+ }
432
+
433
+ .brut-col-head {
434
+ font-size: 0.72rem;
435
+ font-weight: 900;
436
+ letter-spacing: 0.15em;
437
+ text-transform: uppercase;
438
+ margin-bottom: 1.25rem;
439
+ color: var(--brut-muted);
440
+ }
441
+
442
+ .brut-col-head--hi {
443
+ color: var(--brut-yellow);
444
+ }
445
+
446
+ .brut-col-list {
447
+ list-style: none;
448
+ display: flex;
449
+ flex-direction: column;
450
+ gap: 0.85rem;
451
+ }
452
+
453
+ .brut-col-list li {
454
+ font-size: 1rem;
455
+ line-height: 1.6;
456
+ padding-left: 1.25rem;
457
+ position: relative;
458
+ color: rgba(10, 10, 10, 0.7);
459
+ }
460
+
461
+ .brut-col-list li::before {
462
+ content: "—";
463
+ position: absolute;
464
+ left: 0;
465
+ font-weight: 700;
466
+ }
467
+
468
+ .brut-col--hi .brut-col-list li {
469
+ color: rgba(255, 255, 255, 0.75);
470
+ }
471
+
472
+ .brut-col--hi .brut-col-list li::before {
473
+ color: var(--brut-yellow);
474
+ }
475
+
476
+ /* ─── Versus ──────────────────────────────────────────────────────────────── */
477
+ .brut-versus {
478
+ background: var(--brut-ink);
479
+ border-bottom: 3px solid var(--brut-yellow);
480
+ padding: 5rem 2.5rem;
481
+ }
482
+
483
+ .brut-versus-header {
484
+ margin-bottom: 3rem;
485
+ }
486
+
487
+ .brut-versus-label {
488
+ font-size: 0.72rem;
489
+ font-weight: 900;
490
+ letter-spacing: 0.18em;
491
+ text-transform: uppercase;
492
+ color: var(--brut-yellow);
493
+ margin-bottom: 1rem;
494
+ }
495
+
496
+ .brut-versus-h2 {
497
+ font-size: clamp(2rem, 4.5vw, 3.5rem);
498
+ font-weight: 900;
499
+ line-height: 1;
500
+ letter-spacing: -0.04em;
501
+ color: var(--brut-surface);
502
+ }
503
+
504
+ .brut-table {
505
+ width: 100%;
506
+ min-width: 640px;
507
+ border-collapse: collapse;
508
+ font-size: 0.9rem;
509
+ text-align: left;
510
+ border: 2px solid rgba(255, 255, 255, 0.15);
511
+ }
512
+
513
+ .brut-table thead {
514
+ background: rgba(240, 230, 66, 0.08);
515
+ }
516
+
517
+ .brut-table thead th {
518
+ padding: 0.85rem 1.1rem;
519
+ color: rgba(255, 255, 255, 0.6);
520
+ font-size: 0.72rem;
521
+ font-weight: 800;
522
+ text-transform: uppercase;
523
+ letter-spacing: 0.12em;
524
+ border-bottom: 2px solid rgba(255, 255, 255, 0.12);
525
+ }
526
+
527
+ .brut-th-pulse {
528
+ color: var(--brut-yellow) !important;
529
+ }
530
+
531
+ .brut-table thead th:first-child,
532
+ .brut-table th[scope="row"] {
533
+ background: var(--brut-ink);
534
+ }
535
+
536
+ .brut-table tbody tr:nth-child(odd) {
537
+ background: rgba(255, 255, 255, 0.03);
538
+ }
539
+
540
+ .brut-table tbody tr:nth-child(odd) th[scope="row"] {
541
+ background: var(--brut-darker);
542
+ }
543
+
544
+ .brut-table td {
545
+ padding: 0.9rem 1.1rem;
546
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
547
+ color: rgba(255, 255, 255, 0.4);
548
+ vertical-align: top;
549
+ line-height: 1.55;
550
+ }
551
+
552
+ .brut-table th[scope="row"] {
553
+ padding: 0.9rem 1.1rem;
554
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
555
+ color: rgba(255, 255, 255, 0.75);
556
+ font-weight: 600;
557
+ font-size: 0.87rem;
558
+ text-align: left;
559
+ }
560
+
561
+ .brut-table tr:hover td {
562
+ background: rgba(255, 255, 255, 0.06);
563
+ }
564
+
565
+ .brut-table .v-yes {
566
+ color: var(--brut-yellow);
567
+ }
568
+
569
+ .brut-table .v-partial,
570
+ .brut-table .v-no {
571
+ color: rgba(255, 255, 255, 0.65);
572
+ }
573
+
574
+ .brut-table code {
575
+ font-family: var(--mono);
576
+ font-size: 0.8em;
577
+ background: rgba(255, 255, 255, 0.12);
578
+ border-radius: 3px;
579
+ padding: 0.1em 0.35em;
580
+ color: rgba(255, 255, 255, 0.85);
581
+ }
582
+
583
+ /* ─── Pillars ─────────────────────────────────────────────────────────────── */
584
+ .brut-pillars {
585
+ border-bottom: 3px solid var(--brut-ink);
586
+ display: flex;
587
+ flex-direction: column;
588
+ gap: 0;
589
+ }
590
+
591
+ .brut-pillar {
592
+ display: grid;
593
+ grid-template-columns: 100px 1fr;
594
+ gap: 0;
595
+ border-bottom: 2px solid var(--brut-ink);
596
+ }
597
+ .brut-pillar:last-child {
598
+ border-bottom: none;
599
+ }
600
+
601
+ .brut-pillar--alt {
602
+ background: rgba(10, 10, 10, 0.04);
603
+ }
604
+
605
+ .brut-pillar-icon {
606
+ display: flex;
607
+ align-items: center;
608
+ justify-content: center;
609
+ border-right: 3px solid var(--brut-ink);
610
+ padding: 2.5rem 0;
611
+ }
612
+ .brut-pillar-icon svg {
613
+ stroke: var(--brut-ink);
614
+ fill: none;
615
+ stroke-width: 1.5;
616
+ stroke-linecap: round;
617
+ stroke-linejoin: round;
618
+ }
619
+
620
+ .brut-pillar-body {
621
+ padding: 2.5rem 3rem;
622
+ }
623
+
624
+ .brut-pillar-body h3 {
625
+ font-size: 1.25rem;
626
+ font-weight: 800;
627
+ letter-spacing: -0.02em;
628
+ margin-bottom: 0.75rem;
629
+ }
630
+
631
+ .brut-pillar-body p {
632
+ font-size: 1rem;
633
+ line-height: 1.75;
634
+ color: var(--brut-muted);
635
+ max-width: 68ch;
636
+ }
637
+
638
+ .brut-pillar-body code {
639
+ font-family: var(--mono);
640
+ font-size: 0.85em;
641
+ background: rgba(10, 10, 10, 0.08);
642
+ border-radius: 3px;
643
+ padding: 0.1em 0.35em;
644
+ }
645
+
646
+ /* ─── Metrics ─────────────────────────────────────────────────────────────── */
647
+ .brut-metrics {
648
+ border-bottom: 3px solid var(--brut-ink);
649
+ padding: 5rem 2.5rem;
650
+ }
651
+
652
+ .brut-metrics-label {
653
+ font-size: 0.72rem;
654
+ font-weight: 900;
655
+ letter-spacing: 0.18em;
656
+ text-transform: uppercase;
657
+ margin-bottom: 1rem;
658
+ }
659
+
660
+ .brut-metrics-h2 {
661
+ font-size: clamp(1.8rem, 3.5vw, 2.6rem);
662
+ font-weight: 900;
663
+ letter-spacing: -0.03em;
664
+ line-height: 1.1;
665
+ margin-bottom: 0.5rem;
666
+ }
667
+
668
+ .brut-metrics-sub {
669
+ font-size: 0.8rem;
670
+ color: var(--brut-muted);
671
+ margin-bottom: 3rem;
672
+ }
673
+
674
+ .brut-metrics-grid {
675
+ display: grid;
676
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
677
+ gap: 0;
678
+ border: 3px solid var(--brut-ink);
679
+ }
680
+
681
+ .brut-metrics-group {
682
+ padding: 1.5rem 1.75rem;
683
+ border-right: 2px solid var(--brut-ink);
684
+ display: flex;
685
+ flex-direction: column;
686
+ gap: 1rem;
687
+ }
688
+ .brut-metrics-group:last-child {
689
+ border-right: none;
690
+ }
691
+
692
+ .brut-metrics-group-label {
693
+ font-size: 0.68rem;
694
+ font-weight: 800;
695
+ letter-spacing: 0.14em;
696
+ text-transform: uppercase;
697
+ padding-bottom: 0.75rem;
698
+ border-bottom: 1px solid var(--brut-ink);
699
+ color: var(--brut-muted);
700
+ }
701
+
702
+ .brut-metric {
703
+ display: flex;
704
+ flex-direction: column;
705
+ gap: 0.1rem;
706
+ }
707
+
708
+ .brut-metric-val {
709
+ font-size: 1.75rem;
710
+ font-weight: 900;
711
+ letter-spacing: -0.03em;
712
+ line-height: 1;
713
+ }
714
+
715
+ .brut-metric-val--hi {
716
+ color: var(--brut-ink);
717
+ }
718
+
719
+ .brut-metric-val--accent {
720
+ color: var(--brut-ink);
721
+ }
722
+
723
+ .brut-metric-lbl {
724
+ font-size: 0.75rem;
725
+ color: var(--brut-muted);
726
+ line-height: 1.4;
727
+ }
728
+
729
+ /* ─── CTA ─────────────────────────────────────────────────────────────────── */
730
+ .brut-cta {
731
+ background: var(--brut-ink);
732
+ padding: 6rem 2.5rem;
733
+ border-bottom: 3px solid var(--brut-yellow);
734
+ }
735
+
736
+ .brut-cta-h2 {
737
+ font-size: clamp(2.5rem, 7vw, 6rem);
738
+ font-weight: 900;
739
+ line-height: 0.95;
740
+ letter-spacing: -0.04em;
741
+ color: var(--brut-surface);
742
+ margin-bottom: 3rem;
743
+ }
744
+
745
+ .brut-cta-list {
746
+ list-style: none;
747
+ display: flex;
748
+ flex-direction: column;
749
+ gap: 0;
750
+ margin-bottom: 2.5rem;
751
+ border-top: 1px solid rgba(255, 255, 255, 0.12);
752
+ }
753
+
754
+ .brut-cta-list li {
755
+ font-size: 1rem;
756
+ color: rgba(255, 255, 255, 0.7);
757
+ padding: 0.85rem 0;
758
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
759
+ padding-left: 1.5rem;
760
+ position: relative;
761
+ }
762
+
763
+ .brut-cta-list li::before {
764
+ content: "→";
765
+ position: absolute;
766
+ left: 0;
767
+ color: var(--brut-yellow);
768
+ font-weight: 700;
769
+ }
770
+
771
+ .brut-cta-lead {
772
+ font-size: 1.1rem;
773
+ color: rgba(255, 255, 255, 0.7);
774
+ line-height: 1.75;
775
+ max-width: 60ch;
776
+ margin-bottom: 2rem;
777
+ }
778
+
779
+ .brut-cta-note {
780
+ font-size: 0.95rem;
781
+ color: rgba(255, 255, 255, 0.6);
782
+ line-height: 1.7;
783
+ max-width: 60ch;
784
+ margin-bottom: 2.5rem;
785
+ }
786
+
787
+ .brut-cta-actions {
788
+ display: flex;
789
+ gap: 0;
790
+ }
791
+
792
+ /* ─── Footer ──────────────────────────────────────────────────────────────── */
793
+ .brut-footer {
794
+ background: var(--brut-ink);
795
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
796
+ padding: 1.5rem 2.5rem;
797
+ display: flex;
798
+ align-items: center;
799
+ gap: 0;
800
+ font-size: 0.82rem;
801
+ color: rgba(255, 255, 255, 0.65);
802
+ }
803
+
804
+ .brut-footer a {
805
+ color: rgba(255, 255, 255, 0.6);
806
+ text-decoration: none;
807
+ }
808
+ .brut-footer a:hover {
809
+ color: var(--brut-yellow);
810
+ }
811
+
812
+ .brut-footer-sep {
813
+ margin: 0 0.75rem;
814
+ color: rgba(255, 255, 255, 0.2);
815
+ }
816
+
817
+ /* ─── Mobile ──────────────────────────────────────────────────────────────── */
818
+ @media (max-width: 900px) {
819
+ .brut-hero {
820
+ grid-template-columns: 1fr;
821
+ min-height: auto;
822
+ }
823
+
824
+ .brut-hero-h1 {
825
+ border-right: none;
826
+ border-bottom: 3px solid var(--brut-ink);
827
+ padding: 2.5rem 1.5rem;
828
+ grid-column: 1;
829
+ grid-row: 2;
830
+ }
831
+
832
+ .brut-hero-aside {
833
+ grid-column: 1;
834
+ grid-row: 3;
835
+ padding: 2rem 1.5rem 2.5rem;
836
+ }
837
+
838
+ .brut-hero-line1,
839
+ .brut-hero-line2 {
840
+ font-size: clamp(3rem, 14vw, 6rem);
841
+ }
842
+
843
+ .brut-hero-line3 {
844
+ font-size: clamp(3rem, 14vw, 6rem);
845
+ }
846
+
847
+ .brut-stats-bar {
848
+ grid-template-columns: 1fr 1fr;
849
+ }
850
+
851
+ .brut-stat:nth-child(2) {
852
+ border-right: none;
853
+ }
854
+
855
+ .brut-stat:nth-child(3) {
856
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
857
+ }
858
+ .brut-stat:nth-child(4) {
859
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
860
+ border-right: none;
861
+ }
862
+
863
+ .brut-idea-grid {
864
+ grid-template-columns: 1fr;
865
+ gap: 0;
866
+ }
867
+
868
+ .brut-idea-step {
869
+ border-right: none;
870
+ border-bottom: 2px solid var(--brut-ink);
871
+ padding: 2rem 0;
872
+ }
873
+ .brut-idea-step:first-child {
874
+ padding-left: 0;
875
+ padding-right: 0;
876
+ }
877
+ .brut-idea-step:last-child {
878
+ border-bottom: none;
879
+ padding-left: 0;
880
+ padding-right: 0;
881
+ }
882
+ .brut-idea-step:not(:first-child):not(:last-child) {
883
+ padding-left: 0;
884
+ }
885
+
886
+ .brut-idea {
887
+ padding: 3rem 1.5rem;
888
+ }
889
+
890
+ .brut-constraint-cols {
891
+ grid-template-columns: 1fr;
892
+ }
893
+
894
+ .brut-col {
895
+ border-right: none;
896
+ border-bottom: 3px solid var(--brut-ink);
897
+ padding: 2rem 0;
898
+ }
899
+
900
+ .brut-col--hi {
901
+ padding: 2rem 1.5rem;
902
+ margin: 0;
903
+ }
904
+
905
+ .brut-constraint-inner {
906
+ padding: 3rem 1.5rem;
907
+ }
908
+ .brut-versus {
909
+ padding: 3rem 1.5rem;
910
+ }
911
+ .brut-metrics {
912
+ padding: 3rem 1.5rem;
913
+ }
914
+ .brut-cta {
915
+ padding: 4rem 1.5rem;
916
+ }
917
+ .brut-code-section {
918
+ padding: 3.5rem 1.5rem 4rem;
919
+ }
920
+
921
+ .brut-pillar {
922
+ grid-template-columns: 60px 1fr;
923
+ }
924
+
925
+ .brut-pillar-icon svg {
926
+ width: 28px;
927
+ height: 28px;
928
+ }
929
+
930
+ .brut-pillar-body {
931
+ padding: 2rem 1.5rem;
932
+ }
933
+
934
+ .brut-metrics-grid {
935
+ grid-template-columns: 1fr 1fr;
936
+ }
937
+
938
+ .brut-metrics-group:nth-child(2n) {
939
+ border-right: none;
940
+ }
941
+
942
+ .brut-metrics-group {
943
+ border-bottom: 2px solid var(--brut-ink);
944
+ }
945
+
946
+ .brut-metrics-group:last-child,
947
+ .brut-metrics-group:nth-last-child(-n + 2):nth-child(odd):last-child {
948
+ border-bottom: none;
949
+ }
950
+
951
+ .brut-nav {
952
+ padding: 0 1.25rem;
953
+ }
954
+
955
+ .brut-nav-links a {
956
+ padding: 0 0.75rem;
957
+ }
958
+
959
+ .brut-footer {
960
+ padding: 1.25rem 1.5rem;
961
+ flex-wrap: wrap;
962
+ gap: 0.25rem;
963
+ }
964
+ }
965
+
966
+ @media (max-width: 520px) {
967
+ .brut-stats-bar {
968
+ grid-template-columns: 1fr 1fr;
969
+ }
970
+
971
+ .brut-stat {
972
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
973
+ }
974
+
975
+ .brut-stat:nth-child(-n + 2) {
976
+ border-top: none;
977
+ }
978
+
979
+ .brut-stat:nth-child(even) {
980
+ border-right: none;
981
+ }
982
+
983
+ .brut-cta-h2 {
984
+ font-size: clamp(2rem, 14vw, 3rem);
985
+ }
986
+
987
+ .brut-metrics-grid {
988
+ grid-template-columns: 1fr;
989
+ }
990
+
991
+ .brut-metrics-group {
992
+ border-right: none;
993
+ }
994
+
995
+ .brut-nav-links .brut-nav-cta {
996
+ display: none;
997
+ }
998
+ }