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,427 @@
1
+ /* Stagecraft — Phosphor theme: diagram component styles (Pillars, Timeline, Pyramid, Cycle, Funnel). */
2
+
3
+ /* Local component vars; theme tokens (--accent, --dim, etc.) flow through. */
4
+ :root[data-theme="phosphor"] {
5
+ --diag-ease: cubic-bezier(0.16, 1, 0.3, 1);
6
+ --diag-rise: 16px;
7
+ --diag-card-bg: rgba(255, 255, 255, 0.015);
8
+ --diag-card-border: var(--dim-2);
9
+ }
10
+
11
+ /* ===========================================================================
12
+ * Pillars
13
+ * ===========================================================================*/
14
+ .pillars-wrap {
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: center;
18
+ gap: clamp(1.4rem, 3vw, 2.4rem);
19
+ width: min(1200px, 92vw);
20
+ }
21
+ .pillars-intro {
22
+ font-size: clamp(0.95rem, 1.4vw, 1.25rem);
23
+ color: var(--dim);
24
+ letter-spacing: 0.04em;
25
+ font-style: italic;
26
+ text-align: center;
27
+ max-width: 60ch;
28
+ }
29
+ .pillars-grid {
30
+ display: grid;
31
+ grid-template-columns: repeat(var(--pillars-count, 3), minmax(0, 1fr));
32
+ gap: clamp(1rem, 3vw, 2.6rem);
33
+ width: 100%;
34
+ }
35
+ .pillar {
36
+ display: flex;
37
+ flex-direction: column;
38
+ align-items: center;
39
+ text-align: center;
40
+ gap: clamp(0.6rem, 1.2vw, 1rem);
41
+ padding: clamp(1rem, 2vw, 1.6rem) clamp(0.6rem, 1.2vw, 1rem);
42
+ opacity: 0;
43
+ transform: translateY(var(--diag-rise));
44
+ transition: opacity 700ms ease-out, transform 700ms var(--diag-ease);
45
+ }
46
+ .pillar.in { opacity: 1; transform: translateY(0); }
47
+ .pillar-icon {
48
+ font-size: 3rem;
49
+ line-height: 1;
50
+ color: var(--accent);
51
+ transition: transform 600ms var(--diag-ease), filter 600ms ease;
52
+ }
53
+ .pillar:hover .pillar-icon {
54
+ animation: pillar-pulse 1600ms ease-in-out infinite;
55
+ }
56
+ @keyframes pillar-pulse {
57
+ 0%, 100% { transform: scale(1); filter: drop-shadow(0 0 0 transparent); }
58
+ 50% { transform: scale(1.08); filter: drop-shadow(0 0 14px var(--accent-glow)); }
59
+ }
60
+ .pillar-heading {
61
+ font-size: clamp(1.4rem, 2.4vw, 2rem);
62
+ font-weight: 500;
63
+ letter-spacing: -0.02em;
64
+ line-height: 1.15;
65
+ color: var(--fg);
66
+ }
67
+ .pillar-body {
68
+ font-size: 1rem;
69
+ color: var(--dim);
70
+ letter-spacing: 0.01em;
71
+ max-width: 24ch;
72
+ line-height: 1.5;
73
+ }
74
+ .pillar.pc-accent .pillar-icon { color: var(--accent); }
75
+ .pillar.pc-blue .pillar-icon { color: var(--blue); }
76
+ .pillar.pc-amber .pillar-icon { color: var(--amber); }
77
+ .pillar.pc-red .pillar-icon { color: var(--red); }
78
+ .pillar.pc-dim .pillar-icon { color: var(--dim); }
79
+ .pillar.pc-fg .pillar-icon { color: var(--fg); }
80
+ @media (max-width: 800px) {
81
+ .pillars-grid { grid-template-columns: 1fr 1fr; }
82
+ }
83
+ @media (max-width: 520px) {
84
+ .pillars-grid { grid-template-columns: 1fr; }
85
+ }
86
+
87
+ /* ===========================================================================
88
+ * Timeline
89
+ * ===========================================================================*/
90
+ .timeline {
91
+ position: relative;
92
+ width: min(1300px, 94vw);
93
+ }
94
+ .timeline-track {
95
+ position: absolute;
96
+ background: var(--dim-2);
97
+ }
98
+ .timeline-events { display: grid; }
99
+
100
+ /* Horizontal */
101
+ .timeline--horizontal .timeline-track {
102
+ left: 0;
103
+ right: 0;
104
+ top: 50%;
105
+ height: 1px;
106
+ transform: translateY(-0.5px);
107
+ }
108
+ .timeline--horizontal .timeline-events {
109
+ grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
110
+ grid-auto-flow: column;
111
+ grid-auto-columns: minmax(0, 1fr);
112
+ align-items: center;
113
+ gap: clamp(0.6rem, 2vw, 1.6rem);
114
+ padding: clamp(2rem, 4vw, 3rem) 0;
115
+ }
116
+ .timeline--horizontal .tl-event {
117
+ display: grid;
118
+ grid-template-rows: 1fr auto 1fr;
119
+ align-items: center;
120
+ justify-items: center;
121
+ text-align: center;
122
+ gap: clamp(0.6rem, 1.4vw, 1rem);
123
+ opacity: 0;
124
+ transform: translateY(8px);
125
+ transition: opacity 600ms ease-out, transform 600ms var(--diag-ease);
126
+ }
127
+ .timeline--horizontal .tl-event.in { opacity: 1; transform: translateY(0); }
128
+ .timeline--horizontal .tl-date { align-self: end; }
129
+ .timeline--horizontal .tl-text { align-self: start; }
130
+
131
+ /* Vertical */
132
+ .timeline--vertical .timeline-track {
133
+ top: 0;
134
+ bottom: 0;
135
+ left: clamp(2rem, 6vw, 4rem);
136
+ width: 1px;
137
+ }
138
+ .timeline--vertical .timeline-events {
139
+ grid-template-columns: 1fr;
140
+ gap: clamp(1.2rem, 2.5vw, 2rem);
141
+ padding-left: clamp(0.5rem, 2vw, 1rem);
142
+ }
143
+ .timeline--vertical .tl-event {
144
+ display: grid;
145
+ grid-template-columns: clamp(4rem, 9vw, 6rem) auto 1fr;
146
+ align-items: center;
147
+ gap: clamp(0.8rem, 2vw, 1.4rem);
148
+ opacity: 0;
149
+ transform: translateX(-12px);
150
+ transition: opacity 600ms ease-out, transform 600ms var(--diag-ease);
151
+ }
152
+ .timeline--vertical .tl-event.in { opacity: 1; transform: translateX(0); }
153
+ .timeline--vertical .tl-date { text-align: right; }
154
+ .timeline--vertical .tl-text { text-align: left; }
155
+
156
+ /* Shared atoms */
157
+ .tl-date {
158
+ font-size: clamp(0.8rem, 1.1vw, 1rem);
159
+ color: var(--dim);
160
+ letter-spacing: 0.25em;
161
+ font-variant-numeric: tabular-nums;
162
+ text-transform: uppercase;
163
+ }
164
+ .tl-dot {
165
+ width: clamp(0.9rem, 1.6vw, 1.3rem);
166
+ height: clamp(0.9rem, 1.6vw, 1.3rem);
167
+ border-radius: 50%;
168
+ border: 1px solid var(--dim);
169
+ background: var(--bg);
170
+ position: relative;
171
+ display: grid;
172
+ place-items: center;
173
+ z-index: 1;
174
+ transition: background 400ms ease, border-color 400ms ease, box-shadow 400ms ease;
175
+ }
176
+ .tl-event.active .tl-dot {
177
+ background: var(--accent);
178
+ border-color: var(--accent);
179
+ box-shadow: 0 0 0 4px var(--accent-soft);
180
+ }
181
+ .tl-icon {
182
+ font-size: clamp(0.7rem, 1.1vw, 0.95rem);
183
+ color: var(--bg);
184
+ line-height: 1;
185
+ }
186
+ .tl-event:not(.active) .tl-icon { color: var(--dim); }
187
+ .tl-heading {
188
+ font-size: clamp(1.1rem, 1.9vw, 1.6rem);
189
+ font-weight: 500;
190
+ letter-spacing: -0.015em;
191
+ color: var(--fg);
192
+ line-height: 1.2;
193
+ }
194
+ .tl-body {
195
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
196
+ color: var(--dim);
197
+ margin-top: 0.25rem;
198
+ line-height: 1.4;
199
+ }
200
+ .tl-event.tc-accent.active .tl-dot { background: var(--accent); border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft); }
201
+ .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); }
202
+ .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); }
203
+ .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); }
204
+
205
+ /* ===========================================================================
206
+ * Pyramid
207
+ * ===========================================================================*/
208
+ .pyramid {
209
+ display: flex;
210
+ flex-direction: column;
211
+ align-items: center;
212
+ width: min(900px, 92vw);
213
+ gap: 6px;
214
+ }
215
+ .pyr-layer {
216
+ width: var(--pyr-w, 100%);
217
+ display: flex;
218
+ justify-content: center;
219
+ opacity: 0;
220
+ transform: translateY(8px) scaleX(0.92);
221
+ transform-origin: center;
222
+ transition: opacity 600ms ease-out, transform 700ms var(--diag-ease);
223
+ }
224
+ .pyr-layer.in { opacity: 1; transform: translateY(0) scaleX(1); }
225
+ .pyr-shape {
226
+ width: 100%;
227
+ padding: clamp(0.9rem, 1.8vw, 1.4rem) clamp(1.2rem, 2.5vw, 2rem);
228
+ background: var(--diag-card-bg);
229
+ border: 1px solid var(--diag-card-border);
230
+ /* Slight trapezoid feel: angled side cuts via clip-path. */
231
+ clip-path: polygon(6% 0%, 94% 0%, 100% 100%, 0% 100%);
232
+ }
233
+ .pyramid--down .pyr-shape {
234
+ clip-path: polygon(0% 0%, 100% 0%, 94% 100%, 6% 100%);
235
+ }
236
+ .pyr-content { text-align: center; }
237
+ .pyr-label {
238
+ font-size: clamp(1.1rem, 2.2vw, 1.8rem);
239
+ font-weight: 500;
240
+ letter-spacing: -0.015em;
241
+ color: var(--fg);
242
+ line-height: 1.15;
243
+ }
244
+ .pyr-body {
245
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
246
+ color: var(--dim);
247
+ margin-top: 0.35rem;
248
+ letter-spacing: 0.01em;
249
+ }
250
+ .pyr-layer.pyc-accent .pyr-shape { border-color: var(--accent); background: var(--accent-soft); }
251
+ .pyr-layer.pyc-accent .pyr-label { color: var(--accent); }
252
+ .pyr-layer.pyc-blue .pyr-shape { border-color: var(--blue); background: rgba(24, 158, 255, 0.10); }
253
+ .pyr-layer.pyc-blue .pyr-label { color: var(--blue); }
254
+ .pyr-layer.pyc-amber .pyr-shape { border-color: var(--amber); background: rgba(255, 180, 84, 0.10); }
255
+ .pyr-layer.pyc-amber .pyr-label { color: var(--amber); }
256
+ .pyr-layer.pyc-red .pyr-shape { border-color: var(--red); background: rgba(255, 92, 92, 0.10); }
257
+ .pyr-layer.pyc-red .pyr-label { color: var(--red); }
258
+ .pyr-layer.pyc-dim .pyr-shape { border-color: var(--dim-2); }
259
+ .pyr-layer.pyc-dim .pyr-label { color: var(--dim); }
260
+
261
+ /* ===========================================================================
262
+ * Cycle
263
+ * ===========================================================================*/
264
+ .cycle {
265
+ display: flex;
266
+ justify-content: center;
267
+ width: min(720px, 80vmin);
268
+ aspect-ratio: 1 / 1;
269
+ }
270
+ .cyc-frame {
271
+ position: relative;
272
+ width: 100%;
273
+ height: 100%;
274
+ transition: transform 1700ms var(--diag-ease);
275
+ }
276
+ .cyc-frame.rotating { animation: cyc-rotate-in 1700ms var(--diag-ease) both; }
277
+ @keyframes cyc-rotate-in {
278
+ from { transform: rotate(-360deg); }
279
+ to { transform: rotate(0deg); }
280
+ }
281
+ .cyc-svg {
282
+ position: absolute;
283
+ inset: 0;
284
+ width: 100%;
285
+ height: 100%;
286
+ overflow: visible;
287
+ }
288
+ .cyc-ring {
289
+ fill: none;
290
+ stroke: var(--dim-2);
291
+ stroke-width: 1;
292
+ stroke-dasharray: 3 5;
293
+ opacity: 0.6;
294
+ }
295
+ .cyc-arc {
296
+ fill: none;
297
+ stroke: var(--accent);
298
+ stroke-width: 2;
299
+ stroke-linecap: round;
300
+ opacity: 0;
301
+ transition: opacity 600ms ease-out;
302
+ }
303
+ .cyc-arc.in { opacity: 0.85; }
304
+ .cyc-arrow {
305
+ fill: none;
306
+ stroke: var(--accent);
307
+ stroke-width: 2.5;
308
+ stroke-linecap: round;
309
+ stroke-linejoin: round;
310
+ opacity: 0;
311
+ transition: opacity 600ms ease-out;
312
+ }
313
+ .cyc-arrow.in { opacity: 1; }
314
+ .cyc-items {
315
+ position: absolute;
316
+ inset: 0;
317
+ }
318
+ .cyc-item {
319
+ position: absolute;
320
+ transform: translate(-50%, -50%) scale(0.85);
321
+ opacity: 0;
322
+ display: flex;
323
+ flex-direction: column;
324
+ align-items: center;
325
+ gap: 0.4rem;
326
+ padding: clamp(0.6rem, 1.2vw, 0.9rem) clamp(0.8rem, 1.4vw, 1.1rem);
327
+ background: var(--bg);
328
+ border: 1px solid var(--dim-2);
329
+ border-radius: 8px;
330
+ min-width: clamp(5rem, 12vw, 8rem);
331
+ text-align: center;
332
+ transition: opacity 600ms ease-out, transform 700ms var(--diag-ease), border-color 400ms ease;
333
+ }
334
+ .cyc-item.in { opacity: 1; transform: translate(-50%, -50%) scale(1); }
335
+ .cyc-icon {
336
+ font-size: clamp(1.2rem, 2vw, 1.6rem);
337
+ color: var(--accent);
338
+ line-height: 1;
339
+ }
340
+ .cyc-label {
341
+ font-size: clamp(0.85rem, 1.2vw, 1.05rem);
342
+ font-weight: 500;
343
+ letter-spacing: -0.01em;
344
+ color: var(--fg);
345
+ line-height: 1.2;
346
+ }
347
+ .cyc-item.cyc-accent { border-color: var(--accent); }
348
+ .cyc-item.cyc-accent .cyc-icon { color: var(--accent); }
349
+ .cyc-item.cyc-blue { border-color: var(--blue); }
350
+ .cyc-item.cyc-blue .cyc-icon { color: var(--blue); }
351
+ .cyc-item.cyc-amber { border-color: var(--amber); }
352
+ .cyc-item.cyc-amber .cyc-icon { color: var(--amber); }
353
+ .cyc-item.cyc-red { border-color: var(--red); }
354
+ .cyc-item.cyc-red .cyc-icon { color: var(--red); }
355
+
356
+ /* ===========================================================================
357
+ * Funnel
358
+ * ===========================================================================*/
359
+ .funnel {
360
+ display: flex;
361
+ flex-direction: column;
362
+ align-items: stretch;
363
+ width: min(820px, 88vw);
364
+ gap: 4px;
365
+ }
366
+ .fn-stage {
367
+ position: relative;
368
+ min-height: clamp(3.6rem, 8vh, 5.4rem);
369
+ opacity: 0;
370
+ transform: translateY(10px);
371
+ transition: opacity 600ms ease-out, transform 700ms var(--diag-ease);
372
+ }
373
+ .fn-stage.in { opacity: 1; transform: translateY(0); }
374
+ .fn-shape {
375
+ position: absolute;
376
+ inset: 0;
377
+ background: var(--diag-card-bg);
378
+ border-top: 1px solid var(--dim-2);
379
+ border-bottom: 1px solid var(--dim-2);
380
+ }
381
+ .fn-content {
382
+ position: relative;
383
+ z-index: 1;
384
+ height: 100%;
385
+ display: flex;
386
+ align-items: center;
387
+ justify-content: center;
388
+ gap: clamp(1rem, 3vw, 2.4rem);
389
+ padding: clamp(0.6rem, 1.4vw, 1rem) var(--fn-pad, 12%);
390
+ text-align: center;
391
+ }
392
+ .fn-label {
393
+ font-size: clamp(1rem, 1.7vw, 1.4rem);
394
+ font-weight: 500;
395
+ letter-spacing: 0.04em;
396
+ text-transform: uppercase;
397
+ color: var(--fg);
398
+ line-height: 1.1;
399
+ }
400
+ .fn-value {
401
+ font-size: clamp(1.8rem, 3.6vw, 3rem);
402
+ font-weight: 500;
403
+ letter-spacing: -0.03em;
404
+ font-variant-numeric: tabular-nums;
405
+ color: var(--fg);
406
+ line-height: 1;
407
+ }
408
+ .fn-body {
409
+ font-size: clamp(0.8rem, 1.1vw, 1rem);
410
+ color: var(--dim);
411
+ letter-spacing: 0.02em;
412
+ }
413
+ .fn-stage.fnc-accent .fn-shape { background: var(--accent-soft); border-color: var(--accent); }
414
+ .fn-stage.fnc-accent .fn-label,
415
+ .fn-stage.fnc-accent .fn-value { color: var(--accent); }
416
+ .fn-stage.fnc-blue .fn-shape { background: rgba(24, 158, 255, 0.10); border-color: var(--blue); }
417
+ .fn-stage.fnc-blue .fn-label,
418
+ .fn-stage.fnc-blue .fn-value { color: var(--blue); }
419
+ .fn-stage.fnc-amber .fn-shape { background: rgba(255, 180, 84, 0.10); border-color: var(--amber); }
420
+ .fn-stage.fnc-amber .fn-label,
421
+ .fn-stage.fnc-amber .fn-value { color: var(--amber); }
422
+ .fn-stage.fnc-red .fn-shape { background: rgba(255, 92, 92, 0.10); border-color: var(--red); }
423
+ .fn-stage.fnc-red .fn-label,
424
+ .fn-stage.fnc-red .fn-value { color: var(--red); }
425
+ .fn-stage.fnc-dim .fn-shape { background: transparent; border-color: var(--dim-2); }
426
+ .fn-stage.fnc-dim .fn-label { color: var(--dim); }
427
+ .fn-stage.fn-outcome .fn-content { gap: clamp(1.4rem, 4vw, 3.4rem); }