Skip to content

Commit ce741e2

Browse files
committed
dark theme changes
update
1 parent c0f029c commit ce741e2

4 files changed

Lines changed: 135 additions & 22 deletions

File tree

bakerydemo/static/css/main.css

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,22 @@ each detail view
4747
/* stylelint-enable */
4848
--font-sm: 1rem;
4949
--font-md: 1.125rem;
50+
--text-on-media: #fff;
51+
}
52+
53+
:root[data-theme='dark'] {
54+
--dark: #f1f4f8;
55+
--grey: #acb5c0;
56+
--border-grey: #3e4855;
57+
--transparent-border: rgb(164 180 201 / 30%);
58+
--white: #11161d;
59+
--cream: #1a222d;
60+
--light-brown: #c8b083;
61+
--mid-brown: #f0b45d;
62+
--dark-brown: #ffe0b0;
63+
--orange: #f0b45d;
64+
--dark-orange: #ffd29b;
65+
--text-on-media: #fff;
5066
}
5167

5268
html {
@@ -70,6 +86,10 @@ body {
7086
min-height: 100vh;
7187
}
7288

89+
html[data-theme='dark'] {
90+
color-scheme: dark;
91+
}
92+
7393
body.no-scroll {
7494
overflow-y: hidden;
7595
}
@@ -163,7 +183,7 @@ ul {
163183
}
164184

165185
.hero h1 {
166-
color: var(--white);
186+
color: var(--text-on-media);
167187
position: relative;
168188
}
169189

@@ -358,7 +378,7 @@ caption {
358378
}
359379

360380
.hero__title {
361-
color: var(--white);
381+
color: var(--text-on-media);
362382
font-weight: 400;
363383
font-size: 2.875rem;
364384
line-height: 1.09;
@@ -619,6 +639,7 @@ caption {
619639
position: absolute;
620640
right: 13px;
621641
top: 13px;
642+
color: var(--dark);
622643
}
623644

624645
@media (min-width: 768px) {
@@ -628,13 +649,31 @@ caption {
628649
}
629650

630651
.navigation__search-input {
652+
background-color: var(--white);
631653
color: var(--dark);
632654
font-size: var(--font-sm);
633655
line-height: 1.5;
634656
border: 1px solid var(--dark);
635657
padding: 10px;
636658
}
637659

660+
.navigation__theme-toggle {
661+
appearance: none;
662+
margin: 0 0 0 10px;
663+
border: 1px solid var(--dark);
664+
background-color: var(--white);
665+
color: var(--dark);
666+
padding: 10px 12px;
667+
font-size: 0.875rem;
668+
line-height: 1;
669+
}
670+
671+
.navigation__theme-toggle:hover,
672+
.navigation__theme-toggle:focus {
673+
background-color: var(--dark);
674+
color: var(--white);
675+
}
676+
638677
.navigation__items {
639678
list-style: none;
640679
margin: 0;
@@ -652,12 +691,16 @@ caption {
652691

653692
.navigation__search {
654693
display: block;
655-
margin: 0 0 0 auto;
694+
margin: 0 0 0 10px;
656695
}
657696

658697
.navigation__items {
659698
padding: 0 0 0 20px;
660699
}
700+
701+
.navigation__theme-toggle {
702+
margin: 0 0 0 auto;
703+
}
661704
}
662705

663706
.navigation__items > li {
@@ -1390,7 +1433,7 @@ input[type='radio'] {
13901433
.homepage .home-hero .lead {
13911434
font-family: var(--font--primary);
13921435
font-weight: 400;
1393-
color: var(--white);
1436+
color: var(--text-on-media);
13941437
margin: 40px auto;
13951438
font-size: 1.625rem;
13961439
line-height: 1.15;
@@ -1753,7 +1796,7 @@ input[type='radio'] {
17531796
}
17541797

17551798
.picture-card__title {
1756-
color: var(--white);
1799+
color: var(--text-on-media);
17571800
font-family: var(--font--primary);
17581801
font-size: 1.625rem;
17591802
line-height: 1.15;

bakerydemo/static/js/main.js

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,71 @@
11
document.addEventListener('DOMContentLoaded', () => {
22
const navigation = document.querySelector('[data-navigation]');
3-
const mobileNavigation = navigation.querySelector('[data-mobile-navigation]');
4-
const body = document.querySelector('body');
5-
const mobileNavigationToggle = navigation.querySelector(
6-
'[data-mobile-navigation-toggle]',
7-
);
3+
const themeToggle = document.querySelector('[data-theme-toggle]');
4+
const htmlElement = document.documentElement;
5+
const storage = {
6+
get(key) {
7+
try {
8+
return localStorage.getItem(key);
9+
} catch {
10+
return null;
11+
}
12+
},
13+
set(key, value) {
14+
try {
15+
localStorage.setItem(key, value);
16+
} catch {
17+
// Ignore storage failures and keep the theme change in-memory only.
18+
}
19+
},
20+
};
821

9-
function toggleMobileNavigation() {
10-
if (mobileNavigation.hidden) {
11-
body.classList.add('no-scroll');
12-
mobileNavigation.hidden = false;
13-
mobileNavigationToggle.setAttribute('aria-expanded', 'true');
14-
} else {
15-
body.classList.remove('no-scroll');
16-
mobileNavigation.hidden = true;
17-
mobileNavigationToggle.setAttribute('aria-expanded', 'false');
22+
function updateThemeToggleLabel() {
23+
if (!themeToggle) {
24+
return;
1825
}
26+
const isDarkTheme = htmlElement.dataset.theme === 'dark';
27+
themeToggle.textContent = isDarkTheme ? 'Light mode' : 'Dark mode';
28+
themeToggle.setAttribute('aria-pressed', isDarkTheme ? 'true' : 'false');
29+
themeToggle.setAttribute(
30+
'aria-label',
31+
isDarkTheme ? 'Switch to light theme' : 'Switch to dark theme',
32+
);
1933
}
2034

21-
mobileNavigationToggle.addEventListener('click', () => {
22-
toggleMobileNavigation();
23-
});
35+
if (navigation) {
36+
const mobileNavigation = navigation.querySelector(
37+
'[data-mobile-navigation]',
38+
);
39+
const body = document.querySelector('body');
40+
const mobileNavigationToggle = navigation.querySelector(
41+
'[data-mobile-navigation-toggle]',
42+
);
43+
44+
function toggleMobileNavigation() {
45+
if (mobileNavigation.hidden) {
46+
body.classList.add('no-scroll');
47+
mobileNavigation.hidden = false;
48+
mobileNavigationToggle.setAttribute('aria-expanded', 'true');
49+
} else {
50+
body.classList.remove('no-scroll');
51+
mobileNavigation.hidden = true;
52+
mobileNavigationToggle.setAttribute('aria-expanded', 'false');
53+
}
54+
}
55+
56+
mobileNavigationToggle.addEventListener('click', () => {
57+
toggleMobileNavigation();
58+
});
59+
}
60+
61+
if (themeToggle) {
62+
updateThemeToggleLabel();
63+
64+
themeToggle.addEventListener('click', () => {
65+
const nextTheme = htmlElement.dataset.theme === 'dark' ? 'light' : 'dark';
66+
htmlElement.dataset.theme = nextTheme;
67+
storage.set('theme', nextTheme);
68+
updateThemeToggleLabel();
69+
});
70+
}
2471
});

bakerydemo/templates/base.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@
2323
<base target="_blank">
2424
{% endif %}
2525

26+
<script>
27+
(() => {
28+
let storedTheme = null;
29+
try {
30+
storedTheme = localStorage.getItem("theme");
31+
} catch (error) {
32+
storedTheme = null;
33+
}
34+
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
35+
document.documentElement.dataset.theme = storedTheme || (prefersDark ? "dark" : "light");
36+
})();
37+
</script>
38+
2639
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
2740
<link rel="stylesheet" href="{% static 'css/font-marcellus.css' %}">
2841
<link rel="stylesheet" href="{% static 'css/main.css' %}">

bakerydemo/templates/includes/header.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@
4444
</ul>
4545
</nav>
4646

47+
<button
48+
type="button"
49+
class="navigation__theme-toggle"
50+
data-theme-toggle
51+
aria-label="Toggle dark theme"
52+
aria-pressed="false"
53+
>
54+
Theme
55+
</button>
56+
4757
<form action="/search" method="get" class="navigation__search" role="search">
4858
<label for="search-input" class="u-sr-only">Search the bakery</label>
4959
<input class="navigation__search-input" id="search-input" type="text" placeholder="Search" autocomplete="off" name="q">

0 commit comments

Comments
 (0)