keyframes 0.1.0__py3-none-any.whl

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 (77) hide show
  1. keyframes/__init__.py +1 -0
  2. keyframes/build.py +102 -0
  3. keyframes/check.py +107 -0
  4. keyframes/cli.py +149 -0
  5. keyframes/deck.py +67 -0
  6. keyframes/export.py +106 -0
  7. keyframes/guide/__init__.py +25 -0
  8. keyframes/guide/components/keyframes-code.md +60 -0
  9. keyframes/guide/components/keyframes-excalidraw.md +148 -0
  10. keyframes/guide/components/keyframes-mujoco.md +76 -0
  11. keyframes/guide/components/keyframes-slider.md +65 -0
  12. keyframes/guide/components/keyframes-three.md +81 -0
  13. keyframes/guide/core.md +113 -0
  14. keyframes/patch.py +77 -0
  15. keyframes/render.py +32 -0
  16. keyframes/scaffold/.gitignore +3 -0
  17. keyframes/scaffold/CLAUDE.md +1 -0
  18. keyframes/scaffold/assets/deck.css +1 -0
  19. keyframes/scaffold/assets/figure.svg +1 -0
  20. keyframes/scaffold/deck.toml +10 -0
  21. keyframes/scaffold/references/.gitkeep +0 -0
  22. keyframes/scaffold/slides/01-title.html +4 -0
  23. keyframes/scaffold/slides/02-intro.html +17 -0
  24. keyframes/server.py +204 -0
  25. keyframes/static/components/keyframes-code.js +423 -0
  26. keyframes/static/components/keyframes-excalidraw.js +189 -0
  27. keyframes/static/components/keyframes-mujoco.js +515 -0
  28. keyframes/static/components/keyframes-slider.js +255 -0
  29. keyframes/static/components/keyframes-three.js +224 -0
  30. keyframes/static/editor/editor.css +228 -0
  31. keyframes/static/editor/editor.js +594 -0
  32. keyframes/static/editor/panel.css +127 -0
  33. keyframes/static/editor/panel.js +357 -0
  34. keyframes/static/index.html +23 -0
  35. keyframes/static/runtime/component.js +126 -0
  36. keyframes/static/runtime/live.js +31 -0
  37. keyframes/static/runtime/math.js +33 -0
  38. keyframes/static/runtime/presenter.js +91 -0
  39. keyframes/static/runtime/runtime.css +91 -0
  40. keyframes/static/runtime/runtime.js +215 -0
  41. keyframes/static/runtime/steps.js +15 -0
  42. keyframes/terminal.py +144 -0
  43. keyframes/themes/default/STYLE_GUIDE.md +73 -0
  44. keyframes/themes/default/assets/arc-top.webp +0 -0
  45. keyframes/themes/default/assets/orbit-ring.webp +0 -0
  46. keyframes/themes/default/assets/streaks-top.webp +0 -0
  47. keyframes/themes/default/assets/streaks-wide.webp +0 -0
  48. keyframes/themes/default/assets/sun-top.webp +0 -0
  49. keyframes/themes/default/assets/title-orbit.webp +0 -0
  50. keyframes/themes/default/layouts/content.html +16 -0
  51. keyframes/themes/default/layouts/figure.html +7 -0
  52. keyframes/themes/default/layouts/grid-2.html +19 -0
  53. keyframes/themes/default/layouts/grid-3x2.html +28 -0
  54. keyframes/themes/default/layouts/grid-4.html +44 -0
  55. keyframes/themes/default/layouts/media-side.html +16 -0
  56. keyframes/themes/default/layouts/section-arc.html +4 -0
  57. keyframes/themes/default/layouts/section-streaks.html +4 -0
  58. keyframes/themes/default/layouts/section.html +4 -0
  59. keyframes/themes/default/layouts/split-wide.html +7 -0
  60. keyframes/themes/default/layouts/split.html +13 -0
  61. keyframes/themes/default/layouts/statement.html +4 -0
  62. keyframes/themes/default/layouts/title.html +5 -0
  63. keyframes/themes/default/layouts/two-column.html +5 -0
  64. keyframes/themes/default/theme.css +330 -0
  65. keyframes/themes/minimal/STYLE_GUIDE.md +41 -0
  66. keyframes/themes/minimal/layouts/figure.html +7 -0
  67. keyframes/themes/minimal/layouts/section.html +4 -0
  68. keyframes/themes/minimal/layouts/statement.html +3 -0
  69. keyframes/themes/minimal/layouts/title-body.html +10 -0
  70. keyframes/themes/minimal/layouts/title.html +5 -0
  71. keyframes/themes/minimal/layouts/two-column.html +11 -0
  72. keyframes/themes/minimal/theme.css +196 -0
  73. keyframes/vendor.py +181 -0
  74. keyframes-0.1.0.dist-info/METADATA +119 -0
  75. keyframes-0.1.0.dist-info/RECORD +77 -0
  76. keyframes-0.1.0.dist-info/WHEEL +4 -0
  77. keyframes-0.1.0.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,19 @@
1
+ <section data-layout="content">
2
+ <h2 class="title" data-block="title" data-x="88" data-y="72" data-w="1663" data-h="104">One-sentence claim the two panels support</h2>
3
+ <div class="media" data-block="left" data-x="107" data-y="180" data-w="833" data-h="469">
4
+ <img class="contain" src="assets/left.png" alt="">
5
+ </div>
6
+ <p class="caption" data-block="left-caption" data-x="88" data-y="656" data-w="871" data-h="60">What happens · real robot, 2× speed</p>
7
+ <div class="media" data-block="right" data-x="980" data-y="180" data-w="833" data-h="469">
8
+ <img class="contain" src="assets/right.png" alt="">
9
+ </div>
10
+ <p class="caption" data-block="right-caption" data-x="961" data-y="656" data-w="871" data-h="60">What happens · simulation, 1× speed</p>
11
+ <div class="body" data-block="points" data-x="88" data-y="750" data-w="1744" data-h="190">
12
+ <ul class="small">
13
+ <li>Supporting point with a number: 12/15 successes</li>
14
+ <li data-step="1">Takeaway revealed last</li>
15
+ </ul>
16
+ </div>
17
+ <p class="cite" data-block="cite" data-x="88" data-y="975" data-w="1660" data-h="60">Author et al. Venue Year · Author et al. Venue Year</p>
18
+ <aside class="notes">Point at the difference between the panels, then give the so-what.</aside>
19
+ </section>
@@ -0,0 +1,28 @@
1
+ <section data-layout="content">
2
+ <h2 class="title" data-block="title" data-x="88" data-y="72" data-w="1663" data-h="104">One-sentence claim the grid demonstrates</h2>
3
+ <div class="media" data-block="clip-1" data-x="107" data-y="180" data-w="546" data-h="307">
4
+ <video src="assets/clip-1.mp4" autoplay muted loop playsinline></video>
5
+ </div>
6
+ <p class="caption" data-block="caption-1" data-x="88" data-y="492" data-w="584" data-h="60">Condition 1 · real, 1×</p>
7
+ <div class="media" data-block="clip-2" data-x="687" data-y="180" data-w="546" data-h="307">
8
+ <video src="assets/clip-2.mp4" autoplay muted loop playsinline></video>
9
+ </div>
10
+ <p class="caption" data-block="caption-2" data-x="668" data-y="492" data-w="584" data-h="60">Condition 2 · real, 1×</p>
11
+ <div class="media" data-block="clip-3" data-x="1267" data-y="180" data-w="546" data-h="307">
12
+ <video src="assets/clip-3.mp4" autoplay muted loop playsinline></video>
13
+ </div>
14
+ <p class="caption" data-block="caption-3" data-x="1248" data-y="492" data-w="584" data-h="60">Condition 3 · real, 1×</p>
15
+ <div class="media" data-block="clip-4" data-x="107" data-y="565" data-w="546" data-h="307">
16
+ <video src="assets/clip-4.mp4" autoplay muted loop playsinline></video>
17
+ </div>
18
+ <p class="caption" data-block="caption-4" data-x="88" data-y="877" data-w="584" data-h="60">Condition 4 · real, 1×</p>
19
+ <div class="media" data-block="clip-5" data-x="687" data-y="565" data-w="546" data-h="307">
20
+ <video src="assets/clip-5.mp4" autoplay muted loop playsinline></video>
21
+ </div>
22
+ <p class="caption" data-block="caption-5" data-x="668" data-y="877" data-w="584" data-h="60">Condition 5 · real, 1×</p>
23
+ <div class="media" data-block="clip-6" data-x="1267" data-y="565" data-w="546" data-h="307">
24
+ <video src="assets/clip-6.mp4" autoplay muted loop playsinline></video>
25
+ </div>
26
+ <p class="caption" data-block="caption-6" data-x="1248" data-y="877" data-w="584" data-h="60">Condition 6 · real, 1×</p>
27
+ <p class="cite" data-block="cite" data-x="88" data-y="975" data-w="1660" data-h="60">Author et al. Venue Year</p>
28
+ </section>
@@ -0,0 +1,44 @@
1
+ <section data-layout="content">
2
+ <h2 class="title" data-block="title" data-x="88" data-y="72" data-w="1663" data-h="104">One-sentence claim across four approaches</h2>
3
+ <div class="media" data-block="media-1" data-x="107" data-y="180" data-w="404" data-h="303">
4
+ <img class="contain" src="assets/figure-1.png" alt="">
5
+ </div>
6
+ <div class="body" data-block="text-1" data-x="88" data-y="495" data-w="423" data-h="440">
7
+ <h3 class="subhead">Heading 1</h3>
8
+ <ul class="small">
9
+ <li>Short point</li>
10
+ <li>Short point</li>
11
+ </ul>
12
+ </div>
13
+ <div class="media" data-block="media-2" data-x="541" data-y="180" data-w="404" data-h="303">
14
+ <img class="contain" src="assets/figure-2.png" alt="">
15
+ </div>
16
+ <div class="body" data-block="text-2" data-x="522" data-y="495" data-w="423" data-h="440">
17
+ <h3 class="subhead">Heading 2</h3>
18
+ <ul class="small">
19
+ <li>Short point</li>
20
+ <li>Short point</li>
21
+ </ul>
22
+ </div>
23
+ <div class="media" data-block="media-3" data-x="975" data-y="180" data-w="404" data-h="303">
24
+ <img class="contain" src="assets/figure-3.png" alt="">
25
+ </div>
26
+ <div class="body" data-block="text-3" data-x="956" data-y="495" data-w="423" data-h="440">
27
+ <h3 class="subhead">Heading 3</h3>
28
+ <ul class="small">
29
+ <li>Short point</li>
30
+ <li>Short point</li>
31
+ </ul>
32
+ </div>
33
+ <div class="media" data-block="media-4" data-x="1409" data-y="180" data-w="404" data-h="303">
34
+ <img class="contain" src="assets/figure-4.png" alt="">
35
+ </div>
36
+ <div class="body" data-block="text-4" data-x="1390" data-y="495" data-w="423" data-h="440">
37
+ <h3 class="subhead">Heading 4</h3>
38
+ <ul class="small">
39
+ <li>Short point</li>
40
+ <li>Short point</li>
41
+ </ul>
42
+ </div>
43
+ <p class="cite" data-block="cite" data-x="88" data-y="975" data-w="1660" data-h="60">Author et al. Venue Year</p>
44
+ </section>
@@ -0,0 +1,16 @@
1
+ <section data-layout="content">
2
+ <h2 class="title" data-block="title" data-x="88" data-y="72" data-w="1663" data-h="104">One-sentence claim the media shows</h2>
3
+ <div class="media" data-block="media" data-x="107" data-y="180" data-w="1160" data-h="653">
4
+ <video src="assets/clip.mp4" autoplay muted loop playsinline></video>
5
+ </div>
6
+ <p class="caption" data-block="caption" data-x="88" data-y="840" data-w="1198" data-h="60">What happens · real robot, 1× speed</p>
7
+ <div class="body" data-block="side" data-x="1291" data-y="162" data-w="541" data-h="760">
8
+ <p class="lead">One sentence on what to look for.</p>
9
+ <table>
10
+ <tr><th>Method</th><th>Success</th></tr>
11
+ <tr><td>Baseline</td><td>41%</td></tr>
12
+ <tr><td>Ours</td><td>87%</td></tr>
13
+ </table>
14
+ </div>
15
+ <p class="cite" data-block="cite" data-x="88" data-y="975" data-w="1660" data-h="60">Author et al. Venue Year</p>
16
+ </section>
@@ -0,0 +1,4 @@
1
+ <section data-layout="section-arc">
2
+ <h1 class="headline" data-block="title" data-x="220" data-y="401" data-w="1471" data-h="208">Extra Slides</h1>
3
+ <p class="eyebrow" data-block="subtitle" data-x="220" data-y="609" data-w="735" data-h="64">Optional one-line description</p>
4
+ </section>
@@ -0,0 +1,4 @@
1
+ <section data-layout="section-streaks">
2
+ <h1 class="headline" data-block="title" data-x="220" data-y="401" data-w="1471" data-h="208">Part III: Section Name</h1>
3
+ <p class="eyebrow" data-block="subtitle" data-x="220" data-y="609" data-w="735" data-h="64">Optional one-line description</p>
4
+ </section>
@@ -0,0 +1,4 @@
1
+ <section data-layout="section">
2
+ <h1 class="headline" data-block="title" data-x="220" data-y="401" data-w="1471" data-h="208">Part I: Section Name</h1>
3
+ <p class="eyebrow" data-block="subtitle" data-x="220" data-y="609" data-w="735" data-h="64">Optional one-line description</p>
4
+ </section>
@@ -0,0 +1,7 @@
1
+ <section data-layout="split-wide">
2
+ <h2 class="title" data-block="title" data-x="88" data-y="72" data-w="469" data-h="104">Slide Title</h2>
3
+ <div class="body" data-block="body" data-x="88" data-y="175" data-w="469" data-h="748">Short explanation.</div>
4
+ <div class="media" data-block="figure" data-x="660" data-y="80" data-w="1210" data-h="920">
5
+ <img class="contain" src="assets/figure.png" alt="">
6
+ </div>
7
+ </section>
@@ -0,0 +1,13 @@
1
+ <section data-layout="split">
2
+ <h2 class="title" data-block="title" data-x="88" data-y="72" data-w="800" data-h="104">Slide Title</h2>
3
+ <div class="body" data-block="body" data-x="88" data-y="175" data-w="800" data-h="748">
4
+ Text on the left:
5
+ <ul class="small">
6
+ <li>Point one</li>
7
+ <li>Point two</li>
8
+ </ul>
9
+ </div>
10
+ <div class="media" data-block="figure" data-x="1010" data-y="92" data-w="860" data-h="896">
11
+ <img class="contain" src="assets/figure.png" alt="">
12
+ </div>
13
+ </section>
@@ -0,0 +1,4 @@
1
+ <section data-layout="content">
2
+ <h2 class="title" data-block="title" data-x="88" data-y="72" data-w="1663" data-h="104">Slide Title</h2>
3
+ <p class="statement" data-block="statement" data-x="88" data-y="300" data-w="1744" data-h="489">One big idea</p>
4
+ </section>
@@ -0,0 +1,5 @@
1
+ <section data-layout="title">
2
+ <h1 class="headline" data-block="title" data-x="220" data-y="193" data-w="735" data-h="220">Talk Title on Two Lines</h1>
3
+ <p class="subtitle" data-block="subtitle" data-x="220" data-y="465" data-w="735" data-h="135">Optional subtitle</p>
4
+ <p class="byline" data-block="byline" data-x="220" data-y="698" data-w="735" data-h="130">Speaker Name<br>Venue · Date</p>
5
+ </section>
@@ -0,0 +1,5 @@
1
+ <section data-layout="content">
2
+ <h2 class="title" data-block="title" data-x="88" data-y="72" data-w="1663" data-h="104">Slide Title</h2>
3
+ <div class="body" data-block="left" data-x="88" data-y="200" data-w="840" data-h="760">Left column</div>
4
+ <div class="body" data-block="right" data-x="992" data-y="200" data-w="840" data-h="760">Right column</div>
5
+ </section>
@@ -0,0 +1,330 @@
1
+ @import url("../_vendor/fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&family=Roboto:ital,wght@0,300;0,400;0,700;1,300;1,400&family=Roboto+Mono:wght@400;500&display=swap");
2
+
3
+ /* Clone of the Google Slides "simple-light-2" template. Geometry is in canvas px (1920×1080),
4
+ converted from the template's EMU coordinates; type sizes measured from its PDF export. */
5
+
6
+ :root {
7
+ --ink: #202124;
8
+ --fg: #606366;
9
+ --muted: #9aa0a6;
10
+ --panel: #f8f9fa;
11
+ --link: #0097a7;
12
+ --blue: #4285f4;
13
+ --red: #ea4335;
14
+ --yellow: #fbbc04;
15
+ --green: #34a853;
16
+ --accent: var(--blue);
17
+ --accent-2: var(--yellow);
18
+ --surface: var(--panel);
19
+ --border: #dadce0;
20
+ --font-display: "Google Sans", "Product Sans", Roboto, sans-serif;
21
+ --font-sans: Roboto, Arial, sans-serif;
22
+ --font-mono: "Roboto Mono", ui-monospace, monospace;
23
+ --inset: 18px 19px 10px;
24
+ }
25
+
26
+ .keyframes-slide > section {
27
+ background: #fff;
28
+ color: var(--fg);
29
+ font-family: var(--font-sans);
30
+ font-weight: 300;
31
+ font-size: 37.3px;
32
+ line-height: 1.4;
33
+ }
34
+
35
+ .keyframes-slide > section::before {
36
+ content: "";
37
+ position: absolute;
38
+ pointer-events: none;
39
+ background: no-repeat center / 100% 100%;
40
+ }
41
+
42
+ .keyframes-slide::after {
43
+ content: attr(data-number);
44
+ position: absolute;
45
+ left: 1760px;
46
+ top: 1002px;
47
+ width: 129px;
48
+ height: 39px;
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: flex-end;
52
+ padding-right: 19px;
53
+ box-sizing: border-box;
54
+ font: 400 18.7px var(--font-display);
55
+ color: var(--fg);
56
+ }
57
+
58
+ .keyframes-slide:has(> section[data-layout^="title"])::after {
59
+ display: none;
60
+ }
61
+
62
+ /* Text roles. Text boxes carry Google Slides' default insets so geometry matches the template. */
63
+
64
+ .headline,
65
+ .title,
66
+ .subtitle,
67
+ .body,
68
+ .small,
69
+ .caption,
70
+ .cite,
71
+ .eyebrow,
72
+ .statement {
73
+ margin: 0;
74
+ padding: var(--inset);
75
+ box-sizing: border-box;
76
+ }
77
+
78
+ .headline {
79
+ font: 700 80px/1.2 var(--font-display);
80
+ color: var(--ink);
81
+ }
82
+
83
+ .title {
84
+ font: 700 53.3px/1.2 var(--font-display);
85
+ color: var(--ink);
86
+ }
87
+
88
+ .subtitle {
89
+ font: 400 48px/1.2 var(--font-display);
90
+ color: var(--fg);
91
+ }
92
+
93
+ .byline {
94
+ margin: 0;
95
+ padding: var(--inset);
96
+ font: 400 37.3px/1.2 var(--font-display);
97
+ color: var(--fg);
98
+ }
99
+
100
+ .byline a,
101
+ section a {
102
+ color: var(--link);
103
+ }
104
+
105
+ .eyebrow {
106
+ font: 400 24px/1.3 var(--font-display);
107
+ color: var(--fg);
108
+ }
109
+
110
+ .lead {
111
+ margin: 0 0 0.5em;
112
+ font: 300 28px/1.35 var(--font-sans);
113
+ color: var(--ink);
114
+ }
115
+
116
+ .subhead {
117
+ margin: 0 0 0.3em;
118
+ font: 500 28px/1.3 var(--font-display);
119
+ color: var(--ink);
120
+ }
121
+
122
+ .body {
123
+ font-weight: 300;
124
+ font-size: 37.3px;
125
+ line-height: 1.4;
126
+ color: var(--fg);
127
+ }
128
+
129
+ .small,
130
+ .body .small {
131
+ font-weight: 300;
132
+ font-size: 24px;
133
+ line-height: 1.6;
134
+ color: var(--fg);
135
+ }
136
+
137
+ .body ul,
138
+ .body ol,
139
+ ul.body,
140
+ ol.body {
141
+ margin: 0.15em 0 0.6em;
142
+ padding-left: 1.4em;
143
+ }
144
+
145
+ .body li {
146
+ line-height: 1.45;
147
+ }
148
+
149
+ .body li + li {
150
+ margin-top: 0.5em;
151
+ }
152
+
153
+ .body ul > li {
154
+ list-style: none;
155
+ position: relative;
156
+ }
157
+
158
+ .body ul > li::before {
159
+ content: "●";
160
+ position: absolute;
161
+ left: -1.1em;
162
+ font-family: Arial, sans-serif;
163
+ font-weight: 400;
164
+ color: var(--muted);
165
+ }
166
+
167
+ .body ul.small {
168
+ margin-top: -0.3em;
169
+ }
170
+
171
+ .body ol > li::marker {
172
+ font-family: Arial, sans-serif;
173
+ color: var(--muted);
174
+ }
175
+
176
+ .body b,
177
+ .body strong {
178
+ font-weight: 700;
179
+ }
180
+
181
+ .caption {
182
+ font: 400 24px/1.3 var(--font-display);
183
+ color: var(--fg);
184
+ }
185
+
186
+ .cite {
187
+ font: 400 18.7px/1.2 var(--font-display);
188
+ color: var(--fg);
189
+ }
190
+
191
+ table {
192
+ width: 100%;
193
+ border-collapse: collapse;
194
+ font: 300 24px/1.35 var(--font-sans);
195
+ color: var(--fg);
196
+ }
197
+
198
+ th {
199
+ font: 500 24px/1.35 var(--font-display);
200
+ color: var(--ink);
201
+ text-align: left;
202
+ }
203
+
204
+ th,
205
+ td {
206
+ padding: 10px 20px 10px 0;
207
+ border-bottom: 1px solid var(--border);
208
+ }
209
+
210
+ .statement {
211
+ font: 300 128px/1.2 var(--font-sans);
212
+ color: var(--fg);
213
+ text-align: center;
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ }
218
+
219
+ .accent {
220
+ color: var(--accent);
221
+ }
222
+
223
+ /* Containers */
224
+
225
+ .card {
226
+ background: var(--panel);
227
+ border: 1px solid var(--border);
228
+ border-radius: 8px;
229
+ padding: 32px;
230
+ box-sizing: border-box;
231
+ }
232
+
233
+ .media {
234
+ overflow: hidden;
235
+ }
236
+
237
+ .media > img,
238
+ .media > video,
239
+ .fill {
240
+ display: block;
241
+ width: 100%;
242
+ height: 100%;
243
+ object-fit: cover;
244
+ }
245
+
246
+ img.contain,
247
+ video.contain,
248
+ .contain,
249
+ .media.contain > * {
250
+ object-fit: contain;
251
+ }
252
+
253
+ .media.figure {
254
+ background: #fff;
255
+ }
256
+
257
+ code {
258
+ font-family: var(--font-mono);
259
+ font-size: 0.85em;
260
+ }
261
+
262
+ /* Layouts */
263
+
264
+ section[data-layout="title"]::before {
265
+ left: 916px;
266
+ top: -6px;
267
+ width: 1004px;
268
+ height: 1086px;
269
+ background-image: url("assets/title-orbit.webp");
270
+ }
271
+
272
+ section[data-layout="title-ring"]::before {
273
+ left: 696px;
274
+ top: 205px;
275
+ width: 1224px;
276
+ height: 876px;
277
+ background-image: url("assets/orbit-ring.webp");
278
+ }
279
+
280
+ section[data-layout="title-streaks"]::before {
281
+ left: 946px;
282
+ top: 41px;
283
+ width: 974px;
284
+ height: 964px;
285
+ background-image: url("assets/streaks-wide.webp");
286
+ }
287
+
288
+ section[data-layout^="section"] {
289
+ background: var(--panel);
290
+ }
291
+
292
+ section[data-layout="section"]::before {
293
+ left: 0;
294
+ top: 0;
295
+ width: 511px;
296
+ height: 256px;
297
+ background-image: url("assets/sun-top.webp");
298
+ }
299
+
300
+ section[data-layout="section-arc"]::before {
301
+ left: 129px;
302
+ top: 0;
303
+ width: 487px;
304
+ height: 194px;
305
+ background-image: url("assets/arc-top.webp");
306
+ }
307
+
308
+ section[data-layout="section-streaks"]::before {
309
+ left: 8px;
310
+ top: 14px;
311
+ width: 422px;
312
+ height: 262px;
313
+ background-image: url("assets/streaks-top.webp");
314
+ }
315
+
316
+ section[data-layout="split"]::before {
317
+ left: 960px;
318
+ top: 0;
319
+ width: 960px;
320
+ height: 1080px;
321
+ background: var(--panel);
322
+ }
323
+
324
+ section[data-layout="split-wide"]::before {
325
+ left: 610px;
326
+ top: 0;
327
+ width: 1310px;
328
+ height: 1080px;
329
+ background: var(--panel);
330
+ }
@@ -0,0 +1,41 @@
1
+ # Theme: minimal
2
+
3
+ Clean, high-contrast research-talk style. Inter for text, JetBrains Mono for code.
4
+
5
+ ## Palette (CSS variables)
6
+
7
+ | var | use |
8
+ | --- | --- |
9
+ | `--fg` `#16181d` | body text |
10
+ | `--muted` `#5d6470` | captions, secondary text |
11
+ | `--accent` `#2f6fed` | emphasis, eyebrows, key numbers (use sparingly) |
12
+ | `--accent-2` `#f2994a` | second series / contrast highlight |
13
+ | `--surface` `#f4f6fa` | cards, code background |
14
+ | `--border` `#dfe3ea` | hairlines |
15
+
16
+ ## Type scale (on the 1920×1080 canvas)
17
+
18
+ | class | size | use |
19
+ | --- | --- | --- |
20
+ | `title` | 64px / 700 | one per slide, ≤ 8 words |
21
+ | `subtitle` | 36px | under titles on title/section slides |
22
+ | `body` | 32px | bullets and paragraphs; ≤ 6 bullets, ≤ 2 lines each |
23
+ | `lead` | 28px | one-sentence takeaway or setup next to media |
24
+ | `subhead` | 28px / 600 | column / tile heading |
25
+ | `small` | 24px | detail bullets (`<ul class="small">`) |
26
+ | `caption` | 22px muted | figure captions |
27
+ | `cite` | 18px muted | references footer, `Author et al. Venue Year · …` |
28
+ | `eyebrow` | 22px caps accent | kicker above a title |
29
+
30
+ ## Spacing
31
+
32
+ - Outer margin 96px left/right; titles at y=72 with h=96; content starts at y=220.
33
+ - Gutter between columns: 48px. Content bottom edge ≤ 1000.
34
+ - Cards: `card` class (20px radius, 40px padding). Media: `media` class (16px radius, clips,
35
+ black background); `media contain` letterboxes any child, `media figure` uses a white background.
36
+ - Tables: plain `<table>` with `<th>` headers, 24px, hairline rows.
37
+
38
+ ## Layouts
39
+
40
+ `title`, `section` (full-bleed accent), `title-body`, `two-column`, `figure`, `statement`.
41
+ Set `data-layout` on the `<section>`; the title and section layouts hide the slide number.
@@ -0,0 +1,7 @@
1
+ <section data-layout="figure">
2
+ <h2 class="title" data-block="title" data-x="96" data-y="72" data-w="1728" data-h="96">Slide title</h2>
3
+ <div class="media" data-block="figure" data-x="96" data-y="200" data-w="1728" data-h="740">
4
+ <img class="contain" src="assets/figure.png" alt="">
5
+ </div>
6
+ <p class="caption" data-block="caption" data-x="96" data-y="960" data-w="1728" data-h="60">Figure caption, source.</p>
7
+ </section>
@@ -0,0 +1,4 @@
1
+ <section data-layout="section">
2
+ <p class="eyebrow" data-block="eyebrow" data-x="160" data-y="420" data-w="1600" data-h="40">Part 2</p>
3
+ <h1 class="title" data-block="title" data-x="160" data-y="480" data-w="1600" data-h="160">Section name</h1>
4
+ </section>
@@ -0,0 +1,3 @@
1
+ <section data-layout="statement">
2
+ <p class="title" data-block="statement" data-x="240" data-y="380" data-w="1440" data-h="320" style="text-align:center">One big idea, stated plainly.</p>
3
+ </section>
@@ -0,0 +1,10 @@
1
+ <section data-layout="title-body">
2
+ <h2 class="title" data-block="title" data-x="96" data-y="72" data-w="1728" data-h="96">Slide title</h2>
3
+ <div class="body" data-block="body" data-x="96" data-y="220" data-w="1728" data-h="760">
4
+ <ul>
5
+ <li>First point</li>
6
+ <li data-step="1">Revealed on the first click</li>
7
+ </ul>
8
+ </div>
9
+ <aside class="notes">Speaker notes go here.</aside>
10
+ </section>
@@ -0,0 +1,5 @@
1
+ <section data-layout="title">
2
+ <p class="eyebrow" data-block="eyebrow" data-x="160" data-y="360" data-w="1600" data-h="40">Venue · Date</p>
3
+ <h1 class="title" data-block="title" data-x="160" data-y="420" data-w="1600" data-h="200">Talk title</h1>
4
+ <p class="subtitle" data-block="subtitle" data-x="160" data-y="640" data-w="1600" data-h="120">Speaker name · Affiliation</p>
5
+ </section>
@@ -0,0 +1,11 @@
1
+ <section data-layout="two-column">
2
+ <h2 class="title" data-block="title" data-x="96" data-y="72" data-w="1728" data-h="96">Slide title</h2>
3
+ <div class="body" data-block="left" data-x="96" data-y="220" data-w="840" data-h="780">
4
+ <ul>
5
+ <li>Left column point</li>
6
+ </ul>
7
+ </div>
8
+ <div class="card" data-block="right" data-x="984" data-y="220" data-w="840" data-h="780">
9
+ Right column: text, a figure, or an embed.
10
+ </div>
11
+ </section>