@invisibleloop/pulse 0.20.11 → 0.20.19

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