@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,592 @@
1
+ /* ─────────────────────────────────────────────────────────────────────────────
2
+ @kadal/deck — bling: gradient text, glass, glows, chips, ribbons, halos, shimmer, blobs,
3
+ the hint labels, the theme menu, the iframe shield and the fit scaler. Loaded by base.css.
4
+ ───────────────────────────────────────────────────────────────────────────── */
5
+ :root {
6
+ --tone-accent: var(--deck-accent);
7
+ --tone-accent-2: var(--deck-accent-2);
8
+ --tone-good: #16a34a;
9
+ --tone-warn: #d97706;
10
+ --tone-bad: #dc2626;
11
+ --tone-info: #2563eb;
12
+ --tone-neutral: var(--deck-muted);
13
+ --tone-purple: #7c3aed;
14
+ --tone-pink: #db2777;
15
+ --tone-amber: #f59e0b;
16
+ --tone-teal: #0d9488;
17
+ }
18
+ .tone-accent {
19
+ --tone: var(--tone-accent);
20
+ }
21
+ .tone-accent-2 {
22
+ --tone: var(--tone-accent-2);
23
+ }
24
+ .tone-good {
25
+ --tone: var(--tone-good);
26
+ }
27
+ .tone-warn {
28
+ --tone: var(--tone-warn);
29
+ }
30
+ .tone-bad {
31
+ --tone: var(--tone-bad);
32
+ }
33
+ .tone-info {
34
+ --tone: var(--tone-info);
35
+ }
36
+ .tone-neutral {
37
+ --tone: var(--tone-neutral);
38
+ }
39
+ .tone-purple {
40
+ --tone: var(--tone-purple);
41
+ }
42
+ .tone-pink {
43
+ --tone: var(--tone-pink);
44
+ }
45
+ .tone-amber {
46
+ --tone: var(--tone-amber);
47
+ }
48
+ .tone-teal {
49
+ --tone: var(--tone-teal);
50
+ }
51
+
52
+ /* gradient text */
53
+ .deck-gradient-text {
54
+ background: linear-gradient(var(--gt-angle, 90deg), var(--gt-from), var(--gt-to));
55
+ -webkit-background-clip: text;
56
+ background-clip: text;
57
+ color: transparent;
58
+ -webkit-text-fill-color: transparent;
59
+ }
60
+
61
+ /* glass */
62
+ .deck-glass {
63
+ position: relative;
64
+ border-radius: var(--deck-radius);
65
+ background: color-mix(in oklab, var(--deck-bg) 78%, transparent);
66
+ backdrop-filter: blur(14px) saturate(1.2);
67
+ -webkit-backdrop-filter: blur(14px) saturate(1.2);
68
+ box-shadow:
69
+ 0 1px 0 rgba(255, 255, 255, 0.25) inset,
70
+ 0 12px 40px rgba(0, 0, 0, 0.08);
71
+ }
72
+ .deck-glass::before {
73
+ content: "";
74
+ position: absolute;
75
+ inset: 0;
76
+ border-radius: inherit;
77
+ padding: 1px;
78
+ background: linear-gradient(
79
+ 135deg,
80
+ color-mix(in oklab, var(--tone, var(--deck-accent)) 60%, transparent),
81
+ transparent 45%,
82
+ color-mix(in oklab, var(--tone, var(--deck-accent)) 25%, transparent)
83
+ );
84
+ -webkit-mask:
85
+ linear-gradient(#000 0 0) content-box,
86
+ linear-gradient(#000 0 0);
87
+ mask:
88
+ linear-gradient(#000 0 0) content-box,
89
+ linear-gradient(#000 0 0);
90
+ -webkit-mask-composite: xor;
91
+ mask-composite: exclude;
92
+ pointer-events: none;
93
+ }
94
+ .deck-glass.has-glow::after {
95
+ content: "";
96
+ position: absolute;
97
+ inset: -18%;
98
+ border-radius: 50%;
99
+ background: radial-gradient(
100
+ circle,
101
+ color-mix(in oklab, var(--tone, var(--deck-accent)) 32%, transparent),
102
+ transparent 68%
103
+ );
104
+ filter: blur(28px);
105
+ z-index: -1;
106
+ pointer-events: none;
107
+ }
108
+
109
+ /* glow + blob: absolutely positioned inside a relative box */
110
+ .deck-glow {
111
+ position: absolute;
112
+ inset: 0;
113
+ pointer-events: none;
114
+ z-index: 0;
115
+ filter: blur(20px);
116
+ }
117
+ .deck-blob {
118
+ position: absolute;
119
+ pointer-events: none;
120
+ z-index: 0;
121
+ filter: blur(2px);
122
+ }
123
+
124
+ /* chips */
125
+ .deck-chip {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ /* A chip on its own line in a slide's column layout keeps its width; the column stretches it otherwise. */
129
+ align-self: flex-start;
130
+ justify-self: start;
131
+ gap: 0.4em;
132
+ padding: 0.18em 0.7em 0.18em 0.55em;
133
+ border-radius: 999px;
134
+ font-size: 0.6em;
135
+ font-weight: 600;
136
+ letter-spacing: 0.01em;
137
+ color: var(--tone, var(--deck-fg));
138
+ background: color-mix(in oklab, var(--tone, var(--deck-muted)) 12%, transparent);
139
+ border: 1px solid color-mix(in oklab, var(--tone, var(--deck-muted)) 35%, transparent);
140
+ vertical-align: middle;
141
+ white-space: nowrap;
142
+ }
143
+ .deck-chip-dot {
144
+ width: 0.55em;
145
+ height: 0.55em;
146
+ border-radius: 50%;
147
+ background: var(--tone, var(--deck-muted));
148
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--tone, var(--deck-muted)) 25%, transparent);
149
+ }
150
+ .deck-icon {
151
+ vertical-align: -0.15em;
152
+ flex: none;
153
+ }
154
+ .deck-icon-missing {
155
+ color: var(--deck-muted);
156
+ }
157
+
158
+ /* divider */
159
+ .deck-divider {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 0.8em;
163
+ margin: 0.8em 0;
164
+ color: var(--deck-muted);
165
+ font-size: 0.55em;
166
+ letter-spacing: 0.12em;
167
+ text-transform: uppercase;
168
+ }
169
+ .deck-divider::before,
170
+ .deck-divider::after {
171
+ content: "";
172
+ flex: 1;
173
+ height: 1px;
174
+ background: linear-gradient(90deg, transparent, var(--deck-border), transparent);
175
+ }
176
+
177
+ /* ribbon */
178
+ .deck-ribbon {
179
+ position: absolute;
180
+ top: 1.2em;
181
+ padding: 0.25em 2.2em;
182
+ font-size: 0.5em;
183
+ font-weight: 700;
184
+ letter-spacing: 0.12em;
185
+ text-transform: uppercase;
186
+ color: #fff;
187
+ background: var(--tone, var(--deck-accent));
188
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
189
+ z-index: 3;
190
+ }
191
+ .deck-ribbon.corner-right {
192
+ right: -2.4em;
193
+ transform: rotate(45deg);
194
+ }
195
+ .deck-ribbon.corner-left {
196
+ left: -2.4em;
197
+ transform: rotate(-45deg);
198
+ }
199
+
200
+ /* halo */
201
+ .deck-halo {
202
+ display: inline-grid;
203
+ place-items: center;
204
+ border-radius: 50%;
205
+ background: radial-gradient(
206
+ circle,
207
+ color-mix(in oklab, var(--tone, var(--deck-accent)) 22%, transparent),
208
+ transparent 70%
209
+ );
210
+ box-shadow: inset 0 0 0 2px color-mix(in oklab, var(--tone, var(--deck-accent)) 45%, transparent);
211
+ color: var(--tone, var(--deck-accent));
212
+ font-weight: 800;
213
+ font-size: 1em;
214
+ vertical-align: middle;
215
+ }
216
+
217
+ /* shimmer */
218
+ .deck-shimmer {
219
+ background: linear-gradient(
220
+ 110deg,
221
+ currentColor 35%,
222
+ color-mix(in oklab, currentColor 40%, #fff) 50%,
223
+ currentColor 65%
224
+ );
225
+ background-size: 250% 100%;
226
+ -webkit-background-clip: text;
227
+ background-clip: text;
228
+ -webkit-text-fill-color: transparent;
229
+ animation: deck-shimmer 4s linear infinite;
230
+ }
231
+ @keyframes deck-shimmer {
232
+ from {
233
+ background-position: 120% 0;
234
+ }
235
+ to {
236
+ background-position: -120% 0;
237
+ }
238
+ }
239
+
240
+ /* tilt */
241
+ .deck-tilt {
242
+ transition: transform 0.15s ease;
243
+ transform-style: preserve-3d;
244
+ will-change: transform;
245
+ }
246
+
247
+ /* ── hints (vim f) ─────────────────────────────────────────────────────── */
248
+ .deck-hints {
249
+ position: fixed;
250
+ inset: 0;
251
+ z-index: 300;
252
+ pointer-events: none;
253
+ font-family: var(--deck-mono-font);
254
+ }
255
+ .deck-hint {
256
+ position: fixed;
257
+ padding: 1px 6px;
258
+ border-radius: 5px;
259
+ background: #fde047;
260
+ color: #1c1917;
261
+ font-size: 13px;
262
+ font-weight: 700;
263
+ letter-spacing: 0.04em;
264
+ text-transform: uppercase;
265
+ box-shadow:
266
+ 0 1px 0 rgba(0, 0, 0, 0.25),
267
+ 0 3px 10px rgba(0, 0, 0, 0.25);
268
+ pointer-events: auto;
269
+ cursor: pointer;
270
+ line-height: 1.4;
271
+ }
272
+ .deck-hint b {
273
+ color: #b45309;
274
+ }
275
+ .deck-hint.kind-iframe {
276
+ background: #a5f3fc;
277
+ }
278
+ .deck-hint.kind-link {
279
+ background: #fde047;
280
+ }
281
+ .deck-hint.kind-button {
282
+ background: #d9f99d;
283
+ }
284
+ .deck-hint.is-match {
285
+ background: #fff;
286
+ outline: 2px solid #f59e0b;
287
+ }
288
+ .deck-hint.is-dim {
289
+ opacity: 0.25;
290
+ }
291
+ .deck-hint-empty {
292
+ position: fixed;
293
+ left: 50%;
294
+ bottom: 40px;
295
+ transform: translateX(-50%);
296
+ background: rgba(0, 0, 0, 0.75);
297
+ color: #fff;
298
+ padding: 6px 12px;
299
+ border-radius: 999px;
300
+ font-size: 13px;
301
+ }
302
+
303
+ /* ── theme menu ─────────────────────────────────────────────────────────── */
304
+ .deck-theme-menu {
305
+ position: absolute;
306
+ z-index: 60;
307
+ left: 18px;
308
+ bottom: 18px;
309
+ font: 13px var(--deck-body-font);
310
+ }
311
+ .deck-theme-menu.is-compact {
312
+ position: relative;
313
+ left: auto;
314
+ bottom: auto;
315
+ }
316
+ .deck-theme-button {
317
+ display: inline-flex;
318
+ align-items: center;
319
+ gap: 6px;
320
+ padding: 6px 10px;
321
+ border-radius: 999px;
322
+ border: 1px solid var(--deck-border);
323
+ background: color-mix(in oklab, var(--deck-bg) 85%, transparent);
324
+ backdrop-filter: blur(10px);
325
+ color: var(--deck-muted);
326
+ cursor: pointer;
327
+ opacity: 0.55;
328
+ transition: opacity 0.2s;
329
+ }
330
+ .deck-theme-button:hover,
331
+ .deck-theme-menu.is-open .deck-theme-button {
332
+ opacity: 1;
333
+ color: var(--deck-fg);
334
+ }
335
+ .deck-theme-popover {
336
+ position: absolute;
337
+ left: 0;
338
+ bottom: calc(100% + 8px);
339
+ min-width: 190px;
340
+ padding: 8px;
341
+ border-radius: 12px;
342
+ border: 1px solid var(--deck-border);
343
+ background: var(--deck-bg);
344
+ color: var(--deck-fg);
345
+ box-shadow: 0 16px 50px rgba(0, 0, 0, 0.25);
346
+ display: flex;
347
+ flex-direction: column;
348
+ gap: 2px;
349
+ }
350
+ .deck-theme-menu.is-compact .deck-theme-popover {
351
+ bottom: auto;
352
+ top: calc(100% + 8px);
353
+ right: 0;
354
+ left: auto;
355
+ }
356
+ .deck-theme-section {
357
+ font-size: 10px;
358
+ letter-spacing: 0.12em;
359
+ text-transform: uppercase;
360
+ color: var(--deck-muted);
361
+ padding: 6px 8px 2px;
362
+ }
363
+ .deck-theme-popover > button,
364
+ .deck-theme-row > button {
365
+ display: flex;
366
+ align-items: center;
367
+ gap: 8px;
368
+ font: inherit;
369
+ color: inherit;
370
+ text-align: start;
371
+ padding: 6px 8px;
372
+ border: 0;
373
+ border-radius: 8px;
374
+ background: transparent;
375
+ cursor: pointer;
376
+ }
377
+ .deck-theme-popover > button:hover,
378
+ .deck-theme-row > button:hover {
379
+ background: var(--deck-surface);
380
+ }
381
+ .deck-theme-popover > button.is-on,
382
+ .deck-theme-row > button.is-on {
383
+ background: color-mix(in oklab, var(--deck-accent) 15%, transparent);
384
+ color: var(--deck-accent);
385
+ font-weight: 600;
386
+ }
387
+ .deck-theme-row {
388
+ display: grid;
389
+ grid-template-columns: 1fr 1fr;
390
+ gap: 2px;
391
+ }
392
+ .deck-theme-swatch {
393
+ width: 14px;
394
+ height: 14px;
395
+ border-radius: 4px;
396
+ background: linear-gradient(135deg, var(--deck-accent), var(--deck-accent-2));
397
+ border: 1px solid var(--deck-border);
398
+ flex: none;
399
+ }
400
+ .deck-theme-hint {
401
+ font-size: 11px;
402
+ color: var(--deck-muted);
403
+ padding: 6px 8px 2px;
404
+ }
405
+
406
+ /* ── embedded pages: a shield until you mean to interact ────────────────── */
407
+ .deck-frame {
408
+ position: relative;
409
+ width: 100%;
410
+ height: 100%;
411
+ overflow: hidden;
412
+ }
413
+ .deck-frame > iframe {
414
+ width: 100%;
415
+ height: 100%;
416
+ border: 0;
417
+ display: block;
418
+ }
419
+ .deck-frame-shield {
420
+ position: absolute;
421
+ inset: 0;
422
+ display: grid;
423
+ place-items: end center;
424
+ padding-bottom: 1.2em;
425
+ cursor: pointer;
426
+ background: transparent;
427
+ z-index: 2;
428
+ }
429
+ .deck-frame-shield span {
430
+ font: 600 0.5em var(--deck-body-font);
431
+ padding: 0.6em 1.2em;
432
+ border-radius: 999px;
433
+ background: rgba(17, 17, 17, 0.72);
434
+ color: #fff;
435
+ backdrop-filter: blur(8px);
436
+ transition: opacity 0.2s;
437
+ }
438
+ .deck-frame-shield:hover span {
439
+ background: rgba(17, 17, 17, 0.9);
440
+ }
441
+ .deck-frame-done {
442
+ position: absolute;
443
+ top: 0.6em;
444
+ right: 0.6em;
445
+ z-index: 3;
446
+ font: 600 0.45em var(--deck-body-font);
447
+ padding: 0.5em 1em;
448
+ border-radius: 999px;
449
+ border: 0;
450
+ background: rgba(17, 17, 17, 0.72);
451
+ color: #fff;
452
+ cursor: pointer;
453
+ backdrop-filter: blur(8px);
454
+ }
455
+ .deck-frame-done:hover {
456
+ background: rgba(17, 17, 17, 0.9);
457
+ }
458
+ /* One click from a fresh load, for the page that failed. Out of sight until the pointer is on the
459
+ frame (or it is tabbed to), so the window you share on a call stays clean. */
460
+ .deck-frame-reload {
461
+ position: absolute;
462
+ top: 0.6em;
463
+ left: 0.6em;
464
+ /* Above the shield: a press here reloads the page, it does not hand the frame the keyboard. */
465
+ z-index: 4;
466
+ font: 600 0.45em var(--deck-body-font);
467
+ padding: 0.5em 1em;
468
+ border-radius: 999px;
469
+ border: 0;
470
+ background: rgba(17, 17, 17, 0.72);
471
+ color: #fff;
472
+ cursor: pointer;
473
+ backdrop-filter: blur(8px);
474
+ opacity: 0;
475
+ transition: opacity 150ms ease;
476
+ }
477
+ .deck-frame:hover .deck-frame-reload,
478
+ .deck-frame-reload:focus-visible {
479
+ opacity: 1;
480
+ }
481
+ .deck-frame-reload:hover {
482
+ background: rgba(17, 17, 17, 0.9);
483
+ }
484
+ @media (prefers-reduced-motion: reduce) {
485
+ .deck-frame-reload {
486
+ transition: none;
487
+ }
488
+ }
489
+ .deck-frame.is-live .deck-frame-shield {
490
+ display: none;
491
+ }
492
+ /* The poster behind a page that has not loaded (or never will, in print and the previews). */
493
+ .deck-frame-poster {
494
+ position: absolute;
495
+ inset: 0;
496
+ width: 100%;
497
+ height: 100%;
498
+ object-fit: cover;
499
+ object-position: top left;
500
+ z-index: 1;
501
+ pointer-events: none;
502
+ }
503
+ .deck-frame-placeholder {
504
+ position: absolute;
505
+ inset: 0;
506
+ display: grid;
507
+ place-items: center;
508
+ padding: 1em;
509
+ background: var(--deck-surface);
510
+ color: var(--deck-muted);
511
+ font: 500 0.45em var(--deck-mono-font);
512
+ text-align: center;
513
+ word-break: break-all;
514
+ z-index: 1;
515
+ pointer-events: none;
516
+ }
517
+
518
+ /* ── the fit scaler: a slide that overflows is scaled to fit (SlideFrame measures it) ── */
519
+ .deck-layout.is-fitted {
520
+ transform: scale(var(--deck-fit, 1));
521
+ transform-origin: 0 0;
522
+ width: calc(100% / var(--deck-fit, 1));
523
+ height: calc(100% / var(--deck-fit, 1));
524
+ }
525
+
526
+ /* ── the second set of backgrounds ──────────────────────────────────────── */
527
+ .deck-bg-glows {
528
+ position: absolute;
529
+ inset: 0;
530
+ overflow: hidden;
531
+ filter: blur(60px);
532
+ }
533
+ .deck-bg-glows span {
534
+ position: absolute;
535
+ width: 70vmax;
536
+ height: 70vmax;
537
+ margin: -35vmax 0 0 -35vmax;
538
+ border-radius: 50%;
539
+ animation: deck-glow-drift var(--speed, 60s) ease-in-out infinite alternate;
540
+ }
541
+ .deck-bg-glows:not([data-active]) span {
542
+ animation-play-state: paused;
543
+ }
544
+ @keyframes deck-glow-drift {
545
+ 0% {
546
+ transform: translate(-8%, -4%) scale(1);
547
+ }
548
+ 100% {
549
+ transform: translate(10%, 12%) scale(1.15);
550
+ }
551
+ }
552
+ .deck-bg-vignette {
553
+ position: absolute;
554
+ inset: 0;
555
+ pointer-events: none;
556
+ }
557
+ .deck-bg-rays {
558
+ position: absolute;
559
+ inset: -50%;
560
+ background: repeating-conic-gradient(
561
+ from 0deg at var(--rays-x) var(--rays-y),
562
+ var(--rays-c) 0deg 4deg,
563
+ transparent 4deg 16deg
564
+ );
565
+ mask-image: radial-gradient(circle at var(--rays-x) var(--rays-y), #000 0, transparent 70%);
566
+ animation: deck-rays 120s linear infinite;
567
+ }
568
+ .deck-bg-rays:not([data-active]) {
569
+ animation-play-state: paused;
570
+ }
571
+ @keyframes deck-rays {
572
+ to {
573
+ transform: rotate(360deg);
574
+ }
575
+ }
576
+ .deck-bg-sweep {
577
+ position: absolute;
578
+ inset: 0;
579
+ background-size: 300% 300%;
580
+ animation: deck-sweep var(--speed, 24s) ease-in-out infinite alternate;
581
+ }
582
+ .deck-bg-sweep:not([data-active]) {
583
+ animation-play-state: paused;
584
+ }
585
+ @keyframes deck-sweep {
586
+ from {
587
+ background-position: 0% 50%;
588
+ }
589
+ to {
590
+ background-position: 100% 50%;
591
+ }
592
+ }