Skip to content

Commit db8fc6c

Browse files
Copilotbrunoborges
andcommitted
Add dark/light theme toggle button to nav bar
Co-authored-by: brunoborges <129743+brunoborges@users.noreply.github.com>
1 parent aca39ed commit db8fc6c

File tree

4 files changed

+97
-1
lines changed

4 files changed

+97
-1
lines changed

site/app.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,29 @@
547547
window.updateViewToggleState = updateButtonState;
548548
};
549549

550+
/* ==========================================================
551+
7. Theme Toggle
552+
========================================================== */
553+
const initThemeToggle = () => {
554+
const btn = document.getElementById('themeToggle');
555+
if (!btn) return;
556+
557+
const updateButton = (theme) => {
558+
btn.textContent = theme === 'dark' ? '☀️' : '🌙';
559+
btn.setAttribute('aria-label', theme === 'dark' ? 'Switch to light theme' : 'Switch to dark theme');
560+
};
561+
562+
// The anti-FOUC inline script already applied the theme; just sync the button state
563+
updateButton(document.documentElement.getAttribute('data-theme') || 'dark');
564+
565+
btn.addEventListener('click', () => {
566+
const next = document.documentElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';
567+
document.documentElement.setAttribute('data-theme', next);
568+
localStorage.setItem('theme', next);
569+
updateButton(next);
570+
});
571+
};
572+
550573
/* ==========================================================
551574
Utilities
552575
========================================================== */
@@ -569,5 +592,6 @@
569592
initCopyButtons();
570593
initSyntaxHighlighting();
571594
initNewsletter();
595+
initThemeToggle();
572596
});
573597
})();

site/styles.css

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,53 @@ code, pre { font-family: 'JetBrains Mono', monospace; }
9696
}
9797
}
9898

99+
/* ---------- Manual Theme Override ---------- */
100+
:root[data-theme="light"] {
101+
--bg: #f8f8fa;
102+
--surface: #ffffff;
103+
--surface-2: #f0f0f4;
104+
--border: #d8d8e0;
105+
--border-light: #e4e4ea;
106+
--text: #1a1a2e;
107+
--text-muted: #6b6b80;
108+
--accent: #f97316;
109+
--accent-dim: #ea580c;
110+
--green: #059669;
111+
--blue: #2563eb;
112+
--pink: #db2777;
113+
--orange: #ea580c;
114+
--yellow: #ca8a04;
115+
--cyan: #0891b2;
116+
--red-muted: #dc2626;
117+
--old-bg: #fef2f2;
118+
--modern-bg: #eff6ff;
119+
--nav-bg: rgba(248, 248, 250, .85);
120+
color-scheme: light;
121+
}
122+
123+
:root[data-theme="dark"] {
124+
--bg: #0b0b0f;
125+
--surface: #14141a;
126+
--surface-2: #1a1a22;
127+
--border: #25252f;
128+
--border-light: #2f2f3a;
129+
--text: #e4e4e7;
130+
--text-muted: #6b6b76;
131+
--accent: #fb923c;
132+
--accent-dim: #f97316;
133+
--green: #34d399;
134+
--blue: #60a5fa;
135+
--pink: #f472b6;
136+
--orange: #fb923c;
137+
--yellow: #fbbf24;
138+
--cyan: #22d3ee;
139+
--red-muted: #ef4444;
140+
--old-bg: #1a1412;
141+
--modern-bg: #1a2838;
142+
--nav-bg: rgba(11, 11, 15, .8);
143+
color-scheme: dark;
144+
}
145+
99146
/* ---------- Base Body ---------- */
100147
body {
101148
background: var(--bg);
@@ -200,12 +247,28 @@ nav {
200247
text-decoration: none;
201248
}
202249

203-
.github-link:hover {
250+
.github-link:hover,
251+
.theme-toggle:hover {
204252
border-color: var(--accent);
205253
color: var(--accent);
206254
background: var(--surface-2);
207255
}
208256

257+
.theme-toggle {
258+
display: flex;
259+
align-items: center;
260+
justify-content: center;
261+
padding: 8px;
262+
border-radius: var(--radius-sm);
263+
border: 1px solid var(--border);
264+
background: var(--surface);
265+
color: var(--text-muted);
266+
font-size: 1rem;
267+
line-height: 1;
268+
transition: all 0.2s;
269+
cursor: pointer;
270+
}
271+
209272
/* ---------- Hero ---------- */
210273
.hero {
211274
text-align: center;

templates/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141

4242
<link rel="stylesheet" href="styles.css">
4343

44+
<script>
45+
(function(){var t=localStorage.getItem('theme')||(window.matchMedia('(prefers-color-scheme: light)').matches?'light':'dark');document.documentElement.setAttribute('data-theme',t);})();
46+
</script>
47+
4448
<script type="application/ld+json">
4549
{
4650
"@context": "https://schema.org",
@@ -172,6 +176,7 @@
172176
<path d="M10 3C6.13 3 3 6.13 3 10c0 3.09 2 5.71 4.77 6.63.35.06.48-.15.48-.33v-1.16c-1.95.42-2.36-1.07-2.36-1.07-.32-.81-.78-1.03-.78-1.03-.64-.43.05-.42.05-.42.7.05 1.07.72 1.07.72.63 1.08 1.65.77 2.05.59.06-.46.24-.77.44-.95-1.57-.18-3.22-.78-3.22-3.48 0-.77.27-1.4.72-1.89-.07-.18-.31-.9.07-1.87 0 0 .59-.19 1.93.72.56-.16 1.16-.24 1.76-.24s1.2.08 1.76.24c1.34-.91 1.93-.72 1.93-.72.38.97.14 1.69.07 1.87.45.49.72 1.12.72 1.89 0 2.71-1.65 3.3-3.23 3.47.25.22.48.65.48 1.31v1.94c0 .19.13.4.48.33C15 15.71 17 13.09 17 10c0-3.87-3.13-7-7-7z"/>
173177
</svg>
174178
</a>
179+
<button class="theme-toggle" id="themeToggle" aria-label="Toggle theme">☀️</button>
175180
<div class="cmd-bar" id="searchTrigger">Search… <kbd>⌘K</kbd></div>
176181
</div>
177182
</div>

templates/slug-template.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
<meta name="robots" content="index, follow">
99
<link rel="canonical" href="{{canonicalUrl}}">
1010
<link rel="stylesheet" href="../styles.css">
11+
<script>
12+
(function(){var t=localStorage.getItem('theme')||(window.matchMedia('(prefers-color-scheme: light)').matches?'light':'dark');document.documentElement.setAttribute('data-theme',t);})();
13+
</script>
1114
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
1215
<link rel="manifest" href="../manifest.json">
1316
<meta name="theme-color" content="#f97316">
@@ -96,6 +99,7 @@
9699
<path d="M10 3C6.13 3 3 6.13 3 10c0 3.09 2 5.71 4.77 6.63.35.06.48-.15.48-.33v-1.16c-1.95.42-2.36-1.07-2.36-1.07-.32-.81-.78-1.03-.78-1.03-.64-.43.05-.42.05-.42.7.05 1.07.72 1.07.72.63 1.08 1.65.77 2.05.59.06-.46.24-.77.44-.95-1.57-.18-3.22-.78-3.22-3.48 0-.77.27-1.4.72-1.89-.07-.18-.31-.9.07-1.87 0 0 .59-.19 1.93.72.56-.16 1.16-.24 1.76-.24s1.2.08 1.76.24c1.34-.91 1.93-.72 1.93-.72.38.97.14 1.69.07 1.87.45.49.72 1.12.72 1.89 0 2.71-1.65 3.3-3.23 3.47.25.22.48.65.48 1.31v1.94c0 .19.13.4.48.33C15 15.71 17 13.09 17 10c0-3.87-3.13-7-7-7z"/>
97100
</svg>
98101
</a>
102+
<button class="theme-toggle" id="themeToggle" aria-label="Toggle theme">☀️</button>
99103
<a href="/" class="back-link">← All patterns</a>
100104

101105
<div class="nav-arrows">

0 commit comments

Comments
 (0)