Hello. This document explains the rofi menu system in BlackNode β what it is, how it is structured, and how to use it.
It covers two separate but complementary interfaces: bn-menu (the main hub with icon + text items) and rofi sidebars (icon-only panels on the right edge of the screen). Both pull colors from the same Material You palette generated automatically from your wallpaper via matugen.
- The Two Interfaces
- Theme Architecture
- Sidebar Scripts
- Quick Config HUD
- bn-menu Submenus
- Development Rules
| Interface | Access | Style | Lines / Items |
|---|---|---|---|
| bn-menu | SUPER + SPACE |
Centered 440Γ640 window, icon + text, search bar | 15 items |
| Sidebars | Keybinds (WiFi, BT, audio, etc.) | 100px-wide right panel, icon-only, no search | 3β6 items |
Both use the same color tokens and the same shared theme files β the only difference is layout and content.
Everything is modular. No standalone themes.
~/.config/rofi/
βββ colors.rasi β M3 palette from matugen (47 tokens)
βββ menu.rasi β bn-menu theme (440Γ640, centered, search)
βββ submenu.rasi β bn-menu submenu theme (380px, 6 lines)
βββ shared/
β βββ config.rasi β Base config (font, scrollbar, sidebar-mode)
β βββ menu.rasi β Sidebar bundle (imports colors + config + sidebar)
β βββ sidebar.rasi β Sidebar layout (100px east, icon-only, feather font)
β βββ list.rasi β Centered list dialog (440px, 28px radius, search)
β βββ input-dialog.rasiβ Input dialog (420px, 24px radius)
β βββ dialog.rasi β Generic dialog
β βββ grid.rasi β Grid layout
βββ styles/ β Per-feature themes importing from shared/
βββ wifi-list.rasi (6 lines, imports list.rasi)
βββ bluetooth-list.rasi (6 lines, imports list.rasi)
βββ notes-list.rasi (20 lines, imports list.rasi)
βββ search-list.rasi (20 lines, imports list.rasi)
βββ audio-list.rasi (46 lines, imports list.rasi)
βββ notes-input.rasi (10 lines, imports input-dialog.rasi)
βββ search-input.rasi (10 lines, imports input-dialog.rasi)
βββ config-list.rasi (wrapper for shared/list.rasi)
βββ ... legacy refactored themes
The rule: every -list.rasi imports shared/list.rasi with no width, font, padding, or lines overrides. Every -input.rasi imports shared/input-dialog.rasi the same way. Consistency is enforced.
All sidebars live in ~/.config/rofi/scripts/ and use the same pattern:
- Icon-only menu in a 100px-wide right panel
- Fat icons rendered in
featherfont (20px viaelement-text) - Items are single icons with a trailing space:
"σ° ΄ "(no leading space) - Uses
shared/menu.rasiwith-theme-str "listview { lines: N; }"
| Script | Trigger | Icons | Description |
|---|---|---|---|
wifi.sh |
SUPER + A |
σ° σ° σ°€ͺ/󰀨 σ°΅ | Scan, saved, toggle, exit |
bluetooth.sh |
SUPER + B |
σ°― σ°° σ°ͺ σ°΅ | Power, scan, devices, exit |
audio.sh |
SUPER + SHIFT + A |
σ°² σ° | Recently played (album art), audio apps |
notes.sh |
SUPER + SHIFT + N |
σ° ΄ σ°Ό σ° | New note, view notes, open folder |
search.sh |
SUPER + SHIFT + F |
σ° σ°³ σ°« σ° Ά | File, web, text, recent |
kb-layout.sh |
SUPER + SHIFT + K |
σ° | Keyboard layout toggle |
config-hud.sh |
SUPER + SHIFT + I |
σ°₯ σ°‘ σ° ο‘ | Animations, visuals, layout, rounding |
Each sidebar opens centered shared/list.rasi dialogs for sub-actions (selecting networks, picking notes, etc.).
scripts/config-hud.sh is a live Hyprland settings panel that writes to settings/overrides.lua and reloads the compositor β no manual config file editing, no hyprctl keyword.
| Category | What It Toggles / Sets |
|---|---|
| σ°₯ Animations | On / Off |
| σ°‘ Visuals | Blur (on/off), Shadow (on/off), Dim (0.3 / 0.0) |
| σ° Layout | Gaps In (0β8px), Gaps Out (0β16px), Border (1β4px) |
| ο‘ Rounding | Window rounding (0β20px) |
State is cached in ~/.cache/blacknode/hud-state so changes persist across sessions. The overrides.lua file is loaded at the end of hyprland.lua via pcall(require, "settings/overrides").
bn-menu (~/.local/bin/bn-menu) launches 15 submenus from ~/.local/bin/scripts/*/menu.sh. Each submenu shows 6β8 items with icon + text in a centered 380px window using submenu.rasi.
| Menu | Script | Items |
|---|---|---|
| οΌ System | system/menu.sh |
System settings |
| σ° Audio | audio/menu.sh |
Audio controls |
| σ°Ή Display | display/menu.sh |
Display settings |
| σ°° Window | window/menu.sh |
Window management |
| σ°Ή Screenshot | screenshot/menu.sh |
Screenshot tools |
| σ°₯° Processes | process/menu.sh |
Process management |
| σ° Packages | package/menu.sh |
Package management |
| ο΅ Applications | apps/menu.sh |
App launcher |
| σ°Έ Wallpapers | wallpaper/menu.sh |
Wallpaper selection |
| σ° Waybar | waybar/menu.sh |
Bar styles |
| σ° Reload | reload/menu.sh |
Config reload |
| σ±« Services | services/menu.sh |
Service management |
| σ° Theme | theme/menu.sh |
Theme settings |
| σ°Ό About | info/menu.sh |
Project info, stats, keybinds, README, dotfile browser |
| σ° Session | session/menu.sh |
Session control |
| σ°― Bluetooth | bluetooth/menu.sh |
Bluetooth management |
When adding new features to this system, follow these rules:
- Sidebars use
shared/menu.rasiwith-theme-str "listview { lines: N; }". Do not create per-menu.rasifiles. - List menus use
shared/list.rasi. No width/font/padding/lines overrides. - Input dialogs use
shared/input-dialog.rasi. No overrides. - Icons in sidebar data strings follow
"σ° ΄ "β icon immediately followed by a single trailing space, no leading space. - bn-menu items use the same pattern:
"οΌ System"β icon, double space, text label. - If something repeats more than once, modularize it into
shared/. - No standalone themes. Every
.rasiimports fromshared/andcolors.rasi. - Hyprland runtime changes go through
settings/overrides.lua+hyprctl reload, neverhyprctl keyword(Hyprland 0.55+ Lua).
β HollowSec