stagecraft 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/AGENT.md +792 -0
  2. package/LICENSE +21 -0
  3. package/README.md +210 -0
  4. package/bin/cli.js +51 -0
  5. package/bin/export.js +137 -0
  6. package/bin/init.js +52 -0
  7. package/bin/lib/edit-ops.js +405 -0
  8. package/bin/serve.js +278 -0
  9. package/dist/stagecraft.bundle.css +4443 -0
  10. package/dist/stagecraft.bundle.js +7621 -0
  11. package/dist/themes/brand.bundle.css +5262 -0
  12. package/dist/themes/neon.bundle.css +5289 -0
  13. package/dist/themes/paper.bundle.css +5276 -0
  14. package/dist/themes/phosphor.bundle.css +4443 -0
  15. package/dist/themes/shopware.bundle.css +5850 -0
  16. package/examples/closing-card.js +74 -0
  17. package/examples/orchestration-graph.js +156 -0
  18. package/examples/terminal-log.js +109 -0
  19. package/examples/token-stream.js +96 -0
  20. package/examples/whoami.js +90 -0
  21. package/package.json +41 -0
  22. package/src/components/activity-list.js +75 -0
  23. package/src/components/agenda.js +79 -0
  24. package/src/components/bar-chart.js +162 -0
  25. package/src/components/before-after.js +135 -0
  26. package/src/components/bento.js +73 -0
  27. package/src/components/big-number.js +87 -0
  28. package/src/components/callout.js +75 -0
  29. package/src/components/checklist.js +81 -0
  30. package/src/components/code-block.js +141 -0
  31. package/src/components/code-diff.js +98 -0
  32. package/src/components/compare.js +85 -0
  33. package/src/components/counter.js +80 -0
  34. package/src/components/cta.js +69 -0
  35. package/src/components/cycle.js +146 -0
  36. package/src/components/definition.js +96 -0
  37. package/src/components/donut-chart.js +179 -0
  38. package/src/components/full-image.js +82 -0
  39. package/src/components/funnel.js +111 -0
  40. package/src/components/gauge.js +147 -0
  41. package/src/components/heatmap.js +141 -0
  42. package/src/components/image-grid.js +80 -0
  43. package/src/components/image-text.js +96 -0
  44. package/src/components/kinetic-text.js +72 -0
  45. package/src/components/kpi.js +106 -0
  46. package/src/components/line-chart.js +215 -0
  47. package/src/components/manifesto.js +104 -0
  48. package/src/components/marquee.js +63 -0
  49. package/src/components/matrix2x2.js +151 -0
  50. package/src/components/pillars.js +80 -0
  51. package/src/components/pricing.js +90 -0
  52. package/src/components/process-flow.js +133 -0
  53. package/src/components/progress.js +136 -0
  54. package/src/components/punchline.js +82 -0
  55. package/src/components/pyramid.js +107 -0
  56. package/src/components/qanda.js +60 -0
  57. package/src/components/quote.js +70 -0
  58. package/src/components/roadmap.js +130 -0
  59. package/src/components/section-card.js +45 -0
  60. package/src/components/shift-arrow.js +41 -0
  61. package/src/components/spark-line.js +147 -0
  62. package/src/components/spotlight.js +85 -0
  63. package/src/components/statement.js +106 -0
  64. package/src/components/stats.js +91 -0
  65. package/src/components/steps.js +83 -0
  66. package/src/components/swot.js +110 -0
  67. package/src/components/team-grid.js +87 -0
  68. package/src/components/testimonial.js +99 -0
  69. package/src/components/timeline.js +91 -0
  70. package/src/components/tip.js +63 -0
  71. package/src/components/venn.js +198 -0
  72. package/src/edit-mode.js +1256 -0
  73. package/src/engine.js +823 -0
  74. package/src/helpers.js +169 -0
  75. package/src/transitions.js +101 -0
  76. package/starter/index.html +40 -0
  77. package/starter/slides/00-title.js +12 -0
  78. package/starter/stagecraft.config.js +8 -0
  79. package/themes/brand/base.css +4 -0
  80. package/themes/brand/components-business.css +173 -0
  81. package/themes/brand/components-chart.css +65 -0
  82. package/themes/brand/components-content.css +126 -0
  83. package/themes/brand/components-data.css +162 -0
  84. package/themes/brand/components-diagram.css +115 -0
  85. package/themes/brand/components-layout.css +112 -0
  86. package/themes/brand/components.css +46 -0
  87. package/themes/brand/manifest.json +20 -0
  88. package/themes/brand/tokens.css +20 -0
  89. package/themes/brand/transitions.css +4 -0
  90. package/themes/neon/base.css +10 -0
  91. package/themes/neon/components-business.css +189 -0
  92. package/themes/neon/components-chart.css +70 -0
  93. package/themes/neon/components-content.css +112 -0
  94. package/themes/neon/components-data.css +160 -0
  95. package/themes/neon/components-diagram.css +109 -0
  96. package/themes/neon/components-layout.css +87 -0
  97. package/themes/neon/components.css +87 -0
  98. package/themes/neon/manifest.json +21 -0
  99. package/themes/neon/tokens.css +17 -0
  100. package/themes/neon/transitions.css +13 -0
  101. package/themes/paper/base.css +9 -0
  102. package/themes/paper/components-business.css +196 -0
  103. package/themes/paper/components-chart.css +74 -0
  104. package/themes/paper/components-content.css +108 -0
  105. package/themes/paper/components-data.css +168 -0
  106. package/themes/paper/components-diagram.css +89 -0
  107. package/themes/paper/components-layout.css +105 -0
  108. package/themes/paper/components.css +60 -0
  109. package/themes/paper/manifest.json +10 -0
  110. package/themes/paper/tokens.css +21 -0
  111. package/themes/paper/transitions.css +11 -0
  112. package/themes/phosphor/base.css +511 -0
  113. package/themes/phosphor/components-business.css +818 -0
  114. package/themes/phosphor/components-chart.css +415 -0
  115. package/themes/phosphor/components-content.css +530 -0
  116. package/themes/phosphor/components-data.css +824 -0
  117. package/themes/phosphor/components-diagram.css +427 -0
  118. package/themes/phosphor/components-layout.css +450 -0
  119. package/themes/phosphor/components.css +223 -0
  120. package/themes/phosphor/manifest.json +11 -0
  121. package/themes/phosphor/tokens.css +17 -0
  122. package/themes/phosphor/transitions.css +213 -0
  123. package/themes/shopware/base.css +94 -0
  124. package/themes/shopware/components-business.css +344 -0
  125. package/themes/shopware/components-chart.css +121 -0
  126. package/themes/shopware/components-content.css +169 -0
  127. package/themes/shopware/components-data.css +219 -0
  128. package/themes/shopware/components-diagram.css +129 -0
  129. package/themes/shopware/components-layout.css +166 -0
  130. package/themes/shopware/components.css +83 -0
  131. package/themes/shopware/manifest.json +21 -0
  132. package/themes/shopware/tokens.css +68 -0
  133. package/themes/shopware/transitions.css +22 -0
@@ -0,0 +1,818 @@
1
+ /* Stagecraft — Phosphor theme: business / marketing components. */
2
+
3
+ /* ---------------------------------------------------------------------------
4
+ * Pricing
5
+ * ------------------------------------------------------------------------- */
6
+ .pricing {
7
+ display: grid;
8
+ gap: clamp(1rem, 2vw, 1.6rem);
9
+ width: min(1300px, 94vw);
10
+ align-items: stretch;
11
+ }
12
+ .pricing--cols-1 { grid-template-columns: 1fr; max-width: 480px; }
13
+ .pricing--cols-2 { grid-template-columns: repeat(2, 1fr); }
14
+ .pricing--cols-3 { grid-template-columns: repeat(3, 1fr); }
15
+ .pricing--cols-4 { grid-template-columns: repeat(4, 1fr); }
16
+
17
+ .pricing-tier {
18
+ position: relative;
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: clamp(0.7rem, 1.4vw, 1.2rem);
22
+ padding: clamp(1.3rem, 2.6vw, 2rem);
23
+ background: var(--bg-elevated);
24
+ border: 1px solid var(--dim-2);
25
+ opacity: 0;
26
+ transform: translateY(14px);
27
+ transition:
28
+ opacity 700ms ease-out,
29
+ transform 800ms cubic-bezier(0.16, 1, 0.3, 1),
30
+ border-color 500ms ease,
31
+ box-shadow 500ms ease;
32
+ }
33
+ .pricing-tier.in { opacity: 1; transform: translateY(0); }
34
+
35
+ .pricing-tier--featured {
36
+ border-color: var(--accent);
37
+ box-shadow:
38
+ 0 0 0 1px var(--accent),
39
+ 0 0 40px -10px var(--accent-glow);
40
+ transform: translateY(14px) scale(1.04);
41
+ z-index: 1;
42
+ }
43
+ .pricing-tier--featured.in { transform: translateY(0) scale(1.04); }
44
+
45
+ .pricing-badge {
46
+ position: absolute;
47
+ top: -0.8rem;
48
+ left: 50%;
49
+ transform: translateX(-50%);
50
+ padding: 0.25rem 0.7rem;
51
+ background: var(--accent);
52
+ color: var(--bg);
53
+ font-size: 0.7rem;
54
+ letter-spacing: 0.15em;
55
+ text-transform: uppercase;
56
+ font-weight: 500;
57
+ box-shadow: 0 0 24px -4px var(--accent-glow);
58
+ }
59
+
60
+ .pricing-name {
61
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
62
+ letter-spacing: 0.12em;
63
+ text-transform: uppercase;
64
+ color: var(--dim);
65
+ }
66
+ .pricing-tier--featured .pricing-name { color: var(--accent); }
67
+
68
+ .pricing-figure {
69
+ display: flex;
70
+ align-items: baseline;
71
+ gap: 0.25rem;
72
+ line-height: 1;
73
+ margin: 0.2rem 0 0.4rem;
74
+ }
75
+ .pricing-price {
76
+ font-size: clamp(2.2rem, 4.5vw, 3.4rem);
77
+ font-weight: 500;
78
+ letter-spacing: -0.03em;
79
+ color: var(--fg);
80
+ }
81
+ .pricing-tier--featured .pricing-price {
82
+ color: var(--accent);
83
+ text-shadow: 0 0 28px var(--accent-glow);
84
+ }
85
+ .pricing-period {
86
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
87
+ color: var(--dim);
88
+ }
89
+
90
+ .pricing-features {
91
+ list-style: none;
92
+ margin: 0;
93
+ padding: 0;
94
+ display: flex;
95
+ flex-direction: column;
96
+ gap: 0.55rem;
97
+ }
98
+ .pricing-feature {
99
+ display: flex;
100
+ align-items: flex-start;
101
+ gap: 0.55rem;
102
+ font-size: clamp(0.9rem, 1.15vw, 1.05rem);
103
+ color: var(--fg);
104
+ line-height: 1.4;
105
+ }
106
+ .pricing-check {
107
+ font-size: 1.1rem;
108
+ color: var(--accent);
109
+ flex: 0 0 auto;
110
+ margin-top: 0.1em;
111
+ }
112
+
113
+ .pricing-cta {
114
+ margin-top: auto;
115
+ padding: 0.7rem 1rem;
116
+ border: 1px solid var(--dim-2);
117
+ display: flex;
118
+ justify-content: center;
119
+ align-items: center;
120
+ gap: 0.4rem;
121
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
122
+ color: var(--fg);
123
+ letter-spacing: 0.08em;
124
+ text-transform: uppercase;
125
+ transition: border-color 400ms ease, background 400ms ease;
126
+ }
127
+ .pricing-tier--featured .pricing-cta {
128
+ border-color: var(--accent);
129
+ background: var(--accent-soft);
130
+ color: var(--accent);
131
+ }
132
+ .pricing-cta-arrow { font-size: 1.1rem; }
133
+
134
+ @media (max-width: 800px) {
135
+ .pricing--cols-3, .pricing--cols-4 { grid-template-columns: 1fr; }
136
+ .pricing-tier--featured, .pricing-tier--featured.in { transform: translateY(0) scale(1); }
137
+ }
138
+
139
+ /* ---------------------------------------------------------------------------
140
+ * Testimonial
141
+ * ------------------------------------------------------------------------- */
142
+ .testimonial {
143
+ display: grid;
144
+ grid-template-columns: minmax(0, 280px) 1fr;
145
+ align-items: center;
146
+ gap: clamp(2rem, 5vw, 4rem);
147
+ width: min(1200px, 94vw);
148
+ }
149
+ .testimonial-photo-wrap {
150
+ width: clamp(180px, 22vw, 280px);
151
+ aspect-ratio: 1;
152
+ border-radius: 50%;
153
+ overflow: hidden;
154
+ background: var(--bg-elevated);
155
+ border: 1px solid var(--dim-2);
156
+ opacity: 0;
157
+ transform: scale(0.85);
158
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
159
+ box-shadow: 0 0 40px -10px var(--accent-glow);
160
+ }
161
+ .testimonial-photo-wrap.in { opacity: 1; transform: scale(1); }
162
+ .testimonial-photo {
163
+ width: 100%;
164
+ height: 100%;
165
+ object-fit: cover;
166
+ filter: saturate(0.9) contrast(1.05);
167
+ }
168
+
169
+ .testimonial-body {
170
+ display: flex;
171
+ flex-direction: column;
172
+ gap: clamp(0.8rem, 1.8vw, 1.4rem);
173
+ position: relative;
174
+ }
175
+ .testimonial-mark {
176
+ font-size: clamp(3rem, 6vw, 5rem);
177
+ color: var(--accent);
178
+ text-shadow: 0 0 30px var(--accent-glow);
179
+ line-height: 0.7;
180
+ opacity: 0;
181
+ transform: scale(0.6);
182
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.34, 1.56, 0.64, 1);
183
+ }
184
+ .testimonial-mark.in { opacity: 1; transform: scale(1); }
185
+
186
+ .testimonial-quote {
187
+ margin: 0;
188
+ font-size: clamp(1.4rem, 2.6vw, 2.2rem);
189
+ font-style: italic;
190
+ line-height: 1.3;
191
+ color: var(--fg);
192
+ letter-spacing: -0.01em;
193
+ opacity: 0;
194
+ transform: translateY(12px);
195
+ transition: opacity 900ms ease-out, transform 1000ms cubic-bezier(0.16, 1, 0.3, 1);
196
+ }
197
+ .testimonial-quote.in { opacity: 1; transform: translateY(0); }
198
+
199
+ .testimonial-meta {
200
+ display: flex;
201
+ flex-direction: column;
202
+ gap: 0.2rem;
203
+ opacity: 0;
204
+ transform: translateY(8px);
205
+ transition: opacity 700ms ease-out, transform 800ms ease-out;
206
+ position: relative;
207
+ }
208
+ .testimonial-meta.in { opacity: 1; transform: translateY(0); }
209
+ .testimonial-author {
210
+ font-size: clamp(1rem, 1.3vw, 1.15rem);
211
+ color: var(--fg);
212
+ font-weight: 500;
213
+ }
214
+ .testimonial-affil {
215
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
216
+ color: var(--dim);
217
+ }
218
+ .testimonial-sep { color: var(--dim-2); margin: 0 0.3rem; }
219
+ .testimonial-logo {
220
+ position: absolute;
221
+ right: 0;
222
+ top: 50%;
223
+ transform: translateY(-50%);
224
+ height: 2rem;
225
+ opacity: 0.55;
226
+ filter: grayscale(1);
227
+ }
228
+
229
+ @media (max-width: 800px) {
230
+ .testimonial { grid-template-columns: 1fr; justify-items: center; text-align: center; }
231
+ .testimonial-meta { align-items: center; }
232
+ .testimonial-logo { position: static; transform: none; margin-top: 0.6rem; }
233
+ }
234
+
235
+ /* ---------------------------------------------------------------------------
236
+ * TeamGrid
237
+ * ------------------------------------------------------------------------- */
238
+ .team-grid {
239
+ display: grid;
240
+ gap: clamp(1.2rem, 2.2vw, 2rem);
241
+ width: min(1300px, 94vw);
242
+ }
243
+ .team-grid--cols-2 { grid-template-columns: repeat(2, 1fr); }
244
+ .team-grid--cols-3 { grid-template-columns: repeat(3, 1fr); }
245
+ .team-grid--cols-4 { grid-template-columns: repeat(4, 1fr); }
246
+
247
+ .team-card {
248
+ display: flex;
249
+ flex-direction: column;
250
+ align-items: center;
251
+ text-align: center;
252
+ gap: 0.5rem;
253
+ padding: clamp(1rem, 2vw, 1.6rem);
254
+ background: var(--bg-elevated);
255
+ border: 1px solid var(--dim-2);
256
+ opacity: 0;
257
+ transform: translateY(14px);
258
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 500ms ease;
259
+ }
260
+ .team-card.in { opacity: 1; transform: translateY(0); }
261
+ .team-card:hover { border-color: var(--accent); }
262
+
263
+ .team-photo-wrap {
264
+ width: clamp(80px, 9vw, 120px);
265
+ aspect-ratio: 1;
266
+ border-radius: 50%;
267
+ overflow: hidden;
268
+ background: var(--bg);
269
+ border: 1px solid var(--dim-2);
270
+ margin-bottom: 0.4rem;
271
+ display: flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ }
275
+ .team-photo {
276
+ width: 100%;
277
+ height: 100%;
278
+ object-fit: cover;
279
+ filter: saturate(0.9) contrast(1.04);
280
+ }
281
+ .team-photo--placeholder {
282
+ font-size: clamp(2.5rem, 4vw, 3.5rem);
283
+ color: var(--dim);
284
+ }
285
+
286
+ .team-name {
287
+ font-size: clamp(1rem, 1.3vw, 1.2rem);
288
+ font-weight: 500;
289
+ color: var(--fg);
290
+ letter-spacing: -0.01em;
291
+ }
292
+ .team-role {
293
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
294
+ color: var(--accent);
295
+ letter-spacing: 0.08em;
296
+ text-transform: uppercase;
297
+ }
298
+ .team-bio {
299
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
300
+ color: var(--dim);
301
+ line-height: 1.45;
302
+ margin-top: 0.3rem;
303
+ }
304
+ .team-social {
305
+ margin-top: auto;
306
+ padding-top: 0.6rem;
307
+ display: flex;
308
+ gap: 0.7rem;
309
+ }
310
+ .team-social-icon {
311
+ font-size: 1.1rem;
312
+ color: var(--dim);
313
+ transition: color 300ms ease;
314
+ cursor: default;
315
+ }
316
+ .team-social-icon:hover { color: var(--accent); }
317
+
318
+ @media (max-width: 900px) {
319
+ .team-grid--cols-3, .team-grid--cols-4 { grid-template-columns: repeat(2, 1fr); }
320
+ }
321
+ @media (max-width: 540px) {
322
+ .team-grid--cols-2, .team-grid--cols-3, .team-grid--cols-4 { grid-template-columns: 1fr; }
323
+ }
324
+
325
+ /* ---------------------------------------------------------------------------
326
+ * Agenda
327
+ * ------------------------------------------------------------------------- */
328
+ .agenda {
329
+ position: relative;
330
+ display: flex;
331
+ flex-direction: column;
332
+ gap: clamp(0.8rem, 1.6vw, 1.4rem);
333
+ width: min(900px, 92vw);
334
+ padding-left: clamp(5rem, 10vw, 8rem);
335
+ }
336
+ .agenda-rail {
337
+ position: absolute;
338
+ left: clamp(5rem, 10vw, 8rem);
339
+ top: 0.6rem;
340
+ bottom: 0.6rem;
341
+ width: 1px;
342
+ background: linear-gradient(to bottom, transparent, var(--dim-2) 12%, var(--dim-2) 88%, transparent);
343
+ }
344
+ .agenda-item {
345
+ position: relative;
346
+ display: grid;
347
+ grid-template-columns: clamp(5rem, 10vw, 8rem) auto 1fr;
348
+ align-items: center;
349
+ gap: clamp(0.8rem, 1.4vw, 1.2rem);
350
+ margin-left: calc(-1 * clamp(5rem, 10vw, 8rem));
351
+ opacity: 0;
352
+ transform: translateX(-12px);
353
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
354
+ }
355
+ .agenda-item.in { opacity: 1; transform: translateX(0); }
356
+ .agenda-time {
357
+ font-size: clamp(0.85rem, 1.15vw, 1rem);
358
+ color: var(--accent);
359
+ text-align: right;
360
+ font-variant-numeric: tabular-nums;
361
+ letter-spacing: 0.05em;
362
+ }
363
+ .agenda-dot {
364
+ width: 2.2rem;
365
+ height: 2.2rem;
366
+ border-radius: 50%;
367
+ background: var(--bg-elevated);
368
+ border: 1px solid var(--accent);
369
+ box-shadow: 0 0 16px -2px var(--accent-glow);
370
+ display: flex;
371
+ align-items: center;
372
+ justify-content: center;
373
+ position: relative;
374
+ z-index: 1;
375
+ flex: 0 0 auto;
376
+ }
377
+ .agenda-dot .material-symbols-outlined {
378
+ font-size: 1.1rem;
379
+ color: var(--accent);
380
+ }
381
+ .agenda-body {
382
+ display: flex;
383
+ flex-direction: column;
384
+ gap: 0.1rem;
385
+ }
386
+ .agenda-label {
387
+ font-size: clamp(1rem, 1.4vw, 1.25rem);
388
+ color: var(--fg);
389
+ font-weight: 500;
390
+ letter-spacing: -0.01em;
391
+ }
392
+ .agenda-duration {
393
+ font-size: clamp(0.75rem, 1vw, 0.9rem);
394
+ color: var(--dim);
395
+ letter-spacing: 0.08em;
396
+ text-transform: uppercase;
397
+ }
398
+
399
+ @media (max-width: 600px) {
400
+ .agenda { padding-left: 0; }
401
+ .agenda-rail { left: 4rem; }
402
+ .agenda-item { grid-template-columns: 4rem auto 1fr; margin-left: 0; }
403
+ }
404
+
405
+ /* ---------------------------------------------------------------------------
406
+ * Checklist
407
+ * ------------------------------------------------------------------------- */
408
+ .checklist {
409
+ display: flex;
410
+ flex-direction: column;
411
+ gap: clamp(0.6rem, 1.2vw, 1rem);
412
+ width: min(800px, 92vw);
413
+ }
414
+ .checklist-item {
415
+ display: flex;
416
+ align-items: flex-start;
417
+ gap: 0.8rem;
418
+ padding: clamp(0.7rem, 1.3vw, 1rem) clamp(0.8rem, 1.6vw, 1.2rem);
419
+ background: var(--bg-elevated);
420
+ border: 1px solid var(--dim-2);
421
+ opacity: 0;
422
+ transform: translateY(8px);
423
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1), border-color 400ms ease;
424
+ }
425
+ .checklist-item.in { opacity: 1; transform: translateY(0); }
426
+ .checklist-item.is-done { border-color: rgba(0, 255, 156, 0.25); }
427
+ .checklist-box {
428
+ font-size: 1.5rem;
429
+ color: var(--dim);
430
+ flex: 0 0 auto;
431
+ transition: color 400ms ease;
432
+ line-height: 1.1;
433
+ }
434
+ .checklist-item.is-done .checklist-box {
435
+ color: var(--accent);
436
+ text-shadow: 0 0 12px var(--accent-glow);
437
+ }
438
+ .checklist-body {
439
+ display: flex;
440
+ flex-direction: column;
441
+ gap: 0.2rem;
442
+ }
443
+ .checklist-text {
444
+ font-size: clamp(1rem, 1.35vw, 1.2rem);
445
+ color: var(--fg);
446
+ letter-spacing: -0.01em;
447
+ line-height: 1.35;
448
+ }
449
+ .checklist-item.is-done .checklist-text { color: var(--dim); }
450
+ .checklist-sub {
451
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
452
+ color: var(--dim);
453
+ line-height: 1.45;
454
+ }
455
+
456
+ /* ---------------------------------------------------------------------------
457
+ * Steps
458
+ * ------------------------------------------------------------------------- */
459
+ .steps {
460
+ display: grid;
461
+ gap: clamp(1rem, 2vw, 1.8rem);
462
+ width: min(1300px, 94vw);
463
+ }
464
+ .steps--horizontal { grid-auto-flow: column; grid-auto-columns: 1fr; }
465
+ .steps--vertical { grid-auto-flow: row; max-width: 720px; }
466
+
467
+ .step-card {
468
+ position: relative;
469
+ display: grid;
470
+ grid-template-columns: auto 1fr;
471
+ gap: clamp(0.8rem, 1.5vw, 1.4rem);
472
+ padding: clamp(1.1rem, 2.2vw, 1.8rem);
473
+ background: var(--bg-elevated);
474
+ border: 1px solid var(--dim-2);
475
+ align-items: start;
476
+ opacity: 0;
477
+ transform: translateY(14px);
478
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 400ms ease;
479
+ }
480
+ .step-card.in { opacity: 1; transform: translateY(0); }
481
+ .step-card:hover { border-color: var(--accent); }
482
+
483
+ .steps--horizontal .step-card { grid-template-columns: 1fr; grid-template-rows: auto auto; }
484
+
485
+ .step-numeral {
486
+ font-size: clamp(2.5rem, 5vw, 4.2rem);
487
+ font-weight: 500;
488
+ letter-spacing: -0.05em;
489
+ line-height: 0.9;
490
+ color: var(--accent);
491
+ text-shadow: 0 0 28px var(--accent-glow);
492
+ font-variant-numeric: tabular-nums;
493
+ }
494
+
495
+ .step-content {
496
+ display: flex;
497
+ flex-direction: column;
498
+ gap: 0.4rem;
499
+ min-width: 0;
500
+ }
501
+ .step-head {
502
+ display: flex;
503
+ align-items: center;
504
+ gap: 0.5rem;
505
+ }
506
+ .step-icon {
507
+ font-size: 1.3rem;
508
+ color: var(--dim);
509
+ }
510
+ .step-label {
511
+ font-size: clamp(1.05rem, 1.5vw, 1.4rem);
512
+ font-weight: 500;
513
+ color: var(--fg);
514
+ letter-spacing: -0.015em;
515
+ line-height: 1.2;
516
+ }
517
+ .step-body {
518
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
519
+ color: var(--dim);
520
+ line-height: 1.5;
521
+ }
522
+
523
+ @media (max-width: 800px) {
524
+ .steps--horizontal { grid-auto-flow: row; grid-auto-columns: auto; }
525
+ .steps--horizontal .step-card { grid-template-columns: auto 1fr; }
526
+ }
527
+
528
+ /* ---------------------------------------------------------------------------
529
+ * CTA
530
+ * ------------------------------------------------------------------------- */
531
+ .cta {
532
+ display: flex;
533
+ flex-direction: column;
534
+ align-items: flex-start;
535
+ gap: clamp(1rem, 2vw, 1.6rem);
536
+ width: min(900px, 92vw);
537
+ padding: clamp(2rem, 4vw, 3.5rem);
538
+ background: var(--bg-elevated);
539
+ border: 1px solid var(--dim-2);
540
+ position: relative;
541
+ }
542
+ .cta--accent {
543
+ border-color: var(--accent);
544
+ box-shadow: 0 0 50px -10px var(--accent-glow);
545
+ background:
546
+ linear-gradient(135deg, var(--accent-soft), transparent 50%),
547
+ var(--bg-elevated);
548
+ }
549
+ .cta-headline {
550
+ font-size: clamp(1.8rem, 4vw, 3rem);
551
+ font-weight: 500;
552
+ letter-spacing: -0.03em;
553
+ line-height: 1.1;
554
+ color: var(--fg);
555
+ opacity: 0;
556
+ transform: translateY(14px);
557
+ transition: opacity 800ms ease-out, transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
558
+ }
559
+ .cta-headline.in { opacity: 1; transform: translateY(0); }
560
+ .cta--accent .cta-headline { color: var(--fg); }
561
+
562
+ .cta-body {
563
+ font-size: clamp(1rem, 1.4vw, 1.25rem);
564
+ color: var(--dim);
565
+ line-height: 1.5;
566
+ max-width: 50ch;
567
+ opacity: 0;
568
+ transform: translateY(10px);
569
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
570
+ }
571
+ .cta-body.in { opacity: 1; transform: translateY(0); }
572
+
573
+ .cta-action {
574
+ display: flex;
575
+ align-items: center;
576
+ gap: 1rem;
577
+ margin-top: 0.4rem;
578
+ opacity: 0;
579
+ transform: translateY(8px);
580
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
581
+ }
582
+ .cta-action.in { opacity: 1; transform: translateY(0); }
583
+
584
+ .cta-button {
585
+ display: inline-flex;
586
+ align-items: center;
587
+ gap: 0.5rem;
588
+ padding: 0.8rem 1.4rem;
589
+ border: 1px solid var(--accent);
590
+ color: var(--accent);
591
+ background: transparent;
592
+ font-size: clamp(0.9rem, 1.2vw, 1.05rem);
593
+ letter-spacing: 0.1em;
594
+ text-transform: uppercase;
595
+ transition: background 300ms ease, color 300ms ease, transform 300ms ease, box-shadow 300ms ease;
596
+ }
597
+ .cta--accent .cta-button {
598
+ background: var(--accent);
599
+ color: var(--bg);
600
+ box-shadow: 0 0 30px -5px var(--accent-glow);
601
+ }
602
+ .cta-button-arrow { font-size: 1.2rem; }
603
+ .cta-hint {
604
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
605
+ color: var(--dim);
606
+ letter-spacing: 0.05em;
607
+ }
608
+
609
+ /* ---------------------------------------------------------------------------
610
+ * Callout (shared base) + Tip
611
+ * ------------------------------------------------------------------------- */
612
+ .callout {
613
+ display: grid;
614
+ grid-template-columns: auto 1fr;
615
+ align-items: flex-start;
616
+ gap: clamp(0.8rem, 1.5vw, 1.2rem);
617
+ width: min(900px, 92vw);
618
+ padding: clamp(1.1rem, 2.2vw, 1.8rem) clamp(1.2rem, 2.4vw, 2rem);
619
+ background: var(--bg-elevated);
620
+ border-left: 4px solid var(--dim-2);
621
+ opacity: 0;
622
+ transform: translateX(-12px);
623
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
624
+ }
625
+ .callout.in { opacity: 1; transform: translateX(0); }
626
+ .callout-icon {
627
+ font-size: clamp(1.6rem, 2.6vw, 2.2rem);
628
+ line-height: 1;
629
+ flex: 0 0 auto;
630
+ margin-top: 0.05em;
631
+ }
632
+ .callout-body {
633
+ display: flex;
634
+ flex-direction: column;
635
+ gap: 0.4rem;
636
+ }
637
+ .callout-heading {
638
+ font-size: clamp(1.05rem, 1.5vw, 1.35rem);
639
+ font-weight: 500;
640
+ letter-spacing: -0.01em;
641
+ }
642
+ .callout-text {
643
+ font-size: clamp(0.95rem, 1.25vw, 1.1rem);
644
+ color: var(--fg);
645
+ line-height: 1.5;
646
+ opacity: 0.9;
647
+ }
648
+ .callout--info { border-left-color: var(--blue); background: linear-gradient(90deg, rgba(24, 158, 255, 0.08), transparent 40%), var(--bg-elevated); }
649
+ .callout--info .callout-icon, .callout--info .callout-heading { color: var(--blue); }
650
+ .callout--tip { border-left-color: var(--accent); background: linear-gradient(90deg, var(--accent-soft), transparent 40%), var(--bg-elevated); }
651
+ .callout--tip .callout-icon, .callout--tip .callout-heading { color: var(--accent); }
652
+ .callout--warning { border-left-color: var(--amber); background: linear-gradient(90deg, rgba(255, 180, 84, 0.1), transparent 40%), var(--bg-elevated); }
653
+ .callout--warning .callout-icon, .callout--warning .callout-heading { color: var(--amber); }
654
+ .callout--danger { border-left-color: var(--red); background: linear-gradient(90deg, rgba(255, 92, 92, 0.1), transparent 40%), var(--bg-elevated); }
655
+ .callout--danger .callout-icon, .callout--danger .callout-heading { color: var(--red); }
656
+ .callout--success { border-left-color: var(--accent); background: linear-gradient(90deg, rgba(0, 255, 156, 0.18), transparent 50%), var(--bg-elevated); }
657
+ .callout--success .callout-icon, .callout--success .callout-heading { color: var(--accent); }
658
+ .callout--success .callout-icon { text-shadow: 0 0 18px var(--accent-glow); }
659
+
660
+ /* Tip — compact single-paragraph emphasis */
661
+ .tip {
662
+ display: grid;
663
+ grid-template-columns: auto 1fr;
664
+ align-items: center;
665
+ gap: 0.8rem;
666
+ width: min(720px, 92vw);
667
+ padding: 0.9rem 1.2rem;
668
+ background: var(--bg-elevated);
669
+ border: 1px solid var(--dim-2);
670
+ opacity: 0;
671
+ transform: translateY(8px);
672
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
673
+ }
674
+ .tip.in { opacity: 1; transform: translateY(0); }
675
+ .tip-icon {
676
+ font-size: clamp(1.4rem, 2vw, 1.8rem);
677
+ flex: 0 0 auto;
678
+ }
679
+ .tip-body {
680
+ margin: 0;
681
+ font-size: clamp(0.95rem, 1.25vw, 1.15rem);
682
+ color: var(--fg);
683
+ line-height: 1.4;
684
+ }
685
+ .tip--info { border-color: rgba(24, 158, 255, 0.4); }
686
+ .tip--info .tip-icon { color: var(--blue); }
687
+ .tip--tip { border-color: rgba(0, 255, 156, 0.35); }
688
+ .tip--tip .tip-icon { color: var(--accent); }
689
+ .tip--warning { border-color: rgba(255, 180, 84, 0.4); }
690
+ .tip--warning .tip-icon { color: var(--amber); }
691
+ .tip--danger { border-color: rgba(255, 92, 92, 0.4); }
692
+ .tip--danger .tip-icon { color: var(--red); }
693
+ .tip--success {
694
+ border-color: var(--accent);
695
+ background: linear-gradient(135deg, var(--accent-soft), transparent 60%), var(--bg-elevated);
696
+ }
697
+ .tip--success .tip-icon { color: var(--accent); text-shadow: 0 0 14px var(--accent-glow); }
698
+
699
+ /* ---------------------------------------------------------------------------
700
+ * BeforeAfter
701
+ * ------------------------------------------------------------------------- */
702
+ .before-after--text {
703
+ display: grid;
704
+ grid-template-columns: 1fr auto 1fr;
705
+ align-items: stretch;
706
+ gap: clamp(1rem, 2vw, 2rem);
707
+ width: min(1200px, 94vw);
708
+ }
709
+ .ba-col {
710
+ display: flex;
711
+ flex-direction: column;
712
+ gap: 0.8rem;
713
+ padding: clamp(1.3rem, 2.5vw, 2rem);
714
+ background: var(--bg-elevated);
715
+ border: 1px solid var(--dim-2);
716
+ opacity: 0;
717
+ transform: translateY(14px);
718
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
719
+ }
720
+ .ba-col.in { opacity: 1; transform: translateY(0); }
721
+ .ba-col.ba-after { border-color: rgba(0, 255, 156, 0.3); }
722
+ .ba-col-tag {
723
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
724
+ letter-spacing: 0.18em;
725
+ text-transform: uppercase;
726
+ color: var(--dim);
727
+ }
728
+ .ba-col-tag--accent { color: var(--accent); }
729
+ .ba-col-text {
730
+ font-size: clamp(1.05rem, 1.6vw, 1.45rem);
731
+ color: var(--fg);
732
+ line-height: 1.4;
733
+ letter-spacing: -0.01em;
734
+ }
735
+ .ba-after .ba-col-text { color: var(--fg); }
736
+ .ba-arrow {
737
+ align-self: center;
738
+ font-size: clamp(2rem, 3.5vw, 2.8rem);
739
+ color: var(--accent);
740
+ text-shadow: 0 0 22px var(--accent-glow);
741
+ opacity: 0;
742
+ transform: translateX(-10px);
743
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
744
+ }
745
+ .ba-arrow.in { opacity: 1; transform: translateX(0); }
746
+
747
+ .before-after--image {
748
+ position: relative;
749
+ width: min(1200px, 94vw);
750
+ aspect-ratio: 16 / 9;
751
+ background: var(--bg-elevated);
752
+ border: 1px solid var(--dim-2);
753
+ overflow: hidden;
754
+ }
755
+ .before-after--image .ba-pane {
756
+ position: absolute;
757
+ inset: 0;
758
+ opacity: 0;
759
+ transition: opacity 700ms ease-out;
760
+ }
761
+ .before-after--image .ba-pane.in { opacity: 1; }
762
+ .before-after--image .ba-img {
763
+ width: 100%;
764
+ height: 100%;
765
+ object-fit: cover;
766
+ display: block;
767
+ filter: saturate(0.9) contrast(1.05);
768
+ }
769
+ .before-after--image .ba-before { z-index: 1; }
770
+ .before-after--image .ba-after {
771
+ z-index: 2;
772
+ clip-path: polygon(0 0, var(--ba-clip, 0%) 0, calc(var(--ba-clip, 0%) + 4%) 100%, 0 100%);
773
+ transition: opacity 700ms ease-out, clip-path 1200ms cubic-bezier(0.16, 1, 0.3, 1);
774
+ }
775
+ .before-after--image .ba-after .ba-img { filter: saturate(1.05) contrast(1.08); }
776
+ .ba-label {
777
+ position: absolute;
778
+ bottom: 1rem;
779
+ padding: 0.4rem 0.8rem;
780
+ z-index: 3;
781
+ }
782
+ .ba-label--left { left: 1rem; }
783
+ .ba-label--right { right: 1rem; }
784
+ .ba-tag {
785
+ display: inline-block;
786
+ padding: 0.35rem 0.7rem;
787
+ background: rgba(10, 10, 10, 0.7);
788
+ border: 1px solid var(--dim-2);
789
+ color: var(--fg);
790
+ font-size: clamp(0.75rem, 1vw, 0.9rem);
791
+ letter-spacing: 0.15em;
792
+ text-transform: uppercase;
793
+ backdrop-filter: blur(4px);
794
+ }
795
+ .ba-tag--accent {
796
+ color: var(--accent);
797
+ border-color: var(--accent);
798
+ box-shadow: 0 0 18px -4px var(--accent-glow);
799
+ }
800
+ .before-after--image .ba-divider {
801
+ position: absolute;
802
+ top: 0;
803
+ bottom: 0;
804
+ left: var(--ba-clip, 0%);
805
+ width: 2px;
806
+ background: var(--accent);
807
+ box-shadow: 0 0 18px var(--accent-glow);
808
+ transform: skewX(-6deg);
809
+ z-index: 4;
810
+ pointer-events: none;
811
+ transition: left 1200ms cubic-bezier(0.16, 1, 0.3, 1);
812
+ }
813
+
814
+ @media (max-width: 800px) {
815
+ .before-after--text { grid-template-columns: 1fr; }
816
+ .ba-arrow { transform: rotate(90deg); justify-self: center; }
817
+ .ba-arrow.in { transform: rotate(90deg); }
818
+ }