orz-slides 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.
@@ -0,0 +1,777 @@
1
+ /* ==========================================================
2
+ orz-slides · BASE.CSS
3
+ Structural + content styling for the rendered-slide DOM contract
4
+ (docs/dom-contract.md). Each theme file `@import`s this and then
5
+ defines ONLY the design tokens in its own :root{}.
6
+
7
+ This file loads alongside reveal.js + reveal.css. It styles our
8
+ contract classes (.orz-slide, .orz-title, .orz-content, .orz-split,
9
+ .orz-region, .orz-footer, .orz-float) and the .markdown-body content
10
+ inside regions. ALL colors and fonts are driven from CSS variables so
11
+ a theme only sets :root tokens.
12
+
13
+ CSS-VARIABLE CONTRACT (a theme sets these in :root):
14
+ --accent brand / accent color
15
+ --ink body text color
16
+ --bg slide background
17
+ --font-heading heading font stack
18
+ --font-body body font stack
19
+ --heading-color text color of the h2 title band
20
+ --heading-bg background of the h2 title band
21
+ --slide-gap grid gap between regions (e.g. 28px)
22
+ --slide-pad slide content padding (e.g. 4% 5%)
23
+ --box-info / --box-warning / --box-danger / --box-success (border colors)
24
+ --box-*-bg (callout fill backgrounds)
25
+ --table-head-bg table header background
26
+ --row-highlight highlighted-row background
27
+ Optional (sensible fallbacks below):
28
+ --heading-radius --heading-shadow --heading-pad --heading-align
29
+ --heading-letter-spacing --heading-font-weight
30
+ --box-radius --box-shadow --box-border-width
31
+ --surface (elevated panel bg, e.g. floats/code) --muted (dim text)
32
+ --code-bg --code-color --rule (hairline border color)
33
+ --link-color
34
+ Dark themes additionally override reveal's own vars:
35
+ --r-background-color --r-main-color --r-heading-color --r-link-color
36
+ ========================================================== */
37
+
38
+ /* ---------- Reveal-level defaults from our tokens ---------- */
39
+ /* Keep left-aligned, top-anchored slides (reveal defaults to centered). */
40
+ .reveal .slides { text-align: left; }
41
+
42
+ .reveal,
43
+ .reveal .slides section {
44
+ font-family: var(--font-body, 'Segoe UI', system-ui, sans-serif);
45
+ color: var(--ink, #222);
46
+ }
47
+
48
+ .reveal-viewport,
49
+ body {
50
+ background-color: var(--bg, #ffffff);
51
+ }
52
+
53
+ /* ==========================================================
54
+ SLIDE FRAME — the .orz-slide <section>
55
+ ========================================================== */
56
+ .reveal .orz-slide {
57
+ box-sizing: border-box;
58
+ width: 100%;
59
+ height: 100%;
60
+ padding: var(--slide-pad, 1% 2% 2% 2%);
61
+ /* floats are positioned against this box; content is clipped to the slide */
62
+ position: relative;
63
+ overflow: hidden;
64
+ text-align: left;
65
+ color: var(--ink, #222);
66
+ font-family: var(--font-body, 'Segoe UI', system-ui, sans-serif);
67
+ /* Presentation-scale base font in slide (960×H) coordinates — reveal then
68
+ scales the whole slide to the screen. Without this the deck inherits the
69
+ 16px document default and content looks tiny inside a full-size slide.
70
+ Em-based content sizes (title band, bullets, code…) all derive from it. */
71
+ font-size: 24px;
72
+ line-height: 1.45;
73
+ }
74
+
75
+ /* Inner flex frame. reveal.js forces `display:block` (inline) on the <section>,
76
+ which overrides any flex frame placed on .orz-slide — so the title/content/
77
+ footer column lives on this wrapper, where reveal won't touch it. */
78
+ .reveal .orz-frame {
79
+ height: 100%;
80
+ display: flex;
81
+ flex-direction: column;
82
+ }
83
+
84
+ /* ---------- Title band: .orz-title h2 ---------- */
85
+ .reveal .orz-title {
86
+ flex: 0 0 auto;
87
+ margin-bottom: var(--slide-gap, 28px);
88
+ }
89
+ .reveal .orz-title .markdown-body { margin: 0; }
90
+
91
+ .reveal .orz-title h2 {
92
+ box-sizing: border-box;
93
+ margin: 0;
94
+ width: 100%;
95
+ font-family: var(--font-heading, 'Segoe UI', system-ui, sans-serif);
96
+ font-weight: var(--heading-font-weight, 600);
97
+ font-size: 1.5em;
98
+ line-height: 1.15;
99
+ letter-spacing: var(--heading-letter-spacing, 0);
100
+ text-align: var(--heading-align, left);
101
+ text-transform: none;
102
+ color: var(--heading-color, #fff);
103
+ background: var(--heading-bg, var(--accent, #345));
104
+ padding: var(--heading-pad, 0.4em 0.7em);
105
+ border-radius: var(--heading-radius, 8px);
106
+ box-shadow: var(--heading-shadow, none);
107
+ }
108
+
109
+ /* ==========================================================
110
+ CONTENT AREA + LAYOUT GRID
111
+ ========================================================== */
112
+ .reveal .orz-content {
113
+ flex: 1 1 auto;
114
+ min-height: 0; /* allow grid children to shrink/scroll */
115
+ display: flex; /* a single-region content area fills height */
116
+ flex-direction: column;
117
+ }
118
+
119
+ /* Splits carry inline grid-template-* from the layout engine; we only
120
+ theme the gap and make them fill the available content height. */
121
+ .reveal .orz-split {
122
+ display: grid;
123
+ gap: var(--slide-gap, 28px);
124
+ flex: 1 1 auto;
125
+ min-height: 0;
126
+ width: 100%;
127
+ align-items: stretch;
128
+ }
129
+
130
+ /* A split nested inside another split is itself a grid item — make it
131
+ stretch to fill its cell. */
132
+ .reveal .orz-split .orz-split { height: 100%; }
133
+
134
+ /* ---------- Region cell ---------- */
135
+ .reveal .orz-region {
136
+ box-sizing: border-box;
137
+ min-width: 0;
138
+ min-height: 0;
139
+ /* Fill height in the single-region case (lone region in flex .orz-content);
140
+ harmless as a grid item (grid controls sizing). Lets WP6 detect overflow. */
141
+ flex: 1 1 auto;
142
+ overflow: hidden; /* fit=scroll flips this to auto */
143
+ display: flex;
144
+ flex-direction: column;
145
+ /* WP6 sets --region-scale on this element when scaling to fit. */
146
+ font-size: calc(1em * var(--region-scale, 1));
147
+ }
148
+ .reveal .orz-slide[data-fit="scroll"] .orz-region { overflow: auto; }
149
+
150
+ /* ==========================================================
151
+ FOOTER BAND
152
+ ========================================================== */
153
+ .reveal .orz-footer {
154
+ flex: 0 0 auto;
155
+ margin-top: var(--slide-gap, 28px);
156
+ padding-top: 0.5em;
157
+ border-top: 1px solid var(--rule, rgba(0, 0, 0, 0.12));
158
+ font-size: 0.6em;
159
+ line-height: 1.3;
160
+ color: var(--muted, rgba(0, 0, 0, 0.55));
161
+ }
162
+ .reveal .orz-footer .markdown-body { margin: 0; }
163
+ .reveal .orz-footer p { margin: 0; }
164
+
165
+ /* ==========================================================
166
+ FLOAT — absolute overlay box (positioned via inline style)
167
+ ========================================================== */
168
+ .reveal .orz-float {
169
+ box-sizing: border-box;
170
+ position: absolute;
171
+ overflow: hidden;
172
+ padding: 0.8em 1em;
173
+ background: var(--surface, #fff);
174
+ border: 1px solid var(--rule, rgba(0, 0, 0, 0.14));
175
+ border-radius: var(--box-radius, 8px);
176
+ box-shadow: var(--box-shadow, 0 6px 20px rgba(0, 0, 0, 0.18));
177
+ color: var(--ink, #222);
178
+ font-size: 0.85em;
179
+ }
180
+ .reveal .orz-float .markdown-body { margin: 0; }
181
+ .reveal .orz-float > .markdown-body > :first-child { margin-top: 0; }
182
+ .reveal .orz-float > .markdown-body > :last-child { margin-bottom: 0; }
183
+
184
+ /* ==========================================================
185
+ .markdown-body — orz-markdown content inside regions
186
+ ========================================================== */
187
+ .reveal .markdown-body {
188
+ line-height: 1.45;
189
+ color: var(--ink, #222);
190
+ }
191
+ .reveal .orz-region > .markdown-body {
192
+ margin: 0;
193
+ height: 100%;
194
+ /* As a flex item, default min-height:auto would force the region to grow to
195
+ the content's height (breaking scale-to-fit). 0 lets the region clamp to
196
+ the slide; overflow is then detectable via scrollHeight and WP6 scales. */
197
+ min-height: 0;
198
+ }
199
+ .reveal .markdown-body > :first-child { margin-top: 0; }
200
+ .reveal .markdown-body > :last-child { margin-bottom: 0; }
201
+
202
+ /* ---------- Sub-headings h3–h6 (plain, NOT the title band) ---------- */
203
+ .reveal .markdown-body h3,
204
+ .reveal .markdown-body h4,
205
+ .reveal .markdown-body h5,
206
+ .reveal .markdown-body h6 {
207
+ font-family: var(--font-heading, 'Segoe UI', system-ui, sans-serif);
208
+ color: var(--accent, #345);
209
+ background: transparent;
210
+ box-shadow: none;
211
+ padding: 0;
212
+ margin: 0 0 0.4em;
213
+ line-height: 1.2;
214
+ font-weight: var(--heading-font-weight, 600);
215
+ text-align: left;
216
+ }
217
+ .reveal .markdown-body h3 { font-size: 1.15em; }
218
+ .reveal .markdown-body h4 { font-size: 1.0em; }
219
+ .reveal .markdown-body h5 { font-size: 0.9em; }
220
+ .reveal .markdown-body h6 { font-size: 0.85em; color: var(--muted, #777); }
221
+
222
+ /* ---------- Paragraphs ---------- */
223
+ .reveal .markdown-body p {
224
+ margin: 0 0 0.6em;
225
+ font-size: 0.82em;
226
+ line-height: 1.45;
227
+ }
228
+
229
+ /* ---------- Lists ---------- */
230
+ .reveal .markdown-body ul,
231
+ .reveal .markdown-body ol {
232
+ text-align: left;
233
+ margin: 0 0 0.6em;
234
+ padding-left: 1.8em; /* room for the marker (esp. two-digit ol numbers) */
235
+ }
236
+ .reveal .markdown-body li {
237
+ font-size: 0.82em;
238
+ line-height: 1.45;
239
+ margin-bottom: 0.35em;
240
+ }
241
+ .reveal .markdown-body li > ul,
242
+ .reveal .markdown-body li > ol {
243
+ margin: 0.25em 0 0.25em;
244
+ }
245
+ .reveal .markdown-body li > ul li,
246
+ .reveal .markdown-body li > ol li { font-size: 1em; }
247
+
248
+ /* ---------- Inline emphasis / links ----------
249
+ reveal's reset.css applies `font: inherit; font-size: 100%; vertical-align:
250
+ baseline` to strong/em/b/i/sub/sup/small, wiping their semantics — so restore
251
+ them here. Bold is BOLD (not recolored — a color hack disappears when it
252
+ matches the background); italic is italic; sub/sup raise and lower. */
253
+ .reveal .markdown-body strong,
254
+ .reveal .markdown-body b { font-weight: 700; }
255
+ .reveal .markdown-body em,
256
+ .reveal .markdown-body i { font-style: italic; }
257
+ .reveal .markdown-body em strong,
258
+ .reveal .markdown-body strong em { font-weight: 700; font-style: italic; }
259
+ .reveal .markdown-body s,
260
+ .reveal .markdown-body del { text-decoration: line-through; }
261
+ .reveal .markdown-body ins,
262
+ .reveal .markdown-body u { text-decoration: underline; }
263
+ .reveal .markdown-body small { font-size: 0.82em; }
264
+ .reveal .markdown-body sub,
265
+ .reveal .markdown-body sup { font-size: 0.75em; line-height: 0; position: relative; vertical-align: baseline; }
266
+ .reveal .markdown-body sub { bottom: -0.3em; }
267
+ .reveal .markdown-body sup { top: -0.5em; }
268
+ .reveal .markdown-body mark {
269
+ background: var(--mark-bg, #fde68a);
270
+ color: #3a2f00;
271
+ padding: 0 0.18em;
272
+ border-radius: 2px;
273
+ }
274
+ .reveal .markdown-body a {
275
+ color: var(--link-color, var(--accent, #345));
276
+ text-decoration: underline;
277
+ text-underline-offset: 2px;
278
+ }
279
+
280
+ /* ---------- Tables ---------- */
281
+ .reveal .markdown-body table {
282
+ width: 100%;
283
+ border-collapse: collapse;
284
+ font-size: 0.74em;
285
+ margin: 0 0 0.6em;
286
+ }
287
+ .reveal .markdown-body th {
288
+ background: var(--table-head-bg, var(--accent, #345));
289
+ color: var(--table-head-color, #fff);
290
+ text-align: left;
291
+ padding: 0.4em 0.6em;
292
+ border-bottom: 2px solid var(--accent, #345);
293
+ font-weight: 600;
294
+ }
295
+ .reveal .markdown-body td {
296
+ padding: 0.4em 0.6em;
297
+ border-bottom: 1px solid var(--rule, rgba(0, 0, 0, 0.12));
298
+ }
299
+ .reveal .markdown-body tr.row-highlight,
300
+ .reveal .markdown-body tr.row-highlight td {
301
+ background: var(--row-highlight, rgba(0, 0, 0, 0.04));
302
+ }
303
+
304
+ /* ---------- Code ---------- */
305
+ .reveal .markdown-body code {
306
+ font-family: var(--font-mono, ui-monospace, 'SFMono-Regular', Menlo, monospace);
307
+ font-size: 0.85em;
308
+ background: var(--code-bg, rgba(0, 0, 0, 0.06));
309
+ color: var(--code-color, var(--ink, #222));
310
+ padding: 0.1em 0.4em;
311
+ border-radius: 4px;
312
+ }
313
+ .reveal .markdown-body pre {
314
+ margin: 0 0 0.6em;
315
+ padding: 0.7em 0.9em;
316
+ background: var(--code-bg, rgba(0, 0, 0, 0.06));
317
+ border: 1px solid var(--rule, rgba(0, 0, 0, 0.12));
318
+ border-radius: var(--box-radius, 8px);
319
+ overflow: auto;
320
+ }
321
+ .reveal .markdown-body pre code {
322
+ display: block;
323
+ background: transparent;
324
+ border: 0;
325
+ padding: 0;
326
+ font-size: 0.72em;
327
+ line-height: 1.4;
328
+ color: var(--code-color, var(--ink, #222));
329
+ white-space: pre;
330
+ }
331
+
332
+ /* ---------- Blockquote ---------- */
333
+ .reveal .markdown-body blockquote {
334
+ margin: 0 0 0.6em;
335
+ padding: 0.5em 1em;
336
+ border-left: 4px solid var(--accent, #345);
337
+ background: var(--surface, rgba(0, 0, 0, 0.03));
338
+ color: var(--ink, #222);
339
+ font-style: italic;
340
+ }
341
+ .reveal .markdown-body blockquote p { margin: 0; }
342
+
343
+ /* ---------- Horizontal rule ---------- */
344
+ .reveal .markdown-body hr {
345
+ border: 0;
346
+ border-top: 1px solid var(--rule, rgba(0, 0, 0, 0.14));
347
+ margin: 0.8em 0;
348
+ }
349
+
350
+ /* ==========================================================
351
+ CALLOUT BOXES .box-info / .box-warning / .box-danger / .box-success
352
+ ========================================================== */
353
+ .reveal .markdown-body .box-info,
354
+ .reveal .markdown-body .box-warning,
355
+ .reveal .markdown-body .box-danger,
356
+ .reveal .markdown-body .box-success {
357
+ text-align: left;
358
+ padding: 0.7em 0.9em;
359
+ margin: 0 0 0.6em;
360
+ border: var(--box-border-width, 2px) solid currentColor;
361
+ border-radius: var(--box-radius, 8px);
362
+ box-shadow: var(--box-shadow, none);
363
+ font-size: 0.92em;
364
+ }
365
+ .reveal .markdown-body .box-info {
366
+ border-color: var(--box-info, #2b6cb0);
367
+ background: var(--box-info-bg, rgba(43, 108, 176, 0.08));
368
+ }
369
+ .reveal .markdown-body .box-warning {
370
+ border-color: var(--box-warning, #c79a2e);
371
+ background: var(--box-warning-bg, rgba(199, 154, 46, 0.10));
372
+ }
373
+ .reveal .markdown-body .box-danger {
374
+ border-color: var(--box-danger, #c0392b);
375
+ background: var(--box-danger-bg, rgba(192, 57, 43, 0.08));
376
+ }
377
+ .reveal .markdown-body .box-success {
378
+ border-color: var(--box-success, #2e8b57);
379
+ background: var(--box-success-bg, rgba(46, 139, 87, 0.08));
380
+ }
381
+ /* keep box text in the ink color (the border colors it, not the text) */
382
+ .reveal .markdown-body .box-info,
383
+ .reveal .markdown-body .box-warning,
384
+ .reveal .markdown-body .box-danger,
385
+ .reveal .markdown-body .box-success { color: var(--ink, #222); }
386
+
387
+ .reveal .markdown-body .box-info > :first-child,
388
+ .reveal .markdown-body .box-warning > :first-child,
389
+ .reveal .markdown-body .box-danger > :first-child,
390
+ .reveal .markdown-body .box-success > :first-child { margin-top: 0; }
391
+ .reveal .markdown-body .box-info > :last-child,
392
+ .reveal .markdown-body .box-warning > :last-child,
393
+ .reveal .markdown-body .box-danger > :last-child,
394
+ .reveal .markdown-body .box-success > :last-child { margin-bottom: 0; }
395
+
396
+ /* Headings inside callouts: strip the sub-heading accent, keep inline */
397
+ .reveal .markdown-body .box-info :is(h3,h4,h5,h6),
398
+ .reveal .markdown-body .box-warning :is(h3,h4,h5,h6),
399
+ .reveal .markdown-body .box-danger :is(h3,h4,h5,h6),
400
+ .reveal .markdown-body .box-success :is(h3,h4,h5,h6) {
401
+ color: inherit;
402
+ margin-top: 0;
403
+ font-size: 1em;
404
+ }
405
+
406
+ /* ==========================================================
407
+ GENERATED CONSTRUCTS (mermaid / smiles / qrcode / math wrappers)
408
+ ========================================================== */
409
+ .reveal .markdown-body .mermaid,
410
+ .reveal .markdown-body .smiles-render,
411
+ .reveal .markdown-body .qrcode,
412
+ .reveal .markdown-body .katex-display {
413
+ text-align: center;
414
+ margin: 0 auto 0.6em;
415
+ max-width: 100%;
416
+ }
417
+ /* Async graphics (mermaid SVG, smiles + chart canvases, qr SVG) must never
418
+ overflow their region — cap to the container width. */
419
+ .reveal .markdown-body .mermaid svg,
420
+ .reveal .markdown-body .smiles-render canvas,
421
+ .reveal .markdown-body canvas[data-smiles],
422
+ .reveal .markdown-body canvas.orz-chart,
423
+ .reveal .markdown-body .qrcode svg,
424
+ .reveal .markdown-body .qrcode img {
425
+ max-width: 100%;
426
+ height: auto;
427
+ }
428
+
429
+ /* ---- QR code: white plate + click-to-expand ---- */
430
+ .reveal .markdown-body .qrcode {
431
+ display: inline-block; position: relative; cursor: pointer;
432
+ background: #fff; padding: 6px; border-radius: 4px; line-height: 0;
433
+ vertical-align: middle;
434
+ }
435
+ .reveal .markdown-body .qrcode svg { display: block; width: 160px; }
436
+ .reveal .markdown-body .qrcode__icon {
437
+ position: absolute; top: 3px; right: 3px; z-index: 1;
438
+ font-size: 13px; line-height: 1; color: #444;
439
+ background: rgba(255, 255, 255, 0.85); border-radius: 3px; padding: 1px 3px;
440
+ opacity: 0; transition: opacity 0.15s;
441
+ }
442
+ .reveal .markdown-body .qrcode:hover .qrcode__icon { opacity: 1; }
443
+
444
+ /* fullscreen QR overlay (built by browser-entry on click) */
445
+ .orz-qr-overlay {
446
+ position: fixed; inset: 0; z-index: 200;
447
+ display: flex; align-items: center; justify-content: center;
448
+ background: rgba(0, 0, 0, 0.8); cursor: zoom-out;
449
+ }
450
+ .orz-qr-overlay svg {
451
+ width: min(78vh, 78vw); height: auto;
452
+ background: #fff; padding: 20px; border-radius: 10px;
453
+ box-shadow: 0 12px 50px rgba(0, 0, 0, 0.5);
454
+ }
455
+
456
+ /* ---- YouTube embed: fill the container width at 16:9 ---- */
457
+ .reveal .markdown-body .youtube-embed {
458
+ position: relative; width: 100%; max-width: 100%;
459
+ aspect-ratio: 16 / 9; margin: 0 auto 0.6em;
460
+ }
461
+ .reveal .markdown-body .youtube-embed iframe,
462
+ .reveal .markdown-body .youtube-embed .youtube-facade {
463
+ position: absolute; inset: 0; width: 100%; height: 100%;
464
+ border: 0; border-radius: 4px;
465
+ }
466
+ /* file:// fallback poster (see fixYouTube): thumbnail + play button, opens youtube.com */
467
+ .reveal .markdown-body .youtube-embed .youtube-facade {
468
+ display: flex; align-items: center; justify-content: center;
469
+ background: #000 center / cover no-repeat; cursor: pointer;
470
+ }
471
+ .reveal .markdown-body .youtube-facade .youtube-facade-play {
472
+ width: 16%; aspect-ratio: 1; border-radius: 50%;
473
+ background: rgba(0,0,0,0.65); transition: background 0.15s;
474
+ position: relative;
475
+ }
476
+ .reveal .markdown-body .youtube-facade:hover .youtube-facade-play { background: #f00; }
477
+ .reveal .markdown-body .youtube-facade .youtube-facade-play::after {
478
+ content: ''; position: absolute; top: 50%; left: 54%; transform: translate(-50%, -50%);
479
+ border-style: solid; border-width: 0.5em 0 0.5em 0.85em;
480
+ border-color: transparent transparent transparent #fff;
481
+ }
482
+
483
+ /* ---- task lists (- [ ] / - [x]): drop the bullet, keep the checkbox ---- */
484
+ .reveal .markdown-body ul.contains-task-list { list-style: none; padding-left: 0.2em; }
485
+ .reveal .markdown-body li.task-list-item { list-style: none; }
486
+
487
+ /* ---- on-deck clock + elapsed-timer overlay (toggled with T) ---- */
488
+ .orz-timer {
489
+ position: fixed; bottom: 14px; left: 50%; transform: translateX(-50%);
490
+ z-index: 60; display: flex; gap: 14px; align-items: baseline;
491
+ padding: 5px 14px; border-radius: 999px;
492
+ background: rgba(0, 0, 0, 0.62); color: #fff;
493
+ font: 500 15px/1 system-ui, -apple-system, sans-serif;
494
+ font-variant-numeric: tabular-nums; pointer-events: none;
495
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.25);
496
+ }
497
+ .orz-timer .orz-timer-clock { opacity: 0.7; }
498
+ .orz-timer .orz-timer-elapsed { font-size: 18px; font-weight: 700; }
499
+ .reveal .markdown-body .task-list-item-checkbox {
500
+ margin-right: 0.45em; vertical-align: middle; pointer-events: none;
501
+ }
502
+
503
+ /* ---- table of contents ({{toc}}) ---- */
504
+ .reveal .markdown-body .toc-list { list-style: none; padding-left: 0; }
505
+ .reveal .markdown-body .toc-list a { text-decoration: none; }
506
+ .reveal .markdown-body .toc-list a:hover { text-decoration: underline; }
507
+
508
+ /* ---- footnotes ---- */
509
+ .reveal .markdown-body .footnotes {
510
+ margin-top: 0.8em; padding-top: 0.4em; font-size: 0.8em;
511
+ border-top: 1px solid var(--rule, #ddd); color: var(--muted, #777);
512
+ }
513
+ .reveal .markdown-body .footnote-ref a,
514
+ .reveal .markdown-body .footnote-backref { text-decoration: none; }
515
+
516
+ /* ==========================================================
517
+ TEMPLATE SLIDES (title / section / outline / closing)
518
+ Generic helpers; themes restyle via the same tokens.
519
+ ========================================================== */
520
+ .reveal .orz-slide[data-kind="template"] .orz-frame { justify-content: center; }
521
+ .reveal .orz-template {
522
+ width: 100%;
523
+ display: flex;
524
+ flex-direction: column;
525
+ justify-content: center;
526
+ gap: 0.35em;
527
+ }
528
+
529
+ /* ---------- title — v1 (default): centered with an accent rule ---------- */
530
+ .reveal .orz-template-title { text-align: center; align-items: center; }
531
+ .reveal .orz-title-main {
532
+ font-family: var(--font-heading, 'Segoe UI', system-ui, sans-serif);
533
+ font-weight: 800;
534
+ font-size: 2.7em;
535
+ line-height: 1.06;
536
+ letter-spacing: -0.015em;
537
+ color: var(--ink, #1a1a1a);
538
+ margin: 0;
539
+ }
540
+ .reveal .orz-template-title .orz-title-main::after {
541
+ content: ""; display: block;
542
+ width: 2.2em; height: 4px; margin: 0.5em auto 0;
543
+ background: var(--accent, #345); border-radius: 2px;
544
+ }
545
+ .reveal .orz-title-sub {
546
+ font-size: 1.3em; font-weight: 500;
547
+ color: var(--muted, #6b7280);
548
+ margin: 0.7em 0 0;
549
+ }
550
+ .reveal .orz-title-meta { font-size: 0.85em; color: var(--muted, #6b7280); margin-top: 1.5em; }
551
+ .reveal .orz-title-meta p { margin: 0.15em 0; }
552
+
553
+ /* title — v2: left-aligned with an accent bar */
554
+ .reveal .orz-template-title.orz-v2 {
555
+ text-align: left; align-items: flex-start;
556
+ padding-left: 0.7em; border-left: 6px solid var(--accent, #345);
557
+ }
558
+ .reveal .orz-template-title.orz-v2 .orz-title-main { font-size: 3em; }
559
+ .reveal .orz-template-title.orz-v2 .orz-title-main::after { display: none; }
560
+ .reveal .orz-template-title.orz-v2 .orz-title-sub { margin-top: 0.5em; }
561
+
562
+ /* title — v3: an uppercase kicker above the title */
563
+ .reveal .orz-template-title.orz-v3 .orz-title-sub {
564
+ order: -1; margin: 0 0 0.7em;
565
+ font-size: 0.8em; font-weight: 700; font-style: normal;
566
+ text-transform: uppercase; letter-spacing: 0.22em;
567
+ color: var(--accent, #345);
568
+ }
569
+ .reveal .orz-template-title.orz-v3 .orz-title-main::after { display: none; }
570
+
571
+ /* ---------- section dividers ---------- */
572
+ .reveal .orz-template-section { text-align: left; align-items: flex-start; }
573
+ .reveal .orz-section-main {
574
+ font-family: var(--font-heading, 'Segoe UI', system-ui, sans-serif);
575
+ font-weight: 800; font-size: 2.5em; line-height: 1.1;
576
+ color: var(--ink, #1a1a1a);
577
+ border-bottom: 4px solid var(--accent, #345);
578
+ padding-bottom: 0.18em;
579
+ }
580
+ .reveal .orz-section-meta { color: var(--muted, #6b7280); margin-top: 0.6em; }
581
+
582
+ /* section — v2: centered, accent title, no rule */
583
+ .reveal .orz-template-section.orz-v2 { text-align: center; align-items: center; }
584
+ .reveal .orz-template-section.orz-v2 .orz-section-main {
585
+ border: none; font-size: 3.1em; color: var(--accent, #345);
586
+ }
587
+
588
+ /* ---------- closing (centered, tighter) ---------- */
589
+ .reveal .orz-template-closing { text-align: center; align-items: center; }
590
+ .reveal .orz-template-closing .orz-title-main { font-size: 2.2em; }
591
+ .reveal .orz-template-closing .orz-title-main::after { margin-top: 0.45em; }
592
+
593
+ /* ---------- outline (agenda list) ---------- */
594
+ .reveal .orz-template-outline { text-align: left; align-items: stretch; }
595
+ .reveal .orz-template-outline .orz-outline { font-size: 1.2em; line-height: 1.8; }
596
+ .reveal .orz-template-outline .orz-outline ol,
597
+ .reveal .orz-template-outline .orz-outline ul { padding-left: 1.2em; }
598
+
599
+ /* ==========================================================
600
+ EXTRA TEMPLATE VARIANTS (v=4…) — colored panels, borders, frames.
601
+ All use theme tokens (--accent / --surface / --rule / --ink) so they adapt
602
+ to light and dark themes.
603
+ ========================================================== */
604
+
605
+ /* title v4 — SPLIT: a bold full-height accent band on the left, title on the right */
606
+ .reveal .orz-slide:has(.orz-template-title.orz-v4) {
607
+ background: linear-gradient(90deg, var(--accent, #345) 0 34%, var(--bg, #fff) 34%);
608
+ }
609
+ .reveal .orz-template-title.orz-v4 { text-align: left; align-items: flex-start; padding-left: 40%; }
610
+ .reveal .orz-template-title.orz-v4 .orz-title-main { font-size: 3em; }
611
+ .reveal .orz-template-title.orz-v4 .orz-title-main::after { margin-left: 0; }
612
+
613
+ /* title v5 — FULL-COLOR COVER: bold background, title anchored bottom-left */
614
+ .reveal .orz-slide:has(.orz-template-title.orz-v5) { background: var(--cover-bg, var(--ink, #1a1a1a)); }
615
+ .reveal .orz-template-title.orz-v5 { text-align: left; align-items: flex-start; margin-top: auto; }
616
+ .reveal .orz-template-title.orz-v5 .orz-title-main {
617
+ color: var(--cover-ink, var(--bg, #fff)); font-size: 3.6em; line-height: 1;
618
+ }
619
+ .reveal .orz-template-title.orz-v5 .orz-title-main::after {
620
+ margin-left: 0; background: var(--cover-accent, var(--accent, #345));
621
+ }
622
+ .reveal .orz-template-title.orz-v5 .orz-title-sub { color: var(--cover-accent, var(--accent, #345)); }
623
+ .reveal .orz-template-title.orz-v5 .orz-title-meta { color: var(--cover-ink, var(--bg, #fff)); opacity: 0.72; }
624
+
625
+ /* title v6 — OVERSIZED EDITORIAL: huge left title with a kicker, bottom-anchored */
626
+ .reveal .orz-template-title.orz-v6 { text-align: left; align-items: flex-start; margin-top: auto; }
627
+ .reveal .orz-template-title.orz-v6 .orz-title-main {
628
+ font-size: 4.4em; line-height: 0.96; letter-spacing: -0.03em; font-weight: 800;
629
+ }
630
+ .reveal .orz-template-title.orz-v6 .orz-title-main::after { display: none; }
631
+ .reveal .orz-template-title.orz-v6 .orz-title-sub {
632
+ order: -1; margin: 0 0 0.35em;
633
+ text-transform: uppercase; letter-spacing: 0.22em; font-size: 0.62em;
634
+ font-weight: 700; font-style: normal; color: var(--accent, #345);
635
+ }
636
+ .reveal .orz-template-title.orz-v6 .orz-title-meta { margin-top: 0.9em; font-size: 0.8em; }
637
+
638
+ /* section v3 — surface band with a left accent bar */
639
+ .reveal .orz-template-section.orz-v3 { text-align: left; align-items: stretch; }
640
+ .reveal .orz-template-section.orz-v3 .orz-section-main {
641
+ background: var(--surface, #f4f4f4);
642
+ border: none;
643
+ border-left: 7px solid var(--accent, #345);
644
+ border-radius: 0 8px 8px 0;
645
+ padding: 0.45em 0.7em;
646
+ }
647
+
648
+ /* section v4 — outlined box */
649
+ .reveal .orz-template-section.orz-v4 { text-align: center; align-items: center; }
650
+ .reveal .orz-template-section.orz-v4 .orz-section-main {
651
+ border: 3px solid var(--accent, #345); border-bottom-width: 3px;
652
+ border-radius: 10px; padding: 0.4em 0.9em; background: transparent;
653
+ }
654
+
655
+ /* outline v2 — each item as a surface card with an accent left edge */
656
+ .reveal .orz-template-outline.orz-v2 .orz-outline ol,
657
+ .reveal .orz-template-outline.orz-v2 .orz-outline ul { list-style: none; padding-left: 0; }
658
+ .reveal .orz-template-outline.orz-v2 .orz-outline li {
659
+ background: var(--surface, #f4f4f4);
660
+ border-left: 4px solid var(--accent, #345);
661
+ border-radius: 0 8px 8px 0;
662
+ padding: 0.35em 0.7em; margin: 0.35em 0;
663
+ }
664
+
665
+ /* outline v3 — two balanced columns */
666
+ .reveal .orz-template-outline.orz-v3 .orz-outline ol,
667
+ .reveal .orz-template-outline.orz-v3 .orz-outline ul {
668
+ column-count: 2; column-gap: 2em;
669
+ }
670
+ .reveal .orz-template-outline.orz-v3 .orz-outline li { break-inside: avoid; }
671
+
672
+ /* closing v2 — FULL-COLOR COVER sign-off */
673
+ .reveal .orz-slide:has(.orz-template-closing.orz-v2) { background: var(--cover-bg, var(--ink, #1a1a1a)); }
674
+ .reveal .orz-template-closing.orz-v2 { text-align: center; align-items: center; }
675
+ .reveal .orz-template-closing.orz-v2 .orz-title-main { color: var(--cover-ink, var(--bg, #fff)); font-size: 3em; }
676
+ .reveal .orz-template-closing.orz-v2 .orz-title-main::after { background: var(--cover-accent, var(--accent, #345)); }
677
+ .reveal .orz-template-closing.orz-v2 .orz-title-meta { color: var(--cover-ink, var(--bg, #fff)); opacity: 0.85; }
678
+ .reveal .orz-template-closing.orz-v2 .orz-title-meta a,
679
+ .reveal .orz-template-closing.orz-v2 a { color: var(--cover-accent, var(--accent, #345)); }
680
+
681
+ /* closing v3 — OVERSIZED: huge thanks, bottom-left */
682
+ .reveal .orz-template-closing.orz-v3 { text-align: left; align-items: flex-start; margin-top: auto; }
683
+ .reveal .orz-template-closing.orz-v3 .orz-title-main {
684
+ font-size: 4.2em; line-height: 0.97; letter-spacing: -0.03em; font-weight: 800;
685
+ }
686
+ .reveal .orz-template-closing.orz-v3 .orz-title-main::after { margin-left: 0; }
687
+ .reveal .orz-template-closing.orz-v3 .orz-title-meta { margin-top: 0.8em; }
688
+
689
+ /* ==========================================================
690
+ orz-markdown CONTAINERS & INLINE PLUGINS
691
+ The slide base styled only plain markdown; these restore the
692
+ ::: admonitions / cols / tabs / spoiler and {{sp[...]}} spans,
693
+ using the theme's --box-* / --rule / --surface / --accent tokens.
694
+ ========================================================== */
695
+
696
+ /* ---- admonition callouts: ::: info | success | warning | danger ---- */
697
+ .reveal .markdown-body div.info,
698
+ .reveal .markdown-body div.success,
699
+ .reveal .markdown-body div.warning,
700
+ .reveal .markdown-body div.danger {
701
+ border-radius: var(--box-radius, 6px);
702
+ border-left: var(--box-border-width, 4px) solid;
703
+ box-shadow: var(--box-shadow, none);
704
+ padding: 0.5em 0.8em;
705
+ margin: 0.5em 0;
706
+ }
707
+ .reveal .markdown-body div.info { background: var(--box-info-bg, #eef4fb); border-left-color: var(--box-info, #2b6cb0); }
708
+ .reveal .markdown-body div.success { background: var(--box-success-bg, #effaf3); border-left-color: var(--box-success, #2f9e44); }
709
+ .reveal .markdown-body div.warning { background: var(--box-warning-bg, #fdf6e3); border-left-color: var(--box-warning, #d9a300); }
710
+ .reveal .markdown-body div.danger { background: var(--box-danger-bg, #fdecec); border-left-color: var(--box-danger, #e03131); }
711
+ .reveal .markdown-body div.info > :last-child,
712
+ .reveal .markdown-body div.success > :last-child,
713
+ .reveal .markdown-body div.warning > :last-child,
714
+ .reveal .markdown-body div.danger > :last-child { margin-bottom: 0; }
715
+
716
+ /* ---- inline colour spans: {{sp[red|green|blue|yellow] …}} ---- */
717
+ .reveal .markdown-body span.red { color: var(--span-red, #e03131); }
718
+ .reveal .markdown-body span.green { color: var(--span-green, #2f9e44); }
719
+ .reveal .markdown-body span.blue { color: var(--span-blue, #1971c2); }
720
+ .reveal .markdown-body span.yellow { color: var(--span-yellow, #d9a300); }
721
+
722
+ /* ---- inline badges: {{sp[success|info|warning|danger] …}} ---- */
723
+ .reveal .markdown-body span.info,
724
+ .reveal .markdown-body span.success,
725
+ .reveal .markdown-body span.warning,
726
+ .reveal .markdown-body span.danger {
727
+ display: inline-flex; align-items: center; line-height: 1; white-space: nowrap;
728
+ padding: 0.15em 0.55em; border-radius: 999px; font-size: 0.82em; font-weight: 600;
729
+ border: 1px solid;
730
+ }
731
+ .reveal .markdown-body span.info { color: var(--box-info, #2b6cb0); background: var(--box-info-bg, #eef4fb); border-color: var(--box-info, #2b6cb0); }
732
+ .reveal .markdown-body span.success { color: var(--box-success, #2f9e44); background: var(--box-success-bg, #effaf3); border-color: var(--box-success, #2f9e44); }
733
+ .reveal .markdown-body span.warning { color: var(--box-warning, #d9a300); background: var(--box-warning-bg, #fdf6e3); border-color: var(--box-warning, #d9a300); }
734
+ .reveal .markdown-body span.danger { color: var(--box-danger, #e03131); background: var(--box-danger-bg, #fdecec); border-color: var(--box-danger, #e03131); }
735
+
736
+ /* ---- alignment containers: ::: left | center | right ---- */
737
+ .reveal .markdown-body div.left { text-align: left; }
738
+ .reveal .markdown-body div.center { text-align: center; }
739
+ .reveal .markdown-body div.right { text-align: right; }
740
+
741
+ /* ---- column container: ::: cols / ::: col ---- */
742
+ .reveal .markdown-body .cols {
743
+ display: grid; gap: 0.8em; margin: 0.5em 0;
744
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
745
+ }
746
+ .reveal .markdown-body .cols > .col > :last-child { margin-bottom: 0; }
747
+
748
+ /* ---- tabs: ::: tabs / ::: tab Label (JS in browser-entry adds the bar) ---- */
749
+ .reveal .markdown-body .tabs { margin: 0.5em 0; }
750
+ .reveal .markdown-body .tabs-bar {
751
+ display: flex; flex-wrap: wrap; gap: 0.3em;
752
+ margin-bottom: 0.5em; border-bottom: 1px solid var(--rule, #ddd);
753
+ }
754
+ .reveal .markdown-body .tabs-bar-btn {
755
+ font: inherit; font-size: 0.85em; cursor: pointer;
756
+ background: transparent; border: 0; border-bottom: 2px solid transparent;
757
+ padding: 0.3em 0.7em; color: var(--muted, #777);
758
+ }
759
+ .reveal .markdown-body .tabs-bar-btn.active {
760
+ color: var(--accent, #345); border-bottom-color: var(--accent, #345); font-weight: 600;
761
+ }
762
+ .reveal .markdown-body .tabs[data-js] > .tab { display: none; }
763
+ .reveal .markdown-body .tabs[data-js] > .tab.active { display: block; }
764
+ .reveal .markdown-body .tabs:not([data-js]) > .tab { display: block; }
765
+ .reveal .markdown-body .tabs:not([data-js]) > .tab::before {
766
+ content: attr(data-label); display: block;
767
+ font-weight: 700; color: var(--accent, #345); font-size: 0.85em; margin: 0.3em 0 0.2em;
768
+ }
769
+ .reveal .markdown-body .tabs > .tab > :last-child { margin-bottom: 0; }
770
+
771
+ /* ---- spoiler: ::: spoil Title ---- */
772
+ .reveal .markdown-body details.spoil {
773
+ border: 1px solid var(--rule, #ddd); border-radius: var(--box-radius, 6px);
774
+ padding: 0.35em 0.7em; margin: 0.5em 0; background: var(--surface, #f6f6f6);
775
+ }
776
+ .reveal .markdown-body details.spoil > summary { cursor: pointer; font-weight: 600; color: var(--accent, #345); }
777
+ .reveal .markdown-body details.spoil > :not(summary) { margin-top: 0.4em; }