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,450 @@
1
+ /* Stagecraft — Phosphor theme: layout components. */
2
+
3
+ /* ---------------------------------------------------------------------------
4
+ * ImageText
5
+ * ------------------------------------------------------------------------- */
6
+ .image-text {
7
+ display: grid;
8
+ grid-template-columns: 1fr 1fr;
9
+ gap: clamp(2rem, 5vw, 5rem);
10
+ align-items: center;
11
+ width: min(1400px, 94vw);
12
+ }
13
+ .image-text--right { grid-template-areas: 'text image'; }
14
+ .image-text--right .it-figure { grid-area: image; }
15
+ .image-text--right .it-text { grid-area: text; }
16
+ .image-text--left { grid-template-areas: 'image text'; }
17
+ .image-text--left .it-figure { grid-area: image; }
18
+ .image-text--left .it-text { grid-area: text; }
19
+
20
+ .it-figure {
21
+ position: relative;
22
+ margin: 0;
23
+ aspect-ratio: 4 / 5;
24
+ overflow: hidden;
25
+ background: var(--bg-elevated);
26
+ opacity: 0;
27
+ transform: translateX(-30px) scale(0.98);
28
+ transition: opacity 900ms ease-out, transform 1100ms cubic-bezier(0.16, 1, 0.3, 1);
29
+ }
30
+ .image-text--right .it-figure { transform: translateX(30px) scale(0.98); }
31
+ .it-figure.in { opacity: 1; transform: translateX(0) scale(1); }
32
+ .it-img {
33
+ width: 100%;
34
+ height: 100%;
35
+ object-fit: cover;
36
+ display: block;
37
+ filter: saturate(0.92) contrast(1.04);
38
+ }
39
+ .it-img-frame {
40
+ position: absolute;
41
+ inset: 0;
42
+ pointer-events: none;
43
+ box-shadow:
44
+ inset 0 0 0 1px var(--dim-2),
45
+ 0 0 0 1px var(--dim-2),
46
+ 0 30px 60px -20px rgba(0,0,0,0.6),
47
+ 0 0 60px -10px var(--accent-glow);
48
+ }
49
+
50
+ .it-text {
51
+ display: flex;
52
+ flex-direction: column;
53
+ gap: clamp(0.8rem, 1.5vw, 1.4rem);
54
+ }
55
+ .it-heading {
56
+ margin: 0;
57
+ font-size: clamp(2.5rem, 5.5vw, 4rem);
58
+ font-weight: 500;
59
+ letter-spacing: -0.03em;
60
+ line-height: 1.05;
61
+ color: var(--fg);
62
+ opacity: 0;
63
+ transform: translateY(14px);
64
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1);
65
+ }
66
+ .it-heading.in { opacity: 1; transform: translateY(0); }
67
+ .it-body {
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: 0.4em;
71
+ }
72
+ .it-line {
73
+ font-size: clamp(1rem, 1.6vw, 1.4rem);
74
+ line-height: 1.5;
75
+ color: var(--fg);
76
+ opacity: 0;
77
+ transform: translateY(10px);
78
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
79
+ }
80
+ .it-line.in { opacity: 1; transform: translateY(0); }
81
+ .it-caption {
82
+ margin-top: 0.6rem;
83
+ font-size: clamp(0.85rem, 1.1vw, 1rem);
84
+ color: var(--dim);
85
+ letter-spacing: 0.08em;
86
+ text-transform: uppercase;
87
+ opacity: 0;
88
+ transition: opacity 800ms ease-out;
89
+ }
90
+ .it-caption.in { opacity: 1; }
91
+
92
+ @media (max-width: 800px) {
93
+ .image-text, .image-text--left, .image-text--right {
94
+ grid-template-columns: 1fr;
95
+ grid-template-areas: 'image' 'text';
96
+ }
97
+ .it-figure { aspect-ratio: 16 / 10; }
98
+ }
99
+
100
+ /* ---------------------------------------------------------------------------
101
+ * FullImage
102
+ * ------------------------------------------------------------------------- */
103
+ .full-image-host {
104
+ padding: 0 !important;
105
+ display: block !important;
106
+ width: 100vw;
107
+ height: 100vh;
108
+ position: relative;
109
+ }
110
+ .full-image {
111
+ position: absolute;
112
+ inset: 0;
113
+ overflow: hidden;
114
+ }
115
+ .fi-bg {
116
+ position: absolute;
117
+ inset: 0;
118
+ background-size: cover;
119
+ background-position: center;
120
+ background-repeat: no-repeat;
121
+ opacity: 0;
122
+ transform: scale(1.04);
123
+ transition: opacity 1200ms ease-out, transform 18s linear;
124
+ }
125
+ .fi-bg.in { opacity: 1; }
126
+ .fi-bg.drift { transform: scale(1.12) translate(-1%, 1%); }
127
+
128
+ .fi-overlay {
129
+ position: absolute;
130
+ inset: 0;
131
+ display: flex;
132
+ padding: clamp(2rem, 6vw, 5rem);
133
+ pointer-events: none;
134
+ z-index: 2;
135
+ }
136
+ .fi-overlay--center { align-items: center; justify-content: center; text-align: center; }
137
+ .fi-overlay--top { align-items: flex-start; justify-content: center; text-align: center; }
138
+ .fi-overlay--bottom-left { align-items: flex-end; justify-content: flex-start; }
139
+ .fi-overlay--bottom-right { align-items: flex-end; justify-content: flex-end; text-align: right; }
140
+
141
+ .fi-scrim {
142
+ position: absolute;
143
+ inset: 0;
144
+ pointer-events: none;
145
+ z-index: -1;
146
+ }
147
+ .fi-scrim--center { background: radial-gradient(ellipse at center, rgba(10,10,10,0.55) 0%, rgba(10,10,10,0.1) 70%); }
148
+ .fi-scrim--top { background: linear-gradient(180deg, rgba(10,10,10,0.75), transparent 50%); }
149
+ .fi-scrim--bottom-left { background: linear-gradient(45deg, rgba(10,10,10,0.85), transparent 60%); }
150
+ .fi-scrim--bottom-right { background: linear-gradient(315deg, rgba(10,10,10,0.85), transparent 60%); }
151
+
152
+ .fi-overlay-inner {
153
+ position: relative;
154
+ z-index: 1;
155
+ max-width: 32ch;
156
+ display: flex;
157
+ flex-direction: column;
158
+ gap: clamp(0.8rem, 1.5vw, 1.4rem);
159
+ }
160
+ .fi-overlay--center .fi-overlay-inner,
161
+ .fi-overlay--top .fi-overlay-inner { max-width: 28ch; }
162
+ .fi-headline {
163
+ font-size: clamp(2rem, 5vw, 4rem);
164
+ font-weight: 500;
165
+ letter-spacing: -0.03em;
166
+ line-height: 1.05;
167
+ color: var(--fg);
168
+ text-shadow: 0 2px 30px rgba(0,0,0,0.55);
169
+ opacity: 0;
170
+ transform: translateY(14px);
171
+ transition: opacity 800ms ease-out, transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
172
+ }
173
+ .fi-headline.in { opacity: 1; transform: translateY(0); }
174
+ .fi-body {
175
+ font-size: clamp(1rem, 1.4vw, 1.25rem);
176
+ color: var(--fg);
177
+ opacity: 0;
178
+ transform: translateY(8px);
179
+ transition: opacity 800ms ease-out, transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
180
+ }
181
+ .fi-body.in { opacity: 0.92; transform: translateY(0); }
182
+
183
+ /* ---------------------------------------------------------------------------
184
+ * Quote
185
+ * ------------------------------------------------------------------------- */
186
+ .quote {
187
+ position: relative;
188
+ text-align: center;
189
+ max-width: min(1100px, 92vw);
190
+ display: grid;
191
+ grid-template-columns: auto 1fr auto;
192
+ grid-template-rows: auto auto;
193
+ align-items: center;
194
+ column-gap: clamp(0.5rem, 1.5vw, 1.5rem);
195
+ row-gap: clamp(1.5rem, 4vw, 3rem);
196
+ }
197
+ .q-mark {
198
+ font-size: clamp(4rem, 9vw, 8rem);
199
+ line-height: 0.8;
200
+ color: var(--accent);
201
+ text-shadow: 0 0 30px var(--accent-glow);
202
+ opacity: 0;
203
+ transform: scale(0.6);
204
+ transition: opacity 600ms ease-out, transform 700ms cubic-bezier(0.34, 1.56, 0.64, 1);
205
+ align-self: start;
206
+ user-select: none;
207
+ }
208
+ .q-mark.in { opacity: 1; transform: scale(1); }
209
+ .q-mark--open { padding-top: 0.2em; }
210
+ .q-mark--close { padding-top: 0.2em; align-self: end; }
211
+
212
+ .q-text {
213
+ margin: 0;
214
+ font-style: italic;
215
+ font-size: clamp(1.8rem, 4vw, 3rem);
216
+ font-weight: 400;
217
+ line-height: 1.25;
218
+ letter-spacing: -0.015em;
219
+ color: var(--fg);
220
+ opacity: 0;
221
+ transform: translateY(12px);
222
+ transition: opacity 900ms ease-out, transform 1000ms cubic-bezier(0.16, 1, 0.3, 1);
223
+ grid-column: 2;
224
+ }
225
+ .q-text.in { opacity: 1; transform: translateY(0); }
226
+
227
+ .q-meta {
228
+ grid-column: 1 / -1;
229
+ display: flex;
230
+ flex-wrap: wrap;
231
+ justify-content: center;
232
+ align-items: baseline;
233
+ gap: 0.6rem;
234
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
235
+ letter-spacing: 0.04em;
236
+ opacity: 0;
237
+ transform: translateY(8px);
238
+ transition: opacity 800ms ease-out, transform 900ms ease-out;
239
+ }
240
+ .q-meta.in { opacity: 1; transform: translateY(0); }
241
+ .q-author { color: var(--fg); font-weight: 500; }
242
+ .q-role,
243
+ .q-source { color: var(--dim); }
244
+ .q-sep { color: var(--dim-2); }
245
+
246
+ /* ---------------------------------------------------------------------------
247
+ * BigNumber
248
+ * ------------------------------------------------------------------------- */
249
+ .big-number {
250
+ text-align: center;
251
+ display: flex;
252
+ flex-direction: column;
253
+ align-items: center;
254
+ gap: clamp(0.8rem, 1.6vw, 1.4rem);
255
+ }
256
+ .bn-figure {
257
+ display: inline-flex;
258
+ align-items: baseline;
259
+ gap: 0.05em;
260
+ line-height: 0.9;
261
+ }
262
+ .bn-num {
263
+ font-size: clamp(6rem, 18vw, 14rem);
264
+ font-weight: 500;
265
+ letter-spacing: -0.05em;
266
+ color: var(--accent);
267
+ font-variant-numeric: tabular-nums;
268
+ text-shadow: 0 0 60px var(--accent-glow);
269
+ line-height: 1;
270
+ }
271
+ .bn-unit {
272
+ font-size: clamp(2.5rem, 7vw, 5.5rem);
273
+ font-weight: 400;
274
+ letter-spacing: -0.03em;
275
+ color: var(--dim);
276
+ margin-left: 0.1em;
277
+ opacity: 0;
278
+ transform: translateX(-6px);
279
+ transition: opacity 600ms ease-out, transform 700ms ease-out;
280
+ }
281
+ .bn-unit.in { opacity: 1; transform: translateX(0); }
282
+ .bn-label {
283
+ font-size: clamp(1.5rem, 2.5vw, 2rem);
284
+ color: var(--fg);
285
+ letter-spacing: -0.01em;
286
+ max-width: 24ch;
287
+ opacity: 0;
288
+ transform: translateY(10px);
289
+ transition: opacity 700ms ease-out, transform 800ms ease-out;
290
+ }
291
+ .bn-label.in { opacity: 1; transform: translateY(0); }
292
+ .bn-caption {
293
+ margin-top: 0.6rem;
294
+ font-size: clamp(0.9rem, 1.2vw, 1.1rem);
295
+ color: var(--dim);
296
+ letter-spacing: 0.06em;
297
+ text-transform: uppercase;
298
+ opacity: 0;
299
+ transition: opacity 800ms ease-out;
300
+ }
301
+ .bn-caption.in { opacity: 1; }
302
+
303
+ /* ---------------------------------------------------------------------------
304
+ * Stats
305
+ * ------------------------------------------------------------------------- */
306
+ .stats {
307
+ display: grid;
308
+ gap: clamp(1.5rem, 3vw, 2.5rem);
309
+ width: min(1300px, 94vw);
310
+ }
311
+ .stats--cols-1 { grid-template-columns: 1fr; }
312
+ .stats--cols-2 { grid-template-columns: repeat(2, 1fr); }
313
+ .stats--cols-3 { grid-template-columns: repeat(3, 1fr); }
314
+ .stats--cols-4 { grid-template-columns: repeat(4, 1fr); }
315
+
316
+ .stat {
317
+ display: flex;
318
+ flex-direction: column;
319
+ gap: 0.6rem;
320
+ padding: clamp(1.2rem, 2.5vw, 2rem);
321
+ border: 1px solid var(--dim-2);
322
+ background: var(--bg-elevated);
323
+ position: relative;
324
+ opacity: 0;
325
+ transform: translateY(14px);
326
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 600ms ease;
327
+ }
328
+ .stat.in { opacity: 1; transform: translateY(0); }
329
+ .stat::before {
330
+ content: '';
331
+ position: absolute;
332
+ top: 0; left: 0;
333
+ width: 100%;
334
+ height: 2px;
335
+ background: var(--dim-2);
336
+ transition: background 600ms ease;
337
+ }
338
+ .stat--accent::before { background: var(--accent); box-shadow: 0 0 14px var(--accent-glow); }
339
+ .stat--amber::before { background: var(--amber); }
340
+ .stat--blue::before { background: var(--blue); }
341
+ .stat--red::before { background: var(--red); }
342
+
343
+ .stat-figure {
344
+ display: flex;
345
+ align-items: baseline;
346
+ gap: 0.05em;
347
+ }
348
+ .stat-num {
349
+ font-size: clamp(2.8rem, 6vw, 5rem);
350
+ font-weight: 500;
351
+ letter-spacing: -0.04em;
352
+ color: var(--fg);
353
+ font-variant-numeric: tabular-nums;
354
+ line-height: 1;
355
+ }
356
+ .stat-unit {
357
+ font-size: clamp(1.4rem, 2.5vw, 2.2rem);
358
+ color: var(--dim);
359
+ margin-left: 0.1em;
360
+ }
361
+ .stat--accent .stat-num { color: var(--accent); text-shadow: 0 0 20px var(--accent-glow); }
362
+ .stat--amber .stat-num { color: var(--amber); }
363
+ .stat--blue .stat-num { color: var(--blue); }
364
+ .stat--red .stat-num { color: var(--red); }
365
+
366
+ .stat-label {
367
+ font-size: clamp(0.9rem, 1.25vw, 1.1rem);
368
+ color: var(--dim);
369
+ letter-spacing: 0.04em;
370
+ line-height: 1.35;
371
+ margin-top: 0.4rem;
372
+ }
373
+
374
+ @media (max-width: 800px) {
375
+ .stats--cols-3, .stats--cols-4 { grid-template-columns: repeat(2, 1fr); }
376
+ }
377
+ @media (max-width: 480px) {
378
+ .stats--cols-2, .stats--cols-3, .stats--cols-4 { grid-template-columns: 1fr; }
379
+ }
380
+
381
+ /* ---------------------------------------------------------------------------
382
+ * Bento
383
+ * ------------------------------------------------------------------------- */
384
+ .bento {
385
+ display: grid;
386
+ grid-template-columns: repeat(4, 1fr);
387
+ grid-auto-rows: minmax(clamp(8rem, 18vh, 14rem), auto);
388
+ gap: clamp(0.8rem, 1.5vw, 1.4rem);
389
+ width: min(1400px, 94vw);
390
+ }
391
+ .bento-cell {
392
+ position: relative;
393
+ display: flex;
394
+ flex-direction: column;
395
+ justify-content: flex-end;
396
+ padding: clamp(1.2rem, 2vw, 1.8rem);
397
+ background: var(--bg-elevated);
398
+ border: 1px solid var(--dim-2);
399
+ background-size: cover;
400
+ background-position: center;
401
+ overflow: hidden;
402
+ opacity: 0;
403
+ transform: translateY(16px) scale(0.985);
404
+ transition: opacity 700ms ease-out, transform 800ms cubic-bezier(0.16, 1, 0.3, 1), border-color 500ms ease;
405
+ }
406
+ .bento-cell.in { opacity: 1; transform: translateY(0) scale(1); }
407
+ .bento-cell--span-2 { grid-column: span 2; }
408
+
409
+ .bento-cell--accent { border-color: rgba(0, 255, 156, 0.35); box-shadow: 0 0 30px -8px var(--accent-glow); }
410
+ .bento-cell--accent .bento-heading { color: var(--accent); }
411
+ .bento-cell--amber { border-color: rgba(255, 180, 84, 0.4); }
412
+ .bento-cell--amber .bento-heading { color: var(--amber); }
413
+ .bento-cell--blue { border-color: rgba(24, 158, 255, 0.4); }
414
+ .bento-cell--blue .bento-heading { color: var(--blue); }
415
+
416
+ .bento-cell--image {
417
+ min-height: clamp(10rem, 22vh, 18rem);
418
+ color: var(--fg);
419
+ }
420
+ .bento-cell--image .bento-heading { color: var(--fg); text-shadow: 0 2px 18px rgba(0,0,0,0.6); }
421
+ .bento-cell--image .bento-body { color: var(--fg); opacity: 0.85; }
422
+
423
+ .bento-cell-body {
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: 0.4rem;
427
+ position: relative;
428
+ z-index: 1;
429
+ }
430
+ .bento-heading {
431
+ font-size: clamp(1.2rem, 2vw, 1.7rem);
432
+ font-weight: 500;
433
+ letter-spacing: -0.02em;
434
+ color: var(--fg);
435
+ line-height: 1.15;
436
+ }
437
+ .bento-body {
438
+ font-size: clamp(0.9rem, 1.15vw, 1.05rem);
439
+ color: var(--dim);
440
+ line-height: 1.4;
441
+ }
442
+
443
+ @media (max-width: 900px) {
444
+ .bento { grid-template-columns: repeat(2, 1fr); }
445
+ .bento-cell--span-2 { grid-column: span 2; }
446
+ }
447
+ @media (max-width: 540px) {
448
+ .bento { grid-template-columns: 1fr; }
449
+ .bento-cell--span-2 { grid-column: span 1; }
450
+ }
@@ -0,0 +1,223 @@
1
+ /* Stagecraft — Phosphor theme: Layer-2 component styles. */
2
+
3
+ /* Component expansion (Phase 2): layout / diagram / chart families */
4
+ @import url('./components-layout.css');
5
+ @import url('./components-diagram.css');
6
+ @import url('./components-chart.css');
7
+ /* Phase 3: data / business / content families */
8
+ @import url('./components-data.css');
9
+ @import url('./components-business.css');
10
+ @import url('./components-content.css');
11
+
12
+ /* KineticText */
13
+ .kinetic .line {
14
+ display: block;
15
+ opacity: 0;
16
+ transform: translateY(20px);
17
+ transition: opacity 800ms ease-out, transform 1000ms cubic-bezier(0.16, 1, 0.3, 1);
18
+ }
19
+ .kinetic .line.in { opacity: 1; transform: translateY(0); }
20
+ .kinetic .line.dim { color: var(--dim); }
21
+ .kinetic .line.accent { color: var(--accent); }
22
+ .kinetic .line.fg { color: var(--fg); }
23
+ .kinetic .line.amber { color: var(--amber); }
24
+ .kinetic .line.blue { color: var(--blue); }
25
+ .kinetic .pause { display: inline-block; width: 0.6em; }
26
+
27
+ /* SectionCard */
28
+ .section-card { text-align: center; max-width: 100%; }
29
+ .sec-rule {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ gap: clamp(1rem, 3vw, 2rem);
34
+ margin-bottom: clamp(2rem, 5vw, 4rem);
35
+ }
36
+ .sec-line { width: clamp(2.5rem, 8vw, 7rem); height: 1px; background: var(--dim); }
37
+ .sec-num {
38
+ font-size: clamp(0.95rem, 1.3vw, 1.2rem);
39
+ letter-spacing: 0.35em;
40
+ color: var(--dim);
41
+ font-weight: 500;
42
+ font-variant-numeric: tabular-nums;
43
+ }
44
+ .sec-title {
45
+ font-size: clamp(2.8rem, 8.5vw, 6.5rem);
46
+ font-weight: 500;
47
+ letter-spacing: -0.03em;
48
+ line-height: 1.05;
49
+ color: var(--fg);
50
+ margin-bottom: clamp(1rem, 2.5vw, 2rem);
51
+ max-width: 22ch;
52
+ margin-left: auto;
53
+ margin-right: auto;
54
+ }
55
+ .sec-title .accent { color: var(--accent); }
56
+ .sec-tag {
57
+ font-size: clamp(0.95rem, 1.4vw, 1.25rem);
58
+ color: var(--dim);
59
+ letter-spacing: 0.04em;
60
+ font-style: italic;
61
+ }
62
+
63
+ /* ActivityList */
64
+ .activities {
65
+ display: flex;
66
+ flex-direction: column;
67
+ gap: clamp(1.4rem, 3vw, 2.4rem);
68
+ max-width: min(900px, 90vw);
69
+ }
70
+ .activity {
71
+ display: grid;
72
+ grid-template-columns: auto 1fr;
73
+ gap: clamp(1.2rem, 3vw, 2.5rem);
74
+ align-items: baseline;
75
+ opacity: 0;
76
+ transform: translateX(-14px);
77
+ transition: opacity 600ms ease-out, transform 600ms cubic-bezier(0.16, 1, 0.3, 1);
78
+ }
79
+ .activity.in, .activity.shown { opacity: 1; transform: translateX(0); }
80
+ .activity .num {
81
+ font-size: clamp(0.85rem, 1.2vw, 1.1rem);
82
+ color: var(--dim);
83
+ letter-spacing: 0.25em;
84
+ font-weight: 500;
85
+ font-variant-numeric: tabular-nums;
86
+ min-width: 2.5ch;
87
+ padding-top: 0.6em;
88
+ }
89
+ .activity .body { display: flex; flex-direction: column; gap: 0.35rem; }
90
+ .activity .name {
91
+ font-size: clamp(1.8rem, 4.2vw, 3.6rem);
92
+ font-weight: 500;
93
+ letter-spacing: -0.025em;
94
+ line-height: 1.1;
95
+ color: var(--fg);
96
+ }
97
+ .activity .name .accent { color: var(--accent); }
98
+ .activity .desc {
99
+ font-size: clamp(0.95rem, 1.35vw, 1.2rem);
100
+ color: var(--dim);
101
+ letter-spacing: 0.01em;
102
+ }
103
+
104
+ /* Compare */
105
+ .compare {
106
+ display: grid;
107
+ grid-template-columns: 1fr 1px 1fr;
108
+ gap: 0;
109
+ width: min(1300px, 92vw);
110
+ }
111
+ .compare-col { padding: 0 clamp(2rem, 5vw, 5rem); }
112
+ .compare-h {
113
+ font-size: 0.85rem;
114
+ letter-spacing: 0.3em;
115
+ text-transform: uppercase;
116
+ color: var(--dim);
117
+ margin-bottom: 2rem;
118
+ }
119
+ .compare-h.old::before { content: '◌ '; color: var(--dim); }
120
+ .compare-h.new::before { content: '◉ '; color: var(--accent); }
121
+ .compare-list {
122
+ list-style: none;
123
+ font-size: clamp(1.1rem, 1.7vw, 1.5rem);
124
+ line-height: 2;
125
+ color: var(--fg);
126
+ }
127
+ .compare-list li {
128
+ padding-left: 1.4em;
129
+ position: relative;
130
+ opacity: 0;
131
+ transform: translateX(-8px);
132
+ transition: opacity 600ms, transform 600ms cubic-bezier(0.16, 1, 0.3, 1);
133
+ }
134
+ .compare-list li.in, .compare-list li.shown { opacity: 1; transform: translateX(0); }
135
+ .compare-list li::before {
136
+ content: '—';
137
+ position: absolute;
138
+ left: 0;
139
+ color: var(--dim);
140
+ }
141
+ .compare-list.strikethrough li {
142
+ text-decoration: line-through;
143
+ text-decoration-color: var(--dim-2);
144
+ color: var(--dim);
145
+ }
146
+ .compare-list.accent li::before { color: var(--accent); }
147
+ .compare-divider {
148
+ background: linear-gradient(to bottom, transparent, var(--dim-2) 20%, var(--dim-2) 80%, transparent);
149
+ }
150
+ @media (max-width: 700px) {
151
+ .compare { grid-template-columns: 1fr; }
152
+ .compare-divider { display: none; }
153
+ }
154
+
155
+ /* Counter */
156
+ .counter-wrap {
157
+ display: flex;
158
+ gap: clamp(2rem, 8vw, 8rem);
159
+ align-items: stretch;
160
+ justify-content: center;
161
+ flex-wrap: wrap;
162
+ }
163
+ .counter-block { text-align: left; }
164
+ .counter-label {
165
+ font-size: 0.85rem;
166
+ letter-spacing: 0.3em;
167
+ text-transform: uppercase;
168
+ color: var(--dim);
169
+ margin-bottom: 0.8rem;
170
+ }
171
+ .counter-label .dot {
172
+ display: inline-block;
173
+ width: 7px; height: 7px;
174
+ margin-right: 0.7rem;
175
+ vertical-align: middle;
176
+ }
177
+ .counter-label.accent .dot { background: var(--accent); }
178
+ .counter-label.amber .dot { background: var(--amber); }
179
+ .counter-label.blue .dot { background: var(--blue); }
180
+ .counter-label.red .dot { background: var(--red); }
181
+ .counter-num {
182
+ font-size: clamp(3rem, 8vw, 7rem);
183
+ font-weight: 500;
184
+ letter-spacing: -0.04em;
185
+ font-variant-numeric: tabular-nums;
186
+ line-height: 1;
187
+ color: var(--fg);
188
+ }
189
+ .counter-num.accent { color: var(--accent); }
190
+ .counter-num.amber { color: var(--amber); }
191
+ .counter-num.blue { color: var(--blue); }
192
+ .counter-num.red { color: var(--red); }
193
+ .counter-foot {
194
+ margin-top: 4rem;
195
+ font-size: clamp(1rem, 1.4vw, 1.3rem);
196
+ color: var(--dim);
197
+ text-align: center;
198
+ opacity: 0;
199
+ transition: opacity 1500ms ease-out;
200
+ }
201
+ .counter-foot.visible, .counter-foot.shown { opacity: 1; }
202
+ .counter-foot .accent { color: var(--accent); font-weight: 500; }
203
+
204
+ /* ShiftArrow */
205
+ .shift-line {
206
+ display: flex;
207
+ align-items: center;
208
+ justify-content: center;
209
+ gap: clamp(1rem, 4vw, 3rem);
210
+ flex-wrap: wrap;
211
+ }
212
+ .shift-from, .shift-to {
213
+ font-size: clamp(1.4rem, 3.5vw, 3rem);
214
+ font-weight: 400;
215
+ letter-spacing: -0.02em;
216
+ }
217
+ .shift-from { color: var(--dim); text-decoration: line-through; text-decoration-color: var(--dim-2); }
218
+ .shift-to { color: var(--accent); }
219
+ .shift-arrow {
220
+ font-size: clamp(1.4rem, 3.5vw, 3rem);
221
+ color: var(--accent);
222
+ font-weight: 300;
223
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "phosphor",
3
+ "displayName": "Phosphor",
4
+ "description": "Cinematic, technical, dark. JetBrains Mono on phosphor green.",
5
+ "fonts": [
6
+ "https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap",
7
+ "https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=swap"
8
+ ],
9
+ "stylesheets": ["tokens.css", "base.css", "components.css", "components-layout.css", "components-diagram.css", "components-chart.css", "components-content.css", "components-data.css", "transitions.css"],
10
+ "effects": "effects.js"
11
+ }
@@ -0,0 +1,17 @@
1
+ /* Stagecraft — Phosphor theme tokens */
2
+ :root[data-theme="phosphor"] {
3
+ --bg: #0A0A0A;
4
+ --bg-elevated: #121212;
5
+ --fg: #E6E6E6;
6
+ --dim: #666666;
7
+ --dim-2: #2a2a2a;
8
+ --accent: #00FF9C; /* phosphor green */
9
+ --accent-soft: rgba(0, 255, 156, 0.12);
10
+ --accent-glow: rgba(0, 255, 156, 0.45);
11
+ --blue: #189EFF; /* alt accent */
12
+ --amber: #FFB454;
13
+ --red: #FF5C5C;
14
+ --mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
15
+ --display: var(--mono);
16
+ --body: var(--mono);
17
+ }