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" ''