diff --git a/core/default.nix b/core/default.nix
index 941e53c..408aefa 100644
--- a/core/default.nix
+++ b/core/default.nix
@@ -5,6 +5,8 @@
./system/options.nix
./system/state.nix
./system/systemd.nix
+ ./system/virtualization.nix
+ ./system/fonts.nix
../themes/engine/plymouth.nix
../themes/engine/sddm.nix
./system/hardware.nix
diff --git a/core/home/behavior.nix b/core/home/behavior.nix
index 32dc6b3..bac8aea 100644
--- a/core/home/behavior.nix
+++ b/core/home/behavior.nix
@@ -15,7 +15,7 @@
# - Environment variables
let
- configDir = ../../config;
+ configDir = ./config;
overridesDir = "${config.home.homeDirectory}/.config/nomarchy/overrides";
# Check if user has an override for a specific config
diff --git a/core/home/config/nomarchy/default/hypr/autostart.conf b/core/home/config/nomarchy/default/hypr/autostart.conf
index 45bbae7..ce857ec 100644
--- a/core/home/config/nomarchy/default/hypr/autostart.conf
+++ b/core/home/config/nomarchy/default/hypr/autostart.conf
@@ -4,7 +4,7 @@ exec-once = uwsm-app -- mako
exec-once = uwsm-app -- fcitx5 --disable notificationitem
exec-once = uwsm-app -- swaybg -i ~/.config/nomarchy/current/background -m fill
exec-once = uwsm-app -- swayosd-server
-exec-once = nomarchy-cmd-first-run
+exec-once = nomarchy-on-boot
# Slow app launch fix -- set systemd vars
exec-once = systemctl --user import-environment $(env | cut -d'=' -f 1)
diff --git a/core/home/config/nomarchy/default/hypr/bindings/utilities.conf b/core/home/config/nomarchy/default/hypr/bindings/utilities.conf
index 6a32518..e884bf9 100644
--- a/core/home/config/nomarchy/default/hypr/bindings/utilities.conf
+++ b/core/home/config/nomarchy/default/hypr/bindings/utilities.conf
@@ -1,6 +1,6 @@
# Menus
-bindd = SUPER, SPACE, Launch apps, exec, nomarchy-launch-walker
-bindd = SUPER CTRL, E, Emoji picker, exec, nomarchy-launch-walker -m symbols
+bindd = SUPER, SPACE, Launch apps, exec, nomarchy-menu
+bindd = SUPER CTRL, E, Emoji picker, exec, nomarchy-menu symbols
bindd = SUPER CTRL, C, Capture menu, exec, nomarchy-menu capture
bindd = SUPER CTRL, O, Toggle menu, exec, nomarchy-menu toggle
bindd = SUPER ALT, SPACE, Nomarchy menu, exec, nomarchy-menu
diff --git a/core/home/config/nomarchy/default/hypr/looknfeel.conf b/core/home/config/nomarchy/default/hypr/looknfeel.conf
index 24e0443..80ab2ca 100644
--- a/core/home/config/nomarchy/default/hypr/looknfeel.conf
+++ b/core/home/config/nomarchy/default/hypr/looknfeel.conf
@@ -79,7 +79,7 @@ group {
# https://wiki.hyprland.org/Configuring/Variables/#animations
animations {
- enabled = yes, please :)
+ enabled = yes
# Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
diff --git a/core/home/configs.nix b/core/home/configs.nix
index a6d3a4d..9a5b23e 100644
--- a/core/home/configs.nix
+++ b/core/home/configs.nix
@@ -1,30 +1,21 @@
{ config, pkgs, lib, ... }:
let
- configDir = ../../config;
+ configDir = ./config;
# Explicit list of config items to manage
# This replaces dynamic builtins.readDir for clarity and faster evaluation
configItems = {
# Directories
- btop = "directory";
- chromium = "directory";
- elephant = "directory";
"environment.d" = "directory";
fastfetch = "directory";
fcitx5 = "directory";
fontconfig = "directory";
- ghostty = "directory";
git = "directory";
- hypr = "directory";
- "hyprland-preview-share-picker" = "directory";
imv = "directory";
- kitty = "directory";
- lazygit = "directory";
+ "nautilus-python" = "directory";
nomarchy = "directory";
- opencode = "directory";
- systemd = "directory";
- tmux = "directory";
+ "nomarchy-skill" = "directory";
Typora = "directory";
uwsm = "directory";
wiremix = "directory";
diff --git a/core/home/fonts.nix b/core/home/fonts.nix
index f262145..96c959c 100644
--- a/core/home/fonts.nix
+++ b/core/home/fonts.nix
@@ -3,6 +3,5 @@
{
config = {
fonts.fontconfig.enable = lib.mkDefault true;
- xdg.dataFile."fonts/nomarchy.ttf".source = lib.mkDefault ../../config/nomarchy.ttf;
};
}
diff --git a/core/home/options.nix b/core/home/options.nix
index a9b6545..a0f2a34 100644
--- a/core/home/options.nix
+++ b/core/home/options.nix
@@ -41,7 +41,7 @@
};
theme = lib.mkOption {
type = lib.types.str;
- default = "nord";
+ default = "summer-night";
description = "System theme name.";
};
wallpaper = lib.mkOption {
diff --git a/core/home/state.nix b/core/home/state.nix
index ee3aab9..23fcb36 100644
--- a/core/home/state.nix
+++ b/core/home/state.nix
@@ -1,8 +1,8 @@
{ config, lib, ... }:
let
- nomarchyLib = import ../lib { inherit lib; };
- assetsPath = ../../assets/themes;
+ nomarchyLib = import ../../lib { inherit lib; };
+ assetsPath = ../../themes/palettes;
# Read unified state from ~/.config/nomarchy/state.json
togglesState = nomarchyLib.readHomeState config.home.homeDirectory;
@@ -19,7 +19,7 @@ in
skipVsCodeTheme = togglesState.skipVsCodeTheme or false;
};
nightlightTemperature = togglesState.nightlightTemperature or 4000;
- theme = togglesState.theme or "nord";
+ theme = togglesState.theme or "summer-night";
wallpaper = togglesState.wallpaper or "";
hyprland = {
gaps_in = togglesState.hyprland.gaps_in or 5;
@@ -30,11 +30,11 @@ in
# Derived properties from the theme directory
isLightMode = nomarchyLib.isThemeLightMode {
- themeName = togglesState.theme or "nord";
+ themeName = togglesState.theme or "summer-night";
inherit assetsPath;
};
iconsTheme = nomarchyLib.getIconsTheme {
- themeName = togglesState.theme or "nord";
+ themeName = togglesState.theme or "summer-night";
inherit assetsPath;
};
};
diff --git a/core/system/fonts.nix b/core/system/fonts.nix
new file mode 100644
index 0000000..5c553ae
--- /dev/null
+++ b/core/system/fonts.nix
@@ -0,0 +1,23 @@
+{ pkgs, ... }:
+
+let
+ nomarchy-font = pkgs.stdenv.mkDerivation {
+ pname = "nomarchy-font";
+ version = "1.0";
+ # Pull from core/home/config where the ttf is located
+ src = ./../home/config;
+ installPhase = ''
+ mkdir -p $out/share/fonts/truetype
+ cp nomarchy.ttf $out/share/fonts/truetype/
+ '';
+ };
+in
+{
+ fonts.packages = [
+ nomarchy-font
+ pkgs.nerd-fonts.jetbrains-mono
+ pkgs.nerd-fonts.roboto-mono
+ pkgs.nerd-fonts.fira-code
+ pkgs.nerd-fonts.ubuntu-mono
+ ];
+}
diff --git a/core/system/options.nix b/core/system/options.nix
index df31e79..3813aae 100644
--- a/core/system/options.nix
+++ b/core/system/options.nix
@@ -48,7 +48,7 @@
};
theme = lib.mkOption {
type = lib.types.str;
- default = "nord";
+ default = "summer-night";
description = "Selected system theme.";
};
};
diff --git a/core/system/state.nix b/core/system/state.nix
index ae7cdf4..989471b 100644
--- a/core/system/state.nix
+++ b/core/system/state.nix
@@ -1,7 +1,7 @@
{ lib, ... }:
let
- nomarchyLib = import ../lib { inherit lib; };
+ nomarchyLib = import ../../lib { inherit lib; };
systemState = nomarchyLib.readSystemState;
in
{
diff --git a/core/system/virtualization.nix b/core/system/virtualization.nix
new file mode 100644
index 0000000..d475d0f
--- /dev/null
+++ b/core/system/virtualization.nix
@@ -0,0 +1,11 @@
+{ lib, ... }:
+
+{
+ programs.uwsm = {
+ enable = lib.mkDefault true;
+ waylandCompositors.hyprland = {
+ binPath = "/run/current-system/sw/bin/Hyprland";
+ prettyName = "Hyprland";
+ };
+ };
+}
diff --git a/core/system/vm-guest.nix b/core/system/vm-guest.nix
index 3de4ea5..5aeee49 100644
--- a/core/system/vm-guest.nix
+++ b/core/system/vm-guest.nix
@@ -4,12 +4,12 @@
# Shared VM configuration
virtualisation.vmVariant = {
virtualisation.graphics = true;
- virtualisation.qemu.options = [ "-device virtio-vga" ];
+ virtualisation.qemu.options = [ "-device" "virtio-vga" ];
};
# Dummy hardware config for VM
- fileSystems."/" = { device = "/dev/disk/by-label/nixos"; };
- boot.loader.grub.device = "/dev/vda";
+ fileSystems."/" = lib.mkDefault { device = "/dev/disk/by-label/nixos"; };
+ boot.loader.grub.device = lib.mkDefault "/dev/vda";
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_blk" "virtio_gpu" "virtio_net" "virtio_mmio" ];
# Force early KMS for Plymouth
diff --git a/features/apps/browser.nix b/features/apps/browser.nix
index 9634ffb..5efbe79 100644
--- a/features/apps/browser.nix
+++ b/features/apps/browser.nix
@@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }:
let
- nomarchyLib = import ../lib { inherit lib; };
+ nomarchyLib = import ../../lib { inherit lib; };
activeThemeName = config.nomarchy.system.theme;
currentPalette = nomarchyLib.getPalette activeThemeName;
@@ -11,7 +11,7 @@ let
# Detect light mode from theme name or palette
isLightTheme = nomarchyLib.isThemeLightMode {
themeName = activeThemeName;
- assetsPath = ../../assets/themes;
+ assetsPath = ../../themes/palettes;
};
browserPolicy = {
diff --git a/features/apps/vscode.nix b/features/apps/vscode.nix
index 7e71c48..93c6858 100644
--- a/features/apps/vscode.nix
+++ b/features/apps/vscode.nix
@@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }:
let
- themeConfig = builtins.fromJSON (builtins.readFile (../../assets/themes + "/${config.nomarchy.theme}/vscode.json"));
+ themeConfig = builtins.fromJSON (builtins.readFile (../../themes/palettes + "/${config.nomarchy.theme}/vscode.json"));
# Development extensions that match the system theme
devExtensions = with pkgs.vscode-extensions; [
diff --git a/features/default.nix b/features/default.nix
index 346e3d7..31e3471 100644
--- a/features/default.nix
+++ b/features/default.nix
@@ -39,6 +39,7 @@ in
../core/home/bash.nix
];
+
colorScheme = lib.mkDefault (nomarchyLib.getColorScheme config.nomarchy.theme);
# Enable neovim program module (required for stylix integration)
@@ -73,15 +74,13 @@ in
xmlstarlet
mise
gum # TUI components for scripts
+ xdg-terminal-exec
+ swaybg
+ rofi-wayland
# Theming
yaru-theme
+ everforest-gtk-variant
bibata-cursors
-
- # Fonts
- nerd-fonts.jetbrains-mono
- nerd-fonts.roboto-mono
- nerd-fonts.fira-code
- nerd-fonts.ubuntu-mono
] ++ userPackages);
}
diff --git a/features/desktop/hyprland/config/bindings.conf b/features/desktop/hyprland/config/bindings.conf
index e5ea97d..2e55d45 100644
--- a/features/desktop/hyprland/config/bindings.conf
+++ b/features/desktop/hyprland/config/bindings.conf
@@ -1,6 +1,6 @@
# Application bindings
-bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(nomarchy-cmd-terminal-cwd)"
-bindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec --dir="$(nomarchy-cmd-terminal-cwd)" bash -c "tmux attach || tmux new -s Work"
+bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec || uwsm-app -- alacritty
+bindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec bash -c "tmux attach || tmux new -s Work"
bindd = SUPER SHIFT, RETURN, Browser, exec, nomarchy-launch-browser
bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(nomarchy-cmd-terminal-cwd)"
diff --git a/features/desktop/hyprland/config/nomarchy.conf b/features/desktop/hyprland/config/nomarchy.conf
index 73b36fd..3d7339a 100644
--- a/features/desktop/hyprland/config/nomarchy.conf
+++ b/features/desktop/hyprland/config/nomarchy.conf
@@ -9,6 +9,7 @@
source = ~/.config/nomarchy/default/hypr/envs.conf
# Keybindings
+source = ~/.config/hypr/bindings.conf
source = ~/.config/nomarchy/default/hypr/bindings/media.conf
source = ~/.config/nomarchy/default/hypr/bindings/clipboard.conf
source = ~/.config/nomarchy/default/hypr/bindings/tiling-v2.conf
@@ -31,7 +32,6 @@ source = ~/.config/nomarchy/default/hypr/looknfeel.conf
# ============================================================================
# Theme colors - loaded from the currently active theme
source = ~/.config/nomarchy/current/theme/hyprland.conf
-
# ============================================================================
# USER OVERRIDES
# ============================================================================
@@ -39,9 +39,7 @@ source = ~/.config/nomarchy/current/theme/hyprland.conf
source = ~/.config/hypr/monitors.conf
source = ~/.config/hypr/input.conf
-source = ~/.config/hypr/bindings.conf
-source = ~/.config/hypr/looknfeel.conf
-source = ~/.config/hypr/autostart.conf
# Add any other personal Hyprland configuration below
+
# windowrule = workspace 5, match:class qemu
diff --git a/features/desktop/hyprland/default.nix b/features/desktop/hyprland/default.nix
index 5326a84..42d4899 100644
--- a/features/desktop/hyprland/default.nix
+++ b/features/desktop/hyprland/default.nix
@@ -1,8 +1,8 @@
{ config, pkgs, lib, ... }:
let
- nomarchyLib = import ../lib { inherit lib; };
- assetsPath = ../../assets/themes;
+ nomarchyLib = import ../../../lib { inherit lib; };
+ assetsPath = ../../../themes/palettes;
# Use shared wallpaper resolver
activeWallpaper = nomarchyLib.resolveWallpaper {
@@ -21,6 +21,7 @@ in
wayland.windowManager.hyprland = {
enable = lib.mkDefault true;
+ systemd.enable = lib.mkDefault false;
settings = lib.mkDefault {
"debug" = {
"disable_logs" = false;
@@ -41,4 +42,12 @@ in
source = ~/.config/hypr/nomarchy.conf
'';
};
+
+ # Deploy Hyprland configuration files
+ xdg.configFile."hypr/nomarchy.conf".source = ./config/nomarchy.conf;
+ xdg.configFile."hypr/monitors.conf".source = lib.mkDefault ./config/monitors.conf;
+ xdg.configFile."hypr/input.conf".source = lib.mkDefault ./config/input.conf;
+ xdg.configFile."hypr/bindings.conf".source = lib.mkDefault ./config/bindings.conf;
+ xdg.configFile."hypr/looknfeel.conf".source = lib.mkDefault ./config/looknfeel.conf;
+ xdg.configFile."hypr/autostart.conf".source = lib.mkDefault ./config/autostart.conf;
}
diff --git a/features/desktop/waybar/config/config.jsonc b/features/desktop/waybar/config/config.jsonc
index cc1723c..4fad304 100644
--- a/features/desktop/waybar/config/config.jsonc
+++ b/features/desktop/waybar/config/config.jsonc
@@ -138,13 +138,13 @@
},
"custom/screenrecording-indicator": {
"on-click": "nomarchy-cmd-screenrecord",
- "exec": "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh",
+ "exec": "~/.config/nomarchy/default/waybar/indicators/screen-recording.sh",
"signal": 8,
"return-type": "json"
},
"custom/idle-indicator": {
"on-click": "nomarchy-toggle-idle",
- "exec": "$OMARCHY_PATH/default/waybar/indicators/idle.sh",
+ "exec": "~/.config/nomarchy/default/waybar/indicators/idle.sh",
"signal": 9,
"return-type": "json"
},
diff --git a/features/desktop/waybar/themes/nord/style.css b/features/desktop/waybar/themes/nord/style.css
new file mode 100644
index 0000000..5238598
--- /dev/null
+++ b/features/desktop/waybar/themes/nord/style.css
@@ -0,0 +1,14 @@
+@define-color background #2e3440;
+@define-color foreground #d8dee9;
+@define-color accent #88c0d0;
+
+/* Base style for Nord */
+* {
+ font-family: JetBrainsMono Nerd Font, FontAwesome;
+ font-size: 13px;
+}
+
+window#waybar {
+ background-color: @background;
+ color: @foreground;
+}
diff --git a/features/desktop/waybar/themes/summer-night/config.jsonc b/features/desktop/waybar/themes/summer-night/config.jsonc
index 0b73c75..fa0b5d9 100644
--- a/features/desktop/waybar/themes/summer-night/config.jsonc
+++ b/features/desktop/waybar/themes/summer-night/config.jsonc
@@ -7,9 +7,9 @@
"layer": "top",
"position": "top",
"spacing": 15,
- "modules-left": ["custom/launcher", "clock", "clock#date"],
+ "modules-left": ["custom/nomarchy", "clock", "clock#date"],
"modules-center": ["hyprland/workspaces"],
- "modules-right": ["idle_inhibitor", "pulseaudio", "custom/battery", "backlight", "tray", "custom/powermenu"],
+ "modules-right": ["custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator", "idle_inhibitor", "pulseaudio", "custom/battery", "backlight", "tray", "custom/powermenu"],
"hyprland/workspaces": {
"disable-scroll": true,
@@ -36,13 +36,57 @@
"spacing": 5
},
- "custom/launcher": {
+ "custom/nomarchy": {
"interval": "once",
- "format": "",
- "on-click": "pkill rofi || rofi -show drun",
+ "format": "a",
+ "on-click": "nomarchy-menu",
"tooltip-format": "Application Launcher"
},
+ "custom/update": {
+ "format": "",
+ "exec": "nomarchy-update-available",
+ "on-click": "nomarchy-launch-floating-terminal-with-presentation nomarchy-update",
+ "tooltip-format": "Nomarchy update available",
+ "signal": 7,
+ "interval": 21600
+ },
+
+ "custom/screenrecording-indicator": {
+ "on-click": "nomarchy-cmd-screenrecord",
+ "exec": "~/.config/nomarchy/default/waybar/indicators/screen-recording.sh",
+ "signal": 8,
+ "return-type": "json"
+ },
+
+ "custom/idle-indicator": {
+ "on-click": "nomarchy-toggle-idle",
+ "exec": "~/.config/nomarchy/default/waybar/indicators/idle.sh",
+ "signal": 9,
+ "return-type": "json"
+ },
+
+ "custom/notification-silencing-indicator": {
+ "on-click": "nomarchy-toggle-notification-silencing",
+ "exec": "~/.config/nomarchy/default/waybar/indicators/notification-silencing.sh",
+ "signal": 10,
+ "return-type": "json"
+ },
+
+ "custom/voxtype": {
+ "exec": "nomarchy-voxtype-status",
+ "return-type": "json",
+ "format": "{icon}",
+ "format-icons": {
+ "idle": "",
+ "recording": "",
+ "transcribing": ""
+ },
+ "tooltip": true,
+ "on-click-right": "nomarchy-voxtype-config",
+ "on-click": "nomarchy-voxtype-model"
+ },
+
"backlight": {
"max-length": "4",
"format": "{icon} {percent}%",
@@ -83,8 +127,8 @@
"car": "",
"default": ["", "", ""]
},
- "on-click": "mute-vol",
- "on-click-middle": "audio-menu",
+ "on-click": "pamixer -t",
+ "on-click-middle": "nomarchy-launch-audio",
"on-click-right": "pavucontrol",
"tooltip-format": "{icon} {desc} | {volume}%"
},
@@ -93,14 +137,14 @@
"format-wifi": " {signalStrength}%",
"format-ethernet": " {signalStrength}%",
"format-disconnected": "",
- "on-click": ""
+ "on-click": "nomarchy-launch-wifi"
},
"custom/battery": {
"interval": 30,
"format": "{}",
- "exec": "waybar-battery-status",
- "on-click": "power-menu"
+ "exec": "nomarchy-battery-status",
+ "on-click": "nomarchy-menu power"
},
"clock": {
diff --git a/features/scripts/default.nix b/features/scripts/default.nix
index bb7743b..79ba1fb 100644
--- a/features/scripts/default.nix
+++ b/features/scripts/default.nix
@@ -80,69 +80,23 @@ let
nomarchy-scripts = pkgs.stdenv.mkDerivation {
pname = "nomarchy-scripts";
version = "1.0.0";
- src = ../../bin;
+ src = ./utils;
nativeBuildInputs = [ pkgs.makeWrapper ];
installPhase = ''
mkdir -p $out/bin
-
- # Copy scripts preserving directory structure for category detection
- for category in appearance apps hardware system utils wm; do
- if [ -d "$category" ]; then
- for script in "$category"/*; do
- if [ -f "$script" ]; then
- cp "$script" "$out/bin/"
- fi
- done
- fi
- done
+ cp * $out/bin/
chmod +x $out/bin/*
patchShebangs $out/bin
'';
postFixup = ''
- # Wrap scripts with category-specific dependencies
+ # Wrap all scripts with all dependencies for robustness
+ deps="${lib.makeBinPath allDeps}"
for file in $out/bin/*; do
if [ -f "$file" ]; then
- scriptName=$(basename "$file")
-
- # Determine category from original source location
- category=""
- for cat in appearance apps hardware system utils wm; do
- if [ -f "$src/$cat/$scriptName" ]; then
- category="$cat"
- break
- fi
- done
-
- # Select dependencies based on category
- case "$category" in
- appearance)
- deps="${lib.makeBinPath (coreDeps ++ categoryDeps.appearance)}"
- ;;
- apps)
- deps="${lib.makeBinPath (coreDeps ++ categoryDeps.apps)}"
- ;;
- hardware)
- deps="${lib.makeBinPath (coreDeps ++ categoryDeps.hardware)}"
- ;;
- system)
- deps="${lib.makeBinPath (coreDeps ++ categoryDeps.system)}"
- ;;
- utils)
- deps="${lib.makeBinPath (coreDeps ++ categoryDeps.utils)}"
- ;;
- wm)
- deps="${lib.makeBinPath (coreDeps ++ categoryDeps.wm)}"
- ;;
- *)
- # Fallback to all deps for unknown categories
- deps="${lib.makeBinPath allDeps}"
- ;;
- esac
-
wrapProgram "$file" \
--prefix PATH : "$deps" \
${envWrapperArgs}
diff --git a/features/scripts/utils/nomarchy-launch-walker b/features/scripts/utils/nomarchy-launch-walker
new file mode 100644
index 0000000..579e59b
--- /dev/null
+++ b/features/scripts/utils/nomarchy-launch-walker
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# Wrapper to launch walker with elephant provider, or fallback to rofi if walker is missing.
+
+if command -v walker >/dev/null 2>&1; then
+ if ! pgrep -x elephant > /dev/null; then
+ setsid uwsm-app -- elephant &
+ fi
+ exec uwsm-app -- walker "$@"
+elif command -v rofi >/dev/null 2>&1; then
+ # Convert walker arguments to rofi arguments if possible
+ # This is a very basic mapping for --dmenu
+ if [[ "$*" == *"--dmenu"* ]]; then
+ exec rofi -dmenu "$@"
+ else
+ exec rofi -show drun
+ fi
+else
+ notify-send "Error" "Neither walker nor rofi found." -u critical
+ exit 1
+fi
diff --git a/features/scripts/utils/nomarchy-refresh-config b/features/scripts/utils/nomarchy-refresh-config
new file mode 100644
index 0000000..a7c5921
--- /dev/null
+++ b/features/scripts/utils/nomarchy-refresh-config
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+# nomarchy-refresh-config: Restore a specific configuration file to its stock version.
+# Usage: nomarchy-refresh-config
+# Example: nomarchy-refresh-config hypr/hyprland.conf
+
+CONFIG_FILE=$1
+
+if [[ -z $CONFIG_FILE ]]; then
+ echo "Usage: nomarchy-refresh-config "
+ exit 1
+fi
+
+# Determine source directory (where stock configs are stored)
+# In Nomarchy, we deploy them via Nix, but we also keep a copy in local share for easy access
+STOCK_DIR="$HOME/.local/share/nomarchy/themes" # Fallback if specific config isn't themed
+# Wait, actually we should use the one from /etc/nixos if available
+STOCK_BASE="/etc/nixos/nomarchy/core/home/config"
+
+if [ ! -d "$STOCK_BASE" ]; then
+ # Fallback to local share if /etc/nixos is not available
+ STOCK_BASE="$HOME/.local/share/nomarchy/config"
+fi
+
+SOURCE_FILE="$STOCK_BASE/$CONFIG_FILE"
+DEST_FILE="$HOME/.config/$CONFIG_FILE"
+
+if [ ! -f "$SOURCE_FILE" ]; then
+ # Try searching in features/ as well
+ STOCK_BASE="/etc/nixos/nomarchy/features"
+ # Find the file in features
+ SOURCE_FILE=$(find "$STOCK_BASE" -name "$(basename "$CONFIG_FILE")" | head -n 1)
+fi
+
+if [[ -n $SOURCE_FILE ]] && [[ -f "$SOURCE_FILE" ]]; then
+ echo "Refreshing $DEST_FILE from stock $SOURCE_FILE..."
+ mkdir -p "$(dirname "$DEST_FILE")"
+ cp "$SOURCE_FILE" "$DEST_FILE"
+ notify-send "Config Refreshed" "$CONFIG_FILE has been restored to defaults."
+else
+ echo "Error: Stock configuration for $CONFIG_FILE not found."
+ notify-send -u critical "Error" "Stock configuration for $CONFIG_FILE not found."
+ exit 1
+fi
diff --git a/features/scripts/utils/nomarchy-toggle-waybar b/features/scripts/utils/nomarchy-toggle-waybar
new file mode 100644
index 0000000..80eef59
--- /dev/null
+++ b/features/scripts/utils/nomarchy-toggle-waybar
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+# nomarchy-toggle-waybar: Toggle the Waybar status bar on and off.
+
+if pgrep -x waybar > /dev/null; then
+ pkill waybar
+else
+ # Start waybar in the background using uwsm
+ uwsm-app -- waybar &
+fi
diff --git a/lib/default.nix b/lib/default.nix
index 34a101f..01cd641 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -4,12 +4,17 @@
let
# Import theme palettes once - used by multiple modules
- palettes = import ../themes/palettes;
+ palettes = import ./../themes/palettes;
# Unified state reading function
# Handles both JSON and plain text files with graceful fallbacks
readState = { file, default }:
- if builtins.pathExists file then
+ let
+ # In pure evaluation mode (like nix build .#vm), absolute paths as strings
+ # will cause an error in pathExists/readFile.
+ isFileSafe = ! (builtins.isString file && lib.hasPrefix "/" file);
+ in
+ if isFileSafe && builtins.pathExists file then
let
content = builtins.readFile file;
cleanContent = lib.removeSuffix "\n" content;
@@ -31,7 +36,7 @@ let
# Read system state
readSystemState =
readState {
- file = /etc/nixos/state.json;
+ file = "/etc/nixos/state.json";
default = {};
};
diff --git a/themes/engine/files.nix b/themes/engine/files.nix
index bcc456f..032e7b9 100644
--- a/themes/engine/files.nix
+++ b/themes/engine/files.nix
@@ -1,12 +1,16 @@
{ config, lib, ... }:
let
+ nomarchyLib = import ../../lib { inherit lib; };
themePath = ../palettes + "/${config.nomarchy.theme}";
themeAppsPath = themePath + "/apps";
- nordAppsPath = ../palettes/nord/apps;
+ nordAppsPath = ../../features/desktop/hyprland/themes/nord;
# Check if theme has apps/hyprland.conf
hasHyprlandConf = builtins.pathExists (themeAppsPath + "/hyprland.conf");
+
+ # Get palette for dynamic CSS generation
+ palette = nomarchyLib.getPalette config.nomarchy.theme;
in
{
xdg.configFile."nomarchy/current/theme" = {
@@ -14,6 +18,14 @@ in
recursive = true;
};
+ # Generate waybar.css if it doesn't exist in the theme
+ # This provides the @background and @foreground variables used by the default style
+ xdg.configFile."nomarchy/current/theme/waybar.css".text = ''
+ @define-color background #${palette.base00};
+ @define-color foreground #${palette.base05};
+ @define-color accent #${palette.base0D};
+ '';
+
# Ensure theme-specific hyprland config exists, fallback to nord if not
# Now checking in apps/ subdirectory
xdg.configFile."nomarchy/current/theme/apps/hyprland.conf" = lib.mkIf (!hasHyprlandConf) {
diff --git a/themes/engine/loader.nix b/themes/engine/loader.nix
index efe4334..0db65a7 100644
--- a/themes/engine/loader.nix
+++ b/themes/engine/loader.nix
@@ -25,7 +25,7 @@
# └── preview.png
let
- nomarchyLib = import ../lib { inherit lib; };
+ nomarchyLib = import ../../lib { inherit lib; };
assetsPath = ../palettes;
activeTheme = config.nomarchy.theme;
themePath = assetsPath + "/${activeTheme}";
diff --git a/themes/engine/stylix.nix b/themes/engine/stylix.nix
index 7c5633a..b2127d0 100644
--- a/themes/engine/stylix.nix
+++ b/themes/engine/stylix.nix
@@ -18,7 +18,7 @@
# - waybar: Custom CSS with theme colors
let
- nomarchyLib = import ../lib { inherit lib; };
+ nomarchyLib = import ../../lib { inherit lib; };
assetsPath = ../palettes;
activeThemeName = config.nomarchy.theme;
@@ -36,6 +36,8 @@ in
{
imports = [ inputs.stylix.homeModules.stylix ];
+ xdg.configFile."nomarchy/current/background".source = activeWallpaper;
+
stylix = {
enable = lib.mkDefault true;
enableReleaseChecks = lib.mkDefault false;
diff --git a/themes/engine/switcher.nix b/themes/engine/switcher.nix
index 04075b7..6deb829 100644
--- a/themes/engine/switcher.nix
+++ b/themes/engine/switcher.nix
@@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }:
let
- nomarchyLib = import ../lib { inherit lib; };
+ nomarchyLib = import ../../lib { inherit lib; };
themeList = builtins.concatStringsSep "\\n" nomarchyLib.themeNames;
nomarchy-theme-selector = pkgs.writeShellScriptBin "nomarchy-theme-selector" ''