@lincyaw/viewer 0.0.0-stage → 1.0.0-rc.1

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 (54) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +31 -2
  3. package/package.json +65 -3
  4. package/src/client/block.ts +70 -0
  5. package/src/client/code/code-block.ts +54 -0
  6. package/src/client/code/code-editor.ts +73 -0
  7. package/src/client/code/code-view.ts +22 -0
  8. package/src/client/code/highlight.ts +73 -0
  9. package/src/client/code/outputs.ts +84 -0
  10. package/src/client/content-marks.ts +15 -0
  11. package/src/client/element.ts +27 -0
  12. package/src/client/env.d.ts +3 -0
  13. package/src/client/index.ts +40 -0
  14. package/src/client/layout.ts +22 -0
  15. package/src/client/markdown/handlers.ts +161 -0
  16. package/src/client/markdown/hast.ts +20 -0
  17. package/src/client/markdown/layout-handlers.ts +57 -0
  18. package/src/client/markdown/math.ts +10 -0
  19. package/src/client/markdown/mermaid.ts +75 -0
  20. package/src/client/markdown/render.ts +79 -0
  21. package/src/client/markdown/role-mark.ts +9 -0
  22. package/src/client/markdown/tables.ts +49 -0
  23. package/src/client/markdown/tabs.ts +52 -0
  24. package/src/client/markdown/tree-cache.ts +77 -0
  25. package/src/client/operations.ts +9 -0
  26. package/src/client/registry.ts +21 -0
  27. package/src/client/section-context.ts +5 -0
  28. package/src/client/section.ts +30 -0
  29. package/src/client/slidev-compat/click-directives.ts +16 -0
  30. package/src/client/slidev-compat/slide-globals.ts +3 -0
  31. package/src/client/style.css +1058 -0
  32. package/src/client/viewer-messages.ts +7 -0
  33. package/src/client/viewer-plugins.ts +35 -0
  34. package/src/client/viewer-state.ts +47 -0
  35. package/src/client/views/actions.ts +52 -0
  36. package/src/client/views/controls.css +44 -0
  37. package/src/client/views/document.ts +12 -0
  38. package/src/client/views/outlets.ts +37 -0
  39. package/src/client/views/overlay.ts +16 -0
  40. package/src/client/views/present.ts +132 -0
  41. package/src/client/views/presenter.ts +76 -0
  42. package/src/client/views/scrolly.ts +4 -0
  43. package/src/client/views/slide.css +8 -0
  44. package/src/client/views/slide.ts +57 -0
  45. package/src/domain/clicks.ts +38 -0
  46. package/src/domain/code-width.ts +11 -0
  47. package/src/domain/document-content.ts +6 -0
  48. package/src/domain/footnotes.ts +15 -0
  49. package/src/domain/index.ts +22 -0
  50. package/src/domain/live.ts +44 -0
  51. package/src/domain/messages.ts +139 -0
  52. package/src/domain/origin.ts +78 -0
  53. package/src/domain/outputs.ts +27 -0
  54. package/src/domain/steps.ts +46 -0
@@ -0,0 +1,1058 @@
1
+ @import './views/controls.css';
2
+
3
+ :root {
4
+ --pm-c-bg: var(--pm-color-bg);
5
+ --pm-c-bg-soft: var(--pm-color-sunk);
6
+ --pm-c-text: var(--pm-color-ink);
7
+ --pm-c-text-2: var(--pm-color-muted);
8
+ --pm-c-border: var(--pm-color-line);
9
+ --pm-c-brand: var(--pm-color-accent);
10
+ --pm-c-danger: var(--pm-color-danger);
11
+ --pm-c-warning: var(--pm-color-warn);
12
+ --pm-code-bg: var(--pm-color-code);
13
+ --pm-line-highlight: var(--pm-color-selected);
14
+ --pm-board-bg: color-mix(in srgb, var(--pm-c-brand) 4%, var(--pm-c-bg));
15
+ --pm-board-border: var(--pm-c-border);
16
+ --pm-scroll-shadow: color-mix(in srgb, var(--pm-color-shadow) 18%, transparent);
17
+ }
18
+
19
+ .dark {
20
+ --pm-scroll-shadow: color-mix(in srgb, var(--pm-color-sheen) 16%, transparent);
21
+ }
22
+
23
+ .pm-hidden,
24
+ [data-pm-click='hidden'] {
25
+ visibility: hidden;
26
+ opacity: 0;
27
+ }
28
+
29
+ .pm-block,
30
+ .pm-block li,
31
+ [data-pm-click] {
32
+ transition: opacity var(--pm-duration-slow) var(--pm-ease);
33
+ }
34
+
35
+ @media (prefers-reduced-motion: reduce) {
36
+ .pm-block,
37
+ .pm-block li,
38
+ [data-pm-click] {
39
+ transition: none;
40
+ }
41
+ }
42
+
43
+ .pm-v-click {
44
+ display: contents;
45
+ }
46
+
47
+ .pm-section {
48
+ position: relative;
49
+ min-width: 0;
50
+ margin-top: 2.5rem;
51
+ }
52
+
53
+ .pm-section:first-child {
54
+ margin-top: 0;
55
+ }
56
+
57
+ .pm-section__body,
58
+ .pm-stage,
59
+ .pm-track,
60
+ .pm-block {
61
+ min-width: 0;
62
+ max-width: 100%;
63
+ }
64
+
65
+ .pm-block {
66
+ overflow-x: auto;
67
+ }
68
+
69
+ .pm-block :where(img, video, iframe, canvas, svg) {
70
+ max-width: 100%;
71
+ height: auto;
72
+ }
73
+
74
+ .pm-section__source {
75
+ margin: 0.25rem 0 0;
76
+ font-size: 0.8125em;
77
+ }
78
+
79
+ .pm-section__source button {
80
+ padding: 0;
81
+ color: var(--pm-c-text-2);
82
+ text-decoration: underline dotted;
83
+ cursor: pointer;
84
+ }
85
+
86
+ .pm-section__source button:hover {
87
+ color: var(--pm-c-brand);
88
+ }
89
+
90
+ .pm-diagnostics {
91
+ margin: 0.5rem 0;
92
+ padding: 0.5rem 0.75rem 0.5rem 1.75rem;
93
+ border: var(--pm-size-hairline) solid var(--pm-c-danger);
94
+ border-radius: 0.25rem;
95
+ color: var(--pm-c-danger);
96
+ font-size: 0.875em;
97
+ }
98
+
99
+ .pm-board {
100
+ margin: 1.25rem 0;
101
+ padding: 0.75rem 1.25rem;
102
+ border: var(--pm-size-hairline) solid var(--pm-board-border);
103
+ border-left: calc(var(--pm-size-stroke) * 2) solid var(--pm-c-brand);
104
+ border-radius: 0.5rem;
105
+ background: var(--pm-board-bg);
106
+ }
107
+
108
+ .pm-board > :first-child > :first-child {
109
+ margin-top: 0;
110
+ }
111
+
112
+ .pm-block--overlay {
113
+ overflow: visible;
114
+ }
115
+
116
+ .pm-board > :last-child > :last-child {
117
+ margin-bottom: 0;
118
+ }
119
+
120
+ .pm-board .pm-block strong {
121
+ font-weight: 700;
122
+ color: var(--pm-c-text);
123
+ }
124
+
125
+ .pm-section--scrolly {
126
+ display: grid;
127
+ grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
128
+ column-gap: 1.5rem;
129
+ align-items: start;
130
+ }
131
+
132
+ .pm-section--scrolly > :not(.pm-stage, .pm-track) {
133
+ grid-column: 1 / -1;
134
+ }
135
+
136
+ .pm-section--scrolly > .pm-stage {
137
+ position: sticky;
138
+ top: calc(var(--pm-sticky-top, 0rem) + 1rem);
139
+ margin: 0;
140
+ padding: 0.75rem;
141
+ container-type: inline-size;
142
+ }
143
+
144
+ .pm-section--scrolly > .pm-track {
145
+ padding-bottom: 30vh;
146
+ }
147
+
148
+ .pm-step {
149
+ min-height: 45vh;
150
+ padding-left: 0.75rem;
151
+ border-left: var(--pm-size-stroke) solid var(--pm-c-border);
152
+ }
153
+
154
+ .pm-step--current {
155
+ border-left-color: var(--pm-c-brand);
156
+ }
157
+
158
+ .pm-step--bare {
159
+ min-height: 25vh;
160
+ }
161
+
162
+ .pm-section--scrolly > .pm-track .pm-block--narration.pm-hidden {
163
+ visibility: visible;
164
+ opacity: 0.35;
165
+ }
166
+
167
+ @media (max-width: 767px) {
168
+ .pm-section--scrolly {
169
+ grid-template-columns: minmax(0, 1fr);
170
+ }
171
+
172
+ .pm-section--scrolly > .pm-stage {
173
+ top: var(--pm-sticky-top, 0rem);
174
+ z-index: 1;
175
+ max-height: 50vh;
176
+ overflow-y: auto;
177
+ }
178
+ }
179
+
180
+ .pm-code-block {
181
+ margin: 1rem 0;
182
+ }
183
+
184
+ .pm-code-origin {
185
+ display: flex;
186
+ flex-wrap: wrap;
187
+ gap: 0.5rem;
188
+ align-items: baseline;
189
+ font-size: 0.8em;
190
+ color: var(--pm-c-text-2);
191
+ }
192
+
193
+ .pm-code-origin__file,
194
+ .pm-code-origin__commit,
195
+ .pm-code-origin__variant {
196
+ font-family: var(--pm-font-mono);
197
+ overflow-wrap: anywhere;
198
+ }
199
+
200
+ .pm-code-origin__variant[data-active] {
201
+ font-weight: 700;
202
+ text-decoration: underline;
203
+ }
204
+
205
+ .pm-code-origin__badge {
206
+ padding: 0 0.4em;
207
+ border-radius: 0.25rem;
208
+ border: var(--pm-size-hairline) solid currentColor;
209
+ color: var(--pm-c-warning);
210
+ }
211
+
212
+ .pm-code-origin__badge[data-drift='synced'] {
213
+ color: var(--pm-c-text-2);
214
+ }
215
+
216
+ .pm-code-block__run {
217
+ display: flex;
218
+ gap: var(--pm-space-1);
219
+ align-items: center;
220
+ }
221
+
222
+ .pm-code-block__hint {
223
+ color: var(--pm-c-danger);
224
+ }
225
+
226
+ .pm-code-block__label {
227
+ margin: 0.5rem 0 0;
228
+ font-size: 0.8em;
229
+ color: var(--pm-c-text-2);
230
+ }
231
+
232
+ .pm-code pre {
233
+ --pm-code-pad: 1rem;
234
+ margin: 0.5rem 0;
235
+ padding: 0.75rem var(--pm-code-pad);
236
+ overflow-x: auto;
237
+ border-radius: 0.375rem;
238
+ background:
239
+ linear-gradient(to right, var(--pm-code-bg) 40%, transparent) left / 1.5rem 100% no-repeat local,
240
+ linear-gradient(to left, var(--pm-code-bg) 40%, transparent) right / 1.5rem 100% no-repeat local,
241
+ radial-gradient(farthest-side at 0 50%, var(--pm-scroll-shadow), transparent) left / 0.75rem 100% no-repeat scroll,
242
+ radial-gradient(farthest-side at 100% 50%, var(--pm-scroll-shadow), transparent) right / 0.75rem 100% no-repeat scroll,
243
+ var(--pm-code-bg);
244
+ font-size: 0.875em;
245
+ line-height: 1.6;
246
+ }
247
+
248
+ .pm-stage .pm-code pre {
249
+ --pm-code-pad: 0.75rem;
250
+ font-size: clamp(0.65rem, (100cqi - 2 * var(--pm-code-pad) - var(--pm-size-stroke)) / (var(--pm-code-columns, 40) * 0.62), 0.875rem);
251
+ }
252
+
253
+ .pm-view table {
254
+ display: block;
255
+ max-width: 100%;
256
+ overflow-x: auto;
257
+ }
258
+
259
+ .pm-view :is(th, td) code {
260
+ white-space: pre;
261
+ }
262
+
263
+ .pm-view th {
264
+ white-space: nowrap;
265
+ }
266
+
267
+ .pm-stage table {
268
+ font-size: 0.875em;
269
+ }
270
+
271
+ .pm-stage :is(th, td) {
272
+ white-space: nowrap;
273
+ }
274
+
275
+ .pm-code code {
276
+ font-family: var(--pm-font-mono);
277
+ }
278
+
279
+ .pm-code .shiki span {
280
+ color: var(--shiki-light);
281
+ }
282
+
283
+ .dark .pm-code .shiki span {
284
+ color: var(--shiki-dark);
285
+ }
286
+
287
+ .pm-code .line.highlighted {
288
+ display: inline-block;
289
+ width: calc(100% + 2 * var(--pm-code-pad));
290
+ margin: 0 calc(-1 * var(--pm-code-pad));
291
+ padding: 0 var(--pm-code-pad);
292
+ background: var(--pm-line-highlight);
293
+ }
294
+
295
+ .pm-code--highlight .line:not(.highlighted) {
296
+ opacity: 0.45;
297
+ }
298
+
299
+ .pm-outputs {
300
+ margin: 0.25rem 0 1rem;
301
+ }
302
+
303
+ .pm-output pre {
304
+ margin: 0.25rem 0;
305
+ padding: 0.5rem 0.75rem;
306
+ overflow-x: auto;
307
+ border-left: var(--pm-size-rule) solid var(--pm-c-border);
308
+ background: var(--pm-c-bg-soft);
309
+ font-size: 0.8125em;
310
+ }
311
+
312
+ .pm-output__stderr,
313
+ .pm-output--failed .pm-output__stdout {
314
+ border-left-color: var(--pm-c-danger) !important;
315
+ }
316
+
317
+ .pm-output__note {
318
+ margin: 0;
319
+ font-size: 0.75em;
320
+ color: var(--pm-c-text-2);
321
+ }
322
+
323
+ .pm-output__stderr,
324
+ .pm-output__error {
325
+ border-left-color: var(--pm-c-danger) !important;
326
+ }
327
+
328
+ .pm-output__display {
329
+ margin: 0.25rem 0;
330
+ overflow-x: auto;
331
+ }
332
+
333
+ .pm-output__display img {
334
+ max-width: 100%;
335
+ }
336
+
337
+ .pm-outputs--prose,
338
+ .pm-output--prose .pm-output__display {
339
+ margin: 0;
340
+ }
341
+
342
+ .pm-math--display {
343
+ overflow-x: auto;
344
+ margin: 1rem 0;
345
+ text-align: center;
346
+ }
347
+
348
+ .pm-mermaid {
349
+ margin: 1rem 0;
350
+ overflow-x: auto;
351
+ text-align: center;
352
+ }
353
+
354
+ .pm-mermaid svg {
355
+ max-width: none;
356
+ }
357
+
358
+ .pm-admonition {
359
+ margin: 1rem 0;
360
+ padding: 0.25rem 1rem;
361
+ border-left: calc(var(--pm-size-stroke) * 2) solid var(--pm-c-brand);
362
+ border-radius: 0.25rem;
363
+ background: var(--pm-c-bg-soft);
364
+ }
365
+
366
+ .pm-admonition--warning,
367
+ .pm-admonition--caution,
368
+ .pm-admonition--danger,
369
+ .pm-admonition--error {
370
+ border-left-color: var(--pm-c-danger);
371
+ }
372
+
373
+ .pm-admonition__title {
374
+ font-weight: 600;
375
+ }
376
+
377
+ .pm-block kbd {
378
+ padding: 0.05em 0.35em;
379
+ border: var(--pm-size-hairline) solid var(--pm-c-border);
380
+ border-bottom-width: var(--pm-size-stroke);
381
+ border-radius: 0.25rem;
382
+ background: var(--pm-c-bg-soft);
383
+ font-family: var(--pm-font-mono);
384
+ font-size: 0.875em;
385
+ }
386
+
387
+ .pm-block dt {
388
+ font-weight: 600;
389
+ }
390
+
391
+ .pm-block dd {
392
+ margin: 0 0 0.5rem 1.5rem;
393
+ }
394
+
395
+ .pm-block details {
396
+ margin: 1rem 0;
397
+ padding: 0.25rem 1rem;
398
+ border: var(--pm-size-hairline) solid var(--pm-c-border);
399
+ border-radius: 0.25rem;
400
+ }
401
+
402
+ .pm-block summary {
403
+ font-weight: 600;
404
+ cursor: pointer;
405
+ }
406
+
407
+ .pm-grid {
408
+ --pm-grid-columns: var(--pm-grid-xs, 1);
409
+ --pm-span-xs: initial;
410
+ --pm-span-sm: initial;
411
+ --pm-span-md: initial;
412
+ --pm-span-lg: initial;
413
+ display: grid;
414
+ grid-template-columns: repeat(var(--pm-grid-columns), minmax(0, 1fr));
415
+ gap: 1rem;
416
+ margin: 1rem 0;
417
+ }
418
+
419
+ .pm-grid > * {
420
+ --pm-span: var(--pm-span-xs, 1);
421
+ grid-column: span var(--pm-span);
422
+ min-width: 0;
423
+ }
424
+
425
+ @media (min-width: 576px) {
426
+ .pm-grid {
427
+ --pm-grid-columns: var(--pm-grid-sm, 1);
428
+ }
429
+
430
+ .pm-grid > * {
431
+ --pm-span: var(--pm-span-sm, 1);
432
+ }
433
+ }
434
+
435
+ @media (min-width: 768px) {
436
+ .pm-grid {
437
+ --pm-grid-columns: var(--pm-grid-md, 1);
438
+ }
439
+
440
+ .pm-grid > * {
441
+ --pm-span: var(--pm-span-md, 1);
442
+ }
443
+ }
444
+
445
+ @media (min-width: 992px) {
446
+ .pm-grid {
447
+ --pm-grid-columns: var(--pm-grid-lg, 1);
448
+ }
449
+
450
+ .pm-grid > * {
451
+ --pm-span: var(--pm-span-lg, 1);
452
+ }
453
+ }
454
+
455
+ .pm-card {
456
+ position: relative;
457
+ display: flex;
458
+ flex-direction: column;
459
+ margin: 1rem 0;
460
+ border: var(--pm-size-hairline) solid var(--pm-c-border);
461
+ border-radius: 0.5rem;
462
+ background: var(--pm-c-bg);
463
+ overflow: hidden;
464
+ }
465
+
466
+ .pm-grid > .pm-card {
467
+ margin: 0;
468
+ }
469
+
470
+ .pm-card--link:hover {
471
+ border-color: var(--pm-c-brand);
472
+ }
473
+
474
+ .pm-card__header,
475
+ .pm-card__footer {
476
+ padding: 0 1rem;
477
+ background: var(--pm-c-bg-soft);
478
+ }
479
+
480
+ .pm-card__header {
481
+ border-bottom: var(--pm-size-hairline) solid var(--pm-c-border);
482
+ }
483
+
484
+ .pm-card__footer {
485
+ margin-top: auto;
486
+ border-top: var(--pm-size-hairline) solid var(--pm-c-border);
487
+ }
488
+
489
+ .pm-card > .pm-card__title {
490
+ margin: 0.75rem 1rem 0;
491
+ font-weight: 600;
492
+ }
493
+
494
+ .pm-card__body {
495
+ padding: 0 1rem;
496
+ }
497
+
498
+ .pm-card__header > :first-child,
499
+ .pm-card__body > :first-child,
500
+ .pm-card__footer > :first-child {
501
+ margin-top: 0.75rem;
502
+ }
503
+
504
+ .pm-card__header > :last-child,
505
+ .pm-card__body > :last-child,
506
+ .pm-card__footer > :last-child {
507
+ margin-bottom: 0.75rem;
508
+ }
509
+
510
+ .pm-card.pm-card--link > .pm-card__title > a[href]::after {
511
+ content: '';
512
+ position: absolute;
513
+ inset: 0;
514
+ width: auto;
515
+ height: auto;
516
+ margin: 0;
517
+ background: none;
518
+ mask-image: none;
519
+ }
520
+
521
+ .pm-card--link :is(.pm-card__header, .pm-card__body, .pm-card__footer) a {
522
+ position: relative;
523
+ z-index: 1;
524
+ }
525
+
526
+ .pm-block .pm-button {
527
+ display: inline-block;
528
+ padding: 0.3em 1em;
529
+ border: var(--pm-size-hairline) solid var(--pm-c-brand);
530
+ border-radius: var(--pm-radius-pill);
531
+ color: var(--pm-c-brand);
532
+ font-weight: 600;
533
+ text-decoration: none;
534
+ }
535
+
536
+ .pm-block a.pm-button:hover {
537
+ background: var(--pm-c-brand);
538
+ color: var(--pm-c-bg);
539
+ }
540
+
541
+ .pm-tabs {
542
+ margin: 1rem 0;
543
+ }
544
+
545
+ .pm-tabs__list {
546
+ display: flex;
547
+ flex-wrap: wrap;
548
+ gap: 0.25rem;
549
+ border-bottom: var(--pm-size-hairline) solid var(--pm-c-border);
550
+ }
551
+
552
+ .pm-tabs__tab {
553
+ margin-bottom: -1px;
554
+ padding: 0.4rem 0.9rem;
555
+ border-bottom: var(--pm-size-stroke) solid transparent;
556
+ color: var(--pm-c-text-2);
557
+ cursor: pointer;
558
+ }
559
+
560
+ .pm-tabs__tab:hover {
561
+ color: var(--pm-c-text);
562
+ }
563
+
564
+ .pm-tabs__tab[aria-selected='true'] {
565
+ border-bottom-color: var(--pm-c-brand);
566
+ color: var(--pm-c-brand);
567
+ font-weight: 600;
568
+ }
569
+
570
+ .pm-tabs__panel {
571
+ padding-top: 0.25rem;
572
+ }
573
+
574
+ .pm-footnote {
575
+ font-size: 0.875em;
576
+ color: var(--pm-c-text-2);
577
+ }
578
+
579
+ .pm-footnote-ref a::before {
580
+ content: '[' attr(data-label) ']';
581
+ }
582
+
583
+ .pm-footnote > sup::before {
584
+ content: attr(data-label);
585
+ }
586
+
587
+ .pm-component-missing {
588
+ padding: 0.5rem 0.75rem;
589
+ border: var(--pm-size-hairline) dashed var(--pm-c-border);
590
+ border-radius: 0.25rem;
591
+ color: var(--pm-c-text-2);
592
+ font-size: 0.875em;
593
+ }
594
+
595
+ .pm-boundary-error {
596
+ padding: 0.5rem 0.75rem;
597
+ border: var(--pm-size-hairline) dashed var(--pm-c-danger);
598
+ border-radius: 0.25rem;
599
+ color: var(--pm-c-danger);
600
+ font-size: 0.85em;
601
+ }
602
+
603
+ html.pm-presenting {
604
+ overflow: hidden;
605
+ }
606
+
607
+ .pm-present,
608
+ .pm-presenter {
609
+ position: fixed;
610
+ inset: 0;
611
+ z-index: var(--pm-z-overlay-view);
612
+ display: flex;
613
+ flex-direction: column;
614
+ background: var(--pm-c-bg);
615
+ color: var(--pm-c-text);
616
+ }
617
+
618
+ .pm-present:focus {
619
+ outline: none;
620
+ }
621
+
622
+ :where(.pm-present, .pm-presenter) :where(ul) {
623
+ padding-left: 1.5em;
624
+ list-style: disc;
625
+ }
626
+
627
+ :where(.pm-present, .pm-presenter) :where(ol) {
628
+ padding-left: 1.5em;
629
+ list-style: decimal;
630
+ }
631
+
632
+ :where(.pm-present, .pm-presenter) :where(p, ul, ol, pre) {
633
+ margin: 0.5em 0;
634
+ }
635
+
636
+ .pm-present__slide {
637
+ position: relative;
638
+ flex: 1;
639
+ min-height: 0;
640
+ padding: 2vh 2vw;
641
+ }
642
+
643
+ /* A slide: its canvas, scaled as a whole to its box, and the Book layout on it. */
644
+
645
+ .pm-slide-fit {
646
+ position: relative;
647
+ width: 100%;
648
+ height: 100%;
649
+ overflow: hidden;
650
+ }
651
+
652
+ .pm-slide-fit__canvas {
653
+ position: absolute;
654
+ top: 0;
655
+ left: 0;
656
+ transform-origin: 0 0;
657
+ box-shadow: var(--pm-shadow-page);
658
+ }
659
+
660
+ .pm-slide {
661
+ position: relative;
662
+ box-sizing: border-box;
663
+ display: flex;
664
+ flex-direction: column;
665
+ width: 100%;
666
+ height: 100%;
667
+ padding: 1.9em 3.1em 2.6em;
668
+ overflow: hidden;
669
+ background: var(--pm-color-surface);
670
+ color: var(--pm-color-ink);
671
+ font-family: var(--pm-font-sans);
672
+ font-size: var(--pm-slide-text);
673
+ line-height: 1.6;
674
+ }
675
+
676
+ .pm-slide :is(ul, ol) {
677
+ margin: 0.67em 0;
678
+ padding-inline-start: 1.3em;
679
+ }
680
+
681
+ .pm-slide li::marker {
682
+ color: var(--pm-color-accent);
683
+ }
684
+
685
+ .pm-slide :is(table, th, td) {
686
+ font-size: 0.95em;
687
+ }
688
+
689
+ .pm-slide :is(th, td) {
690
+ padding: 0.3em 0.6em;
691
+ }
692
+
693
+ .pm-slide__chapter {
694
+ display: flex;
695
+ align-items: center;
696
+ gap: 0.67em;
697
+ margin: 0 0 0.55em;
698
+ color: var(--pm-color-accent);
699
+ font-size: 0.67em;
700
+ font-weight: 600;
701
+ letter-spacing: 0.08em;
702
+ line-height: 1.4;
703
+ }
704
+
705
+ .pm-slide__chapter::after {
706
+ content: '';
707
+ flex: 1;
708
+ height: var(--pm-size-hairline);
709
+ background: var(--pm-color-line);
710
+ }
711
+
712
+ .pm-slide__body {
713
+ flex: 1;
714
+ min-height: 0;
715
+ overflow: hidden;
716
+ }
717
+
718
+ .pm-slide__content {
719
+ transform-origin: top left;
720
+ }
721
+
722
+ .pm-slide__content > .pm-block--markdown :is(p, ul, ol, blockquote) {
723
+ font-family: var(--pm-font-serif);
724
+ }
725
+
726
+ /* Over the reading styles of the document's headings (`.pm-document h2`). */
727
+ .pm-slide .pm-slide__title {
728
+ margin: 0 0 0.45em;
729
+ padding: 0;
730
+ border: 0;
731
+ font-family: var(--pm-font-serif);
732
+ font-size: 2.2em;
733
+ font-weight: 600;
734
+ line-height: 1.15;
735
+ letter-spacing: -0.005em;
736
+ }
737
+
738
+ .pm-slide--cover {
739
+ justify-content: flex-end;
740
+ padding-bottom: 5.3em;
741
+ }
742
+
743
+ .pm-slide--cover .pm-slide__title {
744
+ max-width: 85%;
745
+ font-size: 2.67em;
746
+ line-height: 1.12;
747
+ }
748
+
749
+ .pm-slide--cover .pm-slide__title::before {
750
+ content: '';
751
+ display: block;
752
+ width: 1em;
753
+ height: 0.07em;
754
+ margin-bottom: 0.45em;
755
+ border-radius: var(--pm-radius-chip);
756
+ background: var(--pm-color-accent);
757
+ }
758
+
759
+ .pm-slide--cover .pm-slide__content > .pm-block :is(p, ul, ol) {
760
+ max-width: 80%;
761
+ color: var(--pm-color-muted);
762
+ font-size: 1.1em;
763
+ }
764
+
765
+ .pm-slide--center .pm-slide__content {
766
+ display: flex;
767
+ flex-direction: column;
768
+ align-items: center;
769
+ justify-content: center;
770
+ min-height: 100%;
771
+ text-align: center;
772
+ }
773
+
774
+ .pm-slide--full {
775
+ padding: 0;
776
+ }
777
+
778
+ /* A full slide is all content (a scene, a picture); its title stays for assistive technology only. */
779
+ .pm-slide--full .pm-slide__title {
780
+ position: absolute;
781
+ width: var(--pm-size-hairline);
782
+ height: var(--pm-size-hairline);
783
+ margin: 0;
784
+ overflow: hidden;
785
+ clip: rect(0 0 0 0);
786
+ white-space: nowrap;
787
+ }
788
+
789
+ .pm-slide__footer {
790
+ position: absolute;
791
+ right: 3.1em;
792
+ bottom: 0.9em;
793
+ left: 3.1em;
794
+ display: flex;
795
+ align-items: center;
796
+ gap: 0.67em;
797
+ color: var(--pm-color-muted);
798
+ font-size: 0.61em;
799
+ line-height: 1.2;
800
+ }
801
+
802
+ .pm-slide__deck {
803
+ min-width: 0;
804
+ overflow: hidden;
805
+ text-overflow: ellipsis;
806
+ white-space: nowrap;
807
+ }
808
+
809
+ .pm-slide__steps {
810
+ display: flex;
811
+ flex: none;
812
+ gap: 0.45em;
813
+ width: min(calc(var(--pm-slide-steps, 1) * 2em - 0.45em), 40%);
814
+ margin-left: auto;
815
+ }
816
+
817
+ .pm-slide__steps > span {
818
+ flex: 1;
819
+ min-width: 0.2em;
820
+ height: 0.27em;
821
+ border-radius: 0.2em;
822
+ background: var(--pm-color-line-strong);
823
+ }
824
+
825
+ .pm-slide__steps > span[data-done] {
826
+ background: var(--pm-color-accent);
827
+ }
828
+
829
+ .pm-slide__page {
830
+ margin-left: auto;
831
+ font-family: var(--pm-font-mono);
832
+ font-variant-numeric: tabular-nums;
833
+ white-space: nowrap;
834
+ }
835
+
836
+ .pm-slide__steps + .pm-slide__page {
837
+ margin-left: 0;
838
+ }
839
+
840
+ /* A runnable code block's code, edited before it runs (CodeMirror). */
841
+ .pm-code-editor {
842
+ margin: 0.5em 0;
843
+ border: var(--pm-size-hairline) solid var(--pm-color-line-strong);
844
+ border-radius: var(--pm-radius-control);
845
+ background: var(--pm-color-code);
846
+ font-size: 0.875em;
847
+ }
848
+
849
+ .pm-code-editor .cm-editor {
850
+ border-radius: inherit;
851
+ }
852
+
853
+ .pm-code-editor .cm-editor.cm-focused {
854
+ outline: var(--pm-size-stroke) solid var(--pm-color-accent);
855
+ outline-offset: var(--pm-space-px);
856
+ }
857
+
858
+ .pm-code-editor .cm-scroller {
859
+ padding: 0.5em 0;
860
+ font-family: var(--pm-font-mono);
861
+ line-height: 1.6;
862
+ }
863
+
864
+ .pm-code-editor .cm-content {
865
+ caret-color: var(--pm-color-ink);
866
+ color: var(--pm-color-ink);
867
+ }
868
+
869
+ .pm-code-editor .cm-cursor {
870
+ border-left-color: var(--pm-color-ink);
871
+ }
872
+
873
+ /* Plugins' layers on a slide (drawings): over its content, on the canvas's coordinates; a layer takes the pointer itself. */
874
+ .pm-slide__layers {
875
+ position: absolute;
876
+ inset: 0;
877
+ pointer-events: none;
878
+ }
879
+
880
+ /* Every slide one after the other at the canvas's size, for printing. */
881
+
882
+ .pm-slides-print__page {
883
+ position: relative;
884
+ overflow: hidden;
885
+ break-after: page;
886
+ }
887
+
888
+ @media print {
889
+ @page {
890
+ margin: 0;
891
+ }
892
+
893
+ html,
894
+ body {
895
+ margin: 0;
896
+ }
897
+ }
898
+
899
+ .pm-overview {
900
+ position: absolute;
901
+ inset: 0;
902
+ z-index: 1;
903
+ overflow: auto;
904
+ padding: 1.5rem;
905
+ background: var(--pm-c-bg);
906
+ font-size: 1rem;
907
+ }
908
+
909
+ /* The overview is chrome inside a document: its own list rules outrank the document's list styling. */
910
+ .pm-overview .pm-overview__grid {
911
+ display: grid;
912
+ grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
913
+ gap: 0.75rem;
914
+ margin: 0;
915
+ padding: 0;
916
+ list-style: none;
917
+ }
918
+
919
+ .pm-overview__item {
920
+ display: flex;
921
+ gap: 0.5rem;
922
+ align-items: baseline;
923
+ width: 100%;
924
+ min-height: 4.5rem;
925
+ padding: 0.75rem;
926
+ border: var(--pm-size-hairline) solid var(--pm-c-border);
927
+ border-radius: 0.375rem;
928
+ background: var(--pm-c-bg-soft);
929
+ color: var(--pm-c-text);
930
+ text-align: left;
931
+ cursor: pointer;
932
+ }
933
+
934
+ .pm-overview__item[aria-current='true'] {
935
+ border-color: var(--pm-c-brand);
936
+ box-shadow: inset 0 0 0 var(--pm-size-hairline) var(--pm-c-brand);
937
+ }
938
+
939
+ .pm-overview__item:focus-visible {
940
+ outline: var(--pm-size-stroke) solid var(--pm-c-brand);
941
+ outline-offset: var(--pm-size-stroke);
942
+ }
943
+
944
+ .pm-overview__index {
945
+ color: var(--pm-c-text-2);
946
+ font-variant-numeric: tabular-nums;
947
+ }
948
+
949
+ .pm-present .pm-present__title,
950
+ .pm-presenter .pm-present__title {
951
+ margin: 0 0 1em;
952
+ font-size: 1.6em;
953
+ font-weight: 700;
954
+ line-height: 1.25;
955
+ }
956
+
957
+ .pm-present__bar,
958
+ .pm-presenter__bar {
959
+ display: flex;
960
+ flex-wrap: wrap;
961
+ gap: 0.5rem;
962
+ align-items: center;
963
+ padding: 0.5rem 1rem;
964
+ border-top: var(--pm-size-hairline) solid var(--pm-c-border);
965
+ font-size: 0.875rem;
966
+ color: var(--pm-c-text-2);
967
+ }
968
+
969
+ .pm-present__counter {
970
+ margin-right: auto;
971
+ }
972
+
973
+ .pm-present__button {
974
+ padding: 0.25rem 0.75rem;
975
+ border: var(--pm-size-hairline) solid var(--pm-c-border);
976
+ border-radius: 0.25rem;
977
+ background: var(--pm-c-bg-soft);
978
+ color: var(--pm-c-text);
979
+ cursor: pointer;
980
+ }
981
+
982
+ .pm-presenter__bar {
983
+ border-top: none;
984
+ border-bottom: var(--pm-size-hairline) solid var(--pm-c-border);
985
+ }
986
+
987
+ .pm-presenter__title {
988
+ color: var(--pm-c-text);
989
+ }
990
+
991
+ .pm-presenter__timer {
992
+ margin-left: auto;
993
+ font-family: var(--pm-font-mono);
994
+ font-size: 1.25rem;
995
+ color: var(--pm-c-text);
996
+ }
997
+
998
+ .pm-presenter__main {
999
+ flex: 1;
1000
+ display: grid;
1001
+ grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
1002
+ gap: 1rem;
1003
+ min-height: 0;
1004
+ padding: 1rem;
1005
+ }
1006
+
1007
+ .pm-presenter__slide,
1008
+ .pm-presenter__side {
1009
+ overflow: auto;
1010
+ min-height: 0;
1011
+ }
1012
+
1013
+ .pm-presenter__slide {
1014
+ min-height: 0;
1015
+ }
1016
+
1017
+ .pm-presenter__upcoming {
1018
+ aspect-ratio: 16 / 9;
1019
+ margin-bottom: 0.5rem;
1020
+ }
1021
+
1022
+ .pm-presenter .pm-presenter__label {
1023
+ margin: 0 0 0.5rem;
1024
+ font-size: 0.875rem;
1025
+ color: var(--pm-c-text-2);
1026
+ }
1027
+
1028
+ .pm-presenter__note {
1029
+ padding: 0 0.5rem;
1030
+ border-left: var(--pm-size-rule) solid transparent;
1031
+ opacity: 0.5;
1032
+ }
1033
+
1034
+ .pm-presenter__note.pm-current {
1035
+ border-left-color: var(--pm-c-brand);
1036
+ opacity: 1;
1037
+ }
1038
+
1039
+ .pm-presenter__next {
1040
+ white-space: pre-line;
1041
+ }
1042
+
1043
+ @media (max-width: 767px) {
1044
+ .pm-presenter__main {
1045
+ grid-template-columns: minmax(0, 1fr);
1046
+ }
1047
+ }
1048
+
1049
+ .pm-role-mark {
1050
+ margin: 0 0.15em;
1051
+ padding: 0 0.2em;
1052
+ border-radius: var(--pm-radius-chip);
1053
+ font-size: 0.85em;
1054
+ color: var(--pm-color-muted);
1055
+ background: var(--pm-color-sunk);
1056
+ }
1057
+
1058
+ .pm-step-range.pm-hidden { display: none !important; }