mdeck 2.3.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 (268) hide show
  1. package/CHANGELOG.md +259 -0
  2. package/LICENSE +21 -0
  3. package/README.md +156 -0
  4. package/assets/base.css +196 -0
  5. package/assets/extensions/layouts/chapter/extension.toml +26 -0
  6. package/assets/extensions/layouts/chapter/layout.jsx +21 -0
  7. package/assets/extensions/layouts/chapter/starter.md +8 -0
  8. package/assets/extensions/layouts/focus/extension.toml +8 -0
  9. package/assets/extensions/layouts/focus/layout.jsx +10 -0
  10. package/assets/extensions/layouts/focus/starter.md +4 -0
  11. package/assets/extensions/layouts/full-bleed-image/extension.toml +31 -0
  12. package/assets/extensions/layouts/full-bleed-image/layout.jsx +19 -0
  13. package/assets/extensions/layouts/full-bleed-image/starter.md +6 -0
  14. package/assets/extensions/layouts/generic/extension.toml +8 -0
  15. package/assets/extensions/layouts/generic/layout.jsx +8 -0
  16. package/assets/extensions/layouts/generic/starter.md +4 -0
  17. package/assets/extensions/layouts/image-text/extension.toml +25 -0
  18. package/assets/extensions/layouts/image-text/layout.jsx +17 -0
  19. package/assets/extensions/layouts/image-text/starter.md +6 -0
  20. package/assets/extensions/layouts/split/extension.toml +25 -0
  21. package/assets/extensions/layouts/split/layout.jsx +19 -0
  22. package/assets/extensions/layouts/split/starter.md +14 -0
  23. package/assets/extensions/layouts/title/extension.toml +26 -0
  24. package/assets/extensions/layouts/title/layout.jsx +14 -0
  25. package/assets/extensions/layouts/title/starter.md +5 -0
  26. package/assets/extensions/palettes/brand/extension.toml +29 -0
  27. package/assets/extensions/palettes/cobalt/extension.toml +27 -0
  28. package/assets/extensions/palettes/ember/extension.toml +27 -0
  29. package/assets/extensions/palettes/forest/extension.toml +27 -0
  30. package/assets/extensions/palettes/graphite/extension.toml +27 -0
  31. package/assets/extensions/palettes/lagoon/extension.toml +27 -0
  32. package/assets/extensions/palettes/neon/extension.toml +27 -0
  33. package/assets/extensions/palettes/nordic/extension.toml +27 -0
  34. package/assets/extensions/palettes/pastel/extension.toml +30 -0
  35. package/assets/extensions/palettes/phosphor/extension.toml +27 -0
  36. package/assets/extensions/palettes/swiss/extension.toml +27 -0
  37. package/assets/extensions/palettes/terra/extension.toml +27 -0
  38. package/assets/extensions/themes/academic/extension.toml +53 -0
  39. package/assets/extensions/themes/academic/styles.css +631 -0
  40. package/assets/extensions/themes/aurora/extension.toml +37 -0
  41. package/assets/extensions/themes/aurora/styles.css +644 -0
  42. package/assets/extensions/themes/duet/extension.toml +46 -0
  43. package/assets/extensions/themes/duet/styles.css +573 -0
  44. package/assets/extensions/themes/editorial/extension.toml +46 -0
  45. package/assets/extensions/themes/editorial/styles.css +574 -0
  46. package/assets/extensions/themes/fhnw/extension.toml +61 -0
  47. package/assets/extensions/themes/fhnw/styles.css +604 -0
  48. package/assets/extensions/themes/neue/extension.toml +46 -0
  49. package/assets/extensions/themes/neue/styles.css +489 -0
  50. package/assets/extensions/themes/sketch/extension.toml +48 -0
  51. package/assets/extensions/themes/sketch/styles.css +633 -0
  52. package/assets/extensions/themes/terminal/extension.toml +38 -0
  53. package/assets/extensions/themes/terminal/styles.css +550 -0
  54. package/assets/logo/avatar.png +0 -0
  55. package/assets/logo/logo-dark.svg +10 -0
  56. package/assets/logo/logo-light.svg +10 -0
  57. package/assets/logo/mark.svg +15 -0
  58. package/bin/mdeck.js +2 -0
  59. package/docs/README.md +8 -0
  60. package/docs/reference/authoring.md +795 -0
  61. package/docs/reference/claude-skill.md +96 -0
  62. package/docs/reference/extensions.md +250 -0
  63. package/docs/reference/layouts.md +153 -0
  64. package/docs/reference/palettes.md +106 -0
  65. package/docs/reference/structured-slides.md +120 -0
  66. package/docs/reference/themes.md +133 -0
  67. package/docs/site/assets/favicon.svg +15 -0
  68. package/docs/site/assets/github-logo.svg +1 -0
  69. package/docs/site/assets/site.css +162 -0
  70. package/docs/site/assets/site.js +123 -0
  71. package/docs/site/build.js +148 -0
  72. package/docs/site/content/appearance.md +203 -0
  73. package/docs/site/content/audience.md +178 -0
  74. package/docs/site/content/commands.md +153 -0
  75. package/docs/site/content/components.md +134 -0
  76. package/docs/site/content/drawing.md +72 -0
  77. package/docs/site/content/editing.md +59 -0
  78. package/docs/site/content/getting-started.md +103 -0
  79. package/docs/site/content/layouts.md +126 -0
  80. package/docs/site/content/media.md +107 -0
  81. package/docs/site/content/more-content.md +130 -0
  82. package/docs/site/content/presenting.md +93 -0
  83. package/docs/site/content/reusable-layouts.md +74 -0
  84. package/docs/site/content/sharing.md +88 -0
  85. package/docs/site/content/theme-authoring.md +144 -0
  86. package/docs/site/content/theme-repository.md +76 -0
  87. package/docs/site/content/troubleshooting.md +92 -0
  88. package/docs/site/content/views.md +56 -0
  89. package/docs/site/content/welcome.md +71 -0
  90. package/docs/site/content/writing.md +121 -0
  91. package/docs/site/examples/first-talk.md +88 -0
  92. package/docs/site/examples/notebook.svg +58 -0
  93. package/docs/site/images/themes/academic-dark.webp +0 -0
  94. package/docs/site/images/themes/academic-light.webp +0 -0
  95. package/docs/site/images/themes/academic.webp +0 -0
  96. package/docs/site/images/themes/aurora-dark.webp +0 -0
  97. package/docs/site/images/themes/aurora-light.webp +0 -0
  98. package/docs/site/images/themes/aurora.webp +0 -0
  99. package/docs/site/images/themes/duet-dark.webp +0 -0
  100. package/docs/site/images/themes/duet-light.webp +0 -0
  101. package/docs/site/images/themes/duet.webp +0 -0
  102. package/docs/site/images/themes/editorial-dark.webp +0 -0
  103. package/docs/site/images/themes/editorial-light.webp +0 -0
  104. package/docs/site/images/themes/editorial.webp +0 -0
  105. package/docs/site/images/themes/fhnw.webp +0 -0
  106. package/docs/site/images/themes/neue-dark.webp +0 -0
  107. package/docs/site/images/themes/neue-light.webp +0 -0
  108. package/docs/site/images/themes/neue.webp +0 -0
  109. package/docs/site/images/themes/sketch-dark.webp +0 -0
  110. package/docs/site/images/themes/sketch-light.webp +0 -0
  111. package/docs/site/images/themes/sketch.webp +0 -0
  112. package/docs/site/images/themes/terminal-dark.webp +0 -0
  113. package/docs/site/images/themes/terminal-light.webp +0 -0
  114. package/docs/site/images/themes/terminal.webp +0 -0
  115. package/docs/site/package.json +9 -0
  116. package/docs/site/pages.js +27 -0
  117. package/docs/site/server.js +58 -0
  118. package/examples/custom-layouts/extensions/comparison/extension.toml +35 -0
  119. package/examples/custom-layouts/extensions/comparison/layout.jsx +15 -0
  120. package/examples/custom-layouts/extensions/comparison/starter.md +17 -0
  121. package/examples/custom-layouts/extensions/comparison/styles.css +4 -0
  122. package/examples/custom-layouts/slides.md +60 -0
  123. package/examples/poll/slides.md +127 -0
  124. package/examples/python/.mdeck-backups/slides.drawings-2026-10-06T08-36-47Z.json +19 -0
  125. package/examples/python/.mdeck-backups/slides.drawings-2026-10-06T11-27-30Z.json +6 -0
  126. package/examples/python/slides.drawings.json +6 -0
  127. package/examples/python/slides.md +493 -0
  128. package/examples/showcase/.mdeck-backups/slides.drawings-2026-10-06T08-08-30Z.json +10 -0
  129. package/examples/showcase/.mdeck-backups/slides.drawings-2026-10-06T11-41-35Z.json +13 -0
  130. package/examples/showcase/img/image.jpg +0 -0
  131. package/examples/showcase/img/mdeck.svg +66 -0
  132. package/examples/showcase/slides.drawings.json +11 -0
  133. package/examples/showcase/slides.md +427 -0
  134. package/package.json +75 -0
  135. package/skills/write-slides/SKILL.md +144 -0
  136. package/src/build/check.js +49 -0
  137. package/src/build/chrome.js +130 -0
  138. package/src/build/components.js +44 -0
  139. package/src/build/config.js +61 -0
  140. package/src/build/drawings.js +14 -0
  141. package/src/build/editorPlugin.js +272 -0
  142. package/src/build/editorServer.js +36 -0
  143. package/src/build/fonts.js +84 -0
  144. package/src/build/homePlugin.js +208 -0
  145. package/src/build/inkPlugin.js +192 -0
  146. package/src/build/ownWrites.js +18 -0
  147. package/src/build/pairing.js +81 -0
  148. package/src/build/pdf.js +34 -0
  149. package/src/build/relayAccess.js +85 -0
  150. package/src/build/slidesPlugin.js +371 -0
  151. package/src/build/themeCheck.js +151 -0
  152. package/src/build/tunnelClient.js +184 -0
  153. package/src/cli/args.js +76 -0
  154. package/src/cli/index.js +758 -0
  155. package/src/cli/migrate.js +123 -0
  156. package/src/cli/skill.js +40 -0
  157. package/src/cli/themes.js +140 -0
  158. package/src/components/CodeBlock.jsx +168 -0
  159. package/src/components/ConnectedViews.jsx +25 -0
  160. package/src/components/Icon.jsx +8 -0
  161. package/src/components/Poll.jsx +67 -0
  162. package/src/components/QrCode.jsx +29 -0
  163. package/src/components/QrCodeTag.jsx +27 -0
  164. package/src/components/Question.jsx +28 -0
  165. package/src/components/Scale.jsx +47 -0
  166. package/src/components/VideoPlayer.jsx +108 -0
  167. package/src/components/WordCloud.jsx +106 -0
  168. package/src/components/activity.jsx +35 -0
  169. package/src/components/callout.css +78 -0
  170. package/src/components/code-block.css +123 -0
  171. package/src/components/columns.css +11 -0
  172. package/src/components/poll.css +81 -0
  173. package/src/components/video-player.css +14 -0
  174. package/src/core/devPath.js +4 -0
  175. package/src/core/editDeck.js +230 -0
  176. package/src/core/icons.js +69 -0
  177. package/src/core/ink.js +221 -0
  178. package/src/core/labels.js +144 -0
  179. package/src/core/outline.js +33 -0
  180. package/src/core/parseSlides.js +152 -0
  181. package/src/core/source.js +137 -0
  182. package/src/core/urls.js +34 -0
  183. package/src/core/validateDeck.js +139 -0
  184. package/src/editor/api.js +67 -0
  185. package/src/editor/components/App.jsx +75 -0
  186. package/src/editor/components/ConflictBanner.jsx +10 -0
  187. package/src/editor/components/DeckSettings.jsx +108 -0
  188. package/src/editor/components/DesignApp.jsx +252 -0
  189. package/src/editor/components/Diagnostics.jsx +10 -0
  190. package/src/editor/components/ExtensionEditor.jsx +66 -0
  191. package/src/editor/components/ExtensionForms.jsx +134 -0
  192. package/src/editor/components/ExtensionsPanel.jsx +114 -0
  193. package/src/editor/components/Field.jsx +24 -0
  194. package/src/editor/components/Inspector.jsx +36 -0
  195. package/src/editor/components/LayoutPicker.jsx +23 -0
  196. package/src/editor/components/LayoutSelect.jsx +25 -0
  197. package/src/editor/components/LookThumbnail.jsx +8 -0
  198. package/src/editor/components/MetaFields.jsx +24 -0
  199. package/src/editor/components/Outline.jsx +28 -0
  200. package/src/editor/components/PalettePicker.jsx +32 -0
  201. package/src/editor/components/Preview.jsx +63 -0
  202. package/src/editor/components/PropsForm.jsx +46 -0
  203. package/src/editor/components/RawSlideEditor.jsx +9 -0
  204. package/src/editor/components/RegionEditor.jsx +15 -0
  205. package/src/editor/components/Resizer.jsx +18 -0
  206. package/src/editor/designLink.js +19 -0
  207. package/src/editor/editor.css +139 -0
  208. package/src/editor/extensions.js +86 -0
  209. package/src/editor/keyboard.js +21 -0
  210. package/src/editor/model.js +38 -0
  211. package/src/editor/sampleDeck.js +165 -0
  212. package/src/editor/saveQueue.js +47 -0
  213. package/src/editor/schema.js +36 -0
  214. package/src/editor/state.js +92 -0
  215. package/src/editor/useDeckDocument.js +67 -0
  216. package/src/extensions/appearance.js +79 -0
  217. package/src/extensions/contrast.js +57 -0
  218. package/src/extensions/discover.js +126 -0
  219. package/src/extensions/manifest.js +209 -0
  220. package/src/extensions/packs.js +268 -0
  221. package/src/extensions/tokens.js +25 -0
  222. package/src/home/Home.jsx +362 -0
  223. package/src/home/home.css +148 -0
  224. package/src/layouts/layoutApi.jsx +205 -0
  225. package/src/layouts/layoutProps.js +30 -0
  226. package/src/layouts/renderSlide.jsx +17 -0
  227. package/src/live/answer/answer.css +34 -0
  228. package/src/live/answer/answer.html +14 -0
  229. package/src/live/answer/answer.js +130 -0
  230. package/src/live/client.js +290 -0
  231. package/src/live/code.js +19 -0
  232. package/src/live/follow.js +17 -0
  233. package/src/live/pairing.js +34 -0
  234. package/src/live/presence.js +33 -0
  235. package/src/live/roomTag.js +38 -0
  236. package/src/live/rooms.js +249 -0
  237. package/src/live/server.js +82 -0
  238. package/src/live/tunnel.js +180 -0
  239. package/src/paths.js +9 -0
  240. package/src/runtime/ReaderView.jsx +193 -0
  241. package/src/runtime/SlideErrorBoundary.jsx +28 -0
  242. package/src/runtime/chrome.jsx +55 -0
  243. package/src/runtime/deck-stage.js +1533 -0
  244. package/src/runtime/design.html +12 -0
  245. package/src/runtime/design.jsx +5 -0
  246. package/src/runtime/editor.html +12 -0
  247. package/src/runtime/editor.jsx +5 -0
  248. package/src/runtime/editorBridge.js +58 -0
  249. package/src/runtime/fit.js +149 -0
  250. package/src/runtime/home.html +13 -0
  251. package/src/runtime/home.jsx +5 -0
  252. package/src/runtime/index.html +15 -0
  253. package/src/runtime/ink/InkLayer.jsx +17 -0
  254. package/src/runtime/ink/Toolbar.jsx +145 -0
  255. package/src/runtime/ink/attach.js +69 -0
  256. package/src/runtime/ink/bus.js +126 -0
  257. package/src/runtime/ink/controller.js +132 -0
  258. package/src/runtime/ink/room.js +101 -0
  259. package/src/runtime/ink/select.js +124 -0
  260. package/src/runtime/ink/server.js +75 -0
  261. package/src/runtime/ink/store.js +55 -0
  262. package/src/runtime/ink/toolbar.css +79 -0
  263. package/src/runtime/main.jsx +863 -0
  264. package/src/runtime/markedSetup.js +147 -0
  265. package/src/runtime/reader.css +59 -0
  266. package/src/runtime/registry.jsx +26 -0
  267. package/src/runtime/syncOrder.js +32 -0
  268. package/src/runtime/themeLoader.js +68 -0
@@ -0,0 +1,574 @@
1
+ /* Editorial β€” a magazine spread.
2
+ Newsreader for headlines, Lora for reading, and the conventions of
3
+ print: a masthead rule, a drop cap that opens the text, pull quotes,
4
+ margin notes and figures set between hairlines. Chapters open like a new
5
+ section of the magazine, with a Roman numeral.
6
+ Everything takes its colours from the palette's roles (--bg, --ink,
7
+ --accent …), so every palette works on it. */
8
+
9
+ .slide {
10
+ --hairline: color-mix(in oklab, var(--ink) 22%, var(--bg));
11
+ --accent-soft: color-mix(in oklab, var(--accent) 12%, var(--bg));
12
+ }
13
+
14
+ /* ─────────────────────────────────────────────
15
+ MASTHEAD AND FOLIO: a double rule under the header, the page number
16
+ in italic numerals like a magazine's folio
17
+ ───────────────────────────────────────────── */
18
+ .slide-header {
19
+ font-weight: 600;
20
+ letter-spacing: 0.2em;
21
+ text-transform: uppercase;
22
+ color: var(--ink);
23
+ border-bottom: 7px double var(--ink);
24
+ padding-bottom: 14px;
25
+ }
26
+ .slide-header .brand { color: var(--ink); }
27
+
28
+ .slide-logo {
29
+ position: absolute;
30
+ top: var(--pad-y);
31
+ right: var(--pad-x);
32
+ height: 96px;
33
+ width: auto;
34
+ max-width: 360px;
35
+ object-fit: contain;
36
+ filter: var(--logo-filter, none);
37
+ transform: translateY(calc(var(--fs-eyebrow) * 0.5 - 50%));
38
+ /* The rule stops before the logo instead of crossing it. */
39
+ background: var(--bg);
40
+ padding-left: 28px;
41
+ }
42
+
43
+ .slide-footer {
44
+ font-family: var(--font-body);
45
+ font-size: var(--fs-small);
46
+ font-style: italic;
47
+ font-weight: 400;
48
+ color: var(--muted);
49
+ border-top: 1px solid var(--hairline);
50
+ padding-top: 18px;
51
+ }
52
+ .slide-footer > span:last-child:not(:first-child) {
53
+ font-family: var(--font-display);
54
+ font-size: var(--fs-sub);
55
+ font-style: italic;
56
+ font-weight: 400;
57
+ color: var(--ink);
58
+ line-height: 1;
59
+ }
60
+
61
+ /* ─────────────────────────────────────────────
62
+ TYPOGRAPHY HELPERS
63
+ ───────────────────────────────────────────── */
64
+ .eyebrow {
65
+ font-family: var(--font-body);
66
+ font-size: var(--fs-eyebrow);
67
+ font-weight: 600;
68
+ letter-spacing: 0.22em;
69
+ text-transform: uppercase;
70
+ color: var(--accent);
71
+ margin: 0 0 var(--gap-title) 0;
72
+ }
73
+
74
+ .display {
75
+ font-family: var(--font-display);
76
+ font-size: var(--fs-display);
77
+ font-weight: 700;
78
+ font-optical-sizing: auto;
79
+ line-height: 0.98;
80
+ letter-spacing: -0.02em;
81
+ margin: 0;
82
+ color: var(--ink);
83
+ text-wrap: balance;
84
+ }
85
+
86
+ .title {
87
+ font-family: var(--font-display);
88
+ font-size: var(--fs-h);
89
+ font-weight: 700;
90
+ font-optical-sizing: auto;
91
+ line-height: 1.08;
92
+ letter-spacing: -0.015em;
93
+ margin: 0;
94
+ color: var(--ink);
95
+ text-wrap: balance;
96
+ }
97
+
98
+ .subtitle {
99
+ font-family: var(--font-body);
100
+ font-size: var(--fs-sub);
101
+ font-weight: 400;
102
+ font-style: italic;
103
+ line-height: 1.35;
104
+ color: var(--ink-soft);
105
+ margin: 0;
106
+ text-wrap: pretty;
107
+ }
108
+
109
+ .body-text {
110
+ font-family: var(--font-body);
111
+ font-size: var(--fs-body);
112
+ font-weight: 400;
113
+ line-height: 1.6;
114
+ color: var(--ink-soft);
115
+ margin: 0;
116
+ text-wrap: pretty;
117
+ }
118
+
119
+ .meta {
120
+ font-family: var(--font-body);
121
+ font-size: var(--fs-small);
122
+ color: var(--muted);
123
+ }
124
+
125
+ /* Emphasis is a drawn italic in the accent; in headlines it is the
126
+ display face's italic, the editorial signature. */
127
+ em {
128
+ font-style: italic;
129
+ color: var(--accent);
130
+ }
131
+ strong { color: var(--ink); font-weight: 600; }
132
+
133
+ /* ─────────────────────────────────────────────
134
+ LAYOUT: TITLE β€” a cover: centred headline between an ornament and an
135
+ italic standfirst
136
+ ───────────────────────────────────────────── */
137
+ .slide--title .slide-body {
138
+ justify-content: center;
139
+ align-items: center;
140
+ text-align: center;
141
+ }
142
+ .slide--title .display {
143
+ font-size: var(--fs-display);
144
+ font-weight: 700;
145
+ line-height: 0.98;
146
+ letter-spacing: -0.02em;
147
+ margin: 0;
148
+ max-width: 1560px;
149
+ }
150
+ .slide--title .display em { font-weight: 400; }
151
+ .slide--title .title-text::before {
152
+ content: '';
153
+ display: block;
154
+ width: 120px;
155
+ height: 0;
156
+ border-top: 4px double var(--accent);
157
+ margin: 0 auto 64px;
158
+ }
159
+ .slide--title .subtitle {
160
+ margin: 56px auto 0;
161
+ max-width: 1100px;
162
+ }
163
+ /* TITLE + image: the picture as a band across the top, the cover below */
164
+ .slide--title.has-image .slide-body {
165
+ align-items: stretch;
166
+ justify-content: flex-start;
167
+ gap: 48px;
168
+ }
169
+ .slide--title.has-image .title-image {
170
+ width: 100%;
171
+ height: 360px;
172
+ object-fit: cover;
173
+ flex-shrink: 0;
174
+ }
175
+ .slide--title.has-image .title-text {
176
+ flex: 1;
177
+ display: flex;
178
+ flex-direction: column;
179
+ align-items: center;
180
+ justify-content: center;
181
+ }
182
+ .slide--title.has-image .title-text::before { display: none; }
183
+ .slide--title.has-image .display { font-size: calc(var(--fs-display) * 0.72); }
184
+
185
+ /* ─────────────────────────────────────────────
186
+ LAYOUT: CHAPTER β€” a new section: the Roman numeral in the accent, a
187
+ hairline, the label in capitals and the title large below
188
+ ───────────────────────────────────────────── */
189
+ .slide--chapter .slide-body {
190
+ justify-content: center;
191
+ align-items: flex-start;
192
+ }
193
+ .chapter-num {
194
+ font-family: var(--font-display);
195
+ font-size: 220px;
196
+ font-weight: 400;
197
+ font-style: italic;
198
+ font-optical-sizing: auto;
199
+ line-height: 1;
200
+ letter-spacing: 0;
201
+ color: var(--accent);
202
+ margin: 0 0 8px -6px;
203
+ user-select: none;
204
+ }
205
+ /* A whole number shows as a Roman numeral (the layout passes it as
206
+ --chapter-number); anything else as written. */
207
+ .chapter-num[style*="--chapter-number"] {
208
+ counter-reset: chapter var(--chapter-number);
209
+ font-size: 0;
210
+ }
211
+ .chapter-num[style*="--chapter-number"]::before {
212
+ content: counter(chapter, upper-roman);
213
+ font-size: 220px;
214
+ }
215
+ .chapter-meta {
216
+ font-family: var(--font-body);
217
+ font-size: var(--fs-eyebrow);
218
+ font-weight: 600;
219
+ letter-spacing: 0.22em;
220
+ text-transform: uppercase;
221
+ color: var(--ink);
222
+ margin: 0 0 36px 0;
223
+ padding-top: 28px;
224
+ border-top: 1px solid var(--hairline);
225
+ }
226
+ .slide--chapter .chapter-content { align-self: stretch; }
227
+ .slide--chapter .chapter-title {
228
+ font-family: var(--font-display);
229
+ font-size: var(--fs-title);
230
+ font-weight: 700;
231
+ font-style: normal;
232
+ font-optical-sizing: auto;
233
+ line-height: 1.02;
234
+ letter-spacing: -0.02em;
235
+ margin: 0 0 40px 0;
236
+ color: var(--ink);
237
+ max-width: 1400px;
238
+ text-wrap: balance;
239
+ }
240
+ .slide--chapter .chapter-title em { font-weight: 400; font-style: italic; }
241
+ .slide--chapter .chapter-desc {
242
+ font-family: var(--font-body);
243
+ font-size: var(--fs-sub);
244
+ font-weight: 400;
245
+ font-style: italic;
246
+ line-height: 1.4;
247
+ color: var(--ink-soft);
248
+ max-width: 1100px;
249
+ margin: 0;
250
+ }
251
+ .slide--chapter.has-image .slide-body {
252
+ display: grid;
253
+ grid-template-columns: 1fr 1fr;
254
+ column-gap: 96px;
255
+ align-items: stretch;
256
+ }
257
+ .slide--chapter.has-image .chapter-content {
258
+ display: flex;
259
+ flex-direction: column;
260
+ justify-content: center;
261
+ align-items: flex-start;
262
+ }
263
+ .slide--chapter.has-image .chapter-image {
264
+ width: 100%;
265
+ height: 100%;
266
+ object-fit: cover;
267
+ }
268
+
269
+ /* ─────────────────────────────────────────────
270
+ LAYOUT: FOCUS β€” a pull quote: a large hanging quotation mark in the
271
+ accent, the statement in the display italic
272
+ ───────────────────────────────────────────── */
273
+ .slide--focus .slide-body {
274
+ justify-content: center;
275
+ align-items: flex-start;
276
+ text-align: left;
277
+ padding-left: 140px;
278
+ }
279
+ .focus-eyebrow {
280
+ font-family: var(--font-body);
281
+ font-size: var(--fs-eyebrow);
282
+ font-weight: 600;
283
+ letter-spacing: 0.22em;
284
+ text-transform: uppercase;
285
+ color: var(--accent);
286
+ margin: 0 0 40px 0;
287
+ }
288
+ .focus-content {
289
+ position: relative;
290
+ display: flex;
291
+ flex-direction: column;
292
+ align-items: flex-start;
293
+ width: 100%;
294
+ text-align: left;
295
+ }
296
+ .focus-content::before {
297
+ content: '\201C';
298
+ position: absolute;
299
+ left: -168px;
300
+ top: 0;
301
+ font-family: var(--font-display);
302
+ font-size: 300px;
303
+ font-weight: 400;
304
+ line-height: 0.8;
305
+ color: var(--accent);
306
+ pointer-events: none;
307
+ }
308
+ .focus-statement,
309
+ .slide--focus .focus-content h1,
310
+ .slide--focus .focus-content p {
311
+ font-family: var(--font-display);
312
+ font-size: var(--fs-focus);
313
+ font-weight: 400;
314
+ font-style: italic;
315
+ font-optical-sizing: auto;
316
+ line-height: 1.16;
317
+ letter-spacing: -0.01em;
318
+ color: var(--ink);
319
+ max-width: 1480px;
320
+ margin: 0;
321
+ text-wrap: balance;
322
+ text-align: left;
323
+ }
324
+ /* Emphasis inside the quote stays in its italic, a touch heavier, in the accent. */
325
+ .slide--focus .focus-content em { font-style: italic; font-weight: 500; }
326
+ .focus-attribution {
327
+ font-family: var(--font-body);
328
+ font-size: var(--fs-small);
329
+ font-weight: 600;
330
+ letter-spacing: 0.18em;
331
+ text-transform: uppercase;
332
+ color: var(--muted);
333
+ margin: 56px 0 0 0;
334
+ }
335
+
336
+ /* ─────────────────────────────────────────────
337
+ LAYOUT: IMAGE + TEXT β€” square photographs, a caption-like text column
338
+ ───────────────────────────────────────────── */
339
+ .slide--image-text .slide-body { gap: 96px; }
340
+
341
+ .image-pane {
342
+ flex: 1.1;
343
+ min-width: 0;
344
+ display: flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ background: var(--surface);
348
+ overflow: hidden;
349
+ position: relative;
350
+ border-radius: 0;
351
+ }
352
+ .image-placeholder {
353
+ width: 100%;
354
+ height: 100%;
355
+ background: repeating-linear-gradient(135deg, var(--surface) 0 24px, var(--bg) 24px 48px);
356
+ display: flex;
357
+ align-items: center;
358
+ justify-content: center;
359
+ }
360
+ .image-placeholder span {
361
+ font-family: var(--font-body);
362
+ font-size: 22px;
363
+ font-style: italic;
364
+ color: var(--muted);
365
+ background: var(--bg);
366
+ padding: 14px 24px;
367
+ border: 1px solid var(--rule);
368
+ }
369
+ .text-pane .title { font-size: var(--fs-h); }
370
+ .text-pane .body-text + .body-text { margin-top: 8px; }
371
+ .text-pane .eyebrow { margin-bottom: 16px; }
372
+
373
+ /* The split layout's shared heading keeps clear of the masthead. */
374
+ .split-heading { margin-top: 40px; }
375
+
376
+ /* ─────────────────────────────────────────────
377
+ LISTS β€” an em dash in the accent hangs in the margin; numbers are the
378
+ display face's italic figures
379
+ ───────────────────────────────────────────── */
380
+ .slide-body ul { max-width: 1500px; }
381
+ .slide-body ul li {
382
+ font-weight: 400;
383
+ line-height: 1.5;
384
+ padding-left: 64px;
385
+ position: relative;
386
+ }
387
+ .slide-body ul li::before {
388
+ content: '\2014';
389
+ position: absolute;
390
+ left: 0;
391
+ top: 0;
392
+ font-family: var(--font-display);
393
+ font-weight: 700;
394
+ color: var(--accent);
395
+ }
396
+ .slide-body ol { max-width: 1500px; }
397
+ .slide-body ol li {
398
+ counter-increment: slide-ol;
399
+ padding-left: 64px;
400
+ line-height: 1.5;
401
+ position: relative;
402
+ }
403
+ .slide-body ol li::before {
404
+ content: counter(slide-ol) '.';
405
+ position: absolute;
406
+ left: 0;
407
+ top: -0.08em;
408
+ font-family: var(--font-display);
409
+ font-style: italic;
410
+ font-weight: 700;
411
+ font-size: 1.2em;
412
+ color: var(--accent);
413
+ line-height: 1.5;
414
+ }
415
+
416
+ /* ─────────────────────────────────────────────
417
+ LAYOUT: FULL-BLEED IMAGE
418
+ ───────────────────────────────────────────── */
419
+ .slide--full-bleed-image.has-overlay .slide-bg::after {
420
+ content: '';
421
+ position: absolute;
422
+ inset: 0;
423
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.65) 0%, rgba(0, 0, 0, 0.2) 50%, transparent 100%);
424
+ }
425
+ .slide--full-bleed-image .overlay-title {
426
+ font-family: var(--font-display);
427
+ font-size: calc(var(--fs-h) * 1.15);
428
+ font-weight: 700;
429
+ font-optical-sizing: auto;
430
+ line-height: 1.08;
431
+ letter-spacing: -0.02em;
432
+ color: #fff;
433
+ margin: 0;
434
+ max-width: 1300px;
435
+ text-wrap: balance;
436
+ }
437
+ .slide--full-bleed-image .overlay-title em { color: inherit; font-weight: 400; }
438
+
439
+ /* ─────────────────────────────────────────────
440
+ CONTENT SLIDES β€” a headline, and the text that follows it opens with a
441
+ drop cap
442
+ ───────────────────────────────────────────── */
443
+ .slide-body h1 {
444
+ font-family: var(--font-display);
445
+ font-size: var(--fs-h);
446
+ font-weight: 600;
447
+ font-optical-sizing: auto;
448
+ line-height: 1.08;
449
+ letter-spacing: -0.015em;
450
+ color: var(--ink);
451
+ margin: 0 0 var(--gap-title) 0;
452
+ max-width: 1500px;
453
+ text-wrap: balance;
454
+ }
455
+ .slide-body h1 em { font-weight: 400; }
456
+ .slide-body h2 {
457
+ font-family: var(--font-display);
458
+ font-size: var(--fs-sub);
459
+ font-weight: 700;
460
+ font-style: italic;
461
+ line-height: 1.15;
462
+ color: var(--ink);
463
+ margin: 0 0 var(--gap-item) 0;
464
+ text-wrap: balance;
465
+ }
466
+ .slide-body p {
467
+ font-family: var(--font-body);
468
+ font-size: var(--fs-body);
469
+ font-weight: 400;
470
+ line-height: 1.6;
471
+ color: var(--ink-soft);
472
+ margin: 0 0 var(--gap-item) 0;
473
+ text-wrap: pretty;
474
+ }
475
+ .slide-body > p { max-width: 1500px; }
476
+ .slide-body > h1 + p::first-letter {
477
+ float: left;
478
+ font-family: var(--font-display);
479
+ font-size: 3.4em;
480
+ font-weight: 700;
481
+ line-height: 0.82;
482
+ margin: 0.08em 0.1em 0 0;
483
+ color: var(--accent);
484
+ }
485
+
486
+ /* ─────────────────────────────────────────────
487
+ FOOTNOTES
488
+ ───────────────────────────────────────────── */
489
+ .slide-footnotes {
490
+ font-style: italic;
491
+ padding-top: 18px;
492
+ }
493
+ .slide-footnotes li { line-height: 1.45; }
494
+
495
+ /* ─────────────────────────────────────────────
496
+ CALLOUTS β€” margin notes: a rule in the margin, the title in capitals,
497
+ the note in italics
498
+ ───────────────────────────────────────────── */
499
+ .slide-body .callout {
500
+ background: none;
501
+ border: 0;
502
+ border-left: 3px solid var(--rule);
503
+ border-radius: 0;
504
+ padding: 4px 0 4px 32px;
505
+ margin: 40px 0 0;
506
+ max-width: 1200px;
507
+ }
508
+ .slide-body .callout-tip { border-left-color: var(--accent); }
509
+ .slide-body .callout-tip .callout-title { color: var(--accent); }
510
+ .slide-body .callout-note { border-left-color: var(--callout-note); }
511
+ .slide-body .callout-important { border-left-color: var(--callout-important); }
512
+ .slide-body .callout-warning { border-left-color: var(--callout-warning); }
513
+ .slide-body .callout-caution { border-left-color: var(--callout-caution); }
514
+ /* Lecture blocks: theorems in the accent's margin, definitions in the second accent */
515
+ .slide-body :is(.callout-theorem, .callout-lemma, .callout-corollary) { border-left-color: var(--accent); }
516
+ .slide-body .callout-definition { border-left-color: var(--accent-2); }
517
+ .slide-body .callout-title {
518
+ font-family: var(--font-body);
519
+ font-size: var(--fs-eyebrow);
520
+ font-weight: 600;
521
+ letter-spacing: 0.2em;
522
+ text-transform: uppercase;
523
+ margin-bottom: 8px;
524
+ }
525
+ .slide-body .callout p {
526
+ padding-left: 0;
527
+ font-style: italic;
528
+ color: var(--ink);
529
+ font-size: var(--fs-body);
530
+ margin-bottom: 0;
531
+ }
532
+
533
+ /* ─────────────────────────────────────────────
534
+ CODE β€” a figure between hairlines on the paper's surface
535
+ ───────────────────────────────────────────── */
536
+ .code-block {
537
+ --code-bg: var(--surface);
538
+ --code-radius: 0;
539
+ --code-size: 26px;
540
+ background: var(--code-bg);
541
+ border-radius: 0;
542
+ border-top: 1px solid var(--ink);
543
+ border-bottom: 1px solid var(--ink);
544
+ padding: 36px 44px;
545
+ margin: 0;
546
+ overflow: hidden;
547
+ font-size: var(--code-size);
548
+ font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
549
+ line-height: 1.6;
550
+ }
551
+ .code-block code {
552
+ font-family: inherit;
553
+ font-size: inherit;
554
+ background: none;
555
+ padding: 0;
556
+ }
557
+
558
+ /* ─────────────────────────────────────────────
559
+ AUDIENCE QUESTIONS β€” thin square bars
560
+ ───────────────────────────────────────────── */
561
+ .slide .poll-track, .slide .poll-fill, .slide .scale-track, .slide .scale-fill { border-radius: 0; }
562
+ .slide .poll-track, .slide .scale-track { background: var(--accent-soft); }
563
+ .slide .question-cards li { border-radius: 0; background: var(--accent-soft); font-style: italic; }
564
+ .slide .poll-join { border-radius: 0; }
565
+
566
+ /* ─────────────────────────────────────────────
567
+ MATH (KaTeX)
568
+ ───────────────────────────────────────────── */
569
+ .slide .katex-display {
570
+ font-size: var(--fs-sub);
571
+ margin: 40px 0;
572
+ overflow-x: auto;
573
+ overflow-y: hidden;
574
+ }
@@ -0,0 +1,61 @@
1
+ schema = 1
2
+ kind = "theme"
3
+ id = "fhnw"
4
+ title = "FHNW"
5
+ description = "The FHNW corporate design: Inter, black on white, yellow accent areas."
6
+ # The palette this theme uses unless the deck sets one; colours come only from palettes.
7
+ palette = "brand"
8
+ palettes = ["brand"] # the corporate design: no other palettes
9
+ fonts = [
10
+ "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=Spectral:ital,wght@0,400;1,400&display=swap",
11
+ ]
12
+
13
+ [files]
14
+ styles = "styles.css"
15
+
16
+ # Type, spacing and fonts used by styles.css; colours come from the palette.
17
+ # Deck settings (params) override these.
18
+ [tokens]
19
+
20
+ # Theme-specific structural tokens
21
+ "--grey-100" = "#F1F1EE"
22
+ "--grey-200" = "#DEDED9"
23
+ "--grey-300" = "#BEBDB9"
24
+ "--grey-800" = "#4C4C4C"
25
+
26
+ # Type scale (px) β€” projection-appropriate at 1920Γ—1080.
27
+ "--fs-display" = "152px"
28
+ "--fs-title" = "96px"
29
+ "--fs-focus" = "80px"
30
+ "--fs-h" = "64px"
31
+ "--fs-sub" = "40px"
32
+ "--fs-body" = "32px"
33
+ "--fs-small" = "24px"
34
+ "--fs-eyebrow" = "24px"
35
+
36
+ # Spacing
37
+ "--pad-x" = "112px"
38
+ "--pad-y" = "72px"
39
+ "--gap-title" = "48px"
40
+ "--gap-item" = "20px"
41
+
42
+ # AkzentflΓ€che interior padding
43
+ "--akzent-pad-x" = "56px"
44
+ "--akzent-pad-y" = "40px"
45
+
46
+ # Akzentlinie band height β€” CD-Manual Β§2.4 (β‰ˆ Β½ logo height).
47
+ "--akzentlinie-h" = "12px"
48
+
49
+ # Type families β€” Inter only, per CD-Manual Β§2.2
50
+ "--font-display" = "\"Inter\", system-ui, -apple-system, \"Helvetica Neue\", Arial, sans-serif"
51
+ "--font-body" = "\"Inter\", system-ui, -apple-system, \"Helvetica Neue\", Arial, sans-serif"
52
+ "--font-serif" = "\"Spectral\", Georgia, \"Times New Roman\", serif"
53
+
54
+ # Settings authors can change under `params:` in the deck; each points at a token above.
55
+ [params.fontDisplay]
56
+ token = "--font-display"
57
+ title = "Display font"
58
+
59
+ [params.fontBody]
60
+ token = "--font-body"
61
+ title = "Body font"