Skip to content

Commit 2d3bac6

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 2d3bac6

5 files changed

Lines changed: 132 additions & 65 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/Style.lean

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public def pageStyle : String := r####"
2424
--verso-logo-height: var(--verso-header-height);
2525
2626
/** Table of Contents appearance **/
27-
--verso-toc-background-color: #fafafa;
27+
--verso-toc-background-color: var(--verso-surface-color, #fafafa);
2828
--verso-toc-text-color: var(--verso-text-color);
2929
3030
/* How long should the ToC animation take? */
@@ -33,15 +33,15 @@ public def pageStyle : String := r####"
3333
/* How wide should the ToC be on non-mobile? */
3434
--verso-toc-width: 18rem;
3535
36-
/** Variables that control the burger menu appearance **/
36+
/** Variables that control the "burger menu" appearance **/
3737
--verso-burger-height: 1.25rem;
3838
--verso-burger-width: 1.25rem;
3939
--verso-burger-line-width: 0.2rem;
4040
--verso-burger-line-radius: 0.2rem;
4141
--verso-burger-toc-visible-color: var(--verso-toc-text-color);
42-
--verso-burger-toc-visible-shadow-color: #ffffff;
43-
--verso-burger-toc-hidden-color: #0e2431;
44-
--verso-burger-toc-hidden-shadow-color: #ffffff;
42+
--verso-burger-toc-visible-shadow-color: var(--verso-background-color, #ffffff);
43+
--verso-burger-toc-hidden-color: var(--verso-text-color, #0e2431);
44+
--verso-burger-toc-hidden-shadow-color: var(--verso-background-color, #ffffff);
4545
4646
/* The "burger menu" may need to get bigger for mobile screens */
4747
--verso-mobile-burger-height: 1.5rem;
@@ -85,6 +85,8 @@ html {
8585
body {
8686
margin: 0;
8787
padding: 0;
88+
background-color: var(--verso-background-color, #ffffff);
89+
color: var(--verso-text-color, #333333);
8890
}
8991
9092
/******** Theme ********/
@@ -94,6 +96,7 @@ h1, h2, h3, h4, h5, h6 {
9496
font-weight: bold;
9597
text-rendering: optimizeLegibility;
9698
margin-top: 1.5rem;
99+
color: var(--verso-structure-color, inherit);
97100
}
98101
99102
p, dt, dd {
@@ -116,6 +119,14 @@ pre, code {
116119
overflow-y: clip;
117120
}
118121
122+
a {
123+
color: var(--verso-link-color, #386ee0);
124+
}
125+
126+
a:hover {
127+
color: var(--verso-link-hover-color, #0073e6);
128+
}
129+
119130
/******** Page Layout ********/
120131
121132
header {
@@ -124,11 +135,11 @@ header {
124135
z-index: 99;
125136
left: 0;
126137
right: 0;
127-
background: white;
138+
background: var(--verso-background-color, white);
128139
display: flex;
129140
align-items: center;
130141
height: var(--verso-header-height);
131-
box-shadow: 0 0px 6px lightgray;
142+
box-shadow: 0 0px 6px var(--verso-shadow-color, lightgray);
132143
}
133144
134145
.header-logo-wrapper {
@@ -158,7 +169,7 @@ header {
158169
159170
.header-title {
160171
text-decoration: none;
161-
color: black;
172+
color: var(--verso-text-color, black);
162173
font-size: 2rem;
163174
font-weight: bold;
164175
display: block;
@@ -240,7 +251,7 @@ main [id] {
240251
body:has(#toggle-toc:checked) .toc-backdrop {
241252
position: fixed;
242253
inset: 0;
243-
background-color: #aaa8;
254+
background-color: rgba(0, 0, 0, 0.5);
244255
z-index: 9;
245256
}
246257
html:has(#toggle-toc:checked) {
@@ -275,13 +286,13 @@ main [id] {
275286
}
276287
277288
#toc a {
278-
color: #333;
289+
color: var(--verso-text-color, #333);
279290
text-decoration: none;
280291
}
281292
282293
#toc a:hover {
283294
text-decoration: underline;
284-
color: #000;
295+
color: var(--verso-link-hover-color, #000);
285296
}
286297
287298
.toc-title {
@@ -345,7 +356,7 @@ main [id] {
345356
width: calc(var(--verso-toc-triangle-width) + var(--verso-toc-triangle-left-space));
346357
height: var(--verso-toc-triangle-height);
347358
display: inline-block;
348-
background-color: black;
359+
background-color: var(--verso-text-color, black);
349360
content: ' ';
350361
transition: ease 0.2s;
351362
margin-right: var(--verso-toc-triangle-margin);
@@ -386,7 +397,7 @@ main [id] {
386397
}
387398
388399
#toc .split-toc table {
389-
border-left: 1px dotted;
400+
border-left: 1px dotted var(--verso-border-color, currentColor);
390401
padding-left: 1.2rem;
391402
padding-top: 0.2rem;
392403
}
@@ -396,7 +407,7 @@ main [id] {
396407
}
397408
398409
#toc .split-toc > ol {
399-
border-left: 1px dotted;
410+
border-left: 1px dotted var(--verso-border-color, currentColor);
400411
list-style-type: none;
401412
padding-left: 0.5rem;
402413
margin-left: 0;
@@ -443,7 +454,7 @@ main [id] {
443454
flex: 1;
444455
justify-content: center;
445456
align-items: center;
446-
color: black;
457+
color: var(--verso-text-color, black);
447458
text-decoration: none;
448459
}
449460
@@ -798,7 +809,7 @@ main .section-toc a:hover {
798809
.permalink-widget > a {
799810
/* Don't show the colors here */
800811
color: transparent;
801-
text-shadow: 0 0 0 gray;
812+
text-shadow: 0 0 0 var(--verso-text-color-light, gray);
802813
text-decoration: none;
803814
}
804815
@@ -881,18 +892,18 @@ main section li ol {
881892
overflow-x: auto;
882893
margin: 0px;
883894
margin: 0.5em .85em;
884-
border-left: 0.2em solid red;
895+
border-left: 0.2em solid var(--verso-error-indicator-color, red);
885896
padding: 0 0.45em;
886897
}
887898
888899
/* Different color for warning */
889900
.lean-output.warning {
890-
border-color: var(--verso-warning-color);
901+
border-color: var(--verso-warning-indicator-color);
891902
}
892903
893904
/* Different color for information */
894905
.lean-output.information {
895-
border-color: #0000c0;
906+
border-color: var(--verso-info-indicator-color, #0000c0);
896907
}
897908
898909

0 commit comments

Comments
 (0)