feat(home): switch launcher/menu from fuzzel to rofi 2.0

rofi 2.0 landed in nixpkgs 26.05 with native Wayland (mainline upstreamed
the lbonn rofi-wayland fork — `wayland enabled`), so the original reason
to prefer fuzzel (rofi being X11-only / needing a community fork) is gone.
rofi's `.rasi` is far more expressive than fuzzel's flat INI, which lets
the launcher be a proper themed hero surface and revives the legacy
per-theme launcher designs.

- modules/home/rofi.nix replaces fuzzel.nix: per-element theme generated
  from theme-state.json (accent border, highlighted selection, rounded
  inputbar) via lib.formats.rasi.mkLiteral; themes/<slug>/rofi.rasi
  whole-swap; the nomarchy-menu dispatcher re-pointed to `rofi -dmenu`
  (power/theme/clipboard/calc with -mesg/files/web + root picker).
- SUPER+D is now `rofi -show drun`; the menu binds are unchanged.
- nomarchy.fuzzel.enable → nomarchy.rofi.enable; fuzzel dropped from
  home.packages. Pango handles nf-glyph fallback (no explicit font list
  needed as fuzzel's fcft did). show-icons off until an icon theme ships.

Verified: flake check green, HM generation builds, the generated
theme.rasi parses under `rofi -dump-theme`, Hyprland config verifies.
Not verified: rofi's on-screen rendering needs a real session.

Docs: README menu/override/roadmap sections and the module tree updated;
the per-theme launcher roadmap item now points at porting the legacy
rofi.rasi designs (the whole-swap mechanism is in place).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-06-13 14:41:46 +01:00
parent 76582c1ee9
commit 961314ea86
9 changed files with 532 additions and 201 deletions

267
.claude/settings.local.json Normal file
View File

@@ -0,0 +1,267 @@
{
"permissions": {
"allow": [
"Bash(grep -i \"\\\\.nix$\")",
"Bash(xargs ls *)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.activationPackage.outPath)",
"Bash(git *)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.default.config.system.activationScripts.home-manager-activate.text)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.installerIsoGraphical.config.system.activationScripts.home-manager-activate.text)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.config.system.build.toplevel.drvPath)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.system.build.toplevel.drvPath)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#homeConfigurations.nomarchy.activationPackage.drvPath)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.default.config.systemd.services.\"home-manager-nomarchy\".serviceConfig.ExecStart)",
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#nixosConfigurations.default.config.system.build.vm --no-link --print-out-paths)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#homeConfigurations.nomarchy.config.xdg.configFile.\"nomarchy/current/background\".source)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.home-files.outPath)",
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#homeConfigurations.nomarchy.config.home-files --no-link --print-out-paths)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#homeConfigurations.nomarchy.config.systemd.user.startServices)",
"Bash(xxd)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#packages.x86_64-linux.allThemeVariants.drvPath)",
"Bash(chmod +x /home/bernardo/Projects/Coding/Nomarchy/themes/engine/scripts/nomarchy-themes-prebuild)",
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#homeConfigurations.nomarchy.activationPackage --no-link --print-out-paths)",
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#homeConfigurations.nomarchy.config.home.packages.outPath)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.home-path.outPath)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --expr '\\(builtins.readDir ./themes/engine/scripts\\)' --json)",
"Bash(nix-build -I nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos /home/bernardo/Projects/Coding/Nomarchy/flake.nix --argstr attr nixosConfigurations.installerIsoGraphical)",
"Bash(awk '{print $NF}')",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.hardware.pulseaudio.enable .#nixosConfigurations.installerIsoGraphical.config.services.pipewire.enable .#nixosConfigurations.installerIsoGraphical.config.services.pipewire.pulse.enable)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.services.displayManager.sddm.enable .#nixosConfigurations.installerIsoGraphical.config.services.displayManager.defaultSession .#nixosConfigurations.installerIsoGraphical.config.programs.hyprland.enable)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --json .#nixosConfigurations.installerIsoGraphical.config.users.users.nixos.extraGroups)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.hardware.pulseaudio.enable)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.services.pipewire.enable)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.services.pipewire.pulse.enable)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.programs.hyprland.enable)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval '.#nixosConfigurations.installerIsoGraphical.config.__TRACKED_VAR__')",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.home-manager.users.nixos.home.packages --apply 'builtins.length')",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.config.home-manager.users.nomarchy.home.packages --apply 'builtins.length')",
"Bash(chmod +x /home/bernardo/Projects/Coding/Nomarchy/features/scripts/utils/nomarchy-test-live-iso)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --json .#nixosConfigurations.installerIsoGraphical.config.boot.initrd.kernelModules)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#homeConfigurations.nomarchy.config.programs.waybar.systemd.enable)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.systemd.user.services --apply 'svcs: builtins.concatStringsSep \"\\\\n\" \\(builtins.attrNames svcs\\)')",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.gtk.iconTheme.package.pname)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw nixpkgs#everforest-gtk-variant.pname)",
"Bash(nix --extra-experimental-features 'nix-command flakes' search nixpkgs everforest)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.everforest-gtk-variant.pname)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.everforest-gtk-theme.pname)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.everforest-gtk-variant)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --expr 'let pkgs = import \\(builtins.getFlake \"/home/bernardo/Projects/Coding/Nomarchy\"\\).inputs.nixpkgs { system = \"x86_64-linux\"; config.allowUnfree = true; }; in builtins.attrNames \\(pkgs // {} \\)')",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --expr 'let pkgs = import \\(builtins.getFlake \"/home/bernardo/Projects/Coding/Nomarchy\"\\).inputs.nixpkgs { system = \"x86_64-linux\"; config.allowUnfree = true; }; in builtins.concatStringsSep \"\\\\n\" \\(builtins.filter \\(n: builtins.match \".*[Ee]verforest.*\" n != null\\) \\(builtins.attrNames pkgs\\)\\)' --raw)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.gtk.iconTheme.name)",
"Bash(bash -n /home/bernardo/Projects/Coding/Nomarchy/installer/install.sh)",
"Bash(bash -n /home/bernardo/Projects/Coding/Nomarchy/installer/hardware-db.sh)",
"Read(//tmp/**)",
"Bash(bash -c ' *)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#overlays.default --apply 'o: toString \\(builtins.typeOf o\\)')",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#overlays.default --apply 'o: \"overlay present: \" + builtins.typeOf o')",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.default.config.system.nixos.distroName)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.default.config.system.nixos.distroId)",
"Bash(nix-instantiate --parse /home/bernardo/Projects/Coding/Nomarchy/installer/disko-golden.nix)",
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#nixosConfigurations.installerIsoGraphical.config.system.build.toplevel --no-link --print-out-paths)",
"Bash(bash /home/bernardo/Projects/Coding/Nomarchy/installer/install.sh --help)",
"Bash(bash -c 'echo \"HOSTNAME=$HOSTNAME\"')",
"Bash(bash -c 'echo \"HOSTNAME default=$HOSTNAME\"')",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.installerIsoGraphical.config.services.getty.helpLine)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.voxtype.pname)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.opencode.pname)",
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#nixosConfigurations.default.config.system.build.vm --no-link)",
"Bash(nix log *)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --json --impure --expr ' *)",
"Bash(cat)",
"Bash(chmod +x /tmp/theme_comparison.sh)",
"Bash(/tmp/theme_comparison.sh)",
"Bash(xargs -I {} dirname {})",
"Bash(xargs -I {} basename {})",
"Bash(chmod +x /tmp/color_compare.sh)",
"Bash(bash /tmp/color_compare.sh)",
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval --raw 'github:nix-community/disko/latest#packages.x86_64-linux.disko.outPath')",
"Bash(find /nix/store/*disko*/lib/disko -name \"luks*\")",
"Bash(nix flake *)",
"Bash(nix-instantiate --parse /home/bernardo/Projects/Coding/Nomarchy/flake.nix)",
"Bash(nix eval *)",
"Bash(bash installer/install.sh --dry-run)",
"Bash(sudo bash *)",
"Bash(chmod +x /home/bernardo/Projects/Coding/Nomarchy/core/system/scripts/nomarchy-env-update)",
"Bash(bash -n /home/bernardo/Projects/Coding/Nomarchy/core/system/scripts/nomarchy-env-update)",
"Bash(sed -n '1450,1500p' /home/bernardo/Projects/Coding/Nomarchy/installer/install.sh)",
"Bash(grep -A 5 'nixosConfigurations.$HOSTNAME' /home/bernardo/Projects/Coding/Nomarchy/installer/install.sh)",
"Bash(mkdir -p /tmp/globtest)",
"Bash(touch nvme0n1 *)",
"Bash(shopt -s nullglob)",
"Bash(bash -n installer/install.sh)",
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval .#nixosConfigurations.nomarchy-live.config.system.build.toplevel.outPath)",
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval --impure --expr 'let f = import ./core/system/impermanence.nix; in \\(f { config = { nomarchy.system.impermanence = { enable = true; mainLuksName = \"crypted_main\"; }; }; lib = \\(import <nixpkgs> {}\\).lib; pkgs = null; inputs = { impermanence.nixosModules.impermanence = {}; }; }\\).config.boot.initrd.postDeviceCommands')",
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval .#nixosConfigurations.nomarchy-installer.config.system.build.toplevel.outPath)",
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval .#nixosConfigurations.nomarchy-live.config.nomarchy.system.theme)",
"Bash(chmod +x *)",
"Bash(./bin/utils/nomarchy-docs-scripts --out docs/SCRIPTS.md)",
"Bash(awk '/^## Missing references/,/^## Menu items/' docs/SCRIPTS.md)",
"Bash(bash -n bin/utils/nomarchy-docs-scripts)",
"Bash(bash -n features/scripts/utils/nomarchy-docs-scripts)",
"Bash(bash -n themes/engine/scripts/nomarchy-theme-next)",
"Bash(grep '`unused?`' docs/SCRIPTS.md)",
"Bash(awk -F'|' '{print $2}')",
"Bash(awk *)",
"Bash(grep -c '`unused?`' docs/SCRIPTS.md)",
"Bash(grep -n '`unused?`' docs/SCRIPTS.md)",
"Bash(grep '^| `__TRACKED_VAR__` ' docs/SCRIPTS.md)",
"Bash(nix --extra-experimental-features 'nix-command flakes' flake check --no-build)",
"Bash(grep -c '`kept`' docs/SCRIPTS.md)",
"Bash(nix shell *)",
"Bash(nix shell 'nixpkgs#shellcheck' --command bash -c ' *)",
"Bash(./bin/utils/nomarchy-docs-scripts --out /tmp/SCRIPTS.regen.md)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --expr ' *)",
"Bash(sed -n '100,108p' core/home/options.nix)",
"Bash(sed -n '185,195p' core/system/options.nix)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --json --expr ' *)",
"Bash(bash -n *)",
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --raw --expr ' *)",
"Bash(grep '^| `nomarchy-manual`' docs/SCRIPTS.md)",
"Bash(nix *)",
"Bash(sudo -n cat /etc/environment)",
"Bash(systemctl --user show-environment)",
"Bash(./bin/utils/nomarchy-docs-keybindings --out /tmp/keybindings-fresh.md)",
"Bash(bash bin/utils/nomarchy-docs-keybindings --out /tmp/keybindings-fresh.md)",
"Bash(nix-shell -p shellcheck --run \"shellcheck --severity=error features/scripts/utils/nomarchy-menu features/scripts/utils/nomarchy-launch-screensaver\")",
"Bash(./bin/utils/nomarchy-docs-keybindings --out docs/KEYBINDINGS.md)",
"Bash(grep -rEho 'jq[^\"]*--arg [a-zA-Z]+|\\\\.[a-zA-Z][a-zA-Z_0-9]+ = \\\\$|jq -r .\\\\.[a-zA-Z]+' features/scripts core/system/scripts themes/engine/scripts)",
"Read(//home/bernardo/.config/mako/**)",
"Read(//home/bernardo/.config/nomarchy/default/hypr/**)",
"Read(//home/bernardo/.config/nomarchy/current/theme/**)",
"Read(//etc/nixos/**)",
"Bash(sudo git -C /etc/nixos log --oneline -3)",
"Bash(PATH=/home/bernardo/Projects/Coding/Nomarchy/features/scripts/utils:/home/bernardo/Projects/Coding/Nomarchy/themes/engine/scripts:__TRACKED_VAR__ bash /home/bernardo/Projects/Coding/Nomarchy/features/scripts/utils/nomarchy-installed-summary)",
"Bash(grep *)",
"Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); r=d['results'][0]['extensions'][0]; print\\('version:', r['versions'][0]['version']\\); print\\('displayName:', r['displayName']\\); print\\('publisher:', r['publisher']['publisherName']\\); print\\('extName:', r['extensionName']\\)\")",
"Bash(python3 -c \"import sys,json; d=json.load\\(sys.stdin\\); [print\\(x['file'],'=',x['value']\\) for x in d]\")",
"Bash([ -f \"core/home/config/nomarchy/default/hypr/apps/$f.conf\" ])",
"Bash([ -f \"core/home/config/nomarchy/default/hypr/bindings/$f.conf\" ])",
"Bash([ -f \"core/home/config/nomarchy/default/hypr/$f.conf\" ])",
"Bash([ -f \"features/desktop/hyprland/config/$f.conf\" ])",
"Bash(timeout 580 ./bin/utils/nomarchy-eval-matrix)",
"Bash(break)",
"Bash(sed -n 1,45p __TRACKED_VAR__/nix/package.nix)",
"Bash(sed -n 1,50p __TRACKED_VAR__/nix/modules/home-manager.nix)",
"Bash(python3 -c 'import json,sys; d=json.load\\(sys.stdin\\); print\\('\\\\''top path:'\\\\'', d.get\\('\\\\''path'\\\\'','\\\\''?'\\\\''\\)\\); inp=d.get\\('\\\\''inputs'\\\\'',{}\\); print\\('\\\\''inputs:'\\\\'', list\\(inp.keys\\(\\)\\)\\); print\\('\\\\''walker present:'\\\\'', '\\\\''walker'\\\\'' in inp\\); *)",
"Bash(echo \"exit: $?\")",
"Bash(echo 'output: [__TRACKED_VAR__]')",
"Bash(time ./bin/utils/nomarchy-eval-matrix)",
"Bash(python3 -c \"import json,sys; [print\\(x\\) for x in sorted\\(json.load\\(sys.stdin\\)\\)]\")",
"Read(//dev/**)",
"Bash(command -v qemu-system-x86_64 qemu-kvm)",
"Bash(echo \"BUILD_EXIT=$?\")",
"Bash(rm -f /tmp/nomarchy-mon.sock)",
"Bash(mkdir -p /tmp/nomarchy-vmrun)",
"Bash(QEMU_OPTS='-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -vga none' /tmp/nomarchy-vm/bin/run-nomarchy-vm)",
"Bash(echo \"VM_EXIT=$?\")",
"Bash(magick /tmp/shot.png -crop 5120x130+0+0 +repage /tmp/shot-top.png)",
"Bash(magick /tmp/shot.png -crop 1400x420+0+440 +repage /tmp/shot-term.png)",
"Bash(/nix/store/wv8bpzriikv65xnd1vciqpq7rnr8h2q2-bash-5.3p3/bin/bash -c 'compgen -G \"/etc/*\" >/dev/null 2>&1 && echo \"compgen WORKS\" || echo \"compgen MISSING \\(progcomp disabled\\)\"')",
"Bash(compgen -G \"/etc/*\")",
"Bash(/nix/store/wv8bpzriikv65xnd1vciqpq7rnr8h2q2-bash-5.3p3/bin/bash -c 'shopt -s nullglob; a=\\(/etc/hos*\\); echo \"nullglob ok: ${#a[@]} match\\(es\\)\"')",
"Bash(mkdir -p /tmp/nomarchy-vmrun2)",
"Bash(pgrep -f qemu-system)",
"Bash(rm -rf /tmp/nomarchy-vmrun3)",
"Bash(mkdir -p /tmp/nomarchy-vmrun3)",
"Bash(echo \"exit=$?\")",
"Bash(socat - unix-connect:/tmp/nomarchy-mon.sock)",
"Bash(magick /tmp/shot3.ppm /tmp/shot3.png)",
"Bash(magick identify *)",
"Bash(echo \"captured -> $\\(magick identify -format '%wx%h' /tmp/shot3.png\\)\")",
"Bash(magick /tmp/shot3.png -crop 5120x150+0+0 +repage /tmp/shot3-top.png)",
"Bash(pkill -x qemu-system-x86)",
"Bash(pkill -f \"qemu-system-x86_64 -machine\")",
"Bash(rm -rf /tmp/nomarchy-vmrun4)",
"Bash(mkdir -p /tmp/nomarchy-vmrun4)",
"Bash(echo \"boot-exit=$?\")",
"Bash(magick /tmp/shot4.ppm /tmp/shot4.png)",
"Bash(echo \"captured -> $\\(magick identify -format '%wx%h' /tmp/shot4.png\\)\")",
"Bash(magick /tmp/shot4.png -crop 5120x160+0+0 +repage /tmp/shot4-top.png)",
"Bash(rm -rf /tmp/vmrun_final)",
"Bash(mkdir -p /tmp/vmrun_final)",
"Bash(magick /tmp/shot5.ppm /tmp/shot5.png)",
"Bash(echo \"captured -> $\\(magick identify -format '%wx%h' /tmp/shot5.png\\)\")",
"Bash(magick /tmp/shot5.png -crop 5120x170+0+0 +repage /tmp/shot5-top.png)",
"Bash(rm -rf /tmp/vmssh)",
"Bash(mkdir -p /tmp/vmssh)",
"Bash(QEMU_OPTS='-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -vga none' QEMU_NET_OPTS=hostfwd=tcp::2222-:22 /tmp/nomarchy-vm-ssh/bin/run-nixos-vm)",
"Bash(command -v expect)",
"Read(//home/bernardo/.ssh/**)",
"Bash(QEMU_OPTS='-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -vga none' QEMU_NET_OPTS=hostfwd=tcp::2222-:22 /tmp/nomarchy-vm-ssh/bin/run-nomarchy-vm)",
"Bash(echo \"vm-exited rc=$?\")",
"Bash(pkill -f \"run-nomarchy-vm\")",
"Bash(rm -rf /tmp/vmtheme)",
"Bash(mkdir -p /tmp/vmtheme)",
"Bash(echo \"vm exited rc=$?\")",
"Bash(magick /tmp/latte.ppm -resize 1700 /tmp/latte.png)",
"Bash(echo \"saved $\\(magick identify -format '%wx%h' /tmp/latte.png\\)\")",
"Bash(./bin/utils/nomarchy-eval-matrix)",
"Bash(rm -f /tmp/nomarchy.qcow2 /tmp/vm-boot.log)",
"Bash(NIX_DISK_IMAGE=/tmp/nomarchy.qcow2 QEMU_OPTS='-display none -m 4096' /tmp/vm-verify-result/bin/run-nomarchy-vm)",
"Bash(echo \"VM PID $!\")",
"Bash(pkill -f 'qemu-system-x86_64 -machine accel=kvm.*nomarchy')",
"Bash(rm -f /tmp/vm-verify.nix /tmp/nomarchy.qcow2 /tmp/vm-boot.log /tmp/vm-verify-result)",
"Bash(pkill -9 -f 'qemu-system')",
"Bash(rm -f /tmp/nomarchy.qcow2)",
"Bash(python3 -)",
"Bash(sed -n '206,228p' features/scripts/utils/nomarchy-menu)",
"Bash(pkill -9 -f 'run-nixos-vm\\\\|qemu-system-x86_64.*nomarchy')",
"Bash(rm -f /tmp/nomarchy.qcow2 /tmp/vm-verify.nix /tmp/vm-boot.log /tmp/menu-*.sh /tmp/layout-check.sh /tmp/validate-fixes.sh /tmp/menu-cmds.txt /tmp/shipped.txt)",
"Bash(rm -f /tmp/vm-verify-result)",
"Bash(kill -9 1285354)",
"Bash(sed -n '1,30p' features/scripts/battery-monitor.nix)",
"Bash(sed -n '40,75p' features/desktop/waybar/default.nix)",
"Bash(sed -n '140,160p' features/desktop/waybar/themes/summer-night/config.jsonc)",
"Bash(sed -n '10,20p' features/desktop/waybar/config/config.jsonc)",
"Bash(python3 -m json.tool)",
"Bash(/tmp/nomarchy-multidisk-test/run-vm.sh)",
"Bash(socat - UNIX-CONNECT:mon.sock)",
"Bash(/tmp/nomarchy-multidisk-test/boot-from-disk.sh)",
"Bash(socat - UNIX-CONNECT:bootmon.sock)",
"Bash(convert /tmp/nomarchy-multidisk-test/screen.ppm /tmp/nomarchy-multidisk-test/screen.png)",
"Bash(magick /tmp/nomarchy-multidisk-test/screen.ppm /tmp/nomarchy-multidisk-test/screen.png)",
"Bash(shellcheck --severity=error installer/install.sh)",
"Bash(curl -s \"https://api.github.com/repos/nix-community/home-manager/contents/modules/programs/vscode?ref=0d02ec1d0a05f88ef9e74b516842900c41f0f2fe\")",
"Bash(python3 -c \"import json,sys;[print\\(x['name']\\) for x in json.load\\(sys.stdin\\)]\")",
"Bash(curl -s \"https://api.github.com/repos/nix-community/home-manager/contents/modules/programs/vscode?ref=release-25.11\")",
"Bash(curl -s \"https://api.github.com/repos/nix-community/home-manager/contents/modules/programs/vscode?ref=49ca96b2714c5931e17401eff87f3edd42d2b0f2\")",
"Bash(python3 -c \"import json,sys;d=json.load\\(sys.stdin\\);[print\\(x['name']\\) for x in d]\")",
"Bash(curl -s -o /dev/null -w \"%{http_code}\\\\n\" \"https://raw.githubusercontent.com/nix-community/home-manager/49ca96b2714c5931e17401eff87f3edd42d2b0f2/modules/programs/vscode/each-config.nix\")",
"Read(//nix/store/**)",
"Bash(mkdir -p __TRACKED_VAR__/nomarchy-install-test)",
"Bash(qemu-img create *)",
"Read(//home/bernardo/.config/nomarchy/**)",
"Read(//home/bernardo/.local/share/nomarchy/**)",
"Read(//home/bernardo/.config/elephant/**)",
"Read(//home/bernardo/.local/share/elephant/**)",
"Read(//home/bernardo/.config/walker/**)",
"WebFetch(domain:raw.githubusercontent.com)",
"Bash(python3 -c ' *)",
"Bash(nix-store -r /nix/store/hydnry53i2qbmqq0b0872wlbzdkpq1bd-source)",
"Bash(echo \"EXIT=$?\")",
"Bash(sed -n '44,50p' features/default.nix)",
"Bash(sed -n '14,20p' features/scripts/default.nix)",
"Bash(sed -n '11,17p' themes/engine/scripts.nix)",
"WebSearch",
"WebFetch(domain:github.com)",
"Bash(curl -sL \"https://api.github.com/repos/hyprwm/Hyprland/commits?sha=v0.55.3&per_page=100\")",
"Bash(curl -sL -o /tmp/hypr-fence-fix.patch \"https://github.com/hyprwm/Hyprland/commit/bdf0aaa5409fe2e4715e2796d669e16776de0233.patch\")",
"Bash(rm -f /tmp/nomarchy-2605.qcow2 /tmp/nomarchy-mon.sock /tmp/nomarchy-serial.sock)",
"Bash(NIX_DISK_IMAGE=/tmp/nomarchy-2605.qcow2 QEMU_OPTS=\"-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -serial unix:/tmp/nomarchy-serial.sock,server,nowait\" /tmp/nomarchy-vm-2605/bin/run-nomarchy-vm)",
"Bash(python3 *)",
"Bash(curl -sL https://raw.githubusercontent.com/hyprwm/Hyprland/v0.55.3/CMakeLists.txt)",
"Bash(curl -sL https://raw.githubusercontent.com/hyprwm/Hyprland/v0.55.2/CMakeLists.txt)",
"Bash(NIX_DISK_IMAGE=/tmp/nomarchy-2605.qcow2 QEMU_OPTS=\"-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -serial unix:/tmp/nomarchy-serial.sock,server,nowait\" /tmp/nomarchy-vm-2605-fixed/bin/run-nomarchy-vm)",
"Bash(xargs du -sh)",
"Bash(xargs du -csh)",
"Bash(curl -s https://raw.githubusercontent.com/nix-community/stylix/release-26.05/flake.nix)",
"Bash(nix build *)",
"Bash(echo \"exit $?\")",
"Bash(pkill -f \"test-install.sh\")",
"Bash(pkill -f \"qemu-system-x86_64.*NOMARCHY\\\\|qemu-system-x86_64.*nomarchy\")",
"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(xargs cat)"
]
}
}

View File

@@ -57,7 +57,7 @@ Flat on purpose. Two module trees, one options file each, no hidden layers.
│ ├── waybar.nix
│ ├── ghostty.nix
│ ├── btop.nix
│ ├── fuzzel.nix # launcher + nomarchy-menu (power, clip)
│ ├── rofi.nix # launcher + nomarchy-menu (power, clip)
│ ├── swaync.nix # notifications, same JSON
│ ├── idle.nix # hyprlock + hypridle, same JSON
│ └── yazi.nix # flagship TUI file manager + plugins
@@ -172,7 +172,7 @@ examples: **[docs/OVERRIDES.md](docs/OVERRIDES.md)**.
| `nomarchy.keyboard.variant` | `""` | XKB variant for the session |
| `nomarchy.hyprland.enable` | `true` | Nomarchy's Hyprland config |
| `nomarchy.waybar.enable` | `true` | Nomarchy's Waybar |
| `nomarchy.fuzzel.enable` | `true` | Themed fuzzel + `nomarchy-menu` (power menu) |
| `nomarchy.rofi.enable` | `true` | Themed rofi launcher + `nomarchy-menu` dispatcher |
| `nomarchy.swaync.enable` | `true` | swaync notifications, themed |
| `nomarchy.idle.enable` | `true` | hyprlock + hypridle (idle lock 5 min, display off 10, suspend 30) |
| `nomarchy.yazi.enable` | `true` | yazi TUI file manager, themed + curated plugins |
@@ -224,7 +224,7 @@ per theme — a single place to look, unlike the old distro's split:
| `btop.theme` | baked into the generation (generated from the palette when absent) |
| `waybar.css` | **whole-swap**: replaces the generated bar style entirely (probed at eval time, self-contained) |
| `waybar.jsonc` | whole-swap for the bar *layout* (must be plain JSON) |
| `fuzzel.ini` | **whole-swap**: replaces the generated launcher/menu config entirely |
| `rofi.rasi` | **whole-swap**: replaces the generated launcher/menu theme entirely |
Six ported themes ship a `waybar.css` identity (catppuccin, lumon, nord,
retro-82, summer-day, summer-night). Custom user themes can live in
@@ -261,37 +261,37 @@ close · `SUPER+1..9` workspaces · `Print` region screenshot.
## Roadmap
- **Menu system** (apps launcher + theme switching + system actions), built
on fuzzel — already shipped for SUPER+D/SUPER+T, dmenu mode does nested
menus and per-entry icons, and its INI theme can be baked from
theme-state.json like every other app:
- ✓ shipped: `modules/home/fuzzel.nix` (palette/fonts/border from the
theme JSON, `themes/<slug>/fuzzel.ini` whole-swap) and the
on rofi 2.0 (native Wayland on 26.05) — its `.rasi` theme is baked from
theme-state.json like every other app, with rich per-element styling:
- ✓ shipped: `modules/home/rofi.nix` (per-element theme generated from
the palette, `themes/<slug>/rofi.rasi` whole-swap) and the
`nomarchy-menu` dispatcher: root picker (no args) · `power`
(lock/logout/suspend/hibernate/reboot/shutdown, SUPER+X) ·
`theme` (SUPER+T) · `clipboard` (cliphist, SUPER+CTRL+V) · `calc`
(qalc, copy/chain) · `files` (fd → xdg-open) · `web` (DuckDuckGo)
(qalc, copy/chain) · `files` (fd → xdg-open) · `web` (DuckDuckGo).
SUPER+D is `rofi -show drun`.
- next modules: Network ▸ nmtui · Bluetooth ▸ blueman · Capture ▸
screenshot · **ask Claude**: `--prompt-only`
`$TERMINAL -e claude "<question>"` — the claude CLI auths via OAuth
against a Pro/Max subscription (no API key); REPL stays open for
follow-ups (claude-code in nixpkgs is unfree — allowUnfree is on)
- known limits accepted for now: no live-as-you-type results (dmenu
input is static per invocation) and no image previews
- decision record: this resolves the old Walker/Lua question in favor of
simplicity — no GTK4 launcher, no second theming pipeline, no image
previews (instant `bg next` covers wallpaper browsing); the dispatcher
owns the menu structure, so the renderer stays swappable
screenshot · **ask Claude**: free-text → `$TERMINAL -e claude
"<question>"` — the claude CLI auths via OAuth against a Pro/Max
subscription (no API key); REPL stays open for follow-ups (claude-code
in nixpkgs is unfree — allowUnfree is on)
- launcher icons: `show-icons` is off (no icon theme shipped yet);
enabling it well means shipping an icon theme (Papirus/Adwaita)
- decision record: resolves the old Walker/Lua question — no GTK4
launcher, no second theming pipeline; the dispatcher owns the menu
structure, so the renderer stays swappable (we moved fuzzel → rofi 2.0
once mainline gained native Wayland, for its richer theming)
- **Theme parity with legacy:** summer-day/night now carry their legacy
bar layouts as `waybar.jsonc` whole-swaps (adapted: dead legacy script
modules dropped, Nerd-Fonts-v2 codepoints remapped to FontAwesome/v3,
logo button opens nomarchy-menu); the other four identity themes are
palette recolors and already match. Remaining: a visual pass over all
six on the live ISO
- **Per-theme fuzzel identity:** the `themes/<slug>/fuzzel.ini` whole-swap
mechanism ships; what remains is authoring the inis for the six identity
themes from their legacy rofi.rasi files (per-element colors like
summer-night's green inputbar aren't expressible in fuzzel's flat
scheme — approximate, note the rest as a renderer limitation)
- **Per-theme rofi identity:** the `themes/<slug>/rofi.rasi` whole-swap
mechanism ships; what remains is porting the legacy `rofi.rasi` designs
(summer-day/night already have them in the legacy branch) for the
identity themes — rofi's `.rasi` expresses their per-element looks
(green inputbar, inverted window) directly, unlike the old flat scheme
- **Faster switches:** move `backgrounds/` out of the flake source (the 86 MB
re-copy on every state write is the main eval tax), then pre-built theme
variants if still needed

View File

@@ -12,7 +12,7 @@
./waybar.nix
./ghostty.nix
./btop.nix
./fuzzel.nix # launcher theming + the nomarchy-menu dispatcher
./rofi.nix # launcher theming + the nomarchy-menu dispatcher
./swaync.nix # notification daemon, themed from the same JSON
./idle.nix # hyprlock + hypridle, themed from the same JSON
./yazi.nix # flagship TUI file manager, themed + plugins
@@ -31,7 +31,6 @@
home.packages = with pkgs; [
awww # wallpaper daemon with animated transitions (the swww fork)
fuzzel # launcher / dmenu (used by the theme picker bind)
libnotify
];

View File

@@ -1,171 +0,0 @@
# Fuzzel — launcher, dmenu renderer for the menu system, themed from
# theme-state.json like every other surface. Also home of nomarchy-menu,
# the dispatcher script all menu modules grow out of.
#
# Per-theme identity: themes/<slug>/fuzzel.ini is a whole-swap (like
# waybar.css) — it replaces the generated config entirely, probed at
# eval time.
{ config, lib, pkgs, ... }:
let
cfg = config.nomarchy;
t = cfg.theme;
c = t.colors;
# Per-theme override probe (same convention as waybar.nix).
iniOverride = cfg.themesDir + "/${t.slug}/fuzzel.ini";
hasIniOverride = builtins.pathExists iniOverride;
# fuzzel.ini colors are rrggbbaa, no leading #.
hexa = color: alpha: "${lib.removePrefix "#" color}${alpha}";
nomarchy-menu = pkgs.writeShellScriptBin "nomarchy-menu" ''
# Nomarchy menu dispatcher thin presentation layer over
# `fuzzel --dmenu`; actions delegate to nomarchy-theme-sync,
# systemctl, hyprctl and friends. Icons are nf-md glyphs (any
# shipped Nerd Font carries them). `nomarchy-menu` with no
# argument shows the module picker.
urlencode() {
local s="$1" out="" ch
for ((i = 0; i < ''${#s}; i++)); do
ch=''${s:i:1}
case "$ch" in
[a-zA-Z0-9.~_-]) out+="$ch" ;;
' ') out+="+" ;;
*) printf -v ch '%%%02X' "'$ch"; out+="$ch" ;;
esac
done
printf '%s' "$out"
}
case "''${1:-}" in
power)
choice=$(printf '%s\n' \
"󰌾 Lock" \
"󰍃 Logout" \
"󰤄 Suspend" \
"󰒲 Hibernate" \
"󰜉 Reboot" \
"󰐥 Shutdown" \
| fuzzel --dmenu --prompt "power " --lines 6 --width 24) || exit 0
case "$choice" in
*Lock) loginctl lock-session ;;
*Logout) hyprctl dispatch exit ;;
*Suspend) systemctl suspend ;;
*Hibernate) systemctl hibernate ;;
*Reboot) systemctl reboot ;;
*Shutdown) systemctl poweroff ;;
esac ;;
theme)
choice=$(nomarchy-theme-sync list \
| fuzzel --dmenu --prompt "theme ") || exit 0
[ -n "$choice" ] && exec nomarchy-theme-sync apply "$choice" ;;
clipboard)
sel=$(cliphist list | fuzzel --dmenu --prompt "clip " --width 60) || exit 0
printf '%s' "$sel" | cliphist decode | wl-copy ;;
calc)
expr=$(fuzzel --prompt-only "= ") || exit 0
[ -n "$expr" ] || exit 0
result=$(qalc -t -- "$expr" 2>&1 | tail -n 1)
choice=$(printf '%s\n' "󰆏 Copy result" "󰃬 New calculation" \
| fuzzel --dmenu --lines 2 --width 40 \
--prompt "= " --mesg "$expr = $result") || exit 0
case "$choice" in
*Copy*) printf '%s' "$result" | wl-copy ;;
*New*) exec "$0" calc ;;
esac ;;
files)
sel=$(fd . "$HOME" --type f --hidden --exclude .git --exclude .cache 2>/dev/null \
| head -n 50000 \
| sed "s|^$HOME/||" \
| fuzzel --dmenu --prompt "file " --width 60) || exit 0
[ -n "$sel" ] && exec xdg-open "$HOME/$sel" ;;
web)
q=$(fuzzel --prompt-only "search ") || exit 0
[ -n "$q" ] || exit 0
exec xdg-open "https://duckduckgo.com/?q=$(urlencode "$q")" ;;
"")
choice=$(printf '%s\n' \
"󰀻 Apps" \
"󰏘 Theme" \
"󰅌 Clipboard" \
"󰃬 Calculator" \
"󰈞 Files" \
"󰖟 Web search" \
"󰐥 Power" \
| fuzzel --dmenu --prompt "menu " --lines 7 --width 24) || exit 0
case "$choice" in
*Apps*) exec fuzzel ;;
*Theme*) exec "$0" theme ;;
*Clipboard*) exec "$0" clipboard ;;
*Calc*) exec "$0" calc ;;
*Files*) exec "$0" files ;;
*Web*) exec "$0" web ;;
*Power*) exec "$0" power ;;
esac ;;
*)
echo "usage: nomarchy-menu [power|theme|clipboard|calc|files|web]" >&2
exit 64 ;;
esac
'';
in
{
config = lib.mkIf cfg.fuzzel.enable {
home.packages = [
nomarchy-menu
pkgs.libqalculate # qalc, the calc module's engine
pkgs.fd # files module
pkgs.xdg-utils # xdg-open for files/web
];
programs.fuzzel = {
enable = true;
# Whole-swap themes bring their own fuzzel.ini; otherwise the
# config is generated from the palette.
settings = lib.mkIf (!hasIniOverride) {
main = {
# UI font first; the mono Nerd Font follows so menu icons
# (nf-md glyphs) resolve — fcft falls back per glyph.
font = "${t.fonts.ui}:size=${toString (t.fonts.size + 1)}, ${t.fonts.mono}:size=${toString (t.fonts.size + 1)}";
terminal = cfg.terminal;
layer = "overlay";
lines = 12;
width = 40;
horizontal-pad = 24;
vertical-pad = 16;
inner-pad = 8;
};
colors = {
background = hexa c.base "f2";
text = hexa c.text "ff";
prompt = hexa c.subtext "ff";
placeholder = hexa c.muted "ff";
input = hexa c.text "ff";
match = hexa c.accent "ff";
selection = hexa c.surface "ff";
selection-text = hexa c.text "ff";
selection-match = hexa c.accent "ff";
border = hexa c.accent "ee";
};
border = {
width = t.ui.borderSize;
radius = t.ui.rounding;
};
};
};
xdg.configFile."fuzzel/fuzzel.ini" = lib.mkIf hasIniOverride {
source = iniOverride;
};
};
}

View File

@@ -127,7 +127,7 @@ in
bind = [
"$mod, Return, exec, $terminal"
"$mod, D, exec, fuzzel"
"$mod, D, exec, rofi -show drun"
"$mod, E, exec, $terminal -e yazi"
"$mod, Q, killactive"
"$mod, F, fullscreen"
@@ -140,7 +140,7 @@ in
# Cycle the current theme's wallpapers (instant, no rebuild).
"$mod SHIFT, T, exec, nomarchy-theme-sync bg next"
# Power menu (fuzzel dmenu via the nomarchy-menu dispatcher).
# Power menu (rofi dmenu via the nomarchy-menu dispatcher).
# Not Escape: Super+Escape gets swallowed before reaching the
# dispatcher on some setups (input methods / modal handling).
"$mod, X, exec, nomarchy-menu power"

View File

@@ -63,7 +63,7 @@
# ── Component toggles ──────────────────────────────────────────
hyprland.enable = lib.mkEnableOption "Nomarchy's Hyprland configuration" // { default = true; };
waybar.enable = lib.mkEnableOption "Nomarchy's Waybar configuration" // { default = true; };
fuzzel.enable = lib.mkEnableOption "Nomarchy's themed fuzzel + the nomarchy-menu dispatcher (power menu)" // { default = true; };
rofi.enable = lib.mkEnableOption "Nomarchy's themed rofi launcher + the nomarchy-menu dispatcher" // { default = true; };
swaync.enable = lib.mkEnableOption "swaync notifications, themed from the state file" // { default = true; };
idle.enable = lib.mkEnableOption "hyprlock + hypridle (idle lock, display off, suspend)" // { default = true; };
yazi.enable = lib.mkEnableOption "the yazi TUI file manager, themed with a curated plugin set" // { default = true; };

222
modules/home/rofi.nix Normal file
View File

@@ -0,0 +1,222 @@
# rofi (2.0, native Wayland on 26.05) — launcher + dmenu renderer for
# the menu system, themed from theme-state.json. rofi's .rasi is far more
# expressive than a flat scheme, so the generated theme styles each
# element (accent border, highlighted selection, rounded inputbar); a
# themes/<slug>/rofi.rasi whole-swap replaces it entirely.
#
# Home of nomarchy-menu, the dispatcher all menu modules hang off.
{ config, lib, pkgs, ... }:
let
cfg = config.nomarchy;
t = cfg.theme;
c = t.colors;
inherit (config.lib.formats.rasi) mkLiteral;
px = n: mkLiteral "${toString n}px";
# Per-theme override probe (same convention as waybar.css).
rasiOverride = cfg.themesDir + "/${t.slug}/rofi.rasi";
hasRasiOverride = builtins.pathExists rasiOverride;
nomarchy-menu = pkgs.writeShellScriptBin "nomarchy-menu" ''
# Nomarchy menu dispatcher thin presentation layer over
# `rofi -dmenu`; actions delegate to nomarchy-theme-sync, systemctl,
# hyprctl and friends. Icons are nf-md glyphs (Pango falls back to a
# Nerd Font for them). `nomarchy-menu` with no argument shows the
# module picker.
urlencode() {
local s="$1" out="" ch i
for ((i = 0; i < ''${#s}; i++)); do
ch=''${s:i:1}
case "$ch" in
[a-zA-Z0-9.~_-]) out+="$ch" ;;
' ') out+="+" ;;
*) printf -v ch '%%%02X' "'$ch"; out+="$ch" ;;
esac
done
printf '%s' "$out"
}
case "''${1:-}" in
power)
choice=$(printf '%s\n' \
"󰌾 Lock" \
"󰍃 Logout" \
"󰤄 Suspend" \
"󰒲 Hibernate" \
"󰜉 Reboot" \
"󰐥 Shutdown" \
| rofi -dmenu -p power) || exit 0
case "$choice" in
*Lock) loginctl lock-session ;;
*Logout) hyprctl dispatch exit ;;
*Suspend) systemctl suspend ;;
*Hibernate) systemctl hibernate ;;
*Reboot) systemctl reboot ;;
*Shutdown) systemctl poweroff ;;
esac ;;
theme)
choice=$(nomarchy-theme-sync list | rofi -dmenu -p theme) || exit 0
[ -n "$choice" ] && exec nomarchy-theme-sync apply "$choice" ;;
clipboard)
sel=$(cliphist list | rofi -dmenu -p clip) || exit 0
printf '%s' "$sel" | cliphist decode | wl-copy ;;
calc)
expr=$(rofi -dmenu -p "= " < /dev/null) || exit 0
[ -n "$expr" ] || exit 0
result=$(qalc -t -- "$expr" 2>&1 | tail -n 1)
choice=$(printf '%s\n' "󰆏 Copy result" "󰃬 New calculation" \
| rofi -dmenu -p "= " -mesg "$expr = $result") || exit 0
case "$choice" in
*Copy*) printf '%s' "$result" | wl-copy ;;
*New*) exec "$0" calc ;;
esac ;;
files)
sel=$(fd . "$HOME" --type f --hidden --exclude .git --exclude .cache 2>/dev/null \
| head -n 50000 \
| sed "s|^$HOME/||" \
| rofi -dmenu -p file) || exit 0
[ -n "$sel" ] && exec xdg-open "$HOME/$sel" ;;
web)
q=$(rofi -dmenu -p search < /dev/null) || exit 0
[ -n "$q" ] || exit 0
exec xdg-open "https://duckduckgo.com/?q=$(urlencode "$q")" ;;
"")
choice=$(printf '%s\n' \
"󰀻 Apps" \
"󰏘 Theme" \
"󰅌 Clipboard" \
"󰃬 Calculator" \
"󰈞 Files" \
"󰖟 Web search" \
"󰐥 Power" \
| rofi -dmenu -p menu) || exit 0
case "$choice" in
*Apps*) exec rofi -show drun ;;
*Theme*) exec "$0" theme ;;
*Clipboard*) exec "$0" clipboard ;;
*Calc*) exec "$0" calc ;;
*Files*) exec "$0" files ;;
*Web*) exec "$0" web ;;
*Power*) exec "$0" power ;;
esac ;;
*)
echo "usage: nomarchy-menu [power|theme|clipboard|calc|files|web]" >&2
exit 64 ;;
esac
'';
in
{
config = lib.mkIf cfg.rofi.enable {
home.packages = [
nomarchy-menu
pkgs.libqalculate # qalc, the calc module's engine
pkgs.fd # files module
pkgs.xdg-utils # xdg-open for files/web
];
programs.rofi = {
enable = true;
terminal = cfg.terminal;
font = "${t.fonts.ui} 12";
extraConfig = {
modi = "drun,run";
show-icons = false; # no icon theme shipped yet — clean text list
drun-display-format = "{name}";
display-drun = "apps";
display-run = "run";
};
# Whole-swap themes bring their own rofi.rasi; otherwise the theme
# is generated from the palette.
theme =
if hasRasiOverride then rasiOverride
else {
"*" = {
bg = mkLiteral c.base;
fg = mkLiteral c.text;
dim = mkLiteral c.subtext;
surface = mkLiteral c.surface;
accent = mkLiteral c.accent;
background-color = mkLiteral "transparent";
text-color = mkLiteral "@fg";
margin = 0;
padding = 0;
spacing = 0;
};
"window" = {
background-color = mkLiteral "@bg";
border = px t.ui.borderSize;
border-color = mkLiteral "@accent";
border-radius = px t.ui.rounding;
width = mkLiteral "40%";
padding = px 8;
};
"mainbox" = {
children = map mkLiteral [ "inputbar" "message" "listview" ];
};
"inputbar" = {
background-color = mkLiteral "@surface";
border-radius = px t.ui.rounding;
padding = mkLiteral "8px 12px";
spacing = px 8;
children = map mkLiteral [ "prompt" "entry" ];
};
"prompt" = { text-color = mkLiteral "@accent"; };
"entry" = {
placeholder = "Search";
placeholder-color = mkLiteral "@dim";
};
"listview" = {
lines = 8;
columns = 1;
dynamic = true;
scrollbar = false;
spacing = px 2;
padding = mkLiteral "8px 0px 0px 0px";
};
"element" = {
padding = mkLiteral "8px 12px";
border-radius = px t.ui.rounding;
spacing = px 8;
};
"element selected" = {
background-color = mkLiteral "@accent";
text-color = mkLiteral "@bg";
};
"element-icon" = {
background-color = mkLiteral "transparent";
size = mkLiteral "1em";
};
"element-text" = {
background-color = mkLiteral "transparent";
text-color = mkLiteral "inherit";
};
"message" = { padding = mkLiteral "8px 0px 0px 0px"; };
"textbox" = {
background-color = mkLiteral "@surface";
text-color = mkLiteral "@fg";
border-radius = px t.ui.rounding;
padding = mkLiteral "8px 12px";
};
};
};
};
}

View File

@@ -1,5 +1,5 @@
# yazi — the flagship file manager: a fast, keyboard-driven TUI that
# fits the distro's identity (Ghostty's Kitty-graphics previews, fuzzel
# fits the distro's identity (Ghostty's Kitty-graphics previews, rofi
# menus, everything from one JSON). Themed from theme-state.json and
# shipped with a curated plugin set. The GUI half (Thunar, "open folder"
# handler) is nomarchy.system.fileManager on the system side.

14
todo.md Normal file
View File

@@ -0,0 +1,14 @@
# Items to do
## one item per commit in the repo
- Let's add some type of progress bar for when the user switch themes? That way we can have a visual feedback instead of the user thinking the selection failed
- Let's add icon themes and make sure each theme selects an icon theme to use (and that the icon theme is pulled for installation)
- Let's install starship or some other tool to make the terminal look nice. We can configure it nicely by default
- We can also add tools and set aliases, for example change cat for bat, grep for ripgrep, etc...
- We can install by default for the user applications to make it a complete desktop workstation, such as vscode, libreoffice, gimp, inkscape, texlivefull. Maybe we should also add a way for the user to "turn off" any of those apps if the user does not want them installed
- Let's tweak the Nomarchy plymouth theme. The logo is too dark and the constrast does not look good with the dark background
- When the machine hibernates the user already needs to type the luks password to resume it. However, the screen gets locked by hyprlock anyway and the user needs to enter the password twice
- Let's have a rofi menu item that shows all the current assigned keybindings
- We can assign SUPER+Space for rofi dmenu and SUPER+m for the main menu.