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.
- package/CHANGELOG.md +25 -0
- package/README.md +1 -1
- package/assets/base.css +23 -2
- package/assets/extensions/palettes/cobalt/extension.toml +30 -0
- package/assets/extensions/palettes/greyscale/extension.toml +57 -0
- package/assets/extensions/themes/academic/styles.css +18 -5
- package/assets/extensions/themes/glass/extension.toml +59 -0
- package/assets/extensions/themes/glass/styles.css +754 -0
- package/assets/extensions/themes/minimal/styles.css +16 -4
- package/assets/extensions/themes/neue/styles.css +17 -4
- package/assets/extensions/themes/plain/extension.toml +58 -0
- package/assets/extensions/themes/plain/styles.css +471 -0
- package/assets/extensions/themes/work/extension.toml +57 -0
- package/assets/extensions/themes/work/styles.css +512 -0
- package/docs/reference/authoring.md +50 -10
- package/docs/reference/palettes.md +4 -3
- package/docs/reference/themes.md +5 -3
- package/docs/site/content/appearance.md +24 -10
- package/docs/site/content/audience.md +49 -4
- package/docs/site/content/commands.md +2 -0
- package/docs/site/content/theme-repository.md +7 -7
- package/docs/site/images/themes/academic-dark.webp +0 -0
- package/docs/site/images/themes/academic-light.webp +0 -0
- package/docs/site/images/themes/academic.webp +0 -0
- package/docs/site/images/themes/glass-dark.webp +0 -0
- package/docs/site/images/themes/glass-light.webp +0 -0
- package/docs/site/images/themes/glass.webp +0 -0
- package/docs/site/images/themes/minimal-dark.webp +0 -0
- package/docs/site/images/themes/minimal-light.webp +0 -0
- package/docs/site/images/themes/minimal.webp +0 -0
- package/docs/site/images/themes/neue-dark.webp +0 -0
- package/docs/site/images/themes/neue-light.webp +0 -0
- package/docs/site/images/themes/neue.webp +0 -0
- package/docs/site/images/themes/plain-dark.webp +0 -0
- package/docs/site/images/themes/plain-light.webp +0 -0
- package/docs/site/images/themes/plain.webp +0 -0
- package/docs/site/images/themes/work-dark.webp +0 -0
- package/docs/site/images/themes/work-light.webp +0 -0
- package/docs/site/images/themes/work.webp +0 -0
- package/examples/showcase/slides.md +2 -2
- package/package.json +4 -1
- package/skills/write-slides/SKILL.md +2 -2
- package/src/build/bibliography.js +29 -11
- package/src/build/resultsPlugin.js +77 -0
- package/src/build/slidesPlugin.js +42 -18
- package/src/build/themeCheck.js +2 -1
- package/src/cli/args.js +2 -1
- package/src/cli/index.js +17 -4
- package/src/components/Numeric.jsx +59 -0
- package/src/components/Poll.jsx +72 -57
- package/src/components/Question.jsx +10 -6
- package/src/components/Scale.jsx +13 -8
- package/src/components/WordCloud.jsx +10 -6
- package/src/components/activity.jsx +88 -7
- package/src/components/inlineText.js +63 -0
- package/src/components/numbers.js +39 -0
- package/src/components/poll.css +26 -13
- package/src/core/editDeck.js +5 -6
- package/src/core/icons.js +2 -0
- package/src/core/labels.js +32 -0
- package/src/core/pollList.js +66 -0
- package/src/core/results.js +64 -0
- package/src/core/tags.js +195 -0
- package/src/editor/sampleDeck.js +34 -8
- package/src/extensions/discover.js +2 -2
- package/src/extensions/moved.js +4 -4
- package/src/layouts/layoutApi.jsx +24 -13
- package/src/live/answer/answer.css +19 -0
- package/src/live/answer/answer.js +147 -24
- package/src/live/client.js +51 -6
- package/src/live/roomTag.js +11 -15
- package/src/live/rooms.js +6 -1
- package/src/runtime/citations.js +15 -5
- package/src/runtime/ink/bus.js +7 -13
- package/src/runtime/main.jsx +5 -2
- package/src/runtime/markedSetup.js +3 -0
- package/src/runtime/registry.jsx +2 -0
- package/assets/extensions/palettes/neon/extension.toml +0 -30
- package/assets/extensions/themes/aurora/extension.toml +0 -40
- package/assets/extensions/themes/aurora/styles.css +0 -644
- package/docs/site/images/themes/aurora-dark.webp +0 -0
- package/docs/site/images/themes/aurora-light.webp +0 -0
- 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)"
|