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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.5.0 — 2026-10-09
|
|
4
|
+
|
|
5
|
+
- mdeck now comes with six themes: `neue` (still the default), `academic` and `minimal` as before, and new among them `plain` (black on white, the heading in a column beside the content), `work` (an everyday company template with an accent band, the logo and numbered sections) and `glass` (liquid glass, dark by default). The palettes `greyscale` (`plain`'s) and `cobalt` (`work`'s) come with it too. `aurora` and its palette `neon` moved to the theme repository: a deck that uses them is told to run `mdeck themes install aurora`; files made with `mdeck send` or `mdeck build` keep working, because they carry their theme. The tour example now uses `glass`.
|
|
6
|
+
- Tags in a deck are found the way the slide finds them, everywhere mdeck looks for them: the phones, `--no-polls`, the pictures and videos a build takes along. A `>` in a quoted value no longer cuts a tag short there either (`<qrcode label="a > b" join />`, `<img alt="a > b" src="…">`), and a tag that a blank line cuts in two is no activity for the phones when the slide does not show it.
|
|
7
|
+
- Fixed: a bar inside `code`, a [link](…) or a picture in a poll's options split the option in two. Only bars outside them, and outside formulas, separate options.
|
|
8
|
+
- A poll's options may be a list inside the tag, one item each, with `[x]` for a right answer: `<poll room="d">` then `- [x] $2x$`, `- [ ] $x^2$` and `</poll>`. Nothing needs escaping, and long options read better than in one attribute.
|
|
9
|
+
- Fixed: text after an activity written `<poll … />` (or any component closed with `/>`) went missing from the slide, as did another activity right after it. What follows an activity or a join code now has room above it in every theme.
|
|
10
|
+
|
|
11
|
+
## 3.4.0 — 2026-10-08
|
|
12
|
+
|
|
13
|
+
- What follows a list has room above it in every theme, so a sentence after a list no longer sits right against its last item.
|
|
14
|
+
- Fixed: a bullet list inside a numbered list took numbers too, and in some themes the number sat on top of the bullet; it also pushed the numbering of the items after it. Every built-in theme now styles only a list's own items.
|
|
15
|
+
- A list inside a list item has room above it, as much as between its own items and less than between the outer ones, instead of sitting right against its item. Themes with their own spacing for nested lists keep it.
|
|
16
|
+
- Links and quotations look the part in every theme: links take the palette's accent colour instead of the browser's blue, and a `> quotation` is set in each theme's own way instead of as a bare indent: academic as an indented serif quotation, aurora with a quotation mark in its gradient, minimal and neue with a bar at its side (grey and red). A quotation's paragraphs now take the quotation's type, which themes that set every paragraph's font used to undo.
|
|
17
|
+
- The sample deck, on which `mdeck design`, the theme gallery and the theme checks show every theme, now also has a link, a quotation, a bullet list inside a numbered list, citations with their references at the foot of the slide, and a reference list.
|
|
18
|
+
- A poll's question and options may use Markdown and `$…$` maths, as on a slide: `options="$2x$|$x^2$|$\frac{x^3}{3}$"`. The slide draws them with KaTeX, the phones' answer page as MathML, which needs no fonts or scripts there; it keeps only text, emphasis and MathML from what the presenter's screen sends. A `|` inside a formula belongs to it (`$|x|$`), and `\|` is a bar in the text. Votes and `answer` still use the text as written. The same goes for the `question` of every activity (`<scale>`, `<question>`, `<wordcloud>`) and the scale's `low` and `high` labels. An answer page from an older `mdeck server` shows the source text.
|
|
19
|
+
- Fixed: the phones' answer page showed the word “null” below the question when there was no link for following the slides.
|
|
20
|
+
- Every activity has a lock button that closes it: answers after that do not count, and the phones say it is closed until it opens again. Together with the eye (`results="hidden"`) and the tick this makes a peer-instruction round: vote, close, show the bars, discuss, show the answer.
|
|
21
|
+
- Showing a poll's right answer also tells each phone whether its vote was right, or what the right answer is. The lock, the eye and the tick are kept in the activity room's state on the server, so every screen of the talk and the phones follow them, also after a reload.
|
|
22
|
+
- Polls, scales and numbers count “12 of 31 answered” while phones are connected.
|
|
23
|
+
- `multiple` lets each phone pick several options of a poll; the slide and the phones say so. `buttons="letters"` (or `"numbers"`) puts A, B, C before the options on the slide and shows only those on the phones, for options that are pictures or long formulas.
|
|
24
|
+
- New activity `<numeric>`: phones type a number (`0.5`, `0,5`, `1/2`), the slide shows the most frequent answers as bars. `answer` and `tolerance` mark the right ones and tell each phone whether it was right.
|
|
25
|
+
- The answers of a talk are kept beside the deck in `<slides>.results.json` while `mdeck run` runs: anonymous, phones numbered per question. Builds, `mdeck send` and `mdeck pdf` show them as the record of the talk (`--no-results` leaves them out), and `mdeck results` prints them as CSV.
|
|
26
|
+
- Fixed: a `>` or `<` in an activity's attributes (`question="Is $x > 0$?"`) cut its tag short, and the phones lost the options. Pictures in a tag's attributes, such as a poll's options, are now copied into folder builds.
|
|
27
|
+
|
|
3
28
|
## 3.3.0 — 2026-10-08
|
|
4
29
|
|
|
5
30
|
- Citations and references: `bibliography: refs.bib` in the deck settings, then cite in Pandoc's syntax, `[@smith2020, p. 12]`, `[see @a; @b]`, `[-@a]` or `@smith2020` in a sentence. Each citation shows in the style's short form, each slide lists the full references of the works it cites above its footer (`show.citations: false` leaves them out), and `<bibliography />` lists them all on a slide (`part="1/2"` splits a long list). Reference files may be BibTeX (`.bib`), CSL-JSON (`.json`) or Hayagriva (`.yml`, Typst's format), several at once. `csl:` picks the style, `apa` by default, `vancouver`, `harvard1` or any `.csl` file; the style's words follow `lang`. `nocite:` lists works without citing them. Formatting happens at build time, so a deck carries only the finished text. Unknown keys are marked on the slide and reported by `mdeck check`.
|
package/README.md
CHANGED
|
@@ -143,7 +143,7 @@ complete folder.
|
|
|
143
143
|
|
|
144
144
|
| Example | Theme | What it demonstrates |
|
|
145
145
|
|---|---|---|
|
|
146
|
-
| [Tour](examples/showcase/slides.md) |
|
|
146
|
+
| [Tour](examples/showcase/slides.md) | Glass | Start here: each slide shows the Markdown beside what it becomes, from headings to layouts, live code, notes, drawing, a poll and sharing |
|
|
147
147
|
| [Python](examples/python/slides.md) | Academic | A real lesson: live code to try out, points revealed step by step, notes on every slide, a poll to check understanding |
|
|
148
148
|
| [Poll](examples/poll/slides.md) | Neue | A join slide, then a poll, a scale, a word cloud and open questions; start it with `mdeck run slides.md --network` |
|
|
149
149
|
| [Custom layouts](examples/custom-layouts/slides.md) | Neue | A deck-local comparison design and named regions |
|
package/assets/base.css
CHANGED
|
@@ -105,7 +105,10 @@ deck-stage[data-ink-hidden] .slide-ink { display: none; }
|
|
|
105
105
|
.split-right { flex: 1; min-width: 0; display: flex; flex-direction: column; justify-content: safe center; gap: var(--gap-item); }
|
|
106
106
|
|
|
107
107
|
/* ── List containers ─────────────────────────────────────────────────────── */
|
|
108
|
+
/* Lists have no margins of their own, and paragraphs only one below them, so
|
|
109
|
+
whatever follows a list needs room above it. */
|
|
108
110
|
.slide-body :is(ul, ol) + :is(ul, ol) { margin-top: var(--gap-item); }
|
|
111
|
+
.slide-body :is(ul, ol) + :not(ul, ol) { margin-top: var(--gap-item); }
|
|
109
112
|
/* Markers (::before), padding, and font styling are visual — defined per theme */
|
|
110
113
|
.slide-body ul {
|
|
111
114
|
list-style: none;
|
|
@@ -115,7 +118,7 @@ deck-stage[data-ink-hidden] .slide-ink { display: none; }
|
|
|
115
118
|
flex-direction: column;
|
|
116
119
|
gap: var(--gap-item);
|
|
117
120
|
}
|
|
118
|
-
.slide-body ul li { position: relative; }
|
|
121
|
+
.slide-body ul > li { position: relative; }
|
|
119
122
|
.slide-body ol {
|
|
120
123
|
list-style: none;
|
|
121
124
|
padding: 0;
|
|
@@ -125,7 +128,10 @@ deck-stage[data-ink-hidden] .slide-ink { display: none; }
|
|
|
125
128
|
flex-direction: column;
|
|
126
129
|
gap: var(--gap-item);
|
|
127
130
|
}
|
|
128
|
-
.slide-body ol li { counter-increment: slide-ol; position: relative; }
|
|
131
|
+
.slide-body ol > li { counter-increment: slide-ol; position: relative; }
|
|
132
|
+
/* A list inside an item: closer to its item than items are to each other,
|
|
133
|
+
and as close inside. Themes with their own (same selector) win. */
|
|
134
|
+
.slide-body li :is(ul, ol) { margin-top: calc(var(--gap-item) * 0.5); gap: calc(var(--gap-item) * 0.5); }
|
|
129
135
|
|
|
130
136
|
/* ── Full-bleed image ────────────────────────────────────────────────────── */
|
|
131
137
|
.slide--full-bleed-image { padding: 0; }
|
|
@@ -159,6 +165,21 @@ deck-stage[data-ink-hidden] .slide-ink { display: none; }
|
|
|
159
165
|
.slide-footnotes p { margin: 0; }
|
|
160
166
|
.slide-footnotes .footnote-backref { display: none; }
|
|
161
167
|
|
|
168
|
+
/* ── Links and quotations ───────────────────────────────────────────────── */
|
|
169
|
+
/* Defaults in the palette's colours instead of the browser's blue and a bare
|
|
170
|
+
indent. :where keeps them weaker than any rule of the theme's own. */
|
|
171
|
+
:where(.slide) a { color: var(--accent); text-underline-offset: 0.15em; text-decoration-thickness: 0.06em; }
|
|
172
|
+
:where(.slide) blockquote {
|
|
173
|
+
margin: 0 0 var(--gap-item);
|
|
174
|
+
padding-left: 0.9em;
|
|
175
|
+
border-left: 4px solid var(--accent);
|
|
176
|
+
color: var(--ink-soft);
|
|
177
|
+
}
|
|
178
|
+
:where(.slide) blockquote > p:last-child { margin-bottom: 0; }
|
|
179
|
+
/* The quote's paragraphs take its type: themes set the face and size of
|
|
180
|
+
every paragraph, which would undo a quote set in its own. */
|
|
181
|
+
.slide-body blockquote > p { font: inherit; color: inherit; letter-spacing: inherit; }
|
|
182
|
+
|
|
162
183
|
/* ── Code blocks ─────────────────────────────────────────────────────────── */
|
|
163
184
|
.code-block { white-space: pre-wrap; overflow-x: hidden; }
|
|
164
185
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
schema = 1
|
|
2
|
+
kind = "palette"
|
|
3
|
+
id = "cobalt"
|
|
4
|
+
title = "Cobalt"
|
|
5
|
+
description = "Strong ultramarine on white, with vivid orange; bold and clear."
|
|
6
|
+
version = "1.0.0"
|
|
7
|
+
author = "Tilman Schieber"
|
|
8
|
+
license = "MIT"
|
|
9
|
+
|
|
10
|
+
[light]
|
|
11
|
+
"--bg" = "#ffffff"
|
|
12
|
+
"--surface" = "#eef1fb"
|
|
13
|
+
"--ink" = "#0c1033"
|
|
14
|
+
"--ink-soft" = "#2a2f55"
|
|
15
|
+
"--muted" = "#5b6080"
|
|
16
|
+
"--rule" = "#d5dbf0"
|
|
17
|
+
"--accent" = "#1f3fd1"
|
|
18
|
+
"--accent-2" = "#e8590c"
|
|
19
|
+
"--on-accent" = "#ffffff"
|
|
20
|
+
|
|
21
|
+
[dark]
|
|
22
|
+
"--bg" = "#0a1030"
|
|
23
|
+
"--surface" = "#121a44"
|
|
24
|
+
"--ink" = "#eef1ff"
|
|
25
|
+
"--ink-soft" = "#c9cff0"
|
|
26
|
+
"--muted" = "#8e97c4"
|
|
27
|
+
"--rule" = "#212b5e"
|
|
28
|
+
"--accent" = "#6f8cff"
|
|
29
|
+
"--accent-2" = "#ff922b"
|
|
30
|
+
"--on-accent" = "#0a1030"
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
schema = 1
|
|
2
|
+
kind = "palette"
|
|
3
|
+
id = "greyscale"
|
|
4
|
+
title = "Greyscale"
|
|
5
|
+
description = "Black, white and greys only, code and callouts too: for printing and for a quiet look."
|
|
6
|
+
version = "1.0.0"
|
|
7
|
+
author = "Tilman Schieber"
|
|
8
|
+
license = "MIT"
|
|
9
|
+
|
|
10
|
+
# No colour anywhere: emphasis is black against the softer body text, the
|
|
11
|
+
# second accent a mid grey; code and callouts use greys instead of their
|
|
12
|
+
# usual colours.
|
|
13
|
+
[light]
|
|
14
|
+
"--bg" = "#ffffff"
|
|
15
|
+
"--surface" = "#f0f0f0"
|
|
16
|
+
"--ink" = "#141414"
|
|
17
|
+
"--ink-soft" = "#363636"
|
|
18
|
+
"--muted" = "#606060"
|
|
19
|
+
"--rule" = "#d4d4d4"
|
|
20
|
+
"--accent" = "#000000"
|
|
21
|
+
"--accent-2" = "#6e6e6e"
|
|
22
|
+
"--on-accent" = "#ffffff"
|
|
23
|
+
"--token-default" = "#141414"
|
|
24
|
+
"--token-comment" = "#6b6b6b"
|
|
25
|
+
"--token-string" = "#454545"
|
|
26
|
+
"--token-number" = "#000000"
|
|
27
|
+
"--token-keyword" = "#000000"
|
|
28
|
+
"--token-function" = "#2a2a2a"
|
|
29
|
+
"--token-operator" = "#555555"
|
|
30
|
+
"--callout-note" = "#4a4a4a"
|
|
31
|
+
"--callout-tip" = "#4a4a4a"
|
|
32
|
+
"--callout-important" = "#000000"
|
|
33
|
+
"--callout-warning" = "#7a7a7a"
|
|
34
|
+
"--callout-caution" = "#000000"
|
|
35
|
+
|
|
36
|
+
[dark]
|
|
37
|
+
"--bg" = "#121212"
|
|
38
|
+
"--surface" = "#1f1f1f"
|
|
39
|
+
"--ink" = "#f2f2f2"
|
|
40
|
+
"--ink-soft" = "#d0d0d0"
|
|
41
|
+
"--muted" = "#9c9c9c"
|
|
42
|
+
"--rule" = "#303030"
|
|
43
|
+
"--accent" = "#ffffff"
|
|
44
|
+
"--accent-2" = "#a6a6a6"
|
|
45
|
+
"--on-accent" = "#121212"
|
|
46
|
+
"--token-default" = "#f2f2f2"
|
|
47
|
+
"--token-comment" = "#9a9a9a"
|
|
48
|
+
"--token-string" = "#c4c4c4"
|
|
49
|
+
"--token-number" = "#ffffff"
|
|
50
|
+
"--token-keyword" = "#ffffff"
|
|
51
|
+
"--token-function" = "#e0e0e0"
|
|
52
|
+
"--token-operator" = "#b0b0b0"
|
|
53
|
+
"--callout-note" = "#b8b8b8"
|
|
54
|
+
"--callout-tip" = "#b8b8b8"
|
|
55
|
+
"--callout-important" = "#ffffff"
|
|
56
|
+
"--callout-warning" = "#8c8c8c"
|
|
57
|
+
"--callout-caution" = "#ffffff"
|
|
@@ -180,12 +180,12 @@ strong { color: var(--ink); font-weight: 700; }
|
|
|
180
180
|
the text size, so long lists stay compact
|
|
181
181
|
───────────────────────────────────────────── */
|
|
182
182
|
.slide-body ul, .slide-body ol { max-width: 1560px; }
|
|
183
|
-
.slide-body ul li,
|
|
184
|
-
.slide-body ol li {
|
|
183
|
+
.slide-body ul > li,
|
|
184
|
+
.slide-body ol > li {
|
|
185
185
|
line-height: 1.45;
|
|
186
186
|
padding-left: 44px;
|
|
187
187
|
}
|
|
188
|
-
.slide-body ul li::before {
|
|
188
|
+
.slide-body ul > li::before {
|
|
189
189
|
content: '';
|
|
190
190
|
position: absolute;
|
|
191
191
|
left: 4px;
|
|
@@ -195,7 +195,7 @@ strong { color: var(--ink); font-weight: 700; }
|
|
|
195
195
|
background: var(--accent);
|
|
196
196
|
clip-path: polygon(0 0, 100% 50%, 0 100%);
|
|
197
197
|
}
|
|
198
|
-
.slide-body ol li::before {
|
|
198
|
+
.slide-body ol > li::before {
|
|
199
199
|
content: counter(slide-ol) '.';
|
|
200
200
|
position: absolute;
|
|
201
201
|
left: 0;
|
|
@@ -206,7 +206,7 @@ strong { color: var(--ink); font-weight: 700; }
|
|
|
206
206
|
}
|
|
207
207
|
/* Second level: an en dash, a little smaller */
|
|
208
208
|
.slide-body li :is(ul, ol) { margin-top: 8px; gap: 6px; font-size: 0.88em; }
|
|
209
|
-
.slide-body li ul li::before {
|
|
209
|
+
.slide-body li ul > li::before {
|
|
210
210
|
width: 0.5em;
|
|
211
211
|
height: 2px;
|
|
212
212
|
top: 0.72em;
|
|
@@ -644,3 +644,16 @@ strong { color: var(--ink); font-weight: 700; }
|
|
|
644
644
|
overflow-y: hidden;
|
|
645
645
|
}
|
|
646
646
|
.slide .katex-display > .katex { font-size: 1.2em; }
|
|
647
|
+
|
|
648
|
+
/* ─────────────────────────────────────────────
|
|
649
|
+
QUOTATIONS — the quote environment of a printed text: set in from
|
|
650
|
+
both sides, in the serif, without ornament
|
|
651
|
+
───────────────────────────────────────────── */
|
|
652
|
+
.slide-body blockquote {
|
|
653
|
+
margin: 0 0 var(--gap-item);
|
|
654
|
+
padding: 0 64px;
|
|
655
|
+
border: 0;
|
|
656
|
+
font-family: var(--font-serif);
|
|
657
|
+
font-style: italic;
|
|
658
|
+
color: var(--ink-soft);
|
|
659
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
schema = 1
|
|
2
|
+
kind = "theme"
|
|
3
|
+
id = "glass"
|
|
4
|
+
title = "Glass"
|
|
5
|
+
description = "Liquid glass: soft pools of light behind every slide, content without frames, titles on a frosted pane with a bright rim; capsule labels, glass beads for list markers and a glass lens for chapter numbers; Geist throughout, dark by default."
|
|
6
|
+
version = "0.1.1"
|
|
7
|
+
author = "Tilman Schieber"
|
|
8
|
+
license = "MIT"
|
|
9
|
+
# The palette this theme uses unless the deck sets one; colours come only from palettes.
|
|
10
|
+
# Muted: polar night, ice blue and lavender; the glass is the look, not the colour.
|
|
11
|
+
palette = "nordic"
|
|
12
|
+
appearance = "dark"
|
|
13
|
+
fonts = [
|
|
14
|
+
"https://fonts.googleapis.com/css2?family=Geist:wght@300..800&family=Geist+Mono:wght@400..600&display=swap",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
[files]
|
|
18
|
+
styles = "styles.css"
|
|
19
|
+
|
|
20
|
+
# Type, spacing and fonts used by styles.css; colours come from the palette.
|
|
21
|
+
# Deck settings (params) override these.
|
|
22
|
+
[tokens]
|
|
23
|
+
|
|
24
|
+
# Type scale (px) — projection-appropriate at 1920×1080
|
|
25
|
+
"--fs-display" = "136px"
|
|
26
|
+
"--fs-title" = "104px"
|
|
27
|
+
"--fs-focus" = "88px"
|
|
28
|
+
"--fs-h" = "68px"
|
|
29
|
+
"--fs-sub" = "40px"
|
|
30
|
+
"--fs-body" = "32px"
|
|
31
|
+
"--fs-small" = "24px"
|
|
32
|
+
"--fs-eyebrow" = "20px"
|
|
33
|
+
|
|
34
|
+
# Spacing
|
|
35
|
+
"--pad-x" = "96px"
|
|
36
|
+
"--pad-y" = "60px"
|
|
37
|
+
"--gap-title" = "40px"
|
|
38
|
+
"--gap-item" = "22px"
|
|
39
|
+
|
|
40
|
+
# The glass: how round the panes are and how much they blur what is behind them.
|
|
41
|
+
"--glass-radius" = "44px"
|
|
42
|
+
"--glass-blur" = "28px"
|
|
43
|
+
|
|
44
|
+
# Type families
|
|
45
|
+
"--font-display" = "\"Geist\", \"Inter\", \"Helvetica Neue\", Arial, sans-serif"
|
|
46
|
+
"--font-body" = "\"Geist\", \"Inter\", \"Helvetica Neue\", Arial, sans-serif"
|
|
47
|
+
"--font-mono" = "\"Geist Mono\", ui-monospace, \"SF Mono\", Menlo, Consolas, monospace"
|
|
48
|
+
|
|
49
|
+
[params.fontDisplay]
|
|
50
|
+
token = "--font-display"
|
|
51
|
+
title = "Display font"
|
|
52
|
+
|
|
53
|
+
[params.fontBody]
|
|
54
|
+
token = "--font-body"
|
|
55
|
+
title = "Body font"
|
|
56
|
+
|
|
57
|
+
[params.glassBlur]
|
|
58
|
+
token = "--glass-blur"
|
|
59
|
+
title = "How much the glass blurs"
|