{"version":3,"file":"theme.mjs","sources":["../../src/lib/theme.tsx"],"sourcesContent":["import * as React from \"react\"\n\nexport interface ThemeCSSVars {\n  [key: string]: string\n}\n\nexport interface ThemeJSON {\n  light?: ThemeCSSVars\n  dark?: ThemeCSSVars\n}\n\nexport interface ThemeContextValue {\n  theme: ThemeJSON | null\n  setTheme: (theme: ThemeJSON) => void\n  mode: \"light\" | \"dark\"\n  setMode: (mode: \"light\" | \"dark\") => void\n}\n\nconst ThemeContext = React.createContext<ThemeContextValue | undefined>(\n  undefined\n)\n\nexport function useTheme() {\n  const context = React.useContext(ThemeContext)\n  if (context === undefined) {\n    throw new Error(\"useTheme must be used within a ThemeProvider\")\n  }\n  return context\n}\n\nfunction applyCSSVariables(vars: ThemeCSSVars, selector: string = \":root\") {\n  const root =\n    (document.querySelector(selector) as HTMLElement) ||\n    document.documentElement\n  Object.entries(vars).forEach(([key, value]) => {\n    root.style.setProperty(key, value)\n  })\n}\n\nfunction applyTheme(theme: ThemeJSON, mode: \"light\" | \"dark\") {\n  requestAnimationFrame(() => {\n    const vars = mode === \"dark\" ? theme.dark : theme.light\n    if (vars) {\n      applyCSSVariables(vars)\n    }\n\n    if (mode === \"dark\") {\n      document.documentElement.classList.add(\"dark\")\n    } else {\n      document.documentElement.classList.remove(\"dark\")\n    }\n  })\n}\n\nexport interface ThemeProviderProps {\n  theme?: ThemeJSON\n  defaultMode?: \"light\" | \"dark\"\n  children: React.ReactNode\n}\n\nexport const ThemeProvider = ({\n  theme: initialTheme,\n  defaultMode = \"light\",\n  children\n}: ThemeProviderProps) => {\n  const [theme, setThemeState] = React.useState<ThemeJSON | null>(\n    initialTheme || null\n  )\n  const [mode, setModeState] = React.useState<\"light\" | \"dark\">(defaultMode)\n\n  React.useEffect(() => {\n    if (theme) {\n      applyTheme(theme, mode)\n    }\n  }, [theme, mode])\n\n  const setTheme = React.useCallback(\n    (newTheme: ThemeJSON) => {\n      setThemeState(newTheme)\n      applyTheme(newTheme, mode)\n    },\n    [mode]\n  )\n\n  const setMode = React.useCallback(\n    (newMode: \"light\" | \"dark\") => {\n      setModeState(newMode)\n      if (theme) {\n        applyTheme(theme, newMode)\n      }\n    },\n    [theme]\n  )\n\n  const value = React.useMemo(\n    () => ({\n      theme,\n      setTheme,\n      mode,\n      setMode\n    }),\n    [theme, setTheme, mode, setMode]\n  )\n\n  return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n"],"names":["ThemeContext","React","useTheme","context","applyCSSVariables","vars","selector","root","key","value","applyTheme","theme","mode","ThemeProvider","initialTheme","defaultMode","children","setThemeState","setModeState","setTheme","newTheme","setMode","newMode","jsx"],"mappings":";;AAkBA,MAAMA,IAAeC,EAAM;AAAA,EACzB;AACF;AAEO,SAASC,IAAW;AACzB,QAAMC,IAAUF,EAAM,WAAWD,CAAY;AAC7C,MAAIG,MAAY;AACd,UAAM,IAAI,MAAM,8CAA8C;AAEhE,SAAOA;AACT;AAEA,SAASC,EAAkBC,GAAoBC,IAAmB,SAAS;AACzE,QAAMC,IACH,SAAS,cAAcD,CAAQ,KAChC,SAAS;AACX,SAAO,QAAQD,CAAI,EAAE,QAAQ,CAAC,CAACG,GAAKC,CAAK,MAAM;AAC7C,IAAAF,EAAK,MAAM,YAAYC,GAAKC,CAAK;AAAA,EACnC,CAAC;AACH;AAEA,SAASC,EAAWC,GAAkBC,GAAwB;AAC5D,wBAAsB,MAAM;AAC1B,UAAMP,IAAOO,MAAS,SAASD,EAAM,OAAOA,EAAM;AAClD,IAAIN,KACFD,EAAkBC,CAAI,GAGpBO,MAAS,SACX,SAAS,gBAAgB,UAAU,IAAI,MAAM,IAE7C,SAAS,gBAAgB,UAAU,OAAO,MAAM;AAAA,EAEpD,CAAC;AACH;AAQO,MAAMC,IAAgB,CAAC;AAAA,EAC5B,OAAOC;AAAA,EACP,aAAAC,IAAc;AAAA,EACd,UAAAC;AACF,MAA0B;AACxB,QAAM,CAACL,GAAOM,CAAa,IAAIhB,EAAM;AAAA,IACnCa,KAAgB;AAAA,EAAA,GAEZ,CAACF,GAAMM,CAAY,IAAIjB,EAAM,SAA2Bc,CAAW;AAEzE,EAAAd,EAAM,UAAU,MAAM;AACpB,IAAIU,KACFD,EAAWC,GAAOC,CAAI;AAAA,EAE1B,GAAG,CAACD,GAAOC,CAAI,CAAC;AAEhB,QAAMO,IAAWlB,EAAM;AAAA,IACrB,CAACmB,MAAwB;AACvB,MAAAH,EAAcG,CAAQ,GACtBV,EAAWU,GAAUR,CAAI;AAAA,IAC3B;AAAA,IACA,CAACA,CAAI;AAAA,EAAA,GAGDS,IAAUpB,EAAM;AAAA,IACpB,CAACqB,MAA8B;AAC7B,MAAAJ,EAAaI,CAAO,GAChBX,KACFD,EAAWC,GAAOW,CAAO;AAAA,IAE7B;AAAA,IACA,CAACX,CAAK;AAAA,EAAA,GAGFF,IAAQR,EAAM;AAAA,IAClB,OAAO;AAAA,MACL,OAAAU;AAAA,MACA,UAAAQ;AAAA,MACA,MAAAP;AAAA,MACA,SAAAS;AAAA,IAAA;AAAA,IAEF,CAACV,GAAOQ,GAAUP,GAAMS,CAAO;AAAA,EAAA;AAGjC,SAAO,gBAAAE,EAACvB,EAAa,UAAb,EAAsB,OAAAS,GAAe,UAAAO,EAAA,CAAS;AACxD;"}