From 1c06ae5580ef9675e7af29b971108151d6491730 Mon Sep 17 00:00:00 2001 From: Ludovic Fernandez Date: Thu, 11 Sep 2025 21:29:18 +0200 Subject: [PATCH] chore(scripts): generic way to build scripts (#829) * chore: move core scripts * chore: extract head scripts --- assets/js/{ => core}/back-to-top.js | 0 assets/js/{ => core}/banner.js | 0 assets/js/{ => core}/code-copy.js | 0 assets/js/{ => core}/favicon.js | 0 assets/js/{ => core}/filetree.js | 0 assets/js/{ => core}/lang.js | 0 assets/js/{ => core}/menu.js | 0 assets/js/{ => core}/nav-menu.js | 0 assets/js/{ => core}/sidebar.js | 0 assets/js/{ => core}/switcher-menu.js | 0 assets/js/{ => core}/tabs.js | 0 assets/js/{ => core}/theme.js | 0 assets/js/{ => core}/toc-scroll.js | 0 assets/js/head/banner.js | 6 +++++ assets/js/head/theme.js | 14 ++++++++++++ layouts/_partials/head.html | 33 ++++++++------------------- layouts/_partials/scripts/core.html | 19 ++++----------- 17 files changed, 34 insertions(+), 38 deletions(-) rename assets/js/{ => core}/back-to-top.js (100%) rename assets/js/{ => core}/banner.js (100%) rename assets/js/{ => core}/code-copy.js (100%) rename assets/js/{ => core}/favicon.js (100%) rename assets/js/{ => core}/filetree.js (100%) rename assets/js/{ => core}/lang.js (100%) rename assets/js/{ => core}/menu.js (100%) rename assets/js/{ => core}/nav-menu.js (100%) rename assets/js/{ => core}/sidebar.js (100%) rename assets/js/{ => core}/switcher-menu.js (100%) rename assets/js/{ => core}/tabs.js (100%) rename assets/js/{ => core}/theme.js (100%) rename assets/js/{ => core}/toc-scroll.js (100%) create mode 100644 assets/js/head/banner.js create mode 100644 assets/js/head/theme.js 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 -}}