from __future__ import annotations import json import os from pathlib import Path import typer from zshell.utils.presets import build_palette, list_presets, load_preset_file app = typer.Typer() OUTPUT = Path(os.getenv("HOME", "")) / ".local/state/zshell/scheme.json" def _split_preset(value: str) -> tuple[str, str | None, str | None]: parts = value.split(":") if len(parts) == 1: return parts[0], None, None if len(parts) == 3: return parts[0], parts[1], parts[2] raise typer.BadParameter("Preset must be or ::") @app.command() def list(): for preset_name in list_presets(): data = load_preset_file(preset_name) flavors = [item["id"] for item in data["variants"]["flavors"]] accents = [item["id"] for item in data["variants"]["accents"]] for flavor in flavors: for accent in accents: typer.echo(f"{preset_name}:{flavor}:{accent}") @app.command() def set( preset: str = typer.Argument( ..., help="Preset in form or ::" ), mode: str = typer.Option("dark", help="Mode for preset colors."), ): name, flavor, accent = _split_preset(preset) data = load_preset_file(name) if flavor is None or accent is None: defaults = data["variants"]["defaults"][mode] flavor = defaults["flavor"] accent = defaults["accent"] palette = build_palette(data, flavor, accent, mode) out = { "name": palette.name, "flavor": f"{palette.flavor}:{palette.accent}", "mode": palette.mode, "variant": name, "colors": dict(palette.colors), "seed": int(palette.colors["primary"].lstrip("#"), 16), } OUTPUT.parent.mkdir(parents=True, exist_ok=True) OUTPUT.write_text(json.dumps(out, indent=4), encoding="utf-8") typer.echo(f"applied: {name}:{flavor}:{accent}")