- Add engine/effects/plugins/figment.py (native pipeline implementation) - Add engine/figment_render.py, engine/figment_trigger.py, engine/themes.py - Add 3 SVG assets in figments/ (Mexican/Aztec motif) - Add engine/display/backends/animation_report.py for debugging - Add engine/pipeline/adapters/frame_capture.py for frame capture - Add test-figment preset to presets.toml - Add cairosvg optional dependency to pyproject.toml - Update EffectPluginStage to support is_overlay attribute (for overlay effects) - Add comprehensive tests: test_figment_effect.py, test_figment_pipeline.py, test_figment_render.py - Remove obsolete test_ui_simple.py - Update TODO.md with test cleanup plan - Refactor test_adapters.py to use real components instead of mocks This completes the figment SVG overlay feature integration using the modern pipeline architecture, avoiding legacy effects_plugins. All tests pass (758 total).
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]
|