Update package layout

This commit is contained in:
2026-03-16 23:36:38 -04:00
parent b345982ab1
commit 8fe121951b
24 changed files with 383 additions and 39 deletions

View File

@@ -0,0 +1,62 @@
import type { Theme, ThemeProviderProps, ThemeProviderState } from "$/types/ThemeTypes";
import { createContext, useContext, useEffect, useMemo, useState } from "react";
const themeInitialState: ThemeProviderState = {
theme: "system",
setTheme: () => null
}
const ThemeProviderContext = createContext<ThemeProviderState>(themeInitialState);
export default function ThemeProvider(props: Readonly<ThemeProviderProps>){
const {
children,
defaultTheme = "system",
storageKey = "mattrixwv-ui-theme"
} = props;
const [ theme, setTheme ] = useState<Theme>((localStorage.getItem(storageKey) as Theme) || defaultTheme);
useEffect(() => {
const root = globalThis.document.documentElement;
root.classList.remove("light", "dark");
if(theme === "system"){
const systemTheme = globalThis.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
root.classList.add(systemTheme);
}
else{
root.classList.add(theme);
}
}, [ theme ]);
const value: ThemeProviderState = useMemo(() => ({
theme,
setTheme: (theme: Theme) => {
localStorage.setItem(storageKey, theme);
setTheme(theme);
}
}), [storageKey, theme]);
return (
<ThemeProviderContext.Provider value={value}>
{children}
</ThemeProviderContext.Provider>
);
}
// eslint-disable-next-line react-refresh/only-export-components
export function useTheme(){
const context = useContext(ThemeProviderContext);
if(!context){
throw new Error("useTheme must be used within a ThemeProvider");
}
return context;
}