decktile 0.2.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 (46) hide show
  1. decktile/__init__.py +5 -0
  2. decktile/__main__.py +3 -0
  3. decktile/assets/lucide/VENDORED.md +21 -0
  4. decktile/assets/lucide/lucide.css +2193 -0
  5. decktile/assets/lucide/lucide.ttf +3 -0
  6. decktile/cli.py +269 -0
  7. decktile/parser/__init__.py +0 -0
  8. decktile/parser/ast.py +191 -0
  9. decktile/parser/markdown.py +289 -0
  10. decktile/plugins/cards.py +25 -0
  11. decktile/plugins/directives.py +56 -0
  12. decktile/plugins/fenced.py +228 -0
  13. decktile/plugins/layouts.py +69 -0
  14. decktile/plugins/lucide.py +65 -0
  15. decktile/plugins/lucide_font.py +26 -0
  16. decktile/render/__init__.py +0 -0
  17. decktile/render/html.py +287 -0
  18. decktile/render/ir.py +536 -0
  19. decktile/render/odf/__init__.py +4 -0
  20. decktile/render/odf/geometry.py +510 -0
  21. decktile/render/odf/shapes.py +719 -0
  22. decktile/render/odf/styles.py +828 -0
  23. decktile/render/odp.py +380 -0
  24. decktile/render/pdf.py +17 -0
  25. decktile/render/pdg.py +72 -0
  26. decktile/render/seaborn.py +155 -0
  27. decktile/render/templates/base.css +741 -0
  28. decktile/render/templates/decktile.js +371 -0
  29. decktile/render/templates/shell.html +106 -0
  30. decktile/seaborn_styles/__init__.py +5 -0
  31. decktile/seaborn_styles/ossummit_europe.py +30 -0
  32. decktile/theme/__init__.py +0 -0
  33. decktile/theme/colors.py +53 -0
  34. decktile/theme/loader.py +22 -0
  35. decktile/theme/parser.py +264 -0
  36. decktile/themes/default.css +146 -0
  37. decktile/themes/kcd_vietnam.css +159 -0
  38. decktile/themes/kubecon_china.css +213 -0
  39. decktile/themes/kubecon_japan.css +156 -0
  40. decktile/themes/ossummit_europe.css +196 -0
  41. decktile/themes/ossummit_korea.css +196 -0
  42. decktile-0.2.0.dist-info/METADATA +625 -0
  43. decktile-0.2.0.dist-info/RECORD +46 -0
  44. decktile-0.2.0.dist-info/WHEEL +4 -0
  45. decktile-0.2.0.dist-info/entry_points.txt +6 -0
  46. decktile-0.2.0.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,213 @@
1
+ /* decktile KubeCon China 2026 theme */
2
+
3
+ :root {
4
+ --color-background: #ffffff;
5
+ --color-background-stripe: #EEF6EA;
6
+ --color-foreground: #1A3315;
7
+ --color-dimmed: #5F8556;
8
+ --color-accent: #127A02;
9
+ --color-accent-bg: rgba(18, 122, 2, 0.12);
10
+ --color-border: #C9DFC2;
11
+ --color-card-bg: #ffffff;
12
+ --bg-image: url("assets/brand/kubecon_china/background.png");
13
+ --bg-overlay: rgba(255, 255, 255, 0.95);
14
+ --watermark: url("assets/brand/kubecon_china/watermark.svg");
15
+ --logo-dark: url("assets/brand/dynamia-logo-white.png");
16
+ --tag-green-bg: #E9F4E2;
17
+ --tag-cyan-bg: #E2F0EA;
18
+ --tag-yellow-bg: #F6F0DC;
19
+ --tag-red-bg: #FBEBE3;
20
+ --tag-default-bg: #F2F8F0;
21
+ --tag-green-border: #127A02;
22
+ --tag-cyan-border: #2F9E86;
23
+ --tag-yellow-border: #C9A86A;
24
+ --tag-red-border: #127A02;
25
+ --tag-default-border: #BEDAB4;
26
+
27
+ --color-accent-primary: #127A02;
28
+ --color-accent-secondary: #2FD78B;
29
+ --color-accent-contrast: #22301F;
30
+ --list-style: "\25B8 ";
31
+ --card-border: 1px solid #B9D6AE;
32
+ --title-h1-size: 2.5em;
33
+ --title-subtitle-size: 1.2em;
34
+ }
35
+
36
+ body {
37
+ background: #127A02;
38
+ }
39
+
40
+ [data-theme="dark"] {
41
+ --color-background: #0E4A52;
42
+ --color-background-stripe: #10555E;
43
+ --color-foreground: #EAF6EC;
44
+ --color-dimmed: #A3C8B6;
45
+ --color-accent: #2FD78B;
46
+ --color-accent-bg: rgba(47, 215, 139, 0.16);
47
+ --color-border: #1E666E;
48
+ --color-card-bg: #12454B;
49
+ --bg-overlay: rgba(14, 74, 82, 0.92);
50
+ --tag-green-bg: #13351F;
51
+ --tag-cyan-bg: #12342E;
52
+ --tag-yellow-bg: #34311A;
53
+ --tag-red-bg: #3B2318;
54
+ --tag-default-bg: #12454B;
55
+ --tag-green-border: #2FD78B;
56
+ --tag-cyan-border: #3FBFA4;
57
+ --tag-yellow-border: #D9C36A;
58
+ --tag-red-border: #2FD78B;
59
+ --tag-default-border: #1E666E;
60
+
61
+ --color-accent-primary: #2FD78B;
62
+ --color-accent-secondary: #B8F5D4;
63
+ --color-accent-contrast: #EAF6EC;
64
+ --card-border: 1px solid #1E666E;
65
+ }
66
+
67
+ section {
68
+ background: linear-gradient(var(--bg-overlay), var(--bg-overlay)), var(--bg-image) left top / cover no-repeat;
69
+ color: var(--color-foreground);
70
+ font-family: Roboto, Arial, "Helvetica Neue", "Noto Sans CJK SC", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
71
+ }
72
+
73
+ /* Heading text uses the brand green on light slides (darkened for contrast),
74
+ inherits foreground on dark slides. */
75
+ h1, h2, h3, h4, h5, h6 {
76
+ color: var(--color-accent-primary);
77
+ font-family: Roboto, Arial, "Helvetica Neue", "Noto Sans CJK SC", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
78
+ }
79
+ [data-theme="dark"] h1, [data-theme="dark"] h2, [data-theme="dark"] h3,
80
+ [data-theme="dark"] h4, [data-theme="dark"] h5, [data-theme="dark"] h6 {
81
+ color: #ffffff;
82
+ }
83
+ h1 { font-size: 2.5em; font-weight: 700; }
84
+ h2 { font-size: 1.8em; padding-top: 0; }
85
+ h3 { font-size: 1.15em; }
86
+ h4 { font-size: 0.85em; }
87
+ h3::after {
88
+ display: block;
89
+ content: "";
90
+ width: 100%;
91
+ height: 0;
92
+ border-bottom: 2px solid var(--color-accent-secondary);
93
+ margin-top: 0.3em;
94
+ opacity: 0.45;
95
+ }
96
+
97
+ li { font-size: 0.9em; padding-left: 0.3em; }
98
+ ul li::marker { color: var(--color-accent-primary); font-weight: bold; }
99
+
100
+ blockquote {
101
+ border-left-color: var(--color-accent-primary);
102
+ color: var(--color-dimmed);
103
+ }
104
+
105
+ th { background: var(--color-accent-bg); color: var(--color-foreground); font-weight: 700; }
106
+ th, td { border: 1px solid var(--color-border); }
107
+ tr:nth-child(even) { background: var(--color-background-stripe); }
108
+
109
+ a { color: var(--color-accent-primary); }
110
+
111
+ .card {
112
+ background: var(--color-card-bg);
113
+ border: var(--card-border);
114
+ }
115
+ .card p { font-size: 0.9em; }
116
+
117
+ .quote { border-left-color: var(--color-accent-primary); color: var(--color-accent-primary); }
118
+
119
+ .kicker { color: var(--color-accent-primary); font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; font-size: 0.75em; }
120
+ .speaker { color: var(--color-foreground); }
121
+ .speaker .role { color: var(--color-dimmed); }
122
+
123
+ /* White KubeCon wordmark shows only on dark surfaces (title + dark variant).
124
+ Hidden on light content slides where it would be invisible. */
125
+ section::after {
126
+ display: none;
127
+ }
128
+ .layout-title::after {
129
+ display: block;
130
+ background: var(--watermark) right center / contain no-repeat;
131
+ opacity: 0.95;
132
+ right: 4%;
133
+ bottom: 3.4em;
134
+ width: 34%;
135
+ height: 3.8em;
136
+ left: auto;
137
+ }
138
+ [data-theme="dark"] section::after {
139
+ display: block;
140
+ background: var(--watermark) right center / contain no-repeat;
141
+ opacity: 0.9;
142
+ right: 4%;
143
+ bottom: 3.4em;
144
+ width: 30%;
145
+ height: 3.2em;
146
+ left: auto;
147
+ }
148
+
149
+ /* Dark title slide: deep green-teal gradient over the scene, white text. */
150
+ .layout-title {
151
+ background: linear-gradient(90deg, rgba(6, 32, 18, 0.9) 0%, rgba(6, 32, 18, 0.85) 46%, rgba(18, 61, 20, 0.35) 74%, rgba(12, 74, 82, 0.05) 96%), var(--bg-image) left top / cover no-repeat;
152
+ color: #ffffff;
153
+ }
154
+ .layout-title h1,
155
+ .layout-title h2,
156
+ .layout-title h3,
157
+ .layout-title h4,
158
+ .layout-title h5,
159
+ .layout-title h6 { color: #ffffff; }
160
+ .layout-title .kicker { color: #2FD78B; }
161
+ .layout-title .subtitle { color: #B8F5D4; }
162
+ .layout-title .speaker { color: rgba(255, 255, 255, 0.85); }
163
+ .layout-title .speaker .role { color: rgba(255, 255, 255, 0.6); }
164
+ .layout-title .speaker-links a { color: rgba(255, 255, 255, 0.8); }
165
+ .layout-title .speaker-links svg { stroke: rgba(255, 255, 255, 0.8); }
166
+
167
+ .layout-title { --logo: var(--logo-dark); }
168
+
169
+ /* Footer: solid #127A02 bar on light content slides, transparent on dark. */
170
+ footer {
171
+ --footer-bg: #127A02;
172
+ --footer-color: #ffffff;
173
+ left: 0;
174
+ right: 0;
175
+ bottom: 0;
176
+ padding: 1em var(--section-padding-h);
177
+ }
178
+ .layout-title footer,
179
+ section[data-theme="dark"] footer {
180
+ --footer-bg: transparent;
181
+ --footer-color: #EAF6EC;
182
+ left: var(--section-padding-h);
183
+ right: auto;
184
+ bottom: 1em;
185
+ padding: 0;
186
+ }
187
+ .slide-num {
188
+ bottom: 0;
189
+ right: var(--section-padding-h);
190
+ padding: 1em 0;
191
+ color: #ffffff;
192
+ }
193
+ .layout-title .slide-num,
194
+ section[data-theme="dark"] .slide-num {
195
+ bottom: 1em;
196
+ padding: 0;
197
+ color: #EAF6EC;
198
+ }
199
+
200
+ .subtitle { color: var(--color-dimmed); }
201
+ h2 + .subtitle { font-size: 0.85em; }
202
+ .tiny { font-size: 0.7em; color: var(--color-dimmed); }
203
+ .muted { color: var(--color-dimmed); }
204
+
205
+ .accent-primary { color: var(--color-accent-primary); fill: var(--color-accent-primary); stroke: var(--color-accent-primary); }
206
+ .accent-secondary { color: var(--color-accent-secondary); fill: var(--color-accent-secondary); stroke: var(--color-accent-secondary); }
207
+ .accent-contrast { color: var(--color-accent-contrast); fill: var(--color-accent-contrast); stroke: var(--color-accent-contrast); }
208
+
209
+ .tag-green { border-color: var(--tag-green-border); background: var(--tag-green-bg); }
210
+ .tag-cyan { border-color: var(--tag-cyan-border); background: var(--tag-cyan-bg); }
211
+ .tag-yellow { border-color: var(--tag-yellow-border); background: var(--tag-yellow-bg); }
212
+ .tag-red { border-color: var(--tag-red-border); background: var(--tag-red-bg); }
213
+ .tag-quote { border-left: 0.25em solid var(--color-accent-primary); font-style: italic; background: none; }
@@ -0,0 +1,156 @@
1
+ /* decktile KubeCon CloudNativeCon Japan 2026 theme */
2
+
3
+ :root {
4
+ --color-background: #ffffff;
5
+ --color-background-stripe: #e8e8f0;
6
+ --color-foreground: #2a2a5a;
7
+ --color-dimmed: #6a7a99;
8
+ --color-accent: #3939D8;
9
+ --color-accent-bg: rgba(57, 57, 216, 0.12);
10
+ --color-border: #c0c4d6;
11
+ --color-card-bg: #f5f6fa;
12
+ --bg-image: url("assets/brand/kubecon_japan/background.png");
13
+ --bg-overlay: rgba(255,255,255,0.96);
14
+ --watermark: url("assets/brand/kubecon_japan/cncf_logo.svg");
15
+ --logo-dark: url("assets/brand/dynamia-logo-white.png");
16
+ --tag-green-bg: #e8f5e9;
17
+ --tag-cyan-bg: #e3f0ff;
18
+ --tag-yellow-bg: #fff9e6;
19
+ --tag-red-bg: #ffe8eb;
20
+ --tag-default-bg: #f5f5f5;
21
+ --tag-green-border: #2e7d32;
22
+ --tag-cyan-border: #3939D8;
23
+ --tag-yellow-border: #f9a825;
24
+ --tag-red-border: #DB1E3D;
25
+ --tag-default-border: #ccc;
26
+
27
+ --color-accent-primary: #3939D8;
28
+ --color-accent-secondary: #DB1E3D;
29
+ --color-accent-contrast: #1D1D6B;
30
+ --list-style: "\25B8 ";
31
+ --title-h1-size: 2.5em;
32
+ }
33
+
34
+ body {
35
+ background: #1D1D6B;
36
+ }
37
+
38
+ [data-theme="dark"] {
39
+ --color-background: #06062D;
40
+ --color-background-stripe: #0d0d3d;
41
+ --color-foreground: #e0e0f0;
42
+ --color-dimmed: #8899bb;
43
+ --color-accent: #5b5bf0;
44
+ --color-accent-bg: rgba(91, 91, 240, 0.15);
45
+ --color-border: #1a1a44;
46
+ --color-card-bg: #0d0d3d;
47
+ --bg-overlay: rgba(6, 6, 45, 0.90);
48
+ --tag-green-bg: #1a2e1a;
49
+ --tag-cyan-bg: #1a2a3a;
50
+ --tag-yellow-bg: #2e2a1a;
51
+ --tag-red-bg: #2e1a1a;
52
+ --tag-default-bg: #1a1a2e;
53
+ --tag-green-border: #2d8a3e;
54
+ --tag-cyan-border: #3939D8;
55
+ --tag-yellow-border: #8a7a2d;
56
+ --tag-red-border: #DB1E3D;
57
+ --tag-default-border: #2a2a4a;
58
+
59
+ --color-accent-primary: #5b5bf0;
60
+ --color-accent-secondary: #ff4d6a;
61
+ --color-accent-contrast: #8899cc;
62
+ }
63
+
64
+ section {
65
+ background: linear-gradient(var(--bg-overlay), var(--bg-overlay)), var(--bg-image) left top / cover no-repeat;
66
+ color: var(--color-foreground);
67
+ font-family: Roboto, Arial, "Helvetica Neue", sans-serif;
68
+ }
69
+
70
+ /* Title slide hides watermark */
71
+ .layout-title section::after {
72
+ background-image: none;
73
+ }
74
+ section::after {
75
+ opacity: 0.9;
76
+ }
77
+ .layout-title {
78
+ background: linear-gradient(135deg, rgba(29,29,107,0.85) 0%, rgba(57,57,216,0.85) 60%, rgba(10,10,58,0.85) 100%), var(--bg-image) left top / cover no-repeat;
79
+ color: #ffffff;
80
+ }
81
+ .layout-title h1,
82
+ .layout-title h2,
83
+ .layout-title h3,
84
+ .layout-title h4,
85
+ .layout-title h5,
86
+ .layout-title h6 { color: #ffffff; }
87
+ .layout-title .kicker { color: rgba(255,255,255,0.8); }
88
+ .layout-title .subtitle { color: rgba(255,255,255,0.7); }
89
+ .layout-title .speaker { color: rgba(255,255,255,0.8); }
90
+ .layout-title .speaker .role { color: rgba(255,255,255,0.5); }
91
+ .layout-title .speaker-links a { color: rgba(255,255,255,0.75); }
92
+ .layout-title .speaker-links svg { stroke: rgba(255,255,255,0.75); }
93
+
94
+ .layout-title { --logo: var(--logo-dark); }
95
+
96
+ h1, h2, h3, h4, h5, h6 {
97
+ color: var(--color-foreground);
98
+ font-family: Roboto, Arial, "Helvetica Neue", sans-serif;
99
+ }
100
+ h1 { font-size: 2.5em; font-weight: 700; }
101
+ h2 { font-size: 1.8em; padding-top: 0; margin-bottom: 0.15em; }
102
+ h3 { font-size: 1.15em; }
103
+ h4 { font-size: 0.85em; }
104
+ h3::after {
105
+ display: block;
106
+ content: "";
107
+ width: 100%;
108
+ height: 0;
109
+ border-bottom: 2px solid var(--color-accent-primary);
110
+ margin-top: 0.3em;
111
+ opacity: 0.4;
112
+ }
113
+
114
+ li { font-size: 0.9em; padding-left: 0.3em; }
115
+ ul li::marker { color: var(--color-accent-primary); font-weight: bold; }
116
+
117
+ blockquote {
118
+ border-left-color: var(--color-accent-primary);
119
+ color: var(--color-dimmed);
120
+ }
121
+
122
+ th { background: var(--color-accent-bg); color: var(--color-foreground); font-weight: 700; }
123
+ th, td { border: 1px solid var(--color-border); }
124
+ tr:nth-child(even) { background: var(--color-background-stripe); }
125
+
126
+ a { color: var(--color-accent-primary); }
127
+
128
+ .card {
129
+ background: var(--color-card-bg);
130
+ border: var(--card-border);
131
+ }
132
+ .card p { font-size: 0.9em; }
133
+
134
+ .quote { border-left-color: var(--color-accent-primary); color: var(--color-accent-primary); }
135
+
136
+ .kicker { color: var(--color-accent-primary); font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; font-size: 0.75em; }
137
+ .speaker { color: var(--color-foreground); }
138
+ .speaker .role { color: var(--color-dimmed); }
139
+
140
+ footer { color: var(--color-dimmed); }
141
+ .slide-num { color: var(--color-dimmed); }
142
+
143
+ .subtitle { color: var(--color-dimmed); }
144
+ h2 + .subtitle { font-size: 0.85em; }
145
+ .tiny { font-size: 0.7em; color: var(--color-dimmed); }
146
+ .muted { color: var(--color-dimmed); }
147
+
148
+ .accent-primary { color: var(--color-accent-primary); fill: var(--color-accent-primary); stroke: var(--color-accent-primary); }
149
+ .accent-secondary { color: var(--color-accent-secondary); fill: var(--color-accent-secondary); stroke: var(--color-accent-secondary); }
150
+ .accent-contrast { color: var(--color-accent-contrast); fill: var(--color-accent-contrast); stroke: var(--color-accent-contrast); }
151
+
152
+ .tag-green { border-color: var(--tag-green-border); background: var(--tag-green-bg); }
153
+ .tag-cyan { border-color: var(--tag-cyan-border); background: var(--tag-cyan-bg); }
154
+ .tag-yellow { border-color: var(--tag-yellow-border); background: var(--tag-yellow-bg); }
155
+ .tag-red { border-color: var(--tag-red-border); background: var(--tag-red-bg); }
156
+ .tag-quote { border-left: 0.25em solid var(--color-accent-primary); font-style: italic; background: none; }
@@ -0,0 +1,196 @@
1
+ /* decktile Open Source Summit Europe theme */
2
+
3
+ :root {
4
+ --color-background: #ffffff;
5
+ --color-background-stripe: #EDF5F4;
6
+ --color-foreground: #003841;
7
+ --color-dimmed: #4F6F73;
8
+ --color-accent: #E05845;
9
+ --color-accent-bg: rgba(224, 88, 69, 0.12);
10
+ --color-border: #C5D8D7;
11
+ --color-card-bg: #ffffff;
12
+ --bg-image: url("assets/brand/ossummit_europe/backgroundfooter.svg");
13
+ --watermark: url("assets/brand/ossummit_europe/watermark.svg");
14
+ --logo-dark: url("assets/brand/dynamia-logo-white.png");
15
+ --tag-green-bg: #E6F6F5;
16
+ --tag-cyan-bg: #E4EFF0;
17
+ --tag-yellow-bg: #FCEFEC;
18
+ --tag-red-bg: #FBE6E3;
19
+ --tag-default-bg: #F3F7F7;
20
+ --tag-green-border: #0DA89D;
21
+ --tag-cyan-border: #0A5560;
22
+ --tag-yellow-border: #E58570;
23
+ --tag-red-border: #E05845;
24
+ --tag-default-border: #C5D8D7;
25
+
26
+ --color-accent-primary: #E05845;
27
+ --color-accent-secondary: #0DA89D;
28
+ --color-accent-contrast: #003841;
29
+ --list-style: "\25B8 ";
30
+ --card-border: 1px solid #B6CFCD;
31
+ --title-h1-size: 2.5em;
32
+ --title-subtitle-size: 1.2em;
33
+ }
34
+
35
+ body {
36
+ background: #003841;
37
+ }
38
+
39
+ [data-theme="dark"] {
40
+ --color-background: #003841;
41
+ --color-background-stripe: #0A4A52;
42
+ --color-foreground: #EAF4F3;
43
+ --color-dimmed: #9DBDBA;
44
+ --color-accent: #E58570;
45
+ --color-accent-bg: rgba(229, 133, 112, 0.16);
46
+ --color-border: #0A5560;
47
+ --color-card-bg: #0A4A52;
48
+ --tag-green-bg: #0E3F3E;
49
+ --tag-cyan-bg: #0A4650;
50
+ --tag-yellow-bg: #3C3330;
51
+ --tag-red-bg: #3D2723;
52
+ --tag-default-bg: #0A4A52;
53
+ --tag-green-border: #0DA89D;
54
+ --tag-cyan-border: #6FB3B0;
55
+ --tag-yellow-border: #E58570;
56
+ --tag-red-border: #E05845;
57
+ --tag-default-border: #0A5560;
58
+
59
+ --color-accent-primary: #E58570;
60
+ --color-accent-secondary: #0DA89D;
61
+ --color-accent-contrast: #EAF4F3;
62
+ --card-border: 1px solid #0A5560;
63
+ }
64
+
65
+ /* Light slides: white with the floral line along the bottom edge */
66
+ section {
67
+ background: var(--bg-image) right bottom / auto 6.5em no-repeat, var(--color-background);
68
+ color: var(--color-foreground);
69
+ font-family: Roboto, Arial, "Helvetica Neue", sans-serif;
70
+ }
71
+ section[data-theme="dark"] {
72
+ background: var(--color-background);
73
+ }
74
+
75
+ /* Watermark bottom-left, above the floral line */
76
+ section::after {
77
+ left: var(--section-padding-h);
78
+ right: auto;
79
+ bottom: 1em;
80
+ width: 8em;
81
+ height: 1.3em;
82
+ background-position: left bottom;
83
+ opacity: 0.9;
84
+ }
85
+ .layout-title::after,
86
+ section[data-theme="dark"]::after {
87
+ background-image: none;
88
+ }
89
+
90
+ /* Title and section dividers: coral gradient, top to bottom (also with @variant dark) */
91
+ section.layout-title,
92
+ section.layout-title[data-theme="dark"] {
93
+ background: var(--bg-image) right bottom / auto 6.5em no-repeat, linear-gradient(180deg, #E05845 0%, #E58570 100%);
94
+ color: #003841;
95
+ }
96
+ .layout-title h1,
97
+ .layout-title h2,
98
+ .layout-title h3,
99
+ .layout-title h4,
100
+ .layout-title h5,
101
+ .layout-title h6 { color: #003841; }
102
+ .layout-title .kicker { color: #003841; }
103
+ .layout-title .subtitle { color: #003841; }
104
+ .layout-title .speaker { color: #003841; }
105
+ .layout-title .speaker .role { color: rgba(0,56,65,0.8); }
106
+ .layout-title .speaker-links a { color: #003841; }
107
+ .layout-title .speaker-links svg { stroke: #003841; }
108
+
109
+ .layout-title { --logo: var(--logo-dark); }
110
+
111
+ h1, h2, h3, h4, h5, h6 {
112
+ color: var(--color-foreground);
113
+ font-family: Roboto, Arial, "Helvetica Neue", sans-serif;
114
+ }
115
+ h1 { font-size: 2.5em; font-weight: 700; }
116
+ h2 { font-size: 1.8em; padding-top: 0; }
117
+ h3 { font-size: 1.15em; }
118
+ h4 { font-size: 0.85em; }
119
+ h3::after {
120
+ display: block;
121
+ content: "";
122
+ width: 100%;
123
+ height: 0;
124
+ border-bottom: 2px solid var(--color-accent-primary);
125
+ margin-top: 0.3em;
126
+ opacity: 0.4;
127
+ }
128
+
129
+ li { font-size: 0.9em; padding-left: 0.3em; }
130
+ ul li::marker { color: var(--color-accent-primary); font-weight: bold; }
131
+
132
+ blockquote {
133
+ border-left-color: var(--color-accent-primary);
134
+ color: var(--color-dimmed);
135
+ }
136
+
137
+ th { background: var(--color-accent-bg); color: var(--color-foreground); font-weight: 700; }
138
+ th, td { border: 1px solid var(--color-border); }
139
+ tr:nth-child(even) { background: var(--color-background-stripe); }
140
+
141
+ a { color: var(--color-accent-primary); }
142
+
143
+ .card {
144
+ background: var(--color-card-bg);
145
+ border: var(--card-border);
146
+ }
147
+ .card p { font-size: 0.9em; }
148
+
149
+ .quote { border-left-color: var(--color-accent-primary); color: var(--color-accent-primary); }
150
+
151
+ .kicker { color: var(--color-accent-primary); font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; font-size: 0.75em; }
152
+
153
+ .speaker { color: var(--color-foreground); }
154
+ .speaker .role { color: var(--color-dimmed); }
155
+
156
+ /* Footer text and page number sit above the floral line */
157
+ footer {
158
+ --footer-bg: transparent;
159
+ --footer-color: var(--color-dimmed);
160
+ left: calc(var(--section-padding-h) + 8.5em / 0.6);
161
+ bottom: calc(1.1em / 0.6);
162
+ }
163
+ .slide-num {
164
+ bottom: calc(1.1em / 0.6);
165
+ right: calc(6.5em / 0.6);
166
+ color: var(--color-dimmed);
167
+ }
168
+ .layout-title footer,
169
+ section[data-theme="dark"] footer {
170
+ --footer-color: rgba(255,255,255,0.85);
171
+ left: var(--section-padding-h);
172
+ bottom: calc(1.1em / 0.6);
173
+ }
174
+ .layout-title .slide-num,
175
+ section[data-theme="dark"] .slide-num {
176
+ bottom: calc(1.1em / 0.6);
177
+ right: var(--section-padding-h);
178
+ color: rgba(255,255,255,0.85);
179
+ }
180
+ section.layout-title footer { --footer-color: #003841; }
181
+ section.layout-title .slide-num { color: #003841; right: calc(6.5em / 0.6); }
182
+
183
+ .subtitle { color: var(--color-dimmed); }
184
+ h2 + .subtitle { font-size: 0.85em; }
185
+ .tiny { font-size: 0.7em; color: var(--color-dimmed); }
186
+ .muted { color: var(--color-dimmed); }
187
+
188
+ .accent-primary { color: var(--color-accent-primary); fill: var(--color-accent-primary); stroke: var(--color-accent-primary); }
189
+ .accent-secondary { color: var(--color-accent-secondary); fill: var(--color-accent-secondary); stroke: var(--color-accent-secondary); }
190
+ .accent-contrast { color: var(--color-accent-contrast); fill: var(--color-accent-contrast); stroke: var(--color-accent-contrast); }
191
+
192
+ .tag-green { border-color: var(--tag-green-border); background: var(--tag-green-bg); }
193
+ .tag-cyan { border-color: var(--tag-cyan-border); background: var(--tag-cyan-bg); }
194
+ .tag-yellow { border-color: var(--tag-yellow-border); background: var(--tag-yellow-bg); }
195
+ .tag-red { border-color: var(--tag-red-border); background: var(--tag-red-bg); }
196
+ .tag-quote { border-left: 0.25em solid var(--color-accent-primary); font-style: italic; background: none; }