diff --git a/assets/js/main.js b/assets/js/main.js
index f4a810a..dc302a1 100644
--- a/assets/js/main.js
+++ b/assets/js/main.js
@@ -1 +1,51 @@
-// Some code could be here ...
+/**
+ * Theming.
+ *
+ * Supports the preferred color scheme of the operation system as well as
+ * the theme choice of the user.
+ *
+ */
+const themeToggle = document.querySelector(".theme-toggle");
+const chosenTheme = window.localStorage && window.localStorage.getItem("theme");
+const chosenThemeIsDark = chosenTheme == "dark";
+const chosenThemeIsLight = chosenTheme == "light";
+
+// Detect the color scheme the operating system prefers.
+function detectOSColorTheme() {
+ if (chosenThemeIsDark) {
+ document.documentElement.setAttribute("data-theme", "dark");
+ } else if (chosenThemeIsLight) {
+ document.documentElement.setAttribute("data-theme", "light");
+ } else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
+ document.documentElement.setAttribute("data-theme", "dark");
+ } else {
+ document.documentElement.setAttribute("data-theme", "light");
+ }
+}
+
+// Switch the theme.
+function switchTheme(e) {
+ if (chosenThemeIsDark) {
+ localStorage.setItem("theme", "light");
+ } else {
+ localStorage.setItem("theme", "dark");
+ }
+
+ detectOSColorTheme();
+ window.location.reload();
+}
+
+// Event listener
+if (themeToggle) {
+ themeToggle.addEventListener("click", switchTheme, false);
+ window
+ .matchMedia("(prefers-color-scheme: dark)")
+ .addEventListener("change", (e) => e.matches && detectOSColorTheme());
+ window
+ .matchMedia("(prefers-color-scheme: light)")
+ .addEventListener("change", (e) => e.matches && detectOSColorTheme());
+
+ detectOSColorTheme();
+} else {
+ localStorage.removeItem("theme");
+}
diff --git a/assets/scss/_buttons.scss b/assets/scss/_buttons.scss
index 73e72a4..3e59e48 100644
--- a/assets/scss/_buttons.scss
+++ b/assets/scss/_buttons.scss
@@ -13,7 +13,6 @@ a.button {
justify-content: center;
padding: 8px 18px;
margin-bottom: 5px;
- background: $light-background-secondary;
text-decoration: none;
text-align: center;
font-weight: 500;
@@ -24,13 +23,25 @@ a.button {
outline: none;
@media (prefers-color-scheme: dark) {
- background: $dark-background-secondary;
+ background: $dark-background-header;
color: inherit;
}
+ @media (prefers-color-scheme: light) {
+ background: $light-background-header;
+ }
+
+ [data-theme=dark] & {
+ background: $dark-background-header;
+ color: inherit;
+ }
+
+ [data-theme=light] & {
+ background: $light-background-header;
+ }
+
&.outline {
background: transparent;
- border-color: $light-background-secondary;
box-shadow: none;
padding: 8px 18px;
@@ -38,6 +49,19 @@ a.button {
border-color: $dark-background-secondary;
color: inherit;
}
+
+ @media (prefers-color-scheme: light) {
+ border-color: $light-background-secondary;
+ }
+
+ [data-theme=dark] & {
+ border-color: $dark-background-secondary;
+ color: inherit;
+ }
+
+ [data-theme=light] & {
+ border-color: $light-background-secondary;
+ }
:hover {
transform: none;
@@ -78,7 +102,6 @@ a.button {
justify-content: center;
padding: 3px 8px;
margin-bottom: 5px;
- background: $light-background-secondary;
text-decoration: none;
text-align: center;
font-size: 13px;
@@ -93,5 +116,18 @@ a.button {
background: $dark-background-secondary;
color: inherit;
}
+
+ @media (prefers-color-scheme: light) {
+ background: $light-background-secondary;
+ }
+
+ [data-theme=dark] & {
+ background: $dark-background-secondary;
+ color: inherit;
+ }
+
+ [data-theme=light] & {
+ background: $light-background-secondary;
+ }
}
}
diff --git a/assets/scss/_header.scss b/assets/scss/_header.scss
index fe0af42..e3cdc16 100644
--- a/assets/scss/_header.scss
+++ b/assets/scss/_header.scss
@@ -1,5 +1,4 @@
.header {
- background: $light-background-header;
display: flex;
align-items: center;
justify-content: center;
@@ -10,6 +9,18 @@
background: $dark-background-header;
}
+ @media (prefers-color-scheme: light) {
+ background: $light-background-header;
+ }
+
+ [data-theme=dark] & {
+ background: $dark-background-header;
+ }
+
+ [data-theme=light] & {
+ background: $light-background-header;
+ }
+
&__right {
display: flex;
flex-direction: row;
@@ -42,7 +53,7 @@
fill: currentColor;
}
-.unselectable {
+.not-selectable {
user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
diff --git a/assets/scss/_list.scss b/assets/scss/_list.scss
index c77b0f9..7b45769 100644
--- a/assets/scss/_list.scss
+++ b/assets/scss/_list.scss
@@ -10,10 +10,20 @@
}
&:not(:last-of-type) {
- border-bottom: 1px solid $light-border-color;
-
@media (prefers-color-scheme: dark) {
- border-color: $dark-border-color;
+ border-bottom: 1px solid $dark-border-color;
+ }
+
+ @media (prefers-color-scheme: light) {
+ border-bottom: 1px solid $light-border-color;
+ }
+
+ [data-theme=dark] & {
+ border-bottom: 1px solid $dark-border-color;
+ }
+
+ [data-theme=light] & {
+ border-bottom: 1px solid $light-border-color;
}
}
diff --git a/assets/scss/_main.scss b/assets/scss/_main.scss
index e59a4d5..f771218 100644
--- a/assets/scss/_main.scss
+++ b/assets/scss/_main.scss
@@ -19,8 +19,6 @@ body {
font-display: auto;
font-size: 1rem;
line-height: 1.54;
- background-color: $light-background;
- color: $light-color;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
font-feature-settings: "liga", "tnum", "case", "calt", "zero", "ss01", "locl";
@@ -39,6 +37,21 @@ body {
background-color: $dark-background;
color: $dark-color;
}
+
+ @media (prefers-color-scheme: light) {
+ background-color: $light-background;
+ color: $light-color;
+ }
+
+ [data-theme=dark] & {
+ background-color: $dark-background;
+ color: $dark-color;
+ }
+
+ [data-theme=light] & {
+ background-color: $light-background;
+ color: $light-color;
+ }
}
h2,
@@ -173,18 +186,27 @@ figure {
}
em, i, strong {
- color: black;
-
@media (prefers-color-scheme: dark) {
color: white;
}
+
+ @media (prefers-color-scheme: light) {
+ color: black;
+ }
+
+ [data-theme=dark] & {
+ color: white;
+ }
+
+ [data-theme=light] & {
+ color: black;
+ }
}
code {
font-family: Consolas, Monaco, Andale Mono, Ubuntu Mono, monospace;
font-display: auto;
font-feature-settings: normal;
- background: $light-background-secondary;
padding: 1px 6px;
margin: 0 2px;
border-radius: 5px;
@@ -193,6 +215,18 @@ code {
@media (prefers-color-scheme: dark) {
background: $dark-background-secondary;
}
+
+ @media (prefers-color-scheme: light) {
+ background: $light-background-secondary;
+ }
+
+ [data-theme=dark] & {
+ background: $dark-background-secondary;
+ }
+
+ [data-theme=light] & {
+ background: $light-background-secondary;
+ }
}
pre {
@@ -209,7 +243,6 @@ pre {
code {
background: none !important;
- color: #ccc;
margin: 0;
padding: 0;
font-size: inherit;
@@ -217,6 +250,18 @@ pre {
@media (prefers-color-scheme: dark) {
color: inherit;
}
+
+ @media (prefers-color-scheme: light) {
+ color: #ccc;
+ }
+
+ [data-theme=dark] & {
+ color: inherit;
+ }
+
+ [data-theme=light] & {
+ color: #ccc;
+ }
}
}
@@ -287,12 +332,23 @@ ol ol {
hr {
width: 100%;
border: none;
- background: $light-border-color;
height: 1px;
@media (prefers-color-scheme: dark) {
background: $dark-border-color;
}
+
+ @media (prefers-color-scheme: light) {
+ background: $light-border-color;
+ }
+
+ [data-theme=dark] & {
+ background: $dark-border-color;
+ }
+
+ [data-theme=light] & {
+ background: $light-border-color;
+ }
}
.hidden {
diff --git a/assets/scss/_menu.scss b/assets/scss/_menu.scss
index 5fc75fb..77ecfde 100644
--- a/assets/scss/_menu.scss
+++ b/assets/scss/_menu.scss
@@ -1,11 +1,22 @@
.menu {
- background: $light-background-header;
z-index: 9999;
@media (prefers-color-scheme: dark) {
background: $dark-background-header;
}
+ @media (prefers-color-scheme: light) {
+ background: $light-background-header;
+ }
+
+ [data-theme=dark] & {
+ background: $dark-background-header;
+ }
+
+ [data-theme=light] & {
+ background: $light-background-header;
+ }
+
@media #{$media-size-phone} {
position: absolute;
top: 50px;
diff --git a/assets/scss/_single.scss b/assets/scss/_single.scss
index dd478a9..381d422 100644
--- a/assets/scss/_single.scss
+++ b/assets/scss/_single.scss
@@ -110,8 +110,6 @@
text-align: center;
margin: 0 auto;
padding: 5px 10px;
- background: $light-background;
- color: $light-color-secondary;
font-size: 0.8rem;
text-transform: uppercase;
text-decoration: none;
@@ -122,6 +120,21 @@
background: $dark-background;
color: $dark-color-secondary;
}
+
+ @media (prefers-color-scheme: light) {
+ background: $light-background;
+ color: $light-color-secondary;
+ }
+
+ [data-theme=dark] & {
+ background: $dark-background;
+ color: $dark-color-secondary;
+ }
+
+ [data-theme=light] & {
+ background: $light-background;
+ color: $light-color-secondary;
+ }
}
hr {
@@ -151,7 +164,6 @@
display: inline-flex;
align-items: center;
justify-content: center;
- background: $light-background-secondary;
font-size: 1rem;
font-weight: 600;
border-radius: 8px;
@@ -164,6 +176,18 @@
background: $dark-background-secondary;
}
+ @media (prefers-color-scheme: light) {
+ background: $light-background-secondary;
+ }
+
+ [data-theme=dark] & {
+ background: $dark-background-secondary;
+ }
+
+ [data-theme=light] & {
+ background: $light-background-secondary;
+ }
+
+ .button {
margin-left: 10px;
}
diff --git a/assets/scss/_tables.scss b/assets/scss/_tables.scss
index 986ee41..e0d58a2 100644
--- a/assets/scss/_tables.scss
+++ b/assets/scss/_tables.scss
@@ -9,33 +9,67 @@
th,
td {
padding: 12px 15px;
- border: 1px solid $light-table-color;
-
+
@media (prefers-color-scheme: dark) {
border: 1px solid $dark-table-color;
}
+
+ @media (prefers-color-scheme: light) {
+ border: 1px solid $light-table-color;
+ }
+
+ [data-theme=dark] & {
+ border: 1px solid $dark-table-color;
+ }
+
+ [data-theme=light] & {
+ border: 1px solid $light-table-color;
+ }
}
thead {
tr {
- background-color: $light-table-color;
- color: $light-color;
text-align: left;
@media (prefers-color-scheme: dark) {
background-color: $dark-table-color;
color: $dark-color;
}
+
+ @media (prefers-color-scheme: light) {
+ background-color: $light-table-color;
+ color: $light-color;
+ }
+
+ [data-theme=dark] & {
+ background-color: $dark-table-color;
+ color: $dark-color;
+ }
+
+ [data-theme=light] & {
+ background-color: $light-table-color;
+ color: $light-color;
+ }
}
}
tbody {
tr {
- border: 1px solid $light-table-color;
-
@media (prefers-color-scheme: dark) {
border: 1px solid $dark-table-color;
}
+
+ @media (prefers-color-scheme: light) {
+ border: 1px solid $light-table-color;
+ }
+
+ [data-theme=dark] & {
+ border: 1px solid $dark-table-color;
+ }
+
+ [data-theme=light] & {
+ border: 1px solid $light-table-color;
+ }
}
}
}
diff --git a/exampleSite/config.toml b/exampleSite/config.toml
index 46394ad..b7ac286 100644
--- a/exampleSite/config.toml
+++ b/exampleSite/config.toml
@@ -59,6 +59,8 @@ disableHugoGeneratorInject = false
keywords = ""
images = [""]
+ # Home subtitle of the index page.
+ #
homeSubtitle = "Hello Friend NG"
# Set a background for the homepage
@@ -72,6 +74,14 @@ disableHugoGeneratorInject = false
#
disableReadOtherPosts = false
+ # Enable theme toggle
+ #
+ # This options enables the theme toggle for the theme.
+ # Per default, this option is off.
+ # The theme is respecting the prefers-color-scheme of the operating systeme.
+ # With this option on, the page user is able to set the scheme he wants.
+ enableThemeToggle = false
+
# Sharing buttons
#
# There are a lot of buttons preconfigured. If you want to change them,
diff --git a/layouts/partials/header.html b/layouts/partials/header.html
index b77a7fb..46651d4 100644
--- a/layouts/partials/header.html
+++ b/layouts/partials/header.html
@@ -12,6 +12,10 @@
{{ end }}
+
+ {{- if .Site.Params.EnableThemeToggle }}
+ {{ partial "theme-toggle-icon.html" . }}
+ {{- end}}
diff --git a/layouts/partials/theme-toggle-icon.html b/layouts/partials/theme-toggle-icon.html
new file mode 100644
index 0000000..c61755b
--- /dev/null
+++ b/layouts/partials/theme-toggle-icon.html
@@ -0,0 +1,5 @@
+
\ No newline at end of file