decklight 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.
- package/LICENSE +21 -0
- package/README.md +257 -0
- package/SPEC.md +372 -0
- package/cli/bundle.mjs +388 -0
- package/cli/decklight.mjs +95 -0
- package/cli/edit.mjs +142 -0
- package/cli/init.mjs +215 -0
- package/cli/rec.mjs +538 -0
- package/dist/decklight.css +1068 -0
- package/dist/decklight.js +239 -0
- package/dist/decklight.js.map +7 -0
- package/docs/architecture.svg +94 -0
- package/docs/demo.svg +124 -0
- package/package.json +54 -0
- package/themes/README.md +61 -0
- package/themes/aliens.css +84 -0
- package/themes/apple2.css +126 -0
- package/themes/aurora.css +84 -0
- package/themes/berry.css +80 -0
- package/themes/blade-runner.css +83 -0
- package/themes/c64.css +85 -0
- package/themes/carbon.css +82 -0
- package/themes/citrus.css +80 -0
- package/themes/coastal.css +80 -0
- package/themes/cosmos.css +86 -0
- package/themes/dune.css +80 -0
- package/themes/eclipse.css +82 -0
- package/themes/ember.css +80 -0
- package/themes/fjord.css +80 -0
- package/themes/friends.css +82 -0
- package/themes/gallery.html +203 -0
- package/themes/gameboy.css +118 -0
- package/themes/genesis.css +84 -0
- package/themes/glacier.css +82 -0
- package/themes/godfather.css +82 -0
- package/themes/graphite.css +80 -0
- package/themes/harvest.css +80 -0
- package/themes/ibm-modern.css +83 -0
- package/themes/ibm-oldschool.css +84 -0
- package/themes/ink.css +82 -0
- package/themes/latte.css +80 -0
- package/themes/linen.css +80 -0
- package/themes/meadow.css +80 -0
- package/themes/metropolis.css +85 -0
- package/themes/miami-vice.css +84 -0
- package/themes/midnight.css +80 -0
- package/themes/mint.css +82 -0
- package/themes/moss.css +82 -0
- package/themes/obsidian.css +82 -0
- package/themes/orchid.css +82 -0
- package/themes/packs.json +89 -0
- package/themes/paper.css +83 -0
- package/themes/peony.css +84 -0
- package/themes/porcelain.css +82 -0
- package/themes/pulp-fiction.css +84 -0
- package/themes/reveal-beige.css +87 -0
- package/themes/reveal-black.css +83 -0
- package/themes/reveal-blood.css +84 -0
- package/themes/reveal-dracula.css +83 -0
- package/themes/reveal-league.css +88 -0
- package/themes/reveal-moon.css +83 -0
- package/themes/reveal-night.css +86 -0
- package/themes/reveal-serif.css +82 -0
- package/themes/reveal-simple.css +84 -0
- package/themes/reveal-sky.css +85 -0
- package/themes/reveal-solarized.css +83 -0
- package/themes/reveal-white.css +82 -0
- package/themes/sepia.css +81 -0
- package/themes/seriph.css +82 -0
- package/themes/severance.css +82 -0
- package/themes/slate.css +80 -0
- package/themes/snes.css +82 -0
- package/themes/star-wars.css +85 -0
- package/themes/storm.css +80 -0
- package/themes/stranger-things.css +84 -0
- package/themes/synthwave.css +90 -0
- package/themes/terminator.css +84 -0
- package/themes/velvet.css +80 -0
- package/tools/gemini-tts.mjs +140 -0
- package/tools/publish-site-voices.mjs +71 -0
- package/tools/voiceover-server.mjs +0 -0
- package/tools/voiceover.mjs +155 -0
|
@@ -0,0 +1,1068 @@
|
|
|
1
|
+
/* Decklight — structural stylesheet. Themes supply the tokens (SPEC §5);
|
|
2
|
+
this file supplies layout, builds, motion, chrome, code, terminal
|
|
3
|
+
structure, and print. */
|
|
4
|
+
|
|
5
|
+
/* ---------- viewport & stage --------------------------------------------- */
|
|
6
|
+
.decklight {
|
|
7
|
+
position: fixed;
|
|
8
|
+
inset: 0;
|
|
9
|
+
overflow: hidden;
|
|
10
|
+
background: var(--bg, #111);
|
|
11
|
+
color: var(--fg, #eee);
|
|
12
|
+
font-family: var(--font-body, system-ui, sans-serif);
|
|
13
|
+
--build-duration: 300ms;
|
|
14
|
+
--transition-duration: 350ms;
|
|
15
|
+
--auto-animate-duration: 500ms;
|
|
16
|
+
--dim-opacity: 0.35;
|
|
17
|
+
}
|
|
18
|
+
.decklight[data-embed] { position: relative; width: 100%; aspect-ratio: 16 / 9; }
|
|
19
|
+
|
|
20
|
+
/* Accent overlay: --bg is the canvas (color OR gradient — the shorthand takes
|
|
21
|
+
either); --bg-accent overlays it ONLY when it is an image value. Using
|
|
22
|
+
background-image makes CSS type-branch for us: gradient accents paint,
|
|
23
|
+
color-valued accents are invalid here and no-op (themes use those as a
|
|
24
|
+
secondary surface token instead). */
|
|
25
|
+
.decklight::before {
|
|
26
|
+
content: '';
|
|
27
|
+
position: absolute;
|
|
28
|
+
inset: 0;
|
|
29
|
+
background-image: var(--bg-accent, none);
|
|
30
|
+
pointer-events: none;
|
|
31
|
+
}
|
|
32
|
+
.decklight-stage { z-index: 1; }
|
|
33
|
+
|
|
34
|
+
.decklight-stage {
|
|
35
|
+
position: absolute;
|
|
36
|
+
top: 50%;
|
|
37
|
+
left: 50%;
|
|
38
|
+
transform: translate(-50%, -50%);
|
|
39
|
+
transform-origin: center;
|
|
40
|
+
/* The slide base lives on the STAGE so a per-section adaptation like
|
|
41
|
+
style="font-size:0.85em" (the dense-slide idiom) resolves against 30px,
|
|
42
|
+
not the page-default 16px the stage would otherwise inherit — an inline
|
|
43
|
+
font-size on the section overrides the section rule below, and em on
|
|
44
|
+
one's own font-size property reads the parent. */
|
|
45
|
+
font-size: 30px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* ---------- slides -------------------------------------------------------- */
|
|
49
|
+
/* Pre-init FOUC guard: before init() creates .decklight-stage and moves the
|
|
50
|
+
sections into it, they sit as direct children of .decklight and would paint
|
|
51
|
+
stacked in document flow (a raw-content flash on every load — worst in the
|
|
52
|
+
picker's preview iframes, which reload the deck per swap). Hide them in
|
|
53
|
+
their pre-init location; init relocates them, after which this rule matches
|
|
54
|
+
nothing and the stage rules below govern (print included — init runs there
|
|
55
|
+
too). The root keeps painting the themed --bg, so boot is a clean canvas. */
|
|
56
|
+
.decklight > section { display: none; }
|
|
57
|
+
|
|
58
|
+
.decklight-stage > section {
|
|
59
|
+
position: absolute;
|
|
60
|
+
inset: 0;
|
|
61
|
+
display: none;
|
|
62
|
+
flex-direction: column;
|
|
63
|
+
justify-content: center;
|
|
64
|
+
padding: 3.5% 5%;
|
|
65
|
+
box-sizing: border-box;
|
|
66
|
+
font-size: 30px;
|
|
67
|
+
line-height: 1.5;
|
|
68
|
+
text-align: center;
|
|
69
|
+
overflow: hidden;
|
|
70
|
+
}
|
|
71
|
+
.decklight-stage > section.active,
|
|
72
|
+
.decklight-stage > section.leaving { display: flex; }
|
|
73
|
+
.decklight-stage > section.leaving { z-index: 1; }
|
|
74
|
+
.decklight-stage > section.active { z-index: 2; }
|
|
75
|
+
|
|
76
|
+
.decklight aside.notes, .decklight aside.rehearse { display: none; }
|
|
77
|
+
|
|
78
|
+
/* ---------- pinned titles (SPEC §8) ---------------------------------------
|
|
79
|
+
The engine marks pinnable sections with data-pinned + inline --pin-y /
|
|
80
|
+
--pin-space (pin Y + measured title height + gap). The leading heading is
|
|
81
|
+
lifted out of flow to sit at --pin-y; padding-top reserves its space so the
|
|
82
|
+
remaining content centers below and can never slide under the title. */
|
|
83
|
+
.decklight-stage > section[data-pinned] { padding-top: var(--pin-space, 172px); }
|
|
84
|
+
.decklight-stage > section[data-pinned] > .pin-title {
|
|
85
|
+
position: absolute;
|
|
86
|
+
top: var(--pin-y, 99px);
|
|
87
|
+
left: 5%;
|
|
88
|
+
right: 5%;
|
|
89
|
+
margin: 0;
|
|
90
|
+
}
|
|
91
|
+
/* the subtitle rides in the pinned header block, directly under the title */
|
|
92
|
+
.decklight-stage > section[data-pinned] > .pin-subtitle {
|
|
93
|
+
position: absolute;
|
|
94
|
+
top: var(--pin-sub-y, 160px);
|
|
95
|
+
left: 5%;
|
|
96
|
+
right: 5%;
|
|
97
|
+
margin: 0;
|
|
98
|
+
max-width: none; /* the generic section > p 32em cap would hug the box left */
|
|
99
|
+
}
|
|
100
|
+
/* momentary measurement state: laid out, never painted (same-task add/remove) */
|
|
101
|
+
.decklight-stage > section.pin-measure { display: flex; visibility: hidden; }
|
|
102
|
+
|
|
103
|
+
/* ---------- subtitle (SPEC §1) ---------------------------------------------
|
|
104
|
+
The <p> directly after a slide's leading heading. One canonical look
|
|
105
|
+
everywhere — markdown or HTML authored, pinned or centered. Absolute size
|
|
106
|
+
(0.72 × the 30px slide base) so per-section font-size adaptations on dense
|
|
107
|
+
slides can't shrink it: the design space is fixed 1280×720, px is stable. */
|
|
108
|
+
.decklight .subtitle {
|
|
109
|
+
font-size: 21.6px;
|
|
110
|
+
color: var(--muted, #9aa);
|
|
111
|
+
line-height: 1.4;
|
|
112
|
+
/* inline margins stay auto: the shorthand would wipe the generic
|
|
113
|
+
`section > p` centering and the capped box would hug left (visible on
|
|
114
|
+
non-pinned title cards, where the subtitle is in normal flow) */
|
|
115
|
+
margin: -0.4em auto 1em;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* typography on tokens */
|
|
119
|
+
.decklight h1, .decklight h2, .decklight h3, .decklight h4 {
|
|
120
|
+
font-family: var(--font-heading, var(--font-body, system-ui, sans-serif));
|
|
121
|
+
color: var(--heading-color, var(--fg, #eee));
|
|
122
|
+
font-weight: var(--heading-weight, 700);
|
|
123
|
+
line-height: 1.15;
|
|
124
|
+
margin: 0 0 0.6em;
|
|
125
|
+
}
|
|
126
|
+
.decklight h1 { font-size: 2.2em; }
|
|
127
|
+
.decklight h2 { font-size: 1.6em; }
|
|
128
|
+
.decklight h3 { font-size: 1.2em; }
|
|
129
|
+
.decklight a { color: var(--link, var(--accent, #6af)); }
|
|
130
|
+
.decklight strong { color: var(--heading-color, inherit); }
|
|
131
|
+
.decklight .muted, .decklight small { color: var(--muted, #999); }
|
|
132
|
+
|
|
133
|
+
.decklight section > p, .decklight section > blockquote { margin: 0.4em auto; max-width: 32em; }
|
|
134
|
+
.decklight ul, .decklight ol, .decklight dl {
|
|
135
|
+
text-align: left;
|
|
136
|
+
display: inline-block;
|
|
137
|
+
margin: 0.4em auto;
|
|
138
|
+
max-width: 34em;
|
|
139
|
+
}
|
|
140
|
+
.decklight li { margin: 0.35em 0; }
|
|
141
|
+
.decklight blockquote {
|
|
142
|
+
text-align: left;
|
|
143
|
+
border-left: 4px solid var(--accent, #6af);
|
|
144
|
+
background: var(--block-bg, rgba(128,128,128,.12));
|
|
145
|
+
padding: 0.5em 1em;
|
|
146
|
+
border-radius: var(--block-radius, 8px);
|
|
147
|
+
font-style: italic;
|
|
148
|
+
}
|
|
149
|
+
.decklight table {
|
|
150
|
+
margin: 0.6em auto;
|
|
151
|
+
border-collapse: collapse;
|
|
152
|
+
text-align: left;
|
|
153
|
+
font-size: 0.82em;
|
|
154
|
+
}
|
|
155
|
+
.decklight th, .decklight td {
|
|
156
|
+
padding: 0.35em 0.9em;
|
|
157
|
+
/* --block-border is a full border shorthand ("1px solid #…", themes may
|
|
158
|
+
use dashed) — wrapping it in `1px solid var(…)` is invalid at
|
|
159
|
+
computed-value time and kills the border entirely */
|
|
160
|
+
border-bottom: var(--block-border, 1px solid rgba(128,128,128,.35));
|
|
161
|
+
}
|
|
162
|
+
.decklight th { color: var(--accent, #6af); }
|
|
163
|
+
.decklight img, .decklight svg { max-width: 100%; }
|
|
164
|
+
.decklight section > svg, .decklight section > img { margin: 0.3em auto; display: block; }
|
|
165
|
+
|
|
166
|
+
/* ---------- builds (SPEC §2) ---------------------------------------------- */
|
|
167
|
+
.decklight .build-step {
|
|
168
|
+
visibility: hidden;
|
|
169
|
+
opacity: 0;
|
|
170
|
+
transition:
|
|
171
|
+
opacity var(--build-duration) ease,
|
|
172
|
+
transform var(--build-duration) ease,
|
|
173
|
+
visibility 0s linear var(--build-duration);
|
|
174
|
+
}
|
|
175
|
+
.decklight .build-step[data-build-state="current"],
|
|
176
|
+
.decklight .build-step[data-build-state="done"] {
|
|
177
|
+
visibility: visible;
|
|
178
|
+
opacity: 1;
|
|
179
|
+
transform: none;
|
|
180
|
+
transition:
|
|
181
|
+
opacity var(--build-duration) ease,
|
|
182
|
+
transform var(--build-duration) ease,
|
|
183
|
+
visibility 0s;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* entrance style offsets while pending */
|
|
187
|
+
.decklight .build-step[data-build-style="fade-up"][data-build-state="pending"] { transform: translateY(16px); }
|
|
188
|
+
.decklight .build-step[data-build-style="fade-down"][data-build-state="pending"] { transform: translateY(-16px); }
|
|
189
|
+
.decklight .build-step[data-build-style="zoom"][data-build-state="pending"] { transform: scale(0.55); }
|
|
190
|
+
.decklight .build-step[data-build-style="none"] { transition: none !important; }
|
|
191
|
+
.decklight .build-step[data-build-style="pop"][data-build-state="current"] {
|
|
192
|
+
animation: dl-pop var(--build-duration) cubic-bezier(.34,1.56,.64,1);
|
|
193
|
+
}
|
|
194
|
+
@keyframes dl-pop { 0% { transform: scale(.4); } 70% { transform: scale(1.08); } 100% { transform: scale(1); } }
|
|
195
|
+
|
|
196
|
+
/* highlight style: always visible; current gets emphasis, siblings dim */
|
|
197
|
+
.decklight .build-step[data-build-style="highlight"] { visibility: visible; opacity: 1; }
|
|
198
|
+
.decklight .build-step[data-build-style="highlight"][data-build-state="current"] {
|
|
199
|
+
outline: 3px solid var(--accent, #6af);
|
|
200
|
+
outline-offset: 4px;
|
|
201
|
+
border-radius: var(--block-radius, 8px);
|
|
202
|
+
}
|
|
203
|
+
.decklight .has-current-highlight .build-step[data-build-style="highlight"]:not([data-build-state="current"]) {
|
|
204
|
+
opacity: var(--dim-opacity);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* theme picker: list + live minified preview */
|
|
208
|
+
.decklight-theme-picker {
|
|
209
|
+
position: absolute;
|
|
210
|
+
inset: 0;
|
|
211
|
+
z-index: 50;
|
|
212
|
+
background: rgba(0, 0, 0, .55);
|
|
213
|
+
backdrop-filter: blur(3px);
|
|
214
|
+
display: flex;
|
|
215
|
+
align-items: center;
|
|
216
|
+
justify-content: center;
|
|
217
|
+
}
|
|
218
|
+
.decklight-theme-picker .tp-panel {
|
|
219
|
+
display: flex;
|
|
220
|
+
gap: 18px;
|
|
221
|
+
width: min(880px, 86vw);
|
|
222
|
+
height: min(520px, 78vh);
|
|
223
|
+
background: #16181d;
|
|
224
|
+
color: #e8eaee;
|
|
225
|
+
border-radius: 14px;
|
|
226
|
+
padding: 18px;
|
|
227
|
+
box-shadow: 0 24px 80px rgba(0, 0, 0, .55);
|
|
228
|
+
font: 15px/1.4 system-ui, sans-serif;
|
|
229
|
+
}
|
|
230
|
+
.decklight-theme-picker .tp-side {
|
|
231
|
+
flex: 0 0 220px;
|
|
232
|
+
display: flex;
|
|
233
|
+
flex-direction: column;
|
|
234
|
+
gap: 8px;
|
|
235
|
+
min-height: 0;
|
|
236
|
+
border-right: 1px solid rgba(255, 255, 255, .08);
|
|
237
|
+
padding-right: 10px;
|
|
238
|
+
}
|
|
239
|
+
.decklight-theme-picker .tp-list {
|
|
240
|
+
flex: 1;
|
|
241
|
+
min-height: 0;
|
|
242
|
+
overflow-y: auto;
|
|
243
|
+
}
|
|
244
|
+
.decklight-theme-picker .tp-filter {
|
|
245
|
+
flex: none;
|
|
246
|
+
padding: 7px 12px;
|
|
247
|
+
border-radius: 8px;
|
|
248
|
+
background: rgba(255, 255, 255, .07);
|
|
249
|
+
color: #8d93a0;
|
|
250
|
+
font-size: 13px;
|
|
251
|
+
white-space: nowrap;
|
|
252
|
+
overflow: hidden;
|
|
253
|
+
text-overflow: ellipsis;
|
|
254
|
+
}
|
|
255
|
+
.decklight-theme-picker .tp-filter.tp-active { color: #fff; }
|
|
256
|
+
.decklight-theme-picker .tp-filter.tp-active::after { content: '▏'; opacity: .6; }
|
|
257
|
+
.decklight-theme-picker .tp-none {
|
|
258
|
+
padding: 7px 12px;
|
|
259
|
+
opacity: .55;
|
|
260
|
+
}
|
|
261
|
+
/* pack navigation rows */
|
|
262
|
+
.decklight-theme-picker .tp-row.tp-pack { font-weight: 600; }
|
|
263
|
+
.decklight-theme-picker .tp-row.tp-back,
|
|
264
|
+
.decklight-theme-picker .tp-row.tp-all {
|
|
265
|
+
text-transform: none;
|
|
266
|
+
color: #b9bec8;
|
|
267
|
+
border-top: 1px solid rgba(255, 255, 255, .08);
|
|
268
|
+
margin-top: 6px;
|
|
269
|
+
padding-top: 9px;
|
|
270
|
+
}
|
|
271
|
+
.decklight-theme-picker .tp-row.tp-back {
|
|
272
|
+
border-top: 0;
|
|
273
|
+
margin-top: 0;
|
|
274
|
+
padding-top: 7px;
|
|
275
|
+
border-bottom: 1px solid rgba(255, 255, 255, .12);
|
|
276
|
+
margin-bottom: 6px;
|
|
277
|
+
padding-bottom: 9px;
|
|
278
|
+
}
|
|
279
|
+
.decklight-theme-picker .tp-row {
|
|
280
|
+
padding: 7px 12px;
|
|
281
|
+
border-radius: 8px;
|
|
282
|
+
cursor: pointer;
|
|
283
|
+
text-transform: capitalize;
|
|
284
|
+
}
|
|
285
|
+
.decklight-theme-picker .tp-row.tp-selected { background: rgba(255, 255, 255, .14); }
|
|
286
|
+
.decklight-theme-picker .tp-row.tp-current::after { content: ' ✓'; opacity: .7; }
|
|
287
|
+
.decklight-theme-picker .tp-row.tp-gen {
|
|
288
|
+
text-transform: none;
|
|
289
|
+
border-bottom: 1px solid rgba(255, 255, 255, .12);
|
|
290
|
+
margin-bottom: 6px;
|
|
291
|
+
padding-bottom: 9px;
|
|
292
|
+
}
|
|
293
|
+
.decklight-theme-picker .tp-tag {
|
|
294
|
+
float: right;
|
|
295
|
+
font-size: 11px;
|
|
296
|
+
opacity: .65;
|
|
297
|
+
border: 1px solid rgba(255, 255, 255, .3);
|
|
298
|
+
border-radius: 999px;
|
|
299
|
+
padding: 0 8px;
|
|
300
|
+
margin-left: 8px;
|
|
301
|
+
}
|
|
302
|
+
.decklight-theme-picker .tp-preview {
|
|
303
|
+
flex: 1;
|
|
304
|
+
display: flex;
|
|
305
|
+
flex-direction: column;
|
|
306
|
+
gap: 10px;
|
|
307
|
+
min-width: 0;
|
|
308
|
+
}
|
|
309
|
+
.decklight-theme-picker .tp-preview iframe {
|
|
310
|
+
flex: 1;
|
|
311
|
+
width: 100%;
|
|
312
|
+
border: 0;
|
|
313
|
+
border-radius: 10px;
|
|
314
|
+
background: #000;
|
|
315
|
+
}
|
|
316
|
+
.decklight-theme-picker .tp-caption {
|
|
317
|
+
text-align: center;
|
|
318
|
+
text-transform: capitalize;
|
|
319
|
+
opacity: .8;
|
|
320
|
+
font-size: 14px;
|
|
321
|
+
}
|
|
322
|
+
/* the slide finder shares the picker's anatomy; titles keep their casing
|
|
323
|
+
(these overrides must come after the capitalize rules above) */
|
|
324
|
+
.decklight-finder .tp-side { flex-basis: 300px; }
|
|
325
|
+
.decklight-finder .tp-row,
|
|
326
|
+
.decklight-finder .tp-caption { text-transform: none; }
|
|
327
|
+
.decklight-finder .tp-row {
|
|
328
|
+
white-space: nowrap;
|
|
329
|
+
overflow: hidden;
|
|
330
|
+
text-overflow: ellipsis;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/* ---------- brand logo (SPEC §8) -------------------------------------------
|
|
334
|
+
Chrome-level mark on every slide. The engine sets data-canvas="dark|light"
|
|
335
|
+
on the root from the applied theme's real background luminance; the
|
|
336
|
+
on-light/on-dark variants toggle accordingly (on-any always shows). */
|
|
337
|
+
.decklight-logo {
|
|
338
|
+
position: absolute;
|
|
339
|
+
z-index: 30;
|
|
340
|
+
height: var(--logo-h, 38px);
|
|
341
|
+
pointer-events: none;
|
|
342
|
+
opacity: 0.9;
|
|
343
|
+
}
|
|
344
|
+
.decklight-logo[data-pos="bottom-left"] { left: 22px; bottom: 16px; }
|
|
345
|
+
.decklight-logo[data-pos="top-left"] { left: 22px; top: 16px; }
|
|
346
|
+
.decklight-logo[data-pos="top-right"] { right: 22px; top: 16px; }
|
|
347
|
+
.decklight-logo[data-pos="bottom-right"] { right: 22px; bottom: 16px; }
|
|
348
|
+
.decklight-logo span { display: block; height: 100%; }
|
|
349
|
+
.decklight-logo img, .decklight-logo svg { height: 100%; width: auto; display: block; }
|
|
350
|
+
/* hero variant: a larger in-flow mark above a slide's content (data-logo) */
|
|
351
|
+
.decklight-hero-logo {
|
|
352
|
+
height: var(--hero-logo-h, 96px);
|
|
353
|
+
margin: 0 auto 30px;
|
|
354
|
+
flex: none;
|
|
355
|
+
}
|
|
356
|
+
.decklight-hero-logo span { display: block; height: 100%; }
|
|
357
|
+
.decklight-hero-logo img, .decklight-hero-logo svg { height: 100%; width: auto; display: block; margin: 0 auto; }
|
|
358
|
+
.decklight[data-canvas="dark"] .decklight-logo .on-light,
|
|
359
|
+
.decklight[data-canvas="dark"] .decklight-hero-logo .on-light { display: none; }
|
|
360
|
+
.decklight[data-canvas="light"] .decklight-logo .on-dark,
|
|
361
|
+
.decklight[data-canvas="light"] .decklight-hero-logo .on-dark { display: none; }
|
|
362
|
+
/* a hero slide carries its own mark — the corner chrome yields */
|
|
363
|
+
.decklight.has-hero-logo > .decklight-logo { display: none; }
|
|
364
|
+
|
|
365
|
+
/* theme-switch toast */
|
|
366
|
+
.decklight-toast {
|
|
367
|
+
position: absolute;
|
|
368
|
+
bottom: 18px;
|
|
369
|
+
left: 50%;
|
|
370
|
+
transform: translateX(-50%);
|
|
371
|
+
background: rgba(0, 0, 0, .65);
|
|
372
|
+
color: #fff;
|
|
373
|
+
font: 14px var(--font-mono, monospace);
|
|
374
|
+
padding: 6px 14px;
|
|
375
|
+
border-radius: 999px;
|
|
376
|
+
opacity: 0;
|
|
377
|
+
transition: opacity .25s;
|
|
378
|
+
pointer-events: none;
|
|
379
|
+
z-index: 40;
|
|
380
|
+
}
|
|
381
|
+
.decklight-toast.show { opacity: 1; }
|
|
382
|
+
|
|
383
|
+
/* draw style: strokes animate dash-offset; text/fills fade */
|
|
384
|
+
.decklight .build-step[data-build-style="draw"] { visibility: visible; opacity: 1; }
|
|
385
|
+
.decklight .build-step[data-build-style="draw"] .draw-stroke {
|
|
386
|
+
stroke-dasharray: var(--draw-len);
|
|
387
|
+
stroke-dashoffset: var(--draw-len);
|
|
388
|
+
transition: stroke-dashoffset calc(var(--build-duration) * 2.2) ease;
|
|
389
|
+
}
|
|
390
|
+
.decklight .build-step[data-build-style="draw"][data-build-state="current"] .draw-stroke,
|
|
391
|
+
.decklight .build-step[data-build-style="draw"][data-build-state="done"] .draw-stroke {
|
|
392
|
+
stroke-dashoffset: 0;
|
|
393
|
+
}
|
|
394
|
+
.decklight .build-step[data-build-style="draw"] .draw-fade {
|
|
395
|
+
opacity: 0;
|
|
396
|
+
transition: opacity var(--build-duration) ease calc(var(--build-duration) * 1.2);
|
|
397
|
+
}
|
|
398
|
+
.decklight .build-step[data-build-style="draw"][data-build-state="current"] .draw-fade,
|
|
399
|
+
.decklight .build-step[data-build-style="draw"][data-build-state="done"] .draw-fade {
|
|
400
|
+
opacity: 1;
|
|
401
|
+
}
|
|
402
|
+
.decklight .build-step[data-build-style="draw"][data-build-state="pending"] .draw-fade { opacity: 0; }
|
|
403
|
+
.decklight .build-step[data-build-style="draw"][data-build-state="pending"] {
|
|
404
|
+
/* strokes hidden by full dash offset; keep element itself visible */
|
|
405
|
+
opacity: 1;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/* instant application (slide entry, deep links, back-nav restore) */
|
|
409
|
+
.decklight.decklight-no-anim .build-step,
|
|
410
|
+
.decklight.decklight-no-anim .build-step .draw-stroke,
|
|
411
|
+
.decklight.decklight-no-anim .build-step .draw-fade {
|
|
412
|
+
transition: none !important;
|
|
413
|
+
animation: none !important;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/* ---------- element animations (SPEC §4.3) -------------------------------- */
|
|
417
|
+
.decklight section.active [data-animate="pulse"] { animation: dl-pulse 1.6s ease-in-out infinite; }
|
|
418
|
+
.decklight section.active [data-animate="float"] { animation: dl-float 3s ease-in-out infinite; }
|
|
419
|
+
.decklight section.active [data-animate="shake"] { animation: dl-shake .8s ease-in-out infinite; }
|
|
420
|
+
.decklight section.active [data-animate="spin"] { animation: dl-spin 2.4s linear infinite; }
|
|
421
|
+
.decklight section.active [data-animate="blink"] { animation: dl-blink 1.2s steps(2) infinite; }
|
|
422
|
+
.decklight section.active [data-animate="bounce"] { animation: dl-bounce 1.4s cubic-bezier(.28, .84, .42, 1) infinite; }
|
|
423
|
+
.decklight section.active [data-animate="swing"] { animation: dl-swing 2s ease-in-out infinite; transform-origin: top center; }
|
|
424
|
+
.decklight section.active [data-animate="glow"] { animation: dl-glow 2.2s ease-in-out infinite; }
|
|
425
|
+
.decklight section.active [data-animate="breathe"] { animation: dl-breathe 3.4s ease-in-out infinite; }
|
|
426
|
+
@keyframes dl-pulse { 50% { transform: scale(1.06); } }
|
|
427
|
+
@keyframes dl-float { 50% { transform: translateY(-8px); } }
|
|
428
|
+
@keyframes dl-shake { 25% { transform: translateX(-4px); } 75% { transform: translateX(4px); } }
|
|
429
|
+
@keyframes dl-spin { to { transform: rotate(360deg); } }
|
|
430
|
+
@keyframes dl-blink { 50% { opacity: .25; } }
|
|
431
|
+
@keyframes dl-bounce { 0%, 100% { transform: translateY(0); } 40% { transform: translateY(-14px); } 60% { transform: translateY(-6px); } }
|
|
432
|
+
@keyframes dl-swing { 0%, 100% { transform: rotate(4deg); } 50% { transform: rotate(-4deg); } }
|
|
433
|
+
@keyframes dl-glow {
|
|
434
|
+
0%, 100% { box-shadow: 0 0 0 0 rgba(128, 160, 255, 0); }
|
|
435
|
+
50% { box-shadow: 0 0 18px 4px color-mix(in srgb, var(--accent, #6af) 55%, transparent); }
|
|
436
|
+
}
|
|
437
|
+
@keyframes dl-breathe { 50% { transform: scale(1.04); opacity: .82; } }
|
|
438
|
+
|
|
439
|
+
/* ---------- slide transitions (SPEC §4.1) --------------------------------- */
|
|
440
|
+
.decklight section.tr-fade.entering { animation: dl-fade-in var(--transition-duration) ease both; }
|
|
441
|
+
.decklight section.tr-fade.leaving { animation: dl-fade-out var(--transition-duration) ease both; }
|
|
442
|
+
@keyframes dl-fade-in { from { opacity: 0; } }
|
|
443
|
+
@keyframes dl-fade-out { to { opacity: 0; } }
|
|
444
|
+
|
|
445
|
+
.decklight section.tr-slide.entering.dir-fwd { animation: dl-in-right var(--transition-duration) ease both; }
|
|
446
|
+
.decklight section.tr-slide.leaving.dir-fwd { animation: dl-out-left var(--transition-duration) ease both; }
|
|
447
|
+
.decklight section.tr-slide.entering.dir-back { animation: dl-in-left var(--transition-duration) ease both; }
|
|
448
|
+
.decklight section.tr-slide.leaving.dir-back { animation: dl-out-right var(--transition-duration) ease both; }
|
|
449
|
+
@keyframes dl-in-right { from { transform: translateX(60px); opacity: 0; } }
|
|
450
|
+
@keyframes dl-out-left { to { transform: translateX(-60px); opacity: 0; } }
|
|
451
|
+
@keyframes dl-in-left { from { transform: translateX(-60px); opacity: 0; } }
|
|
452
|
+
@keyframes dl-out-right { to { transform: translateX(60px); opacity: 0; } }
|
|
453
|
+
|
|
454
|
+
.decklight section.tr-scale.entering { animation: dl-scale-in var(--transition-duration) ease both; }
|
|
455
|
+
.decklight section.tr-scale.leaving { animation: dl-scale-out var(--transition-duration) ease both; }
|
|
456
|
+
@keyframes dl-scale-in { from { transform: scale(.88); opacity: 0; } }
|
|
457
|
+
@keyframes dl-scale-out { to { transform: scale(1.08); opacity: 0; } }
|
|
458
|
+
|
|
459
|
+
.decklight-stage { perspective: 1400px; }
|
|
460
|
+
.decklight section.tr-flip.entering.dir-fwd { animation: dl-flip-in var(--transition-duration) ease both; }
|
|
461
|
+
.decklight section.tr-flip.leaving.dir-fwd { animation: dl-flip-out var(--transition-duration) ease both; }
|
|
462
|
+
.decklight section.tr-flip.entering.dir-back { animation: dl-flip-out-rev var(--transition-duration) ease both; }
|
|
463
|
+
.decklight section.tr-flip.leaving.dir-back { animation: dl-flip-in-rev var(--transition-duration) ease both; }
|
|
464
|
+
@keyframes dl-flip-in { from { transform: rotateY(24deg); opacity: 0; } }
|
|
465
|
+
@keyframes dl-flip-out { to { transform: rotateY(-24deg); opacity: 0; } }
|
|
466
|
+
@keyframes dl-flip-in-rev { to { transform: rotateY(24deg); opacity: 0; } }
|
|
467
|
+
@keyframes dl-flip-out-rev { from { transform: rotateY(-24deg); opacity: 0; } }
|
|
468
|
+
|
|
469
|
+
/* auto-animate fresh content */
|
|
470
|
+
.decklight .aa-fresh { opacity: 0; }
|
|
471
|
+
.decklight .aa-fresh.aa-in { opacity: 1; transition: opacity var(--auto-animate-duration) ease; }
|
|
472
|
+
|
|
473
|
+
/* ---------- code (SPEC §6) ------------------------------------------------- */
|
|
474
|
+
.decklight pre {
|
|
475
|
+
text-align: left;
|
|
476
|
+
margin: 0.5em auto;
|
|
477
|
+
max-width: 95%;
|
|
478
|
+
background: var(--code-bg, #1d1f27);
|
|
479
|
+
border-radius: var(--block-radius, 10px);
|
|
480
|
+
box-shadow: var(--shadow, 0 6px 24px rgba(0,0,0,.25));
|
|
481
|
+
padding: 0.7em 1em;
|
|
482
|
+
overflow: auto;
|
|
483
|
+
}
|
|
484
|
+
.decklight pre code {
|
|
485
|
+
display: block;
|
|
486
|
+
font-family: var(--font-mono, ui-monospace, monospace);
|
|
487
|
+
font-size: 0.62em;
|
|
488
|
+
line-height: 1.55;
|
|
489
|
+
color: var(--code-fg, #e6e6e6);
|
|
490
|
+
background: none;
|
|
491
|
+
white-space: pre;
|
|
492
|
+
}
|
|
493
|
+
.decklight :not(pre) > code {
|
|
494
|
+
font-family: var(--font-mono, ui-monospace, monospace);
|
|
495
|
+
font-size: 0.9em;
|
|
496
|
+
background: var(--block-bg, rgba(128,128,128,.15));
|
|
497
|
+
padding: 0.1em 0.35em;
|
|
498
|
+
border-radius: 5px;
|
|
499
|
+
}
|
|
500
|
+
.decklight .code-line { display: block; min-height: 1.55em; transition: opacity var(--build-duration) ease; }
|
|
501
|
+
.decklight pre.line-numbers { counter-reset: dl-line; }
|
|
502
|
+
.decklight pre.line-numbers .code-line { counter-increment: dl-line; }
|
|
503
|
+
.decklight pre.line-numbers .code-line::before {
|
|
504
|
+
content: counter(dl-line);
|
|
505
|
+
display: inline-block;
|
|
506
|
+
width: 2.2em;
|
|
507
|
+
margin-right: 0.8em;
|
|
508
|
+
text-align: right;
|
|
509
|
+
color: var(--muted, #888);
|
|
510
|
+
user-select: none;
|
|
511
|
+
}
|
|
512
|
+
.decklight .code-line.line-dim { opacity: var(--dim-opacity); }
|
|
513
|
+
.decklight .code-line.line-hl { opacity: 1; }
|
|
514
|
+
|
|
515
|
+
/* hljs token → theme token mapping (no separate hljs theme files) */
|
|
516
|
+
.decklight .hljs-keyword, .decklight .hljs-literal, .decklight .hljs-selector-tag { color: var(--hl-keyword, #c792ea); }
|
|
517
|
+
.decklight .hljs-string, .decklight .hljs-regexp, .decklight .hljs-addition { color: var(--hl-string, #a5d6a7); }
|
|
518
|
+
.decklight .hljs-number, .decklight .hljs-symbol { color: var(--hl-number, #f78c6c); }
|
|
519
|
+
.decklight .hljs-comment, .decklight .hljs-quote, .decklight .hljs-deletion { color: var(--hl-comment, #7d8799); font-style: italic; }
|
|
520
|
+
.decklight .hljs-title, .decklight .hljs-title.function_, .decklight .hljs-function, .decklight .hljs-section { color: var(--hl-function, #82aaff); }
|
|
521
|
+
.decklight .hljs-type, .decklight .hljs-built_in, .decklight .hljs-class, .decklight .hljs-attr, .decklight .hljs-attribute, .decklight .hljs-variable, .decklight .hljs-template-variable { color: var(--hl-type, #ffcb6b); }
|
|
522
|
+
.decklight .hljs-punctuation, .decklight .hljs-operator, .decklight .hljs-meta { color: var(--hl-punct, #89ddff); }
|
|
523
|
+
|
|
524
|
+
/* ---------- terminal placement (visuals live in src/terminal/terminal.css,
|
|
525
|
+
concatenated into dist by the build) ------------------------------------- */
|
|
526
|
+
.decklight .terminal {
|
|
527
|
+
text-align: left;
|
|
528
|
+
margin: 0.5em auto;
|
|
529
|
+
/* Stable footprint: a fixed width (not max-width) — in a flex column the
|
|
530
|
+
auto side margins would otherwise shrink the box to its content, making
|
|
531
|
+
the terminal grow as output streams in. */
|
|
532
|
+
width: 95%;
|
|
533
|
+
}
|
|
534
|
+
.decklight .terminal ::selection { background: var(--term-selection, rgba(120,150,255,.35)); }
|
|
535
|
+
|
|
536
|
+
/* ---------- chrome --------------------------------------------------------- */
|
|
537
|
+
.decklight-controls { position: absolute; right: 18px; bottom: 14px; z-index: 40; display: flex; gap: 6px; }
|
|
538
|
+
.decklight-arrow {
|
|
539
|
+
background: transparent;
|
|
540
|
+
border: 0;
|
|
541
|
+
color: var(--muted, #888);
|
|
542
|
+
font-size: 34px;
|
|
543
|
+
line-height: 1;
|
|
544
|
+
cursor: pointer;
|
|
545
|
+
padding: 2px 10px;
|
|
546
|
+
}
|
|
547
|
+
.decklight-arrow:hover { color: var(--accent, #6af); }
|
|
548
|
+
.decklight-progress { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; z-index: 40; background: rgba(128,128,128,.2); }
|
|
549
|
+
.decklight-progress .bar { height: 100%; width: 0; background: var(--accent, #6af); transition: width 200ms ease; }
|
|
550
|
+
.decklight-slide-number {
|
|
551
|
+
position: absolute;
|
|
552
|
+
right: 20px;
|
|
553
|
+
top: 16px;
|
|
554
|
+
z-index: 40;
|
|
555
|
+
color: var(--muted, #888);
|
|
556
|
+
font-size: 14px;
|
|
557
|
+
font-family: var(--font-mono, monospace);
|
|
558
|
+
}
|
|
559
|
+
.decklight-slide-number .mod {
|
|
560
|
+
opacity: .75;
|
|
561
|
+
margin-right: 12px;
|
|
562
|
+
font-family: var(--font-body, system-ui, sans-serif);
|
|
563
|
+
}
|
|
564
|
+
/* touch chrome — shown only where there's no keyboard (see engine.js) */
|
|
565
|
+
.decklight-touch-controls { position: absolute; left: 14px; top: 14px; z-index: 41; display: none; gap: 8px; }
|
|
566
|
+
.decklight-touch-btn {
|
|
567
|
+
display: flex; align-items: center; justify-content: center;
|
|
568
|
+
width: 46px; height: 46px;
|
|
569
|
+
border-radius: 12px;
|
|
570
|
+
border: 1px solid rgba(160, 160, 160, .28);
|
|
571
|
+
background: rgba(20, 20, 22, .5);
|
|
572
|
+
color: var(--fg, #e6e6e6);
|
|
573
|
+
cursor: pointer;
|
|
574
|
+
-webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
|
|
575
|
+
-webkit-tap-highlight-color: transparent;
|
|
576
|
+
}
|
|
577
|
+
.decklight-touch-btn:active { background: rgba(70, 70, 74, .6); }
|
|
578
|
+
@media (pointer: coarse) { .decklight-touch-controls { display: flex; } }
|
|
579
|
+
|
|
580
|
+
/* module menu (playlist): list overlay, same pattern as the theme picker */
|
|
581
|
+
.decklight-module-menu {
|
|
582
|
+
position: absolute;
|
|
583
|
+
inset: 0;
|
|
584
|
+
z-index: 50;
|
|
585
|
+
background: rgba(0, 0, 0, .55);
|
|
586
|
+
backdrop-filter: blur(3px);
|
|
587
|
+
display: flex;
|
|
588
|
+
align-items: center;
|
|
589
|
+
justify-content: center;
|
|
590
|
+
}
|
|
591
|
+
.decklight-module-menu .mm-panel {
|
|
592
|
+
width: min(460px, 80vw);
|
|
593
|
+
max-height: min(560px, 80vh);
|
|
594
|
+
display: flex;
|
|
595
|
+
flex-direction: column;
|
|
596
|
+
background: #16181d;
|
|
597
|
+
color: #e8eaee;
|
|
598
|
+
border-radius: 14px;
|
|
599
|
+
padding: 18px;
|
|
600
|
+
box-shadow: 0 24px 80px rgba(0, 0, 0, .55);
|
|
601
|
+
font: 15px/1.4 system-ui, sans-serif;
|
|
602
|
+
}
|
|
603
|
+
.decklight-module-menu .mm-title {
|
|
604
|
+
font-weight: 600;
|
|
605
|
+
opacity: .7;
|
|
606
|
+
padding: 0 12px 10px;
|
|
607
|
+
text-transform: uppercase;
|
|
608
|
+
font-size: 12px;
|
|
609
|
+
letter-spacing: .08em;
|
|
610
|
+
}
|
|
611
|
+
.decklight-module-menu .mm-list { overflow-y: auto; }
|
|
612
|
+
.decklight-module-menu .mm-row {
|
|
613
|
+
padding: 8px 12px;
|
|
614
|
+
border-radius: 8px;
|
|
615
|
+
cursor: pointer;
|
|
616
|
+
}
|
|
617
|
+
.decklight-module-menu .mm-row.mm-selected { background: rgba(255, 255, 255, .14); }
|
|
618
|
+
.decklight-module-menu .mm-row.mm-current::after { content: ' ✓'; opacity: .7; }
|
|
619
|
+
|
|
620
|
+
/* overview */
|
|
621
|
+
.decklight-overview-grid {
|
|
622
|
+
position: absolute;
|
|
623
|
+
inset: 0;
|
|
624
|
+
z-index: 60;
|
|
625
|
+
overflow: auto;
|
|
626
|
+
display: grid;
|
|
627
|
+
grid-template-columns: repeat(4, 1fr);
|
|
628
|
+
gap: 14px;
|
|
629
|
+
padding: 20px;
|
|
630
|
+
/* theme-independent scrim: color-mix(var(--bg)…) breaks when --bg is a
|
|
631
|
+
gradient (invalid <color>, declaration dropped, stage bleeds through) */
|
|
632
|
+
background: rgba(9, 10, 13, 0.93);
|
|
633
|
+
}
|
|
634
|
+
/* 16:9 cells: the row height is set explicitly by layoutOverview() from the
|
|
635
|
+
resolved column width — intrinsic tricks (aspect-ratio, %-padding spacers)
|
|
636
|
+
contribute nothing to auto row sizing here and the rows collapse. */
|
|
637
|
+
.decklight-overview-grid .ov-cell {
|
|
638
|
+
position: relative;
|
|
639
|
+
cursor: pointer;
|
|
640
|
+
overflow: hidden;
|
|
641
|
+
border-radius: 8px;
|
|
642
|
+
border: 2px solid transparent;
|
|
643
|
+
background: var(--bg, #111);
|
|
644
|
+
}
|
|
645
|
+
/* the grid replaces the stage; kill any bleed-through under the scrim */
|
|
646
|
+
.decklight-overview > .decklight-stage { visibility: hidden; }
|
|
647
|
+
.decklight-overview-grid .ov-cell.ov-current { border-color: var(--accent, #6af); }
|
|
648
|
+
.decklight-overview-grid .ov-cell.ov-selected { outline: 3px solid var(--accent, #6af); outline-offset: 2px; }
|
|
649
|
+
.decklight-overview-grid .ov-frame { transform-origin: top left; position: absolute; top: 0; left: 0; pointer-events: none; }
|
|
650
|
+
.decklight-overview-grid .ov-clone *, .decklight-overview-grid .ov-clone { animation: none !important; transition: none !important; }
|
|
651
|
+
/* clones live outside .decklight-stage, so the slide base styles must be
|
|
652
|
+
restated here — without them thumbnails render as unstyled 16px fragments */
|
|
653
|
+
.decklight-overview-grid .ov-clone {
|
|
654
|
+
display: flex !important;
|
|
655
|
+
position: relative !important;
|
|
656
|
+
width: 100%;
|
|
657
|
+
height: 100%;
|
|
658
|
+
box-sizing: border-box;
|
|
659
|
+
flex-direction: column;
|
|
660
|
+
justify-content: center;
|
|
661
|
+
padding: 3.5% 5%;
|
|
662
|
+
font-size: 30px;
|
|
663
|
+
line-height: 1.5;
|
|
664
|
+
text-align: center;
|
|
665
|
+
overflow: hidden;
|
|
666
|
+
}
|
|
667
|
+
.decklight-overview-grid .ov-clone[data-pinned] { padding-top: var(--pin-space, 172px); }
|
|
668
|
+
.decklight-overview-grid .ov-clone[data-pinned] > .pin-title {
|
|
669
|
+
position: absolute;
|
|
670
|
+
top: var(--pin-y, 99px);
|
|
671
|
+
left: 5%;
|
|
672
|
+
right: 5%;
|
|
673
|
+
margin: 0;
|
|
674
|
+
}
|
|
675
|
+
.decklight-overview-grid .ov-clone[data-pinned] > .pin-subtitle {
|
|
676
|
+
position: absolute;
|
|
677
|
+
top: var(--pin-sub-y, 160px);
|
|
678
|
+
left: 5%;
|
|
679
|
+
right: 5%;
|
|
680
|
+
margin: 0;
|
|
681
|
+
max-width: none;
|
|
682
|
+
}
|
|
683
|
+
.decklight-overview-grid .ov-num {
|
|
684
|
+
position: absolute; left: 8px; top: 6px; z-index: 2;
|
|
685
|
+
font-size: 12px; color: var(--fg, #eee); background: rgba(0,0,0,.5); border-radius: 4px; padding: 0 7px;
|
|
686
|
+
}
|
|
687
|
+
.decklight-overview .build-step { visibility: visible !important; opacity: 1 !important; transform: none !important; }
|
|
688
|
+
.decklight-overview .draw-stroke { stroke-dashoffset: 0 !important; }
|
|
689
|
+
.decklight-overview .draw-fade { opacity: 1 !important; }
|
|
690
|
+
|
|
691
|
+
/* narration picker (N) */
|
|
692
|
+
.decklight-narr {
|
|
693
|
+
position: absolute;
|
|
694
|
+
inset: 0;
|
|
695
|
+
z-index: 70;
|
|
696
|
+
background: rgba(0, 0, 0, .55);
|
|
697
|
+
backdrop-filter: blur(3px);
|
|
698
|
+
display: flex;
|
|
699
|
+
align-items: center;
|
|
700
|
+
justify-content: center;
|
|
701
|
+
}
|
|
702
|
+
.decklight-narr .narr-card {
|
|
703
|
+
background: #16181d;
|
|
704
|
+
color: #e8eaee;
|
|
705
|
+
border-radius: 12px;
|
|
706
|
+
padding: 14px;
|
|
707
|
+
width: min(440px, 82vw);
|
|
708
|
+
max-height: 70vh;
|
|
709
|
+
overflow-y: auto;
|
|
710
|
+
font: 14px/1.5 system-ui, sans-serif;
|
|
711
|
+
box-shadow: 0 24px 80px rgba(0, 0, 0, .55);
|
|
712
|
+
}
|
|
713
|
+
.decklight-narr .narr-head {
|
|
714
|
+
opacity: .55;
|
|
715
|
+
font-size: 11px;
|
|
716
|
+
text-transform: uppercase;
|
|
717
|
+
letter-spacing: .08em;
|
|
718
|
+
padding: 10px 12px 2px;
|
|
719
|
+
}
|
|
720
|
+
.decklight-narr .narr-row { display: flex; align-items: center; gap: 8px; padding: 6px 12px; border-radius: 8px; cursor: pointer; }
|
|
721
|
+
.decklight-narr .narr-row-label { flex: 1 1 auto; min-width: 0; }
|
|
722
|
+
.decklight-narr .narr-prev-btn {
|
|
723
|
+
flex: none;
|
|
724
|
+
background: none;
|
|
725
|
+
border: 1px solid rgba(255, 255, 255, .18);
|
|
726
|
+
color: inherit;
|
|
727
|
+
opacity: .65;
|
|
728
|
+
font: inherit;
|
|
729
|
+
font-size: 11px;
|
|
730
|
+
line-height: 1;
|
|
731
|
+
padding: 3px 7px;
|
|
732
|
+
border-radius: 6px;
|
|
733
|
+
cursor: pointer;
|
|
734
|
+
}
|
|
735
|
+
.decklight-narr .narr-prev-btn:hover { opacity: 1; border-color: rgba(255, 255, 255, .4); }
|
|
736
|
+
.decklight-narr .narr-preview-row { display: flex; align-items: center; gap: 6px; }
|
|
737
|
+
.decklight-narr .narr-preview-row .narr-input { flex: 1 1 auto; width: auto; }
|
|
738
|
+
.decklight-narr .narr-reset-btn { margin: 8px 0 4px; padding: 7px 9px; }
|
|
739
|
+
.decklight-narr .narr-row.narr-sel { background: rgba(255, 255, 255, .14); }
|
|
740
|
+
.decklight-narr .narr-row.narr-cur::after { content: ' ✓'; opacity: .7; }
|
|
741
|
+
.decklight-narr .narr-flavor { opacity: .5; font-size: .85em; margin-left: 6px; }
|
|
742
|
+
.decklight-narr .narr-input {
|
|
743
|
+
width: 100%;
|
|
744
|
+
box-sizing: border-box;
|
|
745
|
+
margin: 8px 0 4px;
|
|
746
|
+
padding: 8px 12px;
|
|
747
|
+
border-radius: 8px;
|
|
748
|
+
border: 1px solid rgba(255, 255, 255, .18);
|
|
749
|
+
background: rgba(255, 255, 255, .07);
|
|
750
|
+
color: inherit;
|
|
751
|
+
font: inherit;
|
|
752
|
+
outline: none;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
/* offline recording (⇧V) — shares .decklight-narr's card chrome */
|
|
756
|
+
.decklight-record .narr-card { width: min(400px, 82vw); }
|
|
757
|
+
.decklight-record .rec-line { padding: 4px 12px; opacity: .85; }
|
|
758
|
+
.decklight-record .rec-hint { padding: 10px 12px 2px; opacity: .5; font-size: 12px; }
|
|
759
|
+
.decklight-record .rec-bar {
|
|
760
|
+
height: 6px;
|
|
761
|
+
margin: 10px 12px 4px;
|
|
762
|
+
border-radius: 3px;
|
|
763
|
+
background: rgba(255, 255, 255, .12);
|
|
764
|
+
overflow: hidden;
|
|
765
|
+
}
|
|
766
|
+
.decklight-record .rec-bar-fill {
|
|
767
|
+
height: 100%;
|
|
768
|
+
background: var(--accent, #6af);
|
|
769
|
+
transition: width 200ms ease;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/* command palette (/) */
|
|
773
|
+
.decklight-palette .narr-card { width: min(520px, 86vw); }
|
|
774
|
+
.decklight-palette .pal-input {
|
|
775
|
+
padding: 8px 12px;
|
|
776
|
+
margin-bottom: 8px;
|
|
777
|
+
border-radius: 8px;
|
|
778
|
+
background: rgba(255, 255, 255, .07);
|
|
779
|
+
color: #8d93a0;
|
|
780
|
+
font-size: 13px;
|
|
781
|
+
}
|
|
782
|
+
.decklight-palette .pal-input.tp-active { color: #fff; }
|
|
783
|
+
.decklight-palette .pal-input.tp-active::after { content: '▏'; opacity: .6; }
|
|
784
|
+
.decklight-palette .pal-row { display: flex; justify-content: space-between; gap: 18px; }
|
|
785
|
+
.decklight-palette .pal-kbd {
|
|
786
|
+
opacity: .55;
|
|
787
|
+
font-family: ui-monospace, "SF Mono", Menlo, monospace;
|
|
788
|
+
font-size: 12px;
|
|
789
|
+
white-space: nowrap;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
/* blackout / help */
|
|
793
|
+
.decklight-blackout { position: absolute; inset: 0; background: #000; z-index: 90; }
|
|
794
|
+
.decklight-help { position: absolute; inset: 0; z-index: 95; background: rgba(0,0,0,.6); display: flex; align-items: center; justify-content: center; }
|
|
795
|
+
.decklight-help .help-card { background: var(--bg, #222); color: var(--fg, #eee); border-radius: 12px; padding: 24px 34px; font-size: 16px; box-shadow: var(--shadow, 0 10px 40px rgba(0,0,0,.5)); }
|
|
796
|
+
.decklight-help td { padding: 3px 14px 3px 0; }
|
|
797
|
+
.decklight-help td:first-child { font-family: var(--font-mono, monospace); color: var(--accent, #6af); }
|
|
798
|
+
|
|
799
|
+
/* debug log window (D) — passive chrome: keys keep driving the deck.
|
|
800
|
+
Hardcoded dark like the picker/narr cards: readable over every theme. */
|
|
801
|
+
.decklight-debug {
|
|
802
|
+
position: absolute;
|
|
803
|
+
right: 14px;
|
|
804
|
+
bottom: 46px;
|
|
805
|
+
width: min(430px, 44vw);
|
|
806
|
+
max-height: 46vh;
|
|
807
|
+
z-index: 85;
|
|
808
|
+
display: flex;
|
|
809
|
+
flex-direction: column;
|
|
810
|
+
background: rgba(11, 13, 18, .93);
|
|
811
|
+
color: #dce2ec;
|
|
812
|
+
border: 1px solid rgba(255, 255, 255, .14);
|
|
813
|
+
border-radius: 10px;
|
|
814
|
+
box-shadow: 0 18px 60px rgba(0, 0, 0, .5);
|
|
815
|
+
font: 11px/1.55 ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
|
|
816
|
+
}
|
|
817
|
+
.decklight-debug .dbg-head {
|
|
818
|
+
padding: 8px 12px 2px;
|
|
819
|
+
font-size: 9.5px;
|
|
820
|
+
text-transform: uppercase;
|
|
821
|
+
letter-spacing: .08em;
|
|
822
|
+
opacity: .55;
|
|
823
|
+
}
|
|
824
|
+
.decklight-debug .dbg-state {
|
|
825
|
+
padding: 0 12px 7px;
|
|
826
|
+
color: #9ecbff;
|
|
827
|
+
border-bottom: 1px solid rgba(255, 255, 255, .09);
|
|
828
|
+
white-space: nowrap;
|
|
829
|
+
overflow: hidden;
|
|
830
|
+
text-overflow: ellipsis;
|
|
831
|
+
}
|
|
832
|
+
.decklight-debug .dbg-log { overflow-y: auto; padding: 6px 12px 9px; }
|
|
833
|
+
.decklight-debug .dbg-row { display: flex; gap: 9px; }
|
|
834
|
+
.decklight-debug .dbg-t { opacity: .4; flex: none; }
|
|
835
|
+
.decklight-debug .dbg-k { flex: none; width: 42px; opacity: .75; }
|
|
836
|
+
.decklight-debug .dbg-m { white-space: pre-wrap; word-break: break-word; }
|
|
837
|
+
.decklight-debug .dbg-error .dbg-k, .decklight-debug .dbg-error .dbg-m { color: #ff8f8f; }
|
|
838
|
+
.decklight-debug .dbg-theme .dbg-k { color: #b7a3ff; }
|
|
839
|
+
.decklight-debug .dbg-narr .dbg-k { color: #8fd6a8; }
|
|
840
|
+
.decklight-debug .dbg-tts .dbg-k { color: #7fb8ff; }
|
|
841
|
+
|
|
842
|
+
/* closed captions (C) — the current notes segment, youtube-style */
|
|
843
|
+
.decklight-captions {
|
|
844
|
+
position: absolute;
|
|
845
|
+
left: 50%;
|
|
846
|
+
bottom: 7%;
|
|
847
|
+
transform: translateX(-50%);
|
|
848
|
+
max-width: 72%;
|
|
849
|
+
padding: 10px 18px;
|
|
850
|
+
border-radius: 8px;
|
|
851
|
+
background: rgba(8, 9, 12, .8);
|
|
852
|
+
color: #fff;
|
|
853
|
+
font-size: 21px;
|
|
854
|
+
line-height: 1.45;
|
|
855
|
+
text-align: center;
|
|
856
|
+
z-index: 45;
|
|
857
|
+
pointer-events: none;
|
|
858
|
+
display: none;
|
|
859
|
+
}
|
|
860
|
+
.decklight-captions.show { display: block; }
|
|
861
|
+
|
|
862
|
+
/* notes editor (E, served by `decklight edit`) */
|
|
863
|
+
.decklight-editor .narr-card { width: min(640px, 88vw); }
|
|
864
|
+
.decklight-editor .edit-notes {
|
|
865
|
+
min-height: 240px;
|
|
866
|
+
resize: vertical;
|
|
867
|
+
line-height: 1.6;
|
|
868
|
+
font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
|
|
869
|
+
font-size: 13px;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
/* transcript overlay (palette → Transcript…) */
|
|
873
|
+
.decklight-transcript .narr-card { width: min(680px, 88vw); }
|
|
874
|
+
.decklight-transcript .tr-actions { display: flex; gap: 8px; padding: 4px 12px 10px; border-bottom: 1px solid rgba(255, 255, 255, .09); }
|
|
875
|
+
.decklight-transcript .tr-slide { padding: 4px 12px; }
|
|
876
|
+
.decklight-transcript .tr-title { font-weight: 700; margin: 10px 0 4px; cursor: pointer; }
|
|
877
|
+
.decklight-transcript .tr-title:hover { color: #9ecbff; }
|
|
878
|
+
.decklight-transcript .tr-seg { margin: 0 0 8px; opacity: .85; font-size: 13px; line-height: 1.55; }
|
|
879
|
+
|
|
880
|
+
/* ---------- print (SPEC §8) ------------------------------------------------ */
|
|
881
|
+
.decklight.decklight-print { position: static; overflow: visible; }
|
|
882
|
+
.decklight.decklight-print .decklight-stage {
|
|
883
|
+
position: static;
|
|
884
|
+
transform: none !important;
|
|
885
|
+
width: auto !important;
|
|
886
|
+
height: auto !important;
|
|
887
|
+
}
|
|
888
|
+
.decklight.decklight-print .decklight-stage > section {
|
|
889
|
+
display: flex;
|
|
890
|
+
position: relative;
|
|
891
|
+
width: 1280px;
|
|
892
|
+
height: 720px;
|
|
893
|
+
page-break-after: always;
|
|
894
|
+
break-after: page;
|
|
895
|
+
border-bottom: 1px dashed rgba(128,128,128,.4);
|
|
896
|
+
}
|
|
897
|
+
.decklight.decklight-print .build-step { visibility: visible !important; opacity: 1 !important; transform: none !important; }
|
|
898
|
+
.decklight.decklight-print .draw-stroke { stroke-dashoffset: 0 !important; }
|
|
899
|
+
.decklight.decklight-print .draw-fade { opacity: 1 !important; }
|
|
900
|
+
@media print {
|
|
901
|
+
@page { size: 1280px 720px; margin: 0; }
|
|
902
|
+
.decklight.decklight-print .decklight-stage > section { border-bottom: 0; }
|
|
903
|
+
.decklight-controls, .decklight-progress, .decklight-touch-controls { display: none !important; }
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/* ---------- reduced motion ------------------------------------------------- */
|
|
907
|
+
@media (prefers-reduced-motion: reduce) {
|
|
908
|
+
.decklight section.entering, .decklight section.leaving,
|
|
909
|
+
.decklight .build-step, .decklight [data-animate],
|
|
910
|
+
.decklight .draw-stroke, .decklight .draw-fade, .decklight .aa-fresh {
|
|
911
|
+
animation: none !important;
|
|
912
|
+
transition: none !important;
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
/* Decklight terminal player chrome (SPEC §7.3).
|
|
918
|
+
* Shipped from src/terminal/ so the terminal subsystem is self-contained;
|
|
919
|
+
* the core build concatenates this into dist/decklight.css.
|
|
920
|
+
* All colors come from theme tokens (--term-*, --ansi-*). */
|
|
921
|
+
|
|
922
|
+
.terminal-window {
|
|
923
|
+
background: var(--term-bg, #101418);
|
|
924
|
+
color: var(--term-fg, #e6e6e6);
|
|
925
|
+
border-radius: var(--block-radius, 10px);
|
|
926
|
+
box-shadow: var(--shadow, 0 8px 30px rgba(0, 0, 0, .35));
|
|
927
|
+
overflow: hidden;
|
|
928
|
+
font-family: var(--font-mono, ui-monospace, 'SF Mono', Menlo, monospace);
|
|
929
|
+
font-size: 0.62em;
|
|
930
|
+
text-align: left;
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
.terminal-titlebar {
|
|
934
|
+
display: var(--term-chrome, flex);
|
|
935
|
+
align-items: center;
|
|
936
|
+
gap: 7px;
|
|
937
|
+
padding: 9px 12px;
|
|
938
|
+
background: color-mix(in srgb, var(--term-bg, #101418) 82%, var(--term-fg, #fff) 18%);
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
.terminal-dot {
|
|
942
|
+
width: 11px; height: 11px; border-radius: 50%;
|
|
943
|
+
background: #ff5f57;
|
|
944
|
+
}
|
|
945
|
+
.terminal-dot:nth-child(2) { background: #febc2e; }
|
|
946
|
+
.terminal-dot:nth-child(3) { background: #28c840; }
|
|
947
|
+
|
|
948
|
+
.terminal-title {
|
|
949
|
+
margin-left: 8px;
|
|
950
|
+
opacity: .65;
|
|
951
|
+
font-size: .9em;
|
|
952
|
+
flex: 1;
|
|
953
|
+
text-align: center;
|
|
954
|
+
padding-right: 60px; /* visually center vs the dots */
|
|
955
|
+
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
.terminal-controls { display: flex; gap: 6px; }
|
|
959
|
+
.terminal-btn {
|
|
960
|
+
background: transparent;
|
|
961
|
+
color: var(--term-fg, #e6e6e6);
|
|
962
|
+
border: 1px solid color-mix(in srgb, var(--term-fg, #fff) 35%, transparent);
|
|
963
|
+
border-radius: 6px;
|
|
964
|
+
font: inherit;
|
|
965
|
+
font-size: .85em;
|
|
966
|
+
padding: 1px 8px;
|
|
967
|
+
cursor: pointer;
|
|
968
|
+
}
|
|
969
|
+
.terminal-btn:hover { background: color-mix(in srgb, var(--term-fg, #fff) 12%, transparent); }
|
|
970
|
+
|
|
971
|
+
.terminal-screen {
|
|
972
|
+
overflow-y: auto;
|
|
973
|
+
padding: 12px 14px;
|
|
974
|
+
scrollbar-width: thin;
|
|
975
|
+
/* Stable footprint: the screen arrives at its full size before anything
|
|
976
|
+
plays and never resizes as steps stream in. aspect-ratio sets the
|
|
977
|
+
preferred height from the width (the 16:9 floor); min-height: 0 disables
|
|
978
|
+
the content-based automatic minimum so content CANNOT grow the box —
|
|
979
|
+
it scrolls instead; the inline rows cap (max-height) wins as the max.
|
|
980
|
+
width + box-sizing keep the inline axis definite: without them, a capped
|
|
981
|
+
height would TRANSFER through the ratio and narrow the box. */
|
|
982
|
+
aspect-ratio: 16 / 9;
|
|
983
|
+
min-height: 0;
|
|
984
|
+
width: 100%;
|
|
985
|
+
box-sizing: border-box;
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
/* .decklight prefix: the deck's generic `pre` styling (code-panel background,
|
|
989
|
+
shadow, radius, padding) must not leak into the terminal's line buffer —
|
|
990
|
+
invisible when term-bg ≈ code-bg, glaring on a light terminal screen. */
|
|
991
|
+
.terminal-lines,
|
|
992
|
+
.decklight .terminal-lines {
|
|
993
|
+
margin: 0;
|
|
994
|
+
padding: 0;
|
|
995
|
+
font: inherit;
|
|
996
|
+
line-height: var(--term-line-height, 1.45em);
|
|
997
|
+
white-space: pre-wrap;
|
|
998
|
+
word-break: break-word;
|
|
999
|
+
background: transparent;
|
|
1000
|
+
box-shadow: none;
|
|
1001
|
+
border-radius: 0;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
.terminal-lines ::selection { background: var(--term-selection, rgba(120, 160, 255, .35)); }
|
|
1005
|
+
|
|
1006
|
+
.terminal-prompt { color: var(--term-prompt, #7ee787); font-weight: 600; }
|
|
1007
|
+
.terminal-cmd { color: var(--term-fg, #e6e6e6); font-weight: 600; }
|
|
1008
|
+
|
|
1009
|
+
.terminal-cursor {
|
|
1010
|
+
display: inline-block;
|
|
1011
|
+
width: .6em; height: 1.05em;
|
|
1012
|
+
vertical-align: text-bottom;
|
|
1013
|
+
background: var(--term-cursor, #aeb8c2);
|
|
1014
|
+
animation: terminal-blink 1.1s steps(1) infinite;
|
|
1015
|
+
}
|
|
1016
|
+
@keyframes terminal-blink { 50% { opacity: 0; } }
|
|
1017
|
+
@media (prefers-reduced-motion: reduce) { .terminal-cursor { animation: none; } }
|
|
1018
|
+
|
|
1019
|
+
.terminal-broken .terminal-lines { color: #ffb0b0; }
|
|
1020
|
+
|
|
1021
|
+
/* --- ANSI 16-color classes -> theme tokens ------------------------------- */
|
|
1022
|
+
.ansi-fg-0 { color: var(--ansi-black, #3b4252); }
|
|
1023
|
+
.ansi-fg-1 { color: var(--ansi-red, #e06c75); }
|
|
1024
|
+
.ansi-fg-2 { color: var(--ansi-green, #98c379); }
|
|
1025
|
+
.ansi-fg-3 { color: var(--ansi-yellow, #e5c07b); }
|
|
1026
|
+
.ansi-fg-4 { color: var(--ansi-blue, #61afef); }
|
|
1027
|
+
.ansi-fg-5 { color: var(--ansi-magenta, #c678dd); }
|
|
1028
|
+
.ansi-fg-6 { color: var(--ansi-cyan, #56b6c2); }
|
|
1029
|
+
.ansi-fg-7 { color: var(--ansi-white, #d8dee9); }
|
|
1030
|
+
.ansi-fg-8 { color: var(--ansi-bright-black, #6b7386); }
|
|
1031
|
+
.ansi-fg-9 { color: var(--ansi-bright-red, #ff7b86); }
|
|
1032
|
+
.ansi-fg-10 { color: var(--ansi-bright-green, #b5e890); }
|
|
1033
|
+
.ansi-fg-11 { color: var(--ansi-bright-yellow, #ffd68a); }
|
|
1034
|
+
.ansi-fg-12 { color: var(--ansi-bright-blue, #82c4ff); }
|
|
1035
|
+
.ansi-fg-13 { color: var(--ansi-bright-magenta, #dd93ee); }
|
|
1036
|
+
.ansi-fg-14 { color: var(--ansi-bright-cyan, #6fd7e4); }
|
|
1037
|
+
.ansi-fg-15 { color: var(--ansi-bright-white, #f2f4f8); }
|
|
1038
|
+
|
|
1039
|
+
.ansi-bg-0 { background-color: var(--ansi-black, #3b4252); }
|
|
1040
|
+
.ansi-bg-1 { background-color: var(--ansi-red, #e06c75); }
|
|
1041
|
+
.ansi-bg-2 { background-color: var(--ansi-green, #98c379); }
|
|
1042
|
+
.ansi-bg-3 { background-color: var(--ansi-yellow, #e5c07b); }
|
|
1043
|
+
.ansi-bg-4 { background-color: var(--ansi-blue, #61afef); }
|
|
1044
|
+
.ansi-bg-5 { background-color: var(--ansi-magenta, #c678dd); }
|
|
1045
|
+
.ansi-bg-6 { background-color: var(--ansi-cyan, #56b6c2); }
|
|
1046
|
+
.ansi-bg-7 { background-color: var(--ansi-white, #d8dee9); }
|
|
1047
|
+
.ansi-bg-8 { background-color: var(--ansi-bright-black, #6b7386); }
|
|
1048
|
+
.ansi-bg-9 { background-color: var(--ansi-bright-red, #ff7b86); }
|
|
1049
|
+
.ansi-bg-10 { background-color: var(--ansi-bright-green, #b5e890); }
|
|
1050
|
+
.ansi-bg-11 { background-color: var(--ansi-bright-yellow, #ffd68a); }
|
|
1051
|
+
.ansi-bg-12 { background-color: var(--ansi-bright-blue, #82c4ff); }
|
|
1052
|
+
.ansi-bg-13 { background-color: var(--ansi-bright-magenta, #dd93ee); }
|
|
1053
|
+
.ansi-bg-14 { background-color: var(--ansi-bright-cyan, #6fd7e4); }
|
|
1054
|
+
.ansi-bg-15 { background-color: var(--ansi-bright-white, #f2f4f8); }
|
|
1055
|
+
|
|
1056
|
+
.ansi-bold { font-weight: 700; }
|
|
1057
|
+
.ansi-dim { opacity: var(--dim-opacity, .55); }
|
|
1058
|
+
.ansi-italic { font-style: italic; }
|
|
1059
|
+
.ansi-underline { text-decoration: underline; }
|
|
1060
|
+
.ansi-inv-fg { color: var(--term-bg, #101418); }
|
|
1061
|
+
.ansi-inv-bg { background-color: var(--term-fg, #e6e6e6); }
|
|
1062
|
+
|
|
1063
|
+
/* Print: casts fully expanded, no scroll clipping (SPEC §8). The 16:9 floor
|
|
1064
|
+
is released so the box grows with the full output. */
|
|
1065
|
+
@media print {
|
|
1066
|
+
.terminal-screen { max-height: none !important; overflow: visible; aspect-ratio: auto; min-height: auto; }
|
|
1067
|
+
.terminal-controls { display: none; }
|
|
1068
|
+
}
|