fix(theme): solid per-theme hyprland borders, matching legacy
v1 forced an accent→accentAlt 45deg gradient on every theme's window
border; the legacy identity themes all used a *solid* border — accent for
nord/retro-82/lumon, the text tone for kanagawa/summer-day/summer-night.
Add a palette-resolved `border` field ({active, inactive}, each a palette
key or literal hex) to the theme schema with accent/overlay defaults in
theme.nix, consume it solid in hyprland.nix, and declare it in every
preset (and the live state). Declaring it everywhere is required because
`nomarchy-theme-sync apply` deep-merges presets — an omitted field would
stick across switches, like colors already are fully specified per theme.
All six identity themes resolve to their exact legacy active border
(verified: nord #81a1c1, retro-82 #faa968, lumon #f2fcff, kanagawa
#dcd7ba, summer-night #d3c6aa, summer-day #5c6a72). nix flake check passes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -262,7 +262,9 @@
|
|||||||
"Bash(NOMARCHY_PATH=__TRACKED_VAR__ python3 pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py --quiet apply summer-night --no-switch)",
|
"Bash(NOMARCHY_PATH=__TRACKED_VAR__ python3 pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py --quiet apply summer-night --no-switch)",
|
||||||
"Bash(NOMARCHY_PATH=__TRACKED_VAR__ python3 pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py --quiet apply summer-day --no-switch)",
|
"Bash(NOMARCHY_PATH=__TRACKED_VAR__ python3 pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py --quiet apply summer-day --no-switch)",
|
||||||
"Bash(xargs cat)",
|
"Bash(xargs cat)",
|
||||||
"Bash(nix-instantiate --parse modules/home/rofi.nix)"
|
"Bash(nix-instantiate --parse modules/home/rofi.nix)",
|
||||||
|
"Bash(nix-instantiate --parse modules/home/shell.nix)",
|
||||||
|
"Bash(command -v nix)"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
README.md
11
README.md
@@ -379,10 +379,13 @@ close · `SUPER+1..9` workspaces · `Print` region screenshot.
|
|||||||
- ✓ **Enable nix-ld by default:** `programs.nix-ld.enable` is on distro-wide
|
- ✓ **Enable nix-ld by default:** `programs.nix-ld.enable` is on distro-wide
|
||||||
(`modules/nixos/default.nix`), so prebuilt/foreign dynamically-linked
|
(`modules/nixos/default.nix`), so prebuilt/foreign dynamically-linked
|
||||||
binaries run out of the box.
|
binaries run out of the box.
|
||||||
- **Hyprland border colors off for some themes:** the active/inactive border
|
- ✓ **Hyprland border colors off for some themes:** the cause was v1
|
||||||
colors don't match the legacy branch for several themes — audit
|
forcing an `accent→accentAlt` gradient on every theme; legacy used a
|
||||||
`col.active_border`/`col.inactive_border` generation in
|
*solid* border (accent for nord/retro-82/lumon, the text tone for
|
||||||
`modules/home/hyprland.nix` against legacy.
|
kanagawa/summer-day/summer-night). Added a palette-resolved `border`
|
||||||
|
field (`{active, inactive}`) to the theme schema (`theme.nix`), consumed
|
||||||
|
solid in `hyprland.nix`, and declared it in every preset so a switch
|
||||||
|
always replaces it. All six identity themes now match legacy exactly.
|
||||||
- **Waybar shows non-existent workspaces:** in summer-night/summer-day the
|
- **Waybar shows non-existent workspaces:** in summer-night/summer-day the
|
||||||
bar renders every workspace icon up-front via `persistent-workspaces` /
|
bar renders every workspace icon up-front via `persistent-workspaces` /
|
||||||
`all-outputs` in `themes/summer-{day,night}/waybar.jsonc`. Restore the
|
`all-outputs` in `themes/summer-{day,night}/waybar.jsonc`. Restore the
|
||||||
|
|||||||
@@ -65,8 +65,10 @@ in
|
|||||||
gaps_in = t.ui.gapsIn;
|
gaps_in = t.ui.gapsIn;
|
||||||
gaps_out = t.ui.gapsOut;
|
gaps_out = t.ui.gapsOut;
|
||||||
border_size = t.ui.borderSize;
|
border_size = t.ui.borderSize;
|
||||||
"col.active_border" = "${rgb c.accent} ${rgb c.accentAlt} 45deg";
|
# Solid borders from theme.border (per-theme, palette-resolved) —
|
||||||
"col.inactive_border" = rgb c.overlay;
|
# matches the legacy identity themes, which never used a gradient.
|
||||||
|
"col.active_border" = rgb t.border.active;
|
||||||
|
"col.inactive_border" = rgb t.border.inactive;
|
||||||
layout = lib.mkDefault "dwindle";
|
layout = lib.mkDefault "dwindle";
|
||||||
resize_on_border = lib.mkDefault true;
|
resize_on_border = lib.mkDefault true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -47,10 +47,24 @@ let
|
|||||||
# Icon theme name; "" means "pick by mode" (resolved below). A preset
|
# Icon theme name; "" means "pick by mode" (resolved below). A preset
|
||||||
# or the state file can name any theme in the shipped icon package.
|
# or the state file can name any theme in the shipped icon package.
|
||||||
icons = "";
|
icons = "";
|
||||||
|
# Window border colors. Values are palette keys (resolved against
|
||||||
|
# `colors` below) or literal #rrggbb. Solid, not a gradient — every
|
||||||
|
# legacy identity theme used a solid border (accent for most, the text
|
||||||
|
# tone for kanagawa/summer-*). Each preset declares its own so a theme
|
||||||
|
# switch always replaces it (deep_merge would otherwise leave it stuck).
|
||||||
|
border = { active = "accent"; inactive = "overlay"; };
|
||||||
};
|
};
|
||||||
|
|
||||||
parsed = lib.recursiveUpdate defaults themeState;
|
parsed = lib.recursiveUpdate defaults themeState;
|
||||||
|
|
||||||
|
# A border value is a palette key (look it up in colors) unless it's
|
||||||
|
# already a literal hex; unknown keys fall through to the raw string.
|
||||||
|
resolveColor = v: if lib.hasPrefix "#" v then v else parsed.colors.${v} or v;
|
||||||
|
border = {
|
||||||
|
active = resolveColor parsed.border.active;
|
||||||
|
inactive = resolveColor parsed.border.inactive;
|
||||||
|
};
|
||||||
|
|
||||||
# Resolve the icon theme once and expose it on nomarchy.theme so both
|
# Resolve the icon theme once and expose it on nomarchy.theme so both
|
||||||
# the GTK side (stylix.nix) and rofi (rofi.nix) agree. The shipped
|
# the GTK side (stylix.nix) and rofi (rofi.nix) agree. The shipped
|
||||||
# package (papirus-icon-theme) carries the Dark/Light pair.
|
# package (papirus-icon-theme) carries the Dark/Light pair.
|
||||||
@@ -61,7 +75,7 @@ let
|
|||||||
in
|
in
|
||||||
{
|
{
|
||||||
config = {
|
config = {
|
||||||
nomarchy.theme = parsed // { inherit iconTheme; };
|
nomarchy.theme = parsed // { inherit iconTheme border; };
|
||||||
|
|
||||||
nomarchy.lib = {
|
nomarchy.lib = {
|
||||||
# "#7aa2f7" -> "rgb(7aa2f7)" (Hyprland color syntax)
|
# "#7aa2f7" -> "rgb(7aa2f7)" (Hyprland color syntax)
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#e0af68",
|
"warn": "#e0af68",
|
||||||
"bad": "#f7768e"
|
"bad": "#f7768e"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#32344a",
|
"#32344a",
|
||||||
"#f7768e",
|
"#f7768e",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#df8e1d",
|
"warn": "#df8e1d",
|
||||||
"bad": "#d20f39"
|
"bad": "#d20f39"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#bcc0cc",
|
"#bcc0cc",
|
||||||
"#d20f39",
|
"#d20f39",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#f9e2af",
|
"warn": "#f9e2af",
|
||||||
"bad": "#f38ba8"
|
"bad": "#f38ba8"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#45475a",
|
"#45475a",
|
||||||
"#f38ba8",
|
"#f38ba8",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#E9BB4F",
|
"warn": "#E9BB4F",
|
||||||
"bad": "#ED5B5A"
|
"bad": "#ED5B5A"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#060B1E",
|
"#060B1E",
|
||||||
"#ED5B5A",
|
"#ED5B5A",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#dbbc7f",
|
"warn": "#dbbc7f",
|
||||||
"bad": "#e67e80"
|
"bad": "#e67e80"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#475258",
|
"#475258",
|
||||||
"#e67e80",
|
"#e67e80",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#D0A215",
|
"warn": "#D0A215",
|
||||||
"bad": "#D14D41"
|
"bad": "#D14D41"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#100F0F",
|
"#100F0F",
|
||||||
"#D14D41",
|
"#D14D41",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#d8a657",
|
"warn": "#d8a657",
|
||||||
"bad": "#ea6962"
|
"bad": "#ea6962"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#3c3836",
|
"#3c3836",
|
||||||
"#ea6962",
|
"#ea6962",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#50f7d4",
|
"warn": "#50f7d4",
|
||||||
"bad": "#50f872"
|
"bad": "#50f872"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#0B0C16",
|
"#0B0C16",
|
||||||
"#50f872",
|
"#50f872",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#c0a36e",
|
"warn": "#c0a36e",
|
||||||
"bad": "#c34043"
|
"bad": "#c34043"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "text",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#090618",
|
"#090618",
|
||||||
"#c34043",
|
"#c34043",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#6fa4c9",
|
"warn": "#6fa4c9",
|
||||||
"bad": "#4d86b0"
|
"bad": "#4d86b0"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#1b2d40",
|
"#1b2d40",
|
||||||
"#4d86b0",
|
"#4d86b0",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#b91c1c",
|
"warn": "#b91c1c",
|
||||||
"bad": "#D35F5F"
|
"bad": "#D35F5F"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#333333",
|
"#333333",
|
||||||
"#D35F5F",
|
"#D35F5F",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#b36d43",
|
"warn": "#b36d43",
|
||||||
"bad": "#685742"
|
"bad": "#685742"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#000000",
|
"#000000",
|
||||||
"#685742",
|
"#685742",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#ebcb8b",
|
"warn": "#ebcb8b",
|
||||||
"bad": "#bf616a"
|
"bad": "#bf616a"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#3b4252",
|
"#3b4252",
|
||||||
"#bf616a",
|
"#bf616a",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#459451",
|
"warn": "#459451",
|
||||||
"bad": "#FF5345"
|
"bad": "#FF5345"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#23372B",
|
"#23372B",
|
||||||
"#FF5345",
|
"#FF5345",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#e97b3c",
|
"warn": "#e97b3c",
|
||||||
"bad": "#f85525"
|
"bad": "#f85525"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#00172e",
|
"#00172e",
|
||||||
"#f85525",
|
"#f85525",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#f9cc6c",
|
"warn": "#f9cc6c",
|
||||||
"bad": "#fd6883"
|
"bad": "#fd6883"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#72696a",
|
"#72696a",
|
||||||
"#fd6883",
|
"#fd6883",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#ea9d34",
|
"warn": "#ea9d34",
|
||||||
"bad": "#b4637a"
|
"bad": "#b4637a"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#f2e9e1",
|
"#f2e9e1",
|
||||||
"#b4637a",
|
"#b4637a",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#dfa000",
|
"warn": "#dfa000",
|
||||||
"bad": "#f85552"
|
"bad": "#f85552"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "text",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#5c6a72",
|
"#5c6a72",
|
||||||
"#f85552",
|
"#f85552",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#d9bb80",
|
"warn": "#d9bb80",
|
||||||
"bad": "#e68183"
|
"bad": "#e68183"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "text",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#3c474d",
|
"#3c474d",
|
||||||
"#e68183",
|
"#e68183",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#e0af68",
|
"warn": "#e0af68",
|
||||||
"bad": "#f7768e"
|
"bad": "#f7768e"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#32344a",
|
"#32344a",
|
||||||
"#f7768e",
|
"#f7768e",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#cecece",
|
"warn": "#cecece",
|
||||||
"bad": "#a4a4a4"
|
"bad": "#a4a4a4"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#0d0d0d",
|
"#0d0d0d",
|
||||||
"#a4a4a4",
|
"#a4a4a4",
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
"warn": "#4a4a4a",
|
"warn": "#4a4a4a",
|
||||||
"bad": "#2a2a2a"
|
"bad": "#2a2a2a"
|
||||||
},
|
},
|
||||||
|
"border": {
|
||||||
|
"active": "accent",
|
||||||
|
"inactive": "overlay"
|
||||||
|
},
|
||||||
"ansi": [
|
"ansi": [
|
||||||
"#ffffff",
|
"#ffffff",
|
||||||
"#2a2a2a",
|
"#2a2a2a",
|
||||||
|
|||||||
Reference in New Issue
Block a user