{"version":3,"file":"useTheme.mjs","sources":["../../../src/lib/hooks/useTheme.ts"],"sourcesContent":["/**\n * @file useTheme Hook\n * @description Hook for accessing and manipulating theme state\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useThemeContext } from '../theme/ThemeProvider';\n\n/**\n * Theme mode type\n */\ntype ThemeMode = 'light' | 'dark' | 'system';\n\n/**\n * Theme hook return type\n */\nexport interface UseThemeReturn {\n  /** Current theme mode */\n  theme: ThemeMode;\n\n  /** Whether dark mode is active */\n  isDark: boolean;\n\n  /** Whether light mode is active */\n  isLight: boolean;\n\n  /** Toggle between light and dark mode */\n  toggle: () => void;\n\n  /** Set specific theme mode */\n  setTheme: (mode: ThemeMode) => void;\n\n  /** Set to light mode */\n  setLight: () => void;\n\n  /** Set to dark mode */\n  setDark: () => void;\n\n  /** Set to system preference */\n  setSystem: () => void;\n\n  /** Get CSS variable value */\n  getCssVar: (name: string) => string;\n\n  /** Apply theme class to element */\n  applyThemeClass: (element: HTMLElement) => void;\n}\n\n/**\n * Hook for accessing and manipulating theme state\n */\nexport function useTheme(): UseThemeReturn {\n  const { theme, resolvedTheme, setTheme, toggleTheme } = useThemeContext();\n\n  const isDark = resolvedTheme === 'dark';\n  const isLight = resolvedTheme === 'light';\n\n  const setLight = useCallback(() => {\n    setTheme('light');\n  }, [setTheme]);\n\n  const setDark = useCallback(() => {\n    setTheme('dark');\n  }, [setTheme]);\n\n  const setSystem = useCallback(() => {\n    setTheme('system');\n  }, [setTheme]);\n\n  const getCssVar = useCallback((name: string): string => {\n    if (typeof window === 'undefined') return '';\n    return getComputedStyle(document.documentElement).getPropertyValue(`--${name}`).trim();\n  }, []);\n\n  const applyThemeClass = useCallback(\n    (element: HTMLElement) => {\n      element.classList.remove('theme-light', 'theme-dark');\n      element.classList.add(`theme-${resolvedTheme}`);\n    },\n    [resolvedTheme]\n  );\n\n  return useMemo(\n    () => ({\n      theme,\n      isDark,\n      isLight,\n      toggle: toggleTheme,\n      setTheme,\n      setLight,\n      setDark,\n      setSystem,\n      getCssVar,\n      applyThemeClass,\n    }),\n    [\n      theme,\n      isDark,\n      isLight,\n      toggleTheme,\n      setTheme,\n      setLight,\n      setDark,\n      setSystem,\n      getCssVar,\n      applyThemeClass,\n    ]\n  );\n}\n\n/**\n * Hook for watching system theme preference changes\n */\nexport function useSystemThemePreference(): {\n  prefersDark: boolean;\n  prefersLight: boolean;\n} {\n  const [prefersDark, setPrefersDark] = useState(false);\n\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n\n    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n    // Use microtask to avoid synchronous setState in effect\n    Promise.resolve()\n      .then(() => {\n        setPrefersDark(mediaQuery.matches);\n      })\n      .catch(() => {\n        // Ignore errors in cleanup\n      });\n\n    const handler = (e: MediaQueryListEvent): void => {\n      setPrefersDark(e.matches);\n    };\n\n    mediaQuery.addEventListener('change', handler);\n    return () => mediaQuery.removeEventListener('change', handler);\n  }, []);\n\n  return {\n    prefersDark,\n    prefersLight: !prefersDark,\n  };\n}\n"],"names":["useTheme","theme","resolvedTheme","setTheme","toggleTheme","useThemeContext","isDark","isLight","setLight","useCallback","setDark","setSystem","getCssVar","name","applyThemeClass","element","useMemo","useSystemThemePreference","prefersDark","setPrefersDark","useState","useEffect","mediaQuery","handler","e"],"mappings":";;AAmDO,SAASA,IAA2B;AACzC,QAAM,EAAE,OAAAC,GAAO,eAAAC,GAAe,UAAAC,GAAU,aAAAC,EAAA,IAAgBC,EAAA,GAElDC,IAASJ,MAAkB,QAC3BK,IAAUL,MAAkB,SAE5BM,IAAWC,EAAY,MAAM;AACjC,IAAAN,EAAS,OAAO;AAAA,EAClB,GAAG,CAACA,CAAQ,CAAC,GAEPO,IAAUD,EAAY,MAAM;AAChC,IAAAN,EAAS,MAAM;AAAA,EACjB,GAAG,CAACA,CAAQ,CAAC,GAEPQ,IAAYF,EAAY,MAAM;AAClC,IAAAN,EAAS,QAAQ;AAAA,EACnB,GAAG,CAACA,CAAQ,CAAC,GAEPS,IAAYH,EAAY,CAACI,MACzB,OAAO,SAAW,MAAoB,KACnC,iBAAiB,SAAS,eAAe,EAAE,iBAAiB,KAAKA,CAAI,EAAE,EAAE,KAAA,GAC/E,CAAA,CAAE,GAECC,IAAkBL;AAAA,IACtB,CAACM,MAAyB;AACxB,MAAAA,EAAQ,UAAU,OAAO,eAAe,YAAY,GACpDA,EAAQ,UAAU,IAAI,SAASb,CAAa,EAAE;AAAA,IAChD;AAAA,IACA,CAACA,CAAa;AAAA,EAAA;AAGhB,SAAOc;AAAA,IACL,OAAO;AAAA,MACL,OAAAf;AAAA,MACA,QAAAK;AAAA,MACA,SAAAC;AAAA,MACA,QAAQH;AAAA,MACR,UAAAD;AAAA,MACA,UAAAK;AAAA,MACA,SAAAE;AAAA,MACA,WAAAC;AAAA,MACA,WAAAC;AAAA,MACA,iBAAAE;AAAA,IAAA;AAAA,IAEF;AAAA,MACEb;AAAA,MACAK;AAAA,MACAC;AAAA,MACAH;AAAA,MACAD;AAAA,MACAK;AAAA,MACAE;AAAA,MACAC;AAAA,MACAC;AAAA,MACAE;AAAA,IAAA;AAAA,EACF;AAEJ;AAKO,SAASG,IAGd;AACA,QAAM,CAACC,GAAaC,CAAc,IAAIC,EAAS,EAAK;AAEpD,SAAAC,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AAEnC,UAAMC,IAAa,OAAO,WAAW,8BAA8B;AAEnE,YAAQ,UACL,KAAK,MAAM;AACV,MAAAH,EAAeG,EAAW,OAAO;AAAA,IACnC,CAAC,EACA,MAAM,MAAM;AAAA,IAEb,CAAC;AAEH,UAAMC,IAAU,CAACC,MAAiC;AAChD,MAAAL,EAAeK,EAAE,OAAO;AAAA,IAC1B;AAEA,WAAAF,EAAW,iBAAiB,UAAUC,CAAO,GACtC,MAAMD,EAAW,oBAAoB,UAAUC,CAAO;AAAA,EAC/D,GAAG,CAAA,CAAE,GAEE;AAAA,IACL,aAAAL;AAAA,IACA,cAAc,CAACA;AAAA,EAAA;AAEnB;"}