commit d2a832f451f959e11edeaae83663e7ebde9377c9
parent fbcd2d8f065d3158d19dc1718b11e5223d592e65
Author: vx-clutch <[email protected]>
Date: Fri, 19 Dec 2025 16:06:53 -0500
add light-dark modes based on browser settings
Diffstat:
| M | core/builtin.lua | | | 261 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- |
1 file changed, 233 insertions(+), 28 deletions(-)
diff --git a/core/builtin.lua b/core/builtin.lua
@@ -31,64 +31,269 @@ function M.fes(header, footer)
{{FAVICON}}
<title>{{TITLE}}</title>
<style>
-html, body { min-height: 100%; margin: 0; padding: 0; background: #0f1113; color: #e6eef3; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.5; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
+:root {
+ --bg: #f5f5f5;
+ --text: #111827;
+ --muted: #6b7280;
+ --link: #1a0dab;
+ --accent: #68a6ff;
+ --highlight: #004d99;
+ --note-bg: #ffffff;
+ --panel-bg: #ffffff;
+ --border: rgba(0,0,0,.1);
+ --table-head: #f3f4f6;
+ --code-color: #004d99;
+ --blockquote-border: #1a73e8;
+ --banner-bg: #ffffff;
+ --footer-bg: #ffffff;
+ --shadow: rgba(0,0,0,.08);
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --bg: #0f1113;
+ --text: #e6eef3;
+ --muted: #9aa6b1;
+ --link: #68a6ff;
+ --accent: #68a6ff;
+ --highlight: #cde7ff;
+ --note-bg: #1a1c20;
+ --panel-bg: #1a1c20;
+ --border: rgba(255,255,255,.06);
+ --table-head: #1a1c20;
+ --code-color: #cde7ff;
+ --blockquote-border: #68a6ff;
+ --banner-bg: #1a1c20;
+ --footer-bg: #1a1c20;
+ --shadow: rgba(0,0,0,.4);
+ }
+}
+
+html, body {
+ min-height: 100%;
+ margin: 0;
+ padding: 0;
+ background: var(--bg);
+ color: var(--text);
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ line-height: 1.5;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
body { padding: 36px; }
+
.container { max-width: 830px; margin: 0 auto; }
+
.container > *:not(.banner) { margin: 28px 0; }
+
h1, h2, h3, h4, h5, h6 { font-weight: 600; margin: 0 0 12px 0; }
+
h1 { font-size: 40px; margin-bottom: 20px; font-weight: 700; }
+
h2 { font-size: 32px; margin: 26px 0 14px; }
+
h3 { font-size: 26px; margin: 22px 0 12px; }
+
h4 { font-size: 20px; margin: 18px 0 10px; }
+
h5 { font-size: 16px; margin: 16px 0 8px; }
-h6 { font-size: 14px; margin: 14px 0 6px; color: #9aa6b1; }
+
+h6 { font-size: 14px; margin: 14px 0 6px; color: var(--muted); }
+
p { margin: 14px 0; }
-a { color: #68a6ff; text-decoration: none; transition: color .15s ease, text-decoration-color .15s ease; }
-.hidden { color: #dfe9ee; text-decoration: none; }
+
+a { color: var(--link); text-decoration: none; transition: color .15s ease, text-decoration-color .15s ease; }
+
+.hidden { color: var(--text); text-decoration: none; }
+
a:hover { text-decoration: underline; }
+
summary { cursor: pointer; }
-details { background: #1a1c20; border: 1px solid rgba(255,255,255,.06); border-radius: 4px; padding: 14px 16px; margin: 16px 0; }
-details summary { list-style: none; font-weight: 600; color: #e6eef3; display: flex; align-items: center; }
+
+details {
+ background: var(--panel-bg);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ padding: 14px 16px;
+ margin: 16px 0;
+}
+
+details summary {
+ list-style: none;
+ font-weight: 600;
+ color: var(--text);
+ display: flex;
+ align-items: center;
+}
+
details summary::-webkit-details-marker { display: none; }
-details summary::before { content: "▸"; margin-right: 8px; transition: transform .15s ease; color: #68a6ff; }
+
+details summary::before {
+ content: "▸";
+ margin-right: 8px;
+ transition: transform .15s ease;
+ color: var(--accent);
+}
+
details[open] summary::before { transform: rotate(90deg); }
-summary::after { content: "Expand"; margin-left: auto; font-size: 13px; color: #9aa6b1; }
+
+summary::after { content: "Expand"; margin-left: auto; font-size: 13px; color: var(--muted); }
+
details[open] summary::after { content: "Collapse"; }
+
details > *:not(summary) { margin-top: 12px; }
-.note, pre, code { background: #1a1c20; border: 1px solid rgba(255,255,255,.06); }
-.note { padding: 20px; border-radius: 4px; background: #1a1c20; border: 1px solid rgba(255,255,255,.06); margin: 28px 0; color: #dfe9ee; }
-.note strong { color: #f0f6f8; }
-.muted { color: #9aa6b1; }
+
+.note, pre, code {
+ background: var(--note-bg);
+ border: 1px solid var(--border);
+}
+
+.note {
+ padding: 20px;
+ border-radius: 4px;
+ background: var(--note-bg);
+ border: 1px solid var(--border);
+ margin: 28px 0;
+ color: var(--text);
+}
+
+.note strong { color: var(--text); }
+
+.muted { color: var(--muted); }
+
.lead { font-size: 15px; margin-top: 8px; }
+
.callout { display: block; margin: 12px 0; }
-.small { font-size: 13px; color: #9aa6b1; margin-top: 6px; }
-.highlight { font-weight: 700; color: #cde7ff; }
+
+.small { font-size: 13px; color: var(--muted); margin-top: 6px; }
+
+.highlight { font-weight: 700; color: var(--highlight); }
+
ul, ol { margin: 14px 0; padding-left: 26px; }
-.tl { display: grid; grid-template-columns: repeat(auto-fill, 200px); gap: 15px; list-style-type: none; padding: 0; margin: 0; justify-content: start; }
+
+.tl {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, 200px);
+ gap: 15px;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ justify-content: start;
+}
+
ul.tl li { padding: 10px; width: fit-content; }
+
li { margin: 6px 0; }
-code { padding: 3px 7px; border-radius: 3px; font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; font-size: .9em; color: #cde7ff; }
-pre { padding: 20px; border-radius: 4px; margin: 14px 0; overflow-x: auto; font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; font-size: 14px; line-height: 1.6; }
+
+code {
+ padding: 3px 7px;
+ border-radius: 3px;
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace;
+ font-size: .9em;
+ color: var(--code-color);
+}
+
+pre {
+ padding: 20px;
+ border-radius: 4px;
+ margin: 14px 0;
+ overflow-x: auto;
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace;
+ font-size: 14px;
+ line-height: 1.6;
+}
+
pre code { background: none; border: none; padding: 0; font-size: inherit; }
-blockquote { border-left: 3px solid #68a6ff; padding-left: 18px; margin: 14px 0; color: #dfe9ee; font-style: italic; }
-hr { border: 0; border-top: 1px solid rgba(255,255,255,.1); margin: 26px 0; }
+
+blockquote {
+ border-left: 3px solid var(--blockquote-border);
+ padding-left: 18px;
+ margin: 14px 0;
+ color: var(--text);
+ font-style: italic;
+}
+
+hr { border: 0; border-top: 1px solid rgba(0,0,0,.08); margin: 26px 0; }
+
+@media (prefers-color-scheme: dark) {
+ hr { border-top-color: rgba(255,255,255,.1); }
+}
+
img { max-width: 100%; height: auto; border-radius: 4px; margin: 14px 0; }
+
table { width: 100%; border-collapse: collapse; margin: 14px 0; }
-th, td { padding: 12px 16px; text-align: left; border-bottom: 1px solid rgba(255,255,255,.06); }
-th { background: #1a1c20; font-weight: 600; color: #f0f6f8; }
-tr:hover { background: rgba(255,255,255,.02); }
-.divider { margin: 26px 0; height: 1px; background: rgba(255,255,255,.1); }
+
+th, td {
+ padding: 12px 16px;
+ text-align: left;
+ border-bottom: 1px solid var(--border);
+}
+
+th {
+ background: var(--table-head);
+ font-weight: 600;
+ color: var(--text);
+}
+
+tr:hover { background: rgba(0,0,0,0.02); }
+
+@media (prefers-color-scheme: dark) {
+ tr:hover { background: rgba(255,255,255,0.02); }
+}
+
+.divider { margin: 26px 0; height: 1px; background: rgba(0,0,0,.08); }
+
+@media (prefers-color-scheme: dark) {
+ .divider { background: rgba(255,255,255,.1); }
+}
+
.section { margin-top: 36px; }
+
.links { margin: 12px 0; }
-.links a { display: inline-block; margin: 0 14px 6px 0; }
-strong, b { font-weight: 600; color: #f0f6f8; }
+
+.links a { display: inline-block; margin: 0 14px 6px 0; color: var(--link); }
+
+strong, b { font-weight: 600; color: var(--text); }
+
em, i { font-style: italic; }
+
.center { display: flex; justify-content: center; align-items: center; }
-.banner { width: 100%; box-sizing: border-box; text-align: center; background: #1a1c20; padding: 20px; border: 1px solid rgba(255,255,255,.06); border-bottom-right-radius: 8px; border-bottom-left-radius: 8px; color: #e6eef3; margin: -36px 0 28px 0; box-shadow: 0 0.2em 0.6em rgba(0,0,0,.4); }
+
+.banner {
+ width: 100%;
+ box-sizing: border-box;
+ text-align: center;
+ background: var(--banner-bg);
+ padding: 20px;
+ border: 1px solid var(--border);
+ border-bottom-right-radius: 8px;
+ border-bottom-left-radius: 8px;
+ color: var(--text);
+ margin: -36px 0 28px 0;
+ box-shadow: 0 0.2em 0.6em var(--shadow);
+}
+
.nav { margin-left: auto; margin-right: auto; }
-.nav a { color: #cde7ff; }
-.footer { background: #1a1c20; padding: 20px 0; border-top: 1px solid rgba(255,255,255,.1); font-size: 14px; color: #d4dde3; display: flex; justify-content: center; align-items: center; gap: 24px; margin-top: 28px !important; margin-bottom: 0; }
+
+.nav a { color: var(--highlight); }
+
+.footer {
+ background: var(--footer-bg);
+ padding: 20px 0;
+ border-top: 1px solid rgba(0,0,0,.08);
+ font-size: 14px;
+ color: var(--muted);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 24px;
+ margin-top: 28px !important;
+ margin-bottom: 0;
+}
+
.left { text-align: left; float: left; }
+
.right { text-align: right; float: right; }
</style>
</head>