Skip to content

Commit 8e61bed

Browse files
committed
add dark mode switch
1 parent 0658422 commit 8e61bed

8 files changed

Lines changed: 225 additions & 18 deletions

File tree

_includes/banner.html

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div class="main_menu">
33
<nav class="navbar navbar-expand-lg navbar-light">
44
<div class="container box_1620">
5-
<a class="navbar-brand logo_h" href="{{ '/' | relative_url }}"><img src="{{ '/assets/img/logo-dark.png' | relative_url }}" alt="OrderLab"></a>
5+
<a class="navbar-brand logo_h" href="{{ '/' | relative_url }}"><img src="{{ '/assets/img/logo-gray.png' | relative_url }}" alt="OrderLab"></a>
66
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
77
<span class="icon-bar"></span>
88
<span class="icon-bar"></span>
@@ -17,6 +17,16 @@
1717
<li class="nav-item {% if current[1] == 'blog' %}active{% endif %}"><a class="nav-link" href="{{ '/blog/' | relative_url }}">Blog</a></li>
1818
<li class="nav-item"><a class="nav-link" href="https://orderlab.io/reading-group" target="_blank">Reading</a></li>
1919
<li class="nav-item {% if current[1] == 'join' %}active{% endif %}"><a class="nav-link" href="{{ '/join/' | relative_url }}">Join</a></li>
20+
<li class="nav-item nav-item--theme">
21+
<button
22+
class="theme-toggle"
23+
type="button"
24+
data-theme-toggle
25+
aria-label="Toggle theme"
26+
aria-pressed="false">
27+
<i class="fas fa-adjust theme-toggle__icon" aria-hidden="true"></i>
28+
</button>
29+
</li>
2030
</ul>
2131
</div>
2232
</div>

_includes/head.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@
99

1010
<title>{% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %}</title>
1111

12+
<script>
13+
(function() {
14+
var stored = null;
15+
try { stored = localStorage.getItem("orderlab-theme"); } catch (e) {}
16+
var prefersDark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches;
17+
var theme = stored || (prefersDark ? "dark" : "light");
18+
document.documentElement.setAttribute("data-theme", theme);
19+
})();
20+
</script>
21+
1222
<!-- CSS -->
1323
<link rel="shortcut icon" href="{{ '/assets/favicon.ico' | relative_url }}">
1424
<link rel="stylesheet" href="{{ '/vendors/bootstrap/bootstrap.min.css' | relative_url }}">

assets/css/modern.css

Lines changed: 176 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ a:hover {
104104

105105
.section-intro__title {
106106
margin-bottom: 0.65rem;
107+
color: var(--ink);
107108
}
108109

109110
.section-intro__subtitle {
@@ -139,23 +140,23 @@ a:hover {
139140
}
140141

141142
.header_area .navbar {
142-
margin-top: 12px;
143+
margin-top: 0;
143144
margin-bottom: 10px;
144145
padding: 10px 14px;
145146
border-radius: 0;
146-
border: 1px solid rgba(22, 49, 84, 0.75);
147-
background: linear-gradient(180deg, #132b49, #10243d);
147+
border: 1px solid #e3e9f1;
148+
background: #f8fafd;
148149
backdrop-filter: blur(8px);
149150
box-shadow: var(--shadow-sm);
150151
}
151152

152153
.header_area .navbar-brand {
153154
margin-right: 14px;
154-
border-radius: 10px;
155-
padding: 0.26rem 0.56rem;
156-
background: #f7f9fd;
157-
border: 1px solid #dbe5f2;
158-
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.85);
155+
border-radius: 0;
156+
padding: 0;
157+
background: transparent;
158+
border: 0;
159+
box-shadow: none;
159160
}
160161

161162
.header_area .navbar-brand img {
@@ -176,16 +177,16 @@ a:hover {
176177
letter-spacing: 0.08em;
177178
text-transform: uppercase;
178179
border-radius: 999px;
179-
color: rgba(238, 245, 255, 0.95);
180+
color: #1a3558;
180181
padding: 8px 11px;
181182
line-height: 1.2;
182183
transition: all 0.2s ease;
183184
}
184185

185186
.header_area .navbar .nav .nav-item:hover .nav-link,
186187
.header_area .navbar .nav .nav-item.active .nav-link {
187-
color: #ffffff;
188-
background: rgba(255, 255, 255, 0.16);
188+
color: #10335e;
189+
background: rgba(34, 86, 155, 0.12);
189190
}
190191

191192
.header_area.navbar_fixed .main_menu {
@@ -1296,13 +1297,13 @@ a:hover {
12961297
margin-top: 0;
12971298
margin-bottom: 0;
12981299
border-radius: 0;
1299-
border: 0;
1300-
background: linear-gradient(180deg, #132b49, #10243d);
1300+
border: 1px solid #e3e9f1;
1301+
background: #f8fafd;
13011302
}
13021303

13031304
.header_area .navbar-brand {
1304-
border-radius: 8px;
1305-
padding: 0.2rem 0.45rem;
1305+
border-radius: 0;
1306+
padding: 0;
13061307
}
13071308

13081309
.header_area .navbar .nav .nav-item .nav-link {
@@ -1416,3 +1417,163 @@ a:hover {
14161417
transition: none !important;
14171418
}
14181419
}
1420+
1421+
/* Theme toggle + dark mode */
1422+
.nav-item--theme {
1423+
display: flex;
1424+
align-items: center;
1425+
margin-left: 0.45rem;
1426+
}
1427+
1428+
.theme-toggle {
1429+
border: 0;
1430+
background: transparent;
1431+
color: #214a7b;
1432+
border-radius: 999px;
1433+
width: 36px;
1434+
height: 36px;
1435+
padding: 0;
1436+
font-size: 0.9rem;
1437+
font-weight: 700;
1438+
line-height: 1;
1439+
display: inline-flex;
1440+
align-items: center;
1441+
justify-content: center;
1442+
transition: all 0.2s ease;
1443+
}
1444+
1445+
.theme-toggle:hover {
1446+
background: transparent;
1447+
color: #12355f;
1448+
}
1449+
1450+
.theme-toggle:focus {
1451+
outline: 0;
1452+
box-shadow: 0 0 0 2px rgba(116, 161, 226, 0.35);
1453+
}
1454+
1455+
[data-theme="dark"] {
1456+
--bg: #0b1220;
1457+
--bg-soft: #0f1728;
1458+
--surface: #121e31;
1459+
--surface-subtle: #17263b;
1460+
--ink: #e6eefb;
1461+
--ink-subtle: #a6b8d1;
1462+
--line: #27415f;
1463+
--brand: #66a3ff;
1464+
--brand-strong: #8ab8ff;
1465+
--accent: #38a8aa;
1466+
--shadow-sm: 0 10px 28px rgba(0, 0, 0, 0.28);
1467+
--shadow-md: 0 22px 52px rgba(0, 0, 0, 0.36);
1468+
}
1469+
1470+
[data-theme="dark"] body {
1471+
background:
1472+
radial-gradient(58rem 28rem at -5% -8%, rgba(80, 124, 191, 0.22), transparent 70%),
1473+
radial-gradient(40rem 20rem at 104% 0%, rgba(25, 121, 127, 0.16), transparent 68%),
1474+
var(--bg);
1475+
}
1476+
1477+
[data-theme="dark"] .header_area .navbar {
1478+
border-color: rgba(98, 135, 187, 0.62);
1479+
background: linear-gradient(180deg, #0f2038, #0a1628);
1480+
}
1481+
1482+
[data-theme="dark"] .header_area .navbar .nav .nav-item .nav-link {
1483+
color: rgba(238, 245, 255, 0.95);
1484+
}
1485+
1486+
[data-theme="dark"] .header_area .navbar .nav .nav-item:hover .nav-link,
1487+
[data-theme="dark"] .header_area .navbar .nav .nav-item.active .nav-link {
1488+
color: #ffffff;
1489+
background: rgba(255, 255, 255, 0.16);
1490+
}
1491+
1492+
[data-theme="dark"] .header_area .navbar-brand {
1493+
background: transparent;
1494+
border: 0;
1495+
box-shadow: none;
1496+
}
1497+
1498+
[data-theme="dark"] .theme-toggle {
1499+
border: 0;
1500+
background: transparent;
1501+
color: #f1f6ff;
1502+
}
1503+
1504+
[data-theme="dark"] .section-shell .container {
1505+
background: rgba(18, 30, 48, 0.9);
1506+
}
1507+
1508+
[data-theme="dark"] .scope-panel {
1509+
background: linear-gradient(145deg, rgba(20, 32, 50, 0.96), rgba(17, 28, 45, 0.98));
1510+
}
1511+
1512+
[data-theme="dark"] .project-card,
1513+
[data-theme="dark"] .blog-hub__item,
1514+
[data-theme="dark"] .blog-post,
1515+
[data-theme="dark"] .publications li,
1516+
[data-theme="dark"] .newslist li,
1517+
[data-theme="dark"] .sponsor-card,
1518+
[data-theme="dark"] .card-feature,
1519+
[data-theme="dark"] .single-team-member .meta-text {
1520+
background: var(--surface);
1521+
border-color: var(--line);
1522+
}
1523+
1524+
[data-theme="dark"] .project-card__media,
1525+
[data-theme="dark"] .hero-visual-card,
1526+
[data-theme="dark"] .project-card__media img.project-logo-fit {
1527+
background: var(--surface-subtle);
1528+
}
1529+
1530+
[data-theme="dark"] .scope-chip {
1531+
border-color: #3b5c83;
1532+
background: #1b2d45;
1533+
color: #c4d9f7;
1534+
}
1535+
1536+
[data-theme="dark"] .home-news-list__date {
1537+
color: #9eb1c9;
1538+
}
1539+
1540+
[data-theme="dark"] .home-news-list li::before {
1541+
background: #8da4c3;
1542+
}
1543+
1544+
[data-theme="dark"] .blog-post__meta {
1545+
color: #9fb3cc;
1546+
}
1547+
1548+
[data-theme="dark"] .blog-post__header,
1549+
[data-theme="dark"] .blog-post__footer {
1550+
border-color: #2c445f;
1551+
}
1552+
1553+
[data-theme="dark"] .blog-post__content blockquote {
1554+
border-left-color: #4b6f9d;
1555+
background: #15263d;
1556+
color: #bed0e6;
1557+
}
1558+
1559+
[data-theme="dark"] .blog-post__content code {
1560+
background: #1a2b42;
1561+
border-color: #2f4f74;
1562+
color: #c9ddf8;
1563+
}
1564+
1565+
[data-theme="dark"] .blog-post__content pre {
1566+
border-color: #355371;
1567+
background: #0b1423;
1568+
}
1569+
1570+
[data-theme="dark"] .footer-area {
1571+
background: linear-gradient(180deg, #091221, #070e19);
1572+
}
1573+
1574+
@media (max-width: 991px) {
1575+
.nav-item--theme {
1576+
margin-left: 0;
1577+
margin-top: 0.45rem;
1578+
}
1579+
}

assets/img/logo-gray.png

69.7 KB
Loading

assets/img/logo-transparent.png

53.7 KB
Loading

assets/js/main.js

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,33 @@
11
$(function() {
22
"use strict";
3-
4-
var nav_offset_top = $('header').height() + 50;
3+
4+
function applyTheme(theme) {
5+
var mode = theme === "dark" ? "dark" : "light";
6+
document.documentElement.setAttribute("data-theme", mode);
7+
var $toggle = $("[data-theme-toggle]");
8+
if ($toggle.length) {
9+
var isDark = mode === "dark";
10+
$toggle.attr("aria-pressed", isDark ? "true" : "false");
11+
}
12+
}
13+
14+
function initThemeToggle() {
15+
var stored = null;
16+
try { stored = localStorage.getItem("orderlab-theme"); } catch (e) {}
17+
var current = stored || document.documentElement.getAttribute("data-theme") || "light";
18+
applyTheme(current);
19+
20+
$(document).on("click", "[data-theme-toggle]", function() {
21+
var active = document.documentElement.getAttribute("data-theme") || "light";
22+
var next = active === "dark" ? "light" : "dark";
23+
applyTheme(next);
24+
try { localStorage.setItem("orderlab-theme", next); } catch (e) {}
25+
});
26+
}
27+
28+
initThemeToggle();
29+
30+
var nav_offset_top = $('header').height() + 50;
531
/*-------------------------------------------------------------------------------
632
Navbar
733
-------------------------------------------------------------------------------*/

0 commit comments

Comments
 (0)