@invisibleloop/pulse 0.20.10 → 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 +14 -7
  40. package/src/runtime/ssr.test.js +31 -0
  41. package/src/server/index.js +163 -10
  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 -345
  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,2388 +0,0 @@
1
- /* Pulse Documentation — Design System */
2
-
3
- .skip-link {
4
- position: absolute;
5
- top: -100%;
6
- left: 1rem;
7
- padding: .5rem 1rem;
8
- background: var(--accent);
9
- color: var(--accent-text);
10
- font-weight: 600;
11
- border-radius: 0 0 .375rem .375rem;
12
- text-decoration: none;
13
- z-index: 9999;
14
- }
15
- .skip-link:focus {
16
- top: 0;
17
- }
18
-
19
- *,
20
- *::before,
21
- *::after {
22
- box-sizing: border-box;
23
- margin: 0;
24
- padding: 0;
25
- }
26
-
27
- /* ─── Tokens ───────────────────────────────────────────────────────────────── */
28
- :root {
29
- --bg: #0d0d10;
30
- --surface: #111116;
31
- --surface-2: #18181f;
32
- --border: #38383f;
33
- --border-subtle: #1a1a20;
34
- --text: #e2e2ea;
35
- --muted: ##3d3d38;
36
- --muted-2: #7e7e92;
37
- --accent: #c9b800;
38
- --accent-text: #0a0a0a;
39
- --accent-hover: #e0ce00;
40
- --accent-dim: rgba(201, 184, 0, 0.12);
41
- --green: #3dd68c;
42
- --red: #ff6b6b;
43
-
44
- /* Syntax tokens */
45
- --tok-kw: #c792ea;
46
- --tok-str: #c3e88d;
47
- --tok-cmt: #7a8a9a;
48
- --tok-num: #f78c6c;
49
- --tok-fn: #82aaff;
50
- --tok-prop: #ffcb6b;
51
- --tok-op: #89ddff;
52
- --tok-punct: #7e8899;
53
-
54
- /* Layout */
55
- --sidebar-w: 260px;
56
- --header-h: 52px;
57
- --content-w: 740px;
58
-
59
- /* Type */
60
- --font: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
61
- --mono:
62
- "Fira Code", "Cascadia Code", "JetBrains Mono", "Menlo", "Monaco", monospace;
63
- --radius: 8px;
64
- }
65
-
66
- /* ─── Base ──────────────────────────────────────────────────────────────────── */
67
- html {
68
- font-size: 16px;
69
- }
70
-
71
- body {
72
- font-family: var(--font);
73
- background: var(--bg);
74
- color: var(--text);
75
- line-height: 1.6;
76
- min-height: 100vh;
77
- -webkit-font-smoothing: antialiased;
78
- }
79
-
80
- a {
81
- color: var(--accent);
82
- text-decoration: none;
83
- }
84
- a:hover {
85
- color: var(--accent-hover);
86
- }
87
-
88
- /* ─── Home page ─────────────────────────────────────────────────────────────── */
89
- /*
90
- * Yellow/black theme — token overrides scoped to .home so docs pages
91
- * keep the dark theme. All .home children inherit these values.
92
- */
93
- .home {
94
- min-height: 100vh;
95
- background: #f0e642;
96
- /* Subtle dark dot grid over yellow sections */
97
- background-image: radial-gradient(
98
- circle,
99
- rgba(0, 0, 0, 0.12) 1px,
100
- transparent 1px
101
- );
102
- background-size: 22px 22px;
103
- color: #0a0a0a;
104
-
105
- --accent: #0a0a0a;
106
- --accent-hover: #2a2a2a;
107
- --accent-dim: rgba(0, 0, 0, 0.07);
108
- --text: #0a0a0a;
109
- --muted: #52524a;
110
- --muted-2: #888880;
111
- --surface: #ffffff;
112
- --surface-2: #f0ede0;
113
- --border: #c8c4aa;
114
- --border-subtle: rgba(0, 0, 0, 0.1);
115
- --green: #1a7a4a;
116
- --red: #c0392b;
117
- }
118
-
119
- .home-nav {
120
- display: flex;
121
- align-items: center;
122
- justify-content: space-between;
123
- padding: 1.25rem 2rem;
124
- border-bottom: none;
125
- position: sticky;
126
- top: 0;
127
- background: #0a0a0a;
128
- backdrop-filter: none;
129
- z-index: 10;
130
- /* Yellow bolt + white text inside the black nav */
131
- --accent: #f0e642;
132
- --text: #ffffff;
133
- }
134
-
135
- .home-nav-logo {
136
- display: flex;
137
- align-items: center;
138
- gap: 0.5rem;
139
- color: var(--text);
140
- font-weight: 700;
141
- font-size: 1.1rem;
142
- text-decoration: none;
143
- }
144
-
145
- .home-nav-links {
146
- display: flex;
147
- align-items: center;
148
- gap: 1.5rem;
149
- }
150
-
151
- .home-nav-links a {
152
- color: rgba(255, 255, 255, 0.85);
153
- font-size: 0.9rem;
154
- transition: color 0.15s;
155
- }
156
- .home-nav-links a:hover {
157
- color: #ffffff;
158
- }
159
-
160
- .home-nav-links .btn-primary {
161
- background: #f0e642;
162
- color: #0a0a0a;
163
- font-weight: 600;
164
- padding: 0.4rem 1rem;
165
- border-radius: 6px;
166
- font-size: 0.875rem;
167
- }
168
- .home-nav-links .btn-primary:hover {
169
- background: #f7f040;
170
- color: #0a0a0a;
171
- }
172
-
173
- /* Hero — sits on the yellow .home background */
174
- .hero {
175
- max-width: 860px;
176
- margin: 0 auto;
177
- padding: 5rem 2rem;
178
- text-align: center;
179
- background: none;
180
- }
181
-
182
- .hero-icon {
183
- margin-bottom: 1.25rem;
184
- }
185
-
186
- .hero-kicker {
187
- font-size: 0.95rem;
188
- font-weight: 500;
189
- color: #0a0a0a;
190
- opacity: 0.7;
191
- margin-bottom: 1rem;
192
- letter-spacing: 0.01em;
193
- }
194
-
195
- .hero-badge {
196
- display: inline-flex;
197
- align-items: center;
198
- gap: 0.4rem;
199
- font-size: 0.78rem;
200
- font-weight: 600;
201
- color: #0a0a0a;
202
- background: rgba(0, 0, 0, 0.08);
203
- border: 1px solid rgba(0, 0, 0, 0.18);
204
- border-radius: 100px;
205
- padding: 0.3rem 0.85rem;
206
- margin-bottom: 2rem;
207
- letter-spacing: 0.06em;
208
- }
209
-
210
- .hero h1 {
211
- font-size: clamp(2.5rem, 6vw, 4.5rem);
212
- font-weight: 800;
213
- line-height: 1.1;
214
- letter-spacing: -0.03em;
215
- text-wrap: balance;
216
- margin-bottom: 1.5rem;
217
- color: #0a0a0a;
218
- background: none;
219
- -webkit-background-clip: unset;
220
- -webkit-text-fill-color: #0a0a0a;
221
- background-clip: unset;
222
- }
223
-
224
- .hero-subtitle {
225
- font-size: 1.1rem;
226
- color: var(--muted);
227
- max-width: 580px;
228
- margin: 0 auto 2.5rem;
229
- line-height: 1.65;
230
- }
231
-
232
- .hero-ctas {
233
- display: flex;
234
- gap: 1rem;
235
- justify-content: center;
236
- flex-wrap: wrap;
237
- }
238
-
239
- /* Default: hero area (yellow bg) — black button with yellow text */
240
- .btn-primary {
241
- display: inline-flex;
242
- align-items: center;
243
- padding: 0.7rem 1.5rem;
244
- border-radius: var(--radius);
245
- font-size: 0.95rem;
246
- font-weight: 600;
247
- background: #0a0a0a;
248
- color: #f0e642;
249
- text-decoration: none;
250
- border: 2px solid #0a0a0a;
251
- transition:
252
- background 0.15s,
253
- color 0.15s,
254
- transform 0.15s;
255
- }
256
- .btn-primary:hover {
257
- background: #f0e642;
258
- color: #0a0a0a;
259
- border-color: #0a0a0a;
260
- transform: translateY(-1px);
261
- }
262
-
263
- .btn-secondary {
264
- display: inline-flex;
265
- align-items: center;
266
- padding: 0.7rem 1.5rem;
267
- border-radius: var(--radius);
268
- font-size: 0.95rem;
269
- font-weight: 600;
270
- background: transparent;
271
- color: #0a0a0a;
272
- border: 1px solid rgba(0, 0, 0, 0.25);
273
- text-decoration: none;
274
- transition:
275
- background 0.15s,
276
- border-color 0.15s;
277
- }
278
- .btn-secondary:hover {
279
- background: rgba(0, 0, 0, 0.06);
280
- border-color: #0a0a0a;
281
- color: #0a0a0a;
282
- }
283
-
284
- /* CTA section (black bg) — flip to yellow button with black text */
285
- .home-cta .btn-primary {
286
- background: #f0e642;
287
- color: #0a0a0a;
288
- border-color: #f0e642;
289
- }
290
- .home-cta .btn-primary:hover {
291
- background: #0a0a0a;
292
- color: #f0e642;
293
- border-color: #f0e642;
294
- transform: translateY(-1px);
295
- }
296
- .home-cta .btn-secondary {
297
- background: transparent;
298
- border-color: rgba(255, 255, 255, 0.25);
299
- color: rgba(255, 255, 255, 0.75);
300
- }
301
- .home-cta .btn-secondary:hover {
302
- background: rgba(255, 255, 255, 0.08);
303
- border-color: rgba(255, 255, 255, 0.5);
304
- color: #ffffff;
305
- }
306
-
307
- .hero-sub {
308
- font-size: 1.2rem;
309
- color: var(--muted);
310
- max-width: 560px;
311
- margin: 0 auto 2.5rem;
312
- line-height: 1.65;
313
- }
314
-
315
- .hero-actions {
316
- display: flex;
317
- gap: 1rem;
318
- justify-content: center;
319
- flex-wrap: wrap;
320
- }
321
-
322
- .btn {
323
- display: inline-flex;
324
- align-items: center;
325
- gap: 0.5rem;
326
- padding: 0.65rem 1.4rem;
327
- border-radius: var(--radius);
328
- font-size: 0.95rem;
329
- font-weight: 600;
330
- cursor: pointer;
331
- border: none;
332
- transition: all 0.15s;
333
- text-decoration: none;
334
- }
335
-
336
- .btn-accent {
337
- background: var(--accent);
338
- color: #0d0d10;
339
- }
340
- .btn-accent:hover {
341
- background: var(--accent-hover);
342
- color: #0d0d10;
343
- transform: translateY(-1px);
344
- }
345
-
346
- .btn-outline {
347
- background: transparent;
348
- color: var(--text);
349
- border: 1px solid var(--border);
350
- }
351
- .btn-outline:hover {
352
- background: var(--surface-2);
353
- border-color: var(--muted-2);
354
- color: var(--text);
355
- transform: translateY(-1px);
356
- }
357
-
358
- /* Stats */
359
- .hero-stats {
360
- display: flex;
361
- justify-content: center;
362
- gap: 2.5rem;
363
- margin-top: 4rem;
364
- flex-wrap: wrap;
365
- }
366
-
367
- .stat {
368
- text-align: center;
369
- }
370
-
371
- .stat-value {
372
- font-size: 2rem;
373
- font-weight: 800;
374
- color: var(--accent);
375
- letter-spacing: -0.03em;
376
- line-height: 1;
377
- }
378
-
379
- .stat-label {
380
- font-size: 0.78rem;
381
- color: var(--muted);
382
- text-transform: uppercase;
383
- letter-spacing: 0.06em;
384
- margin-top: 0.35rem;
385
- }
386
-
387
- /* Feature grid */
388
- .features {
389
- max-width: 1000px;
390
- margin: 0 auto;
391
- padding: 4rem 2rem;
392
- }
393
-
394
- .features-grid {
395
- display: grid;
396
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
397
- gap: 1px;
398
- background: var(--border);
399
- border: 1px solid var(--border);
400
- border-radius: var(--radius);
401
- overflow: hidden;
402
- margin-top: 3rem;
403
- }
404
-
405
- .feature-card {
406
- background: var(--surface);
407
- padding: 1.75rem;
408
- transition: background 0.15s;
409
- }
410
- .feature-card:hover {
411
- background: var(--surface-2);
412
- }
413
-
414
- .feature-icon {
415
- font-size: 1.5rem;
416
- margin-bottom: 0.75rem;
417
- line-height: 1;
418
- }
419
-
420
- .feature-title {
421
- font-size: 0.95rem;
422
- font-weight: 700;
423
- color: var(--text);
424
- margin-bottom: 0.4rem;
425
- }
426
-
427
- .feature-desc {
428
- font-size: 0.85rem;
429
- color: var(--muted);
430
- line-height: 1.55;
431
- }
432
-
433
- /* Home code example */
434
- .home-example {
435
- max-width: 860px;
436
- margin: 0 auto;
437
- padding: 0 2rem 6rem;
438
- }
439
-
440
- .home-example h2 {
441
- font-size: 1.6rem;
442
- font-weight: 700;
443
- text-align: center;
444
- margin-bottom: 0.75rem;
445
- letter-spacing: -0.02em;
446
- }
447
-
448
- .home-example-sub {
449
- text-align: center;
450
- color: var(--muted);
451
- font-size: 0.95rem;
452
- margin-bottom: 2.5rem;
453
- }
454
-
455
- /* Home code section — dark panel against yellow */
456
- .home-code {
457
- background: #111114;
458
- padding: 5rem 2rem 6rem;
459
- --muted: #9090a0;
460
- }
461
-
462
- .home-code-inner {
463
- max-width: 1000px;
464
- margin: 0 auto;
465
- }
466
-
467
- .home-code-header {
468
- text-align: center;
469
- margin-bottom: 2.5rem;
470
- }
471
-
472
- .home-code-header h2 {
473
- font-size: clamp(1.6rem, 3vw, 2.2rem);
474
- font-weight: 700;
475
- letter-spacing: -0.02em;
476
- color: #ffffff;
477
- margin-bottom: 0.6rem;
478
- }
479
-
480
- .home-code-header p {
481
- color: rgba(255, 255, 255, 0.5);
482
- font-size: 1.1rem;
483
- max-width: 560px;
484
- margin: 0 auto;
485
- line-height: 1.65;
486
- }
487
-
488
- /* ─── FAQ page ───────────────────────────────────────────────────────────────── */
489
- .faq-item {
490
- padding: 2rem 0;
491
- border-bottom: 1px solid var(--border-subtle);
492
- }
493
- .faq-item:last-child {
494
- border-bottom: none;
495
- }
496
-
497
- .faq-q {
498
- font-size: 1.1rem;
499
- font-weight: 600;
500
- color: var(--text);
501
- margin-bottom: 0.875rem;
502
- letter-spacing: -0.01em;
503
- line-height: 1.4;
504
- }
505
-
506
- .faq-a p {
507
- font-size: 0.925rem;
508
- color: var(--muted);
509
- line-height: 1.75;
510
- max-width: 68ch;
511
- margin-bottom: 0.75rem;
512
- }
513
- .faq-a p:last-child {
514
- margin-bottom: 0;
515
- }
516
- .faq-a .code-block {
517
- margin: 0.75rem 0;
518
- }
519
-
520
- /* ─── Home footer — black band ───────────────────────────────────────────────── */
521
- .home-footer {
522
- border-top: 1px solid rgba(255, 255, 255, 0.08);
523
- text-align: center;
524
- padding: 2rem;
525
- background: #0a0a0a;
526
- color: rgba(255, 255, 255, 0.6);
527
- font-size: 0.82rem;
528
- }
529
- .home-footer a {
530
- color: rgba(255, 255, 255, 0.75);
531
- }
532
- .home-footer a:hover {
533
- color: #f0e642;
534
- }
535
-
536
- /* Section headers */
537
- .section-label {
538
- font-size: 1rem;
539
- font-weight: 700;
540
- text-transform: uppercase;
541
- letter-spacing: 0.1em;
542
- color: #0a0a0a;
543
- text-align: center;
544
- margin-bottom: 1rem;
545
- opacity: 0.5;
546
- }
547
-
548
- /* ─── Stats bar — black band ─────────────────────────────────────────────────── */
549
- .home-stats {
550
- display: flex;
551
- align-items: center;
552
- justify-content: center;
553
- gap: 0;
554
- padding: 2.5rem 2rem;
555
- border-top: none;
556
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
557
- background: #0a0a0a;
558
- flex-wrap: wrap;
559
- }
560
-
561
- .home-stat {
562
- display: flex;
563
- flex-direction: column;
564
- align-items: center;
565
- gap: 0.35rem;
566
- padding: 0.75rem 3rem;
567
- }
568
-
569
- .home-stat-value {
570
- font-size: 2rem;
571
- font-weight: 700;
572
- color: #f0e642;
573
- letter-spacing: -0.02em;
574
- line-height: 1;
575
- }
576
-
577
- .home-stat-label {
578
- font-size: 1.1rem;
579
- color: rgba(255, 255, 255, 0.7);
580
- text-align: center;
581
- }
582
-
583
- .home-stat-divider {
584
- width: 1px;
585
- height: 2.5rem;
586
- background: #f0e642;
587
- flex-shrink: 0;
588
- opacity: 0.3;
589
- }
590
-
591
- /* ─── How it works — black band ─────────────────────────────────────────────── */
592
- .how {
593
- background: #0a0a0a;
594
- background-image: radial-gradient(
595
- circle,
596
- rgba(255, 255, 255, 0.08) 1px,
597
- transparent 1px
598
- );
599
- background-size: 22px 22px;
600
- padding: 5rem 2rem;
601
- margin: 0;
602
- max-width: none;
603
- --accent: #f0e642;
604
- --text: #ffffff;
605
- --muted: 47473e;
606
- --border: rgba(255, 255, 255, 0.12);
607
- }
608
-
609
- .how-inner {
610
- max-width: 960px;
611
- margin: 0 auto;
612
- text-align: center;
613
- }
614
-
615
- .how .section-label {
616
- color: #f0e642;
617
- opacity: 1;
618
- }
619
-
620
- .how-steps {
621
- display: flex;
622
- align-items: flex-start;
623
- justify-content: center;
624
- gap: 0;
625
- margin-top: 3rem;
626
- }
627
-
628
- .how-step {
629
- flex: 1;
630
- max-width: 260px;
631
- display: flex;
632
- flex-direction: column;
633
- align-items: center;
634
- gap: 0.75rem;
635
- padding: 0 1rem;
636
- }
637
-
638
- .how-step-num {
639
- width: 2.5rem;
640
- height: 2.5rem;
641
- border-radius: 50%;
642
- background: #f0e642;
643
- border: 1px solid #f0e642;
644
- display: flex;
645
- align-items: center;
646
- justify-content: center;
647
- font-size: 0.9rem;
648
- font-weight: 700;
649
- color: #0a0a0a;
650
- flex-shrink: 0;
651
- }
652
-
653
- .how-step h3 {
654
- font-size: 1.1rem;
655
- font-weight: 600;
656
- color: var(--text);
657
- }
658
-
659
- .how-step p {
660
- font-size: 1.1rem;
661
- color: rgba(255, 255, 255, 0.5);
662
- line-height: 1.6;
663
- }
664
-
665
- .how-connector {
666
- width: 3rem;
667
- height: 1px;
668
- background: #f0e642;
669
- margin-top: 1.25rem;
670
- flex-shrink: 0;
671
- opacity: 0.3;
672
- }
673
-
674
- /* ─── AI-first section ───────────────────────────────────────────────────────── */
675
- .ai-first {
676
- padding: 5rem 2rem;
677
- max-width: 900px;
678
- margin: 0 auto;
679
- }
680
-
681
- .ai-first-title {
682
- font-size: clamp(1.6rem, 4vw, 2.2rem);
683
- font-weight: 700;
684
- letter-spacing: -0.02em;
685
- margin: 0.75rem 0 1.25rem;
686
- text-align: center;
687
- }
688
-
689
- .ai-first-lead {
690
- color: var(--muted);
691
- font-size: 1.1rem;
692
- line-height: 1.75;
693
- max-width: 72ch;
694
- margin-bottom: 3rem;
695
- text-align: center;
696
- margin-left: auto;
697
- margin-right: auto;
698
- }
699
-
700
- .ai-cols {
701
- display: grid;
702
- grid-template-columns: 1fr 1fr;
703
- gap: 1.5rem;
704
- }
705
-
706
- @media (max-width: 640px) {
707
- .ai-cols {
708
- grid-template-columns: 1fr;
709
- }
710
- .ai-col--pulse {
711
- order: -1;
712
- }
713
- }
714
-
715
- .ai-col {
716
- padding: 1.75rem;
717
- border-radius: 10px;
718
- border: 1px solid var(--border);
719
- background: var(--surface);
720
- }
721
-
722
- .ai-col--pulse {
723
- border-color: #0a0a0a;
724
- background: #0a0a0a;
725
- }
726
-
727
- .ai-col-title {
728
- font-size: 0.8rem;
729
- font-weight: 600;
730
- letter-spacing: 0.07em;
731
- text-transform: uppercase;
732
- margin-bottom: 1.25rem;
733
- }
734
-
735
- .ai-col-title--bad {
736
- color: #5f5f5a;
737
- }
738
- .ai-col-title--good {
739
- color: #f0e642;
740
- }
741
-
742
- .ai-col-list {
743
- list-style: none;
744
- display: flex;
745
- flex-direction: column;
746
- gap: 0.9rem;
747
- }
748
-
749
- .ai-col-list li {
750
- font-size: 1.1rem;
751
- color: var(--muted);
752
- line-height: 1.6;
753
- padding-left: 1.1rem;
754
- position: relative;
755
- }
756
-
757
- .ai-col-list li::before {
758
- content: "✓";
759
- position: absolute;
760
- left: 0;
761
- color: var(--accent);
762
- }
763
-
764
- .ai-col--pulse .ai-col-list li {
765
- color: rgba(255, 255, 255, 0.75);
766
- }
767
- .ai-col--pulse .ai-col-list li::before {
768
- content: "✓";
769
- color: #f0e642;
770
- }
771
-
772
- /* ─── Versus section — black panel ──────────────────────────────────────────── */
773
- .versus {
774
- padding: 5rem 2rem;
775
- background: #0a0a0a;
776
- border-top: none;
777
- border-bottom: none;
778
- text-align: center;
779
- --accent: #f0e642;
780
- }
781
-
782
- .versus-title {
783
- font-size: 1.75rem;
784
- font-weight: 700;
785
- margin-bottom: 0.75rem;
786
- color: #ffffff;
787
- }
788
-
789
- .versus-sub {
790
- color: rgba(255, 255, 255, 0.5);
791
- max-width: 560px;
792
- margin: 0 auto 2.5rem;
793
- font-size: 1.1rem;
794
- line-height: 1.7;
795
- }
796
-
797
- .versus .section-label {
798
- color: #f0e642;
799
- opacity: 1;
800
- }
801
-
802
- /* Sticky first column — add .table-sticky-col to any table wrapper. */
803
- .table-sticky-col {
804
- overflow-x: auto;
805
- }
806
- .table-sticky-col table th:first-child,
807
- .table-sticky-col table td:first-child {
808
- position: sticky;
809
- left: 0;
810
- z-index: 1;
811
- border-right: 1px solid rgba(255, 255, 255, 0.15);
812
- }
813
-
814
- .versus-table-wrap {
815
- overflow-x: auto;
816
- max-width: 900px;
817
- margin: 0 auto;
818
- }
819
-
820
- .versus-table {
821
- width: 100%;
822
- min-width: 640px;
823
- border-collapse: collapse;
824
- font-size: 1rem;
825
- text-align: left;
826
- }
827
-
828
- .versus-table thead {
829
- background: rgba(255, 255, 255, 0.06);
830
- }
831
-
832
- .versus-table thead th {
833
- padding: 0.75rem 1rem;
834
- color: rgba(255, 255, 255, 0.45);
835
- font-size: 0.78rem;
836
- font-weight: 600;
837
- text-transform: uppercase;
838
- letter-spacing: 0.07em;
839
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
840
- }
841
-
842
- .versus-table thead th:first-child {
843
- width: 22%;
844
- background: #111314; /* solid equivalent of rgba(255,255,255,0.06) on #0a0a0a */
845
- }
846
-
847
- .versus-table th[scope="row"] {
848
- background: #0a0a0a; /* solid — prevents scroll bleed-through */
849
- }
850
-
851
- .versus-table tbody tr:nth-child(odd) th[scope="row"] {
852
- background: #111214; /* match the odd-row tint */
853
- }
854
-
855
- .versus-table tbody tr:nth-child(odd) {
856
- background: rgba(255, 255, 255, 0.04);
857
- }
858
-
859
- .versus-table tr:hover td {
860
- background: rgba(255, 255, 255, 0.08);
861
- }
862
-
863
- .versus-table td {
864
- padding: 0.85rem 1rem;
865
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
866
- color: rgba(255, 255, 255, 0.45);
867
- vertical-align: top;
868
- line-height: 1.5;
869
- }
870
-
871
- .versus-table th[scope="row"] {
872
- padding: 0.85rem 1rem;
873
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
874
- color: rgba(255, 255, 255, 0.75);
875
- font-weight: 500;
876
- font-size: 0.87rem;
877
- text-align: left;
878
- }
879
-
880
- .versus-table .v-yes {
881
- color: #f0e642;
882
- }
883
- .versus-table .v-partial {
884
- color: rgba(255, 255, 255, 0.6);
885
- }
886
- .versus-table .v-no {
887
- color: rgba(255, 255, 255, 0.6);
888
- }
889
-
890
- /* ─── USP blocks ─────────────────────────────────────────────────────────────── */
891
- .usp-blocks {
892
- padding: 4rem 2rem;
893
- max-width: 1000px;
894
- margin: 0 auto;
895
- display: flex;
896
- flex-direction: column;
897
- gap: 0;
898
- }
899
-
900
- .usp-block {
901
- display: grid;
902
- grid-template-columns: 280px 1fr;
903
- gap: 3rem;
904
- padding: 3.5rem 0;
905
- border-bottom: 1px solid var(--border-subtle);
906
- align-items: start;
907
- }
908
-
909
- .usp-block:last-child {
910
- border-bottom: none;
911
- }
912
-
913
- .usp-block-alt {
914
- direction: rtl;
915
- }
916
- .usp-block-alt > * {
917
- direction: ltr;
918
- }
919
-
920
- .usp-block-aside {
921
- display: flex;
922
- flex-direction: column;
923
- gap: 0.75rem;
924
- }
925
-
926
- .usp-icon {
927
- width: 3rem;
928
- height: 3rem;
929
- background: #0a0a0a;
930
- border: none;
931
- border-radius: var(--radius);
932
- display: flex;
933
- align-items: center;
934
- justify-content: center;
935
- margin-bottom: 0.25rem;
936
- /* Yellow icon inside the black box */
937
- --accent: #f0e642;
938
- }
939
-
940
- .usp-block-aside h2 {
941
- font-size: 1.2rem;
942
- font-weight: 700;
943
- }
944
-
945
- .usp-block-aside p {
946
- font-size: 1.1rem;
947
- color: var(--muted);
948
- line-height: 1.7;
949
- }
950
-
951
- .usp-points {
952
- list-style: none;
953
- display: flex;
954
- flex-direction: column;
955
- gap: 1.25rem;
956
- padding-top: 0.25rem;
957
- }
958
-
959
- .usp-points li {
960
- padding-left: 1.25rem;
961
- border-left: 2px solid #0a0a0a;
962
- font-size: 1.1rem;
963
- color: var(--muted);
964
- line-height: 1.7;
965
- }
966
-
967
- .usp-points li strong {
968
- display: block;
969
- color: var(--text);
970
- font-weight: 600;
971
- margin-bottom: 0.15rem;
972
- }
973
-
974
- /* ─── Metrics report ─────────────────────────────────────────────────────────── */
975
- .metrics-report {
976
- padding: 5rem 2rem;
977
- border-top: 1px solid var(--border-subtle);
978
- max-width: 1100px;
979
- margin: 0 auto;
980
- }
981
-
982
- .metrics-header {
983
- text-align: center;
984
- margin-bottom: 3rem;
985
- }
986
-
987
- .metrics-title {
988
- font-size: clamp(1.6rem, 3.5vw, 2.2rem);
989
- font-weight: 700;
990
- letter-spacing: -0.02em;
991
- margin-bottom: 0.6rem;
992
- }
993
-
994
- .metrics-generated {
995
- font-size: 0.8rem;
996
- color: var(--muted);
997
- letter-spacing: 0.01em;
998
- }
999
-
1000
- .metrics-groups {
1001
- display: grid;
1002
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1003
- gap: 1rem;
1004
- }
1005
-
1006
- .metrics-group {
1007
- background: var(--surface);
1008
- border: 1px solid var(--border-subtle);
1009
- border-radius: var(--radius);
1010
- padding: 1.25rem 1.5rem 1.5rem;
1011
- }
1012
-
1013
- .metrics-group-label {
1014
- font-size: 0.7rem;
1015
- font-weight: 600;
1016
- letter-spacing: 0.1em;
1017
- text-transform: uppercase;
1018
- color: var(--muted);
1019
- margin-bottom: 1rem;
1020
- padding-bottom: 0.6rem;
1021
- border-bottom: 1px solid var(--border-subtle);
1022
- }
1023
-
1024
- .metrics-items {
1025
- display: flex;
1026
- flex-direction: column;
1027
- gap: 1rem;
1028
- }
1029
-
1030
- .metric-item {
1031
- display: flex;
1032
- flex-direction: column;
1033
- gap: 0.15rem;
1034
- }
1035
-
1036
- .metric-val {
1037
- font-size: 1.5rem;
1038
- font-weight: 700;
1039
- letter-spacing: -0.02em;
1040
- color: var(--text);
1041
- line-height: 1;
1042
- }
1043
-
1044
- .metric-val--green {
1045
- color: var(--green);
1046
- }
1047
- .metric-val--accent {
1048
- color: var(--accent);
1049
- }
1050
-
1051
- .metric-label {
1052
- font-size: 0.78rem;
1053
- color: var(--muted);
1054
- line-height: 1.3;
1055
- }
1056
-
1057
- /* ─── CTA section — black band ───────────────────────────────────────────────── */
1058
- .home-cta {
1059
- text-align: center;
1060
- padding: 5rem 2rem;
1061
- background: #0a0a0a;
1062
- background-image: radial-gradient(
1063
- circle,
1064
- rgba(255, 255, 255, 0.07) 1px,
1065
- transparent 1px
1066
- );
1067
- background-size: 22px 22px;
1068
- border-top: none;
1069
- }
1070
-
1071
- .home-cta h2 {
1072
- font-size: 2rem;
1073
- font-weight: 700;
1074
- margin-bottom: 0.75rem;
1075
- color: #ffffff;
1076
- }
1077
-
1078
- .home-cta p {
1079
- color: rgba(255, 255, 255, 0.5);
1080
- margin-bottom: 2rem;
1081
- font-size: 1.1rem;
1082
- }
1083
-
1084
- .home-cta-checks {
1085
- list-style: none;
1086
- display: flex;
1087
- flex-wrap: wrap;
1088
- justify-content: center;
1089
- gap: 0.6rem 1.5rem;
1090
- margin-bottom: 2rem;
1091
- }
1092
-
1093
- .home-cta-checks li {
1094
- font-size: 1.1rem;
1095
- color: rgba(255, 255, 255, 0.8);
1096
- display: flex;
1097
- align-items: center;
1098
- gap: 0.4rem;
1099
- }
1100
-
1101
- .home-cta-checks li::before {
1102
- content: "✓";
1103
- color: #f0e642;
1104
- font-weight: 700;
1105
- font-size: 1rem;
1106
- }
1107
-
1108
- .home-cta-actions {
1109
- display: flex;
1110
- gap: 1rem;
1111
- justify-content: center;
1112
- flex-wrap: wrap;
1113
- }
1114
-
1115
- /* ─── Sidebar overlay (mobile) ───────────────────────────────────────────────── */
1116
- .sidebar-overlay {
1117
- display: none;
1118
- position: fixed;
1119
- inset: 0;
1120
- background: rgba(0, 0, 0, 0.55);
1121
- z-index: 99;
1122
- opacity: 0;
1123
- transition: opacity 0.25s ease;
1124
- }
1125
-
1126
- @media (max-width: 768px) {
1127
- .sidebar-overlay {
1128
- display: block;
1129
- pointer-events: none;
1130
- }
1131
- .sidebar-overlay.visible {
1132
- opacity: 1;
1133
- pointer-events: auto;
1134
- }
1135
- }
1136
-
1137
- /* ─── Component demo blocks ──────────────────────────────────────────────────── */
1138
- .component-demo {
1139
- border: 1px solid var(--border);
1140
- border-radius: var(--radius);
1141
- margin: 1.5rem 0;
1142
- }
1143
-
1144
- .demo-preview {
1145
- padding: 3.5rem 1.5rem 1.5rem;
1146
- background: #0d0d10;
1147
- border-radius: var(--radius) var(--radius) 0 0;
1148
- display: flex;
1149
- flex-direction: column;
1150
- gap: 0.75rem;
1151
- position: relative;
1152
- }
1153
-
1154
- .demo-preview-inner {
1155
- display: flex;
1156
- flex-wrap: wrap;
1157
- gap: 0.75rem;
1158
- align-items: flex-start;
1159
- min-width: 0;
1160
- width: 100%;
1161
- }
1162
-
1163
- .demo-preview--bleed {
1164
- padding-inline: 0;
1165
- }
1166
-
1167
- .demo-preview--bleed .demo-preview-inner {
1168
- gap: 0;
1169
- }
1170
-
1171
- .demo-preview--bleed .demo-preview-inner > * {
1172
- width: 100%;
1173
- }
1174
-
1175
- .demo-preview--col .demo-preview-inner {
1176
- display: block;
1177
- }
1178
- .demo-preview--col .demo-preview-inner > * + * {
1179
- margin-top: 0.75rem;
1180
- }
1181
-
1182
- .demo-preview--scroll .demo-preview-inner {
1183
- flex-wrap: nowrap;
1184
- overflow-x: auto;
1185
- }
1186
-
1187
- .demo-preview--dark {
1188
- background: var(--bg);
1189
- }
1190
- .demo-preview--light {
1191
- background: #f0f0f8;
1192
- }
1193
-
1194
- /* Force a child nav into mobile layout regardless of viewport width */
1195
- .demo-mobile-nav .ui-nav-links {
1196
- display: none;
1197
- }
1198
- .demo-mobile-nav .ui-nav-burger {
1199
- display: flex;
1200
- }
1201
-
1202
- /* Phone frame — wraps a nav demo in a minimal phone outline */
1203
- .demo-phone {
1204
- width: 320px;
1205
- border-radius: 32px;
1206
- overflow: hidden;
1207
- background: var(--bg, #0d0d10);
1208
- box-shadow:
1209
- 0 0 0 7px var(--surface-2, #18181f),
1210
- 0 0 0 8px var(--border, #222228),
1211
- 0 24px 48px rgba(0, 0, 0, 0.5);
1212
- }
1213
- .demo-phone-statusbar {
1214
- height: 28px;
1215
- background: var(--bg, #0d0d10);
1216
- display: flex;
1217
- align-items: center;
1218
- justify-content: center;
1219
- }
1220
- .demo-phone-pill {
1221
- width: 64px;
1222
- height: 10px;
1223
- background: var(--surface-2, #18181f);
1224
- border-radius: 99px;
1225
- }
1226
- .demo-phone-content {
1227
- min-height: 160px;
1228
- display: flex;
1229
- align-items: center;
1230
- justify-content: center;
1231
- padding: 1.5rem;
1232
- }
1233
- .demo-phone-content p {
1234
- margin: 0;
1235
- color: var(--muted, #6b6b80);
1236
- font-size: 0.8rem;
1237
- text-align: center;
1238
- }
1239
- .demo-preview.is-light {
1240
- background: var(--surface-2, #f0f0f8);
1241
- }
1242
-
1243
- /* Theme toggle button */
1244
- .demo-theme-toggle {
1245
- position: absolute;
1246
- top: 0.6rem;
1247
- right: 0.6rem;
1248
- display: flex;
1249
- align-items: center;
1250
- justify-content: center;
1251
- width: 28px;
1252
- height: 28px;
1253
- border: 1px solid rgba(255, 255, 255, 0.15);
1254
- border-radius: 6px;
1255
- background: rgba(255, 255, 255, 0.07);
1256
- color: rgba(255, 255, 255, 0.5);
1257
- cursor: pointer;
1258
- transition:
1259
- background 0.15s,
1260
- color 0.15s;
1261
- z-index: 1;
1262
- }
1263
- .demo-theme-toggle:hover {
1264
- background: rgba(255, 255, 255, 0.15);
1265
- color: rgba(255, 255, 255, 0.9);
1266
- }
1267
- .demo-preview.is-light .demo-theme-toggle {
1268
- border-color: rgba(0, 0, 0, 0.15);
1269
- background: rgba(0, 0, 0, 0.05);
1270
- color: rgba(0, 0, 0, 0.4);
1271
- }
1272
- .demo-preview.is-light .demo-theme-toggle:hover {
1273
- background: rgba(0, 0, 0, 0.1);
1274
- color: rgba(0, 0, 0, 0.8);
1275
- }
1276
-
1277
- /* Show/hide sun vs moon icon */
1278
- .demo-theme-toggle__light {
1279
- display: none;
1280
- }
1281
- .demo-preview.is-light .demo-theme-toggle__dark {
1282
- display: none;
1283
- }
1284
- .demo-preview.is-light .demo-theme-toggle__light {
1285
- display: block;
1286
- }
1287
-
1288
- .demo-code pre.code-block {
1289
- margin: 0;
1290
- border-radius: 0;
1291
- border: none;
1292
- border-top: 1px solid var(--border);
1293
- }
1294
-
1295
- .demo-code .code-filename {
1296
- border-radius: 0;
1297
- border: none;
1298
- border-top: 1px solid var(--border);
1299
- }
1300
-
1301
- /* ─── Prompt examples page ───────────────────────────────────────────────────── */
1302
- .prompt-group {
1303
- margin-bottom: 3rem;
1304
- }
1305
-
1306
- .prompt-group-title {
1307
- font-size: 0.78rem;
1308
- font-weight: 600;
1309
- text-transform: uppercase;
1310
- letter-spacing: 0.1em;
1311
- color: var(--muted);
1312
- margin-bottom: 1rem;
1313
- padding-bottom: 0.5rem;
1314
- border-bottom: 1px solid var(--border-subtle);
1315
- }
1316
-
1317
- .prompt-grid {
1318
- display: flex;
1319
- flex-direction: column;
1320
- gap: 0.75rem;
1321
- }
1322
-
1323
- .prompt-card {
1324
- background: var(--surface);
1325
- border: 1px solid var(--border);
1326
- border-radius: var(--radius);
1327
- padding: 1.25rem 1.5rem;
1328
- }
1329
-
1330
- .prompt-tag {
1331
- font-size: 0.72rem;
1332
- font-weight: 700;
1333
- text-transform: uppercase;
1334
- letter-spacing: 0.08em;
1335
- color: var(--accent);
1336
- margin-bottom: 0.65rem;
1337
- }
1338
-
1339
- .prompt-text {
1340
- font-size: 0.93rem;
1341
- color: var(--text);
1342
- line-height: 1.65;
1343
- border-left: 3px solid var(--accent);
1344
- padding-left: 1rem;
1345
- margin: 0 0 0.85rem;
1346
- font-style: italic;
1347
- }
1348
-
1349
- .prompt-produces {
1350
- font-size: 0.82rem;
1351
- color: var(--muted);
1352
- line-height: 1.6;
1353
- }
1354
-
1355
- .prompt-produces code {
1356
- font-family: var(--mono);
1357
- font-size: 0.8rem;
1358
- background: var(--surface-2);
1359
- border: 1px solid var(--border);
1360
- border-radius: 3px;
1361
- padding: 0.1em 0.35em;
1362
- color: var(--tok-str);
1363
- font-style: normal;
1364
- }
1365
-
1366
- /* ─── Docs layout ────────────────────────────────────────────────────────────── */
1367
- .docs-layout {
1368
- display: flex;
1369
- min-height: 100vh;
1370
- }
1371
-
1372
- /* Sidebar */
1373
- .docs-sidebar {
1374
- position: fixed;
1375
- top: 0;
1376
- left: 0;
1377
- width: var(--sidebar-w);
1378
- height: 100dvh;
1379
- overflow-y: auto;
1380
- background: var(--surface);
1381
- border-right: 1px solid var(--border);
1382
- display: flex;
1383
- flex-direction: column;
1384
- z-index: 100;
1385
- scrollbar-width: thin;
1386
- scrollbar-color: var(--border) transparent;
1387
- }
1388
-
1389
- .docs-sidebar::-webkit-scrollbar {
1390
- width: 4px;
1391
- }
1392
- .docs-sidebar::-webkit-scrollbar-track {
1393
- background: transparent;
1394
- }
1395
- .docs-sidebar::-webkit-scrollbar-thumb {
1396
- background: var(--border);
1397
- border-radius: 2px;
1398
- }
1399
-
1400
- .sidebar-logo {
1401
- display: flex;
1402
- align-items: center;
1403
- justify-content: space-between;
1404
- padding: 1.25rem 1.25rem 1rem;
1405
- border-bottom: 1px solid var(--border);
1406
- flex-shrink: 0;
1407
- }
1408
-
1409
- /* ─── Sidebar search ─────────────────────────────────────────────────────────── */
1410
- .sidebar-search-wrap {
1411
- display: flex;
1412
- align-items: center;
1413
- gap: 0.4rem;
1414
- padding: 0.6rem 0.75rem;
1415
- border-bottom: 1px solid var(--border-subtle);
1416
- flex-shrink: 0;
1417
- position: relative;
1418
- }
1419
-
1420
- .sidebar-search-icon {
1421
- color: var(--muted-2);
1422
- flex-shrink: 0;
1423
- pointer-events: none;
1424
- }
1425
-
1426
- .sidebar-search {
1427
- flex: 1;
1428
- min-width: 0;
1429
- background: transparent;
1430
- border: none;
1431
- outline: none;
1432
- font-family: var(--font);
1433
- font-size: 0.82rem;
1434
- color: var(--text);
1435
- padding: 0;
1436
- line-height: 1.4;
1437
- }
1438
-
1439
- /* iOS Safari auto-zooms when a focused input's font-size is under 16px —
1440
- touch devices get 16px so tapping the search field never zooms the page. */
1441
- @media (pointer: coarse) {
1442
- .sidebar-search,
1443
- .search-overlay-input {
1444
- font-size: max(1rem, 16px);
1445
- }
1446
- }
1447
-
1448
- .sidebar-search::placeholder {
1449
- color: var(--muted-2);
1450
- }
1451
-
1452
- .sidebar-search::-webkit-search-cancel-button {
1453
- -webkit-appearance: none;
1454
- }
1455
-
1456
- .sidebar-search-full {
1457
- display: flex;
1458
- align-items: center;
1459
- justify-content: center;
1460
- width: 22px;
1461
- height: 22px;
1462
- flex-shrink: 0;
1463
- background: var(--surface-2);
1464
- border: 1px solid var(--border);
1465
- border-radius: 4px;
1466
- color: var(--muted-2);
1467
- cursor: pointer;
1468
- transition: color 0.1s, background 0.1s;
1469
- }
1470
-
1471
- .sidebar-search-full:hover {
1472
- color: var(--text);
1473
- background: var(--border);
1474
- }
1475
-
1476
- .sidebar-no-results {
1477
- padding: 0.75rem 1.25rem;
1478
- font-size: 0.8rem;
1479
- color: var(--muted-2);
1480
- }
1481
-
1482
- /* ─── Search overlay ─────────────────────────────────────────────────────────── */
1483
- .search-overlay {
1484
- position: fixed;
1485
- inset: 0;
1486
- z-index: 500;
1487
- display: flex;
1488
- align-items: flex-start;
1489
- justify-content: center;
1490
- padding-top: 10vh;
1491
- }
1492
-
1493
- .search-overlay[hidden] {
1494
- display: none;
1495
- }
1496
-
1497
- .search-overlay-backdrop {
1498
- position: absolute;
1499
- inset: 0;
1500
- background: rgba(0, 0, 0, 0.6);
1501
- backdrop-filter: blur(3px);
1502
- }
1503
-
1504
- .search-overlay-panel {
1505
- position: relative;
1506
- width: min(640px, calc(100vw - 2rem));
1507
- background: var(--surface);
1508
- border: 1px solid var(--border);
1509
- border-radius: 12px;
1510
- box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5);
1511
- display: flex;
1512
- flex-direction: column;
1513
- overflow: hidden;
1514
- max-height: 70vh;
1515
- }
1516
-
1517
- .search-overlay-header {
1518
- display: flex;
1519
- align-items: center;
1520
- gap: 0.75rem;
1521
- padding: 0.875rem 1rem;
1522
- border-bottom: 1px solid var(--border-subtle);
1523
- flex-shrink: 0;
1524
- }
1525
-
1526
- .search-overlay-input-wrap {
1527
- display: flex;
1528
- align-items: center;
1529
- gap: 0.6rem;
1530
- flex: 1;
1531
- color: var(--muted-2);
1532
- }
1533
-
1534
- .search-overlay-input {
1535
- flex: 1;
1536
- background: transparent;
1537
- border: none;
1538
- outline: none;
1539
- font-family: var(--font);
1540
- font-size: 1rem;
1541
- color: var(--text);
1542
- padding: 0;
1543
- line-height: 1.4;
1544
- }
1545
-
1546
- .search-overlay-input::placeholder {
1547
- color: var(--muted-2);
1548
- }
1549
-
1550
- .search-overlay-input::-webkit-search-cancel-button {
1551
- -webkit-appearance: none;
1552
- }
1553
-
1554
- .search-overlay-close {
1555
- font-family: var(--mono);
1556
- font-size: 0.7rem;
1557
- color: var(--muted-2);
1558
- background: var(--surface-2);
1559
- border: 1px solid var(--border);
1560
- border-radius: 4px;
1561
- padding: 0.2rem 0.5rem;
1562
- cursor: pointer;
1563
- flex-shrink: 0;
1564
- }
1565
-
1566
- .search-overlay-results {
1567
- overflow-y: auto;
1568
- flex: 1;
1569
- padding: 0.5rem;
1570
- }
1571
-
1572
- .search-result {
1573
- display: block;
1574
- padding: 0.65rem 0.75rem;
1575
- border-radius: 6px;
1576
- text-decoration: none;
1577
- color: var(--text);
1578
- transition: background 0.1s;
1579
- }
1580
-
1581
- .search-result:hover,
1582
- .search-result--selected {
1583
- background: var(--surface-2);
1584
- }
1585
-
1586
- .search-result-meta {
1587
- margin-bottom: 0.15rem;
1588
- }
1589
-
1590
- .search-result-section {
1591
- font-size: 0.68rem;
1592
- font-weight: 600;
1593
- text-transform: uppercase;
1594
- letter-spacing: 0.08em;
1595
- color: var(--accent);
1596
- }
1597
-
1598
- .search-result-title {
1599
- font-size: 0.9rem;
1600
- font-weight: 500;
1601
- color: var(--text);
1602
- line-height: 1.4;
1603
- }
1604
-
1605
- .search-result-title mark,
1606
- .search-result-snip mark {
1607
- background: rgba(201, 184, 0, 0.3);
1608
- color: inherit;
1609
- border-radius: 2px;
1610
- }
1611
-
1612
- .search-result-snip {
1613
- font-size: 0.78rem;
1614
- color: var(--muted-2);
1615
- margin-top: 0.25rem;
1616
- line-height: 1.5;
1617
- display: -webkit-box;
1618
- -webkit-line-clamp: 2;
1619
- -webkit-box-orient: vertical;
1620
- overflow: hidden;
1621
- }
1622
-
1623
- .search-overlay-empty {
1624
- padding: 2rem 1rem;
1625
- text-align: center;
1626
- color: var(--muted-2);
1627
- font-size: 0.9rem;
1628
- }
1629
-
1630
- .search-overlay-footer {
1631
- display: flex;
1632
- gap: 1.25rem;
1633
- padding: 0.6rem 1rem;
1634
- border-top: 1px solid var(--border-subtle);
1635
- flex-shrink: 0;
1636
- font-size: 0.72rem;
1637
- color: var(--muted-2);
1638
- }
1639
-
1640
- .search-overlay-footer kbd {
1641
- display: inline-flex;
1642
- align-items: center;
1643
- justify-content: center;
1644
- font-family: var(--mono);
1645
- font-size: 0.68rem;
1646
- background: var(--surface-2);
1647
- border: 1px solid var(--border);
1648
- border-radius: 3px;
1649
- padding: 0.1rem 0.35rem;
1650
- color: var(--muted-2);
1651
- margin-right: 0.2rem;
1652
- }
1653
-
1654
- .logo-link {
1655
- display: flex;
1656
- align-items: center;
1657
- gap: 0.5rem;
1658
- color: var(--text);
1659
- font-weight: 700;
1660
- font-size: 1rem;
1661
- text-decoration: none;
1662
- }
1663
- .logo-link:hover {
1664
- color: var(--accent);
1665
- }
1666
-
1667
- .logo-name {
1668
- color: var(--text);
1669
- }
1670
-
1671
- .version-badge {
1672
- font-size: 0.7rem;
1673
- font-weight: 600;
1674
- color: var(--accent);
1675
- background: var(--accent-dim);
1676
- border: 1px solid rgba(155, 141, 255, 0.2);
1677
- border-radius: 4px;
1678
- padding: 0.15rem 0.45rem;
1679
- font-family: var(--mono);
1680
- }
1681
-
1682
- .sidebar-nav {
1683
- padding: 0.75rem 0 2rem;
1684
- flex: 1;
1685
- }
1686
-
1687
- .nav-section {
1688
- padding: 0.5rem 0;
1689
- }
1690
-
1691
- .nav-section + .nav-section {
1692
- border-top: 1px solid var(--border-subtle);
1693
- margin-top: 0.25rem;
1694
- padding-top: 0.75rem;
1695
- }
1696
-
1697
- .nav-section-title {
1698
- font-size: 0.68rem;
1699
- font-weight: 700;
1700
- text-transform: uppercase;
1701
- letter-spacing: 0.1em;
1702
- color: var(--muted-2);
1703
- padding: 0.25rem 1.25rem 0.5rem;
1704
- }
1705
-
1706
- .nav-link {
1707
- display: block;
1708
- padding: 0.35rem 1.25rem;
1709
- font-size: 0.875rem;
1710
- color: var(--muted);
1711
- border-radius: 0;
1712
- transition:
1713
- color 0.1s,
1714
- background 0.1s;
1715
- position: relative;
1716
- border-left: 2px solid transparent;
1717
- }
1718
-
1719
- .nav-link:hover {
1720
- color: var(--text);
1721
- background: var(--surface-2);
1722
- }
1723
-
1724
- .nav-link.active {
1725
- color: var(--accent);
1726
- border-left-color: var(--accent);
1727
- background: var(--accent-dim);
1728
- }
1729
-
1730
- /* Main content area */
1731
- .docs-main {
1732
- margin-left: var(--sidebar-w);
1733
- flex: 1;
1734
- min-width: 0;
1735
- display: flex;
1736
- flex-direction: column;
1737
- }
1738
-
1739
- .docs-header {
1740
- height: var(--header-h);
1741
- border-bottom: 1px solid var(--border-subtle);
1742
- display: flex;
1743
- align-items: center;
1744
- justify-content: space-between;
1745
- padding: 0 2rem;
1746
- position: sticky;
1747
- top: 0;
1748
- background: var(--header-bg, rgba(13, 13, 16, 0.9));
1749
- backdrop-filter: blur(8px);
1750
- z-index: 10;
1751
- }
1752
-
1753
- .mobile-menu-btn {
1754
- display: none;
1755
- background: none;
1756
- border: none;
1757
- color: var(--muted);
1758
- cursor: pointer;
1759
- min-width: 44px;
1760
- min-height: 44px;
1761
- align-items: center;
1762
- justify-content: center;
1763
- padding: 0;
1764
- }
1765
- .mobile-menu-btn:hover {
1766
- color: var(--text);
1767
- }
1768
-
1769
- .header-logo-mobile {
1770
- display: none;
1771
- color: var(--text);
1772
- min-width: 44px;
1773
- min-height: 44px;
1774
- align-items: center;
1775
- justify-content: center;
1776
- }
1777
-
1778
- .header-github {
1779
- display: flex;
1780
- align-items: center;
1781
- gap: 0.4rem;
1782
- font-size: 0.82rem;
1783
- color: var(--muted);
1784
- transition: color 0.1s;
1785
- margin-left: auto;
1786
- }
1787
- .header-github:hover {
1788
- color: var(--text);
1789
- }
1790
-
1791
- .docs-content {
1792
- flex: 1;
1793
- padding: 3rem 3.5rem 5rem;
1794
- max-width: calc(var(--content-w) + 7rem);
1795
- }
1796
-
1797
- /* ─── Doc Typography ─────────────────────────────────────────────────────────── */
1798
- .doc-h1 {
1799
- font-size: 2.25rem;
1800
- font-weight: 800;
1801
- letter-spacing: -0.03em;
1802
- line-height: 1.15;
1803
- margin-bottom: 1rem;
1804
- color: var(--text);
1805
- }
1806
-
1807
- .doc-lead {
1808
- font-size: 1.1rem;
1809
- color: var(--muted);
1810
- line-height: 1.65;
1811
- max-width: 600px;
1812
- margin-bottom: 2.5rem;
1813
- }
1814
-
1815
- .doc-h2 {
1816
- font-size: 1.35rem;
1817
- font-weight: 700;
1818
- letter-spacing: -0.02em;
1819
- margin: 2.5rem 0 0.75rem;
1820
- color: var(--text);
1821
- padding-top: 1rem;
1822
- border-top: 1px solid var(--border-subtle);
1823
- }
1824
-
1825
- .doc-h2:first-of-type {
1826
- border-top: none;
1827
- margin-top: 0;
1828
- }
1829
-
1830
- .doc-h3 {
1831
- font-size: 1.05rem;
1832
- font-weight: 600;
1833
- margin: 1.75rem 0 0.6rem;
1834
- color: var(--text);
1835
- }
1836
-
1837
- .definition-list {
1838
- display: flex;
1839
- flex-direction: column;
1840
- gap: 0.75rem;
1841
- margin: 1rem 0;
1842
- }
1843
-
1844
- .definition-list dt {
1845
- margin: 0;
1846
- font-weight: 600;
1847
- }
1848
-
1849
- .definition-list dd {
1850
- margin: 0.2rem 0 0 0;
1851
- color: var(--muted);
1852
- font-size: 0.9rem;
1853
- line-height: 1.55;
1854
- padding-bottom: 0.75rem;
1855
- border-bottom: 1px solid var(--border-subtle);
1856
- }
1857
-
1858
- .definition-list dd:last-of-type {
1859
- border-bottom: none;
1860
- padding-bottom: 0;
1861
- }
1862
-
1863
- .docs-content p:not([class*="ui-"]) {
1864
- margin-bottom: 0.9rem;
1865
- line-height: 1.7;
1866
- color: var(--text);
1867
- }
1868
-
1869
- .docs-content p + p {
1870
- margin-top: -0.1rem;
1871
- }
1872
-
1873
- .docs-content ul:not([class*="ui-"]),
1874
- .docs-content ol {
1875
- padding-left: 1.5rem;
1876
- margin-bottom: 1rem;
1877
- }
1878
-
1879
- .docs-content li:not([class*="ui-"]) {
1880
- margin-bottom: 0.35rem;
1881
- line-height: 1.65;
1882
- color: var(--text);
1883
- }
1884
-
1885
- .docs-content strong:not([class*="ui-"]) {
1886
- font-weight: 600;
1887
- color: var(--text);
1888
- }
1889
-
1890
- .docs-content
1891
- a:not(.ui-btn):not(.ui-nav-link):not(.ui-nav-logo):not(.ui-app-badge) {
1892
- color: var(--accent);
1893
- text-decoration: underline;
1894
- text-underline-offset: 2px;
1895
- }
1896
- .docs-content
1897
- a:not(.ui-btn):not(.ui-nav-link):not(.ui-nav-logo):not(.ui-app-badge):hover {
1898
- color: var(--accent-hover);
1899
- }
1900
-
1901
- /* Light-mode demo preview: ensure prose rules don't override component text colors */
1902
- .docs-content .ui-theme-light p,
1903
- .docs-content .ui-theme-light li,
1904
- .docs-content .ui-theme-light strong {
1905
- color: var(--ui-text);
1906
- }
1907
-
1908
- .docs-content code:not(pre code) {
1909
- font-family: var(--mono);
1910
- font-size: 0.82em;
1911
- background: var(--surface-2);
1912
- border: 1px solid var(--border);
1913
- border-radius: 4px;
1914
- padding: 0.1em 0.35em;
1915
- color: var(--accent-hover);
1916
- }
1917
-
1918
- .heading-anchor {
1919
- color: inherit;
1920
- text-decoration: none;
1921
- }
1922
- .heading-anchor:hover {
1923
- color: var(--accent);
1924
- }
1925
-
1926
- /* ─── Code Blocks ────────────────────────────────────────────────────────────── */
1927
- .code-filename {
1928
- background: var(--surface-2);
1929
- border: 1px solid var(--border);
1930
- border-bottom: none;
1931
- border-radius: var(--radius) var(--radius) 0 0;
1932
- padding: 0.4rem 1rem;
1933
- font-family: var(--mono);
1934
- font-size: 0.75rem;
1935
- color: var(--muted);
1936
- }
1937
-
1938
- .code-filename + .code-block {
1939
- border-radius: 0 0 var(--radius) var(--radius);
1940
- margin-top: 0;
1941
- }
1942
-
1943
- .code-block {
1944
- background: var(--surface);
1945
- border: 1px solid var(--border);
1946
- border-radius: var(--radius);
1947
- padding: 1.25rem 1.5rem;
1948
- overflow-x: auto;
1949
- font-family: var(--mono);
1950
- font-size: 0.9rem;
1951
- line-height: 1.75;
1952
- margin: 1.25rem 0;
1953
- tab-size: 2;
1954
- white-space: pre;
1955
- scrollbar-width: thin;
1956
- scrollbar-color: var(--border) transparent;
1957
- }
1958
-
1959
- .code-block::-webkit-scrollbar {
1960
- height: 4px;
1961
- }
1962
- .code-block::-webkit-scrollbar-track {
1963
- background: transparent;
1964
- }
1965
- .code-block::-webkit-scrollbar-thumb {
1966
- background: var(--border);
1967
- border-radius: 2px;
1968
- }
1969
-
1970
- /* Token colours */
1971
- .tok-kw {
1972
- color: var(--tok-kw);
1973
- }
1974
- .tok-str {
1975
- color: var(--tok-str);
1976
- }
1977
- .tok-cmt {
1978
- color: var(--tok-cmt);
1979
- font-style: italic;
1980
- }
1981
- .tok-num {
1982
- color: var(--tok-num);
1983
- }
1984
- .tok-fn {
1985
- color: var(--tok-fn);
1986
- }
1987
- .tok-prop {
1988
- color: var(--tok-prop);
1989
- }
1990
- .tok-op {
1991
- color: var(--tok-op);
1992
- }
1993
- .tok-punct {
1994
- color: var(--tok-punct);
1995
- }
1996
-
1997
- /* ─── Tables ─────────────────────────────────────────────────────────────────── */
1998
- .table-wrap {
1999
- overflow-x: auto;
2000
- margin: 1.25rem 0;
2001
- border: 1px solid var(--border);
2002
- border-radius: var(--radius);
2003
- }
2004
-
2005
- table {
2006
- width: 100%;
2007
- border-collapse: collapse;
2008
- font-size: 0.875rem;
2009
- }
2010
-
2011
- thead {
2012
- background: var(--surface-2);
2013
- }
2014
-
2015
- th {
2016
- font-weight: 600;
2017
- font-size: 0.78rem;
2018
- text-transform: uppercase;
2019
- letter-spacing: 0.06em;
2020
- color: var(--muted);
2021
- padding: 0.65rem 1rem;
2022
- text-align: left;
2023
- border-bottom: 1px solid var(--border);
2024
- }
2025
-
2026
- td {
2027
- padding: 0.65rem 1rem;
2028
- border-bottom: 1px solid var(--border-subtle);
2029
- vertical-align: top;
2030
- line-height: 1.5;
2031
- }
2032
-
2033
- tr:last-child td {
2034
- border-bottom: none;
2035
- }
2036
- tr:hover td {
2037
- background: var(--surface-2);
2038
- }
2039
-
2040
- /* ─── Callouts ───────────────────────────────────────────────────────────────── */
2041
- .callout {
2042
- display: flex;
2043
- gap: 0.75rem;
2044
- padding: 1rem 1.25rem;
2045
- border-radius: var(--radius);
2046
- margin: 1.25rem 0;
2047
- border-left: 3px solid;
2048
- font-size: 0.9rem;
2049
- line-height: 1.6;
2050
- }
2051
-
2052
- .callout-note {
2053
- background: rgba(130, 170, 255, 0.07);
2054
- border-color: rgba(130, 170, 255, 0.5);
2055
- }
2056
- .callout-warning {
2057
- background: rgba(255, 107, 107, 0.07);
2058
- border-color: rgba(255, 107, 107, 0.5);
2059
- }
2060
- .callout-tip {
2061
- background: rgba(61, 214, 140, 0.07);
2062
- border-color: rgba(61, 214, 140, 0.5);
2063
- }
2064
-
2065
- .callout-note .callout-icon {
2066
- color: var(--callout-note-icon, #82aaff);
2067
- }
2068
- .callout-warning .callout-icon {
2069
- color: var(--red);
2070
- }
2071
- .callout-tip .callout-icon {
2072
- color: var(--green);
2073
- }
2074
-
2075
- .callout-icon {
2076
- font-size: 1rem;
2077
- flex-shrink: 0;
2078
- margin-top: 0.1rem;
2079
- }
2080
-
2081
- .callout-body p:last-child {
2082
- margin-bottom: 0;
2083
- }
2084
-
2085
- /* ─── Prev / Next ────────────────────────────────────────────────────────────── */
2086
- .doc-prev-next {
2087
- margin-top: 4rem;
2088
- padding-top: 2rem;
2089
- border-top: 1px solid var(--border);
2090
- }
2091
-
2092
- .prev-next-grid {
2093
- display: grid;
2094
- grid-template-columns: 1fr 1fr;
2095
- gap: 1rem;
2096
- }
2097
-
2098
- .prev-next-link {
2099
- display: flex;
2100
- flex-direction: column;
2101
- gap: 0.2rem;
2102
- padding: 1rem 1.25rem;
2103
- border: 1px solid var(--border);
2104
- border-radius: var(--radius);
2105
- color: inherit;
2106
- text-decoration: none;
2107
- transition:
2108
- border-color 0.15s,
2109
- background 0.15s;
2110
- }
2111
-
2112
- .prev-next-link:hover {
2113
- border-color: var(--accent);
2114
- background: var(--accent-dim);
2115
- color: inherit;
2116
- }
2117
-
2118
- .next-link {
2119
- text-align: right;
2120
- }
2121
-
2122
- .prev-next-label {
2123
- font-size: 0.75rem;
2124
- color: var(--muted);
2125
- text-transform: uppercase;
2126
- letter-spacing: 0.06em;
2127
- }
2128
-
2129
- .prev-next-title {
2130
- font-size: 0.95rem;
2131
- font-weight: 600;
2132
- color: var(--accent);
2133
- }
2134
-
2135
- /* ─── Inline helpers ─────────────────────────────────────────────────────────── */
2136
- .tag {
2137
- display: inline-block;
2138
- font-size: 0.7rem;
2139
- font-weight: 700;
2140
- text-transform: uppercase;
2141
- letter-spacing: 0.06em;
2142
- padding: 0.1rem 0.45rem;
2143
- border-radius: 4px;
2144
- font-family: var(--mono);
2145
- vertical-align: middle;
2146
- margin-left: 0.25rem;
2147
- }
2148
-
2149
- .tag-required {
2150
- background: var(--tag-required-bg, rgba(255, 107, 107, 0.15));
2151
- color: var(--tag-required-text, #ff8080);
2152
- }
2153
- .tag-optional {
2154
- background: var(--surface-2);
2155
- color: var(--muted);
2156
- }
2157
-
2158
- hr.doc-hr {
2159
- border: none;
2160
- border-top: 1px solid var(--border);
2161
- margin: 2.5rem 0;
2162
- }
2163
-
2164
- /* ─── Mobile ─────────────────────────────────────────────────────────────────── */
2165
- @media (max-width: 768px) {
2166
- .docs-sidebar {
2167
- transform: translateX(-100%);
2168
- transition: transform 0.25s ease;
2169
- }
2170
-
2171
- .docs-sidebar.open {
2172
- transform: translateX(0);
2173
- box-shadow: 4px 0 24px rgba(0, 0, 0, 0.4);
2174
- }
2175
-
2176
- .docs-main {
2177
- margin-left: 0;
2178
- }
2179
-
2180
- .mobile-menu-btn,
2181
- .header-logo-mobile {
2182
- display: flex;
2183
- }
2184
-
2185
- .docs-content {
2186
- padding: 2rem 1.25rem 4rem;
2187
- }
2188
-
2189
- .sidebar-nav {
2190
- padding-bottom: 6rem;
2191
- }
2192
-
2193
- .doc-h1 {
2194
- font-size: 1.75rem;
2195
- }
2196
-
2197
- .prev-next-grid {
2198
- grid-template-columns: 1fr;
2199
- }
2200
-
2201
- .hero {
2202
- padding: 4rem 1.25rem 3rem;
2203
- }
2204
-
2205
- .hero-stats {
2206
- gap: 1.5rem;
2207
- }
2208
-
2209
- .home-example {
2210
- padding: 0 1.25rem 4rem;
2211
- }
2212
-
2213
- .features {
2214
- padding: 3rem 1.25rem;
2215
- }
2216
-
2217
- .home-nav {
2218
- padding: 1rem 1.25rem;
2219
- }
2220
-
2221
- .home-nav-links {
2222
- gap: 1rem;
2223
- }
2224
-
2225
- .home-stats {
2226
- padding: 2rem 1rem;
2227
- gap: 0;
2228
- }
2229
- .home-stat {
2230
- padding: 0.75rem 1.5rem;
2231
- }
2232
- .home-stat-value {
2233
- font-size: 1.5rem;
2234
- }
2235
- .home-stat-divider {
2236
- display: none;
2237
- }
2238
-
2239
- .how {
2240
- padding: 3.5rem 1.25rem;
2241
- }
2242
- .how-steps {
2243
- flex-direction: column;
2244
- align-items: center;
2245
- gap: 1.5rem;
2246
- }
2247
- .how-connector {
2248
- width: 1px;
2249
- height: 2rem;
2250
- }
2251
- .how-step {
2252
- max-width: 100%;
2253
- }
2254
-
2255
- .versus {
2256
- padding: 3.5rem 1.25rem;
2257
- }
2258
- .versus-title {
2259
- font-size: 1.4rem;
2260
- }
2261
-
2262
- .usp-blocks {
2263
- padding: 2.5rem 1.25rem;
2264
- }
2265
- .usp-block {
2266
- grid-template-columns: 1fr;
2267
- gap: 1.5rem;
2268
- }
2269
- .usp-block-alt {
2270
- direction: ltr;
2271
- }
2272
-
2273
- .home-cta {
2274
- padding: 3.5rem 1.25rem;
2275
- }
2276
- .home-cta h2 {
2277
- font-size: 1.5rem;
2278
- }
2279
- }
2280
-
2281
- /* ─── Icon grid ─────────────────────────────────────────────────────────────── */
2282
- .icon-grid {
2283
- display: grid;
2284
- grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
2285
- gap: 0.5rem;
2286
- margin-bottom: 1rem;
2287
- }
2288
-
2289
- .icon-grid-item {
2290
- display: flex;
2291
- flex-direction: column;
2292
- align-items: center;
2293
- gap: 0.5rem;
2294
- padding: 1rem 0.5rem;
2295
- border: 1px solid var(--border-subtle);
2296
- border-radius: 8px;
2297
- background: var(--surface);
2298
- cursor: default;
2299
- transition:
2300
- border-color 0.15s,
2301
- background 0.15s;
2302
- }
2303
-
2304
- .icon-grid-item:hover {
2305
- border-color: var(--border);
2306
- background: var(--surface-2);
2307
- }
2308
-
2309
- .icon-grid-preview {
2310
- color: var(--text);
2311
- line-height: 1;
2312
- }
2313
-
2314
- .icon-grid-name {
2315
- font-family: var(--mono, monospace);
2316
- font-size: 0.6rem;
2317
- color: var(--muted);
2318
- text-align: center;
2319
- word-break: break-all;
2320
- line-height: 1.4;
2321
- }
2322
-
2323
- /* ── How It Works — numbered vertical flow diagram ──────────────────────────
2324
- Raw HTML (creative override), replacing the removed timeline()/
2325
- timelineItem() components — see docs/src/pages/how-it-works.js. */
2326
- .hiw-flow {
2327
- list-style: none;
2328
- padding: 0;
2329
- margin: 0;
2330
- }
2331
-
2332
- .hiw-flow-item {
2333
- display: flex;
2334
- gap: 1rem;
2335
- }
2336
-
2337
- .hiw-flow-side {
2338
- display: flex;
2339
- flex-direction: column;
2340
- align-items: center;
2341
- flex-shrink: 0;
2342
- }
2343
-
2344
- .hiw-flow-dot {
2345
- width: 2rem;
2346
- height: 2rem;
2347
- border-radius: 50%;
2348
- flex-shrink: 0;
2349
- display: flex;
2350
- align-items: center;
2351
- justify-content: center;
2352
- position: relative;
2353
- z-index: 1;
2354
- font-size: 1rem;
2355
- background: var(--accent-dim);
2356
- color: var(--accent);
2357
- }
2358
-
2359
- .hiw-flow-connector {
2360
- width: 2px;
2361
- background: var(--border);
2362
- flex: 1;
2363
- min-height: 0.75rem;
2364
- }
2365
-
2366
- .hiw-flow-item:first-child .hiw-flow-connector--before,
2367
- .hiw-flow-item:last-child .hiw-flow-connector--after {
2368
- visibility: hidden;
2369
- }
2370
-
2371
- .hiw-flow-main {
2372
- flex: 1;
2373
- padding-bottom: 1.75rem;
2374
- }
2375
-
2376
- .hiw-flow-item:last-child .hiw-flow-main {
2377
- padding-bottom: 0;
2378
- }
2379
-
2380
- .hiw-flow-label {
2381
- display: block;
2382
- font-size: 0.72rem;
2383
- font-weight: 600;
2384
- color: var(--muted);
2385
- letter-spacing: 0.05em;
2386
- text-transform: uppercase;
2387
- margin-bottom: 0.35rem;
2388
- }