diff --git a/assets/js/theme.js b/assets/js/theme.js index 772d3ce..57da0d2 100644 --- a/assets/js/theme.js +++ b/assets/js/theme.js @@ -1,20 +1,26 @@ (() => { const root = document.documentElement; + const colorModes = ['auto', 'light', 'dark']; const storedTheme = localStorage.getItem('c1024-theme'); - if (storedTheme) root.dataset.theme = storedTheme; + let colorMode = colorModes.includes(storedTheme) ? storedTheme : 'auto'; + root.dataset.theme = colorMode; const themeToggle = document.querySelector('[data-theme-toggle]'); if (themeToggle) { - const updateThemeLabel = () => { - const dark = root.dataset.theme === 'dark'; - themeToggle.setAttribute('aria-pressed', String(dark)); - themeToggle.setAttribute('aria-label', dark ? 'Use light mode' : 'Use dark mode'); + const themeIcon = themeToggle.querySelector('[data-theme-icon]'); + const labels = { auto: 'Automatic', light: 'Light', dark: 'Dark' }; + const icons = { auto: '#icon-auto', light: '#icon-light', dark: '#icon-dark' }; + const updateThemeControl = () => { + const nextMode = colorModes[(colorModes.indexOf(colorMode) + 1) % colorModes.length]; + themeToggle.setAttribute('aria-label', `Color mode: ${labels[colorMode]}. Activate to use ${labels[nextMode]} mode.`); + themeIcon.setAttribute('href', icons[colorMode]); }; - updateThemeLabel(); + updateThemeControl(); themeToggle.addEventListener('click', () => { - root.dataset.theme = root.dataset.theme === 'dark' ? 'light' : 'dark'; - localStorage.setItem('c1024-theme', root.dataset.theme); - updateThemeLabel(); + colorMode = colorModes[(colorModes.indexOf(colorMode) + 1) % colorModes.length]; + root.dataset.theme = colorMode; + localStorage.setItem('c1024-theme', colorMode); + updateThemeControl(); }); } diff --git a/header.php b/header.php index 9b32135..2106ee5 100644 --- a/header.php +++ b/header.php @@ -22,9 +22,9 @@
- +
- + diff --git a/style.css b/style.css index 4aa4e90..5419ada 100644 --- a/style.css +++ b/style.css @@ -73,6 +73,22 @@ License URI: https://www.gnu.org/licenses/gpl-2.0.html --code-text: #f5eee5; --shadow: 0 10px 30px rgba(0, 0, 0, 0.25); } +@media (prefers-color-scheme: dark) { + :root:not([data-theme]), + :root[data-theme="auto"] { + color-scheme: dark; + --bg: #171615; + --surface: #22201e; + --text: #eee8e1; + --muted: #b9afa5; + --line: #4a4540; + --accent: #f07a3c; + --accent-hover: #ff9d6a; + --code-bg: #0e0e0d; + --code-text: #f5eee5; + --shadow: 0 10px 30px rgba(0, 0, 0, 0.25); + } +} * { box-sizing: border-box; } @@ -183,7 +199,7 @@ button { margin: 0.1rem 0 0; color: var(--muted); font-family: "Berkeley Mono", monospace; - font-size: 0.64rem; + font-size: 1rem; letter-spacing: 0.07em; } .primary-menu { @@ -194,7 +210,7 @@ button { padding: 0; list-style: none; font-family: "Berkeley Mono", monospace; - font-size: 0.7rem; + font-size: 1rem; letter-spacing: 0.04em; } .primary-menu a { @@ -742,6 +758,14 @@ h4 { .primary-menu > li.menu-item-has-children > a::after { vertical-align: -0.2em; } +body.admin-bar .site-header { + top: 32px; +} +@media (max-width: 782px) { + body.admin-bar .site-header { + top: 46px; + } +} @media (prefers-reduced-motion: reduce) { *, *::before,