diff options
| author | Danilo M. <danix@danix.xyz> | 2026-09-19 16:42:07 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-09-19 16:42:07 +0200 |
| commit | a25905dfaeceff258b482007e8b6eb9f9a6d7063 (patch) | |
| tree | 0cd17519482c816a97e9a2e780fef1d3e0801942 /bin/udt-palette | |
| parent | 63fd47668a66ff546e330d22b64b7ce6e184a404 (diff) | |
| download | unified-desktop-theme-a25905dfaeceff258b482007e8b6eb9f9a6d7063.tar.gz unified-desktop-theme-a25905dfaeceff258b482007e8b6eb9f9a6d7063.zip | |
feat: theme hyprlock from the UDT palette and accent
udt-palette renders the scheme-level palette to
templates/hyprlock/hyprlock-palette.conf ($panel, $input_bg, $text,
$subtext, $fail); udt-accent writes the wallpaper accent gradient to
~/.cache/udt/hyprlock-border.conf as a hyprlang variable. The hyprlock
config sources both, so a scheme switch recolours the lock and a
wallpaper change recolours its border.
install.sh copies the palette and seeds the border from the committed
fallback on a fresh cache. Both selftests cover the new outputs.
Diffstat (limited to 'bin/udt-palette')
| -rwxr-xr-x | bin/udt-palette | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/bin/udt-palette b/bin/udt-palette index 9bd3838..fbe53e6 100755 --- a/bin/udt-palette +++ b/bin/udt-palette @@ -260,6 +260,39 @@ def gen_kitty(res, scheme, palette): return "\n".join(lines) + "\n" +def gen_hyprlock(res, scheme, palette): + """hyprlock: the lock screen's scheme-level palette, as hyprlang variables. + + Only the values that move with the scheme. The accent border is a separate + generated file, written by udt-accent, because it follows the wallpaper + rather than the scheme; hyprlock.conf sources both. + + The panel alpha is a design constant, not a role: it matches the drawer's + Qt.alpha(Theme.base, 0.72), so the lock panel and the drawer read as one + surface. + """ + def with_alpha(role, alpha): + r, g, b, _ = res[role] + return f"rgba({r},{g},{b},{alpha})" + + rows = [ + ("panel", with_alpha("bg", 0.72)), + ("input_bg", rgba(res["surface"])), + ("text", rgba(res["fg"])), + ("subtext", rgba(res["fg_dim"])), + ("fail", rgba(res["critical"])), + ] + body = "\n".join(f"${name} = {value}" for name, value in rows) + + return ( + f"# {BANNER.format(scheme=scheme)}\n" + "#\n" + "# hyprlock's static palette. The accent border is generated separately\n" + "# by udt-accent, at ~/.cache/udt/hyprlock-border.conf.\n" + f"{body}\n" + ) + + def gen_obsidian(res, scheme, palette): """Obsidian: a CSS snippet overriding the theme variables. @@ -659,6 +692,7 @@ TARGETS = [ ("rofi/udt/palette.rasi", gen_rofi, None), ("templates/waybar/theme.css", gen_waybar, None), ("templates/terminal/kitty-theme.conf", gen_kitty, None), + ("templates/hyprlock/hyprlock-palette.conf", gen_hyprlock, None), (str(CONKY_REPO / "conky.conf"), gen_conky, str(CONKY_REPO / "conky.conf.in")), ("bin/udt_colors.py", gen_accent_py, None), ("templates/homepage/custom.css", gen_homepage, None), @@ -782,6 +816,14 @@ def selftest(): assert not missing, f"{scheme} is missing roles: {sorted(missing)}" assert not extra, f"{scheme} has roles no other scheme has: {sorted(extra)}" + # The hyprlock palette must name every variable the lock config references. + # A missing one renders a literal `$var`, and hyprlock then falls back to a + # default colour with nothing to say so. + _, _, res, _ = load(None, scheme=names[0]) + lock = gen_hyprlock(res, names[0], None) + for var in ("panel", "input_bg", "text", "subtext", "fail"): + assert f"${var} = " in lock, f"hyprlock palette is missing ${var}" + # Every placeholder in the GTK templates must correspond to a role, or it # renders literally and GTK drops the declaration without an error. The # stylesheets are too large to eyeball, so this is the only thing standing |
