""" Theme, DPI, and shared styling constants. """ import sys # ── DPI awareness (call before any Tk/CTk window) ──────────────────────────── def setup_dpi(): if sys.platform == "win32": try: import ctypes ctypes.windll.shcore.SetProcessDpiAwareness(2) except Exception: try: import ctypes ctypes.windll.user32.SetProcessDPIAware() except Exception: pass def dpi_scale(widget) -> float: try: return max(1.0, widget.winfo_fpixels("1i") / 96.0) except Exception: return 1.0 # ── Color accents ───────────────────────────────────────────────────────────── # Each feature area has its own accent color scheme: (light_mode, dark_mode) ACCENT_BLUE = { "fg": ("#3B82F6", "#2563EB"), "hover": ("#2563EB", "#1D4ED8"), } ACCENT_PURPLE = { "fg": ("#EDE9FE", "#3B1F6E"), "text": ("#5B21B6", "#C4B5FD"), "hover": ("#DDD6FE", "#4C2889"), "preview": ("#7C3AED", "#A78BFA"), } ACCENT_GREEN = { "fg": ("#10B981", "#059669"), "hover": ("#059669", "#047857"), } ACCENT_AMBER = { "fg": ("#F59E0B", "#D97706"), "hover": ("#D97706", "#B45309"), } # Neutral button style BTN_NEUTRAL = { "fg_color": ("gray80", "gray25"), "text_color": ("gray10", "gray90"), "hover_color": ("gray70", "gray35"), } BTN_SIDE = { "fg_color": ("gray82", "gray22"), "text_color": ("gray10", "gray90"), "hover_color": ("gray72", "gray32"), }