mdeck 3.3.0 → 3.5.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 (83) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +1 -1
  3. package/assets/base.css +23 -2
  4. package/assets/extensions/palettes/cobalt/extension.toml +30 -0
  5. package/assets/extensions/palettes/greyscale/extension.toml +57 -0
  6. package/assets/extensions/themes/academic/styles.css +18 -5
  7. package/assets/extensions/themes/glass/extension.toml +59 -0
  8. package/assets/extensions/themes/glass/styles.css +754 -0
  9. package/assets/extensions/themes/minimal/styles.css +16 -4
  10. package/assets/extensions/themes/neue/styles.css +17 -4
  11. package/assets/extensions/themes/plain/extension.toml +58 -0
  12. package/assets/extensions/themes/plain/styles.css +471 -0
  13. package/assets/extensions/themes/work/extension.toml +57 -0
  14. package/assets/extensions/themes/work/styles.css +512 -0
  15. package/docs/reference/authoring.md +50 -10
  16. package/docs/reference/palettes.md +4 -3
  17. package/docs/reference/themes.md +5 -3
  18. package/docs/site/content/appearance.md +24 -10
  19. package/docs/site/content/audience.md +49 -4
  20. package/docs/site/content/commands.md +2 -0
  21. package/docs/site/content/theme-repository.md +7 -7
  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/glass-dark.webp +0 -0
  26. package/docs/site/images/themes/glass-light.webp +0 -0
  27. package/docs/site/images/themes/glass.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/images/themes/plain-dark.webp +0 -0
  35. package/docs/site/images/themes/plain-light.webp +0 -0
  36. package/docs/site/images/themes/plain.webp +0 -0
  37. package/docs/site/images/themes/work-dark.webp +0 -0
  38. package/docs/site/images/themes/work-light.webp +0 -0
  39. package/docs/site/images/themes/work.webp +0 -0
  40. package/examples/showcase/slides.md +2 -2
  41. package/package.json +4 -1
  42. package/skills/write-slides/SKILL.md +2 -2
  43. package/src/build/bibliography.js +29 -11
  44. package/src/build/resultsPlugin.js +77 -0
  45. package/src/build/slidesPlugin.js +42 -18
  46. package/src/build/themeCheck.js +2 -1
  47. package/src/cli/args.js +2 -1
  48. package/src/cli/index.js +17 -4
  49. package/src/components/Numeric.jsx +59 -0
  50. package/src/components/Poll.jsx +72 -57
  51. package/src/components/Question.jsx +10 -6
  52. package/src/components/Scale.jsx +13 -8
  53. package/src/components/WordCloud.jsx +10 -6
  54. package/src/components/activity.jsx +88 -7
  55. package/src/components/inlineText.js +63 -0
  56. package/src/components/numbers.js +39 -0
  57. package/src/components/poll.css +26 -13
  58. package/src/core/editDeck.js +5 -6
  59. package/src/core/icons.js +2 -0
  60. package/src/core/labels.js +32 -0
  61. package/src/core/pollList.js +66 -0
  62. package/src/core/results.js +64 -0
  63. package/src/core/tags.js +195 -0
  64. package/src/editor/sampleDeck.js +34 -8
  65. package/src/extensions/discover.js +2 -2
  66. package/src/extensions/moved.js +4 -4
  67. package/src/layouts/layoutApi.jsx +24 -13
  68. package/src/live/answer/answer.css +19 -0
  69. package/src/live/answer/answer.js +147 -24
  70. package/src/live/client.js +51 -6
  71. package/src/live/roomTag.js +11 -15
  72. package/src/live/rooms.js +6 -1
  73. package/src/runtime/citations.js +15 -5
  74. package/src/runtime/ink/bus.js +7 -13
  75. package/src/runtime/main.jsx +5 -2
  76. package/src/runtime/markedSetup.js +3 -0
  77. package/src/runtime/registry.jsx +2 -0
  78. package/assets/extensions/palettes/neon/extension.toml +0 -30
  79. package/assets/extensions/themes/aurora/extension.toml +0 -40
  80. package/assets/extensions/themes/aurora/styles.css +0 -644
  81. package/docs/site/images/themes/aurora-dark.webp +0 -0
  82. package/docs/site/images/themes/aurora-light.webp +0 -0
  83. package/docs/site/images/themes/aurora.webp +0 -0
@@ -215,8 +215,8 @@ strong { color: var(--ink); font-weight: 600; }
215
215
  /* ─────────────────────────────────────────────
216
216
  LISTS — a short dash, plain numbers
217
217
  ───────────────────────────────────────────── */
218
- .slide-body ul li { line-height: 1.4; padding-left: 40px; position: relative; }
219
- .slide-body ul li::before {
218
+ .slide-body ul > li { line-height: 1.4; padding-left: 40px; position: relative; }
219
+ .slide-body ul > li::before {
220
220
  content: '';
221
221
  position: absolute;
222
222
  left: 0;
@@ -225,8 +225,8 @@ strong { color: var(--ink); font-weight: 600; }
225
225
  height: 2px;
226
226
  background: var(--muted);
227
227
  }
228
- .slide-body ol li { padding-left: 52px; position: relative; }
229
- .slide-body ol li::before {
228
+ .slide-body ol > li { padding-left: 52px; position: relative; }
229
+ .slide-body ol > li::before {
230
230
  content: counter(slide-ol) '.';
231
231
  position: absolute;
232
232
  left: 0;
@@ -340,3 +340,15 @@ strong { color: var(--ink); font-weight: 600; }
340
340
  overflow-x: auto;
341
341
  overflow-y: hidden;
342
342
  }
343
+
344
+ /* ─────────────────────────────────────────────
345
+ QUOTATIONS — a thin bar in the quiet grey, the quote set in a little,
346
+ in the softer ink
347
+ ───────────────────────────────────────────── */
348
+ .slide-body blockquote {
349
+ margin: 0 0 var(--gap-item);
350
+ padding: 2px 0 2px 28px;
351
+ border: 0;
352
+ border-left: 3px solid var(--muted);
353
+ color: var(--ink-soft);
354
+ }
@@ -336,13 +336,13 @@ strong { color: var(--ink); font-weight: 600; }
336
336
  /* ─────────────────────────────────────────────
337
337
  LISTS — square markers in the accent, numbers in the display face
338
338
  ───────────────────────────────────────────── */
339
- .slide-body ul li {
339
+ .slide-body ul > li {
340
340
  font-weight: 400;
341
341
  line-height: 1.32;
342
342
  padding-left: 44px;
343
343
  position: relative;
344
344
  }
345
- .slide-body ul li::before {
345
+ .slide-body ul > li::before {
346
346
  content: '';
347
347
  position: absolute;
348
348
  left: 0;
@@ -351,12 +351,12 @@ strong { color: var(--ink); font-weight: 600; }
351
351
  height: 14px;
352
352
  background: var(--accent);
353
353
  }
354
- .slide-body ol li {
354
+ .slide-body ol > li {
355
355
  counter-increment: slide-ol;
356
356
  padding-left: 64px;
357
357
  position: relative;
358
358
  }
359
- .slide-body ol li::before {
359
+ .slide-body ol > li::before {
360
360
  content: counter(slide-ol, decimal-leading-zero);
361
361
  position: absolute;
362
362
  left: 0;
@@ -487,3 +487,16 @@ strong { color: var(--ink); font-weight: 600; }
487
487
  overflow-x: auto;
488
488
  overflow-y: hidden;
489
489
  }
490
+
491
+ /* ─────────────────────────────────────────────
492
+ QUOTATIONS — a rule, not a box: a red bar to the left, the quote set
493
+ in a little, in the text's own size
494
+ ───────────────────────────────────────────── */
495
+ .slide-body blockquote {
496
+ margin: 0 0 var(--gap-item);
497
+ padding: 2px 0 2px 32px;
498
+ border: 0;
499
+ border-left: 6px solid var(--accent);
500
+ max-width: 1200px;
501
+ color: var(--ink);
502
+ }
@@ -0,0 +1,58 @@
1
+ schema = 1
2
+ kind = "theme"
3
+ id = "plain"
4
+ title = "Plain"
5
+ description = "Black on white and lots of room: Inter, the heading in a column of its own beside the content, lists of short titles with a line under each, the accent only in small places; in greyscale, dark is the same, inverted."
6
+ version = "0.1.0"
7
+ author = "Tilman Schieber"
8
+ license = "MIT"
9
+ # The palette this theme uses unless the deck sets one; colours come only from palettes.
10
+ # Black, white and greys: in dark, exactly the inverse.
11
+ palette = "greyscale"
12
+ fonts = [
13
+ "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,400;0,14..32,500;0,14..32,600;0,14..32,700;1,14..32,400;1,14..32,600&display=swap",
14
+ ]
15
+
16
+ [files]
17
+ styles = "styles.css"
18
+
19
+ # Type, spacing and fonts used by styles.css; colours come from the palette.
20
+ # Deck settings (params) override these. The headings are only a little
21
+ # larger than the text: the room around them does the work.
22
+ [tokens]
23
+
24
+ # Type scale (px) — projection-appropriate at 1920×1080
25
+ "--fs-display" = "88px"
26
+ "--fs-title" = "72px"
27
+ "--fs-focus" = "64px"
28
+ "--fs-h" = "52px"
29
+ "--fs-sub" = "34px"
30
+ "--fs-body" = "29px"
31
+ "--fs-small" = "19px"
32
+ "--fs-eyebrow" = "21px"
33
+
34
+ # Spacing
35
+ "--pad-x" = "128px"
36
+ "--pad-y" = "64px"
37
+ "--gap-title" = "36px"
38
+ "--gap-item" = "30px"
39
+
40
+ # How wide the column with the heading is, beside the content.
41
+ "--side" = "560px"
42
+
43
+ # Type families
44
+ "--font-display" = "\"Inter\", -apple-system, \"Segoe UI\", Helvetica, Arial, sans-serif"
45
+ "--font-body" = "\"Inter\", -apple-system, \"Segoe UI\", Helvetica, Arial, sans-serif"
46
+ "--font-mono" = "ui-monospace, \"SF Mono\", Menlo, Consolas, monospace"
47
+
48
+ [params.fontDisplay]
49
+ token = "--font-display"
50
+ title = "Display font"
51
+
52
+ [params.fontBody]
53
+ token = "--font-body"
54
+ title = "Body font"
55
+
56
+ [params.side]
57
+ token = "--side"
58
+ title = "Width of the heading column"
@@ -0,0 +1,471 @@
1
+ /* Plain — black on white and lots of room.
2
+ Nothing on the slides but the words, set in Inter: no band, no rules, no
3
+ boxes worth the name. What gives it its look is the arrangement: on a
4
+ content slide the heading stands in a column of its own at the left,
5
+ and everything else to the right of it; a statement with a label puts
6
+ the label there too, and a split slide with a heading becomes the
7
+ heading and two columns beside it. A list item that starts in bold is a
8
+ short title with a line of description under it. Headings are only a
9
+ little larger than the text. The header and the page number are small
10
+ and grey. The palette's accent shows only in small places: emphasis,
11
+ links, labels, list numbers, the edge of a callout. All colours are the
12
+ palette's; in greyscale the accent is black, and dark is the exact
13
+ inverse of light. */
14
+
15
+ /* ─────────────────────────────────────────────
16
+ HEADER / FOOTER — small and grey
17
+ ───────────────────────────────────────────── */
18
+ .slide-header, .slide-footer {
19
+ font-family: var(--font-body);
20
+ font-size: var(--fs-small);
21
+ font-weight: 500;
22
+ color: var(--muted);
23
+ min-height: 28px;
24
+ }
25
+ .slide-header .brand { color: var(--ink); font-weight: 600; }
26
+ .slide-footer > span:last-child:not(:first-child) { font-variant-numeric: tabular-nums; }
27
+ .slide-logo {
28
+ position: absolute;
29
+ top: var(--pad-y);
30
+ left: var(--pad-x);
31
+ height: 48px;
32
+ width: auto;
33
+ max-width: 280px;
34
+ object-fit: contain;
35
+ object-position: left center;
36
+ filter: var(--logo-filter, none);
37
+ transform: translateY(calc(14px - 50%));
38
+ }
39
+ .slide-header:has(.slide-logo) .brand { visibility: hidden; width: 0; }
40
+
41
+ /* ─────────────────────────────────────────────
42
+ TYPOGRAPHY
43
+ ───────────────────────────────────────────── */
44
+ .eyebrow {
45
+ font-family: var(--font-body);
46
+ font-size: var(--fs-eyebrow);
47
+ font-weight: 600;
48
+ color: var(--muted);
49
+ margin: 0;
50
+ }
51
+ .display {
52
+ font-family: var(--font-display);
53
+ font-size: var(--fs-display);
54
+ font-weight: 700;
55
+ line-height: 1.08;
56
+ letter-spacing: -0.025em;
57
+ color: var(--ink);
58
+ margin: 0;
59
+ text-wrap: balance;
60
+ }
61
+ .title {
62
+ font-family: var(--font-display);
63
+ font-size: var(--fs-h);
64
+ font-weight: 700;
65
+ line-height: 1.15;
66
+ letter-spacing: -0.02em;
67
+ color: var(--ink);
68
+ margin: 0;
69
+ text-wrap: balance;
70
+ }
71
+ .subtitle {
72
+ font-family: var(--font-body);
73
+ font-size: var(--fs-body);
74
+ font-weight: 400;
75
+ line-height: 1.4;
76
+ color: var(--ink-soft);
77
+ margin: 0;
78
+ text-wrap: pretty;
79
+ }
80
+ .body-text {
81
+ font-family: var(--font-body);
82
+ font-size: var(--fs-body);
83
+ line-height: 1.5;
84
+ color: var(--ink-soft);
85
+ margin: 0;
86
+ text-wrap: pretty;
87
+ }
88
+ .meta { font-family: var(--font-body); font-size: var(--fs-small); color: var(--muted); }
89
+
90
+ /* The palette's accent, in a few small places: emphasis, links, labels,
91
+ numbers, the edge of a callout. In greyscale it is black and grey. */
92
+ em { font-style: italic; color: var(--accent); }
93
+ strong { font-weight: 600; color: var(--ink); }
94
+ .slide a { color: var(--accent); text-decoration: underline; text-decoration-thickness: 0.06em; text-underline-offset: 0.18em; }
95
+ .slide :not(pre) > code {
96
+ font-family: var(--font-mono);
97
+ font-size: 0.86em;
98
+ padding: 0.08em 0.32em;
99
+ border-radius: 5px;
100
+ background: var(--surface);
101
+ color: var(--ink);
102
+ }
103
+
104
+ /* ─────────────────────────────────────────────
105
+ CONTENT SLIDE — the heading in a column of its own, the content beside it
106
+ ───────────────────────────────────────────── */
107
+ .slide-body h1 {
108
+ font-family: var(--font-display);
109
+ font-size: var(--fs-h);
110
+ font-weight: 700;
111
+ line-height: 1.15;
112
+ letter-spacing: -0.02em;
113
+ color: var(--ink);
114
+ margin: 0 0 var(--gap-title) 0;
115
+ text-wrap: balance;
116
+ }
117
+ .slide-body h2 {
118
+ font-family: var(--font-display);
119
+ font-size: var(--fs-sub);
120
+ font-weight: 600;
121
+ line-height: 1.25;
122
+ letter-spacing: -0.01em;
123
+ color: var(--ink);
124
+ margin: 0 0 var(--gap-item) 0;
125
+ }
126
+ .slide-body h3 {
127
+ font-family: var(--font-display);
128
+ font-size: var(--fs-body);
129
+ font-weight: 600;
130
+ color: var(--ink);
131
+ margin: 0 0 8px 0;
132
+ }
133
+ .slide-body p {
134
+ font-family: var(--font-body);
135
+ font-size: var(--fs-body);
136
+ line-height: 1.5;
137
+ color: var(--ink-soft);
138
+ margin: 0 0 var(--gap-item) 0;
139
+ text-wrap: pretty;
140
+ }
141
+
142
+ .slide:not(.slide--title, .slide--chapter, .slide--focus, .slide--image-text, .slide--split, .slide--full-bleed-image) > .slide-body:has(> h1) {
143
+ display: grid;
144
+ grid-template-columns: var(--side) minmax(0, 1fr);
145
+ column-gap: 96px;
146
+ align-content: center;
147
+ align-items: start;
148
+ }
149
+ .slide:not(.slide--title, .slide--chapter, .slide--focus, .slide--image-text, .slide--split, .slide--full-bleed-image) > .slide-body:has(> h1) > * { grid-column: 2; min-width: 0; }
150
+ /* The heading stands beside all of it, at the middle of its height. */
151
+ .slide:not(.slide--title, .slide--chapter, .slide--focus, .slide--image-text, .slide--split, .slide--full-bleed-image) > .slide-body:has(> h1) > h1 {
152
+ grid-column: 1;
153
+ grid-row: 1 / span 40;
154
+ align-self: center;
155
+ margin: 0;
156
+ padding-right: 24px;
157
+ }
158
+ .slide-body > :last-child { margin-bottom: 0; }
159
+
160
+ /* ─────────────────────────────────────────────
161
+ LISTS — a short title with a line under it; plain lines otherwise
162
+ ───────────────────────────────────────────── */
163
+ .slide-body ul > li { line-height: 1.45; padding-left: 34px; }
164
+ .slide-body ul > li::before {
165
+ content: '\2013';
166
+ position: absolute;
167
+ left: 0;
168
+ top: 0;
169
+ color: var(--muted);
170
+ }
171
+ /* An item that starts in bold: the bold part is a title on its own line,
172
+ the rest a smaller description under it, and no marker. */
173
+ .slide-body ul > li:has(> strong:first-child) {
174
+ padding-left: 0;
175
+ font-size: calc(var(--fs-body) * 0.86);
176
+ line-height: 1.45;
177
+ color: var(--ink-soft);
178
+ }
179
+ .slide-body ul > li:has(> strong:first-child)::before { content: none; }
180
+ .slide-body li > strong:first-child {
181
+ display: block;
182
+ font-size: calc(var(--fs-body) / 0.86);
183
+ font-weight: 600;
184
+ color: var(--ink);
185
+ margin-bottom: 4px;
186
+ }
187
+ .slide-body ol > li { line-height: 1.45; padding-left: 46px; }
188
+ .slide-body ol > li::before {
189
+ content: counter(slide-ol) '.';
190
+ position: absolute;
191
+ left: 0;
192
+ top: 0;
193
+ font-variant-numeric: tabular-nums;
194
+ color: var(--accent);
195
+ }
196
+ .slide-body ol > li > strong:first-child { font-size: inherit; }
197
+ .slide-body li :is(ul, ol) { font-size: calc(var(--fs-body) * 0.9); }
198
+
199
+ /* ─────────────────────────────────────────────
200
+ LAYOUT: TITLE — at the left, in the middle of the slide
201
+ ───────────────────────────────────────────── */
202
+ .slide--title .slide-body { justify-content: center; align-items: flex-start; }
203
+ .slide--title .title-text { display: flex; flex-direction: column; align-items: flex-start; max-width: 1300px; }
204
+ /* The title is an h1: as large as .display, not a content heading. */
205
+ .slide--title .display { font-size: var(--fs-display); margin: 0; }
206
+ .slide--title .subtitle { margin-top: 20px; max-width: 1100px; }
207
+ .slide--title.has-image .slide-body {
208
+ display: grid;
209
+ grid-template-columns: 1fr 1fr;
210
+ column-gap: 96px;
211
+ align-items: center;
212
+ }
213
+ .slide--title.has-image .title-image {
214
+ align-self: stretch;
215
+ width: 100%;
216
+ height: 100%;
217
+ min-height: 0;
218
+ object-fit: cover;
219
+ border-radius: 6px;
220
+ }
221
+
222
+ /* ─────────────────────────────────────────────
223
+ LAYOUT: CHAPTER — the section's title at the left, a line about it under
224
+ ───────────────────────────────────────────── */
225
+ .slide--chapter .slide-body { justify-content: center; align-items: flex-start; }
226
+ /* "Chapter 2" on one line above the title (the layout writes the number first). */
227
+ .slide--chapter .chapter-content { display: grid; grid-template-columns: auto 1fr; column-gap: 0.3em; align-items: baseline; justify-items: start; }
228
+ .slide--chapter .chapter-content > * { grid-column: 1 / -1; }
229
+ .slide--chapter .chapter-content > .chapter-meta { grid-column: 1; grid-row: 1; }
230
+ .slide--chapter .chapter-content > .chapter-num { grid-column: 2; grid-row: 1; }
231
+ .chapter-meta, .chapter-num {
232
+ font-family: var(--font-body);
233
+ font-size: var(--fs-eyebrow);
234
+ font-weight: 600;
235
+ color: var(--accent);
236
+ margin: 0 0 18px 0;
237
+ }
238
+ .slide--chapter .chapter-title {
239
+ font-family: var(--font-display);
240
+ font-size: var(--fs-title);
241
+ font-weight: 700;
242
+ line-height: 1.1;
243
+ letter-spacing: -0.025em;
244
+ color: var(--ink);
245
+ margin: 0 0 20px 0;
246
+ max-width: 1300px;
247
+ text-wrap: balance;
248
+ }
249
+ .slide--chapter .chapter-desc {
250
+ font-family: var(--font-body);
251
+ font-size: var(--fs-body);
252
+ line-height: 1.45;
253
+ color: var(--ink-soft);
254
+ max-width: 1000px;
255
+ margin: 0;
256
+ }
257
+ .slide--chapter.has-image .slide-body {
258
+ display: grid;
259
+ grid-template-columns: 1fr 1fr;
260
+ column-gap: 96px;
261
+ align-items: center;
262
+ }
263
+ .slide--chapter.has-image .chapter-title { font-size: calc(var(--fs-title) * 0.8); }
264
+ .slide--chapter.has-image .chapter-image {
265
+ align-self: stretch;
266
+ width: 100%;
267
+ height: 100%;
268
+ min-height: 0;
269
+ object-fit: cover;
270
+ border-radius: 6px;
271
+ }
272
+
273
+ /* ─────────────────────────────────────────────
274
+ LAYOUT: FOCUS — with a label, the label at the left as a heading and
275
+ the statement beside it; without one, the statement alone in the middle
276
+ ───────────────────────────────────────────── */
277
+ .slide--focus .slide-body { justify-content: center; align-items: center; text-align: center; }
278
+ .focus-content { display: flex; flex-direction: column; align-items: center; }
279
+ .focus-statement,
280
+ .slide--focus .focus-content h1,
281
+ .slide--focus .focus-content p {
282
+ font-family: var(--font-display);
283
+ font-size: var(--fs-focus);
284
+ font-weight: 700;
285
+ line-height: 1.15;
286
+ letter-spacing: -0.025em;
287
+ color: var(--ink);
288
+ max-width: 1400px;
289
+ margin: 0;
290
+ text-wrap: balance;
291
+ }
292
+ .focus-eyebrow {
293
+ font-family: var(--font-display);
294
+ font-size: var(--fs-h);
295
+ font-weight: 700;
296
+ line-height: 1.15;
297
+ letter-spacing: -0.02em;
298
+ color: var(--accent);
299
+ }
300
+ .focus-attribution {
301
+ font-family: var(--font-body);
302
+ font-size: var(--fs-body);
303
+ color: var(--muted);
304
+ margin: 28px 0 0 0;
305
+ }
306
+ .slide--focus .slide-body:has(> .focus-eyebrow) {
307
+ display: grid;
308
+ grid-template-columns: var(--side) minmax(0, 1fr);
309
+ column-gap: 96px;
310
+ align-content: center;
311
+ align-items: start;
312
+ text-align: left;
313
+ }
314
+ .slide--focus .slide-body:has(> .focus-eyebrow) > * { grid-column: 2; }
315
+ .slide--focus .slide-body:has(> .focus-eyebrow) > .focus-eyebrow { grid-column: 1; grid-row: 1 / span 2; align-self: center; padding-right: 24px; }
316
+ .slide--focus .slide-body:has(> .focus-eyebrow) .focus-content { align-items: flex-start; }
317
+ .slide--focus .slide-body:has(> .focus-eyebrow) :is(.focus-statement, .focus-content h1, .focus-content p) {
318
+ font-family: var(--font-body);
319
+ font-size: var(--fs-sub);
320
+ font-weight: 400;
321
+ line-height: 1.4;
322
+ letter-spacing: -0.005em;
323
+ max-width: 900px;
324
+ text-align: left;
325
+ }
326
+
327
+ /* ─────────────────────────────────────────────
328
+ LAYOUT: IMAGE + TEXT
329
+ ───────────────────────────────────────────── */
330
+ .slide--image-text .slide-body { gap: 96px; }
331
+ .image-pane {
332
+ flex: 1.1;
333
+ min-width: 0;
334
+ display: flex;
335
+ align-items: center;
336
+ justify-content: center;
337
+ overflow: hidden;
338
+ position: relative;
339
+ background: var(--surface);
340
+ border-radius: 6px;
341
+ }
342
+ .image-placeholder {
343
+ width: 100%;
344
+ height: 100%;
345
+ background: repeating-linear-gradient(135deg, var(--surface) 0 22px, var(--bg) 22px 44px);
346
+ }
347
+ .image-placeholder span {
348
+ font-family: var(--font-body);
349
+ font-size: 20px;
350
+ color: var(--muted);
351
+ background: var(--bg);
352
+ padding: 10px 16px;
353
+ border-radius: 6px;
354
+ }
355
+ .text-pane .title { font-size: var(--fs-h); }
356
+ .text-pane .eyebrow { margin-bottom: -8px; }
357
+ .text-pane .body-text + .body-text { margin-top: 8px; }
358
+
359
+ /* ─────────────────────────────────────────────
360
+ LAYOUT: SPLIT — with a heading: the heading at the left, two columns
361
+ beside it
362
+ ───────────────────────────────────────────── */
363
+ .split-columns { gap: 64px; }
364
+ .slide--split .slide-body:has(> .split-heading) {
365
+ display: grid;
366
+ /* A narrower heading column: two columns of content need the room. */
367
+ grid-template-columns: calc(var(--side) * 0.72) minmax(0, 1fr);
368
+ column-gap: 80px;
369
+ align-items: center;
370
+ }
371
+ .slide--split .split-heading { margin: 0; padding-right: 24px; }
372
+ .slide--split .split-heading h1 { margin: 0; }
373
+ .slide--split .slide-body:has(> .split-heading) .split-columns { align-self: stretch; }
374
+
375
+ /* ─────────────────────────────────────────────
376
+ LAYOUT: FULL-BLEED IMAGE — the title in white at the lower left
377
+ ───────────────────────────────────────────── */
378
+ .slide--full-bleed-image .slide-body { align-items: flex-start; }
379
+ .slide--full-bleed-image.has-overlay .slide-bg::after {
380
+ content: '';
381
+ position: absolute;
382
+ inset: 0;
383
+ background: linear-gradient(to top, color-mix(in oklab, light-dark(var(--ink), var(--bg)) 55%, transparent), transparent 55%);
384
+ }
385
+ .slide--full-bleed-image .overlay-title {
386
+ font-family: var(--font-display);
387
+ font-size: var(--fs-h);
388
+ font-weight: 700;
389
+ line-height: 1.15;
390
+ letter-spacing: -0.02em;
391
+ color: light-dark(var(--bg), var(--ink));
392
+ text-shadow: 0 1px 18px color-mix(in oklab, light-dark(var(--ink), var(--bg)) 40%, transparent);
393
+ margin: 0;
394
+ max-width: 1300px;
395
+ text-wrap: balance;
396
+ }
397
+
398
+ /* ─────────────────────────────────────────────
399
+ CALLOUTS — a quiet grey field with a thin edge in the accent, the
400
+ title in bold; warnings in their own colour
401
+ ───────────────────────────────────────────── */
402
+ .slide-body .callout {
403
+ background: var(--surface);
404
+ border: 0;
405
+ border-left: 3px solid var(--accent);
406
+ border-radius: 0 8px 8px 0;
407
+ padding: 20px 28px 22px;
408
+ margin: 0 0 16px;
409
+ }
410
+ .slide-body .callout-title {
411
+ font-family: var(--font-body);
412
+ font-size: var(--fs-body);
413
+ font-weight: 600;
414
+ letter-spacing: 0;
415
+ text-transform: none;
416
+ color: var(--ink);
417
+ margin: 0 0 4px 0;
418
+ }
419
+ .slide-body .callout p { padding-left: 0; margin: 0; color: var(--ink-soft); }
420
+ .slide-body .callout :is(.callout-title) { color: var(--ink); }
421
+ .slide-body .callout:is(.callout-warning, .callout-caution) { border-left-color: var(--callout-warning); }
422
+ .slide-body .callout.callout-caution { border-left-color: var(--callout-caution); }
423
+ .slide-body .callout.callout-proof { background: none; border: 0; padding: 0; }
424
+
425
+ /* ─────────────────────────────────────────────
426
+ CODE, TABLES, QUOTATIONS
427
+ ───────────────────────────────────────────── */
428
+ .code-block {
429
+ --code-bg: var(--surface);
430
+ --code-radius: 8px;
431
+ background: var(--code-bg);
432
+ border-radius: var(--code-radius);
433
+ padding: 26px 32px;
434
+ margin: 0;
435
+ overflow: hidden;
436
+ font-family: var(--font-mono);
437
+ font-size: var(--code-size);
438
+ line-height: 1.6;
439
+ }
440
+ /* The size is set on the slide, so the split layout's smaller code (on its
441
+ columns) reaches the block. */
442
+ .slide { --code-size: 24px; }
443
+ .slide--split .code-block { padding: 22px 26px; }
444
+ .code-block code { font-family: inherit; font-size: inherit; background: none; padding: 0; }
445
+ .slide-body .code-block-wrapper { margin: 0 0 var(--gap-item); }
446
+
447
+ .slide-body table { font-size: calc(var(--fs-body) * 0.9); font-variant-numeric: tabular-nums; }
448
+ .slide-body :is(th, td) { padding: 12px 24px 12px 0; }
449
+ .slide-body th { font-weight: 600; color: var(--ink); border-bottom: 1px solid var(--ink); }
450
+ .slide-body td { border-bottom: 1px solid var(--rule); }
451
+
452
+ /* A quotation is just larger text, with nothing round it. */
453
+ .slide-body blockquote {
454
+ margin: 0 0 var(--gap-item);
455
+ padding: 0;
456
+ border: 0;
457
+ font-size: var(--fs-sub);
458
+ font-weight: 500;
459
+ line-height: 1.35;
460
+ letter-spacing: -0.01em;
461
+ color: var(--ink);
462
+ }
463
+
464
+ /* ─────────────────────────────────────────────
465
+ FOOTNOTES, MATH, AUDIENCE QUESTIONS
466
+ ───────────────────────────────────────────── */
467
+ .slide-footnotes, .slide-citations { font-family: var(--font-body); }
468
+ .slide .katex-display { font-size: var(--fs-sub); margin: 24px 0; overflow-x: auto; overflow-y: hidden; text-align: left; }
469
+ .slide .poll-track, .slide .scale-track { border-radius: 4px; background: var(--surface); }
470
+ .slide .poll-fill, .slide .scale-fill { border-radius: 4px; background: var(--accent); }
471
+ .slide .question-cards li { border-radius: 8px; border-left: 0; background: var(--surface); }
@@ -0,0 +1,57 @@
1
+ schema = 1
2
+ kind = "theme"
3
+ id = "work"
4
+ title = "Work"
5
+ description = "An everyday company template: IBM Plex Sans, an accent band along the top, the logo top left, headings in a fixed place, section dividers with a large number in the accent, a quiet footer with the page number."
6
+ version = "0.1.0"
7
+ author = "Tilman Schieber"
8
+ license = "MIT"
9
+ # The palette this theme uses unless the deck sets one; colours come only from palettes.
10
+ # A company blue with an orange second accent; any palette makes it your company's.
11
+ palette = "cobalt"
12
+ fonts = [
13
+ "https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400;1,500&family=IBM+Plex+Mono:wght@400;500&display=swap",
14
+ ]
15
+
16
+ [files]
17
+ styles = "styles.css"
18
+
19
+ # Type, spacing and fonts used by styles.css; colours come from the palette.
20
+ # Deck settings (params) override these.
21
+ [tokens]
22
+
23
+ # Type scale (px) — projection-appropriate at 1920×1080
24
+ "--fs-display" = "116px"
25
+ "--fs-title" = "100px"
26
+ "--fs-focus" = "72px"
27
+ "--fs-h" = "60px"
28
+ "--fs-sub" = "38px"
29
+ "--fs-body" = "31px"
30
+ "--fs-small" = "22px"
31
+ "--fs-eyebrow" = "22px"
32
+
33
+ # Spacing
34
+ "--pad-x" = "112px"
35
+ "--pad-y" = "64px"
36
+ "--gap-title" = "44px"
37
+ "--gap-item" = "20px"
38
+
39
+ # The accent band along the top of every slide.
40
+ "--band" = "14px"
41
+
42
+ # Type families
43
+ "--font-display" = "\"IBM Plex Sans\", \"Helvetica Neue\", Arial, sans-serif"
44
+ "--font-body" = "\"IBM Plex Sans\", \"Helvetica Neue\", Arial, sans-serif"
45
+ "--font-mono" = "\"IBM Plex Mono\", ui-monospace, Menlo, Consolas, monospace"
46
+
47
+ [params.fontDisplay]
48
+ token = "--font-display"
49
+ title = "Display font"
50
+
51
+ [params.fontBody]
52
+ token = "--font-body"
53
+ title = "Body font"
54
+
55
+ [params.band]
56
+ token = "--band"
57
+ title = "Height of the band along the top (0px for none)"