/** * @fileoverview Theme Selector Component for Rantii * @author retoor * @description UI for selecting application color themes * @keywords theme, selector, dark, light, appearance */ import { BaseComponent } from './base-component.js'; import { THEMES } from '../services/theme.js'; class ThemeSelector extends BaseComponent { init() { this.themeChangeHandler = () => this.render(); this.render(); this.bindEvents(); } render() { const currentTheme = this.getTheme()?.getTheme() || 'dark'; const themes = Object.entries(THEMES); this.setHtml(`
${themes.map(([key, theme]) => ` `).join('')}
`); } bindEvents() { this.on(this, 'click', this.handleClick); window.addEventListener('rantii:theme-change', this.themeChangeHandler); } onDisconnected() { window.removeEventListener('rantii:theme-change', this.themeChangeHandler); } handleClick(e) { const option = e.target.closest('.theme-option'); if (!option) return; const theme = option.dataset.theme; if (theme) { this.getTheme()?.setTheme(theme); this.render(); } } } customElements.define('theme-selector', ThemeSelector); export { ThemeSelector };