@invisibleloop/pulse 0.12.3 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/.claude/commands/build-page.md +5 -1
  2. package/.claude/commands/verify.md +31 -17
  3. package/.claude/pulse-checklist.md +21 -1
  4. package/.github/workflows/publish.yml +1 -0
  5. package/.pulse-verified +1 -0
  6. package/CLAUDE.md +56 -15
  7. package/docs/.claude/commands/verify.md +4 -0
  8. package/docs/.claude/pulse-checklist.md +20 -2
  9. package/docs/public/.pulse-ui-version +1 -1
  10. package/docs/public/andypixel.css +237 -0
  11. package/docs/public/bookworms.css +422 -0
  12. package/docs/public/coutumes.css +584 -0
  13. package/docs/public/images/bookworms/hero-books.jpg +0 -0
  14. package/docs/public/images/bookworms/how-we-read-now.jpg +0 -0
  15. package/docs/public/images/bookworms/lantern-keepers.jpg +0 -0
  16. package/docs/public/images/bookworms/provincial-bookseller.jpg +0 -0
  17. package/docs/public/images/journey/178.jpg +0 -0
  18. package/docs/public/images/journey/29.jpg +0 -0
  19. package/docs/public/images/retrowheels/hero.jpg +0 -0
  20. package/docs/public/images/shop/devbook-pro.jpg +0 -0
  21. package/docs/public/images/suzukibento/1015.jpg +0 -0
  22. package/docs/public/images/suzukibento/1025.jpg +0 -0
  23. package/docs/public/images/suzukibento/1043.jpg +0 -0
  24. package/docs/public/images/suzukibento/1059.jpg +0 -0
  25. package/docs/public/images/suzukibento/1062.jpg +0 -0
  26. package/docs/public/images/suzukibento/1084.jpg +0 -0
  27. package/docs/public/images/swish/1469334031218-e382a71b716b.jpg +0 -0
  28. package/docs/public/images/swish/1483985988355-763728e1935b.jpg +0 -0
  29. package/docs/public/images/swish/1485518882345-15568b007407.jpg +0 -0
  30. package/docs/public/images/swish/1490481651871-ab68de25d43d.jpg +0 -0
  31. package/docs/public/images/swish/1496747611176-843222e1e57c.jpg +0 -0
  32. package/docs/public/images/swish/1502716119720-b23a93e5fe1b.jpg +0 -0
  33. package/docs/public/images/swish/1539109136881-3be0616acf4b.jpg +0 -0
  34. package/docs/public/images/swish/1551803091-e20673f15770.jpg +0 -0
  35. package/docs/public/images/swish/1558769132-cb1aea458c5e.jpg +0 -0
  36. package/docs/public/images/swish/1572804013309-59a88b7e92f1.jpg +0 -0
  37. package/docs/public/journey.css +528 -0
  38. package/docs/public/pulse-ui.css +1036 -22
  39. package/docs/public/retrowheels.css +402 -0
  40. package/docs/public/shop.css +235 -0
  41. package/docs/public/sparkys.css +349 -0
  42. package/docs/public/suzukibento.css +517 -0
  43. package/docs/public/swish.css +394 -0
  44. package/docs/server.js +19 -4
  45. package/docs/src/lib/nav.js +14 -3
  46. package/docs/src/pages/components/decorate.js +74 -0
  47. package/docs/src/pages/components/gallery.js +102 -0
  48. package/docs/src/pages/components/hero.js +1 -0
  49. package/docs/src/pages/components/marquee.js +76 -0
  50. package/docs/src/pages/components/photo-card.js +74 -0
  51. package/docs/src/pages/components/section.js +40 -1
  52. package/docs/src/pages/meta.js +26 -0
  53. package/docs/src/pages/templates/andypixel.js +260 -0
  54. package/docs/src/pages/templates/bookworms.js +227 -0
  55. package/docs/src/pages/templates/coutumes.js +226 -0
  56. package/docs/src/pages/templates/journey.js +186 -0
  57. package/docs/src/pages/templates/retrowheels.js +342 -0
  58. package/docs/src/pages/templates/shop.js +257 -0
  59. package/docs/src/pages/templates/sparkys.js +249 -0
  60. package/docs/src/pages/templates/suzukibento.js +200 -0
  61. package/docs/src/pages/templates/swish.js +313 -0
  62. package/docs/src/pages/templates.js +313 -2
  63. package/docs/src/pages/testing.js +2 -1
  64. package/examples/.claude/commands/pulse-build.md +7 -0
  65. package/examples/.claude/commands/pulse-dev.md +7 -0
  66. package/examples/.claude/commands/pulse-start.md +9 -0
  67. package/examples/.claude/commands/pulse-stop.md +5 -0
  68. package/examples/.claude/commands/verify.md +84 -0
  69. package/examples/.claude/coverage-check.js +127 -0
  70. package/examples/.claude/pulse-checklist.md +177 -0
  71. package/examples/andypixel.css +237 -0
  72. package/examples/andypixel.js +258 -0
  73. package/examples/bookworms.css +422 -0
  74. package/examples/bookworms.js +225 -0
  75. package/examples/contact.js +1 -0
  76. package/examples/counter.js +1 -0
  77. package/examples/dev.server.js +17 -0
  78. package/examples/journey.css +528 -0
  79. package/examples/journey.js +186 -0
  80. package/examples/pricing.js +1 -0
  81. package/examples/public/.pulse-ui-version +1 -0
  82. package/examples/public/pulse-ui.css +4031 -0
  83. package/examples/public/pulse-ui.js +257 -0
  84. package/examples/quiz.js +1 -0
  85. package/examples/retrowheels.css +402 -0
  86. package/examples/retrowheels.js +340 -0
  87. package/examples/shared.js +6 -0
  88. package/examples/suzukibento.css +513 -0
  89. package/examples/suzukibento.js +200 -0
  90. package/examples/swish.css +394 -0
  91. package/examples/swish.js +311 -0
  92. package/examples/todos.js +1 -0
  93. package/package.json +2 -3
  94. package/public/.pulse-ui-version +1 -1
  95. package/public/images/bookworms/hero-books.jpg +0 -0
  96. package/public/images/bookworms/how-we-read-now.jpg +0 -0
  97. package/public/images/bookworms/lantern-keepers.jpg +0 -0
  98. package/public/images/bookworms/provincial-bookseller.jpg +0 -0
  99. package/public/images/journey/178.jpg +0 -0
  100. package/public/images/journey/29.jpg +0 -0
  101. package/public/images/retrowheels/hero.jpg +0 -0
  102. package/public/images/shop/devbook-pro.jpg +0 -0
  103. package/public/images/suzukibento/1015.jpg +0 -0
  104. package/public/images/suzukibento/1025.jpg +0 -0
  105. package/public/images/suzukibento/1043.jpg +0 -0
  106. package/public/images/suzukibento/1059.jpg +0 -0
  107. package/public/images/suzukibento/1062.jpg +0 -0
  108. package/public/images/suzukibento/1084.jpg +0 -0
  109. package/public/images/swish/1469334031218-e382a71b716b.jpg +0 -0
  110. package/public/images/swish/1483985988355-763728e1935b.jpg +0 -0
  111. package/public/images/swish/1485518882345-15568b007407.jpg +0 -0
  112. package/public/images/swish/1490481651871-ab68de25d43d.jpg +0 -0
  113. package/public/images/swish/1496747611176-843222e1e57c.jpg +0 -0
  114. package/public/images/swish/1502716119720-b23a93e5fe1b.jpg +0 -0
  115. package/public/images/swish/1539109136881-3be0616acf4b.jpg +0 -0
  116. package/public/images/swish/1551803091-e20673f15770.jpg +0 -0
  117. package/public/images/swish/1558769132-cb1aea458c5e.jpg +0 -0
  118. package/public/images/swish/1572804013309-59a88b7e92f1.jpg +0 -0
  119. package/public/pulse-ui.css +1080 -22
  120. package/scripts/build.js +72 -18
  121. package/src/agent/checklist.md +22 -2
  122. package/src/agent/commands/verify.md +4 -0
  123. package/src/agent/guide-components.md +146 -8
  124. package/src/agent/guide-design-gallery.md +288 -0
  125. package/src/agent/guide-design-references.md +172 -0
  126. package/src/agent/guide-explore.md +313 -0
  127. package/src/agent/guide-styles.md +212 -11
  128. package/src/agent/guide-templates.md +223 -10
  129. package/src/agent/guide.md +9 -4
  130. package/src/agent/identity.md +2 -1
  131. package/src/agent/skills/verify/SKILL.md +64 -28
  132. package/src/agent/workflow.md +247 -61
  133. package/src/cli/dev.js +39 -14
  134. package/src/cli/fmt.js +113 -0
  135. package/src/cli/index.js +60 -33
  136. package/src/cli/logger.js +145 -0
  137. package/src/cli/scaffold.js +57 -3
  138. package/src/html.js +6 -1
  139. package/src/mcp/server.js +2561 -99
  140. package/src/mcp/validate-worker.js +49 -5
  141. package/src/runtime/ssr.js +4 -1
  142. package/src/server/index.js +29 -5
  143. package/src/spec/schema.js +21 -0
  144. package/src/spec/schema.test.js +28 -0
  145. package/src/testing/html.js +130 -4
  146. package/src/testing/testing.test.js +58 -0
  147. package/src/ui/banner.js +24 -9
  148. package/src/ui/brand-statement.js +58 -0
  149. package/src/ui/button.js +13 -2
  150. package/src/ui/card.js +20 -1
  151. package/src/ui/colophon.js +29 -0
  152. package/src/ui/contact-row.js +41 -0
  153. package/src/ui/cta.js +18 -4
  154. package/src/ui/decorate.js +55 -0
  155. package/src/ui/display-heading.js +44 -0
  156. package/src/ui/drop-cap.js +29 -0
  157. package/src/ui/editorial-hero.js +63 -0
  158. package/src/ui/entry-list.js +36 -0
  159. package/src/ui/feature.js +20 -3
  160. package/src/ui/footer.js +78 -9
  161. package/src/ui/gallery.js +56 -0
  162. package/src/ui/hero.js +68 -18
  163. package/src/ui/image-pair.js +72 -0
  164. package/src/ui/index.js +20 -0
  165. package/src/ui/input.js +1 -0
  166. package/src/ui/marquee.js +48 -0
  167. package/src/ui/nav.js +19 -9
  168. package/src/ui/photo-card.js +44 -0
  169. package/src/ui/product-card.js +65 -0
  170. package/src/ui/pullquote.js +14 -3
  171. package/src/ui/search.js +1 -0
  172. package/src/ui/section-label.js +38 -0
  173. package/src/ui/section.js +1 -1
  174. package/src/ui/service-card.js +47 -0
  175. package/src/ui/stat-grid.js +40 -0
  176. package/src/ui/stat.js +16 -2
  177. package/src/ui/testimonial.js +17 -6
  178. package/src/ui/textarea.js +1 -0
  179. package/src/ui/top-strip.js +47 -0
  180. package/src/ui/trust-list.js +46 -0
  181. package/src/ui/ui.test.js +35 -0
@@ -0,0 +1,528 @@
1
+ /*
2
+ * journey.css — Journey example
3
+ *
4
+ * Token definitions (hex values) + layout styles (var() only).
5
+ * Deep-night dark palette with gold accent.
6
+ */
7
+
8
+ /* ─── Token definitions ──────────────────────────────────────── */
9
+
10
+ :root {
11
+ --journey-bg: #0A0A0F;
12
+ --journey-surface: #12121A;
13
+ --journey-border: #2A2A38;
14
+ --journey-text: #F0EDE8;
15
+ --journey-muted: #8A8A9C;
16
+ --journey-gold: #C9A96E;
17
+ --journey-gold-dim: #8A6F42;
18
+
19
+ /* Translucent shells — used once each; defined as tokens for hex-free app styles */
20
+ --journey-nav-bg: rgba(10, 10, 15, 0.7);
21
+ --journey-nav-border: rgba(42, 42, 56, 0.6);
22
+
23
+ /* Pulse-ui token overrides — bare tokens cascade into --ui-* */
24
+ --bg: #0A0A0F;
25
+ --surface: #1A1A26;
26
+ --text: #F0EDE8;
27
+ --muted: #8A8A9C;
28
+ --border: #2A2A38;
29
+ --accent: #C9A96E;
30
+ }
31
+
32
+ /* ─── Base ───────────────────────────────────────────────────── */
33
+
34
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
35
+
36
+ body {
37
+ background: var(--journey-bg);
38
+ color: var(--journey-text);
39
+ font-family: var(--ui-font, system-ui, sans-serif);
40
+ line-height: 1.6;
41
+ }
42
+
43
+ /* ─── Skip link ──────────────────────────────────────────────── */
44
+
45
+ .j-skip-link {
46
+ position: absolute;
47
+ left: -9999px;
48
+ top: var(--ui-space-2);
49
+ z-index: 999;
50
+ padding: var(--ui-space-2) var(--ui-space-4);
51
+ background: var(--journey-gold);
52
+ color: var(--journey-bg);
53
+ font-size: var(--ui-text-sm);
54
+ font-weight: 700;
55
+ text-decoration: none;
56
+ }
57
+
58
+ .j-skip-link:focus {
59
+ left: var(--ui-space-4);
60
+ }
61
+
62
+ .j-visually-hidden {
63
+ position: absolute;
64
+ width: 1px;
65
+ height: 1px;
66
+ padding: 0;
67
+ margin: -1px;
68
+ overflow: hidden;
69
+ clip: rect(0, 0, 0, 0);
70
+ white-space: nowrap;
71
+ border: 0;
72
+ }
73
+
74
+ /* ─── Nav ────────────────────────────────────────────────────── */
75
+
76
+ .j-nav {
77
+ position: fixed;
78
+ top: 0;
79
+ left: 0;
80
+ right: 0;
81
+ z-index: 100;
82
+ height: 64px;
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: space-between;
86
+ padding: 0 var(--ui-space-8);
87
+ background: var(--journey-nav-bg);
88
+ backdrop-filter: blur(12px);
89
+ -webkit-backdrop-filter: blur(12px);
90
+ border-bottom: 1px solid var(--journey-nav-border);
91
+ }
92
+
93
+ .j-nav-wordmark {
94
+ font-size: var(--ui-text-sm);
95
+ font-weight: 700;
96
+ letter-spacing: 0.18em;
97
+ text-transform: uppercase;
98
+ color: var(--journey-text);
99
+ text-decoration: none;
100
+ }
101
+
102
+ /* ─── Hero + Timeline split ──────────────────────────────────── */
103
+
104
+ .j-hero-split {
105
+ display: grid;
106
+ grid-template-columns: 1fr 1fr;
107
+ min-height: 100svh;
108
+ }
109
+
110
+ /* ─── Hero ───────────────────────────────────────────────────── */
111
+
112
+ .j-hero {
113
+ display: flex;
114
+ flex-direction: column;
115
+ justify-content: center;
116
+ padding: 128px var(--ui-space-8) var(--ui-space-16);
117
+ position: relative;
118
+ overflow: hidden;
119
+ border-right: 1px solid var(--journey-border);
120
+ }
121
+
122
+ .j-hero-eyebrow {
123
+ font-size: var(--ui-text-xs);
124
+ letter-spacing: 0.2em;
125
+ text-transform: uppercase;
126
+ color: var(--journey-gold);
127
+ margin-bottom: var(--ui-space-6);
128
+ }
129
+
130
+ .j-hero-title {
131
+ font-size: clamp(3.5rem, 11vw, 9.5rem);
132
+ font-weight: 800;
133
+ line-height: 0.92;
134
+ letter-spacing: -0.04em;
135
+ color: var(--journey-text);
136
+ max-width: 14ch;
137
+ }
138
+
139
+ .j-hero-title em {
140
+ font-style: normal;
141
+ color: var(--journey-gold);
142
+ }
143
+
144
+ .j-hero-sub {
145
+ margin-top: var(--ui-space-8);
146
+ font-size: var(--ui-text-lg);
147
+ color: var(--journey-muted);
148
+ max-width: 42ch;
149
+ line-height: 1.5;
150
+ }
151
+
152
+ .j-hero-cta {
153
+ margin-top: var(--ui-space-10);
154
+ display: flex;
155
+ align-items: center;
156
+ gap: var(--ui-space-6);
157
+ }
158
+
159
+ .j-btn-primary {
160
+ display: inline-flex;
161
+ align-items: center;
162
+ gap: var(--ui-space-2);
163
+ background: var(--journey-gold);
164
+ color: var(--journey-bg);
165
+ font-weight: 700;
166
+ font-size: var(--ui-text-sm);
167
+ letter-spacing: 0.05em;
168
+ text-transform: uppercase;
169
+ text-decoration: none;
170
+ padding: var(--ui-space-4) var(--ui-space-8);
171
+ white-space: nowrap;
172
+ transition: opacity 0.2s;
173
+ }
174
+
175
+ .j-btn-primary:hover {
176
+ opacity: 0.85;
177
+ }
178
+
179
+ .j-btn-ghost {
180
+ display: inline-flex;
181
+ align-items: center;
182
+ gap: var(--ui-space-2);
183
+ color: var(--journey-muted);
184
+ font-size: var(--ui-text-sm);
185
+ letter-spacing: 0.05em;
186
+ text-decoration: none;
187
+ white-space: nowrap;
188
+ transition: color 0.2s;
189
+ }
190
+
191
+ .j-btn-ghost:hover {
192
+ color: var(--journey-text);
193
+ }
194
+
195
+ .j-hero-scroll {
196
+ position: absolute;
197
+ bottom: var(--ui-space-8);
198
+ left: var(--ui-space-8);
199
+ display: none;
200
+ align-items: center;
201
+ gap: var(--ui-space-3);
202
+ font-size: var(--ui-text-xs);
203
+ letter-spacing: 0.15em;
204
+ text-transform: uppercase;
205
+ color: var(--journey-muted);
206
+ }
207
+
208
+ .j-hero-line {
209
+ width: 2rem;
210
+ height: 1px;
211
+ background: var(--journey-border);
212
+ }
213
+
214
+ /* ─── Timeline section ───────────────────────────────────────── */
215
+
216
+ .j-timeline-section {
217
+ padding: 128px var(--ui-space-8) var(--ui-space-16);
218
+ position: sticky;
219
+ top: 0;
220
+ height: 100svh;
221
+ overflow-y: auto;
222
+ scrollbar-width: none;
223
+ }
224
+
225
+ .j-timeline-section::-webkit-scrollbar {
226
+ display: none;
227
+ }
228
+
229
+ .j-section-label {
230
+ font-size: var(--ui-text-xs);
231
+ letter-spacing: 0.2em;
232
+ text-transform: uppercase;
233
+ color: var(--journey-gold);
234
+ margin-bottom: var(--ui-space-16);
235
+ }
236
+
237
+ .j-timeline {
238
+ position: relative;
239
+ }
240
+
241
+ /* Centre thread */
242
+ .j-timeline::before {
243
+ content: '';
244
+ position: absolute;
245
+ left: 50%;
246
+ top: 0;
247
+ bottom: 0;
248
+ width: 1px;
249
+ background: linear-gradient(
250
+ to bottom,
251
+ transparent,
252
+ var(--journey-gold-dim) 5%,
253
+ var(--journey-gold-dim) 95%,
254
+ transparent
255
+ );
256
+ transform: translateX(-50%);
257
+ }
258
+
259
+ .j-tl-item {
260
+ display: flex;
261
+ align-items: flex-start;
262
+ margin-bottom: var(--ui-space-10);
263
+ position: relative;
264
+ }
265
+
266
+ /* Dot on centre thread */
267
+ .j-tl-item::before {
268
+ content: '';
269
+ position: absolute;
270
+ left: 50%;
271
+ top: 1.25rem;
272
+ width: 8px;
273
+ height: 8px;
274
+ border-radius: 50%;
275
+ background: var(--journey-gold);
276
+ border: 2px solid var(--journey-bg);
277
+ transform: translateX(-50%);
278
+ box-shadow: 0 0 0 1px var(--journey-gold);
279
+ z-index: 1;
280
+ }
281
+
282
+ /* Odd: card on left half */
283
+ .j-tl-item:nth-child(odd) {
284
+ justify-content: flex-start;
285
+ }
286
+ .j-tl-item:nth-child(odd) .j-tl-card {
287
+ width: calc(50% - var(--ui-space-8));
288
+ margin-right: var(--ui-space-8);
289
+ }
290
+
291
+ /* Even: card on right half */
292
+ .j-tl-item:nth-child(even) {
293
+ justify-content: flex-end;
294
+ }
295
+ .j-tl-item:nth-child(even) .j-tl-card {
296
+ width: calc(50% - var(--ui-space-8));
297
+ margin-left: var(--ui-space-8);
298
+ }
299
+
300
+ .j-tl-card {
301
+ background: var(--journey-surface);
302
+ border: 1px solid var(--journey-border);
303
+ overflow: hidden;
304
+ transition: border-color 0.2s;
305
+ }
306
+
307
+ .j-tl-card:not(.j-tl-card--image) {
308
+ padding: var(--ui-space-5);
309
+ }
310
+
311
+ .j-tl-card:hover {
312
+ border-color: var(--journey-gold-dim);
313
+ }
314
+
315
+ .j-tl-image {
316
+ display: block;
317
+ width: 100%;
318
+ aspect-ratio: 16 / 9;
319
+ object-fit: cover;
320
+ }
321
+
322
+ .j-tl-content {
323
+ padding: var(--ui-space-5);
324
+ }
325
+
326
+ .j-tl-year {
327
+ font-size: var(--ui-text-xs);
328
+ letter-spacing: 0.15em;
329
+ text-transform: uppercase;
330
+ color: var(--journey-gold);
331
+ margin-bottom: var(--ui-space-2);
332
+ }
333
+
334
+ .j-tl-title {
335
+ font-size: var(--ui-text-lg);
336
+ font-weight: 700;
337
+ color: var(--journey-text);
338
+ letter-spacing: -0.02em;
339
+ margin-bottom: var(--ui-space-2);
340
+ }
341
+
342
+ .j-tl-body {
343
+ font-size: var(--ui-text-sm);
344
+ color: var(--journey-muted);
345
+ line-height: 1.6;
346
+ }
347
+
348
+ .j-tl-tag {
349
+ display: inline-flex;
350
+ align-items: center;
351
+ gap: var(--ui-space-1);
352
+ margin-top: var(--ui-space-3);
353
+ font-size: 0.65rem;
354
+ letter-spacing: 0.12em;
355
+ text-transform: uppercase;
356
+ color: var(--journey-gold-dim);
357
+ border: 1px solid var(--journey-border);
358
+ padding: 2px var(--ui-space-2);
359
+ }
360
+
361
+ /* ─── Features strip ─────────────────────────────────────────── */
362
+
363
+ .j-features {
364
+ border-top: 1px solid var(--journey-border);
365
+ border-bottom: 1px solid var(--journey-border);
366
+ padding: var(--ui-space-12) var(--ui-space-8);
367
+ display: grid;
368
+ grid-template-columns: repeat(3, 1fr);
369
+ gap: var(--ui-space-8);
370
+ }
371
+
372
+ .j-feature-label {
373
+ display: flex;
374
+ align-items: center;
375
+ gap: var(--ui-space-2);
376
+ font-size: var(--ui-text-xs);
377
+ letter-spacing: 0.15em;
378
+ text-transform: uppercase;
379
+ color: var(--journey-gold);
380
+ margin-bottom: var(--ui-space-2);
381
+ }
382
+
383
+ .j-feature-body {
384
+ font-size: var(--ui-text-sm);
385
+ color: var(--journey-muted);
386
+ line-height: 1.5;
387
+ }
388
+
389
+ /* ─── CTA section ────────────────────────────────────────────── */
390
+
391
+ .j-cta {
392
+ padding: var(--ui-space-16) var(--ui-space-8);
393
+ text-align: center;
394
+ background: var(--journey-surface);
395
+ border-top: 1px solid var(--journey-border);
396
+ }
397
+
398
+ .j-cta-eyebrow {
399
+ font-size: var(--ui-text-xs);
400
+ letter-spacing: 0.2em;
401
+ text-transform: uppercase;
402
+ color: var(--journey-muted);
403
+ margin-bottom: var(--ui-space-6);
404
+ }
405
+
406
+ .j-cta-title {
407
+ font-size: clamp(2rem, 5vw, 4rem);
408
+ font-weight: 800;
409
+ letter-spacing: -0.03em;
410
+ line-height: 1.05;
411
+ color: var(--journey-text);
412
+ margin-bottom: var(--ui-space-8);
413
+ }
414
+
415
+ .j-cta-title em {
416
+ font-style: normal;
417
+ color: var(--journey-gold);
418
+ }
419
+
420
+ .j-cta-badges {
421
+ display: flex;
422
+ align-items: center;
423
+ justify-content: center;
424
+ gap: var(--ui-space-4);
425
+ }
426
+
427
+ /* ─── Footer ─────────────────────────────────────────────────── */
428
+
429
+ .j-footer {
430
+ padding: var(--ui-space-8);
431
+ display: flex;
432
+ align-items: center;
433
+ justify-content: space-between;
434
+ border-top: 1px solid var(--journey-border);
435
+ }
436
+
437
+ .j-footer-word {
438
+ display: flex;
439
+ align-items: center;
440
+ gap: var(--ui-space-2);
441
+ font-size: var(--ui-text-xs);
442
+ letter-spacing: 0.18em;
443
+ text-transform: uppercase;
444
+ color: var(--journey-muted);
445
+ }
446
+
447
+ .j-footer-links {
448
+ display: flex;
449
+ gap: var(--ui-space-6);
450
+ }
451
+
452
+ .j-footer-links a {
453
+ font-size: var(--ui-text-xs);
454
+ letter-spacing: 0.1em;
455
+ text-transform: uppercase;
456
+ color: var(--journey-muted);
457
+ text-decoration: none;
458
+ transition: color 0.2s;
459
+ }
460
+
461
+ .j-footer-links a:hover {
462
+ color: var(--journey-text);
463
+ }
464
+
465
+ /* ─── Responsive ─────────────────────────────────────────────── */
466
+
467
+ @media (max-width: 768px) {
468
+ .j-hero-split {
469
+ grid-template-columns: 1fr;
470
+ }
471
+
472
+ .j-hero {
473
+ min-height: auto;
474
+ border-right: none;
475
+ border-bottom: 1px solid var(--journey-border);
476
+ padding: 104px var(--ui-space-6) var(--ui-space-8);
477
+ }
478
+
479
+ .j-timeline-section {
480
+ position: static;
481
+ height: auto;
482
+ overflow-y: visible;
483
+ padding: var(--ui-space-10) var(--ui-space-6);
484
+ }
485
+
486
+ .j-hero-scroll {
487
+ display: flex;
488
+ position: static;
489
+ margin-top: var(--ui-space-8);
490
+ }
491
+
492
+ .j-timeline::before {
493
+ left: 0;
494
+ transform: none;
495
+ }
496
+
497
+ .j-tl-item::before {
498
+ left: 0;
499
+ transform: translateX(-50%);
500
+ }
501
+
502
+ .j-tl-item:nth-child(odd),
503
+ .j-tl-item:nth-child(even) {
504
+ justify-content: flex-start;
505
+ }
506
+
507
+ .j-tl-item:nth-child(odd) .j-tl-card,
508
+ .j-tl-item:nth-child(even) .j-tl-card {
509
+ width: 100%;
510
+ margin-left: var(--ui-space-6);
511
+ margin-right: 0;
512
+ }
513
+
514
+ .j-features {
515
+ grid-template-columns: 1fr;
516
+ gap: var(--ui-space-6);
517
+ }
518
+
519
+ .j-footer {
520
+ flex-direction: column;
521
+ gap: var(--ui-space-4);
522
+ text-align: center;
523
+ }
524
+
525
+ .j-nav {
526
+ padding: 0 var(--ui-space-6);
527
+ }
528
+ }