diff --git a/config/i18n/locales/english/translations.json b/config/i18n/locales/english/translations.json
index 826f3ea6d..7b29d4bc4 100644
--- a/config/i18n/locales/english/translations.json
+++ b/config/i18n/locales/english/translations.json
@@ -2,7 +2,8 @@
"buttons": {
"forum": "Forum",
"donate": "Donate",
- "load-more-articles": "Load More Articles"
+ "load-more-articles": "Load More Articles",
+ "toggle-dark-mode": "Toggle Dark Mode"
},
"search": {
"label": "Search",
diff --git a/src/_includes/assets/css/global.css b/src/_includes/assets/css/global.css
index 465def02f..37300ad87 100644
--- a/src/_includes/assets/css/global.css
+++ b/src/_includes/assets/css/global.css
@@ -4,7 +4,6 @@
:root {
/* Colours */
--dark-blue: #002ead;
- --theme-color: #0a0a23;
--gray90: #0a0a23;
--gray85: #1b1b32;
--gray80: #2a2a40;
@@ -15,9 +14,32 @@
--gray05: #eeeef0;
--gray00: #fff;
--header-height: 38px;
- --blue-dark: #002ead;
}
+body {
+ --primary-color: var(--gray90);
+ --secondary-color: var(--gray85);
+ --tertiary-color: var(--gray80);
+ --quaternary-color: var(--gray75);
+ --quaternary-background: var(--gray15);
+ --tertiary-background: var(--gray10);
+ --secondary-background: var(--gray05);
+ --primary-background: var(--gray00);
+}
+
+body.dark-mode
+{
+ --primary-color: var(--gray00);
+ --secondary-color: var(--gray05);
+ --tertiary-color: var(--gray10);
+ --quaternary-color: var(--gray15);
+ --quaternary-background: var(--gray75);
+ --tertiary-background: var(--gray80);
+ --secondary-background: var(--gray85);
+ --primary-background: var(--gray90);
+}
+
+
/* Fonts
/*------------------------------------------------------------*/
/*@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700|Roboto+Mono:400,700");*/
@@ -295,7 +317,7 @@ body {
font-style: normal;
letter-spacing: 0;
text-rendering: optimizeLegibility;
- background: #fff;
+ background: var(--primary-background);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
diff --git a/src/_includes/assets/css/screen.css b/src/_includes/assets/css/screen.css
index 8401de3b6..a1f837eaf 100644
--- a/src/_includes/assets/css/screen.css
+++ b/src/_includes/assets/css/screen.css
@@ -34,7 +34,7 @@ on every page through _includes/layouts/default.njk
/* ---------------------------------------------------------- */
body {
- background: #fff;
+ background: var(--primary-background);
}
.img {
@@ -180,7 +180,7 @@ body {
font-family: Lato, sans-serif;
font-display: swap;
height: var(--header-height);
- background: var(--theme-color);
+ background: var(--gray90);
position: fixed;
z-index: 1000;
color: #fff;
@@ -263,7 +263,7 @@ a.nav-forum,
a.nav-forum:hover,
.nav li a:hover {
background: white;
- color: var(--theme-color);
+ color: var(--gray90);
text-decoration: none;
}
@@ -302,7 +302,7 @@ a.nav-forum {
background-color: #feac32;
background-image: linear-gradient(#fecc4c, #ffac33);
border: 3px solid #feac32;
- color: var(--theme-color);
+ color: var(--gray90);
}
.toggle-button-nav:hover,
@@ -312,7 +312,7 @@ a.nav-forum {
border-width: 3px;
border-color: #f1a02a;
background-image: none;
- color: var(--theme-color);
+ color: var(--gray90);
text-decoration: none;
}
@@ -378,7 +378,7 @@ a.nav-forum {
.rss-button svg {
margin-bottom: 1px;
height: 2.1rem;
- fill: #fff;
+ fill: var(--primary-background);
}
@media (max-width: 999px) {
@@ -442,7 +442,7 @@ a.nav-forum {
overflow: hidden;
margin: 0 20px 50px;
min-height: 100px;
- background: #fff center center;
+ background: var(--primary-background) center center;
background-size: cover;
}
@@ -474,7 +474,7 @@ a.nav-forum {
.post-card-tags a {
margin-bottom: 1.3rem;
- color: var(--gray75);
+ color: var(--quaternary-color);
font-size: 1.5rem;
line-height: 1.15em;
font-weight: 500;
@@ -583,7 +583,7 @@ a.nav-forum {
margin: 0 -5px;
width: 34px;
height: 34px;
- border: #fff 2px solid;
+ border: var(--primary-background) 2px solid;
}
.moving-avatar {
@@ -592,7 +592,7 @@ a.nav-forum {
margin: 0 -6px;
width: 56px;
height: 56px;
- border: #fff 2px solid;
+ border: var(--primary-background) 2px solid;
transition: all 0.5s cubic-bezier(0.4, 0.01, 0.165, 0.99) 0.7s;
}
@@ -614,7 +614,7 @@ a.nav-forum {
.reading-time {
flex-shrink: 0;
margin-left: 20px;
- color: var(--gray75);
+ color: var(--quaternary-color);
font-size: 1.2rem;
line-height: 20px;
font-weight: 500;
@@ -625,7 +625,7 @@ a.nav-forum {
.meta-item-single {
flex-shrink: 0;
- color: var(--gray75);
+ color: var(--quaternary-color);
font-size: 1.2rem;
line-height: 33px;
font-weight: 500;
@@ -722,7 +722,7 @@ make sure this only happens on large viewports / desktop-ish devices.
.post-template.site-main,
.page-template.site-main {
padding-bottom: 4vw;
- background: #fff;
+ background: var(--primary-background);
}
.post-full {
@@ -803,7 +803,7 @@ make sure this only happens on large viewports / desktop-ish devices.
font-display: swap;
font-size: 2.2rem;
line-height: 1.6em;
- background: #fff;
+ background: var(--primary-background);
}
/* Japanese font */
@@ -1954,8 +1954,8 @@ p:has(mjx-container.MathJax) {
/* ---------------------------------------------------------- */
.site-footer {
- color: var(--gray85);
- background: var(--gray05);
+ color: var(--secondary-color);
+ background: var(--secondary-background);
line-height: 1.6;
padding: 40px 15px;
font-size: 16px;
@@ -1985,7 +1985,7 @@ p:has(mjx-container.MathJax) {
}
.site-footer a {
- color: var(--gray85);
+ color: var(--secondary-color);
text-decoration: none;
padding: 2px;
}
@@ -2271,7 +2271,7 @@ a.cta-button {
a.banner {
position: fixed;
top: var(--header-height);
- background-color: var(--blue-dark);
+ background-color: var(--dark-blue);
align-items: center;
justify-content: center;
font-size: 14px;
diff --git a/src/_includes/assets/css/search-bar.css b/src/_includes/assets/css/search-bar.css
index 240ae920f..a124e40a0 100644
--- a/src/_includes/assets/css/search-bar.css
+++ b/src/_includes/assets/css/search-bar.css
@@ -205,7 +205,7 @@ a:active {
/* Show default colors if disabled */
.disabled:hover {
- background: #eeeef0;
+ background: var(--secondary-background);
color: #0a0a23;
}
diff --git a/src/_includes/assets/js/dark-mode.js b/src/_includes/assets/js/dark-mode.js
new file mode 100644
index 000000000..c30c4b285
--- /dev/null
+++ b/src/_includes/assets/js/dark-mode.js
@@ -0,0 +1,23 @@
+function loadDarkModePreference() {
+ const darkMode = localStorage.getItem('fcc-dark-mode');
+ if (darkMode === 'enabled' || window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ document.body.classList.add('dark-mode');
+ }
+}
+
+
+document.addEventListener("DOMContentLoaded", () =>
+{
+ loadDarkModePreference();
+ document.getElementById('toggle-dark-mode').addEventListener('click', function ()
+ {
+ document.body.classList.toggle('dark-mode');
+ if (document.body.classList.contains('dark-mode')) {
+ localStorage.setItem('fcc-dark-mode', 'enabled');
+ } else {
+ localStorage.setItem('fcc-dark-mode', 'disabled');
+ }
+ });
+}
+)
+
diff --git a/src/_includes/layouts/default.njk b/src/_includes/layouts/default.njk
index 8664284b7..83abb3a8c 100644
--- a/src/_includes/layouts/default.njk
+++ b/src/_includes/layouts/default.njk
@@ -48,6 +48,7 @@
{% include "assets/js/search-bar.js" %}
{% include "assets/js/client-dayjs.js" %}
{% include "assets/js/cookie-checker.js" %}
+ {% include "assets/js/dark-mode.js" %}
{% endset %}
diff --git a/src/_includes/partials/site-nav.njk b/src/_includes/partials/site-nav.njk
index bafbe7344..12b9e043d 100644
--- a/src/_includes/partials/site-nav.njk
+++ b/src/_includes/partials/site-nav.njk
@@ -23,6 +23,7 @@
target="_blank"
data-test-label="donate-button"
>{% t 'buttons.donate' %}
+