···
1
+
import { useFacet } from "@/lib/facet";
2
+
import type { Facet } from "@/lib/facet/src/facet";
3
+
import type { FacetPalette } from "@/lib/facet/src/palette";
import type { Enumify } from "@/lib/utils/types";
import type { Dispatch, ReactNode, SetStateAction } from "react";
import { createContext, useContext, useState } from "react";
···
interface ThemeContextValue {
setColorMode: Dispatch<SetStateAction<ColorMode>>;
19
+
currentPalette: FacetPalette;
const ThemeContext = createContext<ThemeContextValue | null>(null);
···
43
+
export const useCurrentPalette = () => {
44
+
const { currentPalette } = useThemeProvider();
45
+
return currentPalette;
export const ThemeProvider = ({ children }: { children: ReactNode }) => {
const [colorMode, setColorMode] = useState<ColorMode>(ColorMode.DARK);
50
+
const facet = useFacet();
51
+
const currentPalette =
52
+
colorMode === "dark"
53
+
? facet.variants.obsidian
54
+
: // TODO: temporary. will remove the null coalesce when pearl is defined.
55
+
(facet.variants.pearl ?? facet.variants.obsidian);
57
+
// TODO: remove nullability with obsidian and pearl palettes.
58
+
// instead, these are provided as defaults and if we add more themes
59
+
// in the future, they can just be tacked on.
60
+
if (!currentPalette) throw new Error("Don't use light mode for now.");
const value: ThemeContextValue = {
return <ThemeContext value={value}>{children}</ThemeContext>;