{"version":3,"sources":["../../../src/hooks/useTheme.ts","../../../src/store/themeStore.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { useThemeStore, ThemeMode } from '../store/themeStore';\n\nexport type { ThemeMode };\n\n/**\n * Hook para gerenciar temas com suporte a alternância manual e detecção automática do sistema\n * Este hook permite alternar entre temas light, dark e automático baseado nas preferências do sistema\n * Utiliza Zustand para persistir o estado entre múltiplos arquivos e sessões\n */\nexport const useTheme = () => {\n  const {\n    themeMode,\n    isDark,\n    toggleTheme,\n    setTheme,\n    initializeTheme,\n    handleSystemThemeChange,\n  } = useThemeStore();\n\n  useEffect(() => {\n    // Initialize theme on first render\n    initializeTheme();\n\n    // Listener para mudanças nas preferências do sistema (apenas quando mode é 'system')\n    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n    mediaQuery.addEventListener('change', handleSystemThemeChange);\n\n    return () => {\n      mediaQuery.removeEventListener('change', handleSystemThemeChange);\n    };\n  }, [initializeTheme, handleSystemThemeChange]);\n\n  return {\n    themeMode,\n    isDark,\n    toggleTheme,\n    setTheme,\n  };\n};\n","import { create } from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\n/**\n * Theme store state interface\n */\nexport interface ThemeState {\n  /**\n   * Current theme mode\n   */\n  themeMode: ThemeMode;\n  /**\n   * Whether the current theme is dark\n   */\n  isDark: boolean;\n}\n\n/**\n * Theme store actions interface\n */\nexport interface ThemeActions {\n  /**\n   * Apply theme based on the mode selected\n   */\n  applyTheme: (mode: ThemeMode) => void;\n  /**\n   * Toggle between themes\n   */\n  toggleTheme: () => void;\n  /**\n   * Set a specific theme mode\n   */\n  setTheme: (mode: ThemeMode) => void;\n  /**\n   * Initialize theme on app start\n   */\n  initializeTheme: () => void;\n  /**\n   * Handle system theme change\n   */\n  handleSystemThemeChange: () => void;\n}\n\nexport type ThemeStore = ThemeState & ThemeActions;\n\n/**\n * Apply theme to DOM based on mode\n */\nconst applyThemeToDOM = (mode: ThemeMode): boolean => {\n  const htmlElement = document.documentElement;\n  const originalTheme = htmlElement.getAttribute('data-original-theme');\n\n  if (mode === 'dark') {\n    htmlElement.setAttribute('data-theme', 'dark');\n    return true;\n  } else if (mode === 'light') {\n    if (originalTheme) {\n      htmlElement.setAttribute('data-theme', originalTheme);\n    }\n    return false;\n  } else if (mode === 'system') {\n    const isSystemDark = window.matchMedia(\n      '(prefers-color-scheme: dark)'\n    ).matches;\n    if (isSystemDark) {\n      htmlElement.setAttribute('data-theme', 'dark');\n      return true;\n    } else if (originalTheme) {\n      htmlElement.setAttribute('data-theme', originalTheme);\n      return false;\n    }\n  }\n  return false;\n};\n\n/**\n * Save original theme from white label\n */\nconst saveOriginalTheme = () => {\n  const htmlElement = document.documentElement;\n  const currentTheme = htmlElement.getAttribute('data-theme');\n  if (currentTheme && !htmlElement.getAttribute('data-original-theme')) {\n    htmlElement.setAttribute('data-original-theme', currentTheme);\n  }\n};\n\n/**\n * Theme store using Zustand with persistence\n */\nexport const useThemeStore = create<ThemeStore>()(\n  devtools(\n    persist(\n      (set, get) => ({\n        // Initial state\n        themeMode: 'system',\n        isDark: false,\n\n        // Actions\n        applyTheme: (mode: ThemeMode) => {\n          const isDark = applyThemeToDOM(mode);\n          set({ isDark });\n        },\n\n        toggleTheme: () => {\n          const { themeMode, applyTheme } = get();\n          let newMode: ThemeMode;\n\n          if (themeMode === 'light') {\n            newMode = 'dark';\n          } else if (themeMode === 'dark') {\n            newMode = 'light';\n          } else {\n            // Se estiver em 'system', vai para 'dark'\n            newMode = 'dark';\n          }\n\n          set({ themeMode: newMode });\n          applyTheme(newMode);\n        },\n\n        setTheme: (mode: ThemeMode) => {\n          const { applyTheme } = get();\n          set({ themeMode: mode });\n          applyTheme(mode);\n        },\n\n        initializeTheme: () => {\n          const { themeMode, applyTheme } = get();\n\n          // Save original theme from white label\n          saveOriginalTheme();\n\n          // Apply the current theme mode\n          applyTheme(themeMode);\n        },\n\n        handleSystemThemeChange: () => {\n          const { themeMode, applyTheme } = get();\n          // Only respond to system changes when in system mode\n          if (themeMode === 'system') {\n            applyTheme('system');\n          }\n        },\n      }),\n      {\n        name: 'theme-store', // Nome da chave no localStorage\n        partialize: (state) => ({\n          themeMode: state.themeMode,\n        }), // Só persiste o themeMode, não o isDark\n      }\n    ),\n    {\n      name: 'theme-store',\n    }\n  )\n);\n"],"mappings":";AAAA,SAAS,iBAAiB;;;ACA1B,SAAS,cAAc;AACvB,SAAS,UAAU,eAAe;AAiDlC,IAAM,kBAAkB,CAAC,SAA6B;AACpD,QAAM,cAAc,SAAS;AAC7B,QAAM,gBAAgB,YAAY,aAAa,qBAAqB;AAEpE,MAAI,SAAS,QAAQ;AACnB,gBAAY,aAAa,cAAc,MAAM;AAC7C,WAAO;AAAA,EACT,WAAW,SAAS,SAAS;AAC3B,QAAI,eAAe;AACjB,kBAAY,aAAa,cAAc,aAAa;AAAA,IACtD;AACA,WAAO;AAAA,EACT,WAAW,SAAS,UAAU;AAC5B,UAAM,eAAe,OAAO;AAAA,MAC1B;AAAA,IACF,EAAE;AACF,QAAI,cAAc;AAChB,kBAAY,aAAa,cAAc,MAAM;AAC7C,aAAO;AAAA,IACT,WAAW,eAAe;AACxB,kBAAY,aAAa,cAAc,aAAa;AACpD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAKA,IAAM,oBAAoB,MAAM;AAC9B,QAAM,cAAc,SAAS;AAC7B,QAAM,eAAe,YAAY,aAAa,YAAY;AAC1D,MAAI,gBAAgB,CAAC,YAAY,aAAa,qBAAqB,GAAG;AACpE,gBAAY,aAAa,uBAAuB,YAAY;AAAA,EAC9D;AACF;AAKO,IAAM,gBAAgB,OAAmB;AAAA,EAC9C;AAAA,IACE;AAAA,MACE,CAAC,KAAK,SAAS;AAAA;AAAA,QAEb,WAAW;AAAA,QACX,QAAQ;AAAA;AAAA,QAGR,YAAY,CAAC,SAAoB;AAC/B,gBAAM,SAAS,gBAAgB,IAAI;AACnC,cAAI,EAAE,OAAO,CAAC;AAAA,QAChB;AAAA,QAEA,aAAa,MAAM;AACjB,gBAAM,EAAE,WAAW,WAAW,IAAI,IAAI;AACtC,cAAI;AAEJ,cAAI,cAAc,SAAS;AACzB,sBAAU;AAAA,UACZ,WAAW,cAAc,QAAQ;AAC/B,sBAAU;AAAA,UACZ,OAAO;AAEL,sBAAU;AAAA,UACZ;AAEA,cAAI,EAAE,WAAW,QAAQ,CAAC;AAC1B,qBAAW,OAAO;AAAA,QACpB;AAAA,QAEA,UAAU,CAAC,SAAoB;AAC7B,gBAAM,EAAE,WAAW,IAAI,IAAI;AAC3B,cAAI,EAAE,WAAW,KAAK,CAAC;AACvB,qBAAW,IAAI;AAAA,QACjB;AAAA,QAEA,iBAAiB,MAAM;AACrB,gBAAM,EAAE,WAAW,WAAW,IAAI,IAAI;AAGtC,4BAAkB;AAGlB,qBAAW,SAAS;AAAA,QACtB;AAAA,QAEA,yBAAyB,MAAM;AAC7B,gBAAM,EAAE,WAAW,WAAW,IAAI,IAAI;AAEtC,cAAI,cAAc,UAAU;AAC1B,uBAAW,QAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA;AAAA,QACN,YAAY,CAAC,WAAW;AAAA,UACtB,WAAW,MAAM;AAAA,QACnB;AAAA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;ADnJO,IAAM,WAAW,MAAM;AAC5B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,YAAU,MAAM;AAEd,oBAAgB;AAGhB,UAAM,aAAa,OAAO,WAAW,8BAA8B;AAEnE,eAAW,iBAAiB,UAAU,uBAAuB;AAE7D,WAAO,MAAM;AACX,iBAAW,oBAAoB,UAAU,uBAAuB;AAAA,IAClE;AAAA,EACF,GAAG,CAAC,iBAAiB,uBAAuB,CAAC;AAE7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}