presently 0.21.0 → 0.22.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.
@@ -4,16 +4,12 @@
4
4
  }
5
5
 
6
6
  :root {
7
- --slide-bg: #1a1a2e;
7
+ --slide-background: #1a1a2e;
8
8
  --slide-text: #eee;
9
9
  --accent: #e94560;
10
10
  --accent-light: #ff6b81;
11
11
  --surface: #16213e;
12
12
  --surface-light: #0f3460;
13
- --on-time: #2ed573;
14
- --behind: #ff4757;
15
- --ahead: #ffa502;
16
- --control-height: 2.25rem;
17
13
  --font-sans: "Inter", "Helvetica Neue", Arial, sans-serif;
18
14
  --font-mono: "JetBrains Mono", "Fira Code", monospace;
19
15
  }
@@ -29,782 +25,9 @@ html, body {
29
25
  }
30
26
 
31
27
  /* ========================
32
- SLIDE STYLES (shared)
28
+ SHARED INTERFACE COMPONENTS
33
29
  ======================== */
34
30
 
35
- .slide-viewport {
36
- position: relative;
37
- display: grid;
38
- place-items: center;
39
- overflow: hidden;
40
- container-type: size;
41
- }
42
-
43
- .slide-surface {
44
- width: 100%;
45
- height: 100%;
46
- display: grid;
47
- place-items: center;
48
- container-type: size;
49
- background: var(--slide-bg);
50
- }
51
-
52
- .slide {
53
- --slide-font-size: 2.2cqi;
54
- --slide-font-title: 1.8em;
55
- --slide-font-heading: 1.6em;
56
- --slide-font-statement: 1.5em;
57
- --slide-font-secondary: 0.8em;
58
- --slide-font-column: 0.84em;
59
- --slide-font-code: 0.75em;
60
- --slide-gutter: 3.333cqi;
61
- --slide-gap: 1.667cqi;
62
- --slide-radius: 0.417cqi;
63
-
64
- flex: none;
65
- width: 100cqw;
66
- height: auto;
67
- aspect-ratio: 16 / 9;
68
- container-type: size;
69
- }
70
-
71
- @container (min-aspect-ratio: 16 / 9) {
72
- .slide {
73
- width: auto;
74
- height: 100cqh;
75
- }
76
- }
77
-
78
- .slide-inner {
79
- position: relative;
80
- width: 100%;
81
- height: 100%;
82
- display: flex;
83
- flex-direction: column;
84
- align-items: center;
85
- justify-content: center;
86
- padding: var(--slide-gutter);
87
- font-size: var(--slide-font-size);
88
- line-height: 1.5;
89
- }
90
-
91
- .slide-header {
92
- flex: none;
93
- width: 100%;
94
- padding: 0;
95
- background: none;
96
- border: 0;
97
- margin-bottom: var(--slide-gap);
98
- }
99
-
100
- .slide-section-heading {
101
- margin-bottom: calc(var(--slide-gap) * 0.25);
102
- color: var(--accent-light);
103
- font-family: var(--font-mono);
104
- font-size: 0.45em;
105
- font-weight: 700;
106
- letter-spacing: 0.08em;
107
- text-transform: uppercase;
108
- }
109
-
110
- .slide-header > h1 {
111
- margin: 0;
112
- font-size: var(--slide-font-heading);
113
- line-height: 1.1;
114
- }
115
-
116
- /* Default template */
117
- .default-template .slide-body {
118
- width: 100%;
119
- }
120
-
121
- .default-template .slide-body ul,
122
- .default-template .slide-body ol {
123
- text-align: left;
124
- }
125
-
126
- .default-template .slide-body li {
127
- margin-bottom: 0.5em;
128
- transition: opacity 0.4s ease, transform 0.4s ease;
129
- }
130
-
131
- @starting-style {
132
- .default-template .slide-body li {
133
- opacity: 0;
134
- transform: translateX(-0.5em);
135
- }
136
- }
137
-
138
- /* Title template */
139
- .title-template {
140
- text-align: center;
141
- }
142
-
143
- .title-template .slide-header {
144
- margin-bottom: calc(var(--slide-gap) * 0.75);
145
- }
146
-
147
- .title-template .slide-header > h1 {
148
- font-size: var(--slide-font-title);
149
- }
150
-
151
- .title-template .slide-body {
152
- opacity: 0.7;
153
- }
154
-
155
- .title-template .slide-body p {
156
- margin: 0;
157
- }
158
-
159
- /* Section template */
160
- .slide-surface[data-template="section"] {
161
- background: linear-gradient(135deg, var(--accent), var(--surface-light));
162
- }
163
-
164
- .section-template {
165
- text-align: center;
166
- }
167
-
168
- .section-template .slide-header {
169
- margin-bottom: 0;
170
- }
171
-
172
- .section-template .slide-header > h1 {
173
- font-weight: 700;
174
- }
175
-
176
- .section-template .slide-body {
177
- margin-top: calc(var(--slide-gap) * 0.75);
178
- opacity: 0.7;
179
- }
180
-
181
- .section-template .slide-body p {
182
- margin: 0;
183
- }
184
-
185
- /* Two column template */
186
- .two-column-template {
187
- padding: calc(var(--slide-gutter) * 0.75) var(--slide-gutter);
188
- }
189
-
190
- .two-column-template .slide-columns {
191
- display: flex;
192
- align-items: center;
193
- flex: 1;
194
- width: 100%;
195
- gap: calc(var(--slide-gap) * 1.5);
196
- }
197
-
198
- .two-column-template > .slide-body {
199
- width: 100%;
200
- margin-bottom: var(--slide-gap);
201
- }
202
-
203
- .two-column-template > .slide-body > :first-child {
204
- margin-top: 0;
205
- }
206
-
207
- .two-column-template > .slide-body > :last-child {
208
- margin-bottom: 0;
209
- }
210
-
211
- .two-column-template .column {
212
- flex: 1;
213
- min-width: 0;
214
- font-size: var(--slide-font-column);
215
- line-height: 1.5;
216
- }
217
-
218
- .two-column-template .column ul {
219
- padding-left: 1.5em;
220
- }
221
-
222
- .two-column-template .column li {
223
- margin-bottom: 0.4em;
224
- }
225
-
226
- /* Diagram template */
227
- .diagram-template .slide-header {
228
- text-align: center;
229
- }
230
-
231
- .diagram-template .slide-body {
232
- display: grid;
233
- flex: 1;
234
- place-items: center;
235
- width: 100%;
236
- min-height: 0;
237
- }
238
-
239
- .diagram-template .diagram-freeform {
240
- position: relative;
241
- width: 100%;
242
- height: 100%;
243
- }
244
-
245
- .diagram-template .diagram-freeform > * {
246
- position: absolute;
247
- box-sizing: border-box;
248
- }
249
-
250
- /* Image template */
251
- .image-template .slide-caption {
252
- font-size: var(--slide-font-secondary);
253
- margin-bottom: var(--slide-gap);
254
- text-align: center;
255
- }
256
-
257
- .image-template .slide-image {
258
- display: grid;
259
- place-items: center;
260
- width: min(80cqi, 100%);
261
- max-height: 65cqb;
262
- text-align: center;
263
- }
264
-
265
- .image-template .slide-image :is(img, video, svg, iframe) {
266
- max-width: 100%;
267
- max-height: 65cqb;
268
- border-radius: var(--slide-radius);
269
- }
270
-
271
- /* Hide raw code blocks until syntax-js upgrades them */
272
- pre > code[class*="language-"] {
273
- opacity: 0;
274
- }
275
-
276
- pre > syntax-code {
277
- opacity: 1;
278
- transition: opacity 0.15s ease-in;
279
- }
280
-
281
- /* ========================
282
- HOME
283
- ======================== */
284
-
285
- .home {
286
- width: 100vw;
287
- height: 100vh;
288
- overflow: auto;
289
- display: flex;
290
- flex-direction: column;
291
- justify-content: center;
292
- padding: clamp(2rem, 8vw, 8rem);
293
- background:
294
- radial-gradient(circle at top left, color-mix(in srgb, var(--accent) 20%, transparent), transparent 35rem),
295
- var(--slide-bg);
296
- }
297
-
298
- .home-heading,
299
- .home-interfaces {
300
- width: min(72rem, 100%);
301
- margin-inline: auto;
302
- }
303
-
304
- .home-heading {
305
- margin-bottom: 3rem;
306
- }
307
-
308
- .home-kicker {
309
- margin: 0 0 0.75rem;
310
- color: var(--accent-light);
311
- font-size: 0.9rem;
312
- font-weight: 700;
313
- letter-spacing: 0.12em;
314
- text-transform: uppercase;
315
- }
316
-
317
- .home-heading h1 {
318
- margin: 0;
319
- font-size: clamp(2.5rem, 6vw, 5rem);
320
- line-height: 1;
321
- }
322
-
323
- .home-introduction {
324
- max-width: 48rem;
325
- margin: 1.25rem 0 0;
326
- font-size: clamp(1.1rem, 2vw, 1.4rem);
327
- line-height: 1.5;
328
- opacity: 0.72;
329
- }
330
-
331
- .home-interfaces {
332
- display: grid;
333
- grid-template-columns: repeat(2, minmax(0, 1fr));
334
- gap: 1rem;
335
- }
336
-
337
- .home-interface {
338
- display: flex;
339
- min-height: 10rem;
340
- flex-direction: column;
341
- justify-content: space-between;
342
- gap: 1.5rem;
343
- padding: 1.75rem;
344
- border: 1px solid rgba(255, 255, 255, 0.12);
345
- border-radius: 0.75rem;
346
- background: color-mix(in srgb, var(--surface) 82%, transparent);
347
- color: inherit;
348
- text-decoration: none;
349
- transition: border-color 150ms ease, transform 150ms ease, background 150ms ease;
350
- }
351
-
352
- .home-interface:hover,
353
- .home-interface:focus-visible {
354
- border-color: var(--accent-light);
355
- background: color-mix(in srgb, var(--surface-light) 85%, transparent);
356
- transform: translateY(-0.2rem);
357
- outline: none;
358
- }
359
-
360
- .home-interface strong {
361
- font-size: 1.4rem;
362
- }
363
-
364
- .home-interface span {
365
- line-height: 1.5;
366
- opacity: 0.7;
367
- }
368
-
369
- @media (max-width: 48rem) {
370
- .home {
371
- justify-content: flex-start;
372
- }
373
-
374
- .home-interfaces {
375
- grid-template-columns: 1fr;
376
- }
377
- }
378
-
379
- /* Statement template */
380
- .statement-template {
381
- text-align: center;
382
- gap: var(--slide-gap);
383
- }
384
-
385
- .statement-template .slide-statement {
386
- font-size: var(--slide-font-statement);
387
- font-weight: 600;
388
- line-height: 1.4;
389
- width: 100%;
390
- }
391
-
392
- .statement-template .slide-header {
393
- margin-bottom: 0;
394
- }
395
-
396
- .statement-template .slide-statement mermaid-diagram {
397
- font-weight: normal;
398
- }
399
-
400
- .statement-template .slide-statement p {
401
- margin: 0;
402
- }
403
-
404
- /* Shared translation style — works in any template */
405
- .slide-translation {
406
- font-size: var(--slide-font-secondary);
407
- opacity: 0.7;
408
- margin-top: calc(var(--slide-gap) * 0.5);
409
- }
410
-
411
- .slide-translation p {
412
- margin: 0;
413
- }
414
-
415
- /* Mermaid diagrams */
416
- mermaid-diagram {
417
- display: block;
418
- width: 100%;
419
- text-align: center;
420
- color: transparent;
421
- }
422
-
423
- /* Fullscreen template */
424
- .fill-template {
425
- padding: 0;
426
- }
427
-
428
- .fill-template .slide-header {
429
- position: absolute;
430
- top: var(--slide-gutter);
431
- left: var(--slide-gutter);
432
- z-index: 1;
433
- width: calc(100% - var(--slide-gutter) * 2);
434
- }
435
-
436
- .fill-template .slide-body {
437
- width: 100%;
438
- height: 100%;
439
- display: flex;
440
- align-items: center;
441
- justify-content: center;
442
- }
443
-
444
- .fill-template .slide-translation {
445
- position: absolute;
446
- bottom: var(--slide-gutter);
447
- left: var(--slide-gutter);
448
- z-index: 1;
449
- width: calc(100% - var(--slide-gutter) * 2);
450
- text-align: center;
451
- }
452
-
453
- .fill-template .slide-body img,
454
- .fill-template .slide-body iframe,
455
- .fill-template .slide-body svg,
456
- .fill-template .slide-body video {
457
- width: 100%;
458
- height: 100%;
459
- object-fit: contain;
460
- border: none;
461
- }
462
-
463
- /* Code template */
464
- .code-template {
465
- padding: var(--slide-gap) calc(var(--slide-gutter) * 0.75);
466
- align-items: stretch;
467
- }
468
-
469
- .code-template .slide-header {
470
- margin-bottom: calc(var(--slide-gap) * 0.5);
471
- }
472
-
473
- .code-template .slide-header > h1 {
474
- font-size: var(--slide-font-secondary);
475
- }
476
-
477
- .code-viewport {
478
- position: relative;
479
- flex: 1;
480
- overflow: hidden;
481
- border-radius: var(--slide-radius);
482
- background: rgba(0, 0, 0, 0.3);
483
- }
484
-
485
- .code-scroll {
486
- transition: transform 0.6s ease-in-out;
487
- padding: calc(var(--slide-gap) * 0.5);
488
- }
489
-
490
- .code-scroll pre {
491
- margin: 0;
492
- background: none;
493
- padding: 0;
494
- line-height: 1.5;
495
- font-size: var(--slide-font-code);
496
- }
497
-
498
- /* Dim overlays */
499
- .code-dim {
500
- position: absolute;
501
- left: 0;
502
- right: 0;
503
- pointer-events: none;
504
- transition: all 0.6s ease-in-out;
505
- z-index: 1;
506
- }
507
-
508
- .code-dim-top {
509
- top: 0;
510
- height: 0;
511
- background: rgba(0, 0, 0, 0.7);
512
- }
513
-
514
- .code-dim-bottom {
515
- bottom: 0;
516
- height: 0;
517
- background: rgba(0, 0, 0, 0.7);
518
- }
519
-
520
- /* ========================
521
- DISPLAY VIEW (audience)
522
- ======================== */
523
-
524
- .display {
525
- width: 100vw;
526
- height: 100vh;
527
- background: var(--slide-bg);
528
- position: relative;
529
- outline: none;
530
- }
531
-
532
- .display .slide-container {
533
- width: 100%;
534
- height: 100%;
535
- position: relative;
536
- }
537
-
538
- .display .slide-counter {
539
- position: absolute;
540
- bottom: 1rem;
541
- right: 1.5rem;
542
- font-size: 0.9rem;
543
- opacity: 0.4;
544
- }
545
-
546
- /* ========================
547
- VIEW TRANSITIONS
548
- ======================== */
549
-
550
- /* Give the live-view element the transition name — there's only ever one */
551
- live-view:has(.display) {
552
- view-transition-name: slide-container;
553
- }
554
-
555
- .playback-stage {
556
- view-transition-name: slide-container;
557
- }
558
-
559
- /* Default: no animation for the container (instant swap) */
560
- ::view-transition-old(slide-container),
561
- ::view-transition-new(slide-container) {
562
- animation: none;
563
- }
564
-
565
- /* Fade */
566
- html[data-transition="fade"]::view-transition-old(slide-container) {
567
- animation: vt-fade-out 0.4s ease-in-out both;
568
- z-index: 1;
569
- }
570
-
571
- /* Slide left */
572
- html[data-transition="slide-left"]::view-transition-old(slide-container) {
573
- animation: vt-slide-out-left 0.4s ease-in-out both;
574
- }
575
-
576
- html[data-transition="slide-left"]::view-transition-new(slide-container) {
577
- animation: vt-slide-in-right 0.4s ease-in-out both;
578
- }
579
-
580
- /* Slide right */
581
- html[data-transition="slide-right"]::view-transition-old(slide-container) {
582
- animation: vt-slide-out-right 0.4s ease-in-out both;
583
- }
584
-
585
- html[data-transition="slide-right"]::view-transition-new(slide-container) {
586
- animation: vt-slide-in-left 0.4s ease-in-out both;
587
- }
588
-
589
- /* ========================
590
- PLAYBACK
591
- ======================== */
592
-
593
- body.playback,
594
- .playback-stage,
595
- .playback-frame {
596
- width: 100vw;
597
- height: 100vh;
598
- }
599
-
600
- .playback-stage {
601
- position: relative;
602
- background: var(--slide-bg);
603
- }
604
-
605
- .playback-frame {
606
- position: absolute;
607
- inset: 0;
608
- }
609
-
610
- .playback-start-screen {
611
- position: fixed;
612
- inset: 0;
613
- z-index: 100;
614
- display: flex;
615
- flex-direction: column;
616
- align-items: center;
617
- justify-content: center;
618
- gap: 1rem;
619
- background: rgba(5, 8, 20, 0.88);
620
- backdrop-filter: blur(12px);
621
- }
622
-
623
- .playback-start-screen[hidden] {
624
- display: none;
625
- }
626
-
627
- .playback-start {
628
- padding: 0.9rem 1.4rem;
629
- border: 1px solid rgba(255, 255, 255, 0.2);
630
- border-radius: 0.6rem;
631
- background: var(--accent);
632
- color: white;
633
- font: inherit;
634
- font-size: 1.1rem;
635
- cursor: pointer;
636
- }
637
-
638
- .playback-start:disabled {
639
- opacity: 0.5;
640
- cursor: default;
641
- }
642
-
643
- .playback-status {
644
- margin: 0;
645
- opacity: 0.75;
646
- }
647
-
648
- .playback-status.error {
649
- color: var(--behind);
650
- opacity: 1;
651
- }
652
-
653
- .playback-controls {
654
- position: fixed;
655
- left: 50%;
656
- bottom: 1.25rem;
657
- z-index: 90;
658
- display: flex;
659
- align-items: center;
660
- gap: 0.5rem;
661
- padding: 0.5rem 0.7rem;
662
- transform: translateX(-50%);
663
- border: 1px solid rgba(255, 255, 255, 0.12);
664
- border-radius: 0.7rem;
665
- background: rgba(5, 8, 20, 0.72);
666
- backdrop-filter: blur(8px);
667
- opacity: 0.2;
668
- transition: opacity 160ms ease;
669
- }
670
-
671
- .playback-controls:hover,
672
- .playback-controls:focus-within {
673
- opacity: 1;
674
- }
675
-
676
- body.playback[data-controls="false"] .playback-controls {
677
- display: none;
678
- }
679
-
680
- body.playback[data-controls="false"] .playback-start-screen {
681
- display: none;
682
- }
683
-
684
- .playback-controls button {
685
- min-width: 2.4rem;
686
- height: 2.2rem;
687
- border: 0;
688
- border-radius: 0.35rem;
689
- background: rgba(255, 255, 255, 0.1);
690
- color: white;
691
- cursor: pointer;
692
- }
693
-
694
- .playback-controls button:disabled {
695
- opacity: 0.3;
696
- cursor: default;
697
- }
698
-
699
- .playback-counter {
700
- min-width: 4rem;
701
- text-align: center;
702
- font-variant-numeric: tabular-nums;
703
- }
704
-
705
- @keyframes vt-fade-out {
706
- from { opacity: 1; }
707
- to { opacity: 0; }
708
- }
709
-
710
- @keyframes vt-fade-in {
711
- from { opacity: 0; }
712
- to { opacity: 1; }
713
- }
714
-
715
- @keyframes vt-slide-out-left {
716
- from { transform: translateX(0); opacity: 1; }
717
- to { transform: translateX(-100%); opacity: 0; }
718
- }
719
-
720
- @keyframes vt-slide-in-right {
721
- from { transform: translateX(100%); opacity: 0; }
722
- to { transform: translateX(0); opacity: 1; }
723
- }
724
-
725
- @keyframes vt-slide-out-right {
726
- from { transform: translateX(0); opacity: 1; }
727
- to { transform: translateX(100%); opacity: 0; }
728
- }
729
-
730
- @keyframes vt-slide-in-left {
731
- from { transform: translateX(-100%); opacity: 0; }
732
- to { transform: translateX(0); opacity: 1; }
733
- }
734
-
735
- /* ========================
736
- BUILD EFFECTS
737
- ======================== */
738
-
739
- /* Fade */
740
- .build-fade {
741
- animation: vt-fade-in 0.4s ease;
742
- }
743
-
744
- /* Fly in from left */
745
- @keyframes build-fly-in-left {
746
- from { transform: translateX(-2rem); opacity: 0; }
747
- to { transform: translateX(0); opacity: 1; }
748
- }
749
-
750
- .build-fly-left {
751
- animation: build-fly-in-left 0.4s ease;
752
- }
753
-
754
- /* Fly in from right */
755
- @keyframes build-fly-in-right {
756
- from { transform: translateX(2rem); opacity: 0; }
757
- to { transform: translateX(0); opacity: 1; }
758
- }
759
-
760
- .build-fly-right {
761
- animation: build-fly-in-right 0.4s ease;
762
- }
763
-
764
- /* Fly in from bottom */
765
- @keyframes build-fly-in-up {
766
- from { transform: translateY(2rem); opacity: 0; }
767
- to { transform: translateY(0); opacity: 1; }
768
- }
769
-
770
- .build-fly-up {
771
- animation: build-fly-in-up 0.4s ease;
772
- }
773
-
774
- /* Fly in from top */
775
- @keyframes build-fly-in-down {
776
- from { transform: translateY(-2rem); opacity: 0; }
777
- to { transform: translateY(0); opacity: 1; }
778
- }
779
-
780
- .build-fly-down {
781
- animation: build-fly-in-down 0.4s ease;
782
- }
783
-
784
- /* Scale in */
785
- @keyframes build-scale-in {
786
- from { transform: scale(0.8); opacity: 0; }
787
- to { transform: scale(1); opacity: 1; }
788
- }
789
-
790
- .build-scale {
791
- animation: build-scale-in 0.4s ease;
792
- }
793
-
794
- /* ========================
795
- PRESENTER VIEW
796
- ======================== */
797
-
798
- .presenter {
799
- width: 100vw;
800
- height: 100vh;
801
- display: grid;
802
- grid-template-rows: auto 1fr auto auto;
803
- background: #0d0d1a;
804
- gap: 0.5rem;
805
- padding: 0.5rem;
806
- }
807
-
808
31
  /* Controls */
809
32
  .toolbar {
810
33
  display: flex;
@@ -816,7 +39,7 @@ body.playback[data-controls="false"] .playback-start-screen {
816
39
  .toolbar > button,
817
40
  .toolbar > select,
818
41
  .toolbar > .slide-info {
819
- height: var(--control-height);
42
+ height: 2.25rem;
820
43
  background: var(--surface-light);
821
44
  border: 1px solid rgba(255,255,255,0.1);
822
45
  border-radius: 6px;
@@ -921,130 +144,6 @@ body.playback[data-controls="false"] .playback-start-screen {
921
144
  opacity: 1;
922
145
  }
923
146
 
924
- /* Slide previews */
925
- .previews {
926
- display: grid;
927
- grid-template-columns: 1fr 1fr;
928
- gap: 0.5rem;
929
- min-height: 0;
930
- }
931
-
932
- .preview {
933
- display: flex;
934
- flex-direction: column;
935
- min-height: 0;
936
- }
937
-
938
- .preview h3 {
939
- margin: 0 0 0.3rem 0;
940
- font-size: 0.85rem;
941
- text-transform: uppercase;
942
- letter-spacing: 0.05em;
943
- opacity: 0.6;
944
- }
945
-
946
- .preview-frame {
947
- flex: 1;
948
- background: var(--slide-bg);
949
- border-radius: 8px;
950
- overflow: hidden;
951
- position: relative;
952
- min-height: 0;
953
- }
954
-
955
- .preview-frame .no-slide {
956
- display: flex;
957
- align-items: center;
958
- justify-content: center;
959
- height: 100%;
960
- opacity: 0.4;
961
- font-size: 1.2rem;
962
- }
963
-
964
- .current-preview .preview-frame {
965
- border: 2px solid var(--accent);
966
- }
967
-
968
- /* Timing */
969
- .timing {
970
- background: linear-gradient(
971
- to right,
972
- rgba(233, 69, 96, 0.25) var(--slide-progress, 0%),
973
- var(--surface) var(--slide-progress, 0%)
974
- );
975
- border-radius: 8px;
976
- padding: 0.5rem 1rem;
977
- transition: background 1s linear;
978
- }
979
-
980
- .timing-info {
981
- font-size: 1rem;
982
- }
983
-
984
- .timing-info.on-time .pacing-indicator {
985
- color: var(--on-time);
986
- }
987
-
988
- .timing-info.behind .pacing-indicator {
989
- color: var(--behind);
990
- font-weight: 700;
991
- animation: pulse 1s infinite;
992
- }
993
-
994
- .timing-info.ahead .pacing-indicator {
995
- color: var(--ahead);
996
- }
997
-
998
- @keyframes pulse {
999
- 0%, 100% { opacity: 1; }
1000
- 50% { opacity: 0.5; }
1001
- }
1002
-
1003
- .timing-info .pause-button {
1004
- color: var(--slide-text);
1005
- padding: 0.3rem 0.75rem;
1006
- cursor: pointer;
1007
- font-size: 0.9rem;
1008
- font-family: var(--font-sans);
1009
- transition: background 0.2s;
1010
- line-height: 1;
1011
- min-width: 6rem;
1012
- }
1013
-
1014
- .timing-info .pause-button:hover {
1015
- background: var(--accent);
1016
- }
1017
-
1018
- .timing-info .elapsed {
1019
- font-variant-numeric: tabular-nums;
1020
- }
1021
-
1022
- .timing-info .remaining {
1023
- font-variant-numeric: tabular-nums;
1024
- }
1025
-
1026
- .timing-info .slide-duration {
1027
- opacity: 0.6;
1028
- margin-left: auto;
1029
- }
1030
-
1031
- .timing-info .speaker-info {
1032
- display: flex;
1033
- align-items: center;
1034
- gap: 0.25rem;
1035
- font-size: 0.9rem;
1036
- background: rgba(255, 255, 255, 0.08);
1037
- border: 1px solid rgba(255, 255, 255, 0.12);
1038
- border-radius: 6px;
1039
- padding: 0.2rem 0.6rem;
1040
- white-space: nowrap;
1041
- }
1042
-
1043
- .timing-info .next-speaker {
1044
- opacity: 0.6;
1045
- font-style: italic;
1046
- }
1047
-
1048
147
  /* Notes */
1049
148
  .notes {
1050
149
  background: var(--surface);
@@ -1073,7 +172,7 @@ body.playback[data-controls="false"] .playback-start-screen {
1073
172
  }
1074
173
 
1075
174
  .notes-content em {
1076
- color: var(--ahead);
175
+ color: #ffa502;
1077
176
  }
1078
177
 
1079
178
  .notes .no-notes {
@@ -1081,168 +180,6 @@ body.playback[data-controls="false"] .playback-start-screen {
1081
180
  font-style: italic;
1082
181
  }
1083
182
 
1084
- /* ========================
1085
- RECORDING VIEW
1086
- ======================== */
1087
-
1088
- .recorder {
1089
- width: 100vw;
1090
- height: 100vh;
1091
- display: grid;
1092
- grid-template-rows: auto 1fr;
1093
- gap: 0.75rem;
1094
- padding: 0.75rem;
1095
- background: #0d0d1a;
1096
- }
1097
-
1098
- .recording-workspace {
1099
- display: grid;
1100
- grid-template-columns: minmax(0, 2fr) minmax(20rem, 1fr);
1101
- gap: 0.75rem;
1102
- min-height: 0;
1103
- }
1104
-
1105
- .recording-preview {
1106
- position: relative;
1107
- min-height: 0;
1108
- overflow: hidden;
1109
- background: var(--slide-bg);
1110
- border: 2px solid var(--accent);
1111
- border-radius: 8px;
1112
- }
1113
-
1114
- .recording-sidebar {
1115
- display: grid;
1116
- grid-template-rows: auto 1fr;
1117
- gap: 0.75rem;
1118
- min-height: 0;
1119
- }
1120
-
1121
- .recording-panel,
1122
- .recording-notes {
1123
- padding: 1rem;
1124
- background: var(--surface);
1125
- border-radius: 8px;
1126
- }
1127
-
1128
- .recording-panel h2,
1129
- .recording-notes h2 {
1130
- margin: 0 0 0.5rem;
1131
- font-size: 1rem;
1132
- letter-spacing: 0.05em;
1133
- text-transform: uppercase;
1134
- }
1135
-
1136
- .recording-panel > p {
1137
- margin: 0 0 1rem;
1138
- opacity: 0.65;
1139
- }
1140
-
1141
- presently-recorder {
1142
- display: grid;
1143
- gap: 1rem;
1144
- }
1145
-
1146
- .recording-actions {
1147
- display: flex;
1148
- align-items: center;
1149
- gap: 0.6rem;
1150
- }
1151
-
1152
- .recording-actions button {
1153
- padding: 0.55rem 0.9rem;
1154
- background: var(--surface-light);
1155
- border: 1px solid rgba(255,255,255,0.12);
1156
- border-radius: 6px;
1157
- color: var(--slide-text);
1158
- cursor: pointer;
1159
- font: inherit;
1160
- }
1161
-
1162
- .recording-actions button:hover:not(:disabled) {
1163
- background: var(--accent);
1164
- }
1165
-
1166
- .recording-actions button:disabled {
1167
- cursor: default;
1168
- opacity: 0.35;
1169
- }
1170
-
1171
- .recording-toggle:not(:disabled) {
1172
- color: var(--accent-light);
1173
- }
1174
-
1175
- presently-recorder[data-state="recording"] .recording-toggle {
1176
- color: #ef5350;
1177
- }
1178
-
1179
- .recording-indicator {
1180
- width: 0.65rem;
1181
- height: 0.65rem;
1182
- margin-left: auto;
1183
- background: rgba(255,255,255,0.2);
1184
- border-radius: 50%;
1185
- }
1186
-
1187
- presently-recorder[data-state="preparing"] .recording-indicator,
1188
- presently-recorder[data-state="starting"] .recording-indicator {
1189
- background: #f5b942;
1190
- box-shadow: 0 0 0 0.25rem rgba(245,185,66,0.15);
1191
- animation: recording-indicator-pulse 600ms ease-in-out infinite alternate;
1192
- }
1193
-
1194
- presently-recorder[data-state="recording"] .recording-indicator {
1195
- background: #ef5350;
1196
- box-shadow: 0 0 0 0.25rem rgba(239,83,80,0.15);
1197
- }
1198
-
1199
- @keyframes recording-indicator-pulse {
1200
- to {
1201
- opacity: 0.45;
1202
- transform: scale(0.8);
1203
- }
1204
- }
1205
-
1206
- .recording-time {
1207
- font-family: var(--font-mono);
1208
- font-variant-numeric: tabular-nums;
1209
- }
1210
-
1211
- .recording-playback {
1212
- width: 100%;
1213
- }
1214
-
1215
- .recording-status {
1216
- min-height: 1.4em;
1217
- margin: 0;
1218
- font-size: 0.9rem;
1219
- opacity: 0.7;
1220
- }
1221
-
1222
- .recording-status.error {
1223
- color: var(--behind);
1224
- opacity: 1;
1225
- }
1226
-
1227
- .recording-notes {
1228
- min-height: 0;
1229
- overflow-y: auto;
1230
- font-size: 1.05rem;
1231
- line-height: 1.5;
1232
- }
1233
-
1234
- .recording-notes p {
1235
- margin: 0.4em 0;
1236
- }
1237
-
1238
- @media (max-width: 900px) {
1239
- .recording-workspace {
1240
- grid-template-columns: 1fr;
1241
- grid-template-rows: minmax(20rem, 1fr) auto;
1242
- overflow-y: auto;
1243
- }
1244
- }
1245
-
1246
183
  /* ========================
1247
184
  GLOBAL TYPOGRAPHY
1248
185
  ======================== */
@@ -1270,117 +207,3 @@ pre code {
1270
207
  background: none;
1271
208
  padding: 0;
1272
209
  }
1273
-
1274
- /* ========================
1275
- EXPORT PAGE LAYOUT
1276
- ======================== */
1277
-
1278
- /* Allow multi-page layout — overrides the default full-viewport body. */
1279
- body.export {
1280
- height: auto;
1281
- overflow: visible;
1282
- }
1283
-
1284
- /*
1285
- * Each export-page div maps to one printed page.
1286
- * Dimensions are set via inline styles from Export::PageSize so they can
1287
- * be configured at export time. CSS just handles layout and overflow.
1288
- */
1289
- .export-page {
1290
- position: relative;
1291
- overflow: hidden;
1292
- break-after: page;
1293
- page-break-after: always;
1294
- }
1295
-
1296
- .export-slide-area {
1297
- position: relative;
1298
- overflow: hidden;
1299
- }
1300
-
1301
- /* Notes panel below the slide. */
1302
- .export-notes-area {
1303
- padding: 0.5rem 2rem 0.5rem;
1304
- background: #0d0d1f;
1305
- border-top: 2px solid var(--accent);
1306
- display: flex;
1307
- flex-direction: column;
1308
- gap: 0.4rem;
1309
- overflow: hidden;
1310
- box-sizing: border-box;
1311
- }
1312
-
1313
- /* Meta strip — mirrors the timing bar in the presenter view. */
1314
- .export-meta {
1315
- display: flex;
1316
- align-items: center;
1317
- gap: 1.5rem;
1318
- flex-shrink: 0;
1319
- font-size: 0.75rem;
1320
- opacity: 0.75;
1321
- font-family: var(--font-sans);
1322
- }
1323
-
1324
- .export-slide-number {
1325
- font-weight: 600;
1326
- }
1327
-
1328
- .export-filename code {
1329
- font-family: var(--font-mono);
1330
- background: rgba(255,255,255,0.08);
1331
- padding: 0.1em 0.35em;
1332
- border-radius: 3px;
1333
- font-size: 0.9em;
1334
- }
1335
-
1336
- .export-elapsed,
1337
- .export-duration {
1338
- opacity: 0.85;
1339
- }
1340
-
1341
- .export-speaker {
1342
- margin-left: auto;
1343
- font-size: 0.8rem;
1344
- opacity: 0.9;
1345
- }
1346
-
1347
- /* Notes panel — reuses .notes / .notes-content from the presenter view,
1348
- but overrides sizing to fit the compact export area. */
1349
- .export-notes-area .notes {
1350
- min-height: unset;
1351
- max-height: unset;
1352
- padding: 0;
1353
- background: none;
1354
- border-radius: 0;
1355
- flex: 1;
1356
- overflow: hidden;
1357
- }
1358
-
1359
- /* ========================
1360
- PRINT MEDIA
1361
- ======================== */
1362
-
1363
- @media print {
1364
- /* Allow full-document layout. */
1365
- html, body {
1366
- height: auto !important;
1367
- overflow: visible !important;
1368
- }
1369
-
1370
- /* Ensure backgrounds (dark theme) are included in the PDF. */
1371
- html {
1372
- -webkit-print-color-adjust: exact;
1373
- print-color-adjust: exact;
1374
- }
1375
-
1376
- /* Each export-page is one printed page. */
1377
- .export-page {
1378
- break-after: page;
1379
- page-break-after: always;
1380
- }
1381
-
1382
- /* Strip the Live element wrapper chrome from the presenter view if somehow printed. */
1383
- live-view {
1384
- display: contents;
1385
- }
1386
- }