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.
- package/CHANGELOG.md +12 -1
- package/README.md +9 -9
- package/assets/base.css +4 -1
- package/assets/packs/academic/pack.toml +8 -0
- package/assets/packs/aurora/pack.toml +8 -0
- package/assets/packs/lagoon/pack.toml +8 -0
- package/assets/packs/minimal/minimal/extension.toml +45 -0
- package/assets/packs/minimal/minimal/styles.css +342 -0
- package/assets/packs/minimal/pack.toml +8 -0
- package/assets/packs/minimal/paper/extension.toml +27 -0
- package/assets/packs/neue/pack.toml +8 -0
- package/docs/reference/authoring.md +13 -18
- package/docs/reference/claude-skill.md +1 -1
- package/docs/reference/extensions.md +29 -20
- package/docs/reference/palettes.md +8 -12
- package/docs/reference/themes.md +8 -7
- package/docs/site/content/appearance.md +33 -49
- package/docs/site/content/commands.md +2 -2
- package/docs/site/content/theme-authoring.md +1 -1
- package/docs/site/content/theme-repository.md +19 -15
- package/docs/site/examples/first-talk.md +1 -1
- 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/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/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/pages.js +1 -1
- package/examples/custom-layouts/slides.md +1 -1
- package/examples/poll/slides.md +1 -1
- package/examples/python/slides.md +2 -2
- package/examples/showcase/slides.md +3 -3
- package/package.json +1 -1
- package/skills/write-slides/SKILL.md +2 -2
- package/src/build/check.js +0 -7
- package/src/build/editorPlugin.js +19 -11
- package/src/build/themeCheck.js +15 -5
- package/src/cli/args.js +1 -1
- package/src/cli/index.js +3 -3
- package/src/cli/themes.js +93 -64
- package/src/core/validateDeck.js +4 -2
- package/src/editor/api.js +9 -1
- package/src/editor/components/App.jsx +4 -2
- package/src/editor/components/DesignApp.jsx +12 -3
- package/src/editor/components/ExtensionEditor.jsx +15 -4
- package/src/editor/components/ExtensionsPanel.jsx +19 -21
- package/src/editor/designLink.js +18 -1
- package/src/editor/sampleDeck.js +3 -1
- package/src/extensions/appearance.js +2 -1
- package/src/extensions/discover.js +56 -16
- package/src/extensions/installed.js +63 -0
- package/src/extensions/moved.js +13 -0
- package/src/extensions/packs.js +135 -46
- package/src/home/Home.jsx +12 -6
- package/src/layouts/layoutApi.jsx +10 -2
- package/src/paths.js +2 -0
- package/src/runtime/themeLoader.js +5 -2
- package/assets/extensions/palettes/brand/extension.toml +0 -29
- package/assets/extensions/palettes/cobalt/extension.toml +0 -27
- package/assets/extensions/palettes/ember/extension.toml +0 -27
- package/assets/extensions/palettes/forest/extension.toml +0 -27
- package/assets/extensions/palettes/graphite/extension.toml +0 -27
- package/assets/extensions/palettes/pastel/extension.toml +0 -30
- package/assets/extensions/palettes/phosphor/extension.toml +0 -27
- package/assets/extensions/palettes/terra/extension.toml +0 -27
- package/assets/extensions/themes/duet/extension.toml +0 -46
- package/assets/extensions/themes/duet/styles.css +0 -573
- package/assets/extensions/themes/editorial/extension.toml +0 -46
- package/assets/extensions/themes/editorial/styles.css +0 -574
- package/assets/extensions/themes/fhnw/extension.toml +0 -61
- package/assets/extensions/themes/fhnw/styles.css +0 -604
- package/assets/extensions/themes/sketch/extension.toml +0 -48
- package/assets/extensions/themes/sketch/styles.css +0 -633
- package/assets/extensions/themes/terminal/extension.toml +0 -38
- package/assets/extensions/themes/terminal/styles.css +0 -550
- package/docs/site/images/themes/duet-dark.webp +0 -0
- package/docs/site/images/themes/duet-light.webp +0 -0
- package/docs/site/images/themes/duet.webp +0 -0
- package/docs/site/images/themes/editorial-dark.webp +0 -0
- package/docs/site/images/themes/editorial-light.webp +0 -0
- package/docs/site/images/themes/editorial.webp +0 -0
- package/docs/site/images/themes/fhnw.webp +0 -0
- package/docs/site/images/themes/sketch-dark.webp +0 -0
- package/docs/site/images/themes/sketch-light.webp +0 -0
- package/docs/site/images/themes/sketch.webp +0 -0
- package/docs/site/images/themes/terminal-dark.webp +0 -0
- package/docs/site/images/themes/terminal-light.webp +0 -0
- package/docs/site/images/themes/terminal.webp +0 -0
- package/examples/python/.mdeck-backups/slides.drawings-2026-10-06T08-36-47Z.json +0 -19
- package/examples/python/.mdeck-backups/slides.drawings-2026-10-06T11-27-30Z.json +0 -6
- package/examples/showcase/.mdeck-backups/slides.drawings-2026-10-06T08-08-30Z.json +0 -10
- package/examples/showcase/.mdeck-backups/slides.drawings-2026-10-06T11-41-35Z.json +0 -13
- /package/assets/{extensions/themes → packs/academic}/academic/extension.toml +0 -0
- /package/assets/{extensions/themes → packs/academic}/academic/styles.css +0 -0
- /package/assets/{extensions/palettes → packs/academic}/nordic/extension.toml +0 -0
- /package/assets/{extensions/themes → packs/aurora}/aurora/extension.toml +0 -0
- /package/assets/{extensions/themes → packs/aurora}/aurora/styles.css +0 -0
- /package/assets/{extensions/palettes → packs/aurora}/neon/extension.toml +0 -0
- /package/assets/{extensions/palettes → packs/lagoon}/lagoon/extension.toml +0 -0
- /package/assets/{extensions/themes → packs/neue}/neue/extension.toml +0 -0
- /package/assets/{extensions/themes → packs/neue}/neue/styles.css +0 -0
- /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"
|