diff --git a/assets/js/back-to-top.js b/assets/js/core/back-to-top.js
similarity index 100%
rename from assets/js/back-to-top.js
rename to assets/js/core/back-to-top.js
diff --git a/assets/js/banner.js b/assets/js/core/banner.js
similarity index 100%
rename from assets/js/banner.js
rename to assets/js/core/banner.js
diff --git a/assets/js/code-copy.js b/assets/js/core/code-copy.js
similarity index 100%
rename from assets/js/code-copy.js
rename to assets/js/core/code-copy.js
diff --git a/assets/js/favicon.js b/assets/js/core/favicon.js
similarity index 100%
rename from assets/js/favicon.js
rename to assets/js/core/favicon.js
diff --git a/assets/js/filetree.js b/assets/js/core/filetree.js
similarity index 100%
rename from assets/js/filetree.js
rename to assets/js/core/filetree.js
diff --git a/assets/js/lang.js b/assets/js/core/lang.js
similarity index 100%
rename from assets/js/lang.js
rename to assets/js/core/lang.js
diff --git a/assets/js/menu.js b/assets/js/core/menu.js
similarity index 100%
rename from assets/js/menu.js
rename to assets/js/core/menu.js
diff --git a/assets/js/nav-menu.js b/assets/js/core/nav-menu.js
similarity index 100%
rename from assets/js/nav-menu.js
rename to assets/js/core/nav-menu.js
diff --git a/assets/js/sidebar.js b/assets/js/core/sidebar.js
similarity index 100%
rename from assets/js/sidebar.js
rename to assets/js/core/sidebar.js
diff --git a/assets/js/switcher-menu.js b/assets/js/core/switcher-menu.js
similarity index 100%
rename from assets/js/switcher-menu.js
rename to assets/js/core/switcher-menu.js
diff --git a/assets/js/tabs.js b/assets/js/core/tabs.js
similarity index 100%
rename from assets/js/tabs.js
rename to assets/js/core/tabs.js
diff --git a/assets/js/theme.js b/assets/js/core/theme.js
similarity index 100%
rename from assets/js/theme.js
rename to assets/js/core/theme.js
diff --git a/assets/js/toc-scroll.js b/assets/js/core/toc-scroll.js
similarity index 100%
rename from assets/js/toc-scroll.js
rename to assets/js/core/toc-scroll.js
diff --git a/assets/js/head/banner.js b/assets/js/head/banner.js
new file mode 100644
index 0000000..31282fd
--- /dev/null
+++ b/assets/js/head/banner.js
@@ -0,0 +1,6 @@
+// The section must not be in the banner.js (body) file because it can create a quick flash.
+
+if (localStorage.getItem('{{ site.Params.banner.key | default `banner-closed` }}')) {
+ document.documentElement.style.setProperty("--hextra-banner-height", "0px");
+ document.documentElement.classList.add("hextra-banner-hidden");
+}
diff --git a/assets/js/head/theme.js b/assets/js/head/theme.js
new file mode 100644
index 0000000..4c8cd36
--- /dev/null
+++ b/assets/js/head/theme.js
@@ -0,0 +1,14 @@
+// The section must not be in the theme.js (body) file because it can create a quick flash (switch between light and dark).
+
+function setTheme(theme) {
+ document.documentElement.classList.remove("light", "dark");
+
+ if (theme !== "light" && theme !== "dark") {
+ theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
+ }
+
+ document.documentElement.classList.add(theme);
+ document.documentElement.style.colorScheme = theme;
+}
+
+setTheme("color-theme" in localStorage ? localStorage.getItem("color-theme") : '{{ site.Params.theme.default | default `system`}}')
diff --git a/layouts/_partials/head.html b/layouts/_partials/head.html
index f9f688c..eb06bc5 100644
--- a/layouts/_partials/head.html
+++ b/layouts/_partials/head.html
@@ -55,32 +55,17 @@
{{ partial "components/analytics/analytics.html" . }}
-
-
-
+ {{- if hugo.IsProduction -}}
+ {{- $scripts = $scripts | minify | fingerprint -}}
+ {{- end -}}
+
{{ $noop := .WordCount -}}
diff --git a/layouts/_partials/scripts/core.html b/layouts/_partials/scripts/core.html
index e013b3b..c93c674 100644
--- a/layouts/_partials/scripts/core.html
+++ b/layouts/_partials/scripts/core.html
@@ -1,18 +1,9 @@
-{{- $jsSwitcherMenu := resources.Get "js/switcher-menu.js" -}}
-{{- $jsTheme := resources.Get "js/theme.js" | resources.ExecuteAsTemplate "theme.js" . -}}
-{{- $jsBanner := resources.Get "js/banner.js" | resources.ExecuteAsTemplate "banner.js" . -}}
-{{- $jsMenu := resources.Get "js/menu.js" -}}
-{{- $jsTabs := resources.Get "js/tabs.js" -}}
-{{- $jsLang := resources.Get "js/lang.js" -}}
-{{- $jsNavMenu := resources.Get "js/nav-menu.js" -}}
-{{- $jsCodeCopy := resources.Get "js/code-copy.js" -}}
-{{- $jsFileTree := resources.Get "js/filetree.js" -}}
-{{- $jsSidebar := resources.Get "js/sidebar.js" -}}
-{{- $jsBackToTop := resources.Get "js/back-to-top.js" -}}
-{{- $jsTocScroll := resources.Get "js/toc-scroll.js" -}}
-{{- $jsFavicon := resources.Get "js/favicon.js" | resources.ExecuteAsTemplate "favicon.js" . -}}
+{{- $scriptsBody := slice }}
+{{- range resources.Match "js/core/*.js" -}}
+ {{ $scriptsBody = $scriptsBody | append (resources.ExecuteAsTemplate .Name $ .) }}
+{{- end -}}
-{{- $scripts := slice $jsSwitcherMenu $jsTheme $jsBanner $jsMenu $jsCodeCopy $jsTabs $jsLang $jsNavMenu $jsFileTree $jsSidebar $jsBackToTop $jsTocScroll $jsFavicon | resources.Concat "js/main.js" -}}
+{{- $scripts := $scriptsBody | resources.Concat "js/main.js" -}}
{{- if hugo.IsProduction -}}
{{- $scripts = $scripts | minify | fingerprint -}}
{{- end -}}