63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
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 <name> or <name>:<flavor>:<accent>")
|
|
|
|
|
|
@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 <name> or <name>:<flavor>:<accent>"
|
|
),
|
|
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}")
|