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,550 @@
1
+ /* Terminal — a real terminal session.
2
+ JetBrains Mono throughout. Headings read as commands typed at a prompt,
3
+ the title waits at a blinking cursor, a chapter starts like running a new
4
+ command, callouts are log lines, and the footer is a tmux status bar.
5
+ Code is in the same face as the text, so it is set apart by a window
6
+ frame with a title bar. Dark by default; in light it reads as a printout
7
+ of the session. Colours come only from the palette roles. */
8
+
9
+ .slide {
10
+ --prompt: '~/talk $ ';
11
+ }
12
+
13
+ /* ─────────────────────────────────────────────
14
+ HEADER — the organisation as a comment, the section in brackets
15
+ ───────────────────────────────────────────── */
16
+ .slide-header {
17
+ font-weight: 400;
18
+ letter-spacing: 0.04em;
19
+ color: var(--muted);
20
+ }
21
+ .slide-header .brand { color: var(--muted); }
22
+ .slide-header .brand:not(:empty)::before { content: '# '; color: var(--accent); }
23
+ .slide-header > span:last-child:not(:first-child):not(:empty)::before { content: '['; }
24
+ .slide-header > span:last-child:not(:first-child):not(:empty)::after { content: ']'; }
25
+
26
+ .slide-logo {
27
+ position: absolute;
28
+ top: var(--pad-y);
29
+ right: var(--pad-x);
30
+ height: 120px;
31
+ width: auto;
32
+ max-width: 480px;
33
+ object-fit: contain;
34
+ filter: var(--logo-filter, none);
35
+ transform: translateY(calc(var(--fs-eyebrow) * 0.5 - 50%));
36
+ }
37
+
38
+ /* ─────────────────────────────────────────────
39
+ FOOTER — a tmux status bar across the bottom edge: the session (the
40
+ deck's title) in the accent on the left, the page number on the right
41
+ ───────────────────────────────────────────── */
42
+ .slide-footer {
43
+ font-family: var(--font-body);
44
+ font-size: var(--fs-small);
45
+ font-weight: 400;
46
+ color: var(--ink-soft);
47
+ background: var(--surface);
48
+ justify-content: flex-start;
49
+ gap: 32px;
50
+ /* Across the bottom edge, in the slide's lower padding, out of the flow
51
+ (a negative margin would make the slide look overfull to fit.js). */
52
+ position: absolute;
53
+ left: 0;
54
+ right: 0;
55
+ bottom: 0;
56
+ z-index: 1;
57
+ padding: 0 var(--pad-x) 0 0;
58
+ height: 52px;
59
+ }
60
+ .slide-footer::before {
61
+ content: '[' var(--meta-title, 'talk') ']';
62
+ flex: none;
63
+ align-self: stretch;
64
+ display: flex;
65
+ align-items: center;
66
+ max-width: 900px;
67
+ overflow: hidden;
68
+ text-overflow: ellipsis;
69
+ white-space: nowrap;
70
+ padding: 0 28px 0 var(--pad-x);
71
+ background: var(--accent);
72
+ color: var(--on-accent);
73
+ font-weight: 700;
74
+ }
75
+ .slide-footer > span:last-child:not(:first-child) { margin-left: auto; color: var(--ink); font-weight: 700; }
76
+
77
+ /* ─────────────────────────────────────────────
78
+ TYPOGRAPHY HELPERS
79
+ ───────────────────────────────────────────── */
80
+ .eyebrow {
81
+ font-family: var(--font-body);
82
+ font-size: var(--fs-eyebrow);
83
+ font-weight: 400;
84
+ letter-spacing: 0.04em;
85
+ color: var(--muted);
86
+ margin: 0 0 var(--gap-title) 0;
87
+ }
88
+ .eyebrow::before { content: '# '; color: var(--accent); }
89
+ .display {
90
+ font-family: var(--font-display);
91
+ font-size: var(--fs-display);
92
+ font-weight: 800;
93
+ line-height: 1.05;
94
+ letter-spacing: -0.04em;
95
+ margin: 0;
96
+ color: var(--ink);
97
+ text-wrap: balance;
98
+ }
99
+ .title {
100
+ font-family: var(--font-display);
101
+ font-size: var(--fs-h);
102
+ font-weight: 700;
103
+ line-height: 1.15;
104
+ letter-spacing: -0.03em;
105
+ margin: 0;
106
+ color: var(--ink);
107
+ text-wrap: balance;
108
+ }
109
+ .subtitle {
110
+ font-family: var(--font-body);
111
+ font-size: var(--fs-sub);
112
+ font-weight: 400;
113
+ line-height: 1.35;
114
+ color: var(--ink-soft);
115
+ margin: 0;
116
+ text-wrap: pretty;
117
+ }
118
+ .body-text {
119
+ font-family: var(--font-body);
120
+ font-size: var(--fs-body);
121
+ font-weight: 400;
122
+ line-height: 1.55;
123
+ color: var(--ink-soft);
124
+ margin: 0;
125
+ text-wrap: pretty;
126
+ }
127
+ .meta {
128
+ font-family: var(--font-body);
129
+ font-size: var(--fs-small);
130
+ color: var(--muted);
131
+ }
132
+ em {
133
+ font-style: normal;
134
+ color: var(--accent);
135
+ }
136
+ strong { color: var(--ink); font-weight: 700; }
137
+ /* Inline code is in the text's own face: a background tells it apart. */
138
+ .slide-body :not(pre) > code {
139
+ font-family: inherit;
140
+ font-size: 0.92em;
141
+ background: var(--surface);
142
+ color: var(--accent-2);
143
+ padding: 0.05em 0.3em;
144
+ border-radius: 0;
145
+ }
146
+
147
+ /* ─────────────────────────────────────────────
148
+ LAYOUT: TITLE — a command line above, the title waiting at a cursor
149
+ ───────────────────────────────────────────── */
150
+ .slide--title .slide-body {
151
+ justify-content: center;
152
+ align-items: flex-start;
153
+ }
154
+ .slide--title .title-text::before {
155
+ content: '$ ./present';
156
+ display: block;
157
+ font-size: var(--fs-sub);
158
+ font-weight: 400;
159
+ color: var(--muted);
160
+ margin-bottom: 48px;
161
+ }
162
+ .slide--title .display {
163
+ font-size: var(--fs-display);
164
+ max-width: 1600px;
165
+ }
166
+ .slide--title .display::after {
167
+ content: '';
168
+ display: inline-block;
169
+ width: 0.55em;
170
+ height: 0.95em;
171
+ margin-left: 0.15em;
172
+ vertical-align: -0.12em;
173
+ background: var(--accent);
174
+ }
175
+ .slide--title .subtitle {
176
+ margin-top: 44px;
177
+ max-width: 1300px;
178
+ }
179
+ .slide--title .subtitle::before { content: '> '; color: var(--accent); }
180
+ .slide--title.has-image .slide-body {
181
+ display: grid;
182
+ grid-template-columns: 1.15fr 1fr;
183
+ column-gap: 80px;
184
+ align-items: center;
185
+ }
186
+ .slide--title.has-image .display { font-size: calc(var(--fs-display) * 0.7); }
187
+ .slide--title.has-image .title-image {
188
+ width: 100%;
189
+ height: 600px;
190
+ object-fit: cover;
191
+ border: 2px solid var(--rule);
192
+ }
193
+
194
+ /* The cursor blinks while presenting; never in print or for people who
195
+ prefer less motion. */
196
+ @media screen and (prefers-reduced-motion: no-preference) {
197
+ .slide--title .display::after { animation: terminal-blink 1.1s steps(1) infinite; }
198
+ }
199
+ @keyframes terminal-blink { 50% { opacity: 0; } }
200
+ deck-stage[data-deck-static] .slide--title .display::after { animation: none; }
201
+
202
+ /* ─────────────────────────────────────────────
203
+ LAYOUT: CHAPTER — running a new command: the command line, the part as
204
+ a comment, then the title large. A faint scanline on screen only.
205
+ ───────────────────────────────────────────── */
206
+ @media screen {
207
+ .slide--chapter {
208
+ background-image: repeating-linear-gradient(to bottom, transparent 0 3px, color-mix(in oklab, var(--ink) 4%, transparent) 3px 4px);
209
+ }
210
+ }
211
+ .slide--chapter .slide-body {
212
+ justify-content: center;
213
+ align-items: flex-start;
214
+ }
215
+ .chapter-num {
216
+ font-family: var(--font-display);
217
+ font-size: var(--fs-sub);
218
+ font-weight: 700;
219
+ line-height: 1.3;
220
+ color: var(--ink);
221
+ margin: 0 0 12px 0;
222
+ }
223
+ .chapter-num::before { content: '$ ./chapter '; color: var(--muted); font-weight: 400; }
224
+ .chapter-meta {
225
+ font-family: var(--font-body);
226
+ font-size: var(--fs-sub);
227
+ font-weight: 400;
228
+ line-height: 1.3;
229
+ color: var(--muted);
230
+ margin: 0 0 56px 0;
231
+ }
232
+ .chapter-meta::before { content: '# '; color: var(--accent); }
233
+ .slide--chapter .chapter-title {
234
+ font-family: var(--font-display);
235
+ font-size: var(--fs-title);
236
+ font-weight: 800;
237
+ line-height: 1.05;
238
+ letter-spacing: -0.04em;
239
+ margin: 0 0 40px 0;
240
+ color: var(--ink);
241
+ max-width: 1500px;
242
+ text-wrap: balance;
243
+ }
244
+ .slide--chapter .chapter-desc {
245
+ font-family: var(--font-body);
246
+ font-size: var(--fs-sub);
247
+ font-weight: 400;
248
+ line-height: 1.35;
249
+ color: var(--ink-soft);
250
+ max-width: 1300px;
251
+ margin: 0;
252
+ }
253
+ .slide--chapter .chapter-desc::before { content: '> '; color: var(--accent); }
254
+ .slide--chapter.has-image .slide-body {
255
+ display: grid;
256
+ grid-template-columns: 1fr 1fr;
257
+ column-gap: 80px;
258
+ align-items: stretch;
259
+ }
260
+ .slide--chapter.has-image .chapter-content {
261
+ display: flex;
262
+ flex-direction: column;
263
+ justify-content: center;
264
+ align-items: flex-start;
265
+ }
266
+ .slide--chapter.has-image .chapter-title { font-size: calc(var(--fs-title) * 0.75); }
267
+ .slide--chapter.has-image .chapter-image {
268
+ width: 100%;
269
+ height: 100%;
270
+ min-height: 0;
271
+ box-sizing: border-box;
272
+ object-fit: cover;
273
+ border: 2px solid var(--rule);
274
+ }
275
+
276
+ /* ─────────────────────────────────────────────
277
+ LAYOUT: FOCUS — a statement printed by a command
278
+ ───────────────────────────────────────────── */
279
+ .slide--focus .slide-body {
280
+ justify-content: center;
281
+ align-items: flex-start;
282
+ }
283
+ .focus-eyebrow {
284
+ font-family: var(--font-body);
285
+ font-size: var(--fs-eyebrow);
286
+ font-weight: 400;
287
+ color: var(--muted);
288
+ margin: 0 0 24px 0;
289
+ }
290
+ .focus-eyebrow::before { content: '# '; color: var(--accent); }
291
+ .focus-content {
292
+ display: flex;
293
+ flex-direction: column;
294
+ width: 100%;
295
+ }
296
+ .focus-content::before {
297
+ content: '$ cat statement.txt';
298
+ font-size: var(--fs-sub);
299
+ font-weight: 400;
300
+ color: var(--muted);
301
+ margin-bottom: 40px;
302
+ }
303
+ .focus-statement,
304
+ .slide--focus .focus-content h1,
305
+ .slide--focus .focus-content p {
306
+ font-family: var(--font-display);
307
+ font-size: var(--fs-focus);
308
+ font-weight: 700;
309
+ line-height: 1.2;
310
+ letter-spacing: -0.03em;
311
+ color: var(--ink);
312
+ max-width: 1550px;
313
+ margin: 0;
314
+ text-wrap: balance;
315
+ }
316
+ .focus-attribution {
317
+ font-family: var(--font-body);
318
+ font-size: var(--fs-sub);
319
+ font-weight: 400;
320
+ color: var(--muted);
321
+ margin: 48px 0 0 0;
322
+ }
323
+ .focus-attribution::before { content: '# '; color: var(--accent); }
324
+
325
+ /* ─────────────────────────────────────────────
326
+ LAYOUT: IMAGE + TEXT
327
+ ───────────────────────────────────────────── */
328
+ .image-pane {
329
+ flex: 1.15;
330
+ min-width: 0;
331
+ display: flex;
332
+ align-items: center;
333
+ justify-content: center;
334
+ background: var(--surface);
335
+ border: 2px solid var(--rule);
336
+ overflow: hidden;
337
+ position: relative;
338
+ }
339
+ .image-placeholder {
340
+ width: 100%;
341
+ height: 100%;
342
+ background: repeating-linear-gradient(135deg, var(--surface) 0 22px, var(--bg) 22px 44px);
343
+ display: flex;
344
+ align-items: center;
345
+ justify-content: center;
346
+ }
347
+ .image-placeholder span {
348
+ font-family: var(--font-body);
349
+ font-size: 22px;
350
+ color: var(--muted);
351
+ background: var(--bg);
352
+ padding: 14px 20px;
353
+ border: 1px solid var(--rule);
354
+ }
355
+ .text-pane .title { font-size: var(--fs-h); }
356
+ .text-pane .body-text + .body-text { margin-top: 8px; }
357
+ .text-pane .eyebrow { margin-bottom: 12px; }
358
+
359
+ /* ─────────────────────────────────────────────
360
+ LAYOUT: SPLIT — two panes, divided like a tmux split
361
+ ───────────────────────────────────────────── */
362
+ .slide--split .split-columns { gap: 0; }
363
+ .slide--split .split-left { padding-right: 56px; }
364
+ .slide--split .split-right { padding-left: 56px; border-left: 2px solid var(--rule); }
365
+
366
+ /* ─────────────────────────────────────────────
367
+ LISTS — > for bullets, [1] for numbers
368
+ ───────────────────────────────────────────── */
369
+ .slide-body ul li {
370
+ font-weight: 400;
371
+ line-height: 1.45;
372
+ padding-left: 1.6em;
373
+ position: relative;
374
+ }
375
+ .slide-body ul li::before {
376
+ content: '>';
377
+ position: absolute;
378
+ left: 0;
379
+ top: 0;
380
+ color: var(--accent);
381
+ font-weight: 700;
382
+ }
383
+ .slide-body ol li {
384
+ padding-left: 2.6em;
385
+ font-weight: 400;
386
+ line-height: 1.45;
387
+ }
388
+ .slide-body ol li::before {
389
+ content: '[' counter(slide-ol) ']';
390
+ position: absolute;
391
+ left: 0;
392
+ top: 0;
393
+ font-weight: 700;
394
+ color: var(--accent);
395
+ }
396
+
397
+ /* ─────────────────────────────────────────────
398
+ LAYOUT: FULL-BLEED IMAGE
399
+ ───────────────────────────────────────────── */
400
+ .slide--full-bleed-image.has-overlay .slide-bg::after {
401
+ content: '';
402
+ position: absolute;
403
+ inset: 0;
404
+ background: rgba(0, 0, 0, 0.5);
405
+ }
406
+ .slide--full-bleed-image .overlay-title {
407
+ font-family: var(--font-display);
408
+ font-size: var(--fs-h);
409
+ font-weight: 700;
410
+ line-height: 1.15;
411
+ letter-spacing: -0.03em;
412
+ color: #fff;
413
+ margin: 0;
414
+ max-width: 1300px;
415
+ text-wrap: balance;
416
+ }
417
+
418
+ /* ─────────────────────────────────────────────
419
+ GENERIC / CONTENT SLIDE — the heading typed at the prompt
420
+ ───────────────────────────────────────────── */
421
+ .slide-body h1 {
422
+ font-family: var(--font-display);
423
+ font-size: var(--fs-h);
424
+ font-weight: 700;
425
+ line-height: 1.15;
426
+ letter-spacing: -0.03em;
427
+ color: var(--ink);
428
+ margin: 0 0 var(--gap-title) 0;
429
+ max-width: 1600px;
430
+ text-wrap: balance;
431
+ }
432
+ :is(.slide-body, .split-heading) > h1:first-child::before {
433
+ content: var(--prompt);
434
+ color: var(--muted);
435
+ font-weight: 400;
436
+ letter-spacing: -0.04em;
437
+ }
438
+ .slide-body h2 {
439
+ font-family: var(--font-display);
440
+ font-size: var(--fs-sub);
441
+ font-weight: 700;
442
+ line-height: 1.2;
443
+ letter-spacing: -0.02em;
444
+ color: var(--ink);
445
+ margin: 0 0 var(--gap-item) 0;
446
+ }
447
+ .slide-body h2:not(.chapter-title)::before { content: '## '; color: var(--accent); font-weight: 400; }
448
+ .slide-body p {
449
+ font-family: var(--font-body);
450
+ font-size: var(--fs-body);
451
+ font-weight: 400;
452
+ line-height: 1.55;
453
+ color: var(--ink-soft);
454
+ margin: 0 0 var(--gap-item) 0;
455
+ text-wrap: pretty;
456
+ }
457
+ .slide-body > p { max-width: 1550px; }
458
+
459
+ /* ─────────────────────────────────────────────
460
+ CALLOUTS — log lines: a level in brackets, no box
461
+ ───────────────────────────────────────────── */
462
+ .slide-body .callout {
463
+ --level: var(--accent);
464
+ display: flex;
465
+ align-items: baseline;
466
+ gap: 0.6em;
467
+ background: none;
468
+ border: 0;
469
+ padding: 0;
470
+ margin: 36px 0 0;
471
+ }
472
+ .slide-body :is(.callout-warning, .callout-caution, .callout-definition) { --level: var(--accent-2); }
473
+ .slide-body .callout:is(.callout-theorem, .callout-lemma, .callout-corollary, .callout-definition) .callout-title { color: var(--level); }
474
+ .slide-body .callout-important { --level: var(--ink); }
475
+ .slide-body .callout .callout-title {
476
+ flex: none;
477
+ font-size: var(--fs-body);
478
+ font-weight: 700;
479
+ letter-spacing: 0;
480
+ text-transform: lowercase;
481
+ color: var(--level);
482
+ margin: 0;
483
+ }
484
+ .slide-body .callout .callout-title::before { content: '['; }
485
+ .slide-body .callout .callout-title::after { content: ']'; }
486
+ .slide-body .callout p { padding-left: 0; margin: 0; color: var(--ink); font-size: var(--fs-body); }
487
+ .slide-body .callout > :not(.callout-title) + * { margin-top: 8px; }
488
+ /* A proof is a log line too: [proof] … ∎ */
489
+ .slide-body .callout.callout-proof { display: flex; }
490
+ .slide-body .callout.callout-proof .callout-title { float: none; font-style: normal; text-transform: lowercase; color: var(--muted); }
491
+ .slide-body .callout.callout-proof .callout-title::before { content: '['; }
492
+ .slide-body .callout.callout-proof .callout-title::after { content: ']'; }
493
+
494
+ /* ─────────────────────────────────────────────
495
+ CODE BLOCK — a window: a frame in the rule colour and a title bar
496
+ ───────────────────────────────────────────── */
497
+ .code-block {
498
+ --code-bg: var(--bg);
499
+ --code-radius: 0;
500
+ --code-size: 26px;
501
+ background: var(--code-bg);
502
+ border: 2px solid var(--rule);
503
+ border-top: 0;
504
+ border-radius: 0;
505
+ padding: 32px 40px;
506
+ margin: 0;
507
+ overflow: hidden;
508
+ font-size: var(--code-size);
509
+ font-family: var(--font-body);
510
+ line-height: 1.6;
511
+ }
512
+ /* The title bar with three window buttons, above the code (outside it, so
513
+ it stays when tall code scrolls). */
514
+ .code-block-wrapper::before {
515
+ content: '';
516
+ display: block;
517
+ height: 40px;
518
+ box-sizing: border-box;
519
+ border: 2px solid var(--rule);
520
+ background:
521
+ radial-gradient(circle at 24px 50%, var(--muted) 0 6px, transparent 7px),
522
+ radial-gradient(circle at 46px 50%, var(--muted) 0 6px, transparent 7px),
523
+ radial-gradient(circle at 68px 50%, var(--muted) 0 6px, transparent 7px),
524
+ var(--surface);
525
+ }
526
+ .code-block code {
527
+ font-family: inherit;
528
+ font-size: inherit;
529
+ background: none;
530
+ padding: 0;
531
+ }
532
+ .code-output { font-family: var(--font-body); border-radius: 0; }
533
+
534
+ /* ─────────────────────────────────────────────
535
+ AUDIENCE QUESTIONS — square bars, a framed join code
536
+ ───────────────────────────────────────────── */
537
+ .slide .poll-track, .slide .poll-fill, .slide .scale-track, .slide .scale-fill { border-radius: 0; }
538
+ .slide .poll-track, .slide .scale-track { background: var(--surface); }
539
+ .slide .question-cards li { border-radius: 0; background: var(--surface); }
540
+ .slide .poll-join { border-radius: 0; border: 2px solid var(--rule); }
541
+
542
+ /* ─────────────────────────────────────────────
543
+ MATH (KaTeX)
544
+ ───────────────────────────────────────────── */
545
+ .slide .katex-display {
546
+ font-size: var(--fs-sub);
547
+ margin: 48px 0;
548
+ overflow-x: auto;
549
+ overflow-y: hidden;
550
+ }
Binary file
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 560 160" width="560" height="160">
2
+ <title>mdeck</title>
3
+ <g transform="translate(16 16) scale(0.25)">
4
+ <rect width="512" height="512" rx="96" fill="#0d9488"/>
5
+ <rect x="72" y="136" width="368" height="240" rx="18" fill="#f4f1e8"/>
6
+ <g fill="#0d9488"><rect x="132" y="176" width="26" height="160" rx="13"/><rect x="184" y="176" width="26" height="160" rx="13"/><rect x="102" y="222" width="140" height="26" rx="13"/><rect x="102" y="266" width="140" height="26" rx="13"/></g>
7
+ <g fill="#1b1a17" opacity="0.85"><rect x="268" y="226" width="130" height="20" rx="10"/><rect x="268" y="276" width="88" height="20" rx="10"/></g>
8
+ </g>
9
+ <text x="172" y="112" font-family="'Inter Tight', 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif" font-weight="800" font-size="96" letter-spacing="-3" fill="#f4f1e8">mdeck</text>
10
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 560 160" width="560" height="160">
2
+ <title>mdeck</title>
3
+ <g transform="translate(16 16) scale(0.25)">
4
+ <rect width="512" height="512" rx="96" fill="#0d9488"/>
5
+ <rect x="72" y="136" width="368" height="240" rx="18" fill="#f4f1e8"/>
6
+ <g fill="#0d9488"><rect x="132" y="176" width="26" height="160" rx="13"/><rect x="184" y="176" width="26" height="160" rx="13"/><rect x="102" y="222" width="140" height="26" rx="13"/><rect x="102" y="266" width="140" height="26" rx="13"/></g>
7
+ <g fill="#1b1a17" opacity="0.85"><rect x="268" y="226" width="130" height="20" rx="10"/><rect x="268" y="276" width="88" height="20" rx="10"/></g>
8
+ </g>
9
+ <text x="172" y="112" font-family="'Inter Tight', 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif" font-weight="800" font-size="96" letter-spacing="-3" fill="#1b1a17">mdeck</text>
10
+ </svg>
@@ -0,0 +1,15 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
2
+ <title>mdeck</title>
3
+ <rect width="512" height="512" rx="96" fill="#0d9488"/>
4
+ <rect x="72" y="136" width="368" height="240" rx="18" fill="#f4f1e8"/>
5
+ <g fill="#0d9488">
6
+ <rect x="132" y="176" width="26" height="160" rx="13"/>
7
+ <rect x="184" y="176" width="26" height="160" rx="13"/>
8
+ <rect x="102" y="222" width="140" height="26" rx="13"/>
9
+ <rect x="102" y="266" width="140" height="26" rx="13"/>
10
+ </g>
11
+ <g fill="#1b1a17" opacity="0.85">
12
+ <rect x="268" y="226" width="130" height="20" rx="10"/>
13
+ <rect x="268" y="276" width="88" height="20" rx="10"/>
14
+ </g>
15
+ </svg>
package/bin/mdeck.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../src/cli/index.js'
package/docs/README.md ADDED
@@ -0,0 +1,8 @@
1
+ # Documentation
2
+
3
+ - [site/](site/) contains the documentation website and beginner-friendly guides.
4
+ - [reference/](reference/) contains the technical references used by the site and
5
+ authoring tools.
6
+
7
+ Run `mdeck docs` to open the guide, or `npm run docs:build` from the repository
8
+ root to build static HTML in `docs/site/dist/`.