aboutsummaryrefslogtreecommitdiff
path: root/www/assets
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-02-26 19:36:40 +0800
committerYuqian Yang <crupest@crupest.life>2025-02-26 19:36:40 +0800
commit311dfdcc6b5712dd6085287ada5ebe48e02116c4 (patch)
tree37053cfe69bc7a115d849f61223cf51dedb99e80 /www/assets
parent0c885ba1bf30ce8308880f926be85b6f5a499fa6 (diff)
downloadcrupest-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.css6
-rw-r--r--www/assets/color-scheme.ts86
-rw-r--r--www/assets/partials/preview/article.css2
-rw-r--r--www/assets/real-home.css2
-rw-r--r--www/assets/single.css6
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;
}
}