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,631 @@
1
+ /* Academic — a lecture.
2
+ Source Sans for reading from the back of the room, Source Serif for
3
+ theorem statements and quotations, Source Code Pro for code. Slides start
4
+ at the top and hold more than in the other themes: a definition, a
5
+ formula, a few points. The conventions come from papers and lecture
6
+ notes: numbered sections, theorem and definition blocks, proofs that end
7
+ with a square, booktabs tables and a short rule above the footnotes.
8
+ Everything takes its colours from the palette's roles (--bg, --ink,
9
+ --accent …), so every palette works on it. */
10
+
11
+ .slide {
12
+ --hairline: color-mix(in oklab, var(--ink) 18%, var(--bg));
13
+ --accent-soft: color-mix(in oklab, var(--accent) 10%, var(--bg));
14
+ --gap-col: 72px;
15
+ }
16
+
17
+ /* ─────────────────────────────────────────────
18
+ RUNNING HEAD AND FOOT: a hairline under the organisation and the
19
+ section; the slide number at the foot
20
+ ───────────────────────────────────────────── */
21
+ .slide-header {
22
+ font-family: var(--font-body);
23
+ font-size: var(--fs-eyebrow);
24
+ font-weight: 600;
25
+ letter-spacing: 0.08em;
26
+ text-transform: uppercase;
27
+ color: var(--muted);
28
+ border-bottom: 1px solid var(--hairline);
29
+ padding-bottom: 14px;
30
+ min-height: 1.4em;
31
+ }
32
+ .slide-header .brand { color: var(--ink); }
33
+ /* The section, as a running head: § Foundations */
34
+ .slide-header > span:last-child:not(.brand):not(:empty) { color: var(--accent); }
35
+ .slide-header > span:last-child:not(.brand):not(:empty)::before {
36
+ content: '\00A7\00A0';
37
+ font-family: var(--font-serif);
38
+ font-weight: 400;
39
+ }
40
+
41
+ .slide-logo {
42
+ position: absolute;
43
+ top: calc(var(--pad-y) - 20px);
44
+ right: var(--pad-x);
45
+ height: 72px;
46
+ width: auto;
47
+ max-width: 320px;
48
+ object-fit: contain;
49
+ filter: var(--logo-filter, none);
50
+ }
51
+
52
+ .slide-footer {
53
+ font-family: var(--font-body);
54
+ font-size: var(--fs-small);
55
+ color: var(--muted);
56
+ padding-top: 16px;
57
+ font-variant-numeric: tabular-nums;
58
+ }
59
+ .slide-footer > span:last-child:not(:first-child) {
60
+ font-weight: 600;
61
+ color: var(--ink-soft);
62
+ }
63
+
64
+ /* ─────────────────────────────────────────────
65
+ TYPOGRAPHY HELPERS
66
+ ───────────────────────────────────────────── */
67
+ .eyebrow {
68
+ font-family: var(--font-body);
69
+ font-size: var(--fs-eyebrow);
70
+ font-weight: 700;
71
+ letter-spacing: 0.1em;
72
+ text-transform: uppercase;
73
+ color: var(--accent);
74
+ margin: 0;
75
+ }
76
+
77
+ .display {
78
+ font-family: var(--font-display);
79
+ font-size: var(--fs-display);
80
+ font-weight: 700;
81
+ line-height: 1.04;
82
+ letter-spacing: -0.015em;
83
+ margin: 0;
84
+ color: var(--ink);
85
+ text-wrap: balance;
86
+ }
87
+
88
+ .title {
89
+ font-family: var(--font-display);
90
+ font-size: var(--fs-h);
91
+ font-weight: 700;
92
+ line-height: 1.1;
93
+ letter-spacing: -0.01em;
94
+ margin: 0;
95
+ color: var(--ink);
96
+ text-wrap: balance;
97
+ }
98
+
99
+ .subtitle {
100
+ font-family: var(--font-serif);
101
+ font-size: var(--fs-sub);
102
+ font-weight: 400;
103
+ font-style: italic;
104
+ line-height: 1.35;
105
+ color: var(--ink-soft);
106
+ margin: 0;
107
+ text-wrap: pretty;
108
+ }
109
+
110
+ .body-text {
111
+ font-family: var(--font-body);
112
+ font-size: var(--fs-body);
113
+ line-height: 1.5;
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
+ em { font-style: italic; color: var(--accent); }
126
+ strong { color: var(--ink); font-weight: 700; }
127
+
128
+ /* ─────────────────────────────────────────────
129
+ CONTENT SLIDES — the heading keeps its place at the top, like a frame
130
+ title, and what follows is centred in the room below it. Content that
131
+ does not fit starts right under the heading (the auto margins give way).
132
+ ───────────────────────────────────────────── */
133
+ .slide:not(.slide--title, .slide--chapter, .slide--focus, .slide--image-text, .slide--full-bleed-image) .slide-body {
134
+ justify-content: flex-start;
135
+ padding-top: 36px;
136
+ }
137
+ .slide:not(.slide--title, .slide--chapter, .slide--focus, .slide--image-text, .slide--full-bleed-image) .slide-body > :first-child:not(h1),
138
+ .slide:not(.slide--title, .slide--chapter, .slide--focus, .slide--image-text, .slide--full-bleed-image) .slide-body > h1:first-child + * {
139
+ margin-top: auto;
140
+ }
141
+ .slide:not(.slide--title, .slide--chapter, .slide--focus, .slide--image-text, .slide--full-bleed-image) .slide-body > :last-child:not(h1) {
142
+ margin-bottom: auto;
143
+ }
144
+ .slide-body h1 {
145
+ font-family: var(--font-display);
146
+ font-size: var(--fs-h);
147
+ font-weight: 700;
148
+ line-height: 1.1;
149
+ letter-spacing: -0.01em;
150
+ color: var(--ink);
151
+ margin: 0 0 var(--gap-title) 0;
152
+ max-width: 1600px;
153
+ text-wrap: balance;
154
+ }
155
+ .slide-body h2 {
156
+ font-family: var(--font-display);
157
+ font-size: var(--fs-sub);
158
+ font-weight: 600;
159
+ line-height: 1.2;
160
+ color: var(--accent);
161
+ margin: var(--gap-item) 0 var(--gap-item) 0;
162
+ text-wrap: balance;
163
+ }
164
+ .slide-body h1 + h2 { margin-top: calc(var(--gap-title) * -0.5); }
165
+ .slide-body p {
166
+ font-family: var(--font-body);
167
+ font-size: var(--fs-body);
168
+ line-height: 1.5;
169
+ color: var(--ink-soft);
170
+ margin: 0 0 var(--gap-item) 0;
171
+ text-wrap: pretty;
172
+ }
173
+ .slide-body > p { max-width: 1560px; }
174
+ .slide-body > :is(ul, ol, p, table, .callout, .code-block, .katex-display, .columns) + :is(ul, ol, table, .callout, .code-block, .columns) {
175
+ margin-top: calc(var(--gap-item) * 1.5);
176
+ }
177
+
178
+ /* ─────────────────────────────────────────────
179
+ LISTS — a small triangle in the accent; numbers in the accent, set in
180
+ the text size, so long lists stay compact
181
+ ───────────────────────────────────────────── */
182
+ .slide-body ul, .slide-body ol { max-width: 1560px; }
183
+ .slide-body ul li,
184
+ .slide-body ol li {
185
+ line-height: 1.45;
186
+ padding-left: 44px;
187
+ }
188
+ .slide-body ul li::before {
189
+ content: '';
190
+ position: absolute;
191
+ left: 4px;
192
+ top: 0.5em;
193
+ width: 0.42em;
194
+ height: 0.5em;
195
+ background: var(--accent);
196
+ clip-path: polygon(0 0, 100% 50%, 0 100%);
197
+ }
198
+ .slide-body ol li::before {
199
+ content: counter(slide-ol) '.';
200
+ position: absolute;
201
+ left: 0;
202
+ top: 0;
203
+ font-weight: 700;
204
+ color: var(--accent);
205
+ font-variant-numeric: tabular-nums;
206
+ }
207
+ /* Second level: an en dash, a little smaller */
208
+ .slide-body li :is(ul, ol) { margin-top: 8px; gap: 6px; font-size: 0.88em; }
209
+ .slide-body li ul li::before {
210
+ width: 0.5em;
211
+ height: 2px;
212
+ top: 0.72em;
213
+ background: var(--muted);
214
+ clip-path: none;
215
+ }
216
+
217
+ /* ─────────────────────────────────────────────
218
+ LAYOUT: TITLE — a title page: the title, a short rule, the subtitle in
219
+ the serif italic, and the author and date beneath them
220
+ ───────────────────────────────────────────── */
221
+ .slide--title .slide-body {
222
+ justify-content: center;
223
+ align-items: center;
224
+ text-align: center;
225
+ }
226
+ .slide--title .title-text {
227
+ display: flex;
228
+ flex-direction: column;
229
+ align-items: center;
230
+ }
231
+ .slide--title .display {
232
+ font-size: var(--fs-display);
233
+ line-height: 1.04;
234
+ margin: 0;
235
+ max-width: 1500px;
236
+ }
237
+ .slide--title .display::after {
238
+ content: '';
239
+ display: block;
240
+ width: 160px;
241
+ height: 4px;
242
+ margin: 48px auto 0;
243
+ background: var(--accent);
244
+ }
245
+ .slide--title .subtitle {
246
+ margin-top: 44px;
247
+ max-width: 1240px;
248
+ }
249
+ /* The author line moves up under the title, like a paper's byline. */
250
+ .slide--title .slide-footer {
251
+ justify-content: center;
252
+ font-size: calc(var(--fs-body) * 0.9);
253
+ color: var(--ink-soft);
254
+ padding-bottom: 72px;
255
+ }
256
+ /* TITLE + image: the title page on the left, the picture on the right */
257
+ .slide--title.has-image .slide-body {
258
+ display: grid;
259
+ grid-template-columns: 1.2fr 1fr;
260
+ column-gap: 96px;
261
+ align-items: center;
262
+ text-align: left;
263
+ }
264
+ .slide--title.has-image .title-text { align-items: flex-start; }
265
+ .slide--title.has-image .display { font-size: calc(var(--fs-display) * 0.82); }
266
+ .slide--title.has-image .display::after { margin-left: 0; }
267
+ .slide--title.has-image .title-image { width: 100%; height: 100%; max-height: 720px; object-fit: contain; }
268
+ .slide--title.has-image .slide-footer { justify-content: flex-start; }
269
+
270
+ /* ─────────────────────────────────────────────
271
+ LAYOUT: CHAPTER — a section opening: the number beside a rule in the
272
+ accent, the label, the title and a sentence about what follows
273
+ ───────────────────────────────────────────── */
274
+ .slide--chapter .slide-body {
275
+ justify-content: center;
276
+ align-items: flex-start;
277
+ }
278
+ .slide--chapter .chapter-content {
279
+ display: grid;
280
+ grid-template-columns: auto 1fr;
281
+ column-gap: 56px;
282
+ align-items: start;
283
+ align-self: stretch;
284
+ }
285
+ .chapter-num {
286
+ grid-row: 1 / span 4;
287
+ align-self: stretch;
288
+ font-family: var(--font-display);
289
+ font-size: 200px;
290
+ font-weight: 300;
291
+ line-height: 0.9;
292
+ letter-spacing: -0.04em;
293
+ color: var(--accent);
294
+ padding-right: 56px;
295
+ border-right: 4px solid var(--accent);
296
+ font-variant-numeric: lining-nums;
297
+ user-select: none;
298
+ }
299
+ .chapter-meta {
300
+ grid-column: 2;
301
+ font-family: var(--font-body);
302
+ font-size: var(--fs-eyebrow);
303
+ font-weight: 700;
304
+ letter-spacing: 0.1em;
305
+ text-transform: uppercase;
306
+ color: var(--muted);
307
+ margin: 6px 0 20px 0;
308
+ }
309
+ .slide--chapter .chapter-title {
310
+ grid-column: 2;
311
+ font-family: var(--font-display);
312
+ font-size: var(--fs-title);
313
+ font-weight: 700;
314
+ line-height: 1.04;
315
+ letter-spacing: -0.015em;
316
+ margin: 0 0 28px 0;
317
+ color: var(--ink);
318
+ max-width: 1300px;
319
+ text-wrap: balance;
320
+ }
321
+ .slide--chapter .chapter-desc {
322
+ grid-column: 2;
323
+ font-family: var(--font-serif);
324
+ font-size: var(--fs-sub);
325
+ font-style: italic;
326
+ line-height: 1.4;
327
+ color: var(--ink-soft);
328
+ max-width: 1100px;
329
+ margin: 0;
330
+ }
331
+ .slide--chapter .chapter-content > :not(.chapter-num, .chapter-meta, .chapter-title, .chapter-desc) { grid-column: 2; }
332
+ .slide--chapter.has-image .slide-body {
333
+ display: grid;
334
+ grid-template-columns: 1.3fr 1fr;
335
+ column-gap: 96px;
336
+ align-items: center;
337
+ }
338
+ .slide--chapter.has-image .chapter-num { font-size: 150px; }
339
+ .slide--chapter.has-image .chapter-title { font-size: calc(var(--fs-title) * 0.8); }
340
+ .slide--chapter.has-image .chapter-image { width: 100%; height: 100%; max-height: 760px; object-fit: cover; }
341
+
342
+ /* ─────────────────────────────────────────────
343
+ LAYOUT: FOCUS — a key result, set like a theorem: the label as the
344
+ block's heading, the statement in the serif italic
345
+ ───────────────────────────────────────────── */
346
+ .slide--focus .slide-body {
347
+ justify-content: center;
348
+ align-items: stretch;
349
+ }
350
+ .slide--focus .slide-body > * {
351
+ background: var(--accent-soft);
352
+ border-left: 8px solid var(--accent);
353
+ padding-left: 64px;
354
+ padding-right: 80px;
355
+ }
356
+ .slide--focus .slide-body > :first-child { padding-top: 48px; }
357
+ .slide--focus .slide-body > :last-child { padding-bottom: 48px; }
358
+ .focus-eyebrow {
359
+ font-family: var(--font-body);
360
+ font-size: var(--fs-eyebrow);
361
+ font-weight: 700;
362
+ letter-spacing: 0.1em;
363
+ text-transform: uppercase;
364
+ color: var(--accent);
365
+ padding-bottom: 24px;
366
+ }
367
+ .focus-content { display: flex; flex-direction: column; gap: var(--gap-item); }
368
+ .focus-statement,
369
+ .slide--focus .focus-content h1,
370
+ .slide--focus .focus-content p {
371
+ font-family: var(--font-serif);
372
+ font-size: var(--fs-focus);
373
+ font-weight: 400;
374
+ font-style: italic;
375
+ line-height: 1.3;
376
+ color: var(--ink);
377
+ max-width: 1500px;
378
+ margin: 0;
379
+ text-wrap: balance;
380
+ }
381
+ .slide--focus .focus-content em { font-style: normal; }
382
+ .focus-attribution {
383
+ font-family: var(--font-body);
384
+ font-size: var(--fs-small);
385
+ font-weight: 600;
386
+ color: var(--muted);
387
+ text-align: right;
388
+ padding-top: 28px;
389
+ }
390
+
391
+ /* ─────────────────────────────────────────────
392
+ LAYOUT: IMAGE + TEXT — a figure in a hairline frame
393
+ ───────────────────────────────────────────── */
394
+ .slide--image-text .slide-body { gap: 80px; padding-top: 36px; }
395
+ .image-pane {
396
+ flex: 1.1;
397
+ min-width: 0;
398
+ display: flex;
399
+ align-items: center;
400
+ justify-content: center;
401
+ background: var(--surface);
402
+ border: 1px solid var(--hairline);
403
+ overflow: hidden;
404
+ position: relative;
405
+ }
406
+ .image-placeholder {
407
+ background: repeating-linear-gradient(135deg, var(--surface) 0 20px, var(--bg) 20px 40px);
408
+ }
409
+ .image-placeholder span {
410
+ font-family: var(--font-body);
411
+ font-size: var(--fs-small);
412
+ color: var(--muted);
413
+ background: var(--bg);
414
+ padding: 12px 20px;
415
+ border: 1px solid var(--rule);
416
+ }
417
+ .text-pane .eyebrow { margin-bottom: -4px; }
418
+ .text-pane .title { font-size: var(--fs-h); color: var(--ink); margin: 0 0 8px 0; }
419
+
420
+ /* The split layout's shared heading stays at the top. */
421
+ .split-heading { margin-bottom: var(--gap-title); }
422
+ .split-columns { gap: var(--gap-col); }
423
+
424
+ /* ─────────────────────────────────────────────
425
+ LAYOUT: FULL-BLEED IMAGE
426
+ ───────────────────────────────────────────── */
427
+ .slide--full-bleed-image.has-overlay .slide-bg::after {
428
+ content: '';
429
+ position: absolute;
430
+ inset: 0;
431
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.2) 50%, transparent 100%);
432
+ }
433
+ .slide--full-bleed-image .overlay-title {
434
+ font-family: var(--font-display);
435
+ font-size: var(--fs-h);
436
+ font-weight: 700;
437
+ line-height: 1.1;
438
+ color: #fff;
439
+ margin: 0;
440
+ max-width: 1300px;
441
+ text-wrap: balance;
442
+ }
443
+ .slide--full-bleed-image .overlay-title em { color: inherit; }
444
+
445
+ /* ─────────────────────────────────────────────
446
+ BLOCKS — callouts as the blocks of lecture notes. Theorems, lemmas
447
+ and corollaries in the accent with the statement in the serif italic;
448
+ definitions in the second accent; examples and remarks quieter. A
449
+ proof has no box: it opens with "Proof." and ends with a square.
450
+ ───────────────────────────────────────────── */
451
+ .slide-body .callout {
452
+ --block: var(--muted);
453
+ background: color-mix(in oklab, var(--block) 7%, var(--bg));
454
+ border: 0;
455
+ border-left: 6px solid var(--block);
456
+ border-radius: 0 4px 4px 0;
457
+ padding: 0;
458
+ margin: var(--gap-item) 0;
459
+ max-width: 1560px;
460
+ overflow: hidden;
461
+ }
462
+ .slide-body .callout-title {
463
+ font-family: var(--font-body);
464
+ font-size: calc(var(--fs-body) * 0.9);
465
+ font-weight: 700;
466
+ letter-spacing: 0;
467
+ text-transform: none;
468
+ color: var(--ink);
469
+ background: color-mix(in oklab, var(--block) 16%, var(--bg));
470
+ padding: 10px 28px;
471
+ margin: 0;
472
+ }
473
+ .slide-body .callout > :not(.callout-title) { padding: 0 28px; }
474
+ .slide-body .callout > .callout-title + * { margin-top: 16px; }
475
+ .slide-body .callout > :last-child { margin-bottom: 18px; }
476
+ .slide-body .callout p { color: var(--ink); }
477
+ .slide-body .callout :is(ul, ol) { gap: 8px; }
478
+
479
+ .slide-body :is(.callout-theorem, .callout-lemma, .callout-corollary, .callout-proposition, .callout-tip, .callout-important) { --block: var(--accent); }
480
+ .slide-body :is(.callout-definition) { --block: var(--accent-2); }
481
+ .slide-body .callout-note { --block: var(--callout-note); }
482
+ .slide-body .callout-warning { --block: var(--callout-warning); }
483
+ .slide-body .callout-caution { --block: var(--callout-caution); }
484
+ .slide-body :is(.callout-theorem, .callout-lemma, .callout-corollary, .callout-proposition) > :not(.callout-title) {
485
+ font-family: var(--font-serif);
486
+ font-style: italic;
487
+ }
488
+ .slide-body :is(.callout-theorem, .callout-lemma, .callout-corollary, .callout-proposition) p { font-family: var(--font-serif); font-size: calc(var(--fs-body) * 0.96); }
489
+
490
+ /* Examples and remarks: no fill, the label in small capitals */
491
+ .slide-body :is(.callout-example, .callout-remark) {
492
+ background: none;
493
+ border-left-width: 3px;
494
+ }
495
+ .slide-body :is(.callout-example, .callout-remark) .callout-title {
496
+ background: none;
497
+ padding-bottom: 0;
498
+ font-size: var(--fs-eyebrow);
499
+ letter-spacing: 0.1em;
500
+ text-transform: uppercase;
501
+ color: var(--muted);
502
+ }
503
+ .slide-body :is(.callout-example, .callout-remark) > .callout-title + * { margin-top: 6px; }
504
+
505
+ /* Proof. … ∎ */
506
+ .slide-body .callout.callout-proof {
507
+ background: none;
508
+ border: 0;
509
+ border-radius: 0;
510
+ overflow: visible;
511
+ }
512
+ .slide-body .callout.callout-proof > * { padding: 0; }
513
+ .slide-body .callout.callout-proof .callout-title {
514
+ float: left;
515
+ background: none;
516
+ padding: 0;
517
+ margin-right: 0.35em;
518
+ font-family: var(--font-body);
519
+ font-size: var(--fs-body);
520
+ font-style: italic;
521
+ line-height: 1.5;
522
+ font-weight: 700;
523
+ color: var(--ink);
524
+ }
525
+ .slide-body .callout.callout-proof .callout-title::after { content: '.'; }
526
+ .slide-body .callout.callout-proof > .callout-title + * { margin-top: 0; }
527
+ .slide-body .callout.callout-proof p { padding-left: 0; color: var(--ink-soft); }
528
+ .slide-body .callout.callout-proof > :last-child { margin-bottom: 0; }
529
+ .slide-body .callout.callout-proof > :last-child::after {
530
+ content: '\220E';
531
+ margin-left: 0.6em;
532
+ color: var(--ink);
533
+ }
534
+
535
+ /* ─────────────────────────────────────────────
536
+ TABLES — booktabs: heavy rules at top and bottom, a lighter one under
537
+ the head, no vertical lines
538
+ ───────────────────────────────────────────── */
539
+ .slide-body table {
540
+ width: auto;
541
+ align-self: flex-start;
542
+ min-width: 60%;
543
+ font-size: calc(var(--fs-body) * 0.92);
544
+ font-variant-numeric: tabular-nums;
545
+ border-top: 3px solid var(--ink);
546
+ border-bottom: 3px solid var(--ink);
547
+ }
548
+ .slide-body th,
549
+ .slide-body td {
550
+ padding: 10px 28px 10px 0;
551
+ border: 0;
552
+ }
553
+ .slide-body th {
554
+ font-weight: 700;
555
+ color: var(--ink);
556
+ border-bottom: 1.5px solid var(--ink);
557
+ padding-top: 14px;
558
+ }
559
+ .slide-body tbody tr:first-child td { padding-top: 14px; }
560
+ .slide-body tbody tr:last-child td { padding-bottom: 14px; }
561
+
562
+ /* ─────────────────────────────────────────────
563
+ FOOTNOTES — a short rule above them, as on a printed page
564
+ ───────────────────────────────────────────── */
565
+ .slide-footnotes {
566
+ font-family: var(--font-body);
567
+ border-top: 0;
568
+ position: relative;
569
+ padding-top: 14px;
570
+ }
571
+ .slide-footnotes::before {
572
+ content: '';
573
+ position: absolute;
574
+ top: 0;
575
+ left: 0;
576
+ width: 280px;
577
+ height: 1px;
578
+ background: var(--ink-soft);
579
+ }
580
+ .slide-footnotes li { line-height: 1.4; }
581
+ .slide-body sup { color: var(--accent); font-weight: 600; }
582
+
583
+ /* ─────────────────────────────────────────────
584
+ CODE — a listing on the surface, a rule at its side
585
+ ───────────────────────────────────────────── */
586
+ .code-block {
587
+ --code-bg: var(--surface);
588
+ --code-radius: 4px;
589
+ --code-size: 24px;
590
+ background: var(--code-bg);
591
+ border-radius: 4px;
592
+ border-left: 4px solid var(--hairline);
593
+ padding: 24px 32px;
594
+ margin: 0;
595
+ overflow: hidden;
596
+ font-size: var(--code-size);
597
+ font-family: var(--font-mono);
598
+ line-height: 1.55;
599
+ }
600
+ .code-block code {
601
+ font-family: inherit;
602
+ font-size: inherit;
603
+ background: none;
604
+ padding: 0;
605
+ }
606
+ .slide-body :not(pre) > code {
607
+ font-family: var(--font-mono);
608
+ font-size: 0.88em;
609
+ background: var(--surface);
610
+ padding: 0.05em 0.3em;
611
+ border-radius: 3px;
612
+ }
613
+
614
+ /* ─────────────────────────────────────────────
615
+ AUDIENCE QUESTIONS
616
+ ───────────────────────────────────────────── */
617
+ .slide .poll-track, .slide .poll-fill, .slide .scale-track, .slide .scale-fill { border-radius: 2px; }
618
+ .slide .poll-track, .slide .scale-track { background: var(--accent-soft); }
619
+ .slide .question-cards li { border-radius: 4px; background: var(--accent-soft); }
620
+ .slide .poll-join { border-radius: 4px; }
621
+
622
+ /* ─────────────────────────────────────────────
623
+ MATH (KaTeX) — displayed formulas at a little above the text size
624
+ ───────────────────────────────────────────── */
625
+ .slide .katex { font-size: 1.08em; }
626
+ .slide .katex-display {
627
+ margin: 20px 0;
628
+ overflow-x: auto;
629
+ overflow-y: hidden;
630
+ }
631
+ .slide .katex-display > .katex { font-size: 1.2em; }
@@ -0,0 +1,37 @@
1
+ schema = 1
2
+ kind = "theme"
3
+ id = "aurora"
4
+ title = "Aurora"
5
+ description = "Northern lights: curtains of light in the accent colours, night-sky chapter and statement slides, frosted glass."
6
+ # The palette this theme uses unless the deck sets one; colours come only from palettes.
7
+ palette = "neon"
8
+ fonts = [
9
+ "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;600;700;800&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) — projection-appropriate at 1920×1080
20
+ "--fs-display" = "168px"
21
+ "--fs-title" = "112px"
22
+ "--fs-focus" = "100px"
23
+ "--fs-h" = "76px"
24
+ "--fs-sub" = "44px"
25
+ "--fs-body" = "34px"
26
+ "--fs-small" = "26px"
27
+ "--fs-eyebrow" = "20px"
28
+
29
+ # Spacing
30
+ "--pad-x" = "120px"
31
+ "--pad-y" = "72px"
32
+ "--gap-title" = "48px"
33
+ "--gap-item" = "24px"
34
+
35
+ # Type families
36
+ "--font-display" = "\"Plus Jakarta Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif"
37
+ "--font-body" = "\"Plus Jakarta Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif"