diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-02-26 19:36:40 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-02-26 19:36:40 +0800 |
commit | 311dfdcc6b5712dd6085287ada5ebe48e02116c4 (patch) | |
tree | 37053cfe69bc7a115d849f61223cf51dedb99e80 /www/assets | |
parent | 0c885ba1bf30ce8308880f926be85b6f5a499fa6 (diff) | |
download | crupest-311dfdcc6b5712dd6085287ada5ebe48e02116c4.tar.gz crupest-311dfdcc6b5712dd6085287ada5ebe48e02116c4.tar.bz2 crupest-311dfdcc6b5712dd6085287ada5ebe48e02116c4.zip |
fix(www): css load blink, code block bg, links.
Diffstat (limited to 'www/assets')
-rw-r--r-- | www/assets/base-style.css | 6 | ||||
-rw-r--r-- | www/assets/color-scheme.ts | 86 | ||||
-rw-r--r-- | www/assets/partials/preview/article.css | 2 | ||||
-rw-r--r-- | www/assets/real-home.css | 2 | ||||
-rw-r--r-- | www/assets/single.css | 6 |
5 files changed, 62 insertions, 40 deletions
diff --git a/www/assets/base-style.css b/www/assets/base-style.css index 4ee87d6..4c5a730 100644 --- a/www/assets/base-style.css +++ b/www/assets/base-style.css @@ -1,5 +1,7 @@ html { width: 100%; + --fg-color: black; + --bg-color: white; } * { @@ -9,8 +11,6 @@ html { body { width: 100%; margin: 0; - --fg-color: black; - --bg-color: white; color: var(--fg-color); background-color: var(--bg-color); } @@ -88,7 +88,7 @@ nav { vertical-align: middle; } -body[data-theme="dark"] { +html[data-theme="dark"] { --fg-color: white; --bg-color: black; diff --git a/www/assets/color-scheme.ts b/www/assets/color-scheme.ts index 62a1b5c..db6a3aa 100644 --- a/www/assets/color-scheme.ts +++ b/www/assets/color-scheme.ts @@ -1,7 +1,3 @@ -const key = "color-scheme" - -type scheme = "dark" | "light" | null - function createResetTimer(cleanup: () => void, timeout = 1) { let tag = 0 return () => { @@ -12,10 +8,6 @@ function createResetTimer(cleanup: () => void, timeout = 1) { } } -let current = localStorage.getItem(key) as scheme - -let inited = false - function createToast(duration: number = 1): (text: string) => void { const toast = document.createElement("div") toast.className = "toast" @@ -33,40 +25,69 @@ function createToast(duration: number = 1): (text: string) => void { } } -const themeToast = createToast() +const setToast = createToast() + +const key = "force-color-scheme" +const dark = "dark" +const light = "light" +type Scheme = typeof dark | typeof light + +const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)") + +function fromMediaQuery(value: boolean | null): Scheme { + if (value == null) { value = mediaQuery.matches} + return value ? dark : light +} + +function opposite(scheme: Scheme): Scheme { + return scheme === dark ? light : dark +} + +function updateScheme(theme: Scheme | null): Scheme { + if (theme == null) { theme = fromMediaQuery(null) } + document.querySelector("html")!.dataset["theme"] = theme + return theme +} + +mediaQuery.addEventListener("change", (e) => updateScheme(current || fromMediaQuery(e.matches))) -function setTheme(value: scheme) { - let message = "" +let current: Scheme | null = null + +{ + const saved = localStorage.getItem(key) + if ([null, dark, light].includes(saved)) { + current = saved as never + } else { + console.log(`invalid saved theme: ${saved}`) + localStorage.removeItem(key) + } +} + +updateScheme(current) + +function saveScheme(value: Scheme | null) { current = value if (value == null) { - const prefersDarkScheme = window.matchMedia("(prefers-color-scheme: dark)").matches - value = prefersDarkScheme ? "dark" : "light" - message = `theme: system(${value})` localStorage.removeItem(key) } else { - message = `theme: force(${value})` localStorage.setItem(key, value) } - document.body.dataset["theme"] = value - - if (inited) { - themeToast(message) - } + const real = updateScheme(value) + setToast(`theme: ${current == null ? "system" : "force"}(${real})`) } -setTheme(current) -inited = true - -function next(scheme: scheme): scheme { - switch (scheme) { - case "dark": - return "light" - case "light": - return null - default: - return "dark" +function next(): Scheme | null { + const sys = fromMediaQuery(null) + if (current == null) { + return opposite(sys) + } else { + if (current === sys) { + return null; + } else { + return opposite(current) + } } } @@ -82,9 +103,8 @@ window.addEventListener("load", () => { reset() clicks += 1 if (clicks === 3) { - setTheme(next(current)) + saveScheme(next()) clicks = 0 } }) }) - diff --git a/www/assets/partials/preview/article.css b/www/assets/partials/preview/article.css index 6e93669..9629597 100644 --- a/www/assets/partials/preview/article.css +++ b/www/assets/partials/preview/article.css @@ -31,7 +31,7 @@ } } -body[data-theme="dark"] { +html[data-theme="dark"] { & .article-preview { background-color: hsl(0, 0%, 3%); diff --git a/www/assets/real-home.css b/www/assets/real-home.css index c1355b5..83c865b 100644 --- a/www/assets/real-home.css +++ b/www/assets/real-home.css @@ -54,7 +54,7 @@ text-align: right; } -body[data-theme="dark"] { +html[data-theme="dark"] { & .friend-github { filter: invert(1); } diff --git a/www/assets/single.css b/www/assets/single.css index 09a0e29..70325d1 100644 --- a/www/assets/single.css +++ b/www/assets/single.css @@ -1,10 +1,12 @@ .post-info { margin-block: 0; - font-size: 0.9em; + font-family: monospace; + font-size: 0.95em; display: flex; flex-wrap: wrap; + gap: 1em; - & > .created { + & > .words { margin-inline-end: auto; } } |