Skip to content

Commit be4f660

Browse files
committed
feat: add dark mode support via prefers-color-scheme
Add automatic dark mode support that respects operating system preferences using the `@media (prefers-color-scheme: dark)` CSS media query. Changes: - verso-vars.css: Add new CSS custom properties for backgrounds, borders, links, shadows, and message colors with dark mode variants - code.css: Update API docs styling to use CSS variables - search-box.css/search-highlight.css: Update search UI to use CSS variables - Style.lean: Update manual page styling to use CSS variables The color scheme is harmonized with lean-lang.org: - Light: #ffffff background, #333 text, #386ee0 links - Dark: #1e1e1e background, #eee text, #3b94ff links Closes #641
1 parent dd37d0e commit be4f660

8 files changed

Lines changed: 379 additions & 105 deletions

File tree

src/verso-html/code.css

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
body {
1616
font-family: var(--verso-text-font-family);
1717
line-height: 1.6;
18-
color: #333;
18+
color: var(--verso-text-color, #333);
19+
background-color: var(--verso-background-color, #fff);
1920
height: 100vh;
2021
overflow: hidden;
2122
}
@@ -29,8 +30,8 @@ body {
2930
/* Sidebar */
3031
.sidebar {
3132
width: 300px;
32-
background: #f8f9fa;
33-
border-right: 1px solid #e9ecef;
33+
background: var(--verso-surface-color, #f8f9fa);
34+
border-right: 1px solid var(--verso-border-color, #e9ecef);
3435
overflow-y: auto;
3536
flex-shrink: 0;
3637
}
@@ -73,11 +74,11 @@ body {
7374
}
7475

7576
.module-tree summary:hover {
76-
background-color: #e9ecef;
77+
background-color: var(--verso-border-color, #e9ecef);
7778
}
7879

7980
.module-tree summary a {
80-
color: #0066cc;
81+
color: var(--verso-link-color, #0066cc);
8182
text-decoration: none;
8283
}
8384

@@ -86,12 +87,12 @@ body {
8687
}
8788

8889
.module-tree summary.current {
89-
background-color: #0066cc;
90-
color: white;
90+
background-color: var(--verso-link-color, #0066cc);
91+
color: var(--verso-background-color, white);
9192
}
9293

9394
.module-tree summary.current a {
94-
color: white;
95+
color: var(--verso-background-color, white);
9596
}
9697

9798
.module-tree summary::before {
@@ -100,7 +101,7 @@ body {
100101
left: -0.75rem;
101102
transition: transform 0.2s ease;
102103
font-size: 0.75rem;
103-
color: #6c757d;
104+
color: var(--verso-text-color-light, #6c757d);
104105
}
105106

106107
.module-tree details[open] > summary::before {
@@ -114,7 +115,7 @@ body {
114115
}
115116

116117
.module-tree .leaf a {
117-
color: #0066cc;
118+
color: var(--verso-link-color, #0066cc);
118119
text-decoration: none;
119120
}
120121

@@ -123,12 +124,12 @@ body {
123124
}
124125

125126
.module-tree .current {
126-
background-color: #0066cc;
127-
color: white;
127+
background-color: var(--verso-link-color, #0066cc);
128+
color: var(--verso-background-color, white);
128129
}
129130

130131
.module-tree .current a {
131-
color: white;
132+
color: var(--verso-background-color, white);
132133
}
133134

134135
/* Main content area */
@@ -141,8 +142,8 @@ body {
141142

142143
/* Title bar */
143144
.title-bar {
144-
background: #fff;
145-
border-bottom: 1px solid #e9ecef;
145+
background: var(--verso-background-color, #fff);
146+
border-bottom: 1px solid var(--verso-border-color, #e9ecef);
146147
padding: 1rem 1.5rem;
147148
flex-shrink: 0;
148149
position: relative;
@@ -165,26 +166,26 @@ body {
165166
.breadcrumbs li:not(:last-child)::after {
166167
content: "·";
167168
margin: 0;
168-
color: #6c757d;
169+
color: var(--verso-text-color-light, #6c757d);
169170
font-weight: bold;
170171
}
171172

172173
.breadcrumbs a {
173-
color: #0066cc;
174+
color: var(--verso-link-color, #0066cc);
174175
text-decoration: none;
175176
padding: 0.25rem 0.5rem;
176177
border-radius: 0.25rem;
177178
transition: background-color 0.2s ease;
178179
}
179180

180181
.breadcrumbs a:hover {
181-
background-color: #e3f2fd;
182+
background-color: var(--verso-selected-color, #e3f2fd);
182183
text-decoration: underline;
183184
}
184185

185186
.breadcrumbs .current {
186187
font-weight: 600;
187-
color: #495057;
188+
color: var(--verso-text-color, #495057);
188189
padding: 0.25rem 0.5rem;
189190
border-radius: 0.25rem;
190191
}
@@ -194,8 +195,8 @@ body {
194195
flex: 1;
195196
overflow-y: auto;
196197
padding: 2rem;
197-
background: #ffffff;
198-
color: #24292e;
198+
background: var(--verso-background-color, #ffffff);
199+
color: var(--verso-text-color, #24292e);
199200
font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
200201
font-size: 1rem;
201202
}
@@ -206,7 +207,7 @@ body {
206207
margin-left: calc(var(--indent, 0) * 1ch);
207208
padding: 0.25rem 0.5rem;
208209
max-width: 40em;
209-
border: 1px solid #ddd;
210+
border: 1px solid var(--verso-border-color-light, #ddd);
210211
border-radius: 1rem;
211212
width: max-content;
212213
}
@@ -297,19 +298,19 @@ pre,
297298
top: 1rem;
298299
left: 1rem;
299300
z-index: 1001;
300-
background: #fff;
301-
border: 1px solid #dee2e6;
301+
background: var(--verso-background-color, #fff);
302+
border: 1px solid var(--verso-border-color, #dee2e6);
302303
border-radius: 0.375rem;
303304
padding: 0.5rem;
304305
cursor: pointer;
305-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
306+
box-shadow: 0 2px 4px var(--verso-shadow-color, rgba(0, 0, 0, 0.1));
306307
}
307308

308309
.hamburger span {
309310
display: block;
310311
width: 20px;
311312
height: 2px;
312-
background: #333;
313+
background: var(--verso-text-color, #333);
313314
margin: 4px 0;
314315
transition: 0.3s;
315316
}
@@ -327,7 +328,7 @@ pre,
327328
height: 100vh;
328329
z-index: 1000;
329330
transition: left 0.3s ease;
330-
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
331+
box-shadow: 2px 0 10px var(--verso-shadow-color, rgba(0, 0, 0, 0.1));
331332
}
332333

333334
.menu-toggle:checked + .hamburger + .layout .sidebar {

src/verso-manual/VersoManual/Html.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,7 @@ public def page
444444
<link rel="stylesheet" href="-verso-search/search-box.css"/>
445445
<link rel="stylesheet" href="-verso-search/search-highlight.css"/>
446446
<link rel="stylesheet" href="-verso-search/domain-display.css"/>
447+
<script src="theme-toggle.js"></script>
447448
{{extraJsFiles.map fun f => ({{<script src=s!"{f.1}" {{if f.2 then defer else #[]}}></script>}})}}
448449
{{extraStylesheets.map (fun url => {{<link rel="stylesheet" href={{url}}/> }})}}
449450
{{extraCss.toArray.map ({{<style>{{Html.text false ·.css}}</style>}})}}
@@ -465,6 +466,7 @@ public def page
465466
<div class="header-title-wrapper">
466467
<a href={{if let some dest := logoLink then dest else "/"}} class="header-title"><h1>{{bookTitle}}</h1></a>
467468
</div>
469+
<button id="theme-toggle" type="button" aria-label="Toggle dark mode"></button>
468470
</header>
469471
<label for="toggle-toc" id="toggle-toc-click">
470472
<span class="line line1"/>

0 commit comments

Comments
 (0)