mdeck 2.3.0 → 3.0.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +12 -1
  2. package/README.md +9 -9
  3. package/assets/base.css +4 -1
  4. package/assets/packs/academic/pack.toml +8 -0
  5. package/assets/packs/aurora/pack.toml +8 -0
  6. package/assets/packs/lagoon/pack.toml +8 -0
  7. package/assets/packs/minimal/minimal/extension.toml +45 -0
  8. package/assets/packs/minimal/minimal/styles.css +342 -0
  9. package/assets/packs/minimal/pack.toml +8 -0
  10. package/assets/packs/minimal/paper/extension.toml +27 -0
  11. package/assets/packs/neue/pack.toml +8 -0
  12. package/docs/reference/authoring.md +13 -18
  13. package/docs/reference/claude-skill.md +1 -1
  14. package/docs/reference/extensions.md +29 -20
  15. package/docs/reference/palettes.md +8 -12
  16. package/docs/reference/themes.md +8 -7
  17. package/docs/site/content/appearance.md +33 -49
  18. package/docs/site/content/commands.md +2 -2
  19. package/docs/site/content/theme-authoring.md +1 -1
  20. package/docs/site/content/theme-repository.md +19 -15
  21. package/docs/site/examples/first-talk.md +1 -1
  22. package/docs/site/images/themes/academic-dark.webp +0 -0
  23. package/docs/site/images/themes/academic-light.webp +0 -0
  24. package/docs/site/images/themes/academic.webp +0 -0
  25. package/docs/site/images/themes/aurora-dark.webp +0 -0
  26. package/docs/site/images/themes/aurora-light.webp +0 -0
  27. package/docs/site/images/themes/aurora.webp +0 -0
  28. package/docs/site/images/themes/minimal-dark.webp +0 -0
  29. package/docs/site/images/themes/minimal-light.webp +0 -0
  30. package/docs/site/images/themes/minimal.webp +0 -0
  31. package/docs/site/images/themes/neue-dark.webp +0 -0
  32. package/docs/site/images/themes/neue-light.webp +0 -0
  33. package/docs/site/images/themes/neue.webp +0 -0
  34. package/docs/site/pages.js +1 -1
  35. package/examples/custom-layouts/slides.md +1 -1
  36. package/examples/poll/slides.md +1 -1
  37. package/examples/python/slides.md +2 -2
  38. package/examples/showcase/slides.md +3 -3
  39. package/package.json +1 -1
  40. package/skills/write-slides/SKILL.md +2 -2
  41. package/src/build/check.js +0 -7
  42. package/src/build/editorPlugin.js +19 -11
  43. package/src/build/themeCheck.js +15 -5
  44. package/src/cli/args.js +1 -1
  45. package/src/cli/index.js +3 -3
  46. package/src/cli/themes.js +93 -64
  47. package/src/core/validateDeck.js +4 -2
  48. package/src/editor/api.js +9 -1
  49. package/src/editor/components/App.jsx +4 -2
  50. package/src/editor/components/DesignApp.jsx +12 -3
  51. package/src/editor/components/ExtensionEditor.jsx +15 -4
  52. package/src/editor/components/ExtensionsPanel.jsx +19 -21
  53. package/src/editor/designLink.js +18 -1
  54. package/src/editor/sampleDeck.js +3 -1
  55. package/src/extensions/appearance.js +2 -1
  56. package/src/extensions/discover.js +56 -16
  57. package/src/extensions/installed.js +63 -0
  58. package/src/extensions/moved.js +13 -0
  59. package/src/extensions/packs.js +135 -46
  60. package/src/home/Home.jsx +12 -6
  61. package/src/layouts/layoutApi.jsx +10 -2
  62. package/src/paths.js +2 -0
  63. package/src/runtime/themeLoader.js +5 -2
  64. package/assets/extensions/palettes/brand/extension.toml +0 -29
  65. package/assets/extensions/palettes/cobalt/extension.toml +0 -27
  66. package/assets/extensions/palettes/ember/extension.toml +0 -27
  67. package/assets/extensions/palettes/forest/extension.toml +0 -27
  68. package/assets/extensions/palettes/graphite/extension.toml +0 -27
  69. package/assets/extensions/palettes/pastel/extension.toml +0 -30
  70. package/assets/extensions/palettes/phosphor/extension.toml +0 -27
  71. package/assets/extensions/palettes/terra/extension.toml +0 -27
  72. package/assets/extensions/themes/duet/extension.toml +0 -46
  73. package/assets/extensions/themes/duet/styles.css +0 -573
  74. package/assets/extensions/themes/editorial/extension.toml +0 -46
  75. package/assets/extensions/themes/editorial/styles.css +0 -574
  76. package/assets/extensions/themes/fhnw/extension.toml +0 -61
  77. package/assets/extensions/themes/fhnw/styles.css +0 -604
  78. package/assets/extensions/themes/sketch/extension.toml +0 -48
  79. package/assets/extensions/themes/sketch/styles.css +0 -633
  80. package/assets/extensions/themes/terminal/extension.toml +0 -38
  81. package/assets/extensions/themes/terminal/styles.css +0 -550
  82. package/docs/site/images/themes/duet-dark.webp +0 -0
  83. package/docs/site/images/themes/duet-light.webp +0 -0
  84. package/docs/site/images/themes/duet.webp +0 -0
  85. package/docs/site/images/themes/editorial-dark.webp +0 -0
  86. package/docs/site/images/themes/editorial-light.webp +0 -0
  87. package/docs/site/images/themes/editorial.webp +0 -0
  88. package/docs/site/images/themes/fhnw.webp +0 -0
  89. package/docs/site/images/themes/sketch-dark.webp +0 -0
  90. package/docs/site/images/themes/sketch-light.webp +0 -0
  91. package/docs/site/images/themes/sketch.webp +0 -0
  92. package/docs/site/images/themes/terminal-dark.webp +0 -0
  93. package/docs/site/images/themes/terminal-light.webp +0 -0
  94. package/docs/site/images/themes/terminal.webp +0 -0
  95. package/examples/python/.mdeck-backups/slides.drawings-2026-10-06T08-36-47Z.json +0 -19
  96. package/examples/python/.mdeck-backups/slides.drawings-2026-10-06T11-27-30Z.json +0 -6
  97. package/examples/showcase/.mdeck-backups/slides.drawings-2026-10-06T08-08-30Z.json +0 -10
  98. package/examples/showcase/.mdeck-backups/slides.drawings-2026-10-06T11-41-35Z.json +0 -13
  99. /package/assets/{extensions/themes → packs/academic}/academic/extension.toml +0 -0
  100. /package/assets/{extensions/themes → packs/academic}/academic/styles.css +0 -0
  101. /package/assets/{extensions/palettes → packs/academic}/nordic/extension.toml +0 -0
  102. /package/assets/{extensions/themes → packs/aurora}/aurora/extension.toml +0 -0
  103. /package/assets/{extensions/themes → packs/aurora}/aurora/styles.css +0 -0
  104. /package/assets/{extensions/palettes → packs/aurora}/neon/extension.toml +0 -0
  105. /package/assets/{extensions/palettes → packs/lagoon}/lagoon/extension.toml +0 -0
  106. /package/assets/{extensions/themes → packs/neue}/neue/extension.toml +0 -0
  107. /package/assets/{extensions/themes → packs/neue}/neue/styles.css +0 -0
  108. /package/assets/{extensions/palettes → packs/neue}/swiss/extension.toml +0 -0
@@ -1,604 +0,0 @@
1
- /* ─────────────────────────────────────────────
2
- FHNW THEME — templates.css
3
- Strict CD-Manual rendering: white bg, pure black ink,
4
- FHNW-yellow as the single accent. Flush-left, square
5
- corners, no gradients, no shadows. The yellow Akzentfläche
6
- is the signature compositional element.
7
- ───────────────────────────────────────────── */
8
-
9
- /* ─────────────────────────────────────────────
10
- BASE OVERRIDES
11
- ───────────────────────────────────────────── */
12
- /* CD-Manual: Inter Light default body weight */
13
- html, body { font-weight: 300; }
14
-
15
- /* ─────────────────────────────────────────────
16
- HEADER / FOOTER RAILS
17
- The brand logo lives top-LEFT, always. Section / chapter
18
- labels go top-RIGHT in the rail. The org "brand text" is
19
- hidden when a logo is supplied — the logo is the brand.
20
- ───────────────────────────────────────────── */
21
- .slide-header {
22
- min-height: 56px;
23
- font-weight: 500;
24
- letter-spacing: 0.12em;
25
- text-transform: uppercase;
26
- position: relative;
27
- z-index: 2;
28
- }
29
-
30
- /* When no logo, the org text acts as a wordmark, top-left, in display style. */
31
- .slide-header .brand {
32
- font-family: var(--font-display);
33
- font-weight: 700;
34
- font-size: 28px;
35
- letter-spacing: -0.01em;
36
- text-transform: none;
37
- color: var(--ink);
38
- }
39
- /* When a logo IS provided, hide the brand text — logo is the wordmark. */
40
- .slide-header:has(.slide-logo) .brand {
41
- visibility: hidden;
42
- width: 0;
43
- }
44
-
45
- .slide-logo {
46
- position: absolute;
47
- top: var(--pad-y);
48
- left: var(--pad-x);
49
- height: 128px;
50
- width: auto;
51
- max-width: 480px;
52
- object-fit: contain;
53
- filter: var(--logo-filter, none);
54
- transform: translateY(calc(var(--fs-eyebrow) * 0.5 - 50%));
55
- }
56
-
57
- /* Footer: a small yellow Akzentlinie (signature element) replaces the
58
- conventional hairline border-top. Rendered as a background-image
59
- so it survives DOM-to-image capture pipelines (PPTX export, html-to-image). */
60
- .slide-footer {
61
- font-family: var(--font-body);
62
- font-size: var(--fs-small);
63
- font-weight: 400;
64
- letter-spacing: 0.04em;
65
- color: var(--muted);
66
- border-top: none;
67
- padding-top: 28px;
68
- position: relative;
69
- z-index: 2;
70
- background-image: linear-gradient(var(--accent), var(--accent));
71
- background-size: 64px 6px;
72
- background-repeat: no-repeat;
73
- background-position: left top;
74
- }
75
- .slide-footer--no-meta {
76
- background-image: none;
77
- }
78
- .slide-footer > span:last-child {
79
- font-variant-numeric: tabular-nums;
80
- font-weight: 500;
81
- color: var(--ink);
82
- letter-spacing: 0;
83
- }
84
-
85
- /* ─────────────────────────────────────────────
86
- TYPOGRAPHY HELPERS
87
- ───────────────────────────────────────────── */
88
- .eyebrow {
89
- font-family: var(--font-body);
90
- font-size: var(--fs-eyebrow);
91
- font-weight: 500;
92
- letter-spacing: 0.16em;
93
- text-transform: uppercase;
94
- color: var(--muted);
95
- margin: 0 0 var(--gap-title) 0;
96
- }
97
- .display {
98
- font-family: var(--font-display);
99
- font-size: var(--fs-display);
100
- font-weight: 700;
101
- line-height: 1.0;
102
- letter-spacing: -0.025em;
103
- margin: 0;
104
- color: var(--ink);
105
- text-wrap: balance;
106
- }
107
- .title {
108
- font-family: var(--font-display);
109
- font-size: var(--fs-h);
110
- font-weight: 700;
111
- /* dito — mehrzeilige Überschrift mit Hervorhebung */
112
- line-height: 1.18;
113
- letter-spacing: -0.02em;
114
- margin: 0;
115
- color: var(--ink);
116
- text-wrap: balance;
117
- }
118
- .subtitle {
119
- font-family: var(--font-body);
120
- font-size: var(--fs-sub);
121
- font-weight: 300; /* Inter Light — CD-Manual lead-text rule */
122
- line-height: 1.25;
123
- letter-spacing: -0.005em;
124
- color: var(--ink-soft);
125
- margin: 0;
126
- text-wrap: pretty;
127
- }
128
- .body-text {
129
- font-family: var(--font-body);
130
- font-size: var(--fs-body);
131
- font-weight: 300;
132
- line-height: 1.5;
133
- color: var(--ink-soft);
134
- margin: 0;
135
- text-wrap: pretty;
136
- }
137
- .meta {
138
- font-family: var(--font-body);
139
- font-size: var(--fs-small);
140
- color: var(--muted);
141
- }
142
-
143
- /* The signature FHNW move: <em> renders as a yellow highlighter.
144
- Same effect as the link-hover sweep on www.fhnw.ch. */
145
- em {
146
- font-style: normal;
147
- background: var(--accent);
148
- color: var(--on-accent);
149
- padding: 0.04em 0.18em 0.08em;
150
- box-decoration-break: clone;
151
- -webkit-box-decoration-break: clone;
152
- }
153
-
154
- /* Inline links carry the same hover behaviour — yellow background sweep. */
155
- a {
156
- color: var(--ink);
157
- text-decoration: underline;
158
- text-underline-offset: 0.2em;
159
- text-decoration-thickness: 1px;
160
- transition: background-color 140ms cubic-bezier(0.16, 1, 0.3, 1),
161
- color 140ms cubic-bezier(0.16, 1, 0.3, 1);
162
- }
163
- a:hover { background: var(--accent); color: var(--on-accent); text-decoration: none; }
164
-
165
- ::selection { background: var(--accent); color: var(--on-accent); }
166
-
167
- /* Serif italic — testimonials and pull-quotes only (CD-Manual §2.2). */
168
- blockquote {
169
- font-family: var(--font-serif);
170
- font-style: italic;
171
- font-weight: 400;
172
- font-size: var(--fs-sub);
173
- line-height: 1.35;
174
- color: var(--ink);
175
- margin: 0;
176
- padding: 0;
177
- border: none;
178
- }
179
-
180
- /* ─────────────────────────────────────────────
181
- LAYOUT: TITLE
182
- Composition: logo top-left · subtitle on white · big H1
183
- inside a yellow Akzentfläche that bleeds to the slide edge.
184
- The slide's left padding is cancelled with negative margin
185
- so the akzentfläche touches the corner.
186
- ───────────────────────────────────────────── */
187
- .slide--title .slide-body {
188
- justify-content: flex-end;
189
- align-items: flex-start;
190
- padding-bottom: 32px;
191
- gap: 32px;
192
- }
193
- .slide--title .subtitle {
194
- font-size: var(--fs-sub);
195
- font-weight: 300;
196
- max-width: 1300px;
197
- color: var(--ink-soft);
198
- }
199
- .slide--title .display {
200
- background: var(--accent);
201
- color: var(--on-accent);
202
- display: inline-block;
203
- /* Pull left edge to the slide corner; keep interior text at pad-x. */
204
- margin-left: calc(var(--pad-x) * -1);
205
- padding: var(--akzent-pad-y) var(--akzent-pad-x) calc(var(--akzent-pad-y) + 6px) var(--pad-x);
206
- font-size: 132px;
207
- font-weight: 700;
208
- line-height: 1.0;
209
- letter-spacing: -0.03em;
210
- max-width: calc(100% + var(--pad-x));
211
- /* The akzentfläche must remain 100% opaque — no shadow, no transparency. */
212
- box-shadow: none;
213
- }
214
- /* If the slide also has a subtitle, let the akzentfläche hug content. */
215
- .slide--title .display + .subtitle {
216
- padding-left: 0;
217
- }
218
- /* TITLE + image: right-column with yellow-bordered photo */
219
- .slide--title.has-image .slide-body {
220
- display: grid;
221
- grid-template-columns: 3fr 2fr;
222
- column-gap: 0;
223
- align-items: end;
224
- }
225
- .slide--title.has-image .title-text {
226
- display: flex;
227
- flex-direction: column;
228
- gap: 32px;
229
- padding-right: 64px;
230
- }
231
- .slide--title.has-image .title-image {
232
- width: 100%;
233
- align-self: stretch;
234
- object-fit: cover;
235
- }
236
-
237
- /* ─────────────────────────────────────────────
238
- LAYOUT: CHAPTER
239
- Composition: oversized chapter numeral in black, then the
240
- yellow Akzentlinie (band) as separator, then chapter title.
241
- Flush-left, no centering.
242
- ───────────────────────────────────────────── */
243
- .slide--chapter .slide-body {
244
- justify-content: center;
245
- align-items: flex-start;
246
- }
247
- .chapter-num {
248
- display: inline-block;
249
- font-family: var(--font-display);
250
- font-size: 320px;
251
- font-weight: 700;
252
- line-height: 0.85;
253
- letter-spacing: -0.05em;
254
- color: var(--ink);
255
- margin: 0 0 40px 0;
256
- padding-bottom: 28px;
257
- border-bottom: var(--akzentlinie-h) solid var(--accent);
258
- font-variant-numeric: tabular-nums;
259
- }
260
- .chapter-meta {
261
- font-family: var(--font-body);
262
- font-size: var(--fs-eyebrow);
263
- font-weight: 500;
264
- letter-spacing: 0.16em;
265
- text-transform: uppercase;
266
- color: var(--muted);
267
- margin: 0 0 16px 0;
268
- }
269
- .chapter-title {
270
- font-family: var(--font-display);
271
- font-size: var(--fs-title);
272
- font-weight: 700;
273
- line-height: 1.05;
274
- letter-spacing: -0.03em;
275
- margin: 0 0 32px 0;
276
- color: var(--ink);
277
- max-width: 1300px;
278
- }
279
- .chapter-desc {
280
- font-family: var(--font-body);
281
- font-size: var(--fs-sub);
282
- font-weight: 300;
283
- line-height: 1.35;
284
- color: var(--ink-soft);
285
- max-width: 1100px;
286
- margin: 0;
287
- }
288
- /* CHAPTER + image: right-column layout */
289
- .slide--chapter.has-image .slide-body {
290
- display: grid;
291
- grid-template-columns: 1fr 1fr;
292
- column-gap: 80px;
293
- align-items: stretch;
294
- }
295
- .slide--chapter.has-image .chapter-content {
296
- display: flex;
297
- flex-direction: column;
298
- justify-content: center;
299
- align-items: flex-start;
300
- }
301
- .slide--chapter.has-image .chapter-image {
302
- width: 100%;
303
- height: 100%;
304
- object-fit: cover;
305
- }
306
-
307
- /* ─────────────────────────────────────────────
308
- LAYOUT: FOCUS
309
- FHNW typography is always flush-left, ragged-right. Override
310
- the framework's centred default. The statement is set in
311
- Inter Bold; any emphasised word picks up the yellow
312
- highlighter from the global <em> rule.
313
- ───────────────────────────────────────────── */
314
- .slide--focus .slide-body {
315
- justify-content: center;
316
- align-items: flex-start;
317
- text-align: left;
318
- }
319
- .focus-eyebrow {
320
- font-family: var(--font-body);
321
- font-size: var(--fs-eyebrow);
322
- font-weight: 500;
323
- letter-spacing: 0.18em;
324
- text-transform: uppercase;
325
- color: var(--muted);
326
- margin: 0 0 40px 0;
327
- padding-left: 48px;
328
- background-image: linear-gradient(var(--accent), var(--accent));
329
- background-size: 32px 6px;
330
- background-repeat: no-repeat;
331
- background-position: left 0.55em;
332
- }
333
- .focus-statement {
334
- font-family: var(--font-display);
335
- font-size: var(--fs-focus);
336
- font-weight: 700;
337
- /* Luft für den Gelbkasten von <em>: bei 1.1 schnitt er in die
338
- Unterlängen der Zeile darüber. */
339
- line-height: 1.24;
340
- letter-spacing: -0.025em;
341
- color: var(--ink);
342
- max-width: 1500px;
343
- margin: 0;
344
- text-wrap: balance;
345
- }
346
- .focus-content {
347
- display: flex;
348
- flex-direction: column;
349
- align-items: flex-start;
350
- width: 100%;
351
- text-align: left;
352
- }
353
- .focus-content h1,
354
- .focus-content p {
355
- font-family: var(--font-display);
356
- font-size: var(--fs-focus);
357
- font-weight: 700;
358
- /* Luft für den Gelbkasten von <em>: bei 1.1 schnitt er in die
359
- Unterlängen der Zeile darüber. */
360
- line-height: 1.24;
361
- letter-spacing: -0.025em;
362
- color: var(--ink);
363
- margin: 0;
364
- text-wrap: balance;
365
- text-align: left;
366
- max-width: 1500px;
367
- }
368
- .focus-content p + p,
369
- .focus-content p + h1,
370
- .focus-content h1 + p {
371
- margin-top: 24px;
372
- }
373
- .focus-attribution {
374
- font-family: var(--font-serif);
375
- font-style: italic;
376
- font-size: 28px;
377
- font-weight: 400;
378
- letter-spacing: 0;
379
- text-transform: none;
380
- color: var(--muted);
381
- margin: 56px 0 0 0;
382
- }
383
-
384
- /* ─────────────────────────────────────────────
385
- LAYOUT: IMAGE + TEXT
386
- Photography is hard-edged (square corners, no radius).
387
- Eyebrow in tracked uppercase, title in Inter Bold, body in
388
- Inter Light.
389
- ───────────────────────────────────────────── */
390
- .slide--image-text .slide-body { gap: 96px; }
391
- .image-pane {
392
- flex: 1.05;
393
- min-width: 0;
394
- display: flex;
395
- align-items: center;
396
- justify-content: center;
397
- background: var(--surface);
398
- overflow: hidden;
399
- position: relative;
400
- border-radius: 0;
401
- }
402
- .image-placeholder {
403
- width: 100%;
404
- height: 100%;
405
- background: repeating-linear-gradient(135deg,
406
- var(--surface) 0 24px,
407
- var(--rule) 24px 48px);
408
- display: flex;
409
- align-items: center;
410
- justify-content: center;
411
- }
412
- .image-placeholder span {
413
- font-family: var(--font-body);
414
- font-size: 18px;
415
- font-weight: 500;
416
- color: var(--muted);
417
- letter-spacing: 0.14em;
418
- text-transform: uppercase;
419
- background: var(--bg);
420
- padding: 12px 20px;
421
- border: 1px solid var(--rule);
422
- border-radius: 0;
423
- }
424
- .text-pane .eyebrow { margin-bottom: 12px; }
425
- .text-pane .title { font-size: 72px; font-weight: 700; }
426
- .text-pane .body-text + .body-text { margin-top: 8px; }
427
-
428
- /* ─────────────────────────────────────────────
429
- LISTS (global — any slide with a ul)
430
- FHNW-style markers: square accent tiles (matches Akzentlinie geometry).
431
- ───────────────────────────────────────────── */
432
- .slide-body ul { max-width: 1500px; }
433
- .slide-body ul li {
434
- font-weight: 300;
435
- line-height: 1.4;
436
- color: var(--ink);
437
- padding-left: 44px;
438
- background-image: linear-gradient(var(--accent), var(--accent));
439
- background-size: 18px 18px;
440
- background-repeat: no-repeat;
441
- background-position: left 0.5em;
442
- }
443
- .slide-body ul li strong,
444
- .slide-body ul li b {
445
- font-weight: 700;
446
- color: var(--ink);
447
- }
448
- .slide-body ol { max-width: 1500px; }
449
- .slide-body ol li {
450
- padding-left: 56px;
451
- font-weight: 300;
452
- line-height: 1.4;
453
- color: var(--ink);
454
- }
455
- /* Accent square badge with number */
456
- .slide-body ol li::before {
457
- content: counter(slide-ol);
458
- position: absolute;
459
- left: 0;
460
- top: 0.2em;
461
- width: 36px;
462
- height: 36px;
463
- background: var(--accent);
464
- color: var(--on-accent);
465
- font-family: var(--font-display);
466
- font-weight: 700;
467
- font-size: 0.8em;
468
- line-height: 36px;
469
- text-align: center;
470
- }
471
-
472
- /* ─────────────────────────────────────────────
473
- LAYOUT: FULL-BLEED IMAGE
474
- Photo fills the slide. Title (if any) sits inside a yellow
475
- Akzentfläche flush to the bottom-left corner — never a
476
- gradient or rgba overlay, per CD-Manual §2.4.
477
- ───────────────────────────────────────────── */
478
- /* The framework's optional dark wash is suppressed; the
479
- Akzentfläche is the only legibility layer FHNW permits. */
480
- .slide--full-bleed-image.has-overlay .slide-bg::after {
481
- display: none;
482
- }
483
- /* FHNW: no padding on full-bleed body — akzentfläche provides its own spacing */
484
- .slide--full-bleed-image .slide-body {
485
- padding: 0;
486
- align-items: flex-start;
487
- }
488
- .slide--full-bleed-image .overlay-title {
489
- font-family: var(--font-display);
490
- font-size: var(--fs-h);
491
- font-weight: 700;
492
- /* dito — mehrzeilige Überschrift mit Hervorhebung */
493
- line-height: 1.18;
494
- letter-spacing: -0.025em;
495
- color: var(--on-accent);
496
- background: var(--accent);
497
- margin: 0 0 var(--pad-y) 0;
498
- padding: var(--akzent-pad-y) var(--akzent-pad-x) calc(var(--akzent-pad-y) + 4px) var(--pad-x);
499
- max-width: 1500px;
500
- text-wrap: balance;
501
- }
502
- /* If there is NO overlay title, drop a small Akzentlinie in the
503
- corner instead — keeps the brand signature on plain photos.
504
- Rendered as a background-image for capture-pipeline robustness. */
505
- .slide--full-bleed-image:not(:has(.overlay-title)) .slide-body {
506
- background-image: linear-gradient(var(--accent), var(--accent));
507
- background-size: 240px var(--akzentlinie-h);
508
- background-repeat: no-repeat;
509
- background-position: left bottom;
510
- }
511
-
512
- /* ─────────────────────────────────────────────
513
- GENERIC / CONTENT SLIDE FALLBACK
514
- ───────────────────────────────────────────── */
515
- .slide-body h1 {
516
- font-family: var(--font-display);
517
- font-size: var(--fs-h);
518
- font-weight: 700;
519
- line-height: 1.1;
520
- letter-spacing: -0.025em;
521
- color: var(--ink);
522
- margin: 0 0 var(--gap-title) 0;
523
- }
524
- .slide-body h2 {
525
- font-family: var(--font-display);
526
- font-size: var(--fs-sub);
527
- font-weight: 600;
528
- line-height: 1.15;
529
- letter-spacing: -0.02em;
530
- color: var(--ink);
531
- margin: 0 0 var(--gap-item) 0;
532
- }
533
- .slide-body h3 {
534
- font-family: var(--font-display);
535
- font-size: 32px;
536
- font-weight: 600;
537
- letter-spacing: -0.01em;
538
- color: var(--ink);
539
- margin: 0 0 12px 0;
540
- text-decoration: underline;
541
- text-decoration-thickness: 2px;
542
- text-underline-offset: 6px;
543
- }
544
- .slide-body p {
545
- font-family: var(--font-body);
546
- font-size: var(--fs-body);
547
- font-weight: 300;
548
- line-height: 1.5;
549
- color: var(--ink-soft);
550
- margin: 0 0 var(--gap-item) 0;
551
- text-wrap: pretty;
552
- }
553
- .slide-body strong, .slide-body b { font-weight: 700; color: var(--ink); }
554
-
555
- /* Table overrides — FHNW uses smaller, lighter type with uppercase headers */
556
- .slide-body table { font-size: var(--fs-small); font-weight: 300; }
557
- .slide-body td { font-weight: 300; }
558
- .slide-body th { font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; font-size: 18px; }
559
-
560
- /* ─────────────────────────────────────────────
561
- FOOTNOTES
562
- ───────────────────────────────────────────── */
563
- .slide-footnotes { font-weight: 300; padding-top: 18px; }
564
- .slide-footnotes li { line-height: 1.45; }
565
-
566
- /* ─────────────────────────────────────────────
567
- CODE BLOCK COMPONENT
568
- FHNW is squared-off; the code block keeps the brand's
569
- yellow accent rule on the left edge but drops all corner
570
- radius and shadows.
571
- ───────────────────────────────────────────── */
572
- .code-block {
573
- --code-bg: var(--surface);
574
- --code-radius: 0;
575
- --code-size: 26px;
576
- background: var(--code-bg);
577
- border-radius: 0;
578
- border-left: 8px solid var(--accent);
579
- padding: 32px 40px;
580
- margin: 0;
581
- overflow: hidden;
582
- font-size: var(--code-size);
583
- font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
584
- line-height: 1.55;
585
- color: var(--ink);
586
- }
587
- .code-block code {
588
- font-family: inherit;
589
- font-size: inherit;
590
- background: none;
591
- padding: 0;
592
- }
593
-
594
- /* ─────────────────────────────────────────────
595
- MATH (KaTeX)
596
- ───────────────────────────────────────────── */
597
- .slide .katex-display {
598
- font-size: var(--fs-sub);
599
- margin: 40px 0;
600
- overflow-x: auto;
601
- overflow-y: hidden;
602
- text-align: left;
603
- }
604
-
@@ -1,48 +0,0 @@
1
- schema = 1
2
- kind = "theme"
3
- id = "sketch"
4
- title = "Sketch"
5
- description = "A sketchbook: Caveat and Patrick Hand on dotted paper, marker scribbles, circled numbers, sticky-note callouts and taped photos; a chalkboard in the dark."
6
- # The palette this theme uses unless the deck sets one; colours come only from palettes.
7
- palette = "pastel"
8
- fonts = [
9
- "https://fonts.googleapis.com/css2?family=Caveat:wght@500..700&family=Patrick+Hand&family=Courier+Prime:wght@400;700&display=swap",
10
- ]
11
-
12
- [files]
13
- styles = "styles.css"
14
-
15
- # Type, spacing and fonts used by styles.css; colours come from the palette.
16
- # Deck settings (params) override these.
17
- [tokens]
18
-
19
- # Type scale (px) at 1920×1080: handwriting has a small x-height, so the
20
- # sizes are larger than in the other themes.
21
- "--fs-display" = "176px"
22
- "--fs-title" = "140px"
23
- "--fs-focus" = "84px"
24
- "--fs-h" = "96px"
25
- "--fs-sub" = "44px"
26
- "--fs-body" = "38px"
27
- "--fs-small" = "27px"
28
- "--fs-eyebrow" = "32px"
29
-
30
- # Spacing
31
- "--pad-x" = "128px"
32
- "--pad-y" = "64px"
33
- "--gap-title" = "40px"
34
- "--gap-item" = "20px"
35
-
36
- # Type families
37
- "--font-display" = "\"Caveat\", \"Segoe Print\", \"Bradley Hand\", cursive"
38
- "--font-body" = "\"Patrick Hand\", \"Segoe Print\", \"Comic Sans MS\", cursive"
39
- "--font-mono" = "\"Courier Prime\", \"Courier New\", monospace"
40
-
41
- # Settings authors can change under `params:` in the deck; each points at a token above.
42
- [params.fontDisplay]
43
- token = "--font-display"
44
- title = "Display font"
45
-
46
- [params.fontBody]
47
- token = "--font-body"
48
- title = "Body font"