diff --git a/engine/render.py b/engine/render.py index 1b76570..fb7bc5c 100644 --- a/engine/render.py +++ b/engine/render.py @@ -31,6 +31,22 @@ GRAD_COLS = [ "\033[2;38;5;235m", # near black ] +# Complementary sweep for queue messages (opposite hue family from ticker greens) +MSG_GRAD_COLS = [ + "\033[1;38;5;231m", # white + "\033[1;38;5;225m", # pale pink-white + "\033[38;5;219m", # bright pink + "\033[38;5;213m", # hot pink + "\033[38;5;207m", # magenta + "\033[38;5;201m", # bright magenta + "\033[38;5;165m", # orchid-red + "\033[38;5;161m", # ruby-magenta + "\033[38;5;125m", # dark magenta + "\033[38;5;89m", # deep maroon-magenta + "\033[2;38;5;89m", # dim deep maroon-magenta + "\033[2;38;5;235m", # near black +] + # ─── FONT LOADING ───────────────────────────────────────── _FONT_OBJ = None _FONT_CACHE = {} @@ -132,9 +148,10 @@ def big_wrap(text, max_w, fnt=None): return out -def lr_gradient(rows, offset=0.0): +def lr_gradient(rows, offset=0.0, grad_cols=None): """Color each non-space block character with a shifting left-to-right gradient.""" - n = len(GRAD_COLS) + cols = grad_cols or GRAD_COLS + n = len(cols) max_x = max((len(r.rstrip()) for r in rows if r.strip()), default=1) out = [] for row in rows: @@ -148,11 +165,16 @@ def lr_gradient(rows, offset=0.0): else: shifted = (x / max(max_x - 1, 1) + offset) % 1.0 idx = min(round(shifted * (n - 1)), n - 1) - buf.append(f"{GRAD_COLS[idx]}{ch}\033[0m") + buf.append(f"{cols[idx]}{ch}{RST}") out.append("".join(buf)) return out +def lr_gradient_opposite(rows, offset=0.0): + """Complementary (opposite wheel) gradient used for queue message panels.""" + return lr_gradient(rows, offset, MSG_GRAD_COLS) + + # ─── HEADLINE BLOCK ASSEMBLY ───────────────────────────── def make_block(title, src, ts, w): """Render a headline into a content block with color.""" diff --git a/engine/scroll.py b/engine/scroll.py index 54ae9ab..f9b7f39 100644 --- a/engine/scroll.py +++ b/engine/scroll.py @@ -11,7 +11,7 @@ from datetime import datetime from engine import config from engine.terminal import RST, W_COOL, CLR, tw, th -from engine.render import big_wrap, lr_gradient, make_block +from engine.render import big_wrap, lr_gradient, lr_gradient_opposite, make_block from engine.effects import noise, glitch_bar, fade_line, vis_trunc, next_headline, firehose_line @@ -77,7 +77,7 @@ def stream(items, ntfy_poller, mic_monitor): _msg_cache = (cache_key, msg_rows) else: msg_rows = _msg_cache[1] - msg_rows = lr_gradient(msg_rows, (time.monotonic() * config.GRAD_SPEED) % 1.0) + msg_rows = lr_gradient_opposite(msg_rows, (time.monotonic() * config.GRAD_SPEED) % 1.0) # Layout: rendered text + meta + border elapsed_s = int(time.monotonic() - m_ts) remaining = max(0, config.MESSAGE_DISPLAY_SECS - elapsed_s)