@kadal/deck 0.0.0-stage → 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 (157) hide show
  1. package/LICENSE +661 -0
  2. package/LICENSING.md +40 -0
  3. package/README.md +170 -2
  4. package/dist/_virtual/_rolldown/runtime.js +13 -0
  5. package/dist/audience/index.d.ts +14 -0
  6. package/dist/audience/index.js +680 -0
  7. package/dist/backgrounds/index.d.ts +65 -0
  8. package/dist/backgrounds/index.js +604 -0
  9. package/dist/backgrounds/shared.d.ts +7 -0
  10. package/dist/backgrounds/shared.js +89 -0
  11. package/dist/cli/bin.d.ts +1 -0
  12. package/dist/cli/bin.js +8 -0
  13. package/dist/cli/host.js +111 -0
  14. package/dist/cli/index.d.ts +4 -0
  15. package/dist/cli/index.js +140 -0
  16. package/dist/cli/login.js +56 -0
  17. package/dist/cli/publish.js +159 -0
  18. package/dist/cli/vite.js +39 -0
  19. package/dist/compiler/code-meta.d.ts +33 -0
  20. package/dist/compiler/code-meta.js +81 -0
  21. package/dist/compiler/index.d.ts +8 -0
  22. package/dist/compiler/index.js +8 -0
  23. package/dist/compiler/magic-move.d.ts +26 -0
  24. package/dist/compiler/magic-move.js +33 -0
  25. package/dist/compiler/plain-text.js +7 -0
  26. package/dist/compiler/rehype-code.d.ts +18 -0
  27. package/dist/compiler/rehype-code.js +66 -0
  28. package/dist/compiler/rehype-glossary.d.ts +35 -0
  29. package/dist/compiler/rehype-glossary.js +211 -0
  30. package/dist/compiler/slots.d.ts +3 -0
  31. package/dist/compiler/slots.js +36 -0
  32. package/dist/compiler/split.d.ts +63 -0
  33. package/dist/compiler/split.js +195 -0
  34. package/dist/components/Background.d.ts +15 -0
  35. package/dist/components/Background.js +24 -0
  36. package/dist/components/Click.d.ts +54 -0
  37. package/dist/components/Click.js +129 -0
  38. package/dist/components/Code.d.ts +27 -0
  39. package/dist/components/Code.js +124 -0
  40. package/dist/components/Motion.d.ts +25 -0
  41. package/dist/components/Motion.js +45 -0
  42. package/dist/components/Sketch.d.ts +44 -0
  43. package/dist/components/Sketch.js +141 -0
  44. package/dist/components/Term.d.ts +63 -0
  45. package/dist/components/Term.js +492 -0
  46. package/dist/components/bling.d.ts +75 -0
  47. package/dist/components/bling.js +146 -0
  48. package/dist/components/content.d.ts +232 -0
  49. package/dist/components/content.js +637 -0
  50. package/dist/components/index.d.ts +10 -0
  51. package/dist/components/index.js +88 -0
  52. package/dist/core/clicks.d.ts +45 -0
  53. package/dist/core/clicks.js +75 -0
  54. package/dist/core/hash.d.ts +33 -0
  55. package/dist/core/hash.js +49 -0
  56. package/dist/core/keyboard.d.ts +17 -0
  57. package/dist/core/keyboard.js +198 -0
  58. package/dist/core/layout.d.ts +16 -0
  59. package/dist/core/layout.js +25 -0
  60. package/dist/core/model.d.ts +259 -0
  61. package/dist/core/model.js +377 -0
  62. package/dist/core/navigation.d.ts +74 -0
  63. package/dist/core/navigation.js +244 -0
  64. package/dist/core/poster.js +30 -0
  65. package/dist/core/store.d.ts +20 -0
  66. package/dist/core/store.js +64 -0
  67. package/dist/core/touch.js +27 -0
  68. package/dist/draw/DrawingLayer.js +315 -0
  69. package/dist/draw/strokes.js +188 -0
  70. package/dist/export/index.d.ts +68 -0
  71. package/dist/export/index.js +251 -0
  72. package/dist/export/run.js +81 -0
  73. package/dist/glossary/model.d.ts +81 -0
  74. package/dist/glossary/model.js +156 -0
  75. package/dist/glossary/parse.d.ts +27 -0
  76. package/dist/glossary/parse.js +90 -0
  77. package/dist/index.d.ts +31 -0
  78. package/dist/index.js +30 -0
  79. package/dist/live/LiveProvider.d.ts +20 -0
  80. package/dist/live/LiveProvider.js +450 -0
  81. package/dist/live/analytics.d.ts +15 -0
  82. package/dist/live/analytics.js +103 -0
  83. package/dist/live/client.d.ts +51 -0
  84. package/dist/live/client.js +193 -0
  85. package/dist/live/components.d.ts +64 -0
  86. package/dist/live/components.js +471 -0
  87. package/dist/live/context.d.ts +15 -0
  88. package/dist/live/context.js +28 -0
  89. package/dist/live/index.d.ts +7 -0
  90. package/dist/live/index.js +7 -0
  91. package/dist/live/protocol.d.ts +284 -0
  92. package/dist/live/protocol.js +42 -0
  93. package/dist/live/turnstile.js +49 -0
  94. package/dist/presenter/index.d.ts +20 -0
  95. package/dist/presenter/index.js +1211 -0
  96. package/dist/react/AutoAnimate.js +92 -0
  97. package/dist/react/Backgrounds.d.ts +11 -0
  98. package/dist/react/Backgrounds.js +154 -0
  99. package/dist/react/ConfettiLayer.js +85 -0
  100. package/dist/react/Deck.d.ts +35 -0
  101. package/dist/react/Deck.js +983 -0
  102. package/dist/react/Frame.d.ts +16 -0
  103. package/dist/react/Frame.js +174 -0
  104. package/dist/react/Hints.d.ts +3 -0
  105. package/dist/react/Hints.js +201 -0
  106. package/dist/react/Lightbox.js +54 -0
  107. package/dist/react/Overview.js +93 -0
  108. package/dist/react/PrintView.js +128 -0
  109. package/dist/react/ScrollView.js +128 -0
  110. package/dist/react/SlideFrame.d.ts +51 -0
  111. package/dist/react/SlideFrame.js +323 -0
  112. package/dist/react/Stage.js +151 -0
  113. package/dist/react/ThemeMenu.d.ts +5 -0
  114. package/dist/react/ThemeMenu.js +124 -0
  115. package/dist/react/Zoom.js +23 -0
  116. package/dist/react/chrome.js +339 -0
  117. package/dist/react/context.d.ts +165 -0
  118. package/dist/react/context.js +19 -0
  119. package/dist/react/hooks.d.ts +33 -0
  120. package/dist/react/hooks.js +70 -0
  121. package/dist/react/layouts.d.ts +21 -0
  122. package/dist/react/layouts.js +104 -0
  123. package/dist/react/mdx.d.ts +4 -0
  124. package/dist/react/mdx.js +33 -0
  125. package/dist/react/terms.d.ts +6 -0
  126. package/dist/react/terms.js +66 -0
  127. package/dist/renderers/Island.d.ts +57 -0
  128. package/dist/renderers/Island.js +223 -0
  129. package/dist/renderers/contract.d.ts +173 -0
  130. package/dist/renderers/contract.js +152 -0
  131. package/dist/renderers/index.d.ts +12 -0
  132. package/dist/renderers/index.js +16 -0
  133. package/dist/renderers/react.d.ts +16 -0
  134. package/dist/renderers/react.js +32 -0
  135. package/dist/renderers/web-components.d.ts +4 -0
  136. package/dist/renderers/web-components.js +103 -0
  137. package/dist/sketch/Canvas.js +49 -0
  138. package/dist/sketch/dsl.d.ts +131 -0
  139. package/dist/sketch/dsl.js +281 -0
  140. package/dist/sketch/index.d.ts +4 -0
  141. package/dist/sketch/index.js +3 -0
  142. package/dist/sketch/palette.d.ts +21 -0
  143. package/dist/sketch/palette.js +66 -0
  144. package/dist/sketch/render.d.ts +43 -0
  145. package/dist/sketch/render.js +198 -0
  146. package/dist/themes/base.css +1704 -0
  147. package/dist/themes/bling.css +592 -0
  148. package/dist/themes/glossary.css +317 -0
  149. package/dist/themes/live.css +1557 -0
  150. package/dist/themes/minimal.css +83 -0
  151. package/dist/themes/rla.css +92 -0
  152. package/dist/themes/sketch.css +121 -0
  153. package/dist/themes/stack.css +62 -0
  154. package/dist/vite/index.d.ts +15 -0
  155. package/dist/vite/index.js +320 -0
  156. package/package.json +159 -4
  157. package/tools/verify-island.mjs +150 -0
@@ -0,0 +1,1557 @@
1
+ /* ─────────────────────────────────────────────────────────────────────────────
2
+ @kadal/deck — the live pieces: drawing, pointer, reactions, polls, the presenter
3
+ view, the audience page, stats, backgrounds. Loaded by base.css.
4
+ ───────────────────────────────────────────────────────────────────────────── */
5
+ .deck-muted {
6
+ color: var(--deck-muted);
7
+ }
8
+
9
+ /* drawing + pointer */
10
+ .deck-drawing {
11
+ position: absolute;
12
+ z-index: 30;
13
+ touch-action: none;
14
+ }
15
+ .deck-draw-toolbar-host .deck-draw-toolbar {
16
+ position: fixed;
17
+ }
18
+ .deck-draw-toolbar {
19
+ position: absolute;
20
+ z-index: 35;
21
+ left: 50%;
22
+ bottom: 18px;
23
+ transform: translateX(-50%);
24
+ display: flex;
25
+ align-items: center;
26
+ gap: 4px;
27
+ padding: 6px 8px;
28
+ border-radius: 999px;
29
+ background: var(--deck-bg);
30
+ border: 1px solid var(--deck-border);
31
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
32
+ }
33
+ .deck-draw-toolbar button {
34
+ width: 34px;
35
+ height: 34px;
36
+ border-radius: 50%;
37
+ border: 0;
38
+ background: transparent;
39
+ color: var(--deck-fg);
40
+ cursor: pointer;
41
+ display: grid;
42
+ place-items: center;
43
+ font-size: 15px;
44
+ }
45
+ .deck-draw-toolbar button.is-on {
46
+ background: var(--deck-surface);
47
+ box-shadow: inset 0 0 0 2px var(--deck-accent);
48
+ }
49
+ .deck-draw-color {
50
+ border: 0 !important;
51
+ background: transparent !important;
52
+ box-shadow: none !important;
53
+ padding: 0;
54
+ }
55
+ .deck-draw-swatch {
56
+ display: block;
57
+ width: 24px;
58
+ height: 24px;
59
+ border-radius: 50%;
60
+ border: 2px solid var(--deck-border);
61
+ background-clip: padding-box;
62
+ box-sizing: border-box;
63
+ }
64
+ .deck-draw-color.is-on .deck-draw-swatch {
65
+ border-color: var(--deck-accent);
66
+ box-shadow: 0 0 0 2px var(--deck-accent);
67
+ }
68
+ .deck-draw-dot {
69
+ display: block;
70
+ border-radius: 50%;
71
+ background: var(--deck-fg);
72
+ }
73
+ .deck-draw-sep {
74
+ width: 1px;
75
+ height: 22px;
76
+ background: var(--deck-border);
77
+ margin: 0 4px;
78
+ }
79
+ .deck-pointer {
80
+ position: absolute;
81
+ z-index: 34;
82
+ left: -9px;
83
+ top: -9px;
84
+ width: 18px;
85
+ height: 18px;
86
+ border-radius: 50%;
87
+ background: #ef4444;
88
+ box-shadow:
89
+ 0 0 0 4px rgba(239, 68, 68, 0.35),
90
+ 0 0 24px rgba(239, 68, 68, 0.8);
91
+ pointer-events: none;
92
+ }
93
+ .deck-spotlight {
94
+ position: absolute;
95
+ inset: 0;
96
+ z-index: 33;
97
+ pointer-events: none;
98
+ }
99
+
100
+ /* reactions */
101
+ .deck-reactions-overlay {
102
+ position: absolute;
103
+ inset: 0;
104
+ z-index: 32;
105
+ pointer-events: none;
106
+ overflow: hidden;
107
+ }
108
+ .deck-reaction-float {
109
+ position: absolute;
110
+ bottom: -40px;
111
+ font-size: 40px;
112
+ animation: deck-float 2.6s ease-out forwards;
113
+ }
114
+ @keyframes deck-float {
115
+ 0% {
116
+ transform: translateY(0) scale(0.6);
117
+ opacity: 0;
118
+ }
119
+ 15% {
120
+ opacity: 1;
121
+ transform: translateY(-60px) scale(1);
122
+ }
123
+ 100% {
124
+ transform: translateY(-70vh) translateX(20px) scale(1.2);
125
+ opacity: 0;
126
+ }
127
+ }
128
+ .deck-reaction-bar {
129
+ display: flex;
130
+ flex-wrap: wrap;
131
+ gap: 0.3em;
132
+ }
133
+ .deck-reaction-bar button {
134
+ font-size: 1em;
135
+ padding: 0.25em 0.5em;
136
+ border-radius: 999px;
137
+ border: 1px solid var(--deck-border);
138
+ background: var(--deck-surface);
139
+ cursor: pointer;
140
+ display: inline-flex;
141
+ gap: 0.3em;
142
+ align-items: center;
143
+ }
144
+ .deck-reaction-bar small {
145
+ font-size: 0.5em;
146
+ color: var(--deck-muted);
147
+ }
148
+ .deck-reaction-totals {
149
+ display: flex;
150
+ flex-wrap: wrap;
151
+ gap: 8px 14px;
152
+ font-size: 15px;
153
+ }
154
+ /* THE WAY BACK. On screen only while a viewer is reading on their own — in step there is nothing
155
+ to say, and any move of their own is how they leave. It sits low and centred, clear of the
156
+ controls in the corner and of the progress bar under it. */
157
+ .deck-follow {
158
+ position: absolute;
159
+ z-index: 40;
160
+ bottom: 26px;
161
+ left: 50%;
162
+ transform: translateX(-50%);
163
+ display: flex;
164
+ gap: 10px;
165
+ align-items: center;
166
+ padding: 6px 8px 6px 16px;
167
+ border-radius: 999px;
168
+ background: var(--deck-bg);
169
+ border: 1px solid var(--deck-border);
170
+ font-size: 13px;
171
+ max-width: min(92vw, 560px);
172
+ white-space: nowrap;
173
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2);
174
+ }
175
+ .deck-follow > span {
176
+ overflow: hidden;
177
+ text-overflow: ellipsis;
178
+ color: var(--deck-muted);
179
+ }
180
+ .deck-follow b {
181
+ color: var(--deck-fg);
182
+ font-weight: 650;
183
+ }
184
+ .deck-follow button,
185
+ .deck-audience-follow {
186
+ display: inline-flex;
187
+ align-items: center;
188
+ gap: 6px;
189
+ font: inherit;
190
+ font-weight: 600;
191
+ border: 0;
192
+ border-radius: 999px;
193
+ background: var(--deck-accent);
194
+ color: var(--deck-bg);
195
+ cursor: pointer;
196
+ }
197
+ .deck-follow button {
198
+ padding: 5px 12px;
199
+ }
200
+ .deck-follow button:hover {
201
+ filter: brightness(1.08);
202
+ }
203
+ .deck-follow svg,
204
+ .deck-audience-follow svg {
205
+ width: 1.05em;
206
+ height: 1.05em;
207
+ }
208
+
209
+ /* The phone's own way through the deck: a chevron on each edge of the slide, a swipe across it,
210
+ and the same way back as a full-width button under it. */
211
+ .deck-audience-tap {
212
+ position: relative;
213
+ /* A sideways drag is ours; up and down still scroll the page. */
214
+ touch-action: pan-y;
215
+ }
216
+ .deck-audience-step {
217
+ position: absolute;
218
+ top: 50%;
219
+ transform: translateY(-50%);
220
+ display: grid;
221
+ place-items: center;
222
+ width: 34px;
223
+ height: 48px;
224
+ padding: 0;
225
+ border: 1px solid var(--deck-border);
226
+ border-radius: 10px;
227
+ background: color-mix(in oklab, var(--deck-bg) 76%, transparent);
228
+ -webkit-backdrop-filter: blur(8px);
229
+ backdrop-filter: blur(8px);
230
+ color: var(--deck-fg);
231
+ cursor: pointer;
232
+ }
233
+ .deck-audience-step.is-prev {
234
+ left: 6px;
235
+ }
236
+ .deck-audience-step.is-next {
237
+ right: 6px;
238
+ }
239
+ .deck-audience-step:disabled {
240
+ opacity: 0.22;
241
+ }
242
+ .deck-audience-step svg {
243
+ width: 20px;
244
+ height: 20px;
245
+ }
246
+ .deck-audience-follow {
247
+ justify-content: center;
248
+ width: calc(100% - 32px);
249
+ margin: 10px 16px 0;
250
+ padding: 11px 14px;
251
+ border-radius: 12px;
252
+ font-size: 15px;
253
+ }
254
+ .deck-audience-follow small {
255
+ font-weight: 500;
256
+ opacity: 0.82;
257
+ }
258
+
259
+ /* presence, pace, qr */
260
+ .deck-presence {
261
+ display: inline-flex;
262
+ align-items: center;
263
+ gap: 0.4em;
264
+ font-size: 0.6em;
265
+ color: var(--deck-muted);
266
+ }
267
+ .deck-presence i {
268
+ width: 0.6em;
269
+ height: 0.6em;
270
+ border-radius: 50%;
271
+ background: var(--deck-muted);
272
+ }
273
+ .deck-presence.is-live i {
274
+ background: #22c55e;
275
+ box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.3);
276
+ }
277
+ .deck-pace {
278
+ display: flex;
279
+ align-items: center;
280
+ gap: 10px;
281
+ font-size: 12px;
282
+ color: var(--deck-muted);
283
+ }
284
+ .deck-pace-track {
285
+ position: relative;
286
+ flex: 1;
287
+ height: 6px;
288
+ border-radius: 3px;
289
+ background: var(--deck-surface);
290
+ }
291
+ .deck-pace-track i {
292
+ position: absolute;
293
+ top: -5px;
294
+ width: 16px;
295
+ height: 16px;
296
+ margin-left: -8px;
297
+ border-radius: 50%;
298
+ background: var(--deck-accent);
299
+ transition: left 0.4s ease;
300
+ }
301
+ .deck-qr-join {
302
+ display: flex;
303
+ align-items: center;
304
+ gap: 1em;
305
+ }
306
+ .deck-qr-join-text {
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: 0.2em;
310
+ }
311
+ .deck-qr-join-text strong {
312
+ font-family: var(--deck-mono-font);
313
+ font-size: 0.8em;
314
+ }
315
+ .deck-qr-join-text span {
316
+ color: var(--deck-muted);
317
+ font-size: 0.6em;
318
+ }
319
+
320
+ /* polls, quizzes, questions */
321
+ .deck-poll,
322
+ .deck-quiz {
323
+ border: 1px solid var(--deck-border);
324
+ border-radius: var(--deck-radius);
325
+ padding: 0.6em 0.9em;
326
+ background: var(--deck-surface);
327
+ font-size: 0.8em;
328
+ }
329
+ .deck-poll-head,
330
+ .deck-quiz-head {
331
+ display: flex;
332
+ align-items: baseline;
333
+ gap: 0.8em;
334
+ flex-wrap: wrap;
335
+ margin-bottom: 0.4em;
336
+ }
337
+ .deck-poll-meta {
338
+ color: var(--deck-muted);
339
+ font-size: 0.7em;
340
+ }
341
+ .deck-poll-controls {
342
+ margin-inline-start: auto;
343
+ display: flex;
344
+ gap: 0.3em;
345
+ }
346
+ .deck-poll-controls button,
347
+ .deck-question-actions button,
348
+ .deck-room-polls button {
349
+ font-size: 0.65em;
350
+ padding: 0.2em 0.7em;
351
+ border-radius: 999px;
352
+ border: 1px solid var(--deck-border);
353
+ background: var(--deck-bg);
354
+ color: inherit;
355
+ cursor: pointer;
356
+ }
357
+ .deck-poll-options {
358
+ list-style: none;
359
+ margin: 0;
360
+ padding: 0;
361
+ display: flex;
362
+ flex-direction: column;
363
+ gap: 0.3em;
364
+ }
365
+ .deck-poll-options button {
366
+ position: relative;
367
+ width: 100%;
368
+ text-align: start;
369
+ font: inherit;
370
+ color: inherit;
371
+ padding: 0.35em 0.7em;
372
+ border-radius: 8px;
373
+ border: 1px solid var(--deck-border);
374
+ background: var(--deck-bg);
375
+ cursor: pointer;
376
+ overflow: hidden;
377
+ display: flex;
378
+ justify-content: space-between;
379
+ }
380
+ .deck-poll-options button:disabled {
381
+ cursor: default;
382
+ }
383
+ .deck-poll-bar {
384
+ position: absolute;
385
+ inset: 0 auto 0 0;
386
+ background: color-mix(in oklab, var(--deck-accent) 22%, transparent);
387
+ transition: width 0.5s ease;
388
+ }
389
+ .deck-poll-label,
390
+ .deck-poll-count {
391
+ position: relative;
392
+ }
393
+ .deck-poll-count {
394
+ color: var(--deck-muted);
395
+ font-size: 0.8em;
396
+ }
397
+ .deck-poll-options li.is-mine button {
398
+ box-shadow: inset 0 0 0 2px var(--deck-accent);
399
+ }
400
+ .deck-poll-options li.is-correct button {
401
+ box-shadow: inset 0 0 0 2px #22c55e;
402
+ }
403
+ .deck-poll-options li.is-wrong button {
404
+ box-shadow: inset 0 0 0 2px #ef4444;
405
+ }
406
+ .deck-poll-word {
407
+ display: flex;
408
+ gap: 0.4em;
409
+ margin-top: 0.4em;
410
+ }
411
+ .deck-poll-word input {
412
+ flex: 1;
413
+ font: inherit;
414
+ padding: 0.3em 0.6em;
415
+ border-radius: 8px;
416
+ border: 1px solid var(--deck-border);
417
+ background: var(--deck-bg);
418
+ color: inherit;
419
+ }
420
+ .deck-poll-word button {
421
+ font: inherit;
422
+ padding: 0.3em 0.9em;
423
+ border-radius: 8px;
424
+ border: 0;
425
+ background: var(--deck-accent);
426
+ color: var(--deck-bg);
427
+ cursor: pointer;
428
+ }
429
+ .deck-wordcloud {
430
+ display: flex;
431
+ flex-wrap: wrap;
432
+ gap: 0.2em 0.6em;
433
+ align-items: baseline;
434
+ line-height: 1.1;
435
+ min-height: 2em;
436
+ }
437
+ .deck-quiz-timer {
438
+ font-family: var(--deck-mono-font);
439
+ font-size: 0.8em;
440
+ color: var(--deck-muted);
441
+ }
442
+ .deck-quiz-timer.is-urgent {
443
+ color: #ef4444;
444
+ font-weight: 700;
445
+ }
446
+ .deck-leaderboard {
447
+ list-style: none;
448
+ margin: 0;
449
+ padding: 0;
450
+ font-size: 0.85em;
451
+ }
452
+ .deck-leaderboard li {
453
+ display: grid;
454
+ grid-template-columns: 2em 1fr auto;
455
+ gap: 0.6em;
456
+ padding: 0.25em 0;
457
+ border-bottom: 1px solid var(--deck-border);
458
+ }
459
+ .deck-leaderboard-rank {
460
+ color: var(--deck-muted);
461
+ font-family: var(--deck-mono-font);
462
+ }
463
+ .deck-leaderboard-score {
464
+ font-variant-numeric: tabular-nums;
465
+ font-weight: 700;
466
+ }
467
+ .deck-questions ul,
468
+ .deck-room-questions,
469
+ .deck-audience-questions {
470
+ list-style: none;
471
+ margin: 0;
472
+ padding: 0;
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: 0.4em;
476
+ }
477
+ .deck-questions li,
478
+ .deck-room-questions li,
479
+ .deck-audience-questions li {
480
+ display: flex;
481
+ gap: 0.6em;
482
+ align-items: flex-start;
483
+ font-size: 0.8em;
484
+ padding: 0.3em 0;
485
+ border-bottom: 1px solid var(--deck-border);
486
+ }
487
+ .deck-questions li.is-answered,
488
+ .deck-room-questions li.is-answered,
489
+ .deck-audience-questions li.is-answered {
490
+ opacity: 0.45;
491
+ text-decoration: line-through;
492
+ }
493
+ .deck-question-votes,
494
+ .deck-vote {
495
+ font-family: var(--deck-mono-font);
496
+ font-size: 0.8em;
497
+ color: var(--deck-muted);
498
+ white-space: nowrap;
499
+ }
500
+ .deck-vote {
501
+ border: 1px solid var(--deck-border);
502
+ border-radius: 999px;
503
+ padding: 2px 10px;
504
+ background: var(--deck-bg);
505
+ cursor: pointer;
506
+ }
507
+ .deck-vote.is-on {
508
+ color: var(--deck-accent);
509
+ border-color: var(--deck-accent);
510
+ }
511
+ .deck-question-text {
512
+ flex: 1;
513
+ }
514
+ .deck-question-actions {
515
+ display: flex;
516
+ gap: 0.3em;
517
+ }
518
+
519
+ /* presenter view */
520
+ /* The presenter view follows the deck's own theme and scheme (press D to flip), so the slide
521
+ previews inside it are exactly what the audience sees. */
522
+ .deck-presenter {
523
+ position: absolute;
524
+ inset: 0;
525
+ display: flex;
526
+ flex-direction: column;
527
+ background: color-mix(in oklab, var(--deck-bg) 92%, var(--deck-fg));
528
+ color: var(--deck-fg);
529
+ font: 14px var(--deck-body-font);
530
+ }
531
+ .deck-presenter-bar {
532
+ display: flex;
533
+ align-items: center;
534
+ gap: 16px;
535
+ padding: 8px 16px;
536
+ border-bottom: 1px solid var(--deck-border);
537
+ }
538
+ .deck-presenter-spacer {
539
+ flex: 1;
540
+ }
541
+ .deck-presenter-timer {
542
+ font: 22px var(--deck-mono-font);
543
+ background: transparent;
544
+ color: inherit;
545
+ border: 0;
546
+ cursor: pointer;
547
+ display: inline-flex;
548
+ align-items: baseline;
549
+ gap: 8px;
550
+ }
551
+ .deck-presenter-timer small {
552
+ font-size: 12px;
553
+ padding: 2px 6px;
554
+ border-radius: 6px;
555
+ background: var(--deck-surface);
556
+ }
557
+ .deck-presenter-timer.is-ok small {
558
+ color: #22c55e;
559
+ }
560
+ .deck-presenter-timer.is-behind small {
561
+ color: #ef4444;
562
+ }
563
+ .deck-presenter-timer.is-ahead small {
564
+ color: #60a5fa;
565
+ }
566
+ .deck-presenter-clock {
567
+ font: 16px var(--deck-mono-font);
568
+ color: var(--deck-muted);
569
+ }
570
+ .deck-presenter-tools {
571
+ display: flex;
572
+ flex-wrap: wrap;
573
+ gap: 6px;
574
+ align-items: center;
575
+ }
576
+ .deck-presenter-tools button,
577
+ .deck-presenter-link {
578
+ font: 12px var(--deck-body-font);
579
+ padding: 6px 10px;
580
+ border-radius: 8px;
581
+ border: 1px solid var(--deck-border);
582
+ background: var(--deck-surface);
583
+ color: inherit;
584
+ cursor: pointer;
585
+ text-decoration: none;
586
+ }
587
+ .deck-presenter-tools button.is-on {
588
+ background: var(--deck-accent);
589
+ border-color: var(--deck-accent);
590
+ color: var(--deck-bg);
591
+ }
592
+ .deck-presenter-tools button.is-rec {
593
+ background: #dc2626;
594
+ border-color: #dc2626;
595
+ }
596
+ /* The three columns share the width 1.6 : 1 : 0.9 (notes-left swaps the first two; next-big is
597
+ 1 : 1.3 : 0.9). The notes/next pane is sized in pixels from that share rather than as a
598
+ fraction, so when the room collapses to its rail the pane keeps its width and the slide alone
599
+ takes the room. */
600
+ .deck-presenter-main {
601
+ --pane: calc((100vw - 48px) / 3.5);
602
+ flex: 1;
603
+ min-height: 0;
604
+ display: grid;
605
+ gap: 12px;
606
+ padding: 12px;
607
+ grid-template-columns: 1.6fr var(--pane) 0.9fr;
608
+ grid-template-rows: 1fr 1fr;
609
+ grid-template-areas:
610
+ "current notes room"
611
+ "current next room";
612
+ }
613
+ .deck-presenter.layout-notes-left .deck-presenter-main {
614
+ grid-template-columns: var(--pane) 1.6fr 0.9fr;
615
+ grid-template-areas:
616
+ "notes current room"
617
+ "next current room";
618
+ }
619
+ .deck-presenter.layout-next-big .deck-presenter-main {
620
+ --pane: calc((100vw - 48px) * 1.3 / 3.2);
621
+ grid-template-columns: 1fr var(--pane) 0.9fr;
622
+ grid-template-areas:
623
+ "current next room"
624
+ "notes next room";
625
+ }
626
+ .deck-presenter-current {
627
+ grid-area: current;
628
+ }
629
+ .deck-presenter-next {
630
+ grid-area: next;
631
+ }
632
+ .deck-presenter-notes {
633
+ grid-area: notes;
634
+ }
635
+ .deck-presenter-room {
636
+ grid-area: room;
637
+ min-height: 0;
638
+ overflow: auto;
639
+ }
640
+ .deck-presenter-current,
641
+ .deck-presenter-next,
642
+ .deck-presenter-notes {
643
+ display: flex;
644
+ flex-direction: column;
645
+ min-height: 0;
646
+ gap: 6px;
647
+ }
648
+ .deck-presenter-label {
649
+ font-size: 11px;
650
+ letter-spacing: 0.1em;
651
+ text-transform: uppercase;
652
+ color: var(--deck-muted);
653
+ }
654
+ .deck-presenter-stage {
655
+ flex: 1;
656
+ min-height: 0;
657
+ }
658
+ .deck-presenter-box {
659
+ position: relative;
660
+ flex: 1;
661
+ min-height: 0;
662
+ height: 100%;
663
+ border-radius: 10px;
664
+ overflow: hidden;
665
+ /* The bars around the slide take the opposite tone of the scheme, so the slide's edge reads. */
666
+ background: #000;
667
+ border: 1px solid var(--deck-border);
668
+ display: grid;
669
+ place-items: center;
670
+ }
671
+ [data-color-scheme="dark"] .deck-presenter-box {
672
+ background: #f4f4f2;
673
+ }
674
+ .deck-presenter-box.is-end {
675
+ color: var(--deck-muted);
676
+ }
677
+ .deck-presenter-canvas {
678
+ position: absolute;
679
+ left: 0;
680
+ top: 0;
681
+ transform-origin: 0 0;
682
+ overflow: hidden;
683
+ /* The stage's own ground: the bars around it must not show through a slide's background. */
684
+ background: var(--deck-bg);
685
+ }
686
+ .deck-presenter-canvas .deck-background {
687
+ position: absolute;
688
+ inset: 0;
689
+ }
690
+ .deck-presenter-canvas .deck-stage {
691
+ position: absolute;
692
+ left: 0;
693
+ top: 0;
694
+ }
695
+ .deck-presenter-next-label {
696
+ position: absolute;
697
+ left: 8px;
698
+ bottom: 8px;
699
+ font: 11px var(--deck-mono-font);
700
+ color: #fff;
701
+ background: rgba(0, 0, 0, 0.6);
702
+ padding: 3px 8px;
703
+ border-radius: 6px;
704
+ }
705
+ .deck-notes-panel {
706
+ flex: 1;
707
+ min-height: 0;
708
+ display: flex;
709
+ flex-direction: column;
710
+ background: var(--deck-bg);
711
+ border: 1px solid var(--deck-border);
712
+ border-radius: 10px;
713
+ overflow: hidden;
714
+ }
715
+ .deck-notes-tools {
716
+ display: flex;
717
+ gap: 4px;
718
+ padding: 6px;
719
+ border-bottom: 1px solid var(--deck-border);
720
+ }
721
+ .deck-notes-tools button {
722
+ font: 11px var(--deck-mono-font);
723
+ padding: 3px 8px;
724
+ border-radius: 6px;
725
+ border: 1px solid var(--deck-border);
726
+ background: transparent;
727
+ color: inherit;
728
+ cursor: pointer;
729
+ }
730
+ .deck-notes-body {
731
+ flex: 1;
732
+ overflow: auto;
733
+ padding: 14px 16px;
734
+ line-height: 1.5;
735
+ }
736
+ .deck-notes-body p {
737
+ margin: 0 0 0.6em;
738
+ }
739
+ .deck-notes-segment {
740
+ transition: opacity 0.2s;
741
+ }
742
+ .deck-notes-segment.is-past {
743
+ opacity: 0.45;
744
+ }
745
+ .deck-notes-segment.is-current {
746
+ background: rgba(37, 99, 235, 0.25);
747
+ border-radius: 4px;
748
+ }
749
+ .deck-click-marker {
750
+ display: inline-grid;
751
+ place-items: center;
752
+ width: 1.4em;
753
+ height: 1.4em;
754
+ margin: 0 0.3em;
755
+ border-radius: 50%;
756
+ background: #2563eb;
757
+ color: #fff;
758
+ font-size: 0.6em;
759
+ font-weight: 700;
760
+ vertical-align: middle;
761
+ }
762
+ .deck-click-marker.is-current {
763
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.4);
764
+ }
765
+ .deck-room-panel {
766
+ height: 100%;
767
+ background: var(--deck-bg);
768
+ border: 1px solid var(--deck-border);
769
+ border-radius: 10px;
770
+ display: flex;
771
+ flex-direction: column;
772
+ overflow: hidden;
773
+ }
774
+ .deck-room-tabs {
775
+ display: flex;
776
+ gap: 2px;
777
+ padding: 6px;
778
+ border-bottom: 1px solid var(--deck-border);
779
+ align-items: center;
780
+ }
781
+ .deck-room-tabs button {
782
+ font: 12px var(--deck-body-font);
783
+ text-transform: capitalize;
784
+ padding: 5px 10px;
785
+ border-radius: 6px;
786
+ border: 0;
787
+ background: transparent;
788
+ color: var(--deck-muted);
789
+ cursor: pointer;
790
+ position: relative;
791
+ }
792
+ .deck-room-tabs button.is-on {
793
+ background: var(--deck-surface);
794
+ color: inherit;
795
+ }
796
+ .deck-room-tabs em,
797
+ .deck-audience-tabs em {
798
+ font-style: normal;
799
+ font-size: 10px;
800
+ background: #ef4444;
801
+ color: #fff;
802
+ border-radius: 999px;
803
+ padding: 1px 5px;
804
+ margin-inline-start: 4px;
805
+ }
806
+ .deck-room-status {
807
+ margin-inline-start: auto;
808
+ font: 10px var(--deck-mono-font);
809
+ color: var(--deck-muted);
810
+ }
811
+ .deck-room-status.is-open {
812
+ color: #22c55e;
813
+ }
814
+ .deck-room-body {
815
+ padding: 12px;
816
+ display: flex;
817
+ flex-direction: column;
818
+ gap: 14px;
819
+ overflow: auto;
820
+ }
821
+ .deck-room-questions,
822
+ .deck-room-polls {
823
+ padding: 10px;
824
+ overflow: auto;
825
+ }
826
+ .deck-room-polls {
827
+ list-style: none;
828
+ margin: 0;
829
+ display: flex;
830
+ flex-direction: column;
831
+ gap: 6px;
832
+ }
833
+ .deck-room-polls li {
834
+ display: flex;
835
+ gap: 8px;
836
+ align-items: center;
837
+ font-size: 13px;
838
+ }
839
+ .deck-poll-kind {
840
+ font: 10px var(--deck-mono-font);
841
+ text-transform: uppercase;
842
+ color: var(--deck-muted);
843
+ }
844
+ .deck-camera {
845
+ position: fixed;
846
+ z-index: 200;
847
+ width: 260px;
848
+ aspect-ratio: 4 / 3;
849
+ border-radius: 12px;
850
+ overflow: hidden;
851
+ border: 2px solid var(--deck-border);
852
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
853
+ cursor: move;
854
+ background: #000;
855
+ }
856
+ .deck-camera video {
857
+ width: 100%;
858
+ height: 100%;
859
+ object-fit: cover;
860
+ transform: scaleX(-1);
861
+ }
862
+ .deck-camera button {
863
+ position: absolute;
864
+ top: 4px;
865
+ right: 6px;
866
+ border: 0;
867
+ background: rgba(0, 0, 0, 0.5);
868
+ color: #fff;
869
+ border-radius: 50%;
870
+ width: 24px;
871
+ height: 24px;
872
+ cursor: pointer;
873
+ }
874
+ .deck-gate {
875
+ position: absolute;
876
+ inset: 0;
877
+ display: grid;
878
+ place-items: center;
879
+ background: var(--deck-bg);
880
+ color: var(--deck-fg);
881
+ }
882
+ .deck-gate form {
883
+ width: min(420px, 90vw);
884
+ display: flex;
885
+ flex-direction: column;
886
+ gap: 12px;
887
+ font-size: 15px;
888
+ }
889
+ .deck-gate h1 {
890
+ margin: 0;
891
+ font-size: 28px;
892
+ }
893
+ .deck-gate p {
894
+ margin: 0;
895
+ color: var(--deck-muted);
896
+ }
897
+ .deck-gate input {
898
+ font: 18px var(--deck-body-font);
899
+ padding: 12px 14px;
900
+ border-radius: 10px;
901
+ border: 1px solid var(--deck-border);
902
+ background: var(--deck-surface);
903
+ color: inherit;
904
+ }
905
+ .deck-gate button {
906
+ font: 16px var(--deck-body-font);
907
+ padding: 12px 14px;
908
+ border-radius: 10px;
909
+ border: 0;
910
+ background: var(--deck-accent);
911
+ color: var(--deck-bg);
912
+ cursor: pointer;
913
+ }
914
+ .deck-gate-error {
915
+ color: #ef4444 !important;
916
+ }
917
+
918
+ /* notes and stats pages */
919
+ .deck-notes-page,
920
+ .deck-stats-page {
921
+ position: absolute;
922
+ inset: 0;
923
+ overflow: auto;
924
+ padding: 40px clamp(20px, 6vw, 80px);
925
+ font: 16px var(--deck-body-font);
926
+ line-height: 1.6;
927
+ }
928
+ .deck-notes-page h1,
929
+ .deck-stats-page h1 {
930
+ font-size: 28px;
931
+ margin: 0 0 24px;
932
+ }
933
+ .deck-notes-entry {
934
+ padding: 16px 0;
935
+ border-top: 1px solid var(--deck-border);
936
+ }
937
+ .deck-notes-entry h2 {
938
+ font-size: 16px;
939
+ margin: 0 0 6px;
940
+ }
941
+ .deck-notes-entry a {
942
+ color: inherit;
943
+ text-decoration: none;
944
+ }
945
+ .deck-stats-cards {
946
+ display: grid;
947
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
948
+ gap: 12px;
949
+ margin-bottom: 24px;
950
+ }
951
+ .deck-stats-cards div {
952
+ border: 1px solid var(--deck-border);
953
+ border-radius: 12px;
954
+ padding: 14px 16px;
955
+ display: flex;
956
+ flex-direction: column;
957
+ }
958
+ .deck-stats-cards strong {
959
+ font-size: 28px;
960
+ }
961
+ .deck-stats-cards span {
962
+ color: var(--deck-muted);
963
+ font-size: 13px;
964
+ }
965
+ .deck-stats-page h2 {
966
+ font-size: 16px;
967
+ margin: 28px 0 10px;
968
+ text-transform: uppercase;
969
+ letter-spacing: 0.08em;
970
+ color: var(--deck-muted);
971
+ }
972
+ .deck-stats-table {
973
+ width: 100%;
974
+ border-collapse: collapse;
975
+ font-size: 14px;
976
+ }
977
+ .deck-stats-table td {
978
+ padding: 6px 8px;
979
+ border-bottom: 1px solid var(--deck-border);
980
+ }
981
+ .deck-stats-bar {
982
+ width: 40%;
983
+ }
984
+ .deck-stats-bar i {
985
+ display: block;
986
+ height: 8px;
987
+ border-radius: 4px;
988
+ background: var(--deck-accent);
989
+ }
990
+ .deck-stats-num {
991
+ text-align: end;
992
+ font-variant-numeric: tabular-nums;
993
+ color: var(--deck-muted);
994
+ white-space: nowrap;
995
+ }
996
+ .deck-stats-exports {
997
+ list-style: none;
998
+ padding: 0;
999
+ }
1000
+
1001
+ /* audience page */
1002
+ .deck-audience {
1003
+ position: absolute;
1004
+ inset: 0;
1005
+ overflow: auto;
1006
+ display: flex;
1007
+ flex-direction: column;
1008
+ font: 15px var(--deck-body-font);
1009
+ background: var(--deck-bg);
1010
+ color: var(--deck-fg);
1011
+ }
1012
+ .deck-audience-head {
1013
+ display: flex;
1014
+ align-items: center;
1015
+ justify-content: space-between;
1016
+ gap: 12px;
1017
+ padding: 12px 16px;
1018
+ border-bottom: 1px solid var(--deck-border);
1019
+ }
1020
+ .deck-audience-head > div:first-child {
1021
+ flex: 1;
1022
+ min-width: 0;
1023
+ }
1024
+ .deck-audience-head strong {
1025
+ display: block;
1026
+ }
1027
+ .deck-audience-count {
1028
+ white-space: nowrap;
1029
+ }
1030
+ .deck-audience-status {
1031
+ font-size: 12px;
1032
+ color: var(--deck-muted);
1033
+ }
1034
+ .deck-audience-status.is-open {
1035
+ color: #22c55e;
1036
+ }
1037
+ .deck-audience-count {
1038
+ font-size: 12px;
1039
+ color: var(--deck-muted);
1040
+ }
1041
+ .deck-audience-slide {
1042
+ position: relative;
1043
+ padding: 12px 16px 0;
1044
+ }
1045
+ .deck-audience-canvas-box {
1046
+ position: relative;
1047
+ width: 100%;
1048
+ border-radius: 10px;
1049
+ overflow: hidden;
1050
+ border: 1px solid var(--deck-border);
1051
+ background: var(--deck-bg);
1052
+ }
1053
+ .deck-audience-canvas-box.fit-contain {
1054
+ width: 100%;
1055
+ height: 100%;
1056
+ border: 0;
1057
+ border-radius: 0;
1058
+ background: transparent;
1059
+ }
1060
+ .deck-audience-canvas {
1061
+ position: absolute;
1062
+ left: 0;
1063
+ top: 0;
1064
+ transform-origin: 0 0;
1065
+ overflow: hidden;
1066
+ background: var(--deck-bg);
1067
+ }
1068
+ .deck-audience-canvas .deck-background {
1069
+ position: absolute;
1070
+ inset: 0;
1071
+ }
1072
+ /* The mirror is a real slide: its embedded pages and controls answer to touch. */
1073
+ .deck-audience-canvas .deck-slide {
1074
+ pointer-events: auto;
1075
+ }
1076
+ .deck-audience .deck-sketch-open {
1077
+ display: none;
1078
+ }
1079
+ .deck-audience-expand {
1080
+ font-size: 12px !important;
1081
+ padding: 2px 8px;
1082
+ border-radius: 999px;
1083
+ border: 1px solid var(--deck-border) !important;
1084
+ background: var(--deck-surface) !important;
1085
+ }
1086
+ .deck-audience-expand:disabled {
1087
+ opacity: 0.5;
1088
+ }
1089
+
1090
+ /* the slide, full screen */
1091
+ .deck-audience-full {
1092
+ position: fixed;
1093
+ inset: 0;
1094
+ z-index: 200;
1095
+ background: var(--deck-bars, #0b0b0c);
1096
+ display: grid;
1097
+ }
1098
+ .deck-audience-full-stage {
1099
+ position: absolute;
1100
+ inset: 0;
1101
+ }
1102
+ .deck-audience-full-close {
1103
+ position: absolute;
1104
+ top: max(8px, env(safe-area-inset-top));
1105
+ right: max(10px, env(safe-area-inset-right));
1106
+ z-index: 2;
1107
+ width: 36px;
1108
+ height: 36px;
1109
+ border-radius: 999px;
1110
+ border: 0;
1111
+ font: 22px/1 var(--deck-body-font);
1112
+ color: #fff;
1113
+ background: rgba(0, 0, 0, 0.45);
1114
+ cursor: pointer;
1115
+ }
1116
+ .deck-audience-full-react {
1117
+ /* Bottom-left, clear of an embedded page's "tap to interact" pill at the bottom centre. */
1118
+ position: absolute;
1119
+ left: max(10px, env(safe-area-inset-left));
1120
+ bottom: max(10px, env(safe-area-inset-bottom));
1121
+ z-index: 2;
1122
+ display: flex;
1123
+ gap: 4px;
1124
+ padding: 4px 8px;
1125
+ border-radius: 999px;
1126
+ background: rgba(0, 0, 0, 0.45);
1127
+ backdrop-filter: blur(8px);
1128
+ }
1129
+ .deck-audience-full-react button {
1130
+ font-size: 24px;
1131
+ line-height: 1;
1132
+ padding: 6px;
1133
+ background: transparent;
1134
+ border: 0;
1135
+ cursor: pointer;
1136
+ transition: transform 0.1s;
1137
+ }
1138
+ .deck-audience-full-react button:active {
1139
+ transform: scale(1.4);
1140
+ }
1141
+ .deck-audience-full .deck-audience-flash {
1142
+ right: max(16px, env(safe-area-inset-right));
1143
+ top: 56px;
1144
+ }
1145
+ .deck-audience-empty {
1146
+ padding: 30px;
1147
+ text-align: center;
1148
+ color: var(--deck-muted);
1149
+ border: 1px dashed var(--deck-border);
1150
+ border-radius: 10px;
1151
+ }
1152
+ .deck-audience-slide-bar {
1153
+ display: flex;
1154
+ align-items: center;
1155
+ gap: 12px;
1156
+ padding: 8px 4px;
1157
+ font-size: 12px;
1158
+ color: var(--deck-muted);
1159
+ }
1160
+ .deck-audience-slide-bar button {
1161
+ background: transparent;
1162
+ border: 0;
1163
+ font-size: 18px;
1164
+ color: var(--deck-muted);
1165
+ cursor: pointer;
1166
+ }
1167
+ .deck-audience-slide-bar button.is-on {
1168
+ color: #f59e0b;
1169
+ }
1170
+ .deck-audience-slide-bar a {
1171
+ margin-inline-start: auto;
1172
+ color: inherit;
1173
+ }
1174
+ .deck-audience-flash {
1175
+ position: absolute;
1176
+ right: 20px;
1177
+ top: 12px;
1178
+ display: flex;
1179
+ flex-direction: column-reverse;
1180
+ gap: 2px;
1181
+ pointer-events: none;
1182
+ }
1183
+ .deck-audience-flash span {
1184
+ font-size: 22px;
1185
+ animation: deck-flash 1.5s ease-out forwards;
1186
+ }
1187
+ @keyframes deck-flash {
1188
+ from {
1189
+ opacity: 1;
1190
+ transform: translateY(0);
1191
+ }
1192
+ to {
1193
+ opacity: 0;
1194
+ transform: translateY(-30px);
1195
+ }
1196
+ }
1197
+ .deck-audience-react {
1198
+ display: flex;
1199
+ justify-content: space-between;
1200
+ padding: 8px 16px;
1201
+ }
1202
+ .deck-audience-react button {
1203
+ font-size: 26px;
1204
+ background: transparent;
1205
+ border: 0;
1206
+ cursor: pointer;
1207
+ transition: transform 0.1s;
1208
+ }
1209
+ .deck-audience-react button:active {
1210
+ transform: scale(1.4);
1211
+ }
1212
+ .deck-audience-tabs {
1213
+ display: flex;
1214
+ border-top: 1px solid var(--deck-border);
1215
+ border-bottom: 1px solid var(--deck-border);
1216
+ }
1217
+ .deck-audience-tabs button {
1218
+ flex: 1;
1219
+ padding: 10px 4px;
1220
+ font: 13px var(--deck-body-font);
1221
+ text-transform: capitalize;
1222
+ background: transparent;
1223
+ border: 0;
1224
+ border-bottom: 2px solid transparent;
1225
+ color: var(--deck-muted);
1226
+ cursor: pointer;
1227
+ }
1228
+ .deck-audience-tabs button.is-on {
1229
+ color: inherit;
1230
+ border-bottom-color: var(--deck-accent);
1231
+ }
1232
+ .deck-audience-panel {
1233
+ padding: 16px;
1234
+ display: flex;
1235
+ flex-direction: column;
1236
+ gap: 12px;
1237
+ }
1238
+ .deck-audience-pace p {
1239
+ margin: 0 0 8px;
1240
+ }
1241
+ .deck-audience-pace-buttons {
1242
+ display: grid;
1243
+ grid-template-columns: repeat(3, 1fr);
1244
+ gap: 8px;
1245
+ }
1246
+ .deck-audience-pace-buttons button,
1247
+ .deck-audience-hand {
1248
+ font: 14px var(--deck-body-font);
1249
+ padding: 12px 8px;
1250
+ border-radius: 10px;
1251
+ border: 1px solid var(--deck-border);
1252
+ background: var(--deck-surface);
1253
+ color: inherit;
1254
+ cursor: pointer;
1255
+ }
1256
+ .deck-audience-pace-buttons button.is-on,
1257
+ .deck-audience-hand.is-on {
1258
+ border-color: var(--deck-accent);
1259
+ box-shadow: inset 0 0 0 1px var(--deck-accent);
1260
+ }
1261
+ .deck-audience-hand {
1262
+ width: 100%;
1263
+ margin-top: 12px;
1264
+ }
1265
+ .deck-audience-name {
1266
+ display: flex;
1267
+ flex-direction: column;
1268
+ gap: 6px;
1269
+ margin-top: 16px;
1270
+ font-size: 13px;
1271
+ color: var(--deck-muted);
1272
+ }
1273
+ .deck-audience-name input,
1274
+ .deck-audience-ask textarea {
1275
+ font: 15px var(--deck-body-font);
1276
+ padding: 10px 12px;
1277
+ border-radius: 10px;
1278
+ border: 1px solid var(--deck-border);
1279
+ background: var(--deck-surface);
1280
+ color: var(--deck-fg);
1281
+ width: 100%;
1282
+ box-sizing: border-box;
1283
+ resize: vertical;
1284
+ }
1285
+ .deck-audience-ask form {
1286
+ display: flex;
1287
+ flex-direction: column;
1288
+ gap: 8px;
1289
+ }
1290
+ .deck-audience-ask button[type="submit"] {
1291
+ align-self: flex-end;
1292
+ font: 14px var(--deck-body-font);
1293
+ padding: 8px 18px;
1294
+ border-radius: 999px;
1295
+ border: 0;
1296
+ background: var(--deck-accent);
1297
+ color: var(--deck-bg);
1298
+ cursor: pointer;
1299
+ }
1300
+ .deck-audience-ask button:disabled {
1301
+ opacity: 0.5;
1302
+ }
1303
+ .deck-audience-questions li em {
1304
+ font-size: 11px;
1305
+ color: var(--deck-muted);
1306
+ }
1307
+ .deck-audience-polls {
1308
+ display: flex;
1309
+ flex-direction: column;
1310
+ gap: 12px;
1311
+ font-size: 18px;
1312
+ }
1313
+ .deck-audience-mine ul {
1314
+ list-style: none;
1315
+ padding: 0;
1316
+ }
1317
+ .deck-audience-mine a {
1318
+ color: inherit;
1319
+ }
1320
+
1321
+ /* backgrounds */
1322
+ .deck-bg-canvas {
1323
+ position: absolute;
1324
+ inset: 0;
1325
+ width: 100%;
1326
+ height: 100%;
1327
+ display: block;
1328
+ }
1329
+ .deck-bg-mesh {
1330
+ position: absolute;
1331
+ inset: 0;
1332
+ overflow: hidden;
1333
+ filter: blur(80px) saturate(1.2);
1334
+ }
1335
+ .deck-bg-mesh span {
1336
+ position: absolute;
1337
+ width: 55vmax;
1338
+ height: 55vmax;
1339
+ margin: -27vmax 0 0 -27vmax;
1340
+ border-radius: 50%;
1341
+ opacity: 0.55;
1342
+ mix-blend-mode: screen;
1343
+ animation: deck-mesh var(--speed, 40s) ease-in-out infinite alternate;
1344
+ }
1345
+ .deck-bg-mesh:not([data-active]) span {
1346
+ animation-play-state: paused;
1347
+ }
1348
+ @keyframes deck-mesh {
1349
+ 0% {
1350
+ transform: translate(-10%, -5%) scale(1);
1351
+ }
1352
+ 50% {
1353
+ transform: translate(20%, 15%) scale(1.15);
1354
+ }
1355
+ 100% {
1356
+ transform: translate(-15%, 25%) scale(0.9);
1357
+ }
1358
+ }
1359
+ .deck-bg-grid,
1360
+ .deck-bg-spot,
1361
+ .deck-bg-noise {
1362
+ position: absolute;
1363
+ inset: 0;
1364
+ }
1365
+ .deck-bg-grid {
1366
+ mask-image: radial-gradient(ellipse at center, #000 40%, transparent 80%);
1367
+ }
1368
+ .deck-bg-noise {
1369
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
1370
+ mix-blend-mode: overlay;
1371
+ }
1372
+ .deck-flipboard {
1373
+ display: grid;
1374
+ gap: 3px;
1375
+ font-family: var(--deck-mono-font);
1376
+ background: #111;
1377
+ padding: 6px;
1378
+ border-radius: 8px;
1379
+ width: fit-content;
1380
+ }
1381
+ .deck-flip-cell {
1382
+ display: grid;
1383
+ place-items: center;
1384
+ width: 1.4em;
1385
+ height: 1.9em;
1386
+ background: #222;
1387
+ border-radius: 3px;
1388
+ color: #eee;
1389
+ animation: deck-flip var(--flip, 35ms) linear 6;
1390
+ animation-fill-mode: both;
1391
+ transform-origin: center;
1392
+ }
1393
+ @keyframes deck-flip {
1394
+ 0% {
1395
+ transform: rotateX(0deg);
1396
+ }
1397
+ 50% {
1398
+ transform: rotateX(90deg);
1399
+ background: #333;
1400
+ }
1401
+ 100% {
1402
+ transform: rotateX(0deg);
1403
+ }
1404
+ }
1405
+ .deck-audience-share {
1406
+ font-size: 15px !important;
1407
+ }
1408
+ .deck-audience-toast {
1409
+ font-size: 12px;
1410
+ color: var(--deck-accent);
1411
+ }
1412
+ .deck-leaderboard li.deck-muted {
1413
+ display: block;
1414
+ }
1415
+ .deck-pointer-layer {
1416
+ z-index: 34;
1417
+ overflow: visible;
1418
+ }
1419
+ .deck-presenter-canvas .deck-drawing,
1420
+ .deck-presenter-canvas .deck-pointer-layer {
1421
+ position: absolute;
1422
+ }
1423
+
1424
+ /* ── icons in the toolbars ────────────────────────────────────────────────── */
1425
+ .deck-presenter-tools button,
1426
+ .deck-presenter-link,
1427
+ .deck-audience-slide-bar button,
1428
+ .deck-audience-slide-bar a,
1429
+ .deck-audience-expand {
1430
+ display: inline-flex;
1431
+ align-items: center;
1432
+ gap: 6px;
1433
+ }
1434
+ .deck-presenter-tools .deck-icon,
1435
+ .deck-audience-slide-bar .deck-icon {
1436
+ width: 14px;
1437
+ height: 14px;
1438
+ flex: none;
1439
+ }
1440
+ .deck-audience-slide-bar button {
1441
+ font-size: 14px;
1442
+ padding: 4px 6px;
1443
+ }
1444
+ .deck-draw-toolbar button {
1445
+ display: inline-flex;
1446
+ align-items: center;
1447
+ justify-content: center;
1448
+ }
1449
+ .deck-draw-toolbar .deck-icon {
1450
+ width: 18px;
1451
+ height: 18px;
1452
+ }
1453
+
1454
+ /* ── the room panel collapsed to a rail ───────────────────────────────────── */
1455
+ .deck-room-toggle {
1456
+ margin-inline-start: auto;
1457
+ width: 28px;
1458
+ height: 28px;
1459
+ border-radius: 8px;
1460
+ border: 0;
1461
+ background: transparent;
1462
+ color: var(--deck-muted);
1463
+ display: grid;
1464
+ place-items: center;
1465
+ cursor: pointer;
1466
+ padding: 0 !important;
1467
+ }
1468
+ .deck-room-toggle:hover {
1469
+ background: var(--deck-surface);
1470
+ color: inherit;
1471
+ }
1472
+ .deck-room-toggle .deck-icon {
1473
+ width: 16px;
1474
+ height: 16px;
1475
+ }
1476
+ .deck-room-panel.is-rail {
1477
+ align-items: center;
1478
+ padding: 6px 0;
1479
+ gap: 4px;
1480
+ }
1481
+ .deck-room-panel.is-rail .deck-room-toggle {
1482
+ margin-inline-start: 0;
1483
+ margin-bottom: 4px;
1484
+ }
1485
+ .deck-room-rail-item {
1486
+ position: relative;
1487
+ width: 40px;
1488
+ height: 40px;
1489
+ border-radius: 10px;
1490
+ border: 0;
1491
+ background: transparent;
1492
+ color: var(--deck-muted);
1493
+ display: grid;
1494
+ place-items: center;
1495
+ cursor: pointer;
1496
+ }
1497
+ .deck-room-rail-item .deck-icon {
1498
+ width: 20px;
1499
+ height: 20px;
1500
+ }
1501
+ .deck-room-rail-item:hover,
1502
+ .deck-room-rail-item.is-on {
1503
+ background: var(--deck-surface);
1504
+ color: inherit;
1505
+ }
1506
+ .deck-room-rail-item em {
1507
+ position: absolute;
1508
+ top: 1px;
1509
+ right: 1px;
1510
+ font-style: normal;
1511
+ font: 600 10px/16px var(--deck-body-font);
1512
+ min-width: 16px;
1513
+ height: 16px;
1514
+ padding: 0 4px;
1515
+ border-radius: 999px;
1516
+ background: #ef4444;
1517
+ color: #fff;
1518
+ text-align: center;
1519
+ box-shadow: 0 0 0 2px var(--deck-bg);
1520
+ }
1521
+ .deck-room-dot {
1522
+ width: 8px;
1523
+ height: 8px;
1524
+ border-radius: 50%;
1525
+ background: var(--deck-muted);
1526
+ margin-top: auto;
1527
+ margin-bottom: 6px;
1528
+ }
1529
+ .deck-room-dot.is-open {
1530
+ background: #22c55e;
1531
+ }
1532
+ .deck-presenter.room-collapsed .deck-presenter-main {
1533
+ grid-template-columns: 1fr var(--pane) 52px;
1534
+ }
1535
+ .deck-presenter.room-collapsed.layout-notes-left .deck-presenter-main {
1536
+ grid-template-columns: var(--pane) 1fr 52px;
1537
+ }
1538
+ .deck-presenter.room-collapsed.layout-next-big .deck-presenter-main {
1539
+ grid-template-columns: 1fr var(--pane) 52px;
1540
+ }
1541
+ .deck-presenter.room-collapsed .deck-presenter-room {
1542
+ overflow: visible;
1543
+ }
1544
+
1545
+ /* ── confetti over a stage ────────────────────────────────────────────────── */
1546
+ .deck-confetti-layer {
1547
+ position: fixed;
1548
+ inset: 0;
1549
+ width: 100%;
1550
+ height: 100%;
1551
+ pointer-events: none;
1552
+ z-index: 60;
1553
+ }
1554
+ .deck-confetti-layer.in-canvas {
1555
+ position: absolute;
1556
+ z-index: 36;
1557
+ }