@kadal/theme-terminal 0.0.0-stage → 0.4.2

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 (5) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +64 -2
  3. package/index.tsx +100 -0
  4. package/package.json +101 -4
  5. package/style.css +753 -0
package/style.css ADDED
@@ -0,0 +1,753 @@
1
+ /* ─────────────────────────────────────────────────────────────────────────────
2
+ Terminal — a developer theme for code-heavy talks. Mono-forward: JetBrains Mono for headings,
3
+ labels and code, IBM Plex Sans for reading text. Dark first (the deck starts dark unless it says
4
+ otherwise), with a light variant made to the same standard; the palette is Ayu's, so the code
5
+ colours (Shiki's ayu-dark / ayu-light) and the slide agree. Code blocks are the centre: a
6
+ window bar with its three lights, line numbers, a lit active line, a clear dim.
7
+
8
+ Scoped under .theme-terminal; light is .theme-terminal (tokens below), dark is
9
+ .theme-terminal[data-color-scheme="dark"]. themeConfig: `accent` (the dark scheme's prompt
10
+ green, --theme-accent), `accentLight` (the light scheme's, --theme-accent-light; derived from
11
+ `accent` when only that is set), `cursor: false` stills the cover's cursor (--theme-cursor).
12
+ ───────────────────────────────────────────────────────────────────────────── */
13
+
14
+ .theme-terminal {
15
+ /* light: Ayu Light */
16
+ --terminal-accent-deep: color-mix(in oklab, var(--theme-accent) 62%, black);
17
+ --deck-bg: #fafafa;
18
+ --deck-fg: #1f2430;
19
+ --deck-muted: #5c6773;
20
+ --deck-accent: var(--theme-accent-light, var(--terminal-accent-deep, #477a0b));
21
+ --deck-accent-2: #0b7aa6;
22
+ --deck-surface: #eff1f3;
23
+ --deck-border: #d9dde2;
24
+ --deck-live: var(--deck-accent);
25
+ --deck-controls-color: var(--deck-accent);
26
+ --terminal-red: #d6454d;
27
+ --terminal-amber: #b86b00;
28
+ --terminal-green: #477a0b;
29
+ --terminal-violet: #8a52c8;
30
+ --terminal-code-ink: #b15c00;
31
+ --terminal-window: #e9ecef;
32
+ --deck-heading-font: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
33
+ --deck-body-font: "IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
34
+ --deck-mono-font: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
35
+ --deck-serif-font: ui-serif, Georgia, Cambria, "Times New Roman", serif;
36
+ --deck-base-size: 34px;
37
+ --deck-code-bg: #f3f4f5;
38
+ --deck-code-fg: #5c6166;
39
+ --deck-code-active: rgba(71, 122, 11, 0.1);
40
+ --deck-radius: 10px;
41
+ --deck-pad: 80px;
42
+ --deck-transition: 300ms;
43
+ }
44
+ .theme-terminal[data-color-scheme="dark"] {
45
+ /* dark: Ayu Dark */
46
+ --deck-bg: #0b0e14;
47
+ --deck-fg: #dcd9cf;
48
+ --deck-muted: #8e959f;
49
+ --deck-accent: var(--theme-accent, #aad94c);
50
+ --deck-accent-2: #39bae6;
51
+ --deck-surface: #12161e;
52
+ --deck-border: #232a36;
53
+ --terminal-red: #f07178;
54
+ --terminal-amber: #ffb454;
55
+ --terminal-green: #aad94c;
56
+ --terminal-violet: #d2a6ff;
57
+ --terminal-code-ink: #ffb454;
58
+ --terminal-window: #141821;
59
+ --deck-code-bg: #0d1017;
60
+ --deck-code-fg: #bfbdb6;
61
+ --deck-code-active: rgba(170, 217, 76, 0.09);
62
+ color-scheme: dark;
63
+ }
64
+
65
+ /* ── type ──────────────────────────────────────────────────────────────── */
66
+ .theme-terminal .deck-slide {
67
+ line-height: 1.45;
68
+ }
69
+ .theme-terminal .deck-slide :is(h1, h2, h3, h4) {
70
+ font-weight: 700;
71
+ letter-spacing: -0.03em;
72
+ line-height: 1.12;
73
+ }
74
+ .theme-terminal .deck-slide h1 {
75
+ font-size: 2.5em;
76
+ }
77
+ .theme-terminal .deck-slide h2 {
78
+ font-size: 1.6em;
79
+ margin-bottom: 0.65em;
80
+ }
81
+ /* headings keep their markdown: a `#` before the second level, quiet */
82
+ .theme-terminal .deck-slide h2::before {
83
+ content: "# " / "";
84
+ color: var(--deck-accent);
85
+ font-weight: 400;
86
+ }
87
+ .theme-terminal .deck-slide h3 {
88
+ font-size: 1.1em;
89
+ letter-spacing: -0.02em;
90
+ }
91
+ .theme-terminal .deck-slide h3::before {
92
+ content: "## " / "";
93
+ color: var(--deck-muted);
94
+ font-weight: 400;
95
+ }
96
+ .theme-terminal .deck-slide h4 {
97
+ font-size: 0.6em;
98
+ font-weight: 600;
99
+ letter-spacing: 0.08em;
100
+ text-transform: uppercase;
101
+ color: var(--deck-muted);
102
+ }
103
+ .theme-terminal .deck-slide h4::before {
104
+ content: "// " / "";
105
+ color: var(--deck-accent);
106
+ }
107
+ .theme-terminal .deck-layout-default > :is(p, ul, ol) {
108
+ max-width: 36em;
109
+ }
110
+ .theme-terminal .deck-slide ul {
111
+ list-style: none;
112
+ padding-inline-start: 1.2em;
113
+ }
114
+ .theme-terminal .deck-slide ul > li {
115
+ position: relative;
116
+ }
117
+ .theme-terminal .deck-slide ul > li::before {
118
+ content: "\203A" / "";
119
+ position: absolute;
120
+ left: -1.05em;
121
+ font: 700 1em var(--deck-mono-font);
122
+ color: var(--deck-accent);
123
+ }
124
+ .theme-terminal .deck-slide ul ul > li::before {
125
+ content: "\00B7" / "";
126
+ color: var(--deck-muted);
127
+ }
128
+ .theme-terminal .deck-slide ol > li::marker {
129
+ font-family: var(--deck-mono-font);
130
+ font-weight: 700;
131
+ color: var(--deck-accent);
132
+ }
133
+ .theme-terminal .deck-slide strong {
134
+ font-weight: 700;
135
+ color: var(--deck-fg);
136
+ }
137
+ .theme-terminal .deck-slide em {
138
+ font-style: normal;
139
+ color: var(--terminal-amber);
140
+ }
141
+ .theme-terminal .deck-slide a {
142
+ color: var(--deck-accent-2);
143
+ text-decoration-style: dotted;
144
+ text-decoration-thickness: 0.08em;
145
+ text-underline-offset: 0.2em;
146
+ }
147
+ .theme-terminal .deck-slide a:hover {
148
+ text-decoration-style: solid;
149
+ }
150
+ .theme-terminal .deck-slide blockquote {
151
+ position: relative;
152
+ margin: 0.6em 0;
153
+ padding: 0.1em 0 0.1em 1.4em;
154
+ border: 0;
155
+ border-radius: 0;
156
+ background: none;
157
+ color: var(--deck-muted);
158
+ }
159
+ .theme-terminal .deck-slide blockquote::before {
160
+ content: ">" / "";
161
+ position: absolute;
162
+ left: 0;
163
+ font: 700 1em var(--deck-mono-font);
164
+ color: var(--deck-accent);
165
+ }
166
+ .theme-terminal .deck-slide blockquote p:last-child {
167
+ margin-bottom: 0;
168
+ }
169
+ .theme-terminal .deck-slide hr {
170
+ border-top: 1px dashed var(--deck-border);
171
+ }
172
+ .theme-terminal .deck-slide table {
173
+ font-size: 0.68em;
174
+ border: 1px solid var(--deck-border);
175
+ border-radius: 8px;
176
+ border-collapse: separate;
177
+ border-spacing: 0;
178
+ overflow: hidden;
179
+ }
180
+ .theme-terminal .deck-slide th {
181
+ font: 600 0.78em var(--deck-mono-font);
182
+ letter-spacing: 0.06em;
183
+ color: var(--deck-accent);
184
+ background: var(--deck-surface);
185
+ border-bottom: 1px solid var(--deck-border);
186
+ }
187
+ .theme-terminal .deck-slide :is(th, td) {
188
+ padding: 0.5em 0.9em;
189
+ }
190
+ .theme-terminal .deck-slide td + td,
191
+ .theme-terminal .deck-slide th + th {
192
+ border-left: 1px solid var(--deck-border);
193
+ }
194
+ .theme-terminal .deck-slide tbody tr:last-child td {
195
+ border-bottom: 0;
196
+ }
197
+ .theme-terminal .deck-slide :not(pre) > code {
198
+ font-size: 0.82em;
199
+ padding: 0.1em 0.38em;
200
+ border-radius: 5px;
201
+ color: var(--terminal-code-ink);
202
+ background: var(--deck-surface);
203
+ border: 1px solid var(--deck-border);
204
+ }
205
+ .theme-terminal .deck-kbd {
206
+ border-radius: 5px;
207
+ border-color: var(--deck-border);
208
+ background: var(--deck-surface);
209
+ color: var(--deck-fg);
210
+ }
211
+ .theme-terminal .deck-slide :is(img, video) {
212
+ border-radius: 8px;
213
+ }
214
+
215
+ /* ── code: the window ──────────────────────────────────────────────────── */
216
+ .theme-terminal .deck-code-block {
217
+ border-radius: var(--deck-radius);
218
+ border: 1px solid var(--deck-border);
219
+ background: var(--deck-code-bg);
220
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.03) inset, 0 20px 50px -28px rgba(0, 0, 0, 0.55);
221
+ }
222
+ .theme-terminal .deck-code-title {
223
+ position: relative;
224
+ justify-content: center;
225
+ padding: 0.65em 1em;
226
+ font: 500 0.46em var(--deck-mono-font);
227
+ letter-spacing: 0.02em;
228
+ color: var(--deck-muted);
229
+ background: var(--terminal-window);
230
+ border-bottom: 1px solid var(--deck-border);
231
+ }
232
+ /* the three lights, from the one dot the bar has */
233
+ .theme-terminal .deck-code-title-dot {
234
+ position: absolute;
235
+ left: 1.1em;
236
+ top: 50%;
237
+ width: 0.95em;
238
+ height: 0.95em;
239
+ margin-top: -0.475em;
240
+ background: #f07171;
241
+ box-shadow:
242
+ 1.5em 0 0 #f2ae49,
243
+ 3em 0 0 #86b300;
244
+ }
245
+ /* a block without a title still gets its window bar */
246
+ .theme-terminal .deck-code-block:not(.has-title) {
247
+ padding-top: 1.35em;
248
+ }
249
+ .theme-terminal .deck-code-block:not(.has-title)::before {
250
+ content: "";
251
+ position: absolute;
252
+ left: 0.5em;
253
+ top: 0.48em;
254
+ width: 0.43em;
255
+ height: 0.43em;
256
+ border-radius: 50%;
257
+ background: #f07171;
258
+ box-shadow:
259
+ 0.68em 0 0 #f2ae49,
260
+ 1.36em 0 0 #86b300;
261
+ opacity: 0.85;
262
+ }
263
+ .theme-terminal pre.deck-code,
264
+ .theme-terminal .shiki-magic-move-wrap {
265
+ font-size: 0.6em;
266
+ line-height: 1.7;
267
+ font-variant-ligatures: contextual;
268
+ }
269
+ .theme-terminal pre.deck-code {
270
+ padding: 0.85em 0 0.95em;
271
+ }
272
+ .theme-terminal pre.deck-code .line {
273
+ padding: 0 1.4em;
274
+ }
275
+ .theme-terminal .shiki-magic-move-wrap {
276
+ padding: 0.85em 1.4em 0.95em;
277
+ }
278
+ .theme-terminal pre.deck-code .line.is-active {
279
+ background: var(--deck-code-active);
280
+ box-shadow: inset 0.2em 0 0 var(--deck-accent);
281
+ }
282
+ .theme-terminal pre.deck-code .line.is-dim {
283
+ opacity: 0.36;
284
+ filter: saturate(0.5);
285
+ }
286
+ .theme-terminal pre.deck-code.has-lines .line::before {
287
+ color: var(--deck-muted);
288
+ opacity: 0.5;
289
+ }
290
+ .theme-terminal pre.deck-code.has-lines .line.is-active::before {
291
+ color: var(--deck-accent);
292
+ opacity: 1;
293
+ }
294
+ .theme-terminal .deck-code-copy {
295
+ font-size: 0.42em;
296
+ border-radius: 6px;
297
+ background: var(--terminal-window);
298
+ }
299
+
300
+ /* ── components ────────────────────────────────────────────────────────── */
301
+ /* a callout is a log line: a bracketed level, then the message */
302
+ .theme-terminal .deck-callout {
303
+ padding: 0.6em 0.95em;
304
+ border: 1px solid var(--deck-border);
305
+ border-inline-start: 3px solid var(--terminal-kind);
306
+ border-radius: 8px;
307
+ background: var(--deck-surface);
308
+ font-size: 0.8em;
309
+ --terminal-kind: var(--deck-accent-2);
310
+ }
311
+ .theme-terminal .deck-callout.kind-tip {
312
+ --terminal-kind: var(--terminal-green);
313
+ }
314
+ .theme-terminal .deck-callout.kind-warn {
315
+ --terminal-kind: var(--terminal-amber);
316
+ }
317
+ .theme-terminal .deck-callout.kind-danger {
318
+ --terminal-kind: var(--terminal-red);
319
+ }
320
+ .theme-terminal .deck-callout.kind-note {
321
+ --terminal-kind: var(--deck-muted);
322
+ }
323
+ .theme-terminal .deck-callout-title {
324
+ font: 700 0.72em var(--deck-mono-font);
325
+ letter-spacing: 0.06em;
326
+ text-transform: uppercase;
327
+ color: var(--terminal-kind);
328
+ margin-bottom: 0.3em;
329
+ }
330
+ .theme-terminal .deck-callout-title::before {
331
+ content: "[" / "";
332
+ }
333
+ .theme-terminal .deck-callout-title::after {
334
+ content: "]" / "";
335
+ }
336
+ .theme-terminal .deck-callout > div > :last-child {
337
+ margin-bottom: 0;
338
+ }
339
+ .theme-terminal .deck-badge {
340
+ font-family: var(--deck-mono-font);
341
+ font-weight: 600;
342
+ letter-spacing: 0.04em;
343
+ border-radius: 5px;
344
+ }
345
+ .theme-terminal .deck-badge.tone-good {
346
+ color: var(--terminal-green);
347
+ }
348
+ .theme-terminal .deck-badge.tone-warn {
349
+ color: var(--terminal-amber);
350
+ }
351
+ .theme-terminal .deck-badge.tone-bad {
352
+ color: var(--terminal-red);
353
+ }
354
+ /* the contents as `tree` prints them */
355
+ .theme-terminal .deck-toc {
356
+ font-family: var(--deck-mono-font);
357
+ font-size: 0.82em;
358
+ }
359
+ .theme-terminal .deck-toc li {
360
+ margin: 0.12em 0;
361
+ }
362
+ .theme-terminal .deck-toc li::before {
363
+ content: "\251C\2500 " / "";
364
+ color: var(--deck-muted);
365
+ }
366
+ .theme-terminal .deck-toc li:last-child::before {
367
+ content: "\2514\2500 " / "";
368
+ }
369
+ .theme-terminal .deck-toc li:is(.level-2, .level-3) {
370
+ padding-inline-start: 1.6em;
371
+ }
372
+ .theme-terminal .deck-toc li.is-current > a {
373
+ color: var(--deck-accent);
374
+ }
375
+ .theme-terminal .deck-toc li.is-current > a::after {
376
+ content: " \2190 you are here" / "";
377
+ color: var(--deck-muted);
378
+ font-weight: 400;
379
+ }
380
+ .theme-terminal .deck-counter {
381
+ font-family: var(--deck-mono-font);
382
+ }
383
+ .theme-terminal .deck-mark {
384
+ --mark-color: var(--deck-accent);
385
+ }
386
+
387
+ /* ── chrome ────────────────────────────────────────────────────────────── */
388
+ .theme-terminal .deck-progress {
389
+ height: 3px;
390
+ background: var(--deck-surface);
391
+ }
392
+ .theme-terminal .deck-progress span {
393
+ background: var(--deck-accent);
394
+ }
395
+ .theme-terminal .deck-slide-number {
396
+ font: 500 13px var(--deck-mono-font);
397
+ color: var(--deck-muted);
398
+ background: var(--deck-surface);
399
+ border: 1px solid var(--deck-border);
400
+ border-radius: 5px;
401
+ }
402
+ .theme-terminal .deck-slide-number::before {
403
+ content: "[" / "";
404
+ }
405
+ .theme-terminal .deck-slide-number::after {
406
+ content: "]" / "";
407
+ }
408
+
409
+ /* ── layouts ───────────────────────────────────────────────────────────── */
410
+ /* the prompt, and the cursor after the title */
411
+ .theme-terminal :is(.deck-layout-cover, .deck-layout-intro, .deck-layout-section, .deck-layout-end) :is(h1, h2)::before {
412
+ content: "\276F " / "";
413
+ color: var(--deck-accent);
414
+ font-weight: 700;
415
+ }
416
+ .theme-terminal .deck-layout-cover {
417
+ justify-content: center;
418
+ align-items: flex-start;
419
+ }
420
+ .theme-terminal .deck-layout-cover h1 {
421
+ font-size: 3.4em;
422
+ letter-spacing: -0.045em;
423
+ margin-bottom: 0.4em;
424
+ }
425
+ .theme-terminal :is(.deck-layout-cover, .deck-layout-end) h1::after {
426
+ content: "";
427
+ display: inline-block;
428
+ width: 0.55em;
429
+ height: 0.9em;
430
+ margin-left: 0.15em;
431
+ vertical-align: -0.08em;
432
+ background: var(--deck-accent);
433
+ opacity: var(--theme-cursor, 1);
434
+ animation: terminal-blink 1.1s steps(1) infinite;
435
+ }
436
+ @keyframes terminal-blink {
437
+ 50% {
438
+ opacity: 0;
439
+ }
440
+ }
441
+ .theme-terminal .deck-layout-cover > p {
442
+ max-width: 38em;
443
+ font-size: 1em;
444
+ color: var(--deck-muted);
445
+ }
446
+ .theme-terminal .deck-layout-cover h4 {
447
+ margin-bottom: 1.4em;
448
+ }
449
+ .theme-terminal .deck-layout-intro {
450
+ align-items: flex-start;
451
+ }
452
+ .theme-terminal .deck-layout-intro h1 {
453
+ font-size: 2.6em;
454
+ }
455
+ .theme-terminal .deck-layout-intro > p {
456
+ max-width: 34em;
457
+ color: var(--deck-muted);
458
+ }
459
+ .theme-terminal .deck-layout-section {
460
+ align-items: flex-start;
461
+ }
462
+ .theme-terminal .deck-layout-section :is(h1, h2) {
463
+ font-size: 2.9em;
464
+ padding-bottom: 0.3em;
465
+ margin-bottom: 0.45em;
466
+ border-bottom: 1px dashed var(--deck-border);
467
+ }
468
+ .theme-terminal .deck-layout-section > p {
469
+ font-family: var(--deck-mono-font);
470
+ font-size: 0.8em;
471
+ color: var(--deck-muted);
472
+ }
473
+ .theme-terminal .deck-layout-section > p::before {
474
+ content: "// " / "";
475
+ color: var(--deck-accent);
476
+ }
477
+ .theme-terminal .deck-layout-end :is(h1, h2) {
478
+ font-size: 3em;
479
+ }
480
+ .theme-terminal .deck-layout-end > p {
481
+ font-family: var(--deck-mono-font);
482
+ font-size: 0.75em;
483
+ color: var(--deck-muted);
484
+ }
485
+ .theme-terminal .deck-layout-fact > :is(h1, h2, p, .deck-counter):first-child {
486
+ font-family: var(--deck-mono-font);
487
+ font-size: 5em;
488
+ font-weight: 800;
489
+ letter-spacing: -0.06em;
490
+ line-height: 1;
491
+ color: var(--deck-accent);
492
+ margin-bottom: 0.2em;
493
+ }
494
+ .theme-terminal .deck-layout-fact > :not(:first-child) {
495
+ font-size: 0.95em;
496
+ font-weight: 400;
497
+ letter-spacing: 0;
498
+ color: var(--deck-muted);
499
+ max-width: 32em;
500
+ }
501
+ /* a quote is a block comment */
502
+ .theme-terminal .deck-layout-quote {
503
+ padding-inline: 10%;
504
+ font-style: normal;
505
+ font-size: 1.1em;
506
+ }
507
+ .theme-terminal .deck-layout-quote blockquote {
508
+ padding: 0;
509
+ color: var(--deck-fg);
510
+ font-size: 1.15em;
511
+ line-height: 1.35;
512
+ }
513
+ .theme-terminal .deck-layout-quote blockquote::before {
514
+ content: "/*" / "";
515
+ position: static;
516
+ display: block;
517
+ margin-bottom: 0.3em;
518
+ color: var(--deck-muted);
519
+ font-weight: 400;
520
+ }
521
+ .theme-terminal .deck-layout-quote blockquote::after {
522
+ content: "*/" / "";
523
+ display: block;
524
+ margin-top: 0.3em;
525
+ font: 400 1em var(--deck-mono-font);
526
+ color: var(--deck-muted);
527
+ }
528
+ .theme-terminal .deck-layout-quote > p {
529
+ font: 500 0.6em var(--deck-mono-font);
530
+ color: var(--deck-accent);
531
+ }
532
+ .theme-terminal .deck-layout-quote > p::before {
533
+ content: "\2014 " / "";
534
+ }
535
+ .theme-terminal .deck-layout-statement :is(h1, h2) {
536
+ font-size: 2.5em;
537
+ max-width: 22ch;
538
+ margin-inline: auto;
539
+ }
540
+ .theme-terminal .deck-layout-full {
541
+ padding: 0;
542
+ }
543
+ .theme-terminal .deck-layout-two-cols {
544
+ column-gap: 2em;
545
+ }
546
+ .theme-terminal .deck-layout-two-cols > :is(.deck-slot-default, .deck-slot-right) > :first-child {
547
+ margin-top: 0;
548
+ }
549
+ .theme-terminal .deck-layout-two-cols-header {
550
+ column-gap: 2em;
551
+ }
552
+ .theme-terminal .deck-layout-two-cols-header > .deck-slot-default {
553
+ padding-bottom: 0.4em;
554
+ margin-bottom: 0.3em;
555
+ border-bottom: 1px dashed var(--deck-border);
556
+ }
557
+ .theme-terminal .deck-layout-two-cols-header > :is(.deck-slot-left, .deck-slot-right) {
558
+ padding: 0.6em 0.9em;
559
+ border: 1px solid var(--deck-border);
560
+ border-radius: var(--deck-radius);
561
+ background: var(--deck-surface);
562
+ }
563
+ .theme-terminal .deck-layout-two-cols-header > :is(.deck-slot-left, .deck-slot-right) > :last-child {
564
+ margin-bottom: 0;
565
+ }
566
+ .theme-terminal .deck-layout-image .deck-layout-image-content {
567
+ background: linear-gradient(180deg, transparent, rgba(11, 14, 20, 0.85));
568
+ }
569
+ .theme-terminal :is(.deck-layout-image-left, .deck-layout-image-right) .deck-layout-image-content {
570
+ padding: calc(var(--deck-pad) * 0.9);
571
+ }
572
+ .theme-terminal .deck-layout-image-pane {
573
+ background-color: var(--deck-surface);
574
+ }
575
+ .theme-terminal :is(.deck-layout-iframe, .deck-layout-iframe-left, .deck-layout-iframe-right) .deck-frame.deck-layout-iframe-pane {
576
+ border-radius: var(--deck-radius);
577
+ border: 1px solid var(--deck-border);
578
+ border-top: 1.4em solid var(--terminal-window);
579
+ box-shadow: 0 20px 50px -28px rgba(0, 0, 0, 0.55);
580
+ }
581
+ .theme-terminal :is(.deck-layout-iframe-left, .deck-layout-iframe-right) .deck-layout-iframe-content {
582
+ padding-inline: calc(var(--deck-pad) * 0.4);
583
+ }
584
+
585
+ /* ── the theme's own layouts and components (index.tsx) ───────────────── */
586
+ /* code: the heading small, the code as tall as the slide allows, notes beside it */
587
+ .theme-terminal .deck-layout-code {
588
+ display: flex;
589
+ flex-direction: column;
590
+ }
591
+ .theme-terminal .deck-layout-code:has(> .deck-slot-side) {
592
+ display: grid;
593
+ grid-template-columns: minmax(0, 1fr) minmax(0, 0.42fr);
594
+ grid-template-rows: minmax(0, 1fr);
595
+ column-gap: 1.4em;
596
+ }
597
+ .theme-terminal .deck-layout-code > .deck-slot-default {
598
+ grid-column: 1;
599
+ grid-row: 1;
600
+ min-height: 0;
601
+ display: flex;
602
+ flex-direction: column;
603
+ }
604
+ .theme-terminal .deck-layout-code > .deck-slot-side {
605
+ grid-column: 2;
606
+ grid-row: 1;
607
+ align-self: center;
608
+ font-size: 0.8em;
609
+ color: var(--deck-muted);
610
+ }
611
+ .theme-terminal .deck-layout-code :is(h1, h2) {
612
+ font-size: 1.25em;
613
+ margin-bottom: 0.5em;
614
+ }
615
+ .theme-terminal .deck-layout-code :is(.deck-code-block, .shiki-magic-move-container) {
616
+ flex: 1 1 auto;
617
+ min-height: 0;
618
+ margin-bottom: 0;
619
+ }
620
+ .theme-terminal .deck-layout-code pre.deck-code {
621
+ font-size: 0.66em;
622
+ }
623
+ /* shell: the whole slide is a terminal window */
624
+ .theme-terminal .deck-layout-shell {
625
+ padding: 0;
626
+ }
627
+ .theme-terminal .terminal-window {
628
+ display: flex;
629
+ flex-direction: column;
630
+ min-height: 0;
631
+ height: 100%;
632
+ border: 1px solid var(--deck-border);
633
+ border-radius: 14px;
634
+ background: var(--deck-code-bg);
635
+ color: var(--deck-code-fg);
636
+ overflow: hidden;
637
+ box-shadow: 0 30px 80px -40px rgba(0, 0, 0, 0.6);
638
+ }
639
+ .theme-terminal .terminal-bar {
640
+ position: relative;
641
+ flex: none;
642
+ padding: 0.55em 1em;
643
+ text-align: center;
644
+ font: 500 0.5em var(--deck-mono-font);
645
+ color: var(--deck-muted);
646
+ background: var(--terminal-window);
647
+ border-bottom: 1px solid var(--deck-border);
648
+ }
649
+ .theme-terminal .terminal-bar::before {
650
+ content: "";
651
+ position: absolute;
652
+ left: 1.2em;
653
+ top: 50%;
654
+ width: 0.95em;
655
+ height: 0.95em;
656
+ margin-top: -0.475em;
657
+ border-radius: 50%;
658
+ background: #f07171;
659
+ box-shadow:
660
+ 1.5em 0 0 #f2ae49,
661
+ 3em 0 0 #86b300;
662
+ }
663
+ .theme-terminal .terminal-screen {
664
+ flex: 1 1 auto;
665
+ min-height: 0;
666
+ padding: 0.8em 1.1em;
667
+ overflow: hidden;
668
+ font: 0.72em/1.6 var(--deck-mono-font);
669
+ }
670
+ .theme-terminal .terminal-screen :is(h1, h2, h3) {
671
+ font-size: 1.2em;
672
+ }
673
+ .theme-terminal .terminal-screen .deck-code-block {
674
+ border: 0;
675
+ box-shadow: none;
676
+ background: transparent;
677
+ padding-top: 0;
678
+ }
679
+ .theme-terminal .terminal-screen .deck-code-block::before {
680
+ display: none;
681
+ }
682
+ .theme-terminal .terminal-screen pre.deck-code {
683
+ font-size: 0.9em;
684
+ }
685
+ .theme-terminal .terminal-screen pre.deck-code .line {
686
+ padding-inline: 0;
687
+ }
688
+ /* Terminal: a session, line by line */
689
+ .theme-terminal .terminal-window.is-inline {
690
+ height: auto;
691
+ margin: 0.5em 0;
692
+ border-radius: var(--deck-radius);
693
+ box-shadow: 0 20px 50px -28px rgba(0, 0, 0, 0.55);
694
+ }
695
+ .theme-terminal .terminal-lines {
696
+ margin: 0;
697
+ padding: 0.75em 1.1em 0.85em;
698
+ font: 0.6em/1.7 var(--deck-mono-font);
699
+ white-space: pre-wrap;
700
+ overflow-wrap: anywhere;
701
+ }
702
+ .theme-terminal .terminal-line {
703
+ display: block;
704
+ }
705
+ .theme-terminal .terminal-line.is-command {
706
+ color: var(--deck-fg);
707
+ }
708
+ .theme-terminal .terminal-prompt {
709
+ color: var(--deck-accent);
710
+ font-weight: 700;
711
+ user-select: none;
712
+ }
713
+ .theme-terminal .terminal-line.is-comment {
714
+ color: var(--deck-muted);
715
+ font-style: italic;
716
+ }
717
+ .theme-terminal .terminal-line.is-output {
718
+ color: var(--deck-code-fg);
719
+ opacity: 0.85;
720
+ }
721
+ .theme-terminal .terminal-line.is-error {
722
+ color: var(--terminal-red);
723
+ }
724
+ .theme-terminal .terminal-line.is-ok {
725
+ color: var(--terminal-green);
726
+ }
727
+
728
+ /* ── still copies and stillness ─────────────────────────────────────────── */
729
+ .theme-terminal .deck-print-page :is(.deck-code-block, .terminal-window, .deck-frame) {
730
+ box-shadow: none;
731
+ }
732
+ .theme-terminal .deck-print-page h1::after,
733
+ .theme-terminal .deck-slide:is(.is-print, .is-tile) h1::after {
734
+ animation: none;
735
+ }
736
+ @media print {
737
+ .theme-terminal :is(.deck-code-block, .terminal-window, .deck-frame) {
738
+ box-shadow: none;
739
+ }
740
+ .theme-terminal h1::after {
741
+ animation: none;
742
+ }
743
+ }
744
+ @media (prefers-reduced-motion: reduce) {
745
+ .theme-terminal :is(.deck-layout-cover, .deck-layout-end) h1::after {
746
+ animation: none;
747
+ }
748
+ }
749
+
750
+ /* centred: the built-in placement, in this theme's rhythm */
751
+ .theme-terminal .deck-layout-center > :is(h1, h2) {
752
+ margin-bottom: 0.3em;
753
+ }