{"version":3,"file":"phroosta-theme-manager.mjs","sources":["../../../../projects/phroosta/theme-manager/src/lib/tokens/theme-config.token.ts","../../../../projects/phroosta/theme-manager/src/lib/services/theme.service.ts","../../../../projects/phroosta/theme-manager/src/lib/theme-manager.ts","../../../../projects/phroosta/theme-manager/src/public-api.ts","../../../../projects/phroosta/theme-manager/src/phroosta-theme-manager.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\r\nimport { ThemeManagerConfig } from \"../models/theme-config.interface\";\r\n\r\nexport const THEME_MANAGER_CONFIG = new InjectionToken<ThemeManagerConfig>(\r\n  'theme-manager.config'\r\n);","import { computed, DOCUMENT, effect, Inject, Injectable, Optional, signal } from '@angular/core';\r\nimport { Theme } from '../models/theme.interface';\r\nimport { ThemeManagerConfig } from '../models/theme-config.interface';\r\nimport { THEME_MANAGER_CONFIG } from '../tokens/theme-config.token';\r\n\r\n/**\r\n * Service for managing application themes\r\n * @example\r\n * ```typescript\r\n * const themeService = inject(ThemeService);\r\n * themeService.toggleDarkMode();\r\n * ```\r\n */\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n  private lastLightThemeId?: string;\r\n  private lastDarkThemeId?: string;\r\n  private initialized = false;\r\n\r\n  private mediaQueryListener?: (e: MediaQueryListEvent) => void;\r\n  private darkModeQuery?: MediaQueryList;\r\n\r\n  private currentThemeSignal = signal<Theme | null>(null);\r\n  private isDarkModeSignal = signal<boolean>(false);\r\n\r\n  readonly currentTheme = this.currentThemeSignal.asReadonly();\r\n  readonly isDarkMode = this.isDarkModeSignal.asReadonly();\r\n\r\n  readonly themeId = computed(() => this.currentTheme()?.id || 'default');\r\n  readonly themeName = computed(() => this.currentTheme()?.name || 'default');\r\n\r\n  private config: ThemeManagerConfig;\r\n  private availableThemes: Map<string, Theme> = new Map();\r\n\r\n  constructor(\r\n    @Inject(DOCUMENT) private document: Document,\r\n    @Optional() @Inject(THEME_MANAGER_CONFIG) config?: ThemeManagerConfig\r\n  ) {\r\n    // Default configuration\r\n    this.config = {\r\n      themes: [],\r\n      defaultTheme: 'light',\r\n      storageKey: 'selected-theme',\r\n      autoDetectPrefersDark: true,\r\n      enableLogging: false,\r\n      ...config\r\n    }\r\n\r\n    if (this.config.themes && this.config.themes.length > 0) {\r\n      this.initializeTheme();\r\n      this.setupEffect();\r\n    } else {\r\n      this.setupEffect();\r\n    }\r\n  }\r\n\r\n  private initializeTheme(): void {\r\n    if (this.initialized) return;\r\n    this.initialized = true;\r\n\r\n    this.config.themes.forEach(theme => {\r\n      this.availableThemes.set(theme.id, theme);\r\n    });\r\n    \r\n    const savedThemeId = this.getSavedThemeId();\r\n    \r\n    if (savedThemeId) {\r\n      const savedTheme = this.availableThemes.get(savedThemeId);\r\n      if (savedTheme) {\r\n        this.applyThemeWithTracking(savedTheme);\r\n        return;\r\n      }\r\n    }\r\n    \r\n    if (this.config.autoDetectPrefersDark) {\r\n      const systemTheme = this.getSystemPreferredTheme();\r\n      if (systemTheme) {\r\n        this.applySystemTheme(systemTheme);\r\n        this.setupSystemThemeListener();\r\n        return;\r\n      }\r\n    }\r\n    \r\n    const defaultTheme = \r\n      (this.config.defaultTheme && this.availableThemes.get(this.config.defaultTheme)) ||\r\n      this.config.themes[0];\r\n    \r\n    if (defaultTheme) {\r\n      this.applySystemTheme(defaultTheme);\r\n    }\r\n  }\r\n\r\n  private applyThemeWithTracking(theme: Theme): void {\r\n    if (theme.isDark) {\r\n      this.lastDarkThemeId = theme.id;\r\n    } else {\r\n      this.lastLightThemeId = theme.id;\r\n    }\r\n    \r\n    this.currentThemeSignal.set(theme);\r\n    this.isDarkModeSignal.set(theme.isDark);\r\n  }\r\n\r\n  private getSystemPreferredTheme(): Theme | undefined {\r\n    if (!window?.matchMedia) {\r\n      return undefined;\r\n    }\r\n    \r\n    const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n    return this.config.themes.find(theme => theme.isDark === prefersDark);\r\n  }\r\n\r\n  private setupSystemThemeListener(): void {\r\n    if (!window?.matchMedia) return;\r\n    \r\n    this.darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n    \r\n    this.mediaQueryListener = (e: MediaQueryListEvent) => {\r\n      if (!this.getSavedThemeId()) {\r\n        const newTheme = this.config.themes.find(\r\n          theme => theme.isDark === e.matches\r\n        );\r\n        if (newTheme) {\r\n          this.applySystemTheme(newTheme);\r\n        }\r\n      }\r\n    };\r\n    \r\n    this.darkModeQuery.addEventListener('change', this.mediaQueryListener);\r\n  }\r\n\r\n  private setupEffect(): void {\r\n    effect(() => {\r\n      const theme = this.currentTheme();\r\n      if (theme) {\r\n        this.applyThemeToDOM(theme);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Sets the active theme\r\n   * @param themeId - The unique identifier of the theme to apply\r\n   * @throws Will warn if theme ID is not found\r\n   * @example\r\n   * ```typescript\r\n   * themeService.setTheme('dark');\r\n   * ```\r\n   */\r\n  setTheme(themeId: string): void {\r\n    const theme = this.availableThemes.get(themeId);\r\n    if (!theme) {\r\n      console.warn(`Theme with id \"${themeId}\" not found`);\r\n      return;\r\n    }\r\n\r\n    if (theme.isDark) {\r\n      this.lastDarkThemeId = theme.id;\r\n    } else {\r\n      this.lastLightThemeId = theme.id;\r\n    }\r\n\r\n    this.currentThemeSignal.set(theme);\r\n    this.isDarkModeSignal.set(theme.isDark);\r\n    this.saveThemeId(themeId);\r\n    \r\n    if (this.config.enableLogging) {\r\n      console.log(`Theme changed to: ${theme.name} (user choice)`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Toggles between light and dark mode themes\r\n   * @remarks\r\n   * Will remember the last used theme for each mode\r\n   */\r\n  toggleDarkMode(): void {\r\n    const currentTheme = this.currentTheme();\r\n    if (!currentTheme) return;\r\n    \r\n    // Log per debug\r\n    if (this.config.enableLogging) {\r\n      console.log('Current theme:', currentTheme.id, 'isDark:', currentTheme.isDark);\r\n      console.log('Last light theme:', this.lastLightThemeId);\r\n      console.log('Last dark theme:', this.lastDarkThemeId);\r\n      console.log('Available themes:', Array.from(this.availableThemes.keys()));\r\n    }\r\n    \r\n    let targetThemeId: string | undefined;\r\n    \r\n    if (currentTheme.isDark) {\r\n      targetThemeId = this.lastLightThemeId || \r\n                      this.findDefaultThemeByMode(false)?.id;\r\n    } else {\r\n      targetThemeId = this.lastDarkThemeId || \r\n                      this.findDefaultThemeByMode(true)?.id;\r\n    }\r\n    \r\n    if (this.config.enableLogging) {\r\n      console.log('Target theme ID:', targetThemeId);\r\n    }\r\n    \r\n    if (targetThemeId) {\r\n      this.setTheme(targetThemeId);\r\n    } else {\r\n      console.warn('No theme found for mode:', currentTheme.isDark ? 'light' : 'dark');\r\n    }\r\n  }\r\n\r\n  private findDefaultThemeByMode(isDark: boolean): Theme | undefined {\r\n    return Array.from(this.availableThemes.values())\r\n      .find(theme => theme.isDark === isDark);\r\n  }\r\n\r\n  cycleTheme(): void {\r\n    const themes = this.getAvailableThemes();\r\n    const currentTheme = this.currentTheme();\r\n    \r\n    if (!currentTheme || themes.length === 0) return;\r\n    \r\n    const currentIndex = themes.findIndex(t => t.id === currentTheme.id);\r\n    const nextIndex = (currentIndex + 1) % themes.length;\r\n    \r\n    this.setTheme(themes[nextIndex].id);\r\n  }\r\n\r\n  private applyThemeToDOM(theme: Theme) {\r\n    const root = this.document.documentElement;\r\n\r\n    root.setAttribute('data-theme', theme.id);\r\n    root.setAttribute('data-theme-mode', theme.isDark ? 'dark' : 'light');\r\n\r\n    Object.entries(theme.colors).forEach(([key, value]) => {\r\n      root.style.setProperty(`--theme-${this.kebabCase(key)}`, String(value));\r\n    });\r\n\r\n    if (theme.typography) {\r\n      Object.entries(theme.typography).forEach(([key, value]) => {\r\n        root.style.setProperty(`--theme-${this.kebabCase(key)}`, String(value));\r\n      });\r\n    }\r\n\r\n    if (theme.spacing) {\r\n      Object.entries(theme.spacing).forEach(([key, value]) => {\r\n        root.style.setProperty(`--theme-spacing-${key}`, String(value));\r\n      });\r\n    }\r\n\r\n    if (theme.custom) {\r\n      Object.entries(theme.custom).forEach(([key, value]) => {\r\n        root.style.setProperty(`--theme-custom-${this.kebabCase(key)}`, String(value));\r\n      });\r\n    }\r\n  }\r\n\r\n  // Helper methods\r\n  private kebabCase(str: string): string {\r\n    return str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase();\r\n  }\r\n\r\n  private getSavedThemeId(): string | null {\r\n    if (typeof localStorage === 'undefined') {\r\n      return null;\r\n    }\r\n\r\n    return localStorage.getItem(this.config.storageKey!);\r\n  }\r\n\r\n  private saveThemeId(themeId: string): void {\r\n    if (typeof localStorage === 'undefined') {\r\n      return;\r\n    }\r\n\r\n    localStorage.setItem(this.config.storageKey!, themeId);\r\n  }\r\n\r\n  private applySystemTheme(theme: Theme): void {\r\n    if (theme.isDark) {\r\n      this.lastDarkThemeId = theme.id;\r\n    } else {\r\n      this.lastLightThemeId = theme.id;\r\n    }\r\n\r\n    this.currentThemeSignal.set(theme);\r\n    this.isDarkModeSignal.set(theme.isDark);\r\n\r\n    if (this.config.enableLogging) {\r\n      console.log(`Applied system-preferred theme: ${theme.name}`);\r\n    }\r\n  }\r\n\r\n  // Public API\r\n  getAvailableThemes(): Theme[] {\r\n    return Array.from(this.availableThemes.values());\r\n  }\r\n\r\n  getThemeById(id: string): Theme | undefined {\r\n    return this.availableThemes.get(id);\r\n  }\r\n\r\n  /**\r\n   * Registers a new theme dynamically\r\n   * @param theme - The theme configuration to register\r\n   * @example\r\n   * ```typescript\r\n   * const customTheme: Theme = {\r\n   *   id: 'custom',\r\n   *   name: 'Custom Theme',\r\n   *   isDark: false,\r\n   *   colors: { ... }\r\n   * };\r\n   * themeService.registerTheme(customTheme);\r\n   * ```\r\n   */\r\n  registerTheme(theme: Theme): void {\r\n    this.availableThemes.set(theme.id, theme);\r\n    \r\n    if (!this.initialized && this.availableThemes.size > 0) {\r\n      this.initializeTheme();\r\n    }\r\n    \r\n    if (this.config.enableLogging) {\r\n      console.log(`Theme registered: ${theme.name}`);\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    if (this.darkModeQuery && this.mediaQueryListener) {\r\n      this.darkModeQuery.removeEventListener('change', this.mediaQueryListener);\r\n    }\r\n  }\r\n\r\n  resetToSystemPreference(): void {\r\n    if (typeof localStorage !== 'undefined') {\r\n      localStorage.removeItem(this.config.storageKey!);\r\n    }\r\n    \r\n    const systemTheme = this.getSystemPreferredTheme();\r\n    if (systemTheme) {\r\n      this.applySystemTheme(systemTheme);\r\n      this.setupSystemThemeListener();\r\n    }\r\n  }\r\n\r\n  isUsingSystemPreference(): boolean {\r\n    return !this.getSavedThemeId() && this.config.autoDetectPrefersDark === true;\r\n  }\r\n}\r\n","import { Component, Provider } from '@angular/core';\r\nimport { ThemeManagerConfig } from './models/theme-config.interface';\r\nimport { ThemeService } from './services/theme.service';\r\nimport { THEME_MANAGER_CONFIG } from './tokens/theme-config.token';\r\n\r\n/**\r\n * Provides the Theme Manager service with configuration\r\n * \r\n * @example\r\n * ```typescript\r\n * bootstrapApplication(AppComponent, {\r\n *   providers: [\r\n *     provideThemeManager({\r\n *       themes: [lightTheme, darkTheme],\r\n *       defaultTheme: 'light'\r\n *     })\r\n *   ]\r\n * });\r\n * ```\r\n */\r\nexport function provideThemeManager(config?: ThemeManagerConfig): Provider[] {\r\n  return [\r\n    ThemeService,\r\n    {\r\n      provide: THEME_MANAGER_CONFIG,\r\n      useValue: config || null\r\n    }\r\n  ];\r\n}\r\n\r\nexport class ThemeManagerModule {\r\n  static forRoot(config?: ThemeManagerConfig): Provider[] {\r\n    return provideThemeManager(config);\r\n  }\r\n}\r\n","/*\r\n * Public API Surface of theme-manager\r\n */\r\n\r\n// Models\r\nexport * from './lib/models/theme.interface';\r\nexport * from './lib/models/theme-config.interface';\r\n\r\n// Services\r\nexport * from './lib/services/theme.service';\r\n\r\n// Tokens\r\nexport * from './lib/tokens/theme-config.token';\r\n\r\n// Main providers/module\r\nexport * from './lib/theme-manager';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}