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,4443 @@
1
+ /* Stagecraft theme bundle: phosphor — generated by scripts/bundle.js. */
2
+ /* === themes/phosphor/tokens.css === */
3
+ /* Stagecraft — Phosphor theme tokens */
4
+ :root[data-theme="phosphor"] {
5
+ --bg: #0A0A0A;
6
+ --bg-elevated: #121212;
7
+ --fg: #E6E6E6;
8
+ --dim: #666666;
9
+ --dim-2: #2a2a2a;
10
+ --accent: #00FF9C; /* phosphor green */
11
+ --accent-soft: rgba(0, 255, 156, 0.12);
12
+ --accent-glow: rgba(0, 255, 156, 0.45);
13
+ --blue: #189EFF; /* alt accent */
14
+ --amber: #FFB454;
15
+ --red: #FF5C5C;
16
+ --mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
17
+ --display: var(--mono);
18
+ --body: var(--mono);
19
+ }
20
+
21
+ /* === themes/phosphor/base.css === */
22
+ /* Stagecraft — Phosphor theme: engine + base styles. */
23
+
24
+ * { box-sizing: border-box; margin: 0; padding: 0; }
25
+
26
+ html, body {
27
+ height: 100%;
28
+ background: var(--bg);
29
+ color: var(--fg);
30
+ font-family: var(--body);
31
+ font-weight: 400;
32
+ -webkit-font-smoothing: antialiased;
33
+ -moz-osx-font-smoothing: grayscale;
34
+ overflow: hidden;
35
+ }
36
+
37
+ body.idle { cursor: none; }
38
+
39
+ /* subtle ambient gradient */
40
+ body::before {
41
+ content: '';
42
+ position: fixed;
43
+ inset: 0;
44
+ background: radial-gradient(ellipse at center, rgba(255,255,255,0.025) 0%, transparent 60%);
45
+ pointer-events: none;
46
+ z-index: 0;
47
+ }
48
+
49
+ /* film grain */
50
+ body::after {
51
+ content: '';
52
+ position: fixed;
53
+ inset: 0;
54
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.06 0'/></filter><rect width='200' height='200' filter='url(%23n)'/></svg>");
55
+ pointer-events: none;
56
+ z-index: 1000;
57
+ mix-blend-mode: overlay;
58
+ opacity: 0.6;
59
+ }
60
+
61
+ #stage {
62
+ position: fixed;
63
+ inset: 0;
64
+ z-index: 1;
65
+ }
66
+
67
+ .slide {
68
+ position: absolute;
69
+ inset: 0;
70
+ display: flex;
71
+ flex-direction: column;
72
+ align-items: center;
73
+ justify-content: center;
74
+ padding: clamp(2rem, 6vw, 6rem);
75
+ opacity: 0;
76
+ pointer-events: none;
77
+ }
78
+ .slide.current { opacity: 1; pointer-events: auto; }
79
+
80
+ /* ---------- Typography ---------- */
81
+ .hero {
82
+ font-size: clamp(2.5rem, 7vw, 6.5rem);
83
+ font-weight: 500;
84
+ line-height: 1.05;
85
+ letter-spacing: -0.025em;
86
+ max-width: 22ch;
87
+ text-align: center;
88
+ }
89
+ .hero-xl {
90
+ font-size: clamp(3rem, 9vw, 8rem);
91
+ font-weight: 500;
92
+ line-height: 1.0;
93
+ letter-spacing: -0.03em;
94
+ max-width: 18ch;
95
+ text-align: center;
96
+ }
97
+ .pre-label {
98
+ font-size: 0.85rem;
99
+ font-weight: 400;
100
+ letter-spacing: 0.25em;
101
+ text-transform: uppercase;
102
+ color: var(--dim);
103
+ margin-bottom: 2.5rem;
104
+ }
105
+ .pre-label .dot {
106
+ display: inline-block;
107
+ width: 7px;
108
+ height: 7px;
109
+ background: var(--accent);
110
+ margin-right: 0.7rem;
111
+ vertical-align: middle;
112
+ animation: pulse 2s ease-in-out infinite;
113
+ }
114
+ .pre-label.blue .dot { background: var(--blue); }
115
+
116
+ .sub {
117
+ margin-top: 2.5rem;
118
+ font-size: clamp(0.95rem, 1.3vw, 1.2rem);
119
+ color: var(--dim);
120
+ letter-spacing: 0.02em;
121
+ text-align: center;
122
+ }
123
+ .sub strong { color: var(--fg); font-weight: 500; }
124
+
125
+ .accent { color: var(--accent); }
126
+ .accent-blue { color: var(--blue); }
127
+ .dim { color: var(--dim); }
128
+
129
+ /* Caret */
130
+ .caret {
131
+ display: inline-block;
132
+ width: 0.55em;
133
+ height: 1em;
134
+ background: var(--accent);
135
+ margin-left: 0.15em;
136
+ vertical-align: -0.12em;
137
+ animation: blink 1.1s steps(2, end) infinite;
138
+ box-shadow: 0 0 12px var(--accent-glow);
139
+ }
140
+ @keyframes blink { 50% { opacity: 0; } }
141
+ @keyframes pulse { 50% { opacity: 0.4; } }
142
+
143
+ /* ---------- Chrome ---------- */
144
+ .ui {
145
+ position: fixed;
146
+ inset: 0;
147
+ pointer-events: none;
148
+ z-index: 100;
149
+ font-size: 0.72rem;
150
+ letter-spacing: 0.18em;
151
+ text-transform: uppercase;
152
+ color: var(--dim);
153
+ font-family: var(--mono);
154
+ }
155
+ .ui-brand { position: absolute; top: 1.8rem; left: 2.2rem; }
156
+ .ui-brand .br-accent { color: var(--fg); font-weight: 500; }
157
+ .ui-title {
158
+ position: absolute;
159
+ top: 1.8rem; right: 2.2rem;
160
+ text-align: right;
161
+ max-width: 40ch;
162
+ }
163
+ .ui-counter {
164
+ position: absolute;
165
+ bottom: 1.8rem; left: 2.2rem;
166
+ color: var(--fg);
167
+ font-weight: 500;
168
+ }
169
+ .ui-counter .slash { color: var(--dim); margin: 0 0.4em; }
170
+ .ui-counter .total { color: var(--dim); }
171
+ .ui-dots {
172
+ position: absolute;
173
+ bottom: 1.8rem; right: 2.2rem;
174
+ display: flex;
175
+ gap: 0.7rem;
176
+ align-items: center;
177
+ }
178
+ .ui-dots .dot {
179
+ width: 6px; height: 6px;
180
+ background: var(--dim-2);
181
+ transition: background 300ms, box-shadow 300ms, transform 300ms;
182
+ }
183
+ .ui-dots .dot.active {
184
+ background: var(--accent);
185
+ box-shadow: 0 0 10px var(--accent-glow);
186
+ transform: scale(1.15);
187
+ }
188
+ .ui-dots .dot.past { background: var(--dim); }
189
+
190
+ .ui-hint {
191
+ position: absolute;
192
+ bottom: 1.8rem;
193
+ left: 50%;
194
+ transform: translateX(-50%);
195
+ font-size: 0.68rem;
196
+ letter-spacing: 0.25em;
197
+ color: var(--dim-2);
198
+ opacity: 0;
199
+ transition: opacity 300ms;
200
+ }
201
+ .ui-hint.visible { opacity: 1; }
202
+
203
+ .ui-brand, .ui-title, .ui-counter, .ui-dots {
204
+ opacity: 0;
205
+ transition: opacity 700ms ease-out;
206
+ }
207
+ body.armed .ui-brand,
208
+ body.armed .ui-title,
209
+ body.armed .ui-counter,
210
+ body.armed .ui-dots { opacity: 1; }
211
+
212
+ /* ---------- Welcome ---------- */
213
+ .welcome {
214
+ position: fixed;
215
+ inset: 0;
216
+ background: var(--bg);
217
+ z-index: 200;
218
+ display: flex;
219
+ flex-direction: column;
220
+ align-items: center;
221
+ justify-content: center;
222
+ transition: opacity 500ms ease-out;
223
+ }
224
+ .welcome.hidden { opacity: 0; pointer-events: none; }
225
+ .welcome .key-prompt {
226
+ font-size: 0.85rem;
227
+ letter-spacing: 0.3em;
228
+ text-transform: uppercase;
229
+ color: var(--dim);
230
+ margin-bottom: 1rem;
231
+ }
232
+ .welcome .key-prompt .accent { color: var(--accent); }
233
+ .welcome h1 {
234
+ font-size: clamp(1.2rem, 2vw, 1.6rem);
235
+ font-weight: 400;
236
+ letter-spacing: -0.01em;
237
+ color: var(--fg);
238
+ margin-bottom: 0.4rem;
239
+ }
240
+ .welcome .by {
241
+ font-size: 0.85rem;
242
+ color: var(--dim);
243
+ letter-spacing: 0.15em;
244
+ }
245
+
246
+ /* ---------- Stagger ---------- */
247
+ .stagger > * {
248
+ opacity: 0;
249
+ transform: translateY(12px);
250
+ transition: opacity 700ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
251
+ }
252
+ .stagger > *.in { opacity: 1; transform: translateY(0); }
253
+
254
+ /* ---------- Storyboard ---------- */
255
+ .overview {
256
+ position: fixed;
257
+ inset: 0;
258
+ background: var(--bg);
259
+ z-index: 300;
260
+ overflow-y: auto;
261
+ overflow-x: hidden;
262
+ opacity: 0;
263
+ transition: opacity 250ms ease-out;
264
+ padding: 5rem 2rem 2rem;
265
+ }
266
+ .overview.in { opacity: 1; }
267
+ .overview-header {
268
+ position: fixed;
269
+ top: 0; left: 0; right: 0;
270
+ padding: 1.3rem 2rem;
271
+ background: rgba(10,10,10,0.88);
272
+ backdrop-filter: blur(10px);
273
+ -webkit-backdrop-filter: blur(10px);
274
+ border-bottom: 1px solid var(--dim-2);
275
+ z-index: 310;
276
+ display: flex;
277
+ justify-content: space-between;
278
+ align-items: baseline;
279
+ font-size: 0.72rem;
280
+ letter-spacing: 0.25em;
281
+ text-transform: uppercase;
282
+ color: var(--dim);
283
+ font-family: var(--mono);
284
+ }
285
+ .overview-header .left strong { color: var(--fg); font-weight: 500; }
286
+ .overview-header .accent { color: var(--accent); }
287
+ .overview-grid {
288
+ display: grid;
289
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
290
+ gap: 1.2rem;
291
+ max-width: 1700px;
292
+ margin: 0 auto;
293
+ }
294
+ .tile {
295
+ position: relative;
296
+ overflow: hidden;
297
+ background: var(--bg);
298
+ border: 1px solid var(--dim-2);
299
+ cursor: pointer;
300
+ transition: border-color 200ms ease-out, transform 200ms ease-out, box-shadow 200ms ease-out;
301
+ }
302
+ .tile:hover { border-color: var(--accent); transform: translateY(-3px); }
303
+ .tile.current {
304
+ border-color: var(--accent);
305
+ box-shadow: 0 0 0 1px var(--accent), 0 0 28px var(--accent-glow);
306
+ }
307
+ .tile-scaler {
308
+ position: absolute;
309
+ top: 0; left: 0;
310
+ transform-origin: top left;
311
+ pointer-events: none;
312
+ }
313
+ .tile-scaler > .slide {
314
+ position: absolute !important;
315
+ inset: 0 !important;
316
+ opacity: 1 !important;
317
+ transform: none !important;
318
+ transition: none !important;
319
+ }
320
+ .tile-num {
321
+ position: absolute;
322
+ top: 0.5rem; left: 0.7rem;
323
+ font-size: 0.65rem;
324
+ color: var(--dim);
325
+ letter-spacing: 0.25em;
326
+ z-index: 4;
327
+ font-weight: 500;
328
+ background: rgba(10,10,10,0.7);
329
+ padding: 0.2rem 0.5rem;
330
+ font-family: var(--mono);
331
+ }
332
+ .tile.current .tile-num { color: var(--accent); }
333
+ .tile-label {
334
+ position: absolute;
335
+ bottom: 0; left: 0; right: 0;
336
+ background: linear-gradient(to top, rgba(10,10,10,0.95) 40%, rgba(10,10,10,0));
337
+ color: var(--fg);
338
+ font-size: 0.68rem;
339
+ letter-spacing: 0.18em;
340
+ text-transform: uppercase;
341
+ padding: 1.6rem 0.8rem 0.6rem;
342
+ z-index: 4;
343
+ pointer-events: none;
344
+ font-family: var(--mono);
345
+ }
346
+
347
+ /* responsive */
348
+ @media (max-width: 700px) {
349
+ .ui-hint { display: none; }
350
+ }
351
+
352
+ /* a11y */
353
+ @media (prefers-reduced-motion: reduce) {
354
+ *, *::before, *::after {
355
+ animation-duration: 0.001ms !important;
356
+ transition-duration: 0.001ms !important;
357
+ }
358
+ }
359
+
360
+ /* Material Symbols Outlined — for components that want icons */
361
+ .material-symbols-outlined {
362
+ font-family: 'Material Symbols Outlined';
363
+ font-weight: normal;
364
+ font-style: normal;
365
+ line-height: 1;
366
+ letter-spacing: normal;
367
+ text-transform: none;
368
+ display: inline-block;
369
+ white-space: nowrap;
370
+ word-wrap: normal;
371
+ direction: ltr;
372
+ font-feature-settings: 'liga';
373
+ -webkit-font-feature-settings: 'liga';
374
+ -webkit-font-smoothing: antialiased;
375
+ font-variation-settings: 'opsz' 24, 'wght' 400, 'FILL' 0, 'GRAD' 0;
376
+ }
377
+
378
+ /* Edit-mode body marker (subtle ring) */
379
+ body.edit-mode #stage::after {
380
+ content: '';
381
+ position: fixed;
382
+ inset: 0;
383
+ border: 2px solid var(--accent);
384
+ pointer-events: none;
385
+ z-index: 99;
386
+ box-shadow: inset 0 0 30px var(--accent-soft);
387
+ opacity: 0.3;
388
+ }
389
+
390
+ /* ----------------------------------------------------------------------------
391
+ * Presenter view (multi-monitor / second window)
392
+ *
393
+ * Activated via ?mode=presenter on the URL. The engine builds a different
394
+ * chrome and renders the current slide into a half-screen pane plus a
395
+ * thumbnail of the next slide, a notes panel, and a timer. This window
396
+ * is intended to live on the laptop while the main window goes on the beamer.
397
+ * -------------------------------------------------------------------------- */
398
+ body.presenter-mode {
399
+ overflow: auto;
400
+ background: var(--bg);
401
+ }
402
+ body.presenter-mode::before,
403
+ body.presenter-mode::after { display: none; } /* no film grain / ambient gradient */
404
+
405
+ .presenter-shell {
406
+ display: grid;
407
+ grid-template-rows: 1fr auto auto;
408
+ height: 100vh;
409
+ gap: 0.5rem;
410
+ padding: 0.7rem;
411
+ }
412
+ .presenter-top {
413
+ display: grid;
414
+ grid-template-columns: 1.55fr 1fr;
415
+ gap: 0.7rem;
416
+ min-height: 0; /* allow children to overflow:hidden */
417
+ }
418
+ .presenter-pane {
419
+ position: relative;
420
+ background: var(--bg-elevated);
421
+ border: 1px solid var(--dim-2);
422
+ overflow: hidden;
423
+ }
424
+ .presenter-pane-label {
425
+ position: absolute;
426
+ top: 0.5rem; left: 0.6rem;
427
+ z-index: 10;
428
+ font-size: 0.65rem;
429
+ letter-spacing: 0.2em;
430
+ text-transform: uppercase;
431
+ color: var(--dim);
432
+ font-family: var(--mono);
433
+ background: rgba(10, 10, 10, 0.75);
434
+ padding: 0.15rem 0.45rem;
435
+ }
436
+ .presenter-current .presenter-pane-label {
437
+ color: var(--accent);
438
+ }
439
+ .presenter-pane-stage {
440
+ position: absolute;
441
+ inset: 0;
442
+ overflow: hidden;
443
+ }
444
+ /* Slides rendered into a presenter pane need to be size-constrained to the
445
+ * pane (not viewport). They retain their original layout via flex centering
446
+ * and clamp() typography. */
447
+ .presenter-pane .slide {
448
+ position: absolute !important;
449
+ inset: 0 !important;
450
+ opacity: 1 !important;
451
+ transform: none !important;
452
+ transition: none !important;
453
+ pointer-events: none;
454
+ }
455
+ .presenter-end {
456
+ position: absolute;
457
+ inset: 0;
458
+ display: flex;
459
+ align-items: center;
460
+ justify-content: center;
461
+ color: var(--dim);
462
+ letter-spacing: 0.25em;
463
+ text-transform: uppercase;
464
+ font-size: 0.9rem;
465
+ }
466
+
467
+ /* Meta strip: timer + clock + reset */
468
+ .presenter-meta {
469
+ display: grid;
470
+ grid-template-columns: auto 1fr auto;
471
+ align-items: center;
472
+ gap: 1.2rem;
473
+ padding: 0.6rem 1rem;
474
+ background: var(--bg-elevated);
475
+ border: 1px solid var(--dim-2);
476
+ font-family: var(--mono);
477
+ }
478
+ .presenter-timer {
479
+ font-size: clamp(1.4rem, 2.5vw, 2rem);
480
+ font-weight: 500;
481
+ color: var(--accent);
482
+ font-variant-numeric: tabular-nums;
483
+ letter-spacing: 0.04em;
484
+ }
485
+ .presenter-clock {
486
+ font-size: 0.9rem;
487
+ color: var(--dim);
488
+ letter-spacing: 0.15em;
489
+ text-align: right;
490
+ }
491
+ .presenter-timer-reset {
492
+ background: transparent;
493
+ color: var(--dim);
494
+ border: 1px solid var(--dim-2);
495
+ font-family: inherit;
496
+ font-size: 0.7rem;
497
+ letter-spacing: 0.18em;
498
+ text-transform: uppercase;
499
+ padding: 0.35rem 0.7rem;
500
+ cursor: pointer;
501
+ }
502
+ .presenter-timer-reset:hover {
503
+ color: var(--accent);
504
+ border-color: var(--accent);
505
+ }
506
+
507
+ /* Notes panel */
508
+ .presenter-notes {
509
+ background: var(--bg-elevated);
510
+ border: 1px solid var(--dim-2);
511
+ padding: 0.8rem 1rem;
512
+ max-height: 30vh;
513
+ overflow-y: auto;
514
+ }
515
+ .presenter-notes-label {
516
+ font-size: 0.65rem;
517
+ letter-spacing: 0.2em;
518
+ text-transform: uppercase;
519
+ color: var(--dim);
520
+ font-family: var(--mono);
521
+ margin-bottom: 0.5rem;
522
+ }
523
+ .presenter-notes-body {
524
+ font-size: clamp(0.95rem, 1.4vw, 1.15rem);
525
+ line-height: 1.5;
526
+ color: var(--fg);
527
+ white-space: pre-wrap;
528
+ }
529
+ .presenter-notes-body.empty {
530
+ color: var(--dim);
531
+ font-style: italic;
532
+ }
533
+
534
+ /* === themes/phosphor/components.css === */
535
+ /* Stagecraft — Phosphor theme: Layer-2 component styles. */
536
+
537
+ /* Component expansion (Phase 2): layout / diagram / chart families */
538
+ /* === inlined: themes/phosphor/components-layout.css === */
539
+ /* Stagecraft — Phosphor theme: layout components. */
540
+
541
+ /* ---------------------------------------------------------------------------
542
+ * ImageText
543
+ * ------------------------------------------------------------------------- */
544
+ .image-text {
545
+ display: grid;
546
+ grid-template-columns: 1fr 1fr;
547
+ gap: clamp(2rem, 5vw, 5rem);
548
+ align-items: center;
549
+ width: min(1400px, 94vw);
550
+ }
551
+ .image-text--right { grid-template-areas: 'text image'; }
552
+ .image-text--right .it-figure { grid-area: image; }
553
+ .image-text--right .it-text { grid-area: text; }
554
+ .image-text--left { grid-template-areas: 'image text'; }
555
+ .image-text--left .it-figure { grid-area: image; }
556
+ .image-text--left .it-text { grid-area: text; }
557
+
558
+ .it-figure {
559
+ position: relative;
560
+ margin: 0;
561
+ aspect-ratio: 4 / 5;
562
+ overflow: hidden;
563
+ background: var(--bg-elevated);
564
+ opacity: 0;
565
+ transform: translateX(-30px) scale(0.98);
566
+ transition: opacity 900ms ease-out, transform 1100ms cubic-bezier(0.16, 1, 0.3, 1);
567
+ }
568
+ .image-text--right .it-figure { transform: translateX(30px) scale(0.98); }
569
+ .it-figure.in { opacity: 1; transform: translateX(0) scale(1); }
570
+ .it-img {
571
+ width: 100%;
572
+ height: 100%;
573
+ object-fit: cover;
574
+ display: block;
575
+ filter: saturate(0.92) contrast(1.04);
576
+ }
577
+ .it-img-frame {
578
+ position: absolute;
579
+ inset: 0;
580
+ pointer-events: none;
581
+ box-shadow:
582
+ inset 0 0 0 1px var(--dim-2),
583
+ 0 0 0 1px var(--dim-2),
584
+ 0 30px 60px -20px rgba(0,0,0,0.6),
585
+ 0 0 60px -10px var(--accent-glow);
586
+ }
587
+
588
+ .it-text {
589
+ display: flex;
590
+ flex-direction: column;
591
+ gap: clamp(0.8rem, 1.5vw, 1.4rem);
592
+ }
593
+ .it-heading {
594
+ margin: 0;
595
+ font-size: clamp(2.5rem, 5.5vw, 4rem);
596
+ font-weight: 500;
597
+ letter-spacing: -0.03em;
598
+ line-height: 1.05;
599
+ color: var(--fg);
600
+ opacity: 0;
601
+ transform: translateY(14px);
602
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
603
+ }
604
+ .it-heading.in { opacity: 1; transform: translateY(0); }
605
+ .it-body {
606
+ display: flex;
607
+ flex-direction: column;
608
+ gap: 0.4em;
609
+ }
610
+ .it-line {
611
+ font-size: clamp(1rem, 1.6vw, 1.4rem);
612
+ line-height: 1.5;
613
+ color: var(--fg);
614
+ opacity: 0;
615
+ transform: translateY(10px);
616
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
617
+ }
618
+ .it-line.in { opacity: 1; transform: translateY(0); }
619
+ .it-caption {
620
+ margin-top: 0.6rem;
621
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
622
+ color: var(--dim);
623
+ letter-spacing: 0.08em;
624
+ text-transform: uppercase;
625
+ opacity: 0;
626
+ transition: opacity 800ms ease-out;
627
+ }
628
+ .it-caption.in { opacity: 1; }
629
+
630
+ @media (max-width: 800px) {
631
+ .image-text, .image-text--left, .image-text--right {
632
+ grid-template-columns: 1fr;
633
+ grid-template-areas: 'image' 'text';
634
+ }
635
+ .it-figure { aspect-ratio: 16 / 10; }
636
+ }
637
+
638
+ /* ---------------------------------------------------------------------------
639
+ * FullImage
640
+ * ------------------------------------------------------------------------- */
641
+ .full-image-host {
642
+ padding: 0 !important;
643
+ display: block !important;
644
+ width: 100vw;
645
+ height: 100vh;
646
+ position: relative;
647
+ }
648
+ .full-image {
649
+ position: absolute;
650
+ inset: 0;
651
+ overflow: hidden;
652
+ }
653
+ .fi-bg {
654
+ position: absolute;
655
+ inset: 0;
656
+ background-size: cover;
657
+ background-position: center;
658
+ background-repeat: no-repeat;
659
+ opacity: 0;
660
+ transform: scale(1.04);
661
+ transition: opacity 1200ms ease-out, transform 18s linear;
662
+ }
663
+ .fi-bg.in { opacity: 1; }
664
+ .fi-bg.drift { transform: scale(1.12) translate(-1%, 1%); }
665
+
666
+ .fi-overlay {
667
+ position: absolute;
668
+ inset: 0;
669
+ display: flex;
670
+ padding: clamp(2rem, 6vw, 5rem);
671
+ pointer-events: none;
672
+ z-index: 2;
673
+ }
674
+ .fi-overlay--center { align-items: center; justify-content: center; text-align: center; }
675
+ .fi-overlay--top { align-items: flex-start; justify-content: center; text-align: center; }
676
+ .fi-overlay--bottom-left { align-items: flex-end; justify-content: flex-start; }
677
+ .fi-overlay--bottom-right { align-items: flex-end; justify-content: flex-end; text-align: right; }
678
+
679
+ .fi-scrim {
680
+ position: absolute;
681
+ inset: 0;
682
+ pointer-events: none;
683
+ z-index: -1;
684
+ }
685
+ .fi-scrim--center { background: radial-gradient(ellipse at center, rgba(10,10,10,0.55) 0%, rgba(10,10,10,0.1) 70%); }
686
+ .fi-scrim--top { background: linear-gradient(180deg, rgba(10,10,10,0.75), transparent 50%); }
687
+ .fi-scrim--bottom-left { background: linear-gradient(45deg, rgba(10,10,10,0.85), transparent 60%); }
688
+ .fi-scrim--bottom-right { background: linear-gradient(315deg, rgba(10,10,10,0.85), transparent 60%); }
689
+
690
+ .fi-overlay-inner {
691
+ position: relative;
692
+ z-index: 1;
693
+ max-width: 32ch;
694
+ display: flex;
695
+ flex-direction: column;
696
+ gap: clamp(0.8rem, 1.5vw, 1.4rem);
697
+ }
698
+ .fi-overlay--center .fi-overlay-inner,
699
+ .fi-overlay--top .fi-overlay-inner { max-width: 28ch; }
700
+ .fi-headline {
701
+ font-size: clamp(2rem, 5vw, 4rem);
702
+ font-weight: 500;
703
+ letter-spacing: -0.03em;
704
+ line-height: 1.05;
705
+ color: var(--fg);
706
+ text-shadow: 0 2px 30px rgba(0,0,0,0.55);
707
+ opacity: 0;
708
+ transform: translateY(14px);
709
+ transition: opacity 800ms ease-out, transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
710
+ }
711
+ .fi-headline.in { opacity: 1; transform: translateY(0); }
712
+ .fi-body {
713
+ font-size: clamp(1rem, 1.4vw, 1.25rem);
714
+ color: var(--fg);
715
+ opacity: 0;
716
+ transform: translateY(8px);
717
+ transition: opacity 800ms ease-out, transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
718
+ }
719
+ .fi-body.in { opacity: 0.92; transform: translateY(0); }
720
+
721
+ /* ---------------------------------------------------------------------------
722
+ * Quote
723
+ * ------------------------------------------------------------------------- */
724
+ .quote {
725
+ position: relative;
726
+ text-align: center;
727
+ max-width: min(1100px, 92vw);
728
+ display: grid;
729
+ grid-template-columns: auto 1fr auto;
730
+ grid-template-rows: auto auto;
731
+ align-items: center;
732
+ column-gap: clamp(0.5rem, 1.5vw, 1.5rem);
733
+ row-gap: clamp(1.5rem, 4vw, 3rem);
734
+ }
735
+ .q-mark {
736
+ font-size: clamp(4rem, 9vw, 8rem);
737
+ line-height: 0.8;
738
+ color: var(--accent);
739
+ text-shadow: 0 0 30px var(--accent-glow);
740
+ opacity: 0;
741
+ transform: scale(0.6);
742
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.34, 1.56, 0.64, 1);
743
+ align-self: start;
744
+ user-select: none;
745
+ }
746
+ .q-mark.in { opacity: 1; transform: scale(1); }
747
+ .q-mark--open { padding-top: 0.2em; }
748
+ .q-mark--close { padding-top: 0.2em; align-self: end; }
749
+
750
+ .q-text {
751
+ margin: 0;
752
+ font-style: italic;
753
+ font-size: clamp(1.8rem, 4vw, 3rem);
754
+ font-weight: 400;
755
+ line-height: 1.25;
756
+ letter-spacing: -0.015em;
757
+ color: var(--fg);
758
+ opacity: 0;
759
+ transform: translateY(12px);
760
+ transition: opacity 900ms ease-out, transform 1000ms cubic-bezier(0.16, 1, 0.3, 1);
761
+ grid-column: 2;
762
+ }
763
+ .q-text.in { opacity: 1; transform: translateY(0); }
764
+
765
+ .q-meta {
766
+ grid-column: 1 / -1;
767
+ display: flex;
768
+ flex-wrap: wrap;
769
+ justify-content: center;
770
+ align-items: baseline;
771
+ gap: 0.6rem;
772
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
773
+ letter-spacing: 0.04em;
774
+ opacity: 0;
775
+ transform: translateY(8px);
776
+ transition: opacity 800ms ease-out, transform 900ms ease-out;
777
+ }
778
+ .q-meta.in { opacity: 1; transform: translateY(0); }
779
+ .q-author { color: var(--fg); font-weight: 500; }
780
+ .q-role,
781
+ .q-source { color: var(--dim); }
782
+ .q-sep { color: var(--dim-2); }
783
+
784
+ /* ---------------------------------------------------------------------------
785
+ * BigNumber
786
+ * ------------------------------------------------------------------------- */
787
+ .big-number {
788
+ text-align: center;
789
+ display: flex;
790
+ flex-direction: column;
791
+ align-items: center;
792
+ gap: clamp(0.8rem, 1.6vw, 1.4rem);
793
+ }
794
+ .bn-figure {
795
+ display: inline-flex;
796
+ align-items: baseline;
797
+ gap: 0.05em;
798
+ line-height: 0.9;
799
+ }
800
+ .bn-num {
801
+ font-size: clamp(6rem, 18vw, 14rem);
802
+ font-weight: 500;
803
+ letter-spacing: -0.05em;
804
+ color: var(--accent);
805
+ font-variant-numeric: tabular-nums;
806
+ text-shadow: 0 0 60px var(--accent-glow);
807
+ line-height: 1;
808
+ }
809
+ .bn-unit {
810
+ font-size: clamp(2.5rem, 7vw, 5.5rem);
811
+ font-weight: 400;
812
+ letter-spacing: -0.03em;
813
+ color: var(--dim);
814
+ margin-left: 0.1em;
815
+ opacity: 0;
816
+ transform: translateX(-6px);
817
+ transition: opacity 600ms ease-out, transform 700ms ease-out;
818
+ }
819
+ .bn-unit.in { opacity: 1; transform: translateX(0); }
820
+ .bn-label {
821
+ font-size: clamp(1.5rem, 2.5vw, 2rem);
822
+ color: var(--fg);
823
+ letter-spacing: -0.01em;
824
+ max-width: 24ch;
825
+ opacity: 0;
826
+ transform: translateY(10px);
827
+ transition: opacity 700ms ease-out, transform 800ms ease-out;
828
+ }
829
+ .bn-label.in { opacity: 1; transform: translateY(0); }
830
+ .bn-caption {
831
+ margin-top: 0.6rem;
832
+ font-size: clamp(0.9rem, 1.2vw, 1.1rem);
833
+ color: var(--dim);
834
+ letter-spacing: 0.06em;
835
+ text-transform: uppercase;
836
+ opacity: 0;
837
+ transition: opacity 800ms ease-out;
838
+ }
839
+ .bn-caption.in { opacity: 1; }
840
+
841
+ /* ---------------------------------------------------------------------------
842
+ * Stats
843
+ * ------------------------------------------------------------------------- */
844
+ .stats {
845
+ display: grid;
846
+ gap: clamp(1.5rem, 3vw, 2.5rem);
847
+ width: min(1300px, 94vw);
848
+ }
849
+ .stats--cols-1 { grid-template-columns: 1fr; }
850
+ .stats--cols-2 { grid-template-columns: repeat(2, 1fr); }
851
+ .stats--cols-3 { grid-template-columns: repeat(3, 1fr); }
852
+ .stats--cols-4 { grid-template-columns: repeat(4, 1fr); }
853
+
854
+ .stat {
855
+ display: flex;
856
+ flex-direction: column;
857
+ gap: 0.6rem;
858
+ padding: clamp(1.2rem, 2.5vw, 2rem);
859
+ border: 1px solid var(--dim-2);
860
+ background: var(--bg-elevated);
861
+ position: relative;
862
+ opacity: 0;
863
+ transform: translateY(14px);
864
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 600ms ease;
865
+ }
866
+ .stat.in { opacity: 1; transform: translateY(0); }
867
+ .stat::before {
868
+ content: '';
869
+ position: absolute;
870
+ top: 0; left: 0;
871
+ width: 100%;
872
+ height: 2px;
873
+ background: var(--dim-2);
874
+ transition: background 600ms ease;
875
+ }
876
+ .stat--accent::before { background: var(--accent); box-shadow: 0 0 14px var(--accent-glow); }
877
+ .stat--amber::before { background: var(--amber); }
878
+ .stat--blue::before { background: var(--blue); }
879
+ .stat--red::before { background: var(--red); }
880
+
881
+ .stat-figure {
882
+ display: flex;
883
+ align-items: baseline;
884
+ gap: 0.05em;
885
+ }
886
+ .stat-num {
887
+ font-size: clamp(2.8rem, 6vw, 5rem);
888
+ font-weight: 500;
889
+ letter-spacing: -0.04em;
890
+ color: var(--fg);
891
+ font-variant-numeric: tabular-nums;
892
+ line-height: 1;
893
+ }
894
+ .stat-unit {
895
+ font-size: clamp(1.4rem, 2.5vw, 2.2rem);
896
+ color: var(--dim);
897
+ margin-left: 0.1em;
898
+ }
899
+ .stat--accent .stat-num { color: var(--accent); text-shadow: 0 0 20px var(--accent-glow); }
900
+ .stat--amber .stat-num { color: var(--amber); }
901
+ .stat--blue .stat-num { color: var(--blue); }
902
+ .stat--red .stat-num { color: var(--red); }
903
+
904
+ .stat-label {
905
+ font-size: clamp(0.9rem, 1.25vw, 1.1rem);
906
+ color: var(--dim);
907
+ letter-spacing: 0.04em;
908
+ line-height: 1.35;
909
+ margin-top: 0.4rem;
910
+ }
911
+
912
+ @media (max-width: 800px) {
913
+ .stats--cols-3, .stats--cols-4 { grid-template-columns: repeat(2, 1fr); }
914
+ }
915
+ @media (max-width: 480px) {
916
+ .stats--cols-2, .stats--cols-3, .stats--cols-4 { grid-template-columns: 1fr; }
917
+ }
918
+
919
+ /* ---------------------------------------------------------------------------
920
+ * Bento
921
+ * ------------------------------------------------------------------------- */
922
+ .bento {
923
+ display: grid;
924
+ grid-template-columns: repeat(4, 1fr);
925
+ grid-auto-rows: minmax(clamp(8rem, 18vh, 14rem), auto);
926
+ gap: clamp(0.8rem, 1.5vw, 1.4rem);
927
+ width: min(1400px, 94vw);
928
+ }
929
+ .bento-cell {
930
+ position: relative;
931
+ display: flex;
932
+ flex-direction: column;
933
+ justify-content: flex-end;
934
+ padding: clamp(1.2rem, 2vw, 1.8rem);
935
+ background: var(--bg-elevated);
936
+ border: 1px solid var(--dim-2);
937
+ background-size: cover;
938
+ background-position: center;
939
+ overflow: hidden;
940
+ opacity: 0;
941
+ transform: translateY(16px) scale(0.985);
942
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 500ms ease;
943
+ }
944
+ .bento-cell.in { opacity: 1; transform: translateY(0) scale(1); }
945
+ .bento-cell--span-2 { grid-column: span 2; }
946
+
947
+ .bento-cell--accent { border-color: rgba(0, 255, 156, 0.35); box-shadow: 0 0 30px -8px var(--accent-glow); }
948
+ .bento-cell--accent .bento-heading { color: var(--accent); }
949
+ .bento-cell--amber { border-color: rgba(255, 180, 84, 0.4); }
950
+ .bento-cell--amber .bento-heading { color: var(--amber); }
951
+ .bento-cell--blue { border-color: rgba(24, 158, 255, 0.4); }
952
+ .bento-cell--blue .bento-heading { color: var(--blue); }
953
+
954
+ .bento-cell--image {
955
+ min-height: clamp(10rem, 22vh, 18rem);
956
+ color: var(--fg);
957
+ }
958
+ .bento-cell--image .bento-heading { color: var(--fg); text-shadow: 0 2px 18px rgba(0,0,0,0.6); }
959
+ .bento-cell--image .bento-body { color: var(--fg); opacity: 0.85; }
960
+
961
+ .bento-cell-body {
962
+ display: flex;
963
+ flex-direction: column;
964
+ gap: 0.4rem;
965
+ position: relative;
966
+ z-index: 1;
967
+ }
968
+ .bento-heading {
969
+ font-size: clamp(1.2rem, 2vw, 1.7rem);
970
+ font-weight: 500;
971
+ letter-spacing: -0.02em;
972
+ color: var(--fg);
973
+ line-height: 1.15;
974
+ }
975
+ .bento-body {
976
+ font-size: clamp(0.9rem, 1.15vw, 1.05rem);
977
+ color: var(--dim);
978
+ line-height: 1.4;
979
+ }
980
+
981
+ @media (max-width: 900px) {
982
+ .bento { grid-template-columns: repeat(2, 1fr); }
983
+ .bento-cell--span-2 { grid-column: span 2; }
984
+ }
985
+ @media (max-width: 540px) {
986
+ .bento { grid-template-columns: 1fr; }
987
+ .bento-cell--span-2 { grid-column: span 1; }
988
+ }
989
+
990
+ /* === inlined: themes/phosphor/components-diagram.css === */
991
+ /* Stagecraft — Phosphor theme: diagram component styles (Pillars, Timeline, Pyramid, Cycle, Funnel). */
992
+
993
+ /* Local component vars; theme tokens (--accent, --dim, etc.) flow through. */
994
+ :root[data-theme="phosphor"] {
995
+ --diag-ease: cubic-bezier(0.16, 1, 0.3, 1);
996
+ --diag-rise: 16px;
997
+ --diag-card-bg: rgba(255, 255, 255, 0.015);
998
+ --diag-card-border: var(--dim-2);
999
+ }
1000
+
1001
+ /* ===========================================================================
1002
+ * Pillars
1003
+ * ===========================================================================*/
1004
+ .pillars-wrap {
1005
+ display: flex;
1006
+ flex-direction: column;
1007
+ align-items: center;
1008
+ gap: clamp(1.4rem, 3vw, 2.4rem);
1009
+ width: min(1200px, 92vw);
1010
+ }
1011
+ .pillars-intro {
1012
+ font-size: clamp(0.95rem, 1.4vw, 1.25rem);
1013
+ color: var(--dim);
1014
+ letter-spacing: 0.04em;
1015
+ font-style: italic;
1016
+ text-align: center;
1017
+ max-width: 60ch;
1018
+ }
1019
+ .pillars-grid {
1020
+ display: grid;
1021
+ grid-template-columns: repeat(var(--pillars-count, 3), minmax(0, 1fr));
1022
+ gap: clamp(1rem, 3vw, 2.6rem);
1023
+ width: 100%;
1024
+ }
1025
+ .pillar {
1026
+ display: flex;
1027
+ flex-direction: column;
1028
+ align-items: center;
1029
+ text-align: center;
1030
+ gap: clamp(0.6rem, 1.2vw, 1rem);
1031
+ padding: clamp(1rem, 2vw, 1.6rem) clamp(0.6rem, 1.2vw, 1rem);
1032
+ opacity: 0;
1033
+ transform: translateY(var(--diag-rise));
1034
+ transition: opacity 700ms ease-out, transform 700ms var(--diag-ease);
1035
+ }
1036
+ .pillar.in { opacity: 1; transform: translateY(0); }
1037
+ .pillar-icon {
1038
+ font-size: 3rem;
1039
+ line-height: 1;
1040
+ color: var(--accent);
1041
+ transition: transform 600ms var(--diag-ease), filter 600ms ease;
1042
+ }
1043
+ .pillar:hover .pillar-icon {
1044
+ animation: pillar-pulse 1600ms ease-in-out infinite;
1045
+ }
1046
+ @keyframes pillar-pulse {
1047
+ 0%, 100% { transform: scale(1); filter: drop-shadow(0 0 0 transparent); }
1048
+ 50% { transform: scale(1.08); filter: drop-shadow(0 0 14px var(--accent-glow)); }
1049
+ }
1050
+ .pillar-heading {
1051
+ font-size: clamp(1.4rem, 2.4vw, 2rem);
1052
+ font-weight: 500;
1053
+ letter-spacing: -0.02em;
1054
+ line-height: 1.15;
1055
+ color: var(--fg);
1056
+ }
1057
+ .pillar-body {
1058
+ font-size: 1rem;
1059
+ color: var(--dim);
1060
+ letter-spacing: 0.01em;
1061
+ max-width: 24ch;
1062
+ line-height: 1.5;
1063
+ }
1064
+ .pillar.pc-accent .pillar-icon { color: var(--accent); }
1065
+ .pillar.pc-blue .pillar-icon { color: var(--blue); }
1066
+ .pillar.pc-amber .pillar-icon { color: var(--amber); }
1067
+ .pillar.pc-red .pillar-icon { color: var(--red); }
1068
+ .pillar.pc-dim .pillar-icon { color: var(--dim); }
1069
+ .pillar.pc-fg .pillar-icon { color: var(--fg); }
1070
+ @media (max-width: 800px) {
1071
+ .pillars-grid { grid-template-columns: 1fr 1fr; }
1072
+ }
1073
+ @media (max-width: 520px) {
1074
+ .pillars-grid { grid-template-columns: 1fr; }
1075
+ }
1076
+
1077
+ /* ===========================================================================
1078
+ * Timeline
1079
+ * ===========================================================================*/
1080
+ .timeline {
1081
+ position: relative;
1082
+ width: min(1300px, 94vw);
1083
+ }
1084
+ .timeline-track {
1085
+ position: absolute;
1086
+ background: var(--dim-2);
1087
+ }
1088
+ .timeline-events { display: grid; }
1089
+
1090
+ /* Horizontal */
1091
+ .timeline--horizontal .timeline-track {
1092
+ left: 0;
1093
+ right: 0;
1094
+ top: 50%;
1095
+ height: 1px;
1096
+ transform: translateY(-0.5px);
1097
+ }
1098
+ .timeline--horizontal .timeline-events {
1099
+ grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
1100
+ grid-auto-flow: column;
1101
+ grid-auto-columns: minmax(0, 1fr);
1102
+ align-items: center;
1103
+ gap: clamp(0.6rem, 2vw, 1.6rem);
1104
+ padding: clamp(2rem, 4vw, 3rem) 0;
1105
+ }
1106
+ .timeline--horizontal .tl-event {
1107
+ display: grid;
1108
+ grid-template-rows: 1fr auto 1fr;
1109
+ align-items: center;
1110
+ justify-items: center;
1111
+ text-align: center;
1112
+ gap: clamp(0.6rem, 1.4vw, 1rem);
1113
+ opacity: 0;
1114
+ transform: translateY(8px);
1115
+ transition: opacity 600ms ease-out, transform 600ms var(--diag-ease);
1116
+ }
1117
+ .timeline--horizontal .tl-event.in { opacity: 1; transform: translateY(0); }
1118
+ .timeline--horizontal .tl-date { align-self: end; }
1119
+ .timeline--horizontal .tl-text { align-self: start; }
1120
+
1121
+ /* Vertical */
1122
+ .timeline--vertical .timeline-track {
1123
+ top: 0;
1124
+ bottom: 0;
1125
+ left: clamp(2rem, 6vw, 4rem);
1126
+ width: 1px;
1127
+ }
1128
+ .timeline--vertical .timeline-events {
1129
+ grid-template-columns: 1fr;
1130
+ gap: clamp(1.2rem, 2.5vw, 2rem);
1131
+ padding-left: clamp(0.5rem, 2vw, 1rem);
1132
+ }
1133
+ .timeline--vertical .tl-event {
1134
+ display: grid;
1135
+ grid-template-columns: clamp(4rem, 9vw, 6rem) auto 1fr;
1136
+ align-items: center;
1137
+ gap: clamp(0.8rem, 2vw, 1.4rem);
1138
+ opacity: 0;
1139
+ transform: translateX(-12px);
1140
+ transition: opacity 600ms ease-out, transform 600ms var(--diag-ease);
1141
+ }
1142
+ .timeline--vertical .tl-event.in { opacity: 1; transform: translateX(0); }
1143
+ .timeline--vertical .tl-date { text-align: right; }
1144
+ .timeline--vertical .tl-text { text-align: left; }
1145
+
1146
+ /* Shared atoms */
1147
+ .tl-date {
1148
+ font-size: clamp(0.8rem, 1.1vw, 1rem);
1149
+ color: var(--dim);
1150
+ letter-spacing: 0.25em;
1151
+ font-variant-numeric: tabular-nums;
1152
+ text-transform: uppercase;
1153
+ }
1154
+ .tl-dot {
1155
+ width: clamp(0.9rem, 1.6vw, 1.3rem);
1156
+ height: clamp(0.9rem, 1.6vw, 1.3rem);
1157
+ border-radius: 50%;
1158
+ border: 1px solid var(--dim);
1159
+ background: var(--bg);
1160
+ position: relative;
1161
+ display: grid;
1162
+ place-items: center;
1163
+ z-index: 1;
1164
+ transition: background 400ms ease, border-color 400ms ease, box-shadow 400ms ease;
1165
+ }
1166
+ .tl-event.active .tl-dot {
1167
+ background: var(--accent);
1168
+ border-color: var(--accent);
1169
+ box-shadow: 0 0 0 4px var(--accent-soft);
1170
+ }
1171
+ .tl-icon {
1172
+ font-size: clamp(0.7rem, 1.1vw, 0.95rem);
1173
+ color: var(--bg);
1174
+ line-height: 1;
1175
+ }
1176
+ .tl-event:not(.active) .tl-icon { color: var(--dim); }
1177
+ .tl-heading {
1178
+ font-size: clamp(1.1rem, 1.9vw, 1.6rem);
1179
+ font-weight: 500;
1180
+ letter-spacing: -0.015em;
1181
+ color: var(--fg);
1182
+ line-height: 1.2;
1183
+ }
1184
+ .tl-body {
1185
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
1186
+ color: var(--dim);
1187
+ margin-top: 0.25rem;
1188
+ line-height: 1.4;
1189
+ }
1190
+ .tl-event.tc-accent.active .tl-dot { background: var(--accent); border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft); }
1191
+ .tl-event.tc-blue.active .tl-dot { background: var(--blue); border-color: var(--blue); box-shadow: 0 0 0 4px rgba(24, 158, 255, 0.18); }
1192
+ .tl-event.tc-amber.active .tl-dot { background: var(--amber); border-color: var(--amber); box-shadow: 0 0 0 4px rgba(255, 180, 84, 0.18); }
1193
+ .tl-event.tc-red.active .tl-dot { background: var(--red); border-color: var(--red); box-shadow: 0 0 0 4px rgba(255, 92, 92, 0.18); }
1194
+
1195
+ /* ===========================================================================
1196
+ * Pyramid
1197
+ * ===========================================================================*/
1198
+ .pyramid {
1199
+ display: flex;
1200
+ flex-direction: column;
1201
+ align-items: center;
1202
+ width: min(900px, 92vw);
1203
+ gap: 6px;
1204
+ }
1205
+ .pyr-layer {
1206
+ width: var(--pyr-w, 100%);
1207
+ display: flex;
1208
+ justify-content: center;
1209
+ opacity: 0;
1210
+ transform: translateY(8px) scaleX(0.92);
1211
+ transform-origin: center;
1212
+ transition: opacity 600ms ease-out, transform 700ms var(--diag-ease);
1213
+ }
1214
+ .pyr-layer.in { opacity: 1; transform: translateY(0) scaleX(1); }
1215
+ .pyr-shape {
1216
+ width: 100%;
1217
+ padding: clamp(0.9rem, 1.8vw, 1.4rem) clamp(1.2rem, 2.5vw, 2rem);
1218
+ background: var(--diag-card-bg);
1219
+ border: 1px solid var(--diag-card-border);
1220
+ /* Slight trapezoid feel: angled side cuts via clip-path. */
1221
+ clip-path: polygon(6% 0%, 94% 0%, 100% 100%, 0% 100%);
1222
+ }
1223
+ .pyramid--down .pyr-shape {
1224
+ clip-path: polygon(0% 0%, 100% 0%, 94% 100%, 6% 100%);
1225
+ }
1226
+ .pyr-content { text-align: center; }
1227
+ .pyr-label {
1228
+ font-size: clamp(1.1rem, 2.2vw, 1.8rem);
1229
+ font-weight: 500;
1230
+ letter-spacing: -0.015em;
1231
+ color: var(--fg);
1232
+ line-height: 1.15;
1233
+ }
1234
+ .pyr-body {
1235
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
1236
+ color: var(--dim);
1237
+ margin-top: 0.35rem;
1238
+ letter-spacing: 0.01em;
1239
+ }
1240
+ .pyr-layer.pyc-accent .pyr-shape { border-color: var(--accent); background: var(--accent-soft); }
1241
+ .pyr-layer.pyc-accent .pyr-label { color: var(--accent); }
1242
+ .pyr-layer.pyc-blue .pyr-shape { border-color: var(--blue); background: rgba(24, 158, 255, 0.10); }
1243
+ .pyr-layer.pyc-blue .pyr-label { color: var(--blue); }
1244
+ .pyr-layer.pyc-amber .pyr-shape { border-color: var(--amber); background: rgba(255, 180, 84, 0.10); }
1245
+ .pyr-layer.pyc-amber .pyr-label { color: var(--amber); }
1246
+ .pyr-layer.pyc-red .pyr-shape { border-color: var(--red); background: rgba(255, 92, 92, 0.10); }
1247
+ .pyr-layer.pyc-red .pyr-label { color: var(--red); }
1248
+ .pyr-layer.pyc-dim .pyr-shape { border-color: var(--dim-2); }
1249
+ .pyr-layer.pyc-dim .pyr-label { color: var(--dim); }
1250
+
1251
+ /* ===========================================================================
1252
+ * Cycle
1253
+ * ===========================================================================*/
1254
+ .cycle {
1255
+ display: flex;
1256
+ justify-content: center;
1257
+ width: min(720px, 80vmin);
1258
+ aspect-ratio: 1 / 1;
1259
+ }
1260
+ .cyc-frame {
1261
+ position: relative;
1262
+ width: 100%;
1263
+ height: 100%;
1264
+ transition: transform 1700ms var(--diag-ease);
1265
+ }
1266
+ .cyc-frame.rotating { animation: cyc-rotate-in 1700ms var(--diag-ease) both; }
1267
+ @keyframes cyc-rotate-in {
1268
+ from { transform: rotate(-360deg); }
1269
+ to { transform: rotate(0deg); }
1270
+ }
1271
+ .cyc-svg {
1272
+ position: absolute;
1273
+ inset: 0;
1274
+ width: 100%;
1275
+ height: 100%;
1276
+ overflow: visible;
1277
+ }
1278
+ .cyc-ring {
1279
+ fill: none;
1280
+ stroke: var(--dim-2);
1281
+ stroke-width: 1;
1282
+ stroke-dasharray: 3 5;
1283
+ opacity: 0.6;
1284
+ }
1285
+ .cyc-arc {
1286
+ fill: none;
1287
+ stroke: var(--accent);
1288
+ stroke-width: 2;
1289
+ stroke-linecap: round;
1290
+ opacity: 0;
1291
+ transition: opacity 600ms ease-out;
1292
+ }
1293
+ .cyc-arc.in { opacity: 0.85; }
1294
+ .cyc-arrow {
1295
+ fill: none;
1296
+ stroke: var(--accent);
1297
+ stroke-width: 2.5;
1298
+ stroke-linecap: round;
1299
+ stroke-linejoin: round;
1300
+ opacity: 0;
1301
+ transition: opacity 600ms ease-out;
1302
+ }
1303
+ .cyc-arrow.in { opacity: 1; }
1304
+ .cyc-items {
1305
+ position: absolute;
1306
+ inset: 0;
1307
+ }
1308
+ .cyc-item {
1309
+ position: absolute;
1310
+ transform: translate(-50%, -50%) scale(0.85);
1311
+ opacity: 0;
1312
+ display: flex;
1313
+ flex-direction: column;
1314
+ align-items: center;
1315
+ gap: 0.4rem;
1316
+ padding: clamp(0.6rem, 1.2vw, 0.9rem) clamp(0.8rem, 1.4vw, 1.1rem);
1317
+ background: var(--bg);
1318
+ border: 1px solid var(--dim-2);
1319
+ border-radius: 8px;
1320
+ min-width: clamp(5rem, 12vw, 8rem);
1321
+ text-align: center;
1322
+ transition: opacity 600ms ease-out, transform 700ms var(--diag-ease), border-color 400ms ease;
1323
+ }
1324
+ .cyc-item.in { opacity: 1; transform: translate(-50%, -50%) scale(1); }
1325
+ .cyc-icon {
1326
+ font-size: clamp(1.2rem, 2vw, 1.6rem);
1327
+ color: var(--accent);
1328
+ line-height: 1;
1329
+ }
1330
+ .cyc-label {
1331
+ font-size: clamp(0.85rem, 1.2vw, 1.05rem);
1332
+ font-weight: 500;
1333
+ letter-spacing: -0.01em;
1334
+ color: var(--fg);
1335
+ line-height: 1.2;
1336
+ }
1337
+ .cyc-item.cyc-accent { border-color: var(--accent); }
1338
+ .cyc-item.cyc-accent .cyc-icon { color: var(--accent); }
1339
+ .cyc-item.cyc-blue { border-color: var(--blue); }
1340
+ .cyc-item.cyc-blue .cyc-icon { color: var(--blue); }
1341
+ .cyc-item.cyc-amber { border-color: var(--amber); }
1342
+ .cyc-item.cyc-amber .cyc-icon { color: var(--amber); }
1343
+ .cyc-item.cyc-red { border-color: var(--red); }
1344
+ .cyc-item.cyc-red .cyc-icon { color: var(--red); }
1345
+
1346
+ /* ===========================================================================
1347
+ * Funnel
1348
+ * ===========================================================================*/
1349
+ .funnel {
1350
+ display: flex;
1351
+ flex-direction: column;
1352
+ align-items: stretch;
1353
+ width: min(820px, 88vw);
1354
+ gap: 4px;
1355
+ }
1356
+ .fn-stage {
1357
+ position: relative;
1358
+ min-height: clamp(3.6rem, 8vh, 5.4rem);
1359
+ opacity: 0;
1360
+ transform: translateY(10px);
1361
+ transition: opacity 600ms ease-out, transform 700ms var(--diag-ease);
1362
+ }
1363
+ .fn-stage.in { opacity: 1; transform: translateY(0); }
1364
+ .fn-shape {
1365
+ position: absolute;
1366
+ inset: 0;
1367
+ background: var(--diag-card-bg);
1368
+ border-top: 1px solid var(--dim-2);
1369
+ border-bottom: 1px solid var(--dim-2);
1370
+ }
1371
+ .fn-content {
1372
+ position: relative;
1373
+ z-index: 1;
1374
+ height: 100%;
1375
+ display: flex;
1376
+ align-items: center;
1377
+ justify-content: center;
1378
+ gap: clamp(1rem, 3vw, 2.4rem);
1379
+ padding: clamp(0.6rem, 1.4vw, 1rem) var(--fn-pad, 12%);
1380
+ text-align: center;
1381
+ }
1382
+ .fn-label {
1383
+ font-size: clamp(1rem, 1.7vw, 1.4rem);
1384
+ font-weight: 500;
1385
+ letter-spacing: 0.04em;
1386
+ text-transform: uppercase;
1387
+ color: var(--fg);
1388
+ line-height: 1.1;
1389
+ }
1390
+ .fn-value {
1391
+ font-size: clamp(1.8rem, 3.6vw, 3rem);
1392
+ font-weight: 500;
1393
+ letter-spacing: -0.03em;
1394
+ font-variant-numeric: tabular-nums;
1395
+ color: var(--fg);
1396
+ line-height: 1;
1397
+ }
1398
+ .fn-body {
1399
+ font-size: clamp(0.8rem, 1.1vw, 1rem);
1400
+ color: var(--dim);
1401
+ letter-spacing: 0.02em;
1402
+ }
1403
+ .fn-stage.fnc-accent .fn-shape { background: var(--accent-soft); border-color: var(--accent); }
1404
+ .fn-stage.fnc-accent .fn-label,
1405
+ .fn-stage.fnc-accent .fn-value { color: var(--accent); }
1406
+ .fn-stage.fnc-blue .fn-shape { background: rgba(24, 158, 255, 0.10); border-color: var(--blue); }
1407
+ .fn-stage.fnc-blue .fn-label,
1408
+ .fn-stage.fnc-blue .fn-value { color: var(--blue); }
1409
+ .fn-stage.fnc-amber .fn-shape { background: rgba(255, 180, 84, 0.10); border-color: var(--amber); }
1410
+ .fn-stage.fnc-amber .fn-label,
1411
+ .fn-stage.fnc-amber .fn-value { color: var(--amber); }
1412
+ .fn-stage.fnc-red .fn-shape { background: rgba(255, 92, 92, 0.10); border-color: var(--red); }
1413
+ .fn-stage.fnc-red .fn-label,
1414
+ .fn-stage.fnc-red .fn-value { color: var(--red); }
1415
+ .fn-stage.fnc-dim .fn-shape { background: transparent; border-color: var(--dim-2); }
1416
+ .fn-stage.fnc-dim .fn-label { color: var(--dim); }
1417
+ .fn-stage.fn-outcome .fn-content { gap: clamp(1.4rem, 4vw, 3.4rem); }
1418
+
1419
+ /* === inlined: themes/phosphor/components-chart.css === */
1420
+ /* Stagecraft — Phosphor theme: chart/relationship component styles.
1421
+ Used by Matrix2x2, BarChart, Progress, ProcessFlow, Venn. */
1422
+
1423
+ /* ============================================================
1424
+ * Matrix2x2
1425
+ * ============================================================ */
1426
+ .matrix2x2 {
1427
+ --matrix-size: min(72vh, 56vw, 880px);
1428
+ --matrix-gap: 1px;
1429
+ --matrix-pad: clamp(1rem, 2.2vw, 2rem);
1430
+ width: var(--matrix-size);
1431
+ height: var(--matrix-size);
1432
+ display: grid;
1433
+ grid-template-columns: auto 1fr;
1434
+ grid-template-rows: 1fr auto;
1435
+ gap: clamp(0.6rem, 1.4vw, 1.2rem);
1436
+ }
1437
+ .matrix2x2 .y-axis {
1438
+ grid-column: 1; grid-row: 1;
1439
+ display: flex;
1440
+ flex-direction: column;
1441
+ align-items: center;
1442
+ justify-content: space-between;
1443
+ writing-mode: vertical-rl;
1444
+ transform: rotate(180deg);
1445
+ font-size: 0.78rem;
1446
+ letter-spacing: 0.25em;
1447
+ text-transform: uppercase;
1448
+ color: var(--dim);
1449
+ padding: 0.4rem 0;
1450
+ }
1451
+ .matrix2x2 .y-axis .label {
1452
+ font-weight: 500;
1453
+ color: var(--fg);
1454
+ letter-spacing: 0.18em;
1455
+ }
1456
+ .matrix2x2 .y-axis .lo,
1457
+ .matrix2x2 .y-axis .hi {
1458
+ font-variant-numeric: tabular-nums;
1459
+ }
1460
+ .matrix2x2 .grid {
1461
+ grid-column: 2; grid-row: 1;
1462
+ display: grid;
1463
+ grid-template-columns: 1fr 1fr;
1464
+ grid-template-rows: 1fr 1fr;
1465
+ gap: var(--matrix-gap);
1466
+ background: var(--dim-2);
1467
+ border: 1px solid var(--dim-2);
1468
+ position: relative;
1469
+ }
1470
+ .matrix2x2 .grid::before,
1471
+ .matrix2x2 .grid::after {
1472
+ content: '';
1473
+ position: absolute;
1474
+ background: var(--dim-2);
1475
+ pointer-events: none;
1476
+ }
1477
+ .matrix2x2 .grid::before {
1478
+ left: 0; right: 0; top: 50%; height: 1px; transform: translateY(-0.5px);
1479
+ }
1480
+ .matrix2x2 .grid::after {
1481
+ top: 0; bottom: 0; left: 50%; width: 1px; transform: translateX(-0.5px);
1482
+ }
1483
+ .matrix2x2 .x-axis {
1484
+ grid-column: 2; grid-row: 2;
1485
+ display: flex;
1486
+ align-items: center;
1487
+ justify-content: space-between;
1488
+ font-size: 0.78rem;
1489
+ letter-spacing: 0.25em;
1490
+ text-transform: uppercase;
1491
+ color: var(--dim);
1492
+ padding: 0.4rem 0.2rem 0;
1493
+ }
1494
+ .matrix2x2 .x-axis .label {
1495
+ font-weight: 500;
1496
+ color: var(--fg);
1497
+ letter-spacing: 0.18em;
1498
+ }
1499
+ .matrix2x2 .quadrant {
1500
+ position: relative;
1501
+ padding: var(--matrix-pad);
1502
+ background: var(--bg);
1503
+ display: flex;
1504
+ flex-direction: column;
1505
+ gap: 0.6rem;
1506
+ opacity: 0.45;
1507
+ filter: saturate(0.5);
1508
+ transition: opacity 600ms ease-out, filter 600ms ease-out,
1509
+ background 600ms ease-out, box-shadow 600ms ease-out;
1510
+ overflow: hidden;
1511
+ }
1512
+ .matrix2x2 .quadrant .q-label {
1513
+ font-size: clamp(1rem, 1.6vw, 1.4rem);
1514
+ font-weight: 500;
1515
+ letter-spacing: -0.01em;
1516
+ color: var(--fg);
1517
+ line-height: 1.15;
1518
+ }
1519
+ .matrix2x2 .quadrant .q-body {
1520
+ font-size: clamp(0.85rem, 1.15vw, 1rem);
1521
+ color: var(--dim);
1522
+ line-height: 1.5;
1523
+ }
1524
+ .matrix2x2 .quadrant .q-tag {
1525
+ position: absolute;
1526
+ top: 0.6rem;
1527
+ right: 0.8rem;
1528
+ font-size: 0.65rem;
1529
+ letter-spacing: 0.3em;
1530
+ text-transform: uppercase;
1531
+ color: var(--dim);
1532
+ opacity: 0.6;
1533
+ }
1534
+ .matrix2x2 .quadrant.active {
1535
+ opacity: 1;
1536
+ filter: none;
1537
+ background: color-mix(in srgb, var(--q-color, var(--accent)) 8%, var(--bg));
1538
+ box-shadow: inset 0 0 0 1px var(--q-color, var(--accent));
1539
+ }
1540
+ .matrix2x2 .quadrant.active .q-label { color: var(--fg); }
1541
+ .matrix2x2 .quadrant.active .q-tag { color: var(--q-color, var(--accent)); opacity: 1; }
1542
+
1543
+ /* ============================================================
1544
+ * BarChart
1545
+ * ============================================================ */
1546
+ .barchart {
1547
+ --bar-thickness: clamp(1.6rem, 3vw, 2.4rem);
1548
+ --bar-gap: clamp(0.9rem, 1.6vw, 1.4rem);
1549
+ --bar-color: var(--accent);
1550
+ --bar-track: var(--dim-2);
1551
+ width: min(1100px, 92vw);
1552
+ display: flex;
1553
+ flex-direction: column;
1554
+ gap: var(--bar-gap);
1555
+ }
1556
+ .barchart.vertical {
1557
+ flex-direction: row;
1558
+ align-items: flex-end;
1559
+ justify-content: center;
1560
+ gap: clamp(1.5rem, 3vw, 2.6rem);
1561
+ height: min(60vh, 480px);
1562
+ }
1563
+ .barchart .bar-row {
1564
+ display: grid;
1565
+ grid-template-columns: minmax(7rem, 14ch) 1fr auto;
1566
+ align-items: center;
1567
+ gap: clamp(0.8rem, 1.6vw, 1.4rem);
1568
+ opacity: 0;
1569
+ transform: translateX(-10px);
1570
+ transition: opacity 500ms ease-out, transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
1571
+ }
1572
+ .barchart .bar-row.in, .barchart .bar-row.shown { opacity: 1; transform: translateX(0); }
1573
+ .barchart .bar-label {
1574
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
1575
+ color: var(--fg);
1576
+ letter-spacing: 0.02em;
1577
+ text-align: right;
1578
+ font-variant-numeric: tabular-nums;
1579
+ }
1580
+ .barchart .bar-track {
1581
+ height: var(--bar-thickness);
1582
+ background: var(--bar-track);
1583
+ position: relative;
1584
+ overflow: hidden;
1585
+ }
1586
+ .barchart .bar-fill {
1587
+ position: absolute;
1588
+ inset: 0 auto 0 0;
1589
+ width: 0%;
1590
+ background: var(--bar-color);
1591
+ transition: width 1200ms cubic-bezier(0.16, 1, 0.3, 1);
1592
+ box-shadow: 0 0 18px color-mix(in srgb, var(--bar-color) 60%, transparent);
1593
+ }
1594
+ .barchart .bar-value {
1595
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
1596
+ color: var(--bar-color);
1597
+ font-weight: 500;
1598
+ font-variant-numeric: tabular-nums;
1599
+ letter-spacing: -0.01em;
1600
+ min-width: 4ch;
1601
+ }
1602
+ /* vertical orientation */
1603
+ .barchart.vertical .bar-row {
1604
+ display: flex;
1605
+ flex-direction: column-reverse;
1606
+ align-items: center;
1607
+ justify-content: flex-start;
1608
+ height: 100%;
1609
+ gap: 0.6rem;
1610
+ min-width: clamp(3rem, 6vw, 5rem);
1611
+ transform: translateY(10px);
1612
+ }
1613
+ .barchart.vertical .bar-row.in,
1614
+ .barchart.vertical .bar-row.shown { transform: translateY(0); }
1615
+ .barchart.vertical .bar-label { text-align: center; }
1616
+ .barchart.vertical .bar-track {
1617
+ width: var(--bar-thickness);
1618
+ height: 100%;
1619
+ }
1620
+ .barchart.vertical .bar-fill {
1621
+ inset: auto 0 0 0;
1622
+ width: 100%;
1623
+ height: 0%;
1624
+ transition: height 1200ms cubic-bezier(0.16, 1, 0.3, 1);
1625
+ }
1626
+ .barchart .bar-row.accent { --bar-color: var(--accent); }
1627
+ .barchart .bar-row.amber { --bar-color: var(--amber); }
1628
+ .barchart .bar-row.blue { --bar-color: var(--blue); }
1629
+ .barchart .bar-row.red { --bar-color: var(--red); }
1630
+ .barchart .bar-row.dim { --bar-color: var(--dim); }
1631
+
1632
+ /* ============================================================
1633
+ * Progress
1634
+ * ============================================================ */
1635
+ .progress-list {
1636
+ width: min(1000px, 92vw);
1637
+ display: flex;
1638
+ flex-direction: column;
1639
+ gap: clamp(1.1rem, 2vw, 1.8rem);
1640
+ }
1641
+ .progress-row {
1642
+ --prog-color: var(--accent);
1643
+ display: grid;
1644
+ grid-template-columns: minmax(8rem, 16ch) 1fr 5ch;
1645
+ gap: clamp(0.8rem, 1.8vw, 1.6rem);
1646
+ align-items: center;
1647
+ opacity: 0;
1648
+ transform: translateY(8px);
1649
+ transition: opacity 500ms ease-out, transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
1650
+ }
1651
+ .progress-row.in, .progress-row.shown { opacity: 1; transform: translateY(0); }
1652
+ .progress-row.accent { --prog-color: var(--accent); }
1653
+ .progress-row.amber { --prog-color: var(--amber); }
1654
+ .progress-row.blue { --prog-color: var(--blue); }
1655
+ .progress-row.red { --prog-color: var(--red); }
1656
+ .progress-label {
1657
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
1658
+ color: var(--fg);
1659
+ letter-spacing: 0.02em;
1660
+ }
1661
+ .progress-track {
1662
+ height: clamp(0.5rem, 0.9vw, 0.7rem);
1663
+ background: var(--dim-2);
1664
+ position: relative;
1665
+ overflow: hidden;
1666
+ border-radius: 2px;
1667
+ }
1668
+ .progress-fill {
1669
+ position: absolute;
1670
+ inset: 0 auto 0 0;
1671
+ width: 0%;
1672
+ background: var(--prog-color);
1673
+ transition: width 1400ms cubic-bezier(0.16, 1, 0.3, 1);
1674
+ box-shadow: 0 0 14px color-mix(in srgb, var(--prog-color) 55%, transparent);
1675
+ }
1676
+ .progress-value {
1677
+ font-size: clamp(0.95rem, 1.25vw, 1.1rem);
1678
+ color: var(--prog-color);
1679
+ font-variant-numeric: tabular-nums;
1680
+ font-weight: 500;
1681
+ text-align: right;
1682
+ }
1683
+
1684
+ /* ============================================================
1685
+ * ProcessFlow
1686
+ * ============================================================ */
1687
+ .processflow {
1688
+ --pf-card-bg: var(--bg-elevated);
1689
+ --pf-card-border: var(--dim-2);
1690
+ --pf-accent: var(--accent);
1691
+ display: flex;
1692
+ align-items: stretch;
1693
+ justify-content: center;
1694
+ gap: clamp(0.8rem, 1.8vw, 1.6rem);
1695
+ width: min(1300px, 94vw);
1696
+ flex-wrap: wrap;
1697
+ }
1698
+ .processflow.vertical {
1699
+ flex-direction: column;
1700
+ align-items: center;
1701
+ width: min(620px, 92vw);
1702
+ }
1703
+ .processflow .pf-step {
1704
+ --pf-color: var(--fg);
1705
+ flex: 1 1 0;
1706
+ min-width: clamp(8rem, 14vw, 13rem);
1707
+ max-width: 18rem;
1708
+ background: var(--pf-card-bg);
1709
+ border: 1px solid var(--pf-card-border);
1710
+ padding: clamp(1rem, 1.8vw, 1.5rem);
1711
+ display: flex;
1712
+ flex-direction: column;
1713
+ align-items: flex-start;
1714
+ gap: 0.7rem;
1715
+ opacity: 0;
1716
+ transform: translateY(12px);
1717
+ transition: opacity 500ms ease-out, transform 500ms cubic-bezier(0.16, 1, 0.3, 1),
1718
+ border-color 400ms ease-out, box-shadow 400ms ease-out;
1719
+ }
1720
+ .processflow .pf-step.in,
1721
+ .processflow .pf-step.shown { opacity: 1; transform: translateY(0); }
1722
+ .processflow .pf-step.accent { --pf-color: var(--accent); border-color: color-mix(in srgb, var(--accent) 40%, var(--dim-2)); }
1723
+ .processflow .pf-step.amber { --pf-color: var(--amber); border-color: color-mix(in srgb, var(--amber) 40%, var(--dim-2)); }
1724
+ .processflow .pf-step.blue { --pf-color: var(--blue); border-color: color-mix(in srgb, var(--blue) 40%, var(--dim-2)); }
1725
+ .processflow .pf-step.red { --pf-color: var(--red); border-color: color-mix(in srgb, var(--red) 40%, var(--dim-2)); }
1726
+ .processflow .pf-icon {
1727
+ font-size: clamp(1.6rem, 2.6vw, 2.2rem);
1728
+ color: var(--pf-color);
1729
+ line-height: 1;
1730
+ }
1731
+ .processflow .pf-icon .material-symbols-outlined {
1732
+ font-size: inherit;
1733
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
1734
+ }
1735
+ .processflow .pf-label {
1736
+ font-size: clamp(1rem, 1.4vw, 1.25rem);
1737
+ font-weight: 500;
1738
+ color: var(--fg);
1739
+ letter-spacing: -0.005em;
1740
+ line-height: 1.25;
1741
+ }
1742
+ .processflow .pf-body {
1743
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
1744
+ color: var(--dim);
1745
+ line-height: 1.5;
1746
+ }
1747
+ .processflow .pf-arrow {
1748
+ flex: 0 0 auto;
1749
+ align-self: center;
1750
+ display: flex;
1751
+ align-items: center;
1752
+ justify-content: center;
1753
+ font-size: clamp(1.2rem, 2vw, 1.8rem);
1754
+ color: var(--pf-accent);
1755
+ opacity: 0;
1756
+ transform: translateX(-6px);
1757
+ transition: opacity 500ms ease-out, transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
1758
+ min-width: 1.8rem;
1759
+ }
1760
+ .processflow .pf-arrow.in,
1761
+ .processflow .pf-arrow.shown { opacity: 1; transform: translateX(0); }
1762
+ .processflow.vertical .pf-arrow {
1763
+ transform: translateY(-6px);
1764
+ }
1765
+ .processflow.vertical .pf-arrow.in,
1766
+ .processflow.vertical .pf-arrow.shown { transform: translateY(0); }
1767
+ .processflow .pf-arrow.pulse {
1768
+ animation: pf-pulse 900ms ease-out;
1769
+ }
1770
+ @keyframes pf-pulse {
1771
+ 0% { color: var(--pf-accent); text-shadow: 0 0 0 transparent; transform: scale(1); }
1772
+ 40% { color: var(--fg); text-shadow: 0 0 18px color-mix(in srgb, var(--pf-accent) 80%, transparent); transform: scale(1.18); }
1773
+ 100% { color: var(--pf-accent); text-shadow: 0 0 0 transparent; transform: scale(1); }
1774
+ }
1775
+
1776
+ /* ============================================================
1777
+ * Venn
1778
+ * ============================================================ */
1779
+ .venn {
1780
+ --venn-size: min(70vh, 56vw, 760px);
1781
+ width: var(--venn-size);
1782
+ height: calc(var(--venn-size) * 0.78);
1783
+ position: relative;
1784
+ }
1785
+ .venn svg {
1786
+ width: 100%;
1787
+ height: 100%;
1788
+ display: block;
1789
+ overflow: visible;
1790
+ }
1791
+ .venn .v-circle {
1792
+ fill-opacity: 0.18;
1793
+ stroke-width: 1.5;
1794
+ opacity: 0;
1795
+ transform-origin: center;
1796
+ transform: scale(0.94);
1797
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
1798
+ }
1799
+ .venn .v-circle.in {
1800
+ opacity: 1;
1801
+ transform: scale(1);
1802
+ }
1803
+ .venn .v-label {
1804
+ position: absolute;
1805
+ text-align: center;
1806
+ transform: translate(-50%, -50%);
1807
+ font-size: clamp(0.85rem, 1.2vw, 1.05rem);
1808
+ letter-spacing: 0.02em;
1809
+ line-height: 1.3;
1810
+ color: var(--fg);
1811
+ opacity: 0;
1812
+ transition: opacity 600ms ease-out;
1813
+ max-width: 14ch;
1814
+ pointer-events: none;
1815
+ }
1816
+ .venn .v-label.in { opacity: 1; }
1817
+ .venn .v-label.set { font-weight: 500; }
1818
+ .venn .v-label.set .name {
1819
+ display: inline-block;
1820
+ color: var(--vl-color, var(--fg));
1821
+ background: var(--bg);
1822
+ padding: 0.1rem 0.4rem;
1823
+ letter-spacing: 0.04em;
1824
+ }
1825
+ .venn .v-label.overlap {
1826
+ color: var(--fg);
1827
+ font-size: clamp(0.78rem, 1vw, 0.95rem);
1828
+ letter-spacing: 0.06em;
1829
+ }
1830
+ .venn .v-label.overlap > span {
1831
+ background: color-mix(in srgb, var(--bg) 78%, transparent);
1832
+ padding: 0.1rem 0.35rem;
1833
+ display: inline-block;
1834
+ }
1835
+
1836
+ /* Phase 3: data / business / content families */
1837
+ /* === inlined: themes/phosphor/components-data.css === */
1838
+ /* Stagecraft — Phosphor theme: data-visualization component styles.
1839
+ Used by KPI, DonutChart, LineChart, Gauge, SparkLine, Heatmap,
1840
+ Roadmap, SWOT, CodeBlock, CodeDiff. */
1841
+
1842
+ /* ============================================================
1843
+ * Shared color hooks (used by KPI, SparkLine, Gauge, etc.)
1844
+ * ------------------------------------------------------------ */
1845
+ .kpi--accent, .gauge--accent, .sparkline--accent { --data-color: var(--accent); }
1846
+ .kpi--amber, .gauge--amber, .sparkline--amber { --data-color: var(--amber); }
1847
+ .kpi--blue, .gauge--blue, .sparkline--blue { --data-color: var(--blue); }
1848
+ .kpi--red, .gauge--red, .sparkline--red { --data-color: var(--red); }
1849
+ .kpi--dim, .gauge--dim, .sparkline--dim { --data-color: var(--dim); }
1850
+ .kpi--fg, .gauge--fg, .sparkline--fg { --data-color: var(--fg); }
1851
+
1852
+ /* ============================================================
1853
+ * KPI
1854
+ * ============================================================ */
1855
+ .kpi {
1856
+ --data-color: var(--accent);
1857
+ width: min(620px, 92vw);
1858
+ background: var(--bg-elevated);
1859
+ border: 1px solid var(--dim-2);
1860
+ padding: clamp(1.4rem, 2.6vw, 2.2rem);
1861
+ display: flex;
1862
+ flex-direction: column;
1863
+ gap: clamp(0.6rem, 1.4vw, 1.1rem);
1864
+ opacity: 0;
1865
+ transform: translateY(10px);
1866
+ transition: opacity 600ms ease-out, transform 600ms cubic-bezier(0.16, 1, 0.3, 1),
1867
+ border-color 600ms ease-out, box-shadow 600ms ease-out;
1868
+ }
1869
+ .kpi.in {
1870
+ opacity: 1;
1871
+ transform: translateY(0);
1872
+ border-color: color-mix(in srgb, var(--data-color) 35%, var(--dim-2));
1873
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--data-color) 15%, transparent),
1874
+ 0 0 50px color-mix(in srgb, var(--data-color) 12%, transparent);
1875
+ }
1876
+ .kpi-head {
1877
+ display: flex;
1878
+ align-items: center;
1879
+ gap: 0.7rem;
1880
+ font-size: clamp(0.9rem, 1.2vw, 1.05rem);
1881
+ letter-spacing: 0.18em;
1882
+ text-transform: uppercase;
1883
+ color: var(--dim);
1884
+ }
1885
+ .kpi-icon {
1886
+ color: var(--data-color);
1887
+ font-size: 1.2em;
1888
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
1889
+ }
1890
+ .kpi-label {
1891
+ letter-spacing: 0.18em;
1892
+ }
1893
+ .kpi-figure {
1894
+ display: flex;
1895
+ align-items: baseline;
1896
+ gap: 0.25rem;
1897
+ font-variant-numeric: tabular-nums;
1898
+ line-height: 1;
1899
+ }
1900
+ .kpi-num {
1901
+ font-size: clamp(3.4rem, 7vw, 6rem);
1902
+ font-weight: 500;
1903
+ color: var(--data-color);
1904
+ letter-spacing: -0.03em;
1905
+ text-shadow: 0 0 24px color-mix(in srgb, var(--data-color) 35%, transparent);
1906
+ }
1907
+ .kpi-unit {
1908
+ font-size: clamp(1.4rem, 2.6vw, 2.2rem);
1909
+ color: var(--data-color);
1910
+ font-weight: 500;
1911
+ letter-spacing: -0.01em;
1912
+ }
1913
+ .kpi-change {
1914
+ display: inline-flex;
1915
+ align-items: center;
1916
+ gap: 0.5rem;
1917
+ font-size: clamp(0.85rem, 1.15vw, 1rem);
1918
+ font-variant-numeric: tabular-nums;
1919
+ letter-spacing: 0.02em;
1920
+ opacity: 0;
1921
+ transform: translateY(4px);
1922
+ transition: opacity 500ms ease-out, transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
1923
+ }
1924
+ .kpi-change.in { opacity: 1; transform: translateY(0); }
1925
+ .kpi-change .kpi-arrow {
1926
+ font-size: 0.9em;
1927
+ line-height: 1;
1928
+ }
1929
+ .kpi-change.up .kpi-arrow,
1930
+ .kpi-change.up .kpi-change-num { color: var(--accent); }
1931
+ .kpi-change.down .kpi-arrow,
1932
+ .kpi-change.down .kpi-change-num { color: var(--red); }
1933
+ .kpi-change .kpi-change-period { color: var(--dim); }
1934
+
1935
+ /* ============================================================
1936
+ * DonutChart
1937
+ * ============================================================ */
1938
+ .donut {
1939
+ display: flex;
1940
+ align-items: center;
1941
+ gap: clamp(1.5rem, 4vw, 3rem);
1942
+ width: min(1100px, 92vw);
1943
+ flex-wrap: wrap;
1944
+ justify-content: center;
1945
+ }
1946
+ .donut-svg-wrap {
1947
+ position: relative;
1948
+ width: min(48vh, 36vw, 460px);
1949
+ aspect-ratio: 1;
1950
+ }
1951
+ .donut-svg {
1952
+ width: 100%;
1953
+ height: 100%;
1954
+ overflow: visible;
1955
+ }
1956
+ .donut-arc {
1957
+ transition: stroke-width 300ms ease-out;
1958
+ filter: drop-shadow(0 0 8px color-mix(in srgb, currentColor 0%, transparent));
1959
+ }
1960
+ .donut-center {
1961
+ position: absolute;
1962
+ inset: 0;
1963
+ display: flex;
1964
+ align-items: center;
1965
+ justify-content: center;
1966
+ font-size: clamp(1rem, 1.6vw, 1.4rem);
1967
+ letter-spacing: 0.18em;
1968
+ text-transform: uppercase;
1969
+ color: var(--dim);
1970
+ pointer-events: none;
1971
+ }
1972
+ .donut-legend {
1973
+ display: flex;
1974
+ flex-direction: column;
1975
+ gap: 0.6rem;
1976
+ min-width: 14rem;
1977
+ }
1978
+ .donut-legend-row {
1979
+ display: grid;
1980
+ grid-template-columns: auto 1fr auto auto;
1981
+ gap: 0.8rem;
1982
+ align-items: baseline;
1983
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
1984
+ color: var(--fg);
1985
+ opacity: 0;
1986
+ transform: translateX(8px);
1987
+ transition: opacity 500ms ease-out, transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
1988
+ font-variant-numeric: tabular-nums;
1989
+ }
1990
+ .donut-legend-row.in { opacity: 1; transform: translateX(0); }
1991
+ .donut-dot {
1992
+ width: 0.7rem;
1993
+ height: 0.7rem;
1994
+ background: var(--dc-color, var(--accent));
1995
+ display: inline-block;
1996
+ box-shadow: 0 0 8px color-mix(in srgb, var(--dc-color, var(--accent)) 70%, transparent);
1997
+ }
1998
+ .donut-leg-label {
1999
+ letter-spacing: 0.02em;
2000
+ }
2001
+ .donut-leg-value {
2002
+ color: var(--dim);
2003
+ font-variant-numeric: tabular-nums;
2004
+ }
2005
+ .donut-leg-pct {
2006
+ color: var(--fg);
2007
+ min-width: 3.2ch;
2008
+ text-align: right;
2009
+ }
2010
+
2011
+ /* ============================================================
2012
+ * LineChart
2013
+ * ============================================================ */
2014
+ .linechart {
2015
+ width: min(1200px, 94vw);
2016
+ display: flex;
2017
+ flex-direction: column;
2018
+ gap: 0.8rem;
2019
+ }
2020
+ .lc-svg-wrap {
2021
+ width: 100%;
2022
+ aspect-ratio: 2 / 1;
2023
+ max-height: 60vh;
2024
+ }
2025
+ .lc-svg {
2026
+ width: 100%;
2027
+ height: 100%;
2028
+ }
2029
+ .lc-grid {
2030
+ stroke: var(--dim-2);
2031
+ stroke-width: 1;
2032
+ stroke-dasharray: 2 4;
2033
+ opacity: 0.7;
2034
+ }
2035
+ .lc-y-label,
2036
+ .lc-x-label {
2037
+ fill: var(--dim);
2038
+ font-size: 14px;
2039
+ font-family: var(--mono);
2040
+ letter-spacing: 0.04em;
2041
+ }
2042
+ .lc-line {
2043
+ fill: none;
2044
+ stroke-width: 2.5;
2045
+ stroke-linecap: round;
2046
+ stroke-linejoin: round;
2047
+ filter: drop-shadow(0 0 6px color-mix(in srgb, currentColor 40%, transparent));
2048
+ }
2049
+ .lc-area {
2050
+ opacity: 0;
2051
+ transition: opacity 700ms ease-out;
2052
+ }
2053
+ .lc-area.in { opacity: 1; }
2054
+ .lc-dot {
2055
+ opacity: 0;
2056
+ transform-origin: center;
2057
+ transition: opacity 400ms ease-out;
2058
+ }
2059
+ .lc-dot.in { opacity: 1; }
2060
+ .lc-legend {
2061
+ display: flex;
2062
+ gap: clamp(1rem, 2vw, 1.6rem);
2063
+ flex-wrap: wrap;
2064
+ padding: 0.4rem 0.6rem 0;
2065
+ }
2066
+ .lc-leg-row {
2067
+ display: inline-flex;
2068
+ align-items: center;
2069
+ gap: 0.5rem;
2070
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
2071
+ color: var(--fg);
2072
+ letter-spacing: 0.02em;
2073
+ }
2074
+ .lc-dot-leg {
2075
+ width: 0.7rem;
2076
+ height: 0.7rem;
2077
+ background: var(--lc-color, var(--accent));
2078
+ display: inline-block;
2079
+ box-shadow: 0 0 8px color-mix(in srgb, var(--lc-color, var(--accent)) 70%, transparent);
2080
+ }
2081
+
2082
+ /* ============================================================
2083
+ * Gauge
2084
+ * ============================================================ */
2085
+ .gauge {
2086
+ --data-color: var(--accent);
2087
+ width: min(620px, 80vw);
2088
+ display: flex;
2089
+ flex-direction: column;
2090
+ align-items: center;
2091
+ }
2092
+ .g-svg-wrap {
2093
+ position: relative;
2094
+ width: 100%;
2095
+ aspect-ratio: 200 / 120;
2096
+ }
2097
+ .g-svg {
2098
+ width: 100%;
2099
+ height: 100%;
2100
+ overflow: visible;
2101
+ }
2102
+ .g-fill {
2103
+ filter: drop-shadow(0 0 14px color-mix(in srgb, var(--data-color) 55%, transparent));
2104
+ transition: none;
2105
+ }
2106
+ .g-tick {
2107
+ stroke: var(--dim);
2108
+ stroke-width: 1.5;
2109
+ opacity: 0.6;
2110
+ }
2111
+ .g-readout {
2112
+ position: absolute;
2113
+ left: 50%;
2114
+ bottom: -0.6rem;
2115
+ transform: translateX(-50%);
2116
+ text-align: center;
2117
+ display: flex;
2118
+ flex-direction: column;
2119
+ gap: 0.3rem;
2120
+ }
2121
+ .g-num {
2122
+ font-variant-numeric: tabular-nums;
2123
+ font-size: clamp(2.2rem, 4.4vw, 3.6rem);
2124
+ font-weight: 500;
2125
+ letter-spacing: -0.03em;
2126
+ color: var(--data-color);
2127
+ line-height: 1;
2128
+ text-shadow: 0 0 18px color-mix(in srgb, var(--data-color) 40%, transparent);
2129
+ display: flex;
2130
+ align-items: baseline;
2131
+ gap: 0.3rem;
2132
+ justify-content: center;
2133
+ }
2134
+ .g-num-max {
2135
+ font-size: 0.55em;
2136
+ color: var(--dim);
2137
+ font-weight: 400;
2138
+ letter-spacing: 0.02em;
2139
+ text-shadow: none;
2140
+ }
2141
+ .g-label {
2142
+ font-size: clamp(0.85rem, 1.2vw, 1rem);
2143
+ letter-spacing: 0.18em;
2144
+ text-transform: uppercase;
2145
+ color: var(--dim);
2146
+ }
2147
+
2148
+ /* ============================================================
2149
+ * SparkLine
2150
+ * ============================================================ */
2151
+ .sparkline {
2152
+ --data-color: var(--accent);
2153
+ width: min(540px, 90vw);
2154
+ background: var(--bg-elevated);
2155
+ border: 1px solid var(--dim-2);
2156
+ padding: clamp(1.2rem, 2.2vw, 1.8rem);
2157
+ display: flex;
2158
+ flex-direction: column;
2159
+ gap: 0.7rem;
2160
+ }
2161
+ .sl-figure {
2162
+ display: flex;
2163
+ align-items: baseline;
2164
+ gap: 0.3rem;
2165
+ line-height: 1;
2166
+ }
2167
+ .sl-num {
2168
+ font-size: clamp(3rem, 6vw, 5rem);
2169
+ font-weight: 500;
2170
+ color: var(--data-color);
2171
+ letter-spacing: -0.03em;
2172
+ font-variant-numeric: tabular-nums;
2173
+ text-shadow: 0 0 22px color-mix(in srgb, var(--data-color) 35%, transparent);
2174
+ }
2175
+ .sl-label {
2176
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
2177
+ color: var(--dim);
2178
+ letter-spacing: 0.18em;
2179
+ text-transform: uppercase;
2180
+ }
2181
+ .sl-svg-wrap {
2182
+ width: 100%;
2183
+ height: clamp(60px, 8vh, 90px);
2184
+ }
2185
+ .sl-svg {
2186
+ width: 100%;
2187
+ height: 100%;
2188
+ overflow: visible;
2189
+ }
2190
+ .sl-line {
2191
+ stroke-width: 2;
2192
+ fill: none;
2193
+ filter: drop-shadow(0 0 6px color-mix(in srgb, currentColor 40%, transparent));
2194
+ }
2195
+ .sl-area {
2196
+ opacity: 0;
2197
+ transition: opacity 700ms ease-out;
2198
+ }
2199
+ .sl-area.in { opacity: 1; }
2200
+ .sl-tip {
2201
+ opacity: 0;
2202
+ transition: opacity 400ms ease-out;
2203
+ }
2204
+ .sl-tip.in { opacity: 1; }
2205
+ .sl-period {
2206
+ font-size: clamp(0.75rem, 1vw, 0.9rem);
2207
+ color: var(--dim);
2208
+ letter-spacing: 0.04em;
2209
+ }
2210
+
2211
+ /* ============================================================
2212
+ * Heatmap
2213
+ * ============================================================ */
2214
+ .heatmap {
2215
+ --hm-base: var(--accent);
2216
+ --hm-cell: clamp(1.2rem, 2.2vw, 1.9rem);
2217
+ width: min(1200px, 94vw);
2218
+ display: flex;
2219
+ flex-direction: column;
2220
+ gap: 0.6rem;
2221
+ }
2222
+ .hm-x-labels {
2223
+ display: grid;
2224
+ grid-template-columns: minmax(3rem, auto) 1fr;
2225
+ gap: clamp(0.4rem, 0.8vw, 0.7rem);
2226
+ }
2227
+ .hm-x-labels .hm-corner { /* placeholder above y-labels */ }
2228
+ .hm-x-row {
2229
+ display: grid;
2230
+ grid-template-columns: repeat(var(--hm-cols), 1fr);
2231
+ gap: clamp(2px, 0.3vw, 4px);
2232
+ }
2233
+ .hm-x-label {
2234
+ font-size: clamp(0.7rem, 0.95vw, 0.85rem);
2235
+ color: var(--dim);
2236
+ letter-spacing: 0.08em;
2237
+ text-transform: uppercase;
2238
+ text-align: center;
2239
+ font-variant-numeric: tabular-nums;
2240
+ }
2241
+ /* When y-labels are absent, drop the corner and stretch x-row full width */
2242
+ .heatmap:not(:has(.hm-y-label)) .hm-x-labels {
2243
+ grid-template-columns: 1fr;
2244
+ }
2245
+ .heatmap:not(:has(.hm-y-label)) .hm-x-labels .hm-corner { display: none; }
2246
+ .hm-body {
2247
+ display: flex;
2248
+ flex-direction: column;
2249
+ gap: clamp(2px, 0.3vw, 4px);
2250
+ }
2251
+ .hm-row {
2252
+ display: grid;
2253
+ grid-template-columns: minmax(3rem, auto) 1fr;
2254
+ gap: clamp(0.4rem, 0.8vw, 0.7rem);
2255
+ align-items: center;
2256
+ }
2257
+ .hm-row:only-child,
2258
+ .heatmap:not(:has(.hm-y-label)) .hm-row {
2259
+ grid-template-columns: 1fr;
2260
+ }
2261
+ .hm-y-label {
2262
+ font-size: clamp(0.7rem, 0.95vw, 0.85rem);
2263
+ color: var(--dim);
2264
+ letter-spacing: 0.06em;
2265
+ text-align: right;
2266
+ font-variant-numeric: tabular-nums;
2267
+ }
2268
+ .hm-cells {
2269
+ display: grid;
2270
+ grid-template-columns: repeat(var(--hm-cols), 1fr);
2271
+ gap: clamp(2px, 0.3vw, 4px);
2272
+ }
2273
+ .hm-cell {
2274
+ aspect-ratio: 1;
2275
+ background: color-mix(in srgb, var(--hm-base) calc(var(--hm-intensity) * 95%), var(--dim-2));
2276
+ border: 1px solid color-mix(in srgb, var(--hm-base) calc(var(--hm-intensity) * 40%), var(--dim-2));
2277
+ opacity: 0;
2278
+ transform: scale(0.7);
2279
+ transition: opacity 400ms ease-out, transform 400ms cubic-bezier(0.16, 1, 0.3, 1);
2280
+ }
2281
+ .hm-cell.in {
2282
+ opacity: 1;
2283
+ transform: scale(1);
2284
+ }
2285
+ .hm-scale {
2286
+ display: inline-flex;
2287
+ align-items: center;
2288
+ gap: clamp(2px, 0.3vw, 4px);
2289
+ align-self: flex-end;
2290
+ margin-top: 0.4rem;
2291
+ font-size: clamp(0.7rem, 0.9vw, 0.8rem);
2292
+ color: var(--dim);
2293
+ letter-spacing: 0.06em;
2294
+ }
2295
+ .hm-scale-label {
2296
+ padding: 0 0.4rem;
2297
+ }
2298
+ .hm-scale-step {
2299
+ width: clamp(0.9rem, 1.2vw, 1.2rem);
2300
+ height: clamp(0.9rem, 1.2vw, 1.2rem);
2301
+ display: inline-block;
2302
+ background: color-mix(in srgb, var(--hm-base) calc(var(--hm-intensity) * 95%), var(--dim-2));
2303
+ border: 1px solid color-mix(in srgb, var(--hm-base) calc(var(--hm-intensity) * 40%), var(--dim-2));
2304
+ }
2305
+
2306
+ /* ============================================================
2307
+ * Roadmap
2308
+ * ============================================================ */
2309
+ .roadmap {
2310
+ width: min(1300px, 96vw);
2311
+ display: flex;
2312
+ flex-direction: column;
2313
+ gap: clamp(0.5rem, 1vw, 0.8rem);
2314
+ }
2315
+ .rm-header {
2316
+ display: grid;
2317
+ grid-template-columns: 8rem 1fr;
2318
+ gap: clamp(0.5rem, 1vw, 0.8rem);
2319
+ }
2320
+ .rm-lane-label-spacer {
2321
+ /* placeholder above lane labels */
2322
+ }
2323
+ .rm-months {
2324
+ display: grid;
2325
+ grid-template-columns: repeat(var(--rm-cols), 1fr);
2326
+ border-bottom: 1px solid var(--dim-2);
2327
+ padding-bottom: 0.4rem;
2328
+ }
2329
+ .rm-month {
2330
+ font-size: clamp(0.7rem, 0.95vw, 0.85rem);
2331
+ letter-spacing: 0.12em;
2332
+ text-transform: uppercase;
2333
+ color: var(--dim);
2334
+ text-align: center;
2335
+ }
2336
+ .rm-body {
2337
+ display: flex;
2338
+ flex-direction: column;
2339
+ gap: clamp(0.6rem, 1vw, 1rem);
2340
+ }
2341
+ .rm-lane {
2342
+ display: grid;
2343
+ grid-template-columns: 8rem 1fr;
2344
+ gap: clamp(0.5rem, 1vw, 0.8rem);
2345
+ align-items: stretch;
2346
+ opacity: 0;
2347
+ transform: translateX(-10px);
2348
+ transition: opacity 500ms ease-out, transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
2349
+ }
2350
+ .rm-lane.in { opacity: 1; transform: translateX(0); }
2351
+ .rm-lane-label {
2352
+ --rm-color: var(--fg);
2353
+ display: flex;
2354
+ align-items: center;
2355
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
2356
+ letter-spacing: 0.04em;
2357
+ color: var(--fg);
2358
+ border-left: 2px solid var(--rm-color);
2359
+ padding-left: 0.8rem;
2360
+ }
2361
+ .rm-lane-label.rm-accent { --rm-color: var(--accent); }
2362
+ .rm-lane-label.rm-amber { --rm-color: var(--amber); }
2363
+ .rm-lane-label.rm-blue { --rm-color: var(--blue); }
2364
+ .rm-lane-label.rm-red { --rm-color: var(--red); }
2365
+ .rm-lane-label.rm-dim { --rm-color: var(--dim); }
2366
+ .rm-lane-track {
2367
+ position: relative;
2368
+ background:
2369
+ repeating-linear-gradient(
2370
+ to right,
2371
+ transparent 0,
2372
+ transparent calc((100% / var(--rm-cols, 12)) - 1px),
2373
+ var(--dim-2) calc((100% / var(--rm-cols, 12)) - 1px),
2374
+ var(--dim-2) calc(100% / var(--rm-cols, 12))
2375
+ ),
2376
+ color-mix(in srgb, var(--bg-elevated) 60%, transparent);
2377
+ border: 1px solid var(--dim-2);
2378
+ min-height: clamp(2.2rem, 4vw, 3rem);
2379
+ }
2380
+ .rm-bar {
2381
+ --rm-bar-color: var(--accent);
2382
+ position: absolute;
2383
+ top: 6px;
2384
+ bottom: 6px;
2385
+ left: var(--rm-left);
2386
+ width: var(--rm-width);
2387
+ background: color-mix(in srgb, var(--rm-bar-color) 22%, var(--bg-elevated));
2388
+ border: 1px solid color-mix(in srgb, var(--rm-bar-color) 60%, var(--dim-2));
2389
+ display: flex;
2390
+ align-items: center;
2391
+ padding: 0 0.7rem;
2392
+ overflow: hidden;
2393
+ opacity: 0;
2394
+ transform: translateY(4px);
2395
+ transition: opacity 600ms ease-out, transform 600ms cubic-bezier(0.16, 1, 0.3, 1),
2396
+ width 800ms cubic-bezier(0.16, 1, 0.3, 1);
2397
+ box-shadow: inset 3px 0 0 var(--rm-bar-color),
2398
+ 0 0 20px color-mix(in srgb, var(--rm-bar-color) 18%, transparent);
2399
+ }
2400
+ .rm-bar.in { opacity: 1; transform: translateY(0); }
2401
+ .rm-bar.rm-accent { --rm-bar-color: var(--accent); }
2402
+ .rm-bar.rm-amber { --rm-bar-color: var(--amber); }
2403
+ .rm-bar.rm-blue { --rm-bar-color: var(--blue); }
2404
+ .rm-bar.rm-red { --rm-bar-color: var(--red); }
2405
+ .rm-bar.rm-dim { --rm-bar-color: var(--dim); }
2406
+ .rm-bar-label {
2407
+ font-size: clamp(0.75rem, 1vw, 0.9rem);
2408
+ color: var(--fg);
2409
+ letter-spacing: 0.02em;
2410
+ white-space: nowrap;
2411
+ text-overflow: ellipsis;
2412
+ overflow: hidden;
2413
+ }
2414
+
2415
+ /* ============================================================
2416
+ * SWOT
2417
+ * ============================================================ */
2418
+ .swot {
2419
+ width: min(1100px, 94vw);
2420
+ height: min(72vh, 700px);
2421
+ display: grid;
2422
+ grid-template-columns: 1fr 1fr;
2423
+ grid-template-rows: 1fr 1fr;
2424
+ gap: 1px;
2425
+ background: var(--dim-2);
2426
+ border: 1px solid var(--dim-2);
2427
+ }
2428
+ .swot-cell {
2429
+ --swot-color: var(--accent);
2430
+ background: var(--bg);
2431
+ padding: clamp(1rem, 2.2vw, 1.8rem);
2432
+ display: flex;
2433
+ flex-direction: column;
2434
+ gap: 0.8rem;
2435
+ position: relative;
2436
+ opacity: 0;
2437
+ transform: scale(0.97);
2438
+ transition: opacity 500ms ease-out, transform 500ms cubic-bezier(0.16, 1, 0.3, 1),
2439
+ background 500ms ease-out, box-shadow 500ms ease-out;
2440
+ overflow: hidden;
2441
+ }
2442
+ .swot-cell.in {
2443
+ opacity: 1;
2444
+ transform: scale(1);
2445
+ background: color-mix(in srgb, var(--swot-color) 6%, var(--bg));
2446
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--swot-color) 45%, var(--dim-2));
2447
+ }
2448
+ .swot-cell--accent { --swot-color: var(--accent); }
2449
+ .swot-cell--amber { --swot-color: var(--amber); }
2450
+ .swot-cell--blue { --swot-color: var(--blue); }
2451
+ .swot-cell--red { --swot-color: var(--red); }
2452
+ .swot-head {
2453
+ display: flex;
2454
+ align-items: baseline;
2455
+ gap: 0.8rem;
2456
+ }
2457
+ .swot-letter {
2458
+ font-size: clamp(2rem, 4vw, 3rem);
2459
+ font-weight: 500;
2460
+ color: var(--swot-color);
2461
+ letter-spacing: -0.04em;
2462
+ line-height: 1;
2463
+ text-shadow: 0 0 20px color-mix(in srgb, var(--swot-color) 50%, transparent);
2464
+ }
2465
+ .swot-title {
2466
+ font-size: clamp(1rem, 1.3vw, 1.2rem);
2467
+ color: var(--fg);
2468
+ letter-spacing: 0.18em;
2469
+ text-transform: uppercase;
2470
+ }
2471
+ .swot-list {
2472
+ list-style: none;
2473
+ padding: 0;
2474
+ margin: 0;
2475
+ display: flex;
2476
+ flex-direction: column;
2477
+ gap: 0.55rem;
2478
+ }
2479
+ .swot-item {
2480
+ font-size: clamp(0.9rem, 1.2vw, 1.05rem);
2481
+ color: var(--fg);
2482
+ line-height: 1.45;
2483
+ padding-left: 1.2rem;
2484
+ position: relative;
2485
+ opacity: 0;
2486
+ transform: translateX(-6px);
2487
+ transition: opacity 400ms ease-out, transform 400ms cubic-bezier(0.16, 1, 0.3, 1);
2488
+ }
2489
+ .swot-item::before {
2490
+ content: '';
2491
+ position: absolute;
2492
+ left: 0;
2493
+ top: 0.55em;
2494
+ width: 0.55rem;
2495
+ height: 1px;
2496
+ background: var(--swot-color);
2497
+ }
2498
+ .swot-item.in { opacity: 1; transform: translateX(0); }
2499
+
2500
+ /* ============================================================
2501
+ * CodeBlock
2502
+ * ============================================================ */
2503
+ .codeblock {
2504
+ width: min(1100px, 94vw);
2505
+ background: var(--bg-elevated);
2506
+ border: 1px solid var(--dim-2);
2507
+ font-family: var(--mono);
2508
+ overflow: hidden;
2509
+ }
2510
+ .cb-head {
2511
+ display: flex;
2512
+ align-items: center;
2513
+ gap: 0.8rem;
2514
+ padding: 0.7rem 1rem;
2515
+ background: color-mix(in srgb, var(--bg) 60%, var(--bg-elevated));
2516
+ border-bottom: 1px solid var(--dim-2);
2517
+ font-size: clamp(0.8rem, 1vw, 0.9rem);
2518
+ color: var(--dim);
2519
+ letter-spacing: 0.04em;
2520
+ }
2521
+ .cb-dots {
2522
+ display: inline-flex;
2523
+ gap: 0.35rem;
2524
+ }
2525
+ .cb-dots span {
2526
+ width: 0.55rem;
2527
+ height: 0.55rem;
2528
+ border-radius: 50%;
2529
+ background: var(--dim-2);
2530
+ }
2531
+ .cb-dots span:nth-child(1) { background: color-mix(in srgb, var(--red) 60%, var(--dim-2)); }
2532
+ .cb-dots span:nth-child(2) { background: color-mix(in srgb, var(--amber) 60%, var(--dim-2)); }
2533
+ .cb-dots span:nth-child(3) { background: color-mix(in srgb, var(--accent) 60%, var(--dim-2)); }
2534
+ .cb-file {
2535
+ color: var(--fg);
2536
+ font-weight: 500;
2537
+ }
2538
+ .cb-lang {
2539
+ margin-left: auto;
2540
+ font-size: 0.85em;
2541
+ text-transform: uppercase;
2542
+ letter-spacing: 0.18em;
2543
+ color: var(--accent);
2544
+ }
2545
+ .cb-body {
2546
+ margin: 0;
2547
+ padding: clamp(0.8rem, 1.4vw, 1.2rem) 0;
2548
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
2549
+ line-height: 1.55;
2550
+ color: var(--fg);
2551
+ background: transparent;
2552
+ overflow-x: auto;
2553
+ white-space: pre;
2554
+ }
2555
+ .cb-line {
2556
+ display: grid;
2557
+ grid-template-columns: 4ch 1fr;
2558
+ gap: 1rem;
2559
+ padding: 0 clamp(0.8rem, 1.4vw, 1.2rem);
2560
+ opacity: 0;
2561
+ transform: translateY(2px);
2562
+ transition: opacity 400ms ease-out, transform 400ms cubic-bezier(0.16, 1, 0.3, 1),
2563
+ background 300ms ease-out;
2564
+ }
2565
+ .cb-line.in { opacity: 1; transform: translateY(0); }
2566
+ .cb-line-num {
2567
+ color: var(--dim);
2568
+ text-align: right;
2569
+ font-variant-numeric: tabular-nums;
2570
+ user-select: none;
2571
+ }
2572
+ .cb-line-text {
2573
+ color: var(--fg);
2574
+ white-space: pre;
2575
+ }
2576
+ .cb-line--highlight {
2577
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
2578
+ box-shadow: inset 2px 0 0 var(--accent);
2579
+ }
2580
+ .cb-line--highlight .cb-line-num { color: var(--accent); }
2581
+
2582
+ /* ============================================================
2583
+ * CodeDiff
2584
+ * ============================================================ */
2585
+ .codediff {
2586
+ width: min(1100px, 94vw);
2587
+ background: var(--bg-elevated);
2588
+ border: 1px solid var(--dim-2);
2589
+ font-family: var(--mono);
2590
+ overflow: hidden;
2591
+ }
2592
+ .cd-head {
2593
+ display: flex;
2594
+ align-items: center;
2595
+ gap: 0.8rem;
2596
+ padding: 0.7rem 1rem;
2597
+ background: color-mix(in srgb, var(--bg) 60%, var(--bg-elevated));
2598
+ border-bottom: 1px solid var(--dim-2);
2599
+ font-size: clamp(0.8rem, 1vw, 0.9rem);
2600
+ color: var(--dim);
2601
+ letter-spacing: 0.04em;
2602
+ }
2603
+ .cd-file {
2604
+ color: var(--fg);
2605
+ font-weight: 500;
2606
+ }
2607
+ .cd-lang {
2608
+ font-size: 0.85em;
2609
+ text-transform: uppercase;
2610
+ letter-spacing: 0.18em;
2611
+ color: var(--accent);
2612
+ }
2613
+ .cd-stats {
2614
+ margin-left: auto;
2615
+ display: inline-flex;
2616
+ gap: 0.7rem;
2617
+ font-variant-numeric: tabular-nums;
2618
+ }
2619
+ .cd-stats .cd-adds { color: var(--accent); }
2620
+ .cd-stats .cd-removes { color: var(--red); }
2621
+ .cd-body {
2622
+ margin: 0;
2623
+ padding: clamp(0.8rem, 1.4vw, 1.2rem) 0;
2624
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
2625
+ line-height: 1.55;
2626
+ background: transparent;
2627
+ overflow-x: auto;
2628
+ white-space: pre;
2629
+ }
2630
+ .cd-line {
2631
+ display: grid;
2632
+ grid-template-columns: 2ch 1fr;
2633
+ gap: 1rem;
2634
+ padding: 0 clamp(0.8rem, 1.4vw, 1.2rem);
2635
+ opacity: 0;
2636
+ transform: translateX(-4px);
2637
+ transition: opacity 400ms ease-out, transform 400ms cubic-bezier(0.16, 1, 0.3, 1);
2638
+ }
2639
+ .cd-line.in { opacity: 1; transform: translateX(0); }
2640
+ .cd-marker {
2641
+ font-variant-numeric: tabular-nums;
2642
+ user-select: none;
2643
+ font-weight: 500;
2644
+ }
2645
+ .cd-text {
2646
+ white-space: pre;
2647
+ }
2648
+ .cd-line--add {
2649
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
2650
+ box-shadow: inset 2px 0 0 var(--accent);
2651
+ }
2652
+ .cd-line--add .cd-marker { color: var(--accent); }
2653
+ .cd-line--add .cd-text { color: color-mix(in srgb, var(--accent) 30%, var(--fg)); }
2654
+ .cd-line--remove {
2655
+ background: color-mix(in srgb, var(--red) 10%, transparent);
2656
+ box-shadow: inset 2px 0 0 var(--red);
2657
+ }
2658
+ .cd-line--remove .cd-marker { color: var(--red); }
2659
+ .cd-line--remove .cd-text { color: color-mix(in srgb, var(--red) 30%, var(--fg)); text-decoration: line-through; text-decoration-color: color-mix(in srgb, var(--red) 40%, transparent); }
2660
+ .cd-line--context .cd-marker { color: var(--dim); }
2661
+ .cd-line--context .cd-text { color: var(--dim); }
2662
+
2663
+ /* === inlined: themes/phosphor/components-business.css === */
2664
+ /* Stagecraft — Phosphor theme: business / marketing components. */
2665
+
2666
+ /* ---------------------------------------------------------------------------
2667
+ * Pricing
2668
+ * ------------------------------------------------------------------------- */
2669
+ .pricing {
2670
+ display: grid;
2671
+ gap: clamp(1rem, 2vw, 1.6rem);
2672
+ width: min(1300px, 94vw);
2673
+ align-items: stretch;
2674
+ }
2675
+ .pricing--cols-1 { grid-template-columns: 1fr; max-width: 480px; }
2676
+ .pricing--cols-2 { grid-template-columns: repeat(2, 1fr); }
2677
+ .pricing--cols-3 { grid-template-columns: repeat(3, 1fr); }
2678
+ .pricing--cols-4 { grid-template-columns: repeat(4, 1fr); }
2679
+
2680
+ .pricing-tier {
2681
+ position: relative;
2682
+ display: flex;
2683
+ flex-direction: column;
2684
+ gap: clamp(0.7rem, 1.4vw, 1.2rem);
2685
+ padding: clamp(1.3rem, 2.6vw, 2rem);
2686
+ background: var(--bg-elevated);
2687
+ border: 1px solid var(--dim-2);
2688
+ opacity: 0;
2689
+ transform: translateY(14px);
2690
+ transition:
2691
+ opacity 700ms ease-out,
2692
+ transform 800ms cubic-bezier(0.16, 1, 0.3, 1),
2693
+ border-color 500ms ease,
2694
+ box-shadow 500ms ease;
2695
+ }
2696
+ .pricing-tier.in { opacity: 1; transform: translateY(0); }
2697
+
2698
+ .pricing-tier--featured {
2699
+ border-color: var(--accent);
2700
+ box-shadow:
2701
+ 0 0 0 1px var(--accent),
2702
+ 0 0 40px -10px var(--accent-glow);
2703
+ transform: translateY(14px) scale(1.04);
2704
+ z-index: 1;
2705
+ }
2706
+ .pricing-tier--featured.in { transform: translateY(0) scale(1.04); }
2707
+
2708
+ .pricing-badge {
2709
+ position: absolute;
2710
+ top: -0.8rem;
2711
+ left: 50%;
2712
+ transform: translateX(-50%);
2713
+ padding: 0.25rem 0.7rem;
2714
+ background: var(--accent);
2715
+ color: var(--bg);
2716
+ font-size: 0.7rem;
2717
+ letter-spacing: 0.15em;
2718
+ text-transform: uppercase;
2719
+ font-weight: 500;
2720
+ box-shadow: 0 0 24px -4px var(--accent-glow);
2721
+ }
2722
+
2723
+ .pricing-name {
2724
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
2725
+ letter-spacing: 0.12em;
2726
+ text-transform: uppercase;
2727
+ color: var(--dim);
2728
+ }
2729
+ .pricing-tier--featured .pricing-name { color: var(--accent); }
2730
+
2731
+ .pricing-figure {
2732
+ display: flex;
2733
+ align-items: baseline;
2734
+ gap: 0.25rem;
2735
+ line-height: 1;
2736
+ margin: 0.2rem 0 0.4rem;
2737
+ }
2738
+ .pricing-price {
2739
+ font-size: clamp(2.2rem, 4.5vw, 3.4rem);
2740
+ font-weight: 500;
2741
+ letter-spacing: -0.03em;
2742
+ color: var(--fg);
2743
+ }
2744
+ .pricing-tier--featured .pricing-price {
2745
+ color: var(--accent);
2746
+ text-shadow: 0 0 28px var(--accent-glow);
2747
+ }
2748
+ .pricing-period {
2749
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
2750
+ color: var(--dim);
2751
+ }
2752
+
2753
+ .pricing-features {
2754
+ list-style: none;
2755
+ margin: 0;
2756
+ padding: 0;
2757
+ display: flex;
2758
+ flex-direction: column;
2759
+ gap: 0.55rem;
2760
+ }
2761
+ .pricing-feature {
2762
+ display: flex;
2763
+ align-items: flex-start;
2764
+ gap: 0.55rem;
2765
+ font-size: clamp(0.9rem, 1.15vw, 1.05rem);
2766
+ color: var(--fg);
2767
+ line-height: 1.4;
2768
+ }
2769
+ .pricing-check {
2770
+ font-size: 1.1rem;
2771
+ color: var(--accent);
2772
+ flex: 0 0 auto;
2773
+ margin-top: 0.1em;
2774
+ }
2775
+
2776
+ .pricing-cta {
2777
+ margin-top: auto;
2778
+ padding: 0.7rem 1rem;
2779
+ border: 1px solid var(--dim-2);
2780
+ display: flex;
2781
+ justify-content: center;
2782
+ align-items: center;
2783
+ gap: 0.4rem;
2784
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
2785
+ color: var(--fg);
2786
+ letter-spacing: 0.08em;
2787
+ text-transform: uppercase;
2788
+ transition: border-color 400ms ease, background 400ms ease;
2789
+ }
2790
+ .pricing-tier--featured .pricing-cta {
2791
+ border-color: var(--accent);
2792
+ background: var(--accent-soft);
2793
+ color: var(--accent);
2794
+ }
2795
+ .pricing-cta-arrow { font-size: 1.1rem; }
2796
+
2797
+ @media (max-width: 800px) {
2798
+ .pricing--cols-3, .pricing--cols-4 { grid-template-columns: 1fr; }
2799
+ .pricing-tier--featured, .pricing-tier--featured.in { transform: translateY(0) scale(1); }
2800
+ }
2801
+
2802
+ /* ---------------------------------------------------------------------------
2803
+ * Testimonial
2804
+ * ------------------------------------------------------------------------- */
2805
+ .testimonial {
2806
+ display: grid;
2807
+ grid-template-columns: minmax(0, 280px) 1fr;
2808
+ align-items: center;
2809
+ gap: clamp(2rem, 5vw, 4rem);
2810
+ width: min(1200px, 94vw);
2811
+ }
2812
+ .testimonial-photo-wrap {
2813
+ width: clamp(180px, 22vw, 280px);
2814
+ aspect-ratio: 1;
2815
+ border-radius: 50%;
2816
+ overflow: hidden;
2817
+ background: var(--bg-elevated);
2818
+ border: 1px solid var(--dim-2);
2819
+ opacity: 0;
2820
+ transform: scale(0.85);
2821
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
2822
+ box-shadow: 0 0 40px -10px var(--accent-glow);
2823
+ }
2824
+ .testimonial-photo-wrap.in { opacity: 1; transform: scale(1); }
2825
+ .testimonial-photo {
2826
+ width: 100%;
2827
+ height: 100%;
2828
+ object-fit: cover;
2829
+ filter: saturate(0.9) contrast(1.05);
2830
+ }
2831
+
2832
+ .testimonial-body {
2833
+ display: flex;
2834
+ flex-direction: column;
2835
+ gap: clamp(0.8rem, 1.8vw, 1.4rem);
2836
+ position: relative;
2837
+ }
2838
+ .testimonial-mark {
2839
+ font-size: clamp(3rem, 6vw, 5rem);
2840
+ color: var(--accent);
2841
+ text-shadow: 0 0 30px var(--accent-glow);
2842
+ line-height: 0.7;
2843
+ opacity: 0;
2844
+ transform: scale(0.6);
2845
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.34, 1.56, 0.64, 1);
2846
+ }
2847
+ .testimonial-mark.in { opacity: 1; transform: scale(1); }
2848
+
2849
+ .testimonial-quote {
2850
+ margin: 0;
2851
+ font-size: clamp(1.4rem, 2.6vw, 2.2rem);
2852
+ font-style: italic;
2853
+ line-height: 1.3;
2854
+ color: var(--fg);
2855
+ letter-spacing: -0.01em;
2856
+ opacity: 0;
2857
+ transform: translateY(12px);
2858
+ transition: opacity 900ms ease-out, transform 1000ms cubic-bezier(0.16, 1, 0.3, 1);
2859
+ }
2860
+ .testimonial-quote.in { opacity: 1; transform: translateY(0); }
2861
+
2862
+ .testimonial-meta {
2863
+ display: flex;
2864
+ flex-direction: column;
2865
+ gap: 0.2rem;
2866
+ opacity: 0;
2867
+ transform: translateY(8px);
2868
+ transition: opacity 700ms ease-out, transform 800ms ease-out;
2869
+ position: relative;
2870
+ }
2871
+ .testimonial-meta.in { opacity: 1; transform: translateY(0); }
2872
+ .testimonial-author {
2873
+ font-size: clamp(1rem, 1.3vw, 1.15rem);
2874
+ color: var(--fg);
2875
+ font-weight: 500;
2876
+ }
2877
+ .testimonial-affil {
2878
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
2879
+ color: var(--dim);
2880
+ }
2881
+ .testimonial-sep { color: var(--dim-2); margin: 0 0.3rem; }
2882
+ .testimonial-logo {
2883
+ position: absolute;
2884
+ right: 0;
2885
+ top: 50%;
2886
+ transform: translateY(-50%);
2887
+ height: 2rem;
2888
+ opacity: 0.55;
2889
+ filter: grayscale(1);
2890
+ }
2891
+
2892
+ @media (max-width: 800px) {
2893
+ .testimonial { grid-template-columns: 1fr; justify-items: center; text-align: center; }
2894
+ .testimonial-meta { align-items: center; }
2895
+ .testimonial-logo { position: static; transform: none; margin-top: 0.6rem; }
2896
+ }
2897
+
2898
+ /* ---------------------------------------------------------------------------
2899
+ * TeamGrid
2900
+ * ------------------------------------------------------------------------- */
2901
+ .team-grid {
2902
+ display: grid;
2903
+ gap: clamp(1.2rem, 2.2vw, 2rem);
2904
+ width: min(1300px, 94vw);
2905
+ }
2906
+ .team-grid--cols-2 { grid-template-columns: repeat(2, 1fr); }
2907
+ .team-grid--cols-3 { grid-template-columns: repeat(3, 1fr); }
2908
+ .team-grid--cols-4 { grid-template-columns: repeat(4, 1fr); }
2909
+
2910
+ .team-card {
2911
+ display: flex;
2912
+ flex-direction: column;
2913
+ align-items: center;
2914
+ text-align: center;
2915
+ gap: 0.5rem;
2916
+ padding: clamp(1rem, 2vw, 1.6rem);
2917
+ background: var(--bg-elevated);
2918
+ border: 1px solid var(--dim-2);
2919
+ opacity: 0;
2920
+ transform: translateY(14px);
2921
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 500ms ease;
2922
+ }
2923
+ .team-card.in { opacity: 1; transform: translateY(0); }
2924
+ .team-card:hover { border-color: var(--accent); }
2925
+
2926
+ .team-photo-wrap {
2927
+ width: clamp(80px, 9vw, 120px);
2928
+ aspect-ratio: 1;
2929
+ border-radius: 50%;
2930
+ overflow: hidden;
2931
+ background: var(--bg);
2932
+ border: 1px solid var(--dim-2);
2933
+ margin-bottom: 0.4rem;
2934
+ display: flex;
2935
+ align-items: center;
2936
+ justify-content: center;
2937
+ }
2938
+ .team-photo {
2939
+ width: 100%;
2940
+ height: 100%;
2941
+ object-fit: cover;
2942
+ filter: saturate(0.9) contrast(1.04);
2943
+ }
2944
+ .team-photo--placeholder {
2945
+ font-size: clamp(2.5rem, 4vw, 3.5rem);
2946
+ color: var(--dim);
2947
+ }
2948
+
2949
+ .team-name {
2950
+ font-size: clamp(1rem, 1.3vw, 1.2rem);
2951
+ font-weight: 500;
2952
+ color: var(--fg);
2953
+ letter-spacing: -0.01em;
2954
+ }
2955
+ .team-role {
2956
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
2957
+ color: var(--accent);
2958
+ letter-spacing: 0.08em;
2959
+ text-transform: uppercase;
2960
+ }
2961
+ .team-bio {
2962
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
2963
+ color: var(--dim);
2964
+ line-height: 1.45;
2965
+ margin-top: 0.3rem;
2966
+ }
2967
+ .team-social {
2968
+ margin-top: auto;
2969
+ padding-top: 0.6rem;
2970
+ display: flex;
2971
+ gap: 0.7rem;
2972
+ }
2973
+ .team-social-icon {
2974
+ font-size: 1.1rem;
2975
+ color: var(--dim);
2976
+ transition: color 300ms ease;
2977
+ cursor: default;
2978
+ }
2979
+ .team-social-icon:hover { color: var(--accent); }
2980
+
2981
+ @media (max-width: 900px) {
2982
+ .team-grid--cols-3, .team-grid--cols-4 { grid-template-columns: repeat(2, 1fr); }
2983
+ }
2984
+ @media (max-width: 540px) {
2985
+ .team-grid--cols-2, .team-grid--cols-3, .team-grid--cols-4 { grid-template-columns: 1fr; }
2986
+ }
2987
+
2988
+ /* ---------------------------------------------------------------------------
2989
+ * Agenda
2990
+ * ------------------------------------------------------------------------- */
2991
+ .agenda {
2992
+ position: relative;
2993
+ display: flex;
2994
+ flex-direction: column;
2995
+ gap: clamp(0.8rem, 1.6vw, 1.4rem);
2996
+ width: min(900px, 92vw);
2997
+ padding-left: clamp(5rem, 10vw, 8rem);
2998
+ }
2999
+ .agenda-rail {
3000
+ position: absolute;
3001
+ left: clamp(5rem, 10vw, 8rem);
3002
+ top: 0.6rem;
3003
+ bottom: 0.6rem;
3004
+ width: 1px;
3005
+ background: linear-gradient(to bottom, transparent, var(--dim-2) 12%, var(--dim-2) 88%, transparent);
3006
+ }
3007
+ .agenda-item {
3008
+ position: relative;
3009
+ display: grid;
3010
+ grid-template-columns: clamp(5rem, 10vw, 8rem) auto 1fr;
3011
+ align-items: center;
3012
+ gap: clamp(0.8rem, 1.4vw, 1.2rem);
3013
+ margin-left: calc(-1 * clamp(5rem, 10vw, 8rem));
3014
+ opacity: 0;
3015
+ transform: translateX(-12px);
3016
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
3017
+ }
3018
+ .agenda-item.in { opacity: 1; transform: translateX(0); }
3019
+ .agenda-time {
3020
+ font-size: clamp(0.85rem, 1.15vw, 1rem);
3021
+ color: var(--accent);
3022
+ text-align: right;
3023
+ font-variant-numeric: tabular-nums;
3024
+ letter-spacing: 0.05em;
3025
+ }
3026
+ .agenda-dot {
3027
+ width: 2.2rem;
3028
+ height: 2.2rem;
3029
+ border-radius: 50%;
3030
+ background: var(--bg-elevated);
3031
+ border: 1px solid var(--accent);
3032
+ box-shadow: 0 0 16px -2px var(--accent-glow);
3033
+ display: flex;
3034
+ align-items: center;
3035
+ justify-content: center;
3036
+ position: relative;
3037
+ z-index: 1;
3038
+ flex: 0 0 auto;
3039
+ }
3040
+ .agenda-dot .material-symbols-outlined {
3041
+ font-size: 1.1rem;
3042
+ color: var(--accent);
3043
+ }
3044
+ .agenda-body {
3045
+ display: flex;
3046
+ flex-direction: column;
3047
+ gap: 0.1rem;
3048
+ }
3049
+ .agenda-label {
3050
+ font-size: clamp(1rem, 1.4vw, 1.25rem);
3051
+ color: var(--fg);
3052
+ font-weight: 500;
3053
+ letter-spacing: -0.01em;
3054
+ }
3055
+ .agenda-duration {
3056
+ font-size: clamp(0.75rem, 1vw, 0.9rem);
3057
+ color: var(--dim);
3058
+ letter-spacing: 0.08em;
3059
+ text-transform: uppercase;
3060
+ }
3061
+
3062
+ @media (max-width: 600px) {
3063
+ .agenda { padding-left: 0; }
3064
+ .agenda-rail { left: 4rem; }
3065
+ .agenda-item { grid-template-columns: 4rem auto 1fr; margin-left: 0; }
3066
+ }
3067
+
3068
+ /* ---------------------------------------------------------------------------
3069
+ * Checklist
3070
+ * ------------------------------------------------------------------------- */
3071
+ .checklist {
3072
+ display: flex;
3073
+ flex-direction: column;
3074
+ gap: clamp(0.6rem, 1.2vw, 1rem);
3075
+ width: min(800px, 92vw);
3076
+ }
3077
+ .checklist-item {
3078
+ display: flex;
3079
+ align-items: flex-start;
3080
+ gap: 0.8rem;
3081
+ padding: clamp(0.7rem, 1.3vw, 1rem) clamp(0.8rem, 1.6vw, 1.2rem);
3082
+ background: var(--bg-elevated);
3083
+ border: 1px solid var(--dim-2);
3084
+ opacity: 0;
3085
+ transform: translateY(8px);
3086
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1), border-color 400ms ease;
3087
+ }
3088
+ .checklist-item.in { opacity: 1; transform: translateY(0); }
3089
+ .checklist-item.is-done { border-color: rgba(0, 255, 156, 0.25); }
3090
+ .checklist-box {
3091
+ font-size: 1.5rem;
3092
+ color: var(--dim);
3093
+ flex: 0 0 auto;
3094
+ transition: color 400ms ease;
3095
+ line-height: 1.1;
3096
+ }
3097
+ .checklist-item.is-done .checklist-box {
3098
+ color: var(--accent);
3099
+ text-shadow: 0 0 12px var(--accent-glow);
3100
+ }
3101
+ .checklist-body {
3102
+ display: flex;
3103
+ flex-direction: column;
3104
+ gap: 0.2rem;
3105
+ }
3106
+ .checklist-text {
3107
+ font-size: clamp(1rem, 1.35vw, 1.2rem);
3108
+ color: var(--fg);
3109
+ letter-spacing: -0.01em;
3110
+ line-height: 1.35;
3111
+ }
3112
+ .checklist-item.is-done .checklist-text { color: var(--dim); }
3113
+ .checklist-sub {
3114
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
3115
+ color: var(--dim);
3116
+ line-height: 1.45;
3117
+ }
3118
+
3119
+ /* ---------------------------------------------------------------------------
3120
+ * Steps
3121
+ * ------------------------------------------------------------------------- */
3122
+ .steps {
3123
+ display: grid;
3124
+ gap: clamp(1rem, 2vw, 1.8rem);
3125
+ width: min(1300px, 94vw);
3126
+ }
3127
+ .steps--horizontal { grid-auto-flow: column; grid-auto-columns: 1fr; }
3128
+ .steps--vertical { grid-auto-flow: row; max-width: 720px; }
3129
+
3130
+ .step-card {
3131
+ position: relative;
3132
+ display: grid;
3133
+ grid-template-columns: auto 1fr;
3134
+ gap: clamp(0.8rem, 1.5vw, 1.4rem);
3135
+ padding: clamp(1.1rem, 2.2vw, 1.8rem);
3136
+ background: var(--bg-elevated);
3137
+ border: 1px solid var(--dim-2);
3138
+ align-items: start;
3139
+ opacity: 0;
3140
+ transform: translateY(14px);
3141
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 400ms ease;
3142
+ }
3143
+ .step-card.in { opacity: 1; transform: translateY(0); }
3144
+ .step-card:hover { border-color: var(--accent); }
3145
+
3146
+ .steps--horizontal .step-card { grid-template-columns: 1fr; grid-template-rows: auto auto; }
3147
+
3148
+ .step-numeral {
3149
+ font-size: clamp(2.5rem, 5vw, 4.2rem);
3150
+ font-weight: 500;
3151
+ letter-spacing: -0.05em;
3152
+ line-height: 0.9;
3153
+ color: var(--accent);
3154
+ text-shadow: 0 0 28px var(--accent-glow);
3155
+ font-variant-numeric: tabular-nums;
3156
+ }
3157
+
3158
+ .step-content {
3159
+ display: flex;
3160
+ flex-direction: column;
3161
+ gap: 0.4rem;
3162
+ min-width: 0;
3163
+ }
3164
+ .step-head {
3165
+ display: flex;
3166
+ align-items: center;
3167
+ gap: 0.5rem;
3168
+ }
3169
+ .step-icon {
3170
+ font-size: 1.3rem;
3171
+ color: var(--dim);
3172
+ }
3173
+ .step-label {
3174
+ font-size: clamp(1.05rem, 1.5vw, 1.4rem);
3175
+ font-weight: 500;
3176
+ color: var(--fg);
3177
+ letter-spacing: -0.015em;
3178
+ line-height: 1.2;
3179
+ }
3180
+ .step-body {
3181
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
3182
+ color: var(--dim);
3183
+ line-height: 1.5;
3184
+ }
3185
+
3186
+ @media (max-width: 800px) {
3187
+ .steps--horizontal { grid-auto-flow: row; grid-auto-columns: auto; }
3188
+ .steps--horizontal .step-card { grid-template-columns: auto 1fr; }
3189
+ }
3190
+
3191
+ /* ---------------------------------------------------------------------------
3192
+ * CTA
3193
+ * ------------------------------------------------------------------------- */
3194
+ .cta {
3195
+ display: flex;
3196
+ flex-direction: column;
3197
+ align-items: flex-start;
3198
+ gap: clamp(1rem, 2vw, 1.6rem);
3199
+ width: min(900px, 92vw);
3200
+ padding: clamp(2rem, 4vw, 3.5rem);
3201
+ background: var(--bg-elevated);
3202
+ border: 1px solid var(--dim-2);
3203
+ position: relative;
3204
+ }
3205
+ .cta--accent {
3206
+ border-color: var(--accent);
3207
+ box-shadow: 0 0 50px -10px var(--accent-glow);
3208
+ background:
3209
+ linear-gradient(135deg, var(--accent-soft), transparent 50%),
3210
+ var(--bg-elevated);
3211
+ }
3212
+ .cta-headline {
3213
+ font-size: clamp(1.8rem, 4vw, 3rem);
3214
+ font-weight: 500;
3215
+ letter-spacing: -0.03em;
3216
+ line-height: 1.1;
3217
+ color: var(--fg);
3218
+ opacity: 0;
3219
+ transform: translateY(14px);
3220
+ transition: opacity 800ms ease-out, transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
3221
+ }
3222
+ .cta-headline.in { opacity: 1; transform: translateY(0); }
3223
+ .cta--accent .cta-headline { color: var(--fg); }
3224
+
3225
+ .cta-body {
3226
+ font-size: clamp(1rem, 1.4vw, 1.25rem);
3227
+ color: var(--dim);
3228
+ line-height: 1.5;
3229
+ max-width: 50ch;
3230
+ opacity: 0;
3231
+ transform: translateY(10px);
3232
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
3233
+ }
3234
+ .cta-body.in { opacity: 1; transform: translateY(0); }
3235
+
3236
+ .cta-action {
3237
+ display: flex;
3238
+ align-items: center;
3239
+ gap: 1rem;
3240
+ margin-top: 0.4rem;
3241
+ opacity: 0;
3242
+ transform: translateY(8px);
3243
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
3244
+ }
3245
+ .cta-action.in { opacity: 1; transform: translateY(0); }
3246
+
3247
+ .cta-button {
3248
+ display: inline-flex;
3249
+ align-items: center;
3250
+ gap: 0.5rem;
3251
+ padding: 0.8rem 1.4rem;
3252
+ border: 1px solid var(--accent);
3253
+ color: var(--accent);
3254
+ background: transparent;
3255
+ font-size: clamp(0.9rem, 1.2vw, 1.05rem);
3256
+ letter-spacing: 0.1em;
3257
+ text-transform: uppercase;
3258
+ transition: background 300ms ease, color 300ms ease, transform 300ms ease, box-shadow 300ms ease;
3259
+ }
3260
+ .cta--accent .cta-button {
3261
+ background: var(--accent);
3262
+ color: var(--bg);
3263
+ box-shadow: 0 0 30px -5px var(--accent-glow);
3264
+ }
3265
+ .cta-button-arrow { font-size: 1.2rem; }
3266
+ .cta-hint {
3267
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
3268
+ color: var(--dim);
3269
+ letter-spacing: 0.05em;
3270
+ }
3271
+
3272
+ /* ---------------------------------------------------------------------------
3273
+ * Callout (shared base) + Tip
3274
+ * ------------------------------------------------------------------------- */
3275
+ .callout {
3276
+ display: grid;
3277
+ grid-template-columns: auto 1fr;
3278
+ align-items: flex-start;
3279
+ gap: clamp(0.8rem, 1.5vw, 1.2rem);
3280
+ width: min(900px, 92vw);
3281
+ padding: clamp(1.1rem, 2.2vw, 1.8rem) clamp(1.2rem, 2.4vw, 2rem);
3282
+ background: var(--bg-elevated);
3283
+ border-left: 4px solid var(--dim-2);
3284
+ opacity: 0;
3285
+ transform: translateX(-12px);
3286
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
3287
+ }
3288
+ .callout.in { opacity: 1; transform: translateX(0); }
3289
+ .callout-icon {
3290
+ font-size: clamp(1.6rem, 2.6vw, 2.2rem);
3291
+ line-height: 1;
3292
+ flex: 0 0 auto;
3293
+ margin-top: 0.05em;
3294
+ }
3295
+ .callout-body {
3296
+ display: flex;
3297
+ flex-direction: column;
3298
+ gap: 0.4rem;
3299
+ }
3300
+ .callout-heading {
3301
+ font-size: clamp(1.05rem, 1.5vw, 1.35rem);
3302
+ font-weight: 500;
3303
+ letter-spacing: -0.01em;
3304
+ }
3305
+ .callout-text {
3306
+ font-size: clamp(0.95rem, 1.25vw, 1.1rem);
3307
+ color: var(--fg);
3308
+ line-height: 1.5;
3309
+ opacity: 0.9;
3310
+ }
3311
+ .callout--info { border-left-color: var(--blue); background: linear-gradient(90deg, rgba(24, 158, 255, 0.08), transparent 40%), var(--bg-elevated); }
3312
+ .callout--info .callout-icon, .callout--info .callout-heading { color: var(--blue); }
3313
+ .callout--tip { border-left-color: var(--accent); background: linear-gradient(90deg, var(--accent-soft), transparent 40%), var(--bg-elevated); }
3314
+ .callout--tip .callout-icon, .callout--tip .callout-heading { color: var(--accent); }
3315
+ .callout--warning { border-left-color: var(--amber); background: linear-gradient(90deg, rgba(255, 180, 84, 0.1), transparent 40%), var(--bg-elevated); }
3316
+ .callout--warning .callout-icon, .callout--warning .callout-heading { color: var(--amber); }
3317
+ .callout--danger { border-left-color: var(--red); background: linear-gradient(90deg, rgba(255, 92, 92, 0.1), transparent 40%), var(--bg-elevated); }
3318
+ .callout--danger .callout-icon, .callout--danger .callout-heading { color: var(--red); }
3319
+ .callout--success { border-left-color: var(--accent); background: linear-gradient(90deg, rgba(0, 255, 156, 0.18), transparent 50%), var(--bg-elevated); }
3320
+ .callout--success .callout-icon, .callout--success .callout-heading { color: var(--accent); }
3321
+ .callout--success .callout-icon { text-shadow: 0 0 18px var(--accent-glow); }
3322
+
3323
+ /* Tip — compact single-paragraph emphasis */
3324
+ .tip {
3325
+ display: grid;
3326
+ grid-template-columns: auto 1fr;
3327
+ align-items: center;
3328
+ gap: 0.8rem;
3329
+ width: min(720px, 92vw);
3330
+ padding: 0.9rem 1.2rem;
3331
+ background: var(--bg-elevated);
3332
+ border: 1px solid var(--dim-2);
3333
+ opacity: 0;
3334
+ transform: translateY(8px);
3335
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
3336
+ }
3337
+ .tip.in { opacity: 1; transform: translateY(0); }
3338
+ .tip-icon {
3339
+ font-size: clamp(1.4rem, 2vw, 1.8rem);
3340
+ flex: 0 0 auto;
3341
+ }
3342
+ .tip-body {
3343
+ margin: 0;
3344
+ font-size: clamp(0.95rem, 1.25vw, 1.15rem);
3345
+ color: var(--fg);
3346
+ line-height: 1.4;
3347
+ }
3348
+ .tip--info { border-color: rgba(24, 158, 255, 0.4); }
3349
+ .tip--info .tip-icon { color: var(--blue); }
3350
+ .tip--tip { border-color: rgba(0, 255, 156, 0.35); }
3351
+ .tip--tip .tip-icon { color: var(--accent); }
3352
+ .tip--warning { border-color: rgba(255, 180, 84, 0.4); }
3353
+ .tip--warning .tip-icon { color: var(--amber); }
3354
+ .tip--danger { border-color: rgba(255, 92, 92, 0.4); }
3355
+ .tip--danger .tip-icon { color: var(--red); }
3356
+ .tip--success {
3357
+ border-color: var(--accent);
3358
+ background: linear-gradient(135deg, var(--accent-soft), transparent 60%), var(--bg-elevated);
3359
+ }
3360
+ .tip--success .tip-icon { color: var(--accent); text-shadow: 0 0 14px var(--accent-glow); }
3361
+
3362
+ /* ---------------------------------------------------------------------------
3363
+ * BeforeAfter
3364
+ * ------------------------------------------------------------------------- */
3365
+ .before-after--text {
3366
+ display: grid;
3367
+ grid-template-columns: 1fr auto 1fr;
3368
+ align-items: stretch;
3369
+ gap: clamp(1rem, 2vw, 2rem);
3370
+ width: min(1200px, 94vw);
3371
+ }
3372
+ .ba-col {
3373
+ display: flex;
3374
+ flex-direction: column;
3375
+ gap: 0.8rem;
3376
+ padding: clamp(1.3rem, 2.5vw, 2rem);
3377
+ background: var(--bg-elevated);
3378
+ border: 1px solid var(--dim-2);
3379
+ opacity: 0;
3380
+ transform: translateY(14px);
3381
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
3382
+ }
3383
+ .ba-col.in { opacity: 1; transform: translateY(0); }
3384
+ .ba-col.ba-after { border-color: rgba(0, 255, 156, 0.3); }
3385
+ .ba-col-tag {
3386
+ font-size: clamp(0.8rem, 1.05vw, 0.95rem);
3387
+ letter-spacing: 0.18em;
3388
+ text-transform: uppercase;
3389
+ color: var(--dim);
3390
+ }
3391
+ .ba-col-tag--accent { color: var(--accent); }
3392
+ .ba-col-text {
3393
+ font-size: clamp(1.05rem, 1.6vw, 1.45rem);
3394
+ color: var(--fg);
3395
+ line-height: 1.4;
3396
+ letter-spacing: -0.01em;
3397
+ }
3398
+ .ba-after .ba-col-text { color: var(--fg); }
3399
+ .ba-arrow {
3400
+ align-self: center;
3401
+ font-size: clamp(2rem, 3.5vw, 2.8rem);
3402
+ color: var(--accent);
3403
+ text-shadow: 0 0 22px var(--accent-glow);
3404
+ opacity: 0;
3405
+ transform: translateX(-10px);
3406
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
3407
+ }
3408
+ .ba-arrow.in { opacity: 1; transform: translateX(0); }
3409
+
3410
+ .before-after--image {
3411
+ position: relative;
3412
+ width: min(1200px, 94vw);
3413
+ aspect-ratio: 16 / 9;
3414
+ background: var(--bg-elevated);
3415
+ border: 1px solid var(--dim-2);
3416
+ overflow: hidden;
3417
+ }
3418
+ .before-after--image .ba-pane {
3419
+ position: absolute;
3420
+ inset: 0;
3421
+ opacity: 0;
3422
+ transition: opacity 700ms ease-out;
3423
+ }
3424
+ .before-after--image .ba-pane.in { opacity: 1; }
3425
+ .before-after--image .ba-img {
3426
+ width: 100%;
3427
+ height: 100%;
3428
+ object-fit: cover;
3429
+ display: block;
3430
+ filter: saturate(0.9) contrast(1.05);
3431
+ }
3432
+ .before-after--image .ba-before { z-index: 1; }
3433
+ .before-after--image .ba-after {
3434
+ z-index: 2;
3435
+ clip-path: polygon(0 0, var(--ba-clip, 0%) 0, calc(var(--ba-clip, 0%) + 4%) 100%, 0 100%);
3436
+ transition: opacity 700ms ease-out, clip-path 1200ms cubic-bezier(0.16, 1, 0.3, 1);
3437
+ }
3438
+ .before-after--image .ba-after .ba-img { filter: saturate(1.05) contrast(1.08); }
3439
+ .ba-label {
3440
+ position: absolute;
3441
+ bottom: 1rem;
3442
+ padding: 0.4rem 0.8rem;
3443
+ z-index: 3;
3444
+ }
3445
+ .ba-label--left { left: 1rem; }
3446
+ .ba-label--right { right: 1rem; }
3447
+ .ba-tag {
3448
+ display: inline-block;
3449
+ padding: 0.35rem 0.7rem;
3450
+ background: rgba(10, 10, 10, 0.7);
3451
+ border: 1px solid var(--dim-2);
3452
+ color: var(--fg);
3453
+ font-size: clamp(0.75rem, 1vw, 0.9rem);
3454
+ letter-spacing: 0.15em;
3455
+ text-transform: uppercase;
3456
+ backdrop-filter: blur(4px);
3457
+ }
3458
+ .ba-tag--accent {
3459
+ color: var(--accent);
3460
+ border-color: var(--accent);
3461
+ box-shadow: 0 0 18px -4px var(--accent-glow);
3462
+ }
3463
+ .before-after--image .ba-divider {
3464
+ position: absolute;
3465
+ top: 0;
3466
+ bottom: 0;
3467
+ left: var(--ba-clip, 0%);
3468
+ width: 2px;
3469
+ background: var(--accent);
3470
+ box-shadow: 0 0 18px var(--accent-glow);
3471
+ transform: skewX(-6deg);
3472
+ z-index: 4;
3473
+ pointer-events: none;
3474
+ transition: left 1200ms cubic-bezier(0.16, 1, 0.3, 1);
3475
+ }
3476
+
3477
+ @media (max-width: 800px) {
3478
+ .before-after--text { grid-template-columns: 1fr; }
3479
+ .ba-arrow { transform: rotate(90deg); justify-self: center; }
3480
+ .ba-arrow.in { transform: rotate(90deg); }
3481
+ }
3482
+
3483
+ /* === inlined: themes/phosphor/components-content.css === */
3484
+ /* Stagecraft — Phosphor theme: content/typography components. */
3485
+
3486
+ /* ---------------------------------------------------------------------------
3487
+ * Statement
3488
+ * ------------------------------------------------------------------------- */
3489
+ .statement-host {
3490
+ padding: clamp(2rem, 5vw, 4rem);
3491
+ }
3492
+ .statement {
3493
+ width: min(1500px, 92vw);
3494
+ text-align: center;
3495
+ }
3496
+ .statement-text {
3497
+ margin: 0;
3498
+ font-size: clamp(3rem, 9vw, 9rem);
3499
+ font-weight: 500;
3500
+ letter-spacing: -0.04em;
3501
+ line-height: 1.02;
3502
+ color: var(--fg);
3503
+ /* word spans need to be inline-block so transform works */
3504
+ }
3505
+ .statement .st-word {
3506
+ display: inline-block;
3507
+ opacity: 0;
3508
+ transform: translateY(14px);
3509
+ filter: blur(6px);
3510
+ transition:
3511
+ opacity 600ms ease-out,
3512
+ transform 700ms cubic-bezier(0.16, 1, 0.3, 1),
3513
+ filter 600ms ease-out;
3514
+ }
3515
+ .statement .st-word.in {
3516
+ opacity: 1;
3517
+ transform: translateY(0);
3518
+ filter: blur(0);
3519
+ }
3520
+ .statement .st-em {
3521
+ color: var(--accent);
3522
+ text-shadow: 0 0 30px var(--accent-glow);
3523
+ }
3524
+ .statement .st-em--amber { color: var(--amber); text-shadow: 0 0 22px rgba(255, 180, 84, 0.35); }
3525
+ .statement .st-em--blue { color: var(--blue); text-shadow: 0 0 24px rgba(24, 158, 255, 0.4); }
3526
+
3527
+ /* ---------------------------------------------------------------------------
3528
+ * QandA
3529
+ * ------------------------------------------------------------------------- */
3530
+ .qanda {
3531
+ width: min(1200px, 92vw);
3532
+ display: flex;
3533
+ flex-direction: column;
3534
+ align-items: center;
3535
+ text-align: center;
3536
+ gap: clamp(1.5rem, 4vw, 3rem);
3537
+ }
3538
+ .qa-q {
3539
+ font-size: clamp(1.6rem, 3.5vw, 2.6rem);
3540
+ font-style: italic;
3541
+ font-weight: 400;
3542
+ color: var(--amber);
3543
+ letter-spacing: -0.01em;
3544
+ line-height: 1.25;
3545
+ max-width: 28ch;
3546
+ opacity: 0;
3547
+ transform: translateY(12px);
3548
+ transition: opacity 800ms ease-out, transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
3549
+ }
3550
+ .qa-q::before { content: '? '; color: var(--dim-2); font-style: normal; }
3551
+ .qa-q.in { opacity: 1; transform: translateY(0); }
3552
+
3553
+ .qa-a {
3554
+ font-size: clamp(2.5rem, 6.5vw, 5.5rem);
3555
+ font-weight: 500;
3556
+ color: var(--accent);
3557
+ letter-spacing: -0.03em;
3558
+ line-height: 1.05;
3559
+ text-shadow: 0 0 40px var(--accent-glow);
3560
+ max-width: 22ch;
3561
+ opacity: 0;
3562
+ transform: translateY(20px) scale(0.98);
3563
+ transition: opacity 900ms ease-out, transform 1100ms cubic-bezier(0.16, 1, 0.3, 1);
3564
+ }
3565
+ .qa-a.in { opacity: 1; transform: translateY(0) scale(1); }
3566
+
3567
+ .qa-attr {
3568
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
3569
+ color: var(--dim);
3570
+ letter-spacing: 0.08em;
3571
+ text-transform: uppercase;
3572
+ opacity: 0;
3573
+ transition: opacity 800ms ease-out;
3574
+ }
3575
+ .qa-attr.in { opacity: 1; }
3576
+
3577
+ /* ---------------------------------------------------------------------------
3578
+ * Manifesto
3579
+ * ------------------------------------------------------------------------- */
3580
+ .manifesto {
3581
+ width: min(1300px, 92vw);
3582
+ display: flex;
3583
+ flex-direction: column;
3584
+ gap: clamp(1rem, 2.5vw, 2rem);
3585
+ }
3586
+ .mf-intro {
3587
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
3588
+ color: var(--dim);
3589
+ letter-spacing: 0.1em;
3590
+ text-transform: uppercase;
3591
+ opacity: 0;
3592
+ transform: translateY(6px);
3593
+ transition: opacity 700ms ease-out, transform 800ms ease-out;
3594
+ }
3595
+ .mf-intro.in { opacity: 1; transform: translateY(0); }
3596
+
3597
+ .mf-list {
3598
+ list-style: none;
3599
+ margin: 0;
3600
+ padding: 0;
3601
+ display: flex;
3602
+ flex-direction: column;
3603
+ gap: clamp(0.8rem, 1.6vw, 1.4rem);
3604
+ }
3605
+ .mf-item {
3606
+ display: grid;
3607
+ grid-template-columns: clamp(3rem, 6vw, 5rem) 1fr;
3608
+ align-items: baseline;
3609
+ gap: clamp(1rem, 2.5vw, 2rem);
3610
+ padding-bottom: clamp(0.6rem, 1.4vw, 1.1rem);
3611
+ border-bottom: 1px solid var(--dim-2);
3612
+ opacity: 0;
3613
+ transform: translateX(-14px);
3614
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 600ms ease;
3615
+ }
3616
+ .mf-item:last-child { border-bottom: none; }
3617
+ .mf-item.in { opacity: 1; transform: translateX(0); }
3618
+ .mf-item.in { border-color: var(--dim-2); }
3619
+
3620
+ .mf-num {
3621
+ font-size: clamp(1.5rem, 2.8vw, 2.2rem);
3622
+ font-weight: 300;
3623
+ color: var(--accent);
3624
+ font-variant-numeric: tabular-nums;
3625
+ letter-spacing: -0.02em;
3626
+ text-shadow: 0 0 18px var(--accent-glow);
3627
+ }
3628
+ .mf-text {
3629
+ font-size: clamp(1.4rem, 2.6vw, 2.2rem);
3630
+ color: var(--fg);
3631
+ font-weight: 400;
3632
+ line-height: 1.25;
3633
+ letter-spacing: -0.015em;
3634
+ }
3635
+ .mf-text .mf-em {
3636
+ color: var(--accent);
3637
+ font-weight: 500;
3638
+ }
3639
+
3640
+ /* ---------------------------------------------------------------------------
3641
+ * Punchline
3642
+ * ------------------------------------------------------------------------- */
3643
+ .punchline {
3644
+ width: min(1300px, 92vw);
3645
+ display: flex;
3646
+ flex-direction: column;
3647
+ align-items: center;
3648
+ text-align: center;
3649
+ gap: clamp(2rem, 5vw, 4rem);
3650
+ }
3651
+ .pl-buildup {
3652
+ display: flex;
3653
+ flex-direction: column;
3654
+ gap: clamp(0.6rem, 1.4vw, 1.1rem);
3655
+ }
3656
+ .pl-line {
3657
+ font-size: clamp(1.1rem, 1.8vw, 1.5rem);
3658
+ color: var(--dim);
3659
+ letter-spacing: -0.01em;
3660
+ line-height: 1.4;
3661
+ opacity: 0;
3662
+ transform: translateY(8px);
3663
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
3664
+ }
3665
+ .pl-line.in { opacity: 1; transform: translateY(0); }
3666
+
3667
+ .pl-payoff {
3668
+ font-size: clamp(3rem, 8vw, 7rem);
3669
+ font-weight: 500;
3670
+ color: var(--accent);
3671
+ letter-spacing: -0.04em;
3672
+ line-height: 1.05;
3673
+ text-shadow: 0 0 50px var(--accent-glow);
3674
+ max-width: 22ch;
3675
+ opacity: 0;
3676
+ transform: translateY(24px) scale(0.97);
3677
+ filter: blur(8px);
3678
+ transition:
3679
+ opacity 900ms ease-out,
3680
+ transform 1200ms cubic-bezier(0.16, 1, 0.3, 1),
3681
+ filter 800ms ease-out;
3682
+ }
3683
+ .pl-payoff.in { opacity: 1; transform: translateY(0) scale(1); filter: blur(0); }
3684
+
3685
+ /* ---------------------------------------------------------------------------
3686
+ * Definition
3687
+ * ------------------------------------------------------------------------- */
3688
+ .definition {
3689
+ width: min(1100px, 92vw);
3690
+ display: flex;
3691
+ flex-direction: column;
3692
+ gap: clamp(1rem, 2vw, 1.6rem);
3693
+ }
3694
+ .df-head {
3695
+ display: flex;
3696
+ align-items: baseline;
3697
+ gap: 0.6rem;
3698
+ border-bottom: 1px solid var(--dim-2);
3699
+ padding-bottom: clamp(0.6rem, 1.2vw, 1rem);
3700
+ }
3701
+ .df-term {
3702
+ margin: 0;
3703
+ font-size: clamp(4rem, 11vw, 9rem);
3704
+ font-weight: 500;
3705
+ letter-spacing: -0.04em;
3706
+ line-height: 1;
3707
+ color: var(--fg);
3708
+ opacity: 0;
3709
+ transform: translateY(14px);
3710
+ transition: opacity 800ms ease-out, transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
3711
+ }
3712
+ .df-term.in { opacity: 1; transform: translateY(0); }
3713
+ .df-pos {
3714
+ font-size: clamp(1rem, 1.6vw, 1.3rem);
3715
+ color: var(--dim);
3716
+ font-style: italic;
3717
+ letter-spacing: 0.04em;
3718
+ opacity: 0;
3719
+ transition: opacity 800ms ease-out;
3720
+ }
3721
+ .df-pos.in { opacity: 1; }
3722
+
3723
+ .df-def {
3724
+ margin: 0;
3725
+ font-size: clamp(1.4rem, 2.4vw, 2rem);
3726
+ font-weight: 400;
3727
+ color: var(--fg);
3728
+ line-height: 1.35;
3729
+ letter-spacing: -0.01em;
3730
+ opacity: 0;
3731
+ transform: translateY(10px);
3732
+ transition: opacity 800ms ease-out, transform 900ms ease-out;
3733
+ }
3734
+ .df-def.in { opacity: 1; transform: translateY(0); }
3735
+ .df-def::before {
3736
+ content: '1. ';
3737
+ color: var(--accent);
3738
+ font-weight: 500;
3739
+ }
3740
+
3741
+ .df-ety {
3742
+ margin: 0;
3743
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
3744
+ font-style: italic;
3745
+ color: var(--dim);
3746
+ line-height: 1.4;
3747
+ letter-spacing: 0.01em;
3748
+ opacity: 0;
3749
+ transition: opacity 800ms ease-out;
3750
+ }
3751
+ .df-ety::before { content: 'origin · '; color: var(--dim-2); font-style: normal; letter-spacing: 0.08em; text-transform: uppercase; }
3752
+ .df-ety.in { opacity: 1; }
3753
+
3754
+ .df-examples {
3755
+ margin: clamp(0.6rem, 1.5vw, 1.2rem) 0 0;
3756
+ padding: 0;
3757
+ list-style: none;
3758
+ display: flex;
3759
+ flex-direction: column;
3760
+ gap: 0.7rem;
3761
+ border-top: 1px dashed var(--dim-2);
3762
+ padding-top: clamp(0.8rem, 1.6vw, 1.2rem);
3763
+ }
3764
+ .df-ex {
3765
+ font-size: clamp(1rem, 1.5vw, 1.25rem);
3766
+ color: var(--dim);
3767
+ font-style: italic;
3768
+ line-height: 1.4;
3769
+ opacity: 0;
3770
+ transform: translateY(6px);
3771
+ transition: opacity 700ms ease-out, transform 800ms ease-out;
3772
+ }
3773
+ .df-ex.in { opacity: 1; transform: translateY(0); }
3774
+ .df-ex::before { content: '“'; color: var(--dim-2); font-style: normal; }
3775
+ .df-ex::after { content: '”'; color: var(--dim-2); font-style: normal; }
3776
+ .df-mark {
3777
+ color: var(--accent);
3778
+ font-style: normal;
3779
+ font-weight: 500;
3780
+ background: var(--accent-soft);
3781
+ padding: 0 0.2em;
3782
+ }
3783
+
3784
+ /* ---------------------------------------------------------------------------
3785
+ * ImageGrid
3786
+ * ------------------------------------------------------------------------- */
3787
+ .image-grid {
3788
+ display: grid;
3789
+ gap: clamp(1rem, 2vw, 1.8rem);
3790
+ width: min(1500px, 94vw);
3791
+ }
3792
+ .image-grid.ig-cols-2 { grid-template-columns: repeat(2, 1fr); }
3793
+ .image-grid.ig-cols-3 { grid-template-columns: repeat(3, 1fr); }
3794
+ .image-grid.ig-cols-4 { grid-template-columns: repeat(4, 1fr); }
3795
+
3796
+ .ig-cell {
3797
+ margin: 0;
3798
+ display: flex;
3799
+ flex-direction: column;
3800
+ gap: 0.6rem;
3801
+ opacity: 0;
3802
+ transform: translateY(20px);
3803
+ transition:
3804
+ opacity 700ms ease-out,
3805
+ transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
3806
+ }
3807
+ .ig-cell.in { opacity: 1; transform: translateY(0) rotate(0); }
3808
+
3809
+ /* cascade: each cell falls in with a small rotation that resolves to zero */
3810
+ .image-grid.ig--cascade .ig-cell {
3811
+ transform: translateY(-30px) rotate(-3deg);
3812
+ }
3813
+ .image-grid.ig--cascade .ig-cell:nth-child(even) {
3814
+ transform: translateY(-30px) rotate(3deg);
3815
+ }
3816
+ .image-grid.ig--cascade .ig-cell.in {
3817
+ transform: translateY(0) rotate(0);
3818
+ }
3819
+
3820
+ .ig-frame {
3821
+ position: relative;
3822
+ aspect-ratio: 3 / 2;
3823
+ overflow: hidden;
3824
+ background: var(--bg-elevated);
3825
+ border: 1px solid var(--dim-2);
3826
+ }
3827
+ .ig-frame::after {
3828
+ content: '';
3829
+ position: absolute;
3830
+ inset: 0;
3831
+ pointer-events: none;
3832
+ box-shadow:
3833
+ inset 0 0 0 1px rgba(0,0,0,0.4),
3834
+ 0 20px 50px -20px rgba(0,0,0,0.7);
3835
+ }
3836
+ .ig-img {
3837
+ width: 100%;
3838
+ height: 100%;
3839
+ object-fit: cover;
3840
+ display: block;
3841
+ filter: saturate(0.92) contrast(1.04);
3842
+ transition: transform 800ms ease-out, filter 600ms ease-out;
3843
+ }
3844
+ .ig-cell:hover .ig-img {
3845
+ transform: scale(1.03);
3846
+ filter: saturate(1) contrast(1.06);
3847
+ }
3848
+ .ig-cap {
3849
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
3850
+ color: var(--dim);
3851
+ letter-spacing: 0.06em;
3852
+ text-transform: uppercase;
3853
+ line-height: 1.4;
3854
+ }
3855
+
3856
+ @media (max-width: 900px) {
3857
+ .image-grid.ig-cols-4 { grid-template-columns: repeat(2, 1fr); }
3858
+ .image-grid.ig-cols-3 { grid-template-columns: repeat(2, 1fr); }
3859
+ }
3860
+ @media (max-width: 540px) {
3861
+ .image-grid.ig-cols-2,
3862
+ .image-grid.ig-cols-3,
3863
+ .image-grid.ig-cols-4 { grid-template-columns: 1fr; }
3864
+ }
3865
+
3866
+ /* ---------------------------------------------------------------------------
3867
+ * Spotlight
3868
+ * ------------------------------------------------------------------------- */
3869
+ .spotlight {
3870
+ width: min(1300px, 92vw);
3871
+ display: flex;
3872
+ flex-direction: column;
3873
+ align-items: center;
3874
+ gap: clamp(2rem, 4vw, 3.5rem);
3875
+ }
3876
+ .sp-focus {
3877
+ display: flex;
3878
+ align-items: center;
3879
+ gap: clamp(1rem, 2.5vw, 2rem);
3880
+ padding: clamp(1.5rem, 3vw, 2.5rem) clamp(2rem, 4vw, 3.5rem);
3881
+ background: var(--bg-elevated);
3882
+ border: 1px solid var(--accent);
3883
+ box-shadow:
3884
+ 0 0 0 1px var(--accent-soft),
3885
+ 0 0 60px -10px var(--accent-glow),
3886
+ 0 30px 80px -30px rgba(0,0,0,0.7);
3887
+ max-width: 56rem;
3888
+ opacity: 0;
3889
+ transform: translateY(20px) scale(0.97);
3890
+ transition: opacity 800ms ease-out, transform 1000ms cubic-bezier(0.16, 1, 0.3, 1);
3891
+ }
3892
+ .sp-focus.in { opacity: 1; transform: translateY(0) scale(1); }
3893
+
3894
+ .sp-icon {
3895
+ font-size: clamp(3rem, 5vw, 4.5rem);
3896
+ color: var(--accent);
3897
+ text-shadow: 0 0 30px var(--accent-glow);
3898
+ line-height: 1;
3899
+ }
3900
+ .sp-focus-text {
3901
+ display: flex;
3902
+ flex-direction: column;
3903
+ gap: 0.4rem;
3904
+ }
3905
+ .sp-heading {
3906
+ font-size: clamp(2rem, 4.5vw, 3.4rem);
3907
+ font-weight: 500;
3908
+ letter-spacing: -0.03em;
3909
+ line-height: 1.05;
3910
+ color: var(--accent);
3911
+ }
3912
+ .sp-body {
3913
+ font-size: clamp(1rem, 1.5vw, 1.25rem);
3914
+ color: var(--fg);
3915
+ line-height: 1.4;
3916
+ max-width: 38ch;
3917
+ }
3918
+
3919
+ .sp-context {
3920
+ display: flex;
3921
+ flex-wrap: wrap;
3922
+ justify-content: center;
3923
+ gap: clamp(1rem, 2.5vw, 2rem) clamp(1.4rem, 3vw, 2.6rem);
3924
+ padding-top: clamp(1rem, 2vw, 1.6rem);
3925
+ border-top: 1px solid var(--dim-2);
3926
+ width: 100%;
3927
+ }
3928
+ .sp-ctx-item {
3929
+ font-size: clamp(0.95rem, 1.4vw, 1.2rem);
3930
+ color: var(--dim);
3931
+ letter-spacing: 0.08em;
3932
+ text-transform: uppercase;
3933
+ opacity: 0;
3934
+ transform: translateY(6px);
3935
+ transition: opacity 600ms ease-out, transform 700ms ease-out, color 400ms ease;
3936
+ }
3937
+ .sp-ctx-item.in { opacity: 1; transform: translateY(0); }
3938
+ .sp-ctx-item:hover { color: var(--fg); }
3939
+
3940
+ @media (max-width: 700px) {
3941
+ .sp-focus { flex-direction: column; text-align: center; }
3942
+ }
3943
+
3944
+ /* ---------------------------------------------------------------------------
3945
+ * Marquee
3946
+ * ------------------------------------------------------------------------- */
3947
+ .marquee-host {
3948
+ padding: 0 !important;
3949
+ display: block !important;
3950
+ width: 100vw;
3951
+ height: auto;
3952
+ align-self: center;
3953
+ }
3954
+ .marquee {
3955
+ --mq-duration: 28s;
3956
+ position: relative;
3957
+ width: 100vw;
3958
+ overflow: hidden;
3959
+ display: flex;
3960
+ flex-direction: column;
3961
+ gap: clamp(0.6rem, 1.5vw, 1.4rem);
3962
+ padding: clamp(2rem, 6vw, 5rem) 0;
3963
+ mask-image: linear-gradient(90deg, transparent 0, #000 6%, #000 94%, transparent 100%);
3964
+ }
3965
+ .marquee.mq--slow { --mq-duration: 42s; }
3966
+ .marquee.mq--medium { --mq-duration: 26s; }
3967
+ .marquee.mq--fast { --mq-duration: 16s; }
3968
+
3969
+ .mq-track {
3970
+ width: 100%;
3971
+ overflow: hidden;
3972
+ border-block: 1px solid var(--dim-2);
3973
+ padding: clamp(0.6rem, 1.2vw, 1rem) 0;
3974
+ }
3975
+ .mq-row {
3976
+ display: inline-flex;
3977
+ align-items: center;
3978
+ gap: clamp(1rem, 2vw, 1.6rem);
3979
+ white-space: nowrap;
3980
+ will-change: transform;
3981
+ animation: mq-scroll var(--mq-duration) linear infinite;
3982
+ }
3983
+ .marquee.mq--right .mq-row { animation-direction: reverse; }
3984
+ .mq-track--rev .mq-row { animation-direction: reverse; }
3985
+ .marquee.mq--right .mq-track--rev .mq-row { animation-direction: normal; }
3986
+
3987
+ .marquee:hover .mq-row { animation-play-state: paused; }
3988
+
3989
+ .mq-item {
3990
+ font-size: clamp(2rem, 5vw, 4.2rem);
3991
+ font-weight: 500;
3992
+ letter-spacing: -0.03em;
3993
+ color: var(--fg);
3994
+ line-height: 1;
3995
+ text-transform: lowercase;
3996
+ }
3997
+ .mq-track--b .mq-item {
3998
+ color: var(--accent);
3999
+ text-shadow: 0 0 24px var(--accent-glow);
4000
+ font-style: italic;
4001
+ font-weight: 400;
4002
+ }
4003
+ .mq-sep {
4004
+ font-size: clamp(2rem, 5vw, 4.2rem);
4005
+ color: var(--dim-2);
4006
+ line-height: 1;
4007
+ user-select: none;
4008
+ }
4009
+
4010
+ @keyframes mq-scroll {
4011
+ from { transform: translateX(0); }
4012
+ to { transform: translateX(-50%); }
4013
+ }
4014
+
4015
+
4016
+ /* KineticText */
4017
+ .kinetic .line {
4018
+ display: block;
4019
+ opacity: 0;
4020
+ transform: translateY(20px);
4021
+ transition: opacity 800ms ease-out, transform 1000ms cubic-bezier(0.16, 1, 0.3, 1);
4022
+ }
4023
+ .kinetic .line.in { opacity: 1; transform: translateY(0); }
4024
+ .kinetic .line.dim { color: var(--dim); }
4025
+ .kinetic .line.accent { color: var(--accent); }
4026
+ .kinetic .line.fg { color: var(--fg); }
4027
+ .kinetic .line.amber { color: var(--amber); }
4028
+ .kinetic .line.blue { color: var(--blue); }
4029
+ .kinetic .pause { display: inline-block; width: 0.6em; }
4030
+
4031
+ /* SectionCard */
4032
+ .section-card { text-align: center; max-width: 100%; }
4033
+ .sec-rule {
4034
+ display: flex;
4035
+ align-items: center;
4036
+ justify-content: center;
4037
+ gap: clamp(1rem, 3vw, 2rem);
4038
+ margin-bottom: clamp(2rem, 5vw, 4rem);
4039
+ }
4040
+ .sec-line { width: clamp(2.5rem, 8vw, 7rem); height: 1px; background: var(--dim); }
4041
+ .sec-num {
4042
+ font-size: clamp(0.95rem, 1.3vw, 1.2rem);
4043
+ letter-spacing: 0.35em;
4044
+ color: var(--dim);
4045
+ font-weight: 500;
4046
+ font-variant-numeric: tabular-nums;
4047
+ }
4048
+ .sec-title {
4049
+ font-size: clamp(2.8rem, 8.5vw, 6.5rem);
4050
+ font-weight: 500;
4051
+ letter-spacing: -0.03em;
4052
+ line-height: 1.05;
4053
+ color: var(--fg);
4054
+ margin-bottom: clamp(1rem, 2.5vw, 2rem);
4055
+ max-width: 22ch;
4056
+ margin-left: auto;
4057
+ margin-right: auto;
4058
+ }
4059
+ .sec-title .accent { color: var(--accent); }
4060
+ .sec-tag {
4061
+ font-size: clamp(0.95rem, 1.4vw, 1.25rem);
4062
+ color: var(--dim);
4063
+ letter-spacing: 0.04em;
4064
+ font-style: italic;
4065
+ }
4066
+
4067
+ /* ActivityList */
4068
+ .activities {
4069
+ display: flex;
4070
+ flex-direction: column;
4071
+ gap: clamp(1.4rem, 3vw, 2.4rem);
4072
+ max-width: min(900px, 90vw);
4073
+ }
4074
+ .activity {
4075
+ display: grid;
4076
+ grid-template-columns: auto 1fr;
4077
+ gap: clamp(1.2rem, 3vw, 2.5rem);
4078
+ align-items: baseline;
4079
+ opacity: 0;
4080
+ transform: translateX(-14px);
4081
+ transition: opacity 600ms ease-out, transform 600ms cubic-bezier(0.16, 1, 0.3, 1);
4082
+ }
4083
+ .activity.in, .activity.shown { opacity: 1; transform: translateX(0); }
4084
+ .activity .num {
4085
+ font-size: clamp(0.85rem, 1.2vw, 1.1rem);
4086
+ color: var(--dim);
4087
+ letter-spacing: 0.25em;
4088
+ font-weight: 500;
4089
+ font-variant-numeric: tabular-nums;
4090
+ min-width: 2.5ch;
4091
+ padding-top: 0.6em;
4092
+ }
4093
+ .activity .body { display: flex; flex-direction: column; gap: 0.35rem; }
4094
+ .activity .name {
4095
+ font-size: clamp(1.8rem, 4.2vw, 3.6rem);
4096
+ font-weight: 500;
4097
+ letter-spacing: -0.025em;
4098
+ line-height: 1.1;
4099
+ color: var(--fg);
4100
+ }
4101
+ .activity .name .accent { color: var(--accent); }
4102
+ .activity .desc {
4103
+ font-size: clamp(0.95rem, 1.35vw, 1.2rem);
4104
+ color: var(--dim);
4105
+ letter-spacing: 0.01em;
4106
+ }
4107
+
4108
+ /* Compare */
4109
+ .compare {
4110
+ display: grid;
4111
+ grid-template-columns: 1fr 1px 1fr;
4112
+ gap: 0;
4113
+ width: min(1300px, 92vw);
4114
+ }
4115
+ .compare-col { padding: 0 clamp(2rem, 5vw, 5rem); }
4116
+ .compare-h {
4117
+ font-size: 0.85rem;
4118
+ letter-spacing: 0.3em;
4119
+ text-transform: uppercase;
4120
+ color: var(--dim);
4121
+ margin-bottom: 2rem;
4122
+ }
4123
+ .compare-h.old::before { content: '◌ '; color: var(--dim); }
4124
+ .compare-h.new::before { content: '◉ '; color: var(--accent); }
4125
+ .compare-list {
4126
+ list-style: none;
4127
+ font-size: clamp(1.1rem, 1.7vw, 1.5rem);
4128
+ line-height: 2;
4129
+ color: var(--fg);
4130
+ }
4131
+ .compare-list li {
4132
+ padding-left: 1.4em;
4133
+ position: relative;
4134
+ opacity: 0;
4135
+ transform: translateX(-8px);
4136
+ transition: opacity 600ms, transform 600ms cubic-bezier(0.16, 1, 0.3, 1);
4137
+ }
4138
+ .compare-list li.in, .compare-list li.shown { opacity: 1; transform: translateX(0); }
4139
+ .compare-list li::before {
4140
+ content: '—';
4141
+ position: absolute;
4142
+ left: 0;
4143
+ color: var(--dim);
4144
+ }
4145
+ .compare-list.strikethrough li {
4146
+ text-decoration: line-through;
4147
+ text-decoration-color: var(--dim-2);
4148
+ color: var(--dim);
4149
+ }
4150
+ .compare-list.accent li::before { color: var(--accent); }
4151
+ .compare-divider {
4152
+ background: linear-gradient(to bottom, transparent, var(--dim-2) 20%, var(--dim-2) 80%, transparent);
4153
+ }
4154
+ @media (max-width: 700px) {
4155
+ .compare { grid-template-columns: 1fr; }
4156
+ .compare-divider { display: none; }
4157
+ }
4158
+
4159
+ /* Counter */
4160
+ .counter-wrap {
4161
+ display: flex;
4162
+ gap: clamp(2rem, 8vw, 8rem);
4163
+ align-items: stretch;
4164
+ justify-content: center;
4165
+ flex-wrap: wrap;
4166
+ }
4167
+ .counter-block { text-align: left; }
4168
+ .counter-label {
4169
+ font-size: 0.85rem;
4170
+ letter-spacing: 0.3em;
4171
+ text-transform: uppercase;
4172
+ color: var(--dim);
4173
+ margin-bottom: 0.8rem;
4174
+ }
4175
+ .counter-label .dot {
4176
+ display: inline-block;
4177
+ width: 7px; height: 7px;
4178
+ margin-right: 0.7rem;
4179
+ vertical-align: middle;
4180
+ }
4181
+ .counter-label.accent .dot { background: var(--accent); }
4182
+ .counter-label.amber .dot { background: var(--amber); }
4183
+ .counter-label.blue .dot { background: var(--blue); }
4184
+ .counter-label.red .dot { background: var(--red); }
4185
+ .counter-num {
4186
+ font-size: clamp(3rem, 8vw, 7rem);
4187
+ font-weight: 500;
4188
+ letter-spacing: -0.04em;
4189
+ font-variant-numeric: tabular-nums;
4190
+ line-height: 1;
4191
+ color: var(--fg);
4192
+ }
4193
+ .counter-num.accent { color: var(--accent); }
4194
+ .counter-num.amber { color: var(--amber); }
4195
+ .counter-num.blue { color: var(--blue); }
4196
+ .counter-num.red { color: var(--red); }
4197
+ .counter-foot {
4198
+ margin-top: 4rem;
4199
+ font-size: clamp(1rem, 1.4vw, 1.3rem);
4200
+ color: var(--dim);
4201
+ text-align: center;
4202
+ opacity: 0;
4203
+ transition: opacity 1500ms ease-out;
4204
+ }
4205
+ .counter-foot.visible, .counter-foot.shown { opacity: 1; }
4206
+ .counter-foot .accent { color: var(--accent); font-weight: 500; }
4207
+
4208
+ /* ShiftArrow */
4209
+ .shift-line {
4210
+ display: flex;
4211
+ align-items: center;
4212
+ justify-content: center;
4213
+ gap: clamp(1rem, 4vw, 3rem);
4214
+ flex-wrap: wrap;
4215
+ }
4216
+ .shift-from, .shift-to {
4217
+ font-size: clamp(1.4rem, 3.5vw, 3rem);
4218
+ font-weight: 400;
4219
+ letter-spacing: -0.02em;
4220
+ }
4221
+ .shift-from { color: var(--dim); text-decoration: line-through; text-decoration-color: var(--dim-2); }
4222
+ .shift-to { color: var(--accent); }
4223
+ .shift-arrow {
4224
+ font-size: clamp(1.4rem, 3.5vw, 3rem);
4225
+ color: var(--accent);
4226
+ font-weight: 300;
4227
+ }
4228
+
4229
+ /* === themes/phosphor/transitions.css === */
4230
+ /* Stagecraft — Phosphor theme: transitions library
4231
+ *
4232
+ * The animations apply to anything carrying the tx-<name>-enter / tx-<name>-exit
4233
+ * class, not just .slide elements — so previews in the edit-mode picker share
4234
+ * the exact same motion as the real thing.
4235
+ */
4236
+
4237
+ /* fade */
4238
+ .tx-fade-enter { animation: tx-fade-enter 700ms cubic-bezier(0.16, 1, 0.3, 1) both; }
4239
+ .tx-fade-exit { animation: tx-fade-exit 400ms ease-in both; }
4240
+ @keyframes tx-fade-enter {
4241
+ from { opacity: 0; transform: scale(0.985); }
4242
+ to { opacity: 1; transform: scale(1); }
4243
+ }
4244
+ @keyframes tx-fade-exit {
4245
+ from { opacity: 1; transform: scale(1); }
4246
+ to { opacity: 0; transform: scale(1.01); }
4247
+ }
4248
+
4249
+ /* slide */
4250
+ .tx-slide-enter { animation: tx-slide-enter 700ms cubic-bezier(0.16, 1, 0.3, 1) both; }
4251
+ .tx-slide-exit { animation: tx-slide-exit 500ms ease-in both; }
4252
+ @keyframes tx-slide-enter {
4253
+ from { opacity: 0; transform: translateX(60px); }
4254
+ to { opacity: 1; transform: translateX(0); }
4255
+ }
4256
+ @keyframes tx-slide-exit {
4257
+ from { opacity: 1; transform: translateX(0); }
4258
+ to { opacity: 0; transform: translateX(-60px); }
4259
+ }
4260
+
4261
+ /* dissolve */
4262
+ .tx-dissolve-enter { animation: tx-dissolve-enter 1200ms ease-out both; }
4263
+ .tx-dissolve-exit { animation: tx-dissolve-exit 1000ms ease-in both; }
4264
+ @keyframes tx-dissolve-enter {
4265
+ from { opacity: 0; filter: blur(8px); }
4266
+ to { opacity: 1; filter: blur(0); }
4267
+ }
4268
+ @keyframes tx-dissolve-exit {
4269
+ from { opacity: 1; filter: blur(0); }
4270
+ to { opacity: 0; filter: blur(8px); }
4271
+ }
4272
+
4273
+ /* glitch — phosphor flavor */
4274
+ .tx-glitch-enter { animation: tx-glitch-enter 600ms steps(8, end) both; }
4275
+ @keyframes tx-glitch-enter {
4276
+ 0% { opacity: 0; transform: translateX(0); filter: hue-rotate(0deg); }
4277
+ 20% { opacity: 0.6; transform: translateX(-3px); filter: hue-rotate(30deg) contrast(1.3); }
4278
+ 40% { opacity: 0.4; transform: translateX(4px); filter: hue-rotate(-20deg); }
4279
+ 60% { opacity: 0.8; transform: translateX(-1px); }
4280
+ 100% { opacity: 1; transform: translateX(0); filter: none; }
4281
+ }
4282
+ .tx-glitch-overlay {
4283
+ position: absolute;
4284
+ inset: 0;
4285
+ pointer-events: none;
4286
+ z-index: 50;
4287
+ background:
4288
+ repeating-linear-gradient(
4289
+ 0deg,
4290
+ rgba(0, 255, 156, 0.04) 0,
4291
+ rgba(0, 255, 156, 0.04) 1px,
4292
+ transparent 1px,
4293
+ transparent 4px
4294
+ );
4295
+ mix-blend-mode: screen;
4296
+ animation: tx-glitch-overlay 600ms steps(6, end) both;
4297
+ }
4298
+ @keyframes tx-glitch-overlay {
4299
+ 0% { opacity: 0.9; }
4300
+ 50% { opacity: 0.5; transform: translateX(3px); }
4301
+ 100% { opacity: 0; transform: translateX(0); }
4302
+ }
4303
+
4304
+ /* wipe — masked reveal left-to-right */
4305
+ .tx-wipe-enter {
4306
+ animation: tx-wipe-enter 800ms cubic-bezier(0.16, 1, 0.3, 1) both;
4307
+ clip-path: inset(0 100% 0 0);
4308
+ }
4309
+ @keyframes tx-wipe-enter {
4310
+ from { opacity: 1; clip-path: inset(0 100% 0 0); }
4311
+ to { opacity: 1; clip-path: inset(0 0% 0 0); }
4312
+ }
4313
+ .tx-wipe-exit { animation: tx-wipe-exit 500ms ease-in both; }
4314
+ @keyframes tx-wipe-exit {
4315
+ from { opacity: 1; clip-path: inset(0 0% 0 0); }
4316
+ to { opacity: 1; clip-path: inset(0 0 0 100%); }
4317
+ }
4318
+
4319
+ /* cut — picker-preview only. The real cut in the deck is instant (no class
4320
+ * is added on enter, see src/transitions.js). This animation is just so the
4321
+ * picker preview can demonstrate what cut means: 0% opacity for the first
4322
+ * half of the hover, then a hard snap to 100% — no easing, no fade. */
4323
+ .tx-cut-enter {
4324
+ animation: tx-cut-enter 600ms steps(2, jump-none) both;
4325
+ }
4326
+ @keyframes tx-cut-enter {
4327
+ from { opacity: 0; }
4328
+ to { opacity: 1; }
4329
+ }
4330
+
4331
+ /* ============================================================================
4332
+ * Phase 2 transitions
4333
+ * ============================================================================ */
4334
+
4335
+ /* zoom-in: scales up from small while fading in */
4336
+ .tx-zoom-in-enter { animation: tx-zoom-in-enter 700ms cubic-bezier(0.16, 1, 0.3, 1) both; }
4337
+ .tx-zoom-in-exit { animation: tx-zoom-in-exit 400ms ease-in both; }
4338
+ @keyframes tx-zoom-in-enter {
4339
+ from { opacity: 0; transform: scale(0.6); }
4340
+ to { opacity: 1; transform: scale(1); }
4341
+ }
4342
+ @keyframes tx-zoom-in-exit {
4343
+ from { opacity: 1; transform: scale(1); }
4344
+ to { opacity: 0; transform: scale(1.4); }
4345
+ }
4346
+
4347
+ /* zoom-out: opposite — starts large and shrinks in */
4348
+ .tx-zoom-out-enter { animation: tx-zoom-out-enter 700ms cubic-bezier(0.16, 1, 0.3, 1) both; }
4349
+ .tx-zoom-out-exit { animation: tx-zoom-out-exit 400ms ease-in both; }
4350
+ @keyframes tx-zoom-out-enter {
4351
+ from { opacity: 0; transform: scale(1.4); }
4352
+ to { opacity: 1; transform: scale(1); }
4353
+ }
4354
+ @keyframes tx-zoom-out-exit {
4355
+ from { opacity: 1; transform: scale(1); }
4356
+ to { opacity: 0; transform: scale(0.6); }
4357
+ }
4358
+
4359
+ /* flip: 3D Y-axis rotation */
4360
+ .tx-flip-enter {
4361
+ animation: tx-flip-enter 900ms cubic-bezier(0.45, 0, 0.55, 1) both;
4362
+ transform-style: preserve-3d;
4363
+ perspective: 1200px;
4364
+ }
4365
+ .tx-flip-exit { animation: tx-flip-exit 500ms ease-in both; }
4366
+ @keyframes tx-flip-enter {
4367
+ from { opacity: 0; transform: perspective(1200px) rotateY(-90deg); }
4368
+ 60% { opacity: 1; }
4369
+ to { opacity: 1; transform: perspective(1200px) rotateY(0deg); }
4370
+ }
4371
+ @keyframes tx-flip-exit {
4372
+ from { opacity: 1; transform: perspective(1200px) rotateY(0deg); }
4373
+ to { opacity: 0; transform: perspective(1200px) rotateY(90deg); }
4374
+ }
4375
+
4376
+ /* iris: circular reveal from center */
4377
+ .tx-iris-enter {
4378
+ animation: tx-iris-enter 900ms cubic-bezier(0.4, 0, 0.2, 1) both;
4379
+ }
4380
+ .tx-iris-exit { animation: tx-iris-exit 500ms ease-in both; }
4381
+ @keyframes tx-iris-enter {
4382
+ from { opacity: 1; clip-path: circle(0% at 50% 50%); }
4383
+ to { opacity: 1; clip-path: circle(80% at 50% 50%); }
4384
+ }
4385
+ @keyframes tx-iris-exit {
4386
+ from { opacity: 1; clip-path: circle(80% at 50% 50%); }
4387
+ to { opacity: 1; clip-path: circle(0% at 50% 50%); }
4388
+ }
4389
+
4390
+ /* shutter: horizontal bands close → open */
4391
+ .tx-shutter-enter {
4392
+ animation: tx-shutter-enter 800ms cubic-bezier(0.4, 0, 0.2, 1) both;
4393
+ }
4394
+ @keyframes tx-shutter-enter {
4395
+ 0% { opacity: 0; clip-path: polygon(0 0, 100% 0, 100% 8%, 0 8%, 0 17%, 100% 17%, 100% 25%, 0 25%, 0 34%, 100% 34%, 100% 42%, 0 42%, 0 50%, 100% 50%, 100% 58%, 0 58%, 0 66%, 100% 66%, 100% 75%, 0 75%, 0 83%, 100% 83%, 100% 92%, 0 92%); }
4396
+ 100% { opacity: 1; clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); }
4397
+ }
4398
+ .tx-shutter-exit { animation: tx-fade-exit 500ms ease-in both; }
4399
+
4400
+ /* push: pushes in horizontally, like slide but stronger */
4401
+ .tx-push-enter { animation: tx-push-enter 800ms cubic-bezier(0.16, 1, 0.3, 1) both; }
4402
+ .tx-push-exit { animation: tx-push-exit 800ms cubic-bezier(0.7, 0, 0.84, 0) both; }
4403
+ @keyframes tx-push-enter {
4404
+ from { opacity: 1; transform: translateX(100%); }
4405
+ to { opacity: 1; transform: translateX(0); }
4406
+ }
4407
+ @keyframes tx-push-exit {
4408
+ from { opacity: 1; transform: translateX(0); }
4409
+ to { opacity: 1; transform: translateX(-100%); }
4410
+ }
4411
+
4412
+ /* typewriter: wide → narrow reveal, like a CRT power-on */
4413
+ .tx-typewriter-enter {
4414
+ animation: tx-typewriter-enter 900ms cubic-bezier(0.4, 0, 0.2, 1) both;
4415
+ transform-origin: center;
4416
+ }
4417
+ @keyframes tx-typewriter-enter {
4418
+ 0% { opacity: 0; transform: scaleX(0); }
4419
+ 40% { opacity: 1; transform: scaleX(1); transform-origin: center; }
4420
+ 100% { opacity: 1; transform: scaleX(1); }
4421
+ }
4422
+ .tx-typewriter-exit {
4423
+ animation: tx-typewriter-exit 300ms ease-in both;
4424
+ }
4425
+ @keyframes tx-typewriter-exit {
4426
+ from { opacity: 1; transform: scaleY(1); }
4427
+ to { opacity: 0; transform: scaleY(0); }
4428
+ }
4429
+
4430
+ /* shatter: many tiny grid-shifts then resolve */
4431
+ .tx-shatter-enter {
4432
+ animation: tx-shatter-enter 900ms steps(10, jump-end) both;
4433
+ filter: contrast(1) blur(0);
4434
+ }
4435
+ @keyframes tx-shatter-enter {
4436
+ 0% { opacity: 0; filter: blur(20px) saturate(0.2); transform: translate(-4px, 2px) skew(2deg); }
4437
+ 20% { opacity: 0.4; filter: blur(8px) saturate(0.4); transform: translate(3px, -1px) skew(-1deg); }
4438
+ 40% { opacity: 0.7; filter: blur(3px); transform: translate(-1px, 1px); }
4439
+ 60% { opacity: 0.9; filter: blur(1px); transform: translate(1px, 0); }
4440
+ 100% { opacity: 1; filter: none; transform: none; }
4441
+ }
4442
+ .tx-shatter-exit { animation: tx-fade-exit 500ms ease-in both; }
4443
+