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,511 @@
1
+ /* Stagecraft — Phosphor theme: engine + base styles. */
2
+
3
+ * { box-sizing: border-box; margin: 0; padding: 0; }
4
+
5
+ html, body {
6
+ height: 100%;
7
+ background: var(--bg);
8
+ color: var(--fg);
9
+ font-family: var(--body);
10
+ font-weight: 400;
11
+ -webkit-font-smoothing: antialiased;
12
+ -moz-osx-font-smoothing: grayscale;
13
+ overflow: hidden;
14
+ }
15
+
16
+ body.idle { cursor: none; }
17
+
18
+ /* subtle ambient gradient */
19
+ body::before {
20
+ content: '';
21
+ position: fixed;
22
+ inset: 0;
23
+ background: radial-gradient(ellipse at center, rgba(255,255,255,0.025) 0%, transparent 60%);
24
+ pointer-events: none;
25
+ z-index: 0;
26
+ }
27
+
28
+ /* film grain */
29
+ body::after {
30
+ content: '';
31
+ position: fixed;
32
+ inset: 0;
33
+ 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>");
34
+ pointer-events: none;
35
+ z-index: 1000;
36
+ mix-blend-mode: overlay;
37
+ opacity: 0.6;
38
+ }
39
+
40
+ #stage {
41
+ position: fixed;
42
+ inset: 0;
43
+ z-index: 1;
44
+ }
45
+
46
+ .slide {
47
+ position: absolute;
48
+ inset: 0;
49
+ display: flex;
50
+ flex-direction: column;
51
+ align-items: center;
52
+ justify-content: center;
53
+ padding: clamp(2rem, 6vw, 6rem);
54
+ opacity: 0;
55
+ pointer-events: none;
56
+ }
57
+ .slide.current { opacity: 1; pointer-events: auto; }
58
+
59
+ /* ---------- Typography ---------- */
60
+ .hero {
61
+ font-size: clamp(2.5rem, 7vw, 6.5rem);
62
+ font-weight: 500;
63
+ line-height: 1.05;
64
+ letter-spacing: -0.025em;
65
+ max-width: 22ch;
66
+ text-align: center;
67
+ }
68
+ .hero-xl {
69
+ font-size: clamp(3rem, 9vw, 8rem);
70
+ font-weight: 500;
71
+ line-height: 1.0;
72
+ letter-spacing: -0.03em;
73
+ max-width: 18ch;
74
+ text-align: center;
75
+ }
76
+ .pre-label {
77
+ font-size: 0.85rem;
78
+ font-weight: 400;
79
+ letter-spacing: 0.25em;
80
+ text-transform: uppercase;
81
+ color: var(--dim);
82
+ margin-bottom: 2.5rem;
83
+ }
84
+ .pre-label .dot {
85
+ display: inline-block;
86
+ width: 7px;
87
+ height: 7px;
88
+ background: var(--accent);
89
+ margin-right: 0.7rem;
90
+ vertical-align: middle;
91
+ animation: pulse 2s ease-in-out infinite;
92
+ }
93
+ .pre-label.blue .dot { background: var(--blue); }
94
+
95
+ .sub {
96
+ margin-top: 2.5rem;
97
+ font-size: clamp(0.95rem, 1.3vw, 1.2rem);
98
+ color: var(--dim);
99
+ letter-spacing: 0.02em;
100
+ text-align: center;
101
+ }
102
+ .sub strong { color: var(--fg); font-weight: 500; }
103
+
104
+ .accent { color: var(--accent); }
105
+ .accent-blue { color: var(--blue); }
106
+ .dim { color: var(--dim); }
107
+
108
+ /* Caret */
109
+ .caret {
110
+ display: inline-block;
111
+ width: 0.55em;
112
+ height: 1em;
113
+ background: var(--accent);
114
+ margin-left: 0.15em;
115
+ vertical-align: -0.12em;
116
+ animation: blink 1.1s steps(2, end) infinite;
117
+ box-shadow: 0 0 12px var(--accent-glow);
118
+ }
119
+ @keyframes blink { 50% { opacity: 0; } }
120
+ @keyframes pulse { 50% { opacity: 0.4; } }
121
+
122
+ /* ---------- Chrome ---------- */
123
+ .ui {
124
+ position: fixed;
125
+ inset: 0;
126
+ pointer-events: none;
127
+ z-index: 100;
128
+ font-size: 0.72rem;
129
+ letter-spacing: 0.18em;
130
+ text-transform: uppercase;
131
+ color: var(--dim);
132
+ font-family: var(--mono);
133
+ }
134
+ .ui-brand { position: absolute; top: 1.8rem; left: 2.2rem; }
135
+ .ui-brand .br-accent { color: var(--fg); font-weight: 500; }
136
+ .ui-title {
137
+ position: absolute;
138
+ top: 1.8rem; right: 2.2rem;
139
+ text-align: right;
140
+ max-width: 40ch;
141
+ }
142
+ .ui-counter {
143
+ position: absolute;
144
+ bottom: 1.8rem; left: 2.2rem;
145
+ color: var(--fg);
146
+ font-weight: 500;
147
+ }
148
+ .ui-counter .slash { color: var(--dim); margin: 0 0.4em; }
149
+ .ui-counter .total { color: var(--dim); }
150
+ .ui-dots {
151
+ position: absolute;
152
+ bottom: 1.8rem; right: 2.2rem;
153
+ display: flex;
154
+ gap: 0.7rem;
155
+ align-items: center;
156
+ }
157
+ .ui-dots .dot {
158
+ width: 6px; height: 6px;
159
+ background: var(--dim-2);
160
+ transition: background 300ms, box-shadow 300ms, transform 300ms;
161
+ }
162
+ .ui-dots .dot.active {
163
+ background: var(--accent);
164
+ box-shadow: 0 0 10px var(--accent-glow);
165
+ transform: scale(1.15);
166
+ }
167
+ .ui-dots .dot.past { background: var(--dim); }
168
+
169
+ .ui-hint {
170
+ position: absolute;
171
+ bottom: 1.8rem;
172
+ left: 50%;
173
+ transform: translateX(-50%);
174
+ font-size: 0.68rem;
175
+ letter-spacing: 0.25em;
176
+ color: var(--dim-2);
177
+ opacity: 0;
178
+ transition: opacity 300ms;
179
+ }
180
+ .ui-hint.visible { opacity: 1; }
181
+
182
+ .ui-brand, .ui-title, .ui-counter, .ui-dots {
183
+ opacity: 0;
184
+ transition: opacity 700ms ease-out;
185
+ }
186
+ body.armed .ui-brand,
187
+ body.armed .ui-title,
188
+ body.armed .ui-counter,
189
+ body.armed .ui-dots { opacity: 1; }
190
+
191
+ /* ---------- Welcome ---------- */
192
+ .welcome {
193
+ position: fixed;
194
+ inset: 0;
195
+ background: var(--bg);
196
+ z-index: 200;
197
+ display: flex;
198
+ flex-direction: column;
199
+ align-items: center;
200
+ justify-content: center;
201
+ transition: opacity 500ms ease-out;
202
+ }
203
+ .welcome.hidden { opacity: 0; pointer-events: none; }
204
+ .welcome .key-prompt {
205
+ font-size: 0.85rem;
206
+ letter-spacing: 0.3em;
207
+ text-transform: uppercase;
208
+ color: var(--dim);
209
+ margin-bottom: 1rem;
210
+ }
211
+ .welcome .key-prompt .accent { color: var(--accent); }
212
+ .welcome h1 {
213
+ font-size: clamp(1.2rem, 2vw, 1.6rem);
214
+ font-weight: 400;
215
+ letter-spacing: -0.01em;
216
+ color: var(--fg);
217
+ margin-bottom: 0.4rem;
218
+ }
219
+ .welcome .by {
220
+ font-size: 0.85rem;
221
+ color: var(--dim);
222
+ letter-spacing: 0.15em;
223
+ }
224
+
225
+ /* ---------- Stagger ---------- */
226
+ .stagger > * {
227
+ opacity: 0;
228
+ transform: translateY(12px);
229
+ transition: opacity 700ms ease-out, transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
230
+ }
231
+ .stagger > *.in { opacity: 1; transform: translateY(0); }
232
+
233
+ /* ---------- Storyboard ---------- */
234
+ .overview {
235
+ position: fixed;
236
+ inset: 0;
237
+ background: var(--bg);
238
+ z-index: 300;
239
+ overflow-y: auto;
240
+ overflow-x: hidden;
241
+ opacity: 0;
242
+ transition: opacity 250ms ease-out;
243
+ padding: 5rem 2rem 2rem;
244
+ }
245
+ .overview.in { opacity: 1; }
246
+ .overview-header {
247
+ position: fixed;
248
+ top: 0; left: 0; right: 0;
249
+ padding: 1.3rem 2rem;
250
+ background: rgba(10,10,10,0.88);
251
+ backdrop-filter: blur(10px);
252
+ -webkit-backdrop-filter: blur(10px);
253
+ border-bottom: 1px solid var(--dim-2);
254
+ z-index: 310;
255
+ display: flex;
256
+ justify-content: space-between;
257
+ align-items: baseline;
258
+ font-size: 0.72rem;
259
+ letter-spacing: 0.25em;
260
+ text-transform: uppercase;
261
+ color: var(--dim);
262
+ font-family: var(--mono);
263
+ }
264
+ .overview-header .left strong { color: var(--fg); font-weight: 500; }
265
+ .overview-header .accent { color: var(--accent); }
266
+ .overview-grid {
267
+ display: grid;
268
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
269
+ gap: 1.2rem;
270
+ max-width: 1700px;
271
+ margin: 0 auto;
272
+ }
273
+ .tile {
274
+ position: relative;
275
+ overflow: hidden;
276
+ background: var(--bg);
277
+ border: 1px solid var(--dim-2);
278
+ cursor: pointer;
279
+ transition: border-color 200ms ease-out, transform 200ms ease-out, box-shadow 200ms ease-out;
280
+ }
281
+ .tile:hover { border-color: var(--accent); transform: translateY(-3px); }
282
+ .tile.current {
283
+ border-color: var(--accent);
284
+ box-shadow: 0 0 0 1px var(--accent), 0 0 28px var(--accent-glow);
285
+ }
286
+ .tile-scaler {
287
+ position: absolute;
288
+ top: 0; left: 0;
289
+ transform-origin: top left;
290
+ pointer-events: none;
291
+ }
292
+ .tile-scaler > .slide {
293
+ position: absolute !important;
294
+ inset: 0 !important;
295
+ opacity: 1 !important;
296
+ transform: none !important;
297
+ transition: none !important;
298
+ }
299
+ .tile-num {
300
+ position: absolute;
301
+ top: 0.5rem; left: 0.7rem;
302
+ font-size: 0.65rem;
303
+ color: var(--dim);
304
+ letter-spacing: 0.25em;
305
+ z-index: 4;
306
+ font-weight: 500;
307
+ background: rgba(10,10,10,0.7);
308
+ padding: 0.2rem 0.5rem;
309
+ font-family: var(--mono);
310
+ }
311
+ .tile.current .tile-num { color: var(--accent); }
312
+ .tile-label {
313
+ position: absolute;
314
+ bottom: 0; left: 0; right: 0;
315
+ background: linear-gradient(to top, rgba(10,10,10,0.95) 40%, rgba(10,10,10,0));
316
+ color: var(--fg);
317
+ font-size: 0.68rem;
318
+ letter-spacing: 0.18em;
319
+ text-transform: uppercase;
320
+ padding: 1.6rem 0.8rem 0.6rem;
321
+ z-index: 4;
322
+ pointer-events: none;
323
+ font-family: var(--mono);
324
+ }
325
+
326
+ /* responsive */
327
+ @media (max-width: 700px) {
328
+ .ui-hint { display: none; }
329
+ }
330
+
331
+ /* a11y */
332
+ @media (prefers-reduced-motion: reduce) {
333
+ *, *::before, *::after {
334
+ animation-duration: 0.001ms !important;
335
+ transition-duration: 0.001ms !important;
336
+ }
337
+ }
338
+
339
+ /* Material Symbols Outlined — for components that want icons */
340
+ .material-symbols-outlined {
341
+ font-family: 'Material Symbols Outlined';
342
+ font-weight: normal;
343
+ font-style: normal;
344
+ line-height: 1;
345
+ letter-spacing: normal;
346
+ text-transform: none;
347
+ display: inline-block;
348
+ white-space: nowrap;
349
+ word-wrap: normal;
350
+ direction: ltr;
351
+ font-feature-settings: 'liga';
352
+ -webkit-font-feature-settings: 'liga';
353
+ -webkit-font-smoothing: antialiased;
354
+ font-variation-settings: 'opsz' 24, 'wght' 400, 'FILL' 0, 'GRAD' 0;
355
+ }
356
+
357
+ /* Edit-mode body marker (subtle ring) */
358
+ body.edit-mode #stage::after {
359
+ content: '';
360
+ position: fixed;
361
+ inset: 0;
362
+ border: 2px solid var(--accent);
363
+ pointer-events: none;
364
+ z-index: 99;
365
+ box-shadow: inset 0 0 30px var(--accent-soft);
366
+ opacity: 0.3;
367
+ }
368
+
369
+ /* ----------------------------------------------------------------------------
370
+ * Presenter view (multi-monitor / second window)
371
+ *
372
+ * Activated via ?mode=presenter on the URL. The engine builds a different
373
+ * chrome and renders the current slide into a half-screen pane plus a
374
+ * thumbnail of the next slide, a notes panel, and a timer. This window
375
+ * is intended to live on the laptop while the main window goes on the beamer.
376
+ * -------------------------------------------------------------------------- */
377
+ body.presenter-mode {
378
+ overflow: auto;
379
+ background: var(--bg);
380
+ }
381
+ body.presenter-mode::before,
382
+ body.presenter-mode::after { display: none; } /* no film grain / ambient gradient */
383
+
384
+ .presenter-shell {
385
+ display: grid;
386
+ grid-template-rows: 1fr auto auto;
387
+ height: 100vh;
388
+ gap: 0.5rem;
389
+ padding: 0.7rem;
390
+ }
391
+ .presenter-top {
392
+ display: grid;
393
+ grid-template-columns: 1.55fr 1fr;
394
+ gap: 0.7rem;
395
+ min-height: 0; /* allow children to overflow:hidden */
396
+ }
397
+ .presenter-pane {
398
+ position: relative;
399
+ background: var(--bg-elevated);
400
+ border: 1px solid var(--dim-2);
401
+ overflow: hidden;
402
+ }
403
+ .presenter-pane-label {
404
+ position: absolute;
405
+ top: 0.5rem; left: 0.6rem;
406
+ z-index: 10;
407
+ font-size: 0.65rem;
408
+ letter-spacing: 0.2em;
409
+ text-transform: uppercase;
410
+ color: var(--dim);
411
+ font-family: var(--mono);
412
+ background: rgba(10, 10, 10, 0.75);
413
+ padding: 0.15rem 0.45rem;
414
+ }
415
+ .presenter-current .presenter-pane-label {
416
+ color: var(--accent);
417
+ }
418
+ .presenter-pane-stage {
419
+ position: absolute;
420
+ inset: 0;
421
+ overflow: hidden;
422
+ }
423
+ /* Slides rendered into a presenter pane need to be size-constrained to the
424
+ * pane (not viewport). They retain their original layout via flex centering
425
+ * and clamp() typography. */
426
+ .presenter-pane .slide {
427
+ position: absolute !important;
428
+ inset: 0 !important;
429
+ opacity: 1 !important;
430
+ transform: none !important;
431
+ transition: none !important;
432
+ pointer-events: none;
433
+ }
434
+ .presenter-end {
435
+ position: absolute;
436
+ inset: 0;
437
+ display: flex;
438
+ align-items: center;
439
+ justify-content: center;
440
+ color: var(--dim);
441
+ letter-spacing: 0.25em;
442
+ text-transform: uppercase;
443
+ font-size: 0.9rem;
444
+ }
445
+
446
+ /* Meta strip: timer + clock + reset */
447
+ .presenter-meta {
448
+ display: grid;
449
+ grid-template-columns: auto 1fr auto;
450
+ align-items: center;
451
+ gap: 1.2rem;
452
+ padding: 0.6rem 1rem;
453
+ background: var(--bg-elevated);
454
+ border: 1px solid var(--dim-2);
455
+ font-family: var(--mono);
456
+ }
457
+ .presenter-timer {
458
+ font-size: clamp(1.4rem, 2.5vw, 2rem);
459
+ font-weight: 500;
460
+ color: var(--accent);
461
+ font-variant-numeric: tabular-nums;
462
+ letter-spacing: 0.04em;
463
+ }
464
+ .presenter-clock {
465
+ font-size: 0.9rem;
466
+ color: var(--dim);
467
+ letter-spacing: 0.15em;
468
+ text-align: right;
469
+ }
470
+ .presenter-timer-reset {
471
+ background: transparent;
472
+ color: var(--dim);
473
+ border: 1px solid var(--dim-2);
474
+ font-family: inherit;
475
+ font-size: 0.7rem;
476
+ letter-spacing: 0.18em;
477
+ text-transform: uppercase;
478
+ padding: 0.35rem 0.7rem;
479
+ cursor: pointer;
480
+ }
481
+ .presenter-timer-reset:hover {
482
+ color: var(--accent);
483
+ border-color: var(--accent);
484
+ }
485
+
486
+ /* Notes panel */
487
+ .presenter-notes {
488
+ background: var(--bg-elevated);
489
+ border: 1px solid var(--dim-2);
490
+ padding: 0.8rem 1rem;
491
+ max-height: 30vh;
492
+ overflow-y: auto;
493
+ }
494
+ .presenter-notes-label {
495
+ font-size: 0.65rem;
496
+ letter-spacing: 0.2em;
497
+ text-transform: uppercase;
498
+ color: var(--dim);
499
+ font-family: var(--mono);
500
+ margin-bottom: 0.5rem;
501
+ }
502
+ .presenter-notes-body {
503
+ font-size: clamp(0.95rem, 1.4vw, 1.15rem);
504
+ line-height: 1.5;
505
+ color: var(--fg);
506
+ white-space: pre-wrap;
507
+ }
508
+ .presenter-notes-body.empty {
509
+ color: var(--dim);
510
+ font-style: italic;
511
+ }