61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
"""
|
|
Theme definitions with color gradients for terminal rendering.
|
|
|
|
This module is data-only and does not import config or render
|
|
to prevent circular dependencies.
|
|
"""
|
|
|
|
|
|
class Theme:
|
|
"""Represents a color theme with two gradients."""
|
|
|
|
def __init__(self, name, main_gradient, message_gradient):
|
|
"""Initialize a theme with name and color gradients.
|
|
|
|
Args:
|
|
name: Theme identifier string
|
|
main_gradient: List of 12 ANSI 256-color codes for main gradient
|
|
message_gradient: List of 12 ANSI 256-color codes for message gradient
|
|
"""
|
|
self.name = name
|
|
self.main_gradient = main_gradient
|
|
self.message_gradient = message_gradient
|
|
|
|
|
|
# ─── GRADIENT DEFINITIONS ─────────────────────────────────────────────────
|
|
# Each gradient is 12 ANSI 256-color codes in sequence
|
|
# Format: [light...] → [medium...] → [dark...] → [black]
|
|
|
|
_GREEN_MAIN = [231, 195, 123, 118, 82, 46, 40, 34, 28, 22, 22, 235]
|
|
_GREEN_MSG = [231, 225, 219, 213, 207, 201, 165, 161, 125, 89, 89, 235]
|
|
|
|
_ORANGE_MAIN = [231, 215, 209, 208, 202, 166, 130, 94, 58, 94, 94, 235]
|
|
_ORANGE_MSG = [231, 195, 33, 27, 21, 21, 21, 18, 18, 18, 18, 235]
|
|
|
|
_PURPLE_MAIN = [231, 225, 177, 171, 165, 135, 129, 93, 57, 57, 57, 235]
|
|
_PURPLE_MSG = [231, 226, 226, 220, 220, 184, 184, 178, 178, 172, 172, 235]
|
|
|
|
|
|
# ─── THEME REGISTRY ───────────────────────────────────────────────────────
|
|
|
|
THEME_REGISTRY = {
|
|
"green": Theme("green", _GREEN_MAIN, _GREEN_MSG),
|
|
"orange": Theme("orange", _ORANGE_MAIN, _ORANGE_MSG),
|
|
"purple": Theme("purple", _PURPLE_MAIN, _PURPLE_MSG),
|
|
}
|
|
|
|
|
|
def get_theme(theme_id):
|
|
"""Retrieve a theme by ID.
|
|
|
|
Args:
|
|
theme_id: Theme identifier string
|
|
|
|
Returns:
|
|
Theme object matching the ID
|
|
|
|
Raises:
|
|
KeyError: If theme_id is not in registry
|
|
"""
|
|
return THEME_REGISTRY[theme_id]
|