Compare commits

..

2 Commits

Author SHA1 Message Date
907d3123ea style(themes): brand the launcher mark and rework waybar icon sizing
All checks were successful
Check / eval (push) Successful in 3m11s
- Pin `font-family: Nomarchy` on #custom-nomarchy (boreal, executive-slate)
  so the branded mark at U+F000 wins over the Nerd Font's glass glyph at
  the same codepoint (summer bars already pinned it).
- Enlarge the icons on icon+text modules via a Pango span, with a gap so
  the glyph no longer crowds the value. The volume module gets a wider
  gap: its level glyph is unusually wide and overlapped the % otherwise.
- Bump icon-only status modules (caffeine, speedometer, …) to match, so
  they don't read smaller than their neighbours. The generated bar sizes
  everything relative to fonts.size (+2/+3pt) so it scales per theme.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 17:36:01 +01:00
ddf9b186e4 fix(rofi): resolve whole-swap launcher @import and page the app grid
The Apps launcher (`rofi -show drun -theme launcher`) imported
`custom.rasi` — the name HM gives *generated* themes — but a whole-swap
theme's base is deployed under its source basename (`rofi.rasi`), so the
import resolved against $HOME and rofi errored with "custom.rasi not
found" on every whole-swap theme. Make the default import track the
active base (rofi.rasi for whole-swaps, custom.rasi otherwise) and point
Boreal's own launcher.rasi at rofi.rasi.

Also give Boreal's app grid `flow: horizontal` so Down at a column's foot
pages to the next screen instead of jumping to the next column's top,
mirroring the theme-picker grid.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 17:36:01 +01:00
9 changed files with 95 additions and 51 deletions

View File

@@ -23,8 +23,9 @@ let
# Kept separate from the base theme so a theme can give the launcher its # Kept separate from the base theme so a theme can give the launcher its
# own layout (e.g. Boreal's icon grid) WITHOUT that layout leaking into # own layout (e.g. Boreal's icon grid) WITHOUT that layout leaking into
# the text menus, which share the base theme and need a list. The default # the text menus, which share the base theme and need a list. The default
# just re-imports the active theme (custom.rasi, written by HM to the same # just re-imports the active base theme (custom.rasi for generated themes,
# themes dir), so every other theme's launcher is byte-for-byte its list. # rofi.rasi for whole-swaps — see the dataFile below), so every other
# theme's launcher is byte-for-byte its list.
launcherOverride = cfg.themesDir + "/${t.slug}/launcher.rasi"; launcherOverride = cfg.themesDir + "/${t.slug}/launcher.rasi";
hasLauncherOverride = builtins.pathExists launcherOverride; hasLauncherOverride = builtins.pathExists launcherOverride;
@@ -855,13 +856,17 @@ in
''; '';
}; };
# The launcher theme lives beside HM's generated theme # The launcher theme lives beside HM's active base theme, which it
# (~/.local/share/rofi/themes/custom.rasi), so `@import "custom.rasi"` # @imports so the default launcher is byte-for-byte that theme's list.
# in the default resolves to the active theme. # HM names that base by its SOURCE: a generated (attrset) theme lands as
# custom.rasi, but a whole-swap theme (a path — themes/<slug>/rofi.rasi)
# keeps its basename, rofi.rasi. Import must match, or `-theme launcher`
# dies with "custom.rasi not found" (rofi resolves the missing import
# against $HOME) on every whole-swap theme.
xdg.dataFile."rofi/themes/launcher.rasi".text = xdg.dataFile."rofi/themes/launcher.rasi".text =
if hasLauncherOverride if hasLauncherOverride
then builtins.readFile launcherOverride then builtins.readFile launcherOverride
else ''@import "custom.rasi"''; else ''@import "${if hasRasiOverride then "rofi.rasi" else "custom.rasi"}"'';
programs.rofi = { programs.rofi = {
enable = true; enable = true;

View File

@@ -158,12 +158,12 @@ let
# Active keyboard layout (per focused device) — only placed in # Active keyboard layout (per focused device) — only placed in
# modules-right when showLanguage (see above). # modules-right when showLanguage (see above).
"hyprland/language" = { "hyprland/language" = {
format = "󰌌 {short}"; format = "<span size='${toString (t.fonts.size + 2)}pt'>󰌌</span> {short}";
tooltip = false; tooltip = false;
}; };
pulseaudio = { pulseaudio = {
format = "{icon} {volume}%"; format = "<span size='${toString (t.fonts.size + 2)}pt'>{icon}</span> {volume}%";
format-muted = "󰝟"; format-muted = "󰝟";
format-icons.default = [ "󰕿" "󰖀" "󰕾" ]; format-icons.default = [ "󰕿" "󰖀" "󰕾" ];
on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
@@ -187,8 +187,8 @@ let
battery = { battery = {
states = { warning = 25; critical = 10; }; states = { warning = 25; critical = 10; };
format = "{icon} {capacity}%"; format = "<span size='${toString (t.fonts.size + 2)}pt'>{icon}</span> {capacity}%";
format-charging = "󰂄 {capacity}%"; format-charging = "<span size='${toString (t.fonts.size + 2)}pt'>󰂄</span> {capacity}%";
format-icons = [ "󰁺" "󰁼" "󰁾" "󰂀" "󰁹" ]; format-icons = [ "󰁺" "󰁼" "󰁾" "󰂀" "󰁹" ];
}; };
@@ -361,9 +361,15 @@ let
always the alert color. */ always the alert color. */
#custom-doctor { color: @bad; } #custom-doctor { color: @bad; }
/* The power-profile speedometer glyph renders small in its em box /* Icon-only status modules carry no text, so they don't get the
size it up so it reads at a glance like the other indicators. */ (size+2)pt Pango icon span the icon+text modules use bump their
#custom-powerprofile { font-size: ${toString (t.fonts.size + 3)}pt; } font-size to match, or these glyphs read smaller than the volume /
battery / language icons beside them. */
#custom-recording, #custom-updates, #custom-vpn, #custom-nightlight, #custom-doctor, #custom-notification { font-size: ${toString (t.fonts.size + 2)}pt; }
/* The speedometer + caffeine glyphs render small in their em box
size them up a touch more so they read at a glance. */
#custom-powerprofile, #idle_inhibitor { font-size: ${toString (t.fonts.size + 3)}pt; }
/* notifications waiting accent; Do-Not-Disturb muted bell-off */ /* notifications waiting accent; Do-Not-Disturb muted bell-off */
#custom-notification.notification { color: @accent; } #custom-notification.notification { color: @accent; }

View File

@@ -2,12 +2,13 @@
* Boreal — app-launcher override (themes/<slug>/launcher.rasi). * Boreal — app-launcher override (themes/<slug>/launcher.rasi).
* Installed to ~/.local/share/rofi/themes/launcher.rasi and used only by * Installed to ~/.local/share/rofi/themes/launcher.rasi and used only by
* `rofi -show drun` (the SUPER+Space / SUPER+D launcher). It inherits the * `rofi -show drun` (the SUPER+Space / SUPER+D launcher). It inherits the
* frosted aurora panel from the sibling custom.rasi (the active theme), * frosted aurora panel from the sibling rofi.rasi (this whole-swap theme,
* which HM deploys under its source basename — rofi.rasi — not custom.rasi),
* then reshapes the list into a 4×3 grid of large application icons. * then reshapes the list into a 4×3 grid of large application icons.
* Text menus keep the list — they don't use this theme. * Text menus keep the list — they don't use this theme.
*/ */
@import "custom.rasi" @import "rofi.rasi"
window { width: 780px; } window { width: 780px; }
@@ -17,6 +18,10 @@ listview {
fixed-columns: true; fixed-columns: true;
spacing: 10px; spacing: 10px;
padding: 6px 0px 0px 0px; padding: 6px 0px 0px 0px;
/* Fill row-by-row so Down at a column's foot pages to the next screen
instead of jumping to the top of the next column (rofi's default
Vertical flow). Mirrors the theme-picker grid in rofi.nix. */
flow: horizontal;
} }
element { element {

View File

@@ -74,10 +74,13 @@ window#waybar {
margin: 0; margin: 0;
} }
/* ── Launcher — the aurora-violet monogram opens the pill ─────────────*/ /* ── Launcher — the aurora-violet Nomarchy mark opens the pill ────────
The mark lives at U+F000 in the dedicated "Nomarchy" font; pin the
family or the Nerd Font's glass glyph at the same codepoint wins. */
#custom-nomarchy { #custom-nomarchy {
color: @accent; color: @accent;
font-size: 16px; font-family: Nomarchy;
font-size: 18px;
padding: 0 12px 0 14px; padding: 0 12px 0 14px;
} }
#custom-nomarchy:hover { color: @accentAlt; } #custom-nomarchy:hover { color: @accentAlt; }
@@ -126,8 +129,19 @@ window#waybar {
#battery.warning:not(.charging) { color: @warn; } #battery.warning:not(.charging) { color: @warn; }
#battery.critical:not(.charging) { color: @bad; } #battery.critical:not(.charging) { color: @bad; }
/* Power-profile speedometer renders small in its em box — size it up. */ /* Icon-only status modules carry no text, so they don't get the 13pt
#custom-powerprofile { font-size: 16px; } Pango icon span the icon+text modules (volume/battery/language) use —
bump their font-size to match, or these glyphs read noticeably smaller
than their neighbours. */
#custom-recording,
#custom-updates,
#custom-doctor,
#custom-nightlight,
#custom-vpn,
#custom-notification { font-size: 17px; }
/* Speedometer + caffeine cup render small in their em box — a touch more. */
#custom-powerprofile,
#idle_inhibitor { font-size: 18px; }
#custom-notification.notification { color: @accent; } #custom-notification.notification { color: @accent; }
#custom-notification.dnd-none, #custom-notification.dnd-none,

View File

@@ -87,7 +87,7 @@
"on-click": "nomarchy-nightlight toggle" "on-click": "nomarchy-nightlight toggle"
}, },
"hyprland/language": { "hyprland/language": {
"format": "󰌌 {short}", "format": "<span size='13pt'>󰌌</span> {short}",
"tooltip": false "tooltip": false
}, },
"custom/vpn": { "custom/vpn": {
@@ -98,10 +98,10 @@
}, },
"pulseaudio": { "pulseaudio": {
"scroll-step": 5, "scroll-step": 5,
"format": "{icon} {volume}%", "format": "<span size='13pt'>{icon}</span> {volume}%",
"format-bluetooth": "{icon} {volume}%", "format-bluetooth": "<span size='13pt'>{icon}</span> {volume}%",
"format-bluetooth-muted": " {icon}", "format-bluetooth-muted": " {icon}",
"format-muted": " muted", "format-muted": "<span size='13pt'></span> muted",
"format-icons": { "format-icons": {
"headphone": "", "headphone": "",
"hands-free": "", "hands-free": "",
@@ -124,9 +124,9 @@
"warning": 25, "warning": 25,
"critical": 10 "critical": 10
}, },
"format": "{icon} {capacity}%", "format": "<span size='13pt'>{icon}</span> {capacity}%",
"format-charging": " {capacity}%", "format-charging": "<span size='13pt'></span> {capacity}%",
"format-plugged": " {capacity}%", "format-plugged": "<span size='13pt'></span> {capacity}%",
"format-icons": [ "format-icons": [
"", "",
"", "",

View File

@@ -72,10 +72,13 @@ window#waybar {
#battery, #battery,
#custom-vpn { margin-left: 6px; } #custom-vpn { margin-left: 6px; }
/* ── Menu launcher — the one branded accent glyph ────────────────── */ /* ── Menu launcher — the branded Nomarchy mark ───────────────────────
The mark lives at U+F000 in the dedicated "Nomarchy" font; pin the
family or the Nerd Font's glass glyph at the same codepoint wins. */
#custom-nomarchy { #custom-nomarchy {
color: @accent; color: @accent;
font-size: 15px; font-family: Nomarchy;
font-size: 16px;
padding: 0 14px; padding: 0 14px;
} }
#custom-nomarchy:hover { #custom-nomarchy:hover {
@@ -126,8 +129,19 @@ window#waybar {
#custom-updates.available { color: @accent; } #custom-updates.available { color: @accent; }
/* Power-profile glyph renders small in its em box — size it up. */ /* Icon-only status modules carry no text, so they don't get the 13pt
#custom-powerprofile { font-size: 16px; } Pango icon span the icon+text modules (volume/battery/language) use —
bump their font-size to match, or these glyphs read smaller than their
neighbours. */
#custom-recording,
#custom-nightlight,
#custom-updates,
#custom-vpn,
#custom-doctor,
#custom-notification { font-size: 17px; }
/* Speedometer + caffeine cup render small in their em box — a touch more. */
#custom-powerprofile,
#idle_inhibitor { font-size: 18px; }
#pulseaudio.muted { color: @muted; } #pulseaudio.muted { color: @muted; }

View File

@@ -74,7 +74,7 @@
"on-click": "nomarchy-nightlight toggle" "on-click": "nomarchy-nightlight toggle"
}, },
"hyprland/language": { "hyprland/language": {
"format": "󰌌 {short}", "format": "<span size='13pt'>󰌌</span> {short}",
"tooltip": false "tooltip": false
}, },
"custom/updates": { "custom/updates": {
@@ -86,10 +86,10 @@
}, },
"pulseaudio": { "pulseaudio": {
"scroll-step": 5, "scroll-step": 5,
"format": "{icon} {volume}%", "format": "<span size='13pt'>{icon}</span> {volume}%",
"format-bluetooth": "{icon} {volume}%", "format-bluetooth": "<span size='13pt'>{icon}</span> {volume}%",
"format-bluetooth-muted": " {icon}", "format-bluetooth-muted": " {icon}",
"format-muted": " muted", "format-muted": "<span size='13pt'></span> muted",
"format-icons": { "format-icons": {
"headphone": "", "headphone": "",
"hands-free": "", "hands-free": "",
@@ -118,9 +118,9 @@
"warning": 25, "warning": 25,
"critical": 10 "critical": 10
}, },
"format": "{icon} {capacity}%", "format": "<span size='13pt'>{icon}</span> {capacity}%",
"format-charging": " {capacity}%", "format-charging": "<span size='13pt'></span> {capacity}%",
"format-plugged": " {capacity}%", "format-plugged": "<span size='13pt'></span> {capacity}%",
"format-icons": [ "format-icons": [
"", "",
"", "",

View File

@@ -37,10 +37,10 @@
}, },
"pulseaudio": { "pulseaudio": {
"format": "{icon} {volume}%", "format": "<span size='13pt'>{icon}</span> {volume}%",
"format-bluetooth": "{icon}  {volume}%", "format-bluetooth": "<span size='13pt'>{icon} </span> {volume}%",
"format-bluetooth-muted": "  muted", "format-bluetooth-muted": "  muted",
"format-muted": " muted", "format-muted": "<span size='13pt'></span> muted",
"format-icons": { "format-icons": {
"headphone": "", "headphone": "",
"hands-free": "", "hands-free": "",
@@ -58,9 +58,9 @@
"interval": 60, "interval": 60,
"states": { "warning": 30, "critical": 15 }, "states": { "warning": 30, "critical": 15 },
"max-length": 10, "max-length": 10,
"format": "{icon} {capacity}%", "format": "<span size='13pt'>{icon}</span> {capacity}%",
"format-charging": " {capacity}%", "format-charging": "<span size='13pt'></span> {capacity}%",
"format-plugged": " {capacity}%", "format-plugged": "<span size='13pt'></span> {capacity}%",
"format-full": " 100%", "format-full": " 100%",
"format-icons": ["", "", "", "", ""], "format-icons": ["", "", "", "", ""],
"on-click": "nomarchy-menu power", "on-click": "nomarchy-menu power",
@@ -110,7 +110,7 @@
}, },
"hyprland/language": { "hyprland/language": {
"format": "󰌌 {short}", "format": "<span size='13pt'>󰌌</span> {short}",
"tooltip": false "tooltip": false
}, },

View File

@@ -38,10 +38,10 @@
"pulseaudio": { "pulseaudio": {
"scroll-step": 5, "scroll-step": 5,
"format": "{icon} {volume}%", "format": "<span size='13pt'>{icon}</span> {volume}%",
"format-bluetooth": "{icon} {volume}%", "format-bluetooth": "<span size='13pt'>{icon}</span> {volume}%",
"format-bluetooth-muted": " {icon}", "format-bluetooth-muted": " {icon}",
"format-muted": " muted", "format-muted": "<span size='13pt'></span> muted",
"format-icons": { "format-icons": {
"headphone": "", "headphone": "",
"hands-free": "", "hands-free": "",
@@ -58,9 +58,9 @@
"battery": { "battery": {
"interval": 30, "interval": 30,
"states": { "warning": 25, "critical": 10 }, "states": { "warning": 25, "critical": 10 },
"format": "{icon} {capacity}%", "format": "<span size='13pt'>{icon}</span> {capacity}%",
"format-charging": " {capacity}%", "format-charging": "<span size='13pt'></span> {capacity}%",
"format-plugged": " {capacity}%", "format-plugged": "<span size='13pt'></span> {capacity}%",
"format-icons": ["", "", "", "", ""], "format-icons": ["", "", "", "", ""],
"on-click": "nomarchy-menu power", "on-click": "nomarchy-menu power",
"tooltip-format": "Battery status" "tooltip-format": "Battery status"
@@ -109,7 +109,7 @@
}, },
"hyprland/language": { "hyprland/language": {
"format": "󰌌 {short}", "format": "<span size='13pt'>󰌌</span> {short}",
"tooltip": false "tooltip": false
}, },