Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zwbetz-gh/cupper-hugo-theme.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzwbetz-gh <zwbetz@gmail.com>2020-11-24 07:39:04 +0300
committerzwbetz-gh <zwbetz@gmail.com>2020-11-24 07:39:04 +0300
commit27dbcc6dd9354208c8a8eed963fb1b6bff32cbc3 (patch)
tree69c6ae05e043dd32769a7e821c0f0e6cf4678e42
parent9824fe3e2e0b54c7320df87effcfed1455989119 (diff)
prevent white flash on page load when dark theme is persisted
-rw-r--r--assets/js/template-dom-scripts.js73
-rw-r--r--layouts/_default/baseof.html1
-rw-r--r--layouts/partials/footer.html1
-rw-r--r--layouts/partials/head.html13
-rw-r--r--layouts/partials/noscript.html8
-rw-r--r--layouts/partials/script.html6
6 files changed, 68 insertions, 34 deletions
diff --git a/assets/js/template-dom-scripts.js b/assets/js/template-dom-scripts.js
index c0b97ea..70197e5 100644
--- a/assets/js/template-dom-scripts.js
+++ b/assets/js/template-dom-scripts.js
@@ -97,41 +97,64 @@
/* Switch and persist theme */
(function () {
- function CSSSupported (property, value) {
- var prop = property + ':',
- el = document.createElement('test'),
- mStyle = el.style;
- el.style.cssText = prop + value;
- return mStyle[property];
- }
-
var checkbox = document.getElementById('themer');
- var inverter = document.getElementById('inverter');
- if (!CSSSupported('filter', 'invert(100%)')) {
- checkbox.parentNode.hidden = true;
- return;
+ function persistTheme(val) {
+ localStorage.setItem('darkTheme', val);
}
- function darkTheme(media) {
- inverter.setAttribute('media', media);
- inverter.textContent = inverter.textContent.trim();
- localStorage.setItem('darkTheme', media);
+ function applyDarkTheme() {
+ var rules = [
+ '.intro-and-nav, .main-and-footer { filter: invert(100%); }',
+ '* { background-color: inherit; }',
+ 'img:not([src*=".svg"]), .colors, iframe, .demo-container { filter: invert(100%); }'
+ ];
+ rules.forEach(function(rule) {
+ document.styleSheets[0].insertRule(rule);
+ })
+ }
+
+ function clearDarkTheme() {
+ for (let i = 0; i < document.styleSheets[0].cssRules.length; i++) {
+ document.styleSheets[0].deleteRule(i);
+ }
}
checkbox.addEventListener('change', function () {
- darkTheme(this.checked ? 'screen' : 'none');
+ if (this.checked) {
+ applyDarkTheme();
+ persistTheme('true');
+ } else {
+ clearDarkTheme();
+ persistTheme('false');
+ }
});
- window.addEventListener('DOMContentLoaded', function () {
- if ('filter' in document.body.style) {
- if (localStorage.getItem('darkTheme') === 'screen') {
- checkbox.click();
- }
+ function handleDarkThemeAsDefault() {
+ {{ if .Site.Params.darkThemeAsDefault }}
+ persistTheme('true');
+ handleDarkThemeAsDefault = function() {};
+ {{ end }}
+ }
+
+ function showTheme() {
+ if (localStorage.getItem('darkTheme') === 'true') {
+ applyDarkTheme();
+ checkbox.checked = true;
}
+ }
+
+ function showContent() {
+ document.body.style.visibility = 'visible';
+ document.body.style.opacity = 1;
+ }
+
+ window.addEventListener('DOMContentLoaded', function () {
+ handleDarkThemeAsDefault();
+
+ showTheme();
+
+ showContent();
});
- {{ if .Site.Params.darkThemeAsDefault }}
- darkTheme('screen');
- {{ end }}
}());
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
index f2c41c3..d7fcd24 100644
--- a/layouts/_default/baseof.html
+++ b/layouts/_default/baseof.html
@@ -3,6 +3,7 @@
{{ partial "head.html" . }}
<body>
<a href="#main">{{ T "skip_to_content" }}</a>
+ {{ partial "noscript.html" . }}
{{ partial "svg.html" . }}
<div class="wrapper">
{{ partial "header.html" . }}
diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html
index 9334920..492ba39 100644
--- a/layouts/partials/footer.html
+++ b/layouts/partials/footer.html
@@ -2,6 +2,7 @@
<div>
<label for="themer">
{{ T "dark_theme" }} <input type="checkbox" id="themer" class="vh">
+ <!-- Shows "on" or "off" -->
<span aria-hidden="true"></span>
</label>
</div>
diff --git a/layouts/partials/head.html b/layouts/partials/head.html
index 490f21d..1569c8b 100644
--- a/layouts/partials/head.html
+++ b/layouts/partials/head.html
@@ -20,6 +20,13 @@
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="theme-color" content="#ffffff">
+ <style>
+ body {
+ visibility: hidden;
+ opacity: 0;
+ }
+ </style>
+
<link rel="stylesheet" href="{{ "css/prism.css" | absURL }}" media="none" onload="this.media='all';">
{{ $templateStyles := resources.Get "css/template-styles.css" }}
@@ -30,12 +37,6 @@
<link rel="stylesheet" href="{{ . | absURL }}">
{{ end }}
- <style id="inverter" media="none">
- .intro-and-nav, .main-and-footer { filter: invert(100%) }
- * { background-color: inherit }
- img:not([src*=".svg"]), .colors, iframe, .demo-container { filter: invert(100%) }
- </style>
-
{{ $title := print .Title " | " .Site.Title }}
{{ if .IsHome }}
{{ $title = .Site.Title }}
diff --git a/layouts/partials/noscript.html b/layouts/partials/noscript.html
new file mode 100644
index 0000000..40ae776
--- /dev/null
+++ b/layouts/partials/noscript.html
@@ -0,0 +1,8 @@
+<noscript>
+ <style>
+ body {
+ visibility: visible;
+ opacity: 1;
+ }
+ </style>
+</noscript>
diff --git a/layouts/partials/script.html b/layouts/partials/script.html
index 2946b25..0c1dd93 100644
--- a/layouts/partials/script.html
+++ b/layouts/partials/script.html
@@ -1,8 +1,8 @@
-<script src="{{ "js/prism.js" | absURL }}"></script>
-
{{ $templateDomScripts := resources.Get "js/template-dom-scripts.js" }}
{{ $domScripts := $templateDomScripts | resources.ExecuteAsTemplate "js/dom-scripts.js" . }}
-<script src="{{ $domScripts.Permalink }}"></script>
+<script src="{{ $domScripts.Permalink }}"></script>
+
+<script src="{{ "js/prism.js" | absURL }}"></script>
{{ if site.Params.search }}
{{ $searchJs := resources.Get "js/search.js" | fingerprint }}