extends Node signal theme_changed(is_dark: bool) const Style := preload("res://scripts/ui/ui_style.gd") const SETTINGS_PATH := "user://settings.cfg" const SETTINGS_SECTION := "appearance" const SETTINGS_KEY := "color_scheme" var _is_dark := true func _enter_tree() -> void: _is_dark = _load_preference() Style.set_dark_mode(_is_dark) _sync_web_preference() func is_dark_mode() -> bool: return _is_dark func set_dark_mode(value: bool) -> void: if _is_dark == value: return _is_dark = value Style.set_dark_mode(_is_dark) _save_preference() _sync_web_preference() theme_changed.emit(_is_dark) func toggle_theme() -> void: set_dark_mode(not _is_dark) func _load_preference() -> bool: var config := ConfigFile.new() if config.load(SETTINGS_PATH) == OK: var saved := str(config.get_value(SETTINGS_SECTION, SETTINGS_KEY, "")) if saved == "dark" or saved == "light": return saved == "dark" return _system_prefers_dark() func _system_prefers_dark() -> bool: if OS.has_feature("web"): var result: Variant = JavaScriptBridge.eval( "window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches", true ) return bool(result) if DisplayServer.is_dark_mode_supported(): return DisplayServer.is_dark_mode() return true func _save_preference() -> void: var config := ConfigFile.new() config.load(SETTINGS_PATH) config.set_value(SETTINGS_SECTION, SETTINGS_KEY, "dark" if _is_dark else "light") if config.save(SETTINGS_PATH) != OK: push_warning("Unable to save color scheme preference.") func _sync_web_preference() -> void: if not OS.has_feature("web"): return JavaScriptBridge.eval( "try { window.localStorage.setItem('medmind-color-scheme', %s); } catch (error) { console.warn('Theme preference storage is unavailable.', error); }" % JSON.stringify( "dark" if _is_dark else "light" ), true )