@atom63/slides 0.1.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.
@@ -0,0 +1,223 @@
1
+ /* =============================================================================
2
+ @atom63/slides — STANDALONE DEFAULT TOKENS
3
+
4
+ Self-contained default values for every theme/palette/contract custom
5
+ property the slide player reads. `@import` this into your Tailwind v4 entry
6
+ CSS (NOT a JS import) so the `@theme` block below is processed and the
7
+ engine's semantic color utilities (text-foreground, bg-primary, …) resolve:
8
+
9
+ @import "tailwindcss";
10
+ @import "@atom63/slides/theme-defaults";
11
+ @import "@atom63/slides/styles";
12
+
13
+ These are ADDITIVE, low-specificity `:root` defaults. A host that ships its
14
+ own design tokens (like os63, which imports @atom63/tokens) defines the same
15
+ properties later in the cascade and therefore overrides everything here — so
16
+ importing this file in such a host is a harmless no-op. os63 does NOT import
17
+ it.
18
+
19
+ Values mirror the Modern (default-theme, light-mode) look from
20
+ @atom63/tokens (primitives/aliases/semantics/radius/effects/components/
21
+ slide-surfaces). Every var() used as a value below resolves to another token
22
+ defined IN this file, except Tailwind-provided primitives (--spacing, --tw-*,
23
+ --color-*) which the consumer's Tailwind build supplies.
24
+ ============================================================================= */
25
+
26
+ /* Map the semantic palette into Tailwind's color theme so utilities like
27
+ `text-foreground`, `bg-background`, `bg-primary`, `border-input` resolve.
28
+ `inline` keeps them as `var(--token)` refs, so overriding a token at :root
29
+ (e.g. a dark theme) flows through at runtime. Requires this file to be
30
+ @import-ed into the consumer's Tailwind entry (see header). */
31
+ @theme inline {
32
+ --color-background: var(--background);
33
+ --color-foreground: var(--foreground);
34
+ --color-card: var(--card);
35
+ --color-card-foreground: var(--foreground);
36
+ --color-popover: var(--popover);
37
+ --color-popover-foreground: var(--popover-foreground);
38
+ --color-muted: var(--muted);
39
+ --color-muted-foreground: var(--muted-foreground);
40
+ --color-secondary: var(--secondary);
41
+ --color-secondary-foreground: var(--secondary-foreground);
42
+ --color-accent: var(--accent);
43
+ --color-accent-foreground: var(--accent-foreground);
44
+ --color-primary: var(--primary);
45
+ --color-primary-foreground: var(--primary-foreground);
46
+ --color-destructive: var(--destructive);
47
+ --color-border: var(--border);
48
+ --color-input: var(--input);
49
+ --color-ring: var(--ring);
50
+ --color-light: var(--light);
51
+ --color-dark: var(--dark);
52
+ }
53
+
54
+ :root {
55
+ /* ── Fonts ──────────────────────────────────────────────────────────── */
56
+ --font-serif: "Brawler", ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
57
+ --font-mono: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
58
+ "Liberation Mono", "Courier New", monospace;
59
+
60
+ /* ── Z-layers (subset the slide player uses) ────────────────────────── */
61
+ --z-layer-below: -1;
62
+ --z-layer-default: 0;
63
+ --z-layer-base: 10;
64
+ --z-layer-sticky: 20;
65
+ --z-layer-tooltip: 980;
66
+
67
+ /* ── Radius scale ───────────────────────────────────────────────────────
68
+ Same formula as @atom63/tokens so a host that later sets --corner-radius /
69
+ --radius-multiplier reshapes these identically. Concrete leaves below. */
70
+ --corner-radius: 10px;
71
+ --radius-multiplier: 1;
72
+ --radius-md: calc(var(--corner-radius) * 0.8 * var(--radius-multiplier));
73
+ --radius-lg: calc(var(--corner-radius) * var(--radius-multiplier));
74
+ --radius-xl: calc(var(--corner-radius) * 1.4 * var(--radius-multiplier));
75
+ --radius-3xl: calc(var(--corner-radius) * 2.2 * var(--radius-multiplier));
76
+ /* --radius-sm is referenced transitively by --theme-selection-radius. */
77
+ --radius-sm: calc(var(--corner-radius) * 0.6 * var(--radius-multiplier));
78
+
79
+ /* ── Base palette / semantic colors (Modern theme, light mode) ──────────
80
+ Concrete leaves copied from the resolved @atom63/tokens chain
81
+ (semantics.css → aliases.css → primitives.css, light values). */
82
+ --background: rgba(249, 249, 249, 1);
83
+ --foreground: rgba(32, 32, 32, 1);
84
+ --card: rgba(252, 252, 252, 1);
85
+ --popover: rgba(252, 252, 252, 1);
86
+ --popover-foreground: rgba(32, 32, 32, 1);
87
+ --light: rgba(252, 252, 252, 1);
88
+ --dark: rgba(17, 17, 17, 1);
89
+ --muted: rgba(240, 240, 240, 1);
90
+ --muted-foreground: rgba(100, 100, 100, 1);
91
+ --secondary: rgba(240, 240, 240, 1);
92
+ --secondary-foreground: rgba(100, 100, 100, 1);
93
+ --border: rgba(232, 232, 232, 1);
94
+ --input: rgba(224, 224, 224, 1);
95
+ --ring: rgba(217, 217, 217, 1);
96
+ --accent: color-mix(in srgb, rgba(232, 232, 232, 1), transparent 20%);
97
+ --accent-foreground: rgba(32, 32, 32, 1);
98
+ --primary: rgba(44, 127, 255, 1);
99
+ --primary-foreground: rgba(239, 252, 255, 1);
100
+ --destructive: rgba(231, 67, 64, 1);
101
+
102
+ /* ── Shared border / shadow effect leaves (from effects.css) ─────────────
103
+ Internal helpers the chrome contract references; not consumed directly by
104
+ slides but needed so the contract tokens below resolve in-file. */
105
+ --theme-border-width: 1px;
106
+ --theme-border-style: solid;
107
+ --effect-shadow-xs:
108
+ 0px 1px 2px 0px rgb(0 0 0 / 0.05), 0px 2px 4px -2px rgb(0 0 0 / 0.08);
109
+ --effect-shadow-sm:
110
+ 0px 2px 4px -1px rgb(0 0 0 / 0.06), 0px 6px 10px -4px rgb(0 0 0 / 0.08);
111
+ --effect-shadow-md:
112
+ 0px 4px 8px -2px rgb(0 0 0 / 0.06), 0px 12px 18px -8px rgb(0 0 0 / 0.09);
113
+
114
+ /* ── Slide theme contract (verbatim from tokens/slide-surfaces.css) ─── */
115
+ --theme-slide-bg: var(--background);
116
+ --theme-slide-stage-bg: color-mix(in oklch, var(--muted) 70%, var(--border) 30%);
117
+ --theme-slide-stage-slide-ring: rgba(0, 0, 0, 0.08);
118
+ --theme-slide-toolbar-bg: color-mix(in oklch, var(--muted) 38%, transparent);
119
+ --theme-slide-toolbar-border: color-mix(in oklch, var(--border) 64%, transparent);
120
+ --theme-slide-statusbar-bg: color-mix(in oklch, var(--muted) 20%, transparent);
121
+ --theme-slide-statusbar-border: color-mix(in oklch, var(--border) 50%, transparent);
122
+ --theme-slide-sidebar-bg: color-mix(in oklch, var(--muted) 30%, transparent);
123
+ --theme-slide-sidebar-border: color-mix(in oklch, var(--border) 50%, transparent);
124
+ --theme-slide-surface: var(--card);
125
+ --theme-slide-rule-color: color-mix(in oklch, var(--foreground) 25%, transparent);
126
+ --theme-slide-rule-width: 1px;
127
+ --theme-slide-accent: var(--primary);
128
+ --theme-slide-accent-foreground: var(--primary-foreground);
129
+ --theme-slide-muted: var(--muted-foreground);
130
+ --theme-slide-code-bg: var(--card);
131
+ --theme-slide-code-border: color-mix(in oklch, var(--foreground) 10%, transparent);
132
+ --theme-slide-quote-color: color-mix(in oklch, var(--foreground) 90%, transparent);
133
+
134
+ /* ── Control / overlay / focus contract (from effects.css) ──────────── */
135
+ --theme-control-border-width: var(--theme-border-width);
136
+ --theme-control-border-style: var(--theme-border-style);
137
+ --theme-control-active-border-style: var(--theme-control-border-style);
138
+ --theme-control-shadow: none;
139
+ --theme-overlay-border-width: var(--theme-border-width);
140
+ --theme-overlay-border-style: var(--theme-border-style);
141
+ --theme-overlay-shadow: var(--effect-shadow-md);
142
+ --theme-focus-outline-width: 0px;
143
+ --theme-focus-outline-offset: 0px;
144
+ --theme-focus-outline-color: var(--ring);
145
+ --theme-focus-shadow: none;
146
+ --theme-selection-border-width: var(--theme-border-width);
147
+ --theme-selection-border-style: var(--theme-border-style);
148
+ --theme-selection-radius: var(--radius-sm);
149
+
150
+ /* ── Switch contract (from effects.css) ─────────────────────────────── */
151
+ --theme-switch-track-shadow: inset 0 1px rgb(0 0 0 / 0.06);
152
+ --theme-switch-thumb-border-width: 0px;
153
+ --theme-switch-thumb-border-style: var(--theme-border-style);
154
+ --theme-switch-thumb-shadow: var(--effect-shadow-sm);
155
+
156
+ /* ── Tabs contract (from effects.css) ───────────────────────────────── */
157
+ --theme-tabs-list-border-color: transparent;
158
+ --theme-tabs-list-border-width: 0px;
159
+ --theme-tabs-list-border-style: var(--theme-border-style);
160
+ --theme-tabs-list-shadow: none;
161
+ --theme-tabs-active-border-width: 0px;
162
+ --theme-tabs-active-border-style: var(--theme-border-style);
163
+ --theme-tabs-active-background: var(--card);
164
+ --theme-tabs-active-background-color: transparent;
165
+ --theme-tabs-active-shadow: var(--effect-shadow-sm);
166
+
167
+ /* ── Segment-control contract (from effects.css) ────────────────────── */
168
+ --theme-segment-list-background: color-mix(in oklch, var(--muted) 64%, transparent);
169
+ --theme-segment-list-border-color: color-mix(in oklch, var(--border) 80%, transparent);
170
+ --theme-segment-list-shadow: var(--theme-tabs-list-shadow);
171
+ --theme-segment-item-text-shadow: none;
172
+ --theme-segment-item-hover-background: transparent;
173
+ --theme-segment-active-background: var(--theme-tabs-active-background);
174
+ --theme-segment-active-background-color: var(--theme-tabs-active-background-color);
175
+ --theme-segment-active-border-color: transparent;
176
+ --theme-segment-active-text-shadow: none;
177
+ --theme-segment-active-shadow: var(--theme-tabs-active-shadow);
178
+ --theme-segment-active-icon-filter: none;
179
+
180
+ /* ── Button-group contract (from effects.css + components.css) ──────────
181
+ --theme-button-group-text-* mirror the slide-side inline fallbacks
182
+ (--muted / --input / --foreground) so the default look is faithful. */
183
+ --theme-button-group-radius: var(--radius-lg);
184
+ --theme-button-group-background: color-mix(in oklch, var(--muted) 72%, transparent);
185
+ --theme-button-group-border-color: color-mix(in oklch, var(--border) 82%, var(--foreground) 8%);
186
+ --theme-button-group-border-width: 0px;
187
+ --theme-button-group-separator-color: color-mix(in oklch, var(--border) 82%, var(--foreground) 8%);
188
+ --theme-button-group-shadow: none;
189
+ --theme-button-group-text-background: var(--muted);
190
+ --theme-button-group-text-border-color: var(--input);
191
+ --theme-button-group-text-foreground: var(--foreground);
192
+
193
+ /* ── Button contract (base button, from components.css) ─────────────── */
194
+ --theme-button-background: var(--secondary);
195
+ --theme-button-foreground: var(--secondary-foreground);
196
+ --theme-button-border-color: transparent;
197
+ --theme-button-hover-background: color-mix(in oklch, var(--secondary) 90%, transparent);
198
+ --theme-button-hover-border-color: transparent;
199
+ --theme-button-active-background: color-mix(in oklch, var(--secondary) 80%, transparent);
200
+ --theme-button-active-border-color: transparent;
201
+ --theme-button-shadow: var(--theme-control-shadow);
202
+ --theme-button-text-shadow: none;
203
+ --theme-button-icon-filter: none;
204
+ }
205
+
206
+ /* -----------------------------------------------------------------------------
207
+ Default border color. Tailwind v4 leaves `border` utilities at `currentColor`
208
+ (which renders as the text color — near-black). The full ATOM63 design system
209
+ sets a global `--border` default; standalone consumers don't have that, so the
210
+ player's chrome (toolbar, config panel, switches, segmented controls) would
211
+ show hard black borders. Restore the sensible default here so an opt-in
212
+ consumer gets correct subtle borders. Lives in @layer base so component-level
213
+ border-color utilities still win. Override `--border` to restyle.
214
+ ----------------------------------------------------------------------------- */
215
+ @layer base {
216
+ *,
217
+ ::after,
218
+ ::before,
219
+ ::backdrop,
220
+ ::file-selector-button {
221
+ border-color: var(--border, currentColor);
222
+ }
223
+ }
@@ -0,0 +1,48 @@
1
+ /* =============================================================================
2
+ @atom63/slides — BOLD THEME
3
+
4
+ A dark, high-impact palette for the slide player — charcoal greys with a
5
+ bright orange signal and a strong Archivo sans for headlines. Import it AFTER
6
+ the default tokens to flip the whole deck (slides + chrome) to this look;
7
+ every --theme-slide-* and chrome token derives from this base palette, so
8
+ overriding the palette + font tokens is enough:
9
+
10
+ import "@atom63/slides/theme-defaults"; // light defaults + base rules
11
+ import "@atom63/slides/themes/bold"; // override → bold
12
+ import "@atom63/slides/styles";
13
+
14
+ A theme is ONLY a :root override of the documented tokens — no per-theme
15
+ component code. Override any of these tokens in your own stylesheet to tweak.
16
+
17
+ Palette adapted from zarazhangrui/frontend-slides (MIT).
18
+ ============================================================================= */
19
+ @import url('https://fonts.googleapis.com/css2?family=Archivo:wght@500;600;700;800&display=swap');
20
+ :root {
21
+ /* ── Base palette (bold) ─────────────────────────────────────────────── */
22
+ --background: #1a1a1a;
23
+ --foreground: #ffffff;
24
+ --card: #242424;
25
+ --popover: #242424;
26
+ --popover-foreground: #ffffff;
27
+ --muted: #2a2a2a;
28
+ --muted-foreground: #a0a0a0;
29
+ --secondary: #2a2a2a;
30
+ --secondary-foreground: #e0e0e0;
31
+ --border: #3a3a3a;
32
+ --input: #3a3a3a;
33
+ --ring: #ff5722;
34
+ --accent: #2e2e2e;
35
+ --accent-foreground: #ffffff;
36
+ --primary: #ff5722;
37
+ --primary-foreground: #1a1a1a;
38
+ --destructive: #ff5722;
39
+
40
+ /* ── Fonts — strong sans headlines; serif & mono stay default ────────── */
41
+ --font-sans: "Archivo", ui-sans-serif, system-ui, sans-serif;
42
+
43
+ /* ── Slide surfaces tuned for the high-impact look ───────────────────── */
44
+ --theme-slide-stage-bg: #0e0e0e;
45
+ --theme-slide-surface: #242424;
46
+ --theme-slide-code-bg: #242424;
47
+ --theme-slide-accent: #ff5722;
48
+ }
@@ -0,0 +1,45 @@
1
+ /* =============================================================================
2
+ @atom63/slides — DARK THEME
3
+
4
+ A dark palette for the slide player. Import it AFTER the default tokens to
5
+ flip the whole deck (slides + chrome) to dark — every --theme-slide-* and
6
+ chrome token derives from this base palette via color-mix, so overriding the
7
+ palette is enough:
8
+
9
+ import "@atom63/slides/theme-defaults"; // light defaults + base rules
10
+ import "@atom63/slides/themes/dark"; // override → dark
11
+ import "@atom63/slides/styles";
12
+
13
+ Want a runtime light/dark toggle instead of a hard import? Re-scope the rule
14
+ below from `:root` to e.g. `[data-slides-theme="dark"]` in your own CSS.
15
+ Want a custom theme? Override any of these tokens in your own stylesheet.
16
+ ============================================================================= */
17
+ :root {
18
+ /* ── Base palette (dark) ─────────────────────────────────────────────── */
19
+ --background: rgba(20, 20, 22, 1);
20
+ --foreground: rgba(237, 237, 240, 1);
21
+ --card: rgba(28, 28, 31, 1);
22
+ --popover: rgba(28, 28, 31, 1);
23
+ --popover-foreground: rgba(237, 237, 240, 1);
24
+ --light: rgba(252, 252, 252, 1);
25
+ --dark: rgba(12, 12, 14, 1);
26
+ --muted: rgba(40, 40, 44, 1);
27
+ --muted-foreground: rgba(160, 160, 166, 1);
28
+ --secondary: rgba(40, 40, 44, 1);
29
+ --secondary-foreground: rgba(210, 210, 215, 1);
30
+ --border: rgba(74, 74, 80, 1);
31
+ --input: rgba(62, 62, 68, 1);
32
+ --ring: rgba(90, 90, 98, 1);
33
+ --accent: color-mix(in srgb, rgba(48, 48, 53, 1), transparent 20%);
34
+ --accent-foreground: rgba(237, 237, 240, 1);
35
+ --primary: rgba(80, 150, 255, 1);
36
+ --primary-foreground: rgba(8, 14, 24, 1);
37
+ --destructive: rgba(240, 96, 92, 1);
38
+
39
+ /* ── Slide surfaces that read better tuned explicitly on dark ────────── */
40
+ --theme-slide-stage-bg: rgba(12, 12, 14, 1);
41
+ --theme-slide-stage-slide-ring: rgba(255, 255, 255, 0.06);
42
+ --theme-slide-surface: rgba(34, 34, 38, 1);
43
+ --theme-slide-code-bg: rgba(34, 34, 38, 1);
44
+ --theme-switch-track-shadow: inset 0 1px rgb(0 0 0 / 0.2);
45
+ }
@@ -0,0 +1,48 @@
1
+ /* =============================================================================
2
+ @atom63/slides — EDITORIAL THEME
3
+
4
+ A light, serif "paper & ink" palette for the slide player — warm off-white
5
+ stock, near-black ink, a deep editorial red signal, and Cormorant serif
6
+ headlines. Import it AFTER the default tokens to flip the whole deck (slides +
7
+ chrome) to this look; every --theme-slide-* and chrome token derives from this
8
+ base palette, so overriding the palette + font tokens is enough:
9
+
10
+ import "@atom63/slides/theme-defaults"; // light defaults + base rules
11
+ import "@atom63/slides/themes/editorial"; // override → editorial
12
+ import "@atom63/slides/styles";
13
+
14
+ A theme is ONLY a :root override of the documented tokens — no per-theme
15
+ component code. Override any of these tokens in your own stylesheet to tweak.
16
+
17
+ Palette adapted from zarazhangrui/frontend-slides (MIT).
18
+ ============================================================================= */
19
+ @import url('https://fonts.googleapis.com/css2?family=Cormorant:wght@500;600;700&family=Source+Serif+4:opsz,wght@8..60,400;8..60,600&display=swap');
20
+ :root {
21
+ /* ── Base palette (editorial) ────────────────────────────────────────── */
22
+ --background: #faf9f7;
23
+ --foreground: #1a1a1a;
24
+ --card: #ffffff;
25
+ --popover: #ffffff;
26
+ --popover-foreground: #1a1a1a;
27
+ --muted: #efece6;
28
+ --muted-foreground: #6b6258;
29
+ --secondary: #efece6;
30
+ --secondary-foreground: #4a4038;
31
+ --border: #e2dcd2;
32
+ --input: #d9d2c6;
33
+ --ring: #c41e3a;
34
+ --accent: #efe7dc;
35
+ --accent-foreground: #1a1a1a;
36
+ --primary: #c41e3a;
37
+ --primary-foreground: #fff7f5;
38
+ --destructive: #c41e3a;
39
+
40
+ /* ── Fonts — serif headlines & body; mono stays default ──────────────── */
41
+ --font-sans: "Cormorant", Georgia, serif;
42
+ --font-serif: "Cormorant", Georgia, serif;
43
+
44
+ /* ── Slide surfaces tuned for the paper & ink look ───────────────────── */
45
+ --theme-slide-stage-bg: #ece8e1;
46
+ --theme-slide-surface: #ffffff;
47
+ --theme-slide-quote-color: #2a2a2a;
48
+ }
@@ -0,0 +1,47 @@
1
+ /* =============================================================================
2
+ @atom63/slides — NEON THEME
3
+
4
+ A dark "cyber" palette for the slide player — deep navy with a cyan signal and
5
+ magenta destructive. Palette-led (no special webfont, to keep it light).
6
+ Import it AFTER the default tokens to flip the whole deck (slides + chrome) to
7
+ this look; every --theme-slide-* and chrome token derives from this base
8
+ palette, so overriding the palette is enough:
9
+
10
+ import "@atom63/slides/theme-defaults"; // light defaults + base rules
11
+ import "@atom63/slides/themes/neon"; // override → neon
12
+ import "@atom63/slides/styles";
13
+
14
+ A theme is ONLY a :root override of the documented tokens — no per-theme
15
+ component code. Override any of these tokens in your own stylesheet to tweak.
16
+
17
+ Palette adapted from zarazhangrui/frontend-slides (MIT).
18
+ ============================================================================= */
19
+ :root {
20
+ /* ── Base palette (neon) ─────────────────────────────────────────────── */
21
+ --background: #0a0f1c;
22
+ --foreground: #e6f0ff;
23
+ --card: #111829;
24
+ --popover: #111829;
25
+ --popover-foreground: #e6f0ff;
26
+ --muted: #141b2e;
27
+ --muted-foreground: #8da2c0;
28
+ --secondary: #141b2e;
29
+ --secondary-foreground: #cfe0ff;
30
+ --border: #243049;
31
+ --input: #243049;
32
+ --ring: #00ffcc;
33
+ --accent: #16203a;
34
+ --accent-foreground: #e6f0ff;
35
+ --primary: #00ffcc;
36
+ --primary-foreground: #04121a;
37
+ --destructive: #ff00aa;
38
+
39
+ /* ── Fonts — defaults (this is a palette-only theme) ─────────────────── */
40
+
41
+ /* ── Slide surfaces tuned for the cyber look ─────────────────────────── */
42
+ --theme-slide-stage-bg: #05080f;
43
+ --theme-slide-surface: #111829;
44
+ --theme-slide-code-bg: #111829;
45
+ --theme-slide-accent: #00ffcc;
46
+ --theme-slide-quote-color: #b9e8ff;
47
+ }
@@ -0,0 +1,50 @@
1
+ /* =============================================================================
2
+ @atom63/slides — TERMINAL THEME
3
+
4
+ A dark, monospace "terminal" palette for the slide player — GitHub-dark greys
5
+ with a phosphor-green signal color and JetBrains Mono everywhere. Import it
6
+ AFTER the default tokens to flip the whole deck (slides + chrome) to this look;
7
+ every --theme-slide-* and chrome token derives from this base palette, so
8
+ overriding the palette + font tokens is enough:
9
+
10
+ import "@atom63/slides/theme-defaults"; // light defaults + base rules
11
+ import "@atom63/slides/themes/terminal"; // override → terminal
12
+ import "@atom63/slides/styles";
13
+
14
+ A theme is ONLY a :root override of the documented tokens — no per-theme
15
+ component code. Override any of these tokens in your own stylesheet to tweak.
16
+
17
+ Palette adapted from zarazhangrui/frontend-slides (MIT).
18
+ ============================================================================= */
19
+ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap');
20
+ :root {
21
+ /* ── Base palette (terminal) ─────────────────────────────────────────── */
22
+ --background: #0d1117;
23
+ --foreground: #c9d1d9;
24
+ --card: #161b22;
25
+ --popover: #161b22;
26
+ --popover-foreground: #c9d1d9;
27
+ --muted: #161b22;
28
+ --muted-foreground: #8b949e;
29
+ --secondary: #161b22;
30
+ --secondary-foreground: #c9d1d9;
31
+ --border: #30363d;
32
+ --input: #30363d;
33
+ --ring: #39d353;
34
+ --accent: #1f2630;
35
+ --accent-foreground: #c9d1d9;
36
+ --primary: #39d353;
37
+ --primary-foreground: #0d1117;
38
+ --destructive: #f85149;
39
+
40
+ /* ── Fonts — mono everything, that's the terminal vibe ───────────────── */
41
+ --font-sans: "JetBrains Mono", ui-monospace, monospace;
42
+ --font-serif: "JetBrains Mono", ui-monospace, monospace;
43
+ --font-mono: "JetBrains Mono", ui-monospace, monospace;
44
+
45
+ /* ── Slide surfaces tuned for the terminal look ──────────────────────── */
46
+ --theme-slide-stage-bg: #010409;
47
+ --theme-slide-surface: #161b22;
48
+ --theme-slide-code-bg: #161b22;
49
+ --theme-slide-accent: #39d353;
50
+ }