import React, { useEffect, useState } from "react";
import { Button } from "../Button";
export function ColorSchemeButton() {
const [currentScheme, changeColorScheme] = useColorScheme() as [string, () => void]
return : }
onClick={changeColorScheme}
/>
}
export function useColorScheme(): ["dark" | "light" | null, () => void] {
const [currentScheme, setCurrentScheme] = useState<"dark" | "light" | null>(null)
// TODO: context
useEffect(() => {
const updateScheme = () => {
const html = document.querySelector("html");
if (html) {
const scheme = html.getAttribute("data-color-scheme") || "os";
if (scheme === "os") {
const preferred = getPreferredColorScheme();
const finalScheme = preferred || "light";
setCurrentScheme(finalScheme);
updateColorSchemeInHead(finalScheme);
} else {
const finalScheme = scheme as "dark" | "light";
setCurrentScheme(finalScheme);
updateColorSchemeInHead(finalScheme);
}
}
};
updateScheme();
// Listen for changes to the color scheme
const observer = new MutationObserver(updateScheme);
const html = document.querySelector("html");
if (html) {
observer.observe(html, { attributes: true, attributeFilter: ['data-color-scheme'] });
}
return () => observer.disconnect();
}, []);
function changeColorScheme() {
let colorScheme = ""
const preferredColorScheme = getPreferredColorScheme()
if (preferredColorScheme) {
colorScheme = preferredColorScheme === "dark" ? "light" : "dark"
}
const html = document.querySelector("html");
if (!html) return;
const currentScheme = html.getAttribute("data-color-scheme");
if (currentScheme && currentScheme !== "os") {
colorScheme = currentScheme === "dark" ? "light" : "dark";
}
if (!colorScheme) {
colorScheme = "light"
}
html.setAttribute("data-color-scheme", colorScheme);
localStorage.setItem("xyd-color-scheme", colorScheme);
updateColorSchemeInHead(colorScheme as "dark" | "light");
}
return [currentScheme, changeColorScheme]
}
// Function to update color-scheme in document head
function updateColorSchemeInHead(scheme: "dark" | "light") {
let styleElement = document.querySelector('style[data-color-scheme-style]');
if (!styleElement) {
styleElement = document.createElement('style');
styleElement.setAttribute('data-color-scheme-style', 'true');
document.head.appendChild(styleElement);
}
styleElement.textContent = `:root { color-scheme: ${scheme}; }`;
}
function getPreferredColorScheme() {
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
return 'dark';
}
if (window.matchMedia('(prefers-color-scheme: light)').matches) {
return 'light';
}
return null
}
function IconLightMode() {
return
}
function IconDarkMode() {
return
}