diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed4cef0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +./omarchy_ref/* diff --git a/configuration.nix b/configuration.nix index da59d8c..175aea5 100644 --- a/configuration.nix +++ b/configuration.nix @@ -20,6 +20,12 @@ in ./modules/lib.nix ./modules/core.nix ./modules/colors.nix + ./modules/boot.nix + ./modules/security.nix + ./modules/fastfetch.nix + ./modules/walker.nix + ./modules/scripts.nix + ./modules/menus.nix ./modules/desktop/hyprland.nix ./modules/packages.nix ./modules/development.nix @@ -59,7 +65,7 @@ in }; }; - # Bootloader + # Bootloader (now configured in boot.nix module) boot = { loader = { systemd-boot = { @@ -69,13 +75,6 @@ in efi.canTouchEfiVariables = true; }; - # Plymouth for boot splash - plymouth = { - enable = true; - theme = "bgrt"; # Use default theme for now - # themePackages = [ (pkgs.callPackage ./packages/plymouth-theme.nix {}) ]; - }; - # Kernel kernelPackages = pkgs.linuxPackages_latest; }; @@ -152,6 +151,27 @@ in # Quick Setup - Choose a preset that matches your use case preset = "developer"; # Options: minimal, developer, creator, gamer, office, everything + # Security configuration + security = { + enable = true; + fingerprint = { + enable = false; # Set to true to enable fingerprint auth + autoDetect = true; # Auto-detect fingerprint hardware + }; + fido2 = { + enable = false; # Set to true to enable FIDO2 auth + autoDetect = true; # Auto-detect FIDO2 devices + }; + systemHardening = { + enable = true; # Enable security hardening + faillock = { + enable = true; # Enable account lockout protection + denyAttempts = 10; # Lock after 10 failed attempts + unlockTime = 120; # Unlock after 2 minutes + }; + }; + }; + # Color scheme configuration (optional) # Uncomment and customize these options for automatic color generation: # colorScheme = inputs.nix-colors.colorSchemes.tokyo-night-dark; @@ -178,4 +198,4 @@ in # exclude = [ "discord" "spotify" "steam" "teams" ]; }; }; -} \ No newline at end of file +} diff --git a/install.sh b/install.sh index 8684bc1..34d51ad 100755 --- a/install.sh +++ b/install.sh @@ -1,247 +1,618 @@ #!/usr/bin/env bash # OmniXY NixOS Installation Script -# This script helps install OmniXY on an existing NixOS system +# Stylized installer with Tokyo Night theme integration set -e -# Colors for output -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color +# Get terminal dimensions for centering +TERM_WIDTH=$(tput cols 2>/dev/null || echo 80) +TERM_HEIGHT=$(tput lines 2>/dev/null || echo 24) -# ASCII Art +# Tokyo Night Color Palette +BG='\033[48;2;26;27;38m' # #1a1b26 +FG='\033[38;2;192;202;245m' # #c0caf5 +BLUE='\033[38;2;122;162;247m' # #7aa2f7 +CYAN='\033[38;2;125;207;255m' # #7dcfff +GREEN='\033[38;2;158;206;106m' # #9ece6a +YELLOW='\033[38;2;224;175;104m' # #e0af68 +RED='\033[38;2;247;118;142m' # #f7768e +PURPLE='\033[38;2;187;154;247m' # #bb9af7 +ORANGE='\033[38;2;255;158;100m' # #ff9e64 +DARK_BLUE='\033[38;2;65;72;104m' # #414868 + +# Special effects +BOLD='\033[1m' +DIM='\033[2m' +UNDERLINE='\033[4m' +BLINK='\033[5m' +RESET='\033[0m' +CLEAR='\033[2J' +CURSOR_HOME='\033[H' + +# Utility functions +center_text() { + local text="$1" + local width=${2:-$TERM_WIDTH} + local padding=$(( (width - ${#text}) / 2 )) + printf "%*s%s\n" $padding "" "$text" +} + +draw_box() { + local width=${1:-60} + local height=${2:-3} + local char=${3:-"─"} + local corner_char=${4:-"╭╮╰╯"} + + # Top border + printf "${BLUE}%c" "${corner_char:0:1}" + for ((i=0; i/dev/null; do + printf "\r${CYAN}%c ${FG}%s${RESET}" "${spinner:$i:1}" "$message" + i=$(( (i+1) % ${#spinner} )) + sleep 0.1 + done + printf "\r${GREEN}✓ ${FG}%s${RESET}\n" "$message" +} + +# Set Tokyo Night terminal colors +setup_terminal() { + # Set background color for full terminal + printf "${BG}${CLEAR}${CURSOR_HOME}" + + # Set Tokyo Night color palette for terminal + printf '\033]4;0;color0\007' # Black + printf '\033]4;1;color1\007' # Red + printf '\033]4;2;color2\007' # Green + printf '\033]4;3;color3\007' # Yellow + printf '\033]4;4;color4\007' # Blue + printf '\033]4;5;color5\007' # Magenta + printf '\033]4;6;color6\007' # Cyan + printf '\033]4;7;color7\007' # White +} + +# Stylized banner with animations show_banner() { - echo -e "${BLUE}" - cat << 'EOF' - ▄▄▄ - ▄█████▄ ▄████▄ ██▄ ▄██ ██▄ ▄██ ▄██ ▄██ ▄█ ▄█ █▄ ▄█ █▄ -███ ███ ███ ███ ███▄ ▄███ ███ ███ ███ ███ ███ ███ ███ ███ ███ -███ ███ ███ ███ ████▀████ ███▄▄███ ███▄ ███ ███ ███ ███ ███ ███ -███ ███ ███ ███ ███ ███ ████████ █████████ ███ ▄███▄▄▄███▄ ███▄▄▄███ -███ ███ ███ ███ ███ ███ ███ ███ ███ █████ ███ ▀▀███▀▀▀███ ▀▀▀▀▀▀███ -███ ███ ███ ███ ███ ███ ███ ███ ███ ████ ███ ███ ███ ▄██ ███ -███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ - ▀█████▀ ▀████▀ ███ ███ ███ ███ ███ ███ ▀█ ███ █▀ ▀█████▀ + clear + setup_terminal - NixOS Edition -EOF - echo -e "${NC}" + # Add some vertical spacing + for ((i=0; i<3; i++)); do echo; done + + # Main logo with color gradient effect + echo + center_text "${CYAN}${BOLD}███████╗███╗ ███╗███╗ ██╗██╗██╗ ██╗██╗ ██╗" + center_text "██╔════╝████╗ ████║████╗ ██║██║╚██╗██╔╝╚██╗ ██╔╝" + center_text "${BLUE}██║ ██╔████╔██║██╔██╗ ██║██║ ╚███╔╝ ╚████╔╝ " + center_text "██║ ██║╚██╔╝██║██║╚██╗██║██║ ██╔██╗ ╚██╔╝ " + center_text "${PURPLE}███████╗██║ ╚═╝ ██║██║ ╚████║██║██╔╝ ██╗ ██║ " + center_text "╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═╝ ${RESET}" + echo + + # Subtitle with typewriter effect + printf "%*s" $(( (TERM_WIDTH - 60) / 2 )) "" + animate_text "🚀 Declarative • 🎨 Beautiful • ⚡ Fast" "$CYAN" 0.05 + echo + echo + + # Version and edition info + center_text "${DIM}${FG}NixOS Edition • Version 1.0 • Tokyo Night Theme${RESET}" + echo + + # Decorative border + printf "%*s" $(( (TERM_WIDTH - 60) / 2 )) "" + printf "${DARK_BLUE}" + for ((i=0; i<60; i++)); do printf "═"; done + printf "${RESET}\n" + echo } -# Check if running on NixOS +# Stylized section headers +section_header() { + local title="$1" + local icon="$2" + local width=60 + + echo + printf "%*s" $(( (TERM_WIDTH - width) / 2 )) "" + printf "${BLUE}╭" + for ((i=0; i/dev/null && sleep 0.3) & + loading_spinner $! "Updating home configuration" + + (sudo sed -i "s|home.homeDirectory = \"/home/user\"|home.homeDirectory = \"/home/$username\"|" /etc/nixos/home.nix 2>/dev/null && sleep 0.3) & + loading_spinner $! "Setting home directory" } -# Select theme +# Stylized theme selection select_theme() { - echo -e "${BLUE}🎨 Select a theme:${NC}" - echo "1) Tokyo Night (default)" - echo "2) Catppuccin" - echo "3) Gruvbox" - echo "4) Nord" - echo "5) Everforest" - echo "6) Rose Pine" - echo "7) Kanagawa" + section_header "Theme Selection" "🎨" - read -p "Enter choice (1-7): " THEME_CHOICE + local themes=( + "🌃 Tokyo Night - Dark theme with vibrant colors" + "🎀 Catppuccin - Pastel theme with modern aesthetics" + "🟤 Gruvbox - Retro theme with warm colors" + "❄️ Nord - Arctic theme with cool colors" + "🌲 Everforest - Green forest theme" + "🌹 Rose Pine - Cozy theme with muted colors" + "🌊 Kanagawa - Japanese-inspired theme" + "☀️ Catppuccin Latte - Light variant" + "⚫ Matte Black - Minimalist dark theme" + "💎 Osaka Jade - Jade green theme" + "☕ Ristretto - Coffee-inspired theme" + ) - case $THEME_CHOICE in - 2) THEME="catppuccin" ;; - 3) THEME="gruvbox" ;; - 4) THEME="nord" ;; - 5) THEME="everforest" ;; - 6) THEME="rose-pine" ;; - 7) THEME="kanagawa" ;; - *) THEME="tokyo-night" ;; - esac + for i in "${!themes[@]}"; do + local num=$((i + 1)) + center_text "${BOLD}${CYAN}$num.${RESET}${FG} ${themes[$i]}" + done - echo -e "${BLUE}Setting theme to: $THEME${NC}" - sudo sed -i "s/currentTheme = \".*\"/currentTheme = \"$THEME\"/" /etc/nixos/configuration.nix + echo + local theme_choice + theme_choice=$(get_input "Select theme (1-11)" "1" '[[ $1 =~ ^[1-9]$|^1[01]$ ]]') - echo -e "${GREEN}✓ Theme configured${NC}" + local theme_names=("tokyo-night" "catppuccin" "gruvbox" "nord" "everforest" "rose-pine" "kanagawa" "catppuccin-latte" "matte-black" "osaka-jade" "ristretto") + local selected_theme=${theme_names[$((theme_choice - 1))]} + + echo + center_text "${FG}Selected theme: ${CYAN}${BOLD}$selected_theme${RESET}" + + (sudo sed -i "s/currentTheme = \".*\"/currentTheme = \"$selected_theme\"/" /etc/nixos/configuration.nix && sleep 0.5) & + loading_spinner $! "Applying theme configuration" } -# Enable features +# Feature configuration with checkboxes configure_features() { - echo -e "${BLUE}🚀 Configure features:${NC}" + section_header "Feature Configuration" "⚙️ " - read -p "Enable Docker support? (y/n): " -n 1 -r + center_text "${FG}Configure optional features:${RESET}" echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - sudo sed -i 's/docker = false/docker = true/' /etc/nixos/configuration.nix + + # Security features + center_text "${BOLD}${PURPLE}Security Features:${RESET}" + printf "%*s" $(( (TERM_WIDTH - 40) / 2 )) "" + printf "${CYAN}Enable fingerprint authentication? (y/N): ${RESET}" + read -n 1 -r reply + echo + if [[ $reply =~ ^[Yy]$ ]]; then + center_text "${GREEN}✅ Fingerprint authentication enabled${RESET}" + sudo sed -i 's/enable = false;/enable = true;/' /etc/nixos/configuration.nix fi - read -p "Enable gaming support (Steam, Wine)? (y/n): " -n 1 -r + printf "%*s" $(( (TERM_WIDTH - 35) / 2 )) "" + printf "${CYAN}Enable FIDO2 security keys? (y/N): ${RESET}" + read -n 1 -r reply echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - sudo sed -i 's/gaming = false/gaming = true/' /etc/nixos/configuration.nix + if [[ $reply =~ ^[Yy]$ ]]; then + center_text "${GREEN}✅ FIDO2 authentication enabled${RESET}" fi - echo -e "${GREEN}✓ Features configured${NC}" + echo + center_text "${BOLD}${BLUE}Development Features:${RESET}" + printf "%*s" $(( (TERM_WIDTH - 30) / 2 )) "" + printf "${CYAN}Enable Docker support? (y/N): ${RESET}" + read -n 1 -r reply + echo + if [[ $reply =~ ^[Yy]$ ]]; then + center_text "${GREEN}✅ Docker support enabled${RESET}" + fi + + echo + center_text "${BOLD}${YELLOW}Gaming Features:${RESET}" + printf "%*s" $(( (TERM_WIDTH - 40) / 2 )) "" + printf "${CYAN}Enable gaming support (Steam, Wine)? (y/N): ${RESET}" + read -n 1 -r reply + echo + if [[ $reply =~ ^[Yy]$ ]]; then + center_text "${GREEN}✅ Gaming support enabled${RESET}" + fi } -# Generate hardware configuration if needed +# Hardware configuration generation generate_hardware_config() { + section_header "Hardware Configuration" "🔧" + if [ ! -f /etc/nixos/hardware-configuration.nix ]; then - echo -e "${BLUE}🔧 Generating hardware configuration...${NC}" - sudo nixos-generate-config --root / - echo -e "${GREEN}✓ Hardware configuration generated${NC}" + center_text "${FG}Generating hardware-specific configuration...${RESET}" + echo + + (sudo nixos-generate-config --root / && sleep 1) & + loading_spinner $! "Scanning hardware configuration" else - echo -e "${YELLOW}Hardware configuration already exists, skipping...${NC}" + center_text "${YELLOW}⚠️ Hardware configuration already exists${RESET}" + center_text "${DIM}${FG}Skipping hardware generation...${RESET}" + sleep 1 fi } -# Initialize git repository -# init_git() { -# echo -e "${BLUE}📚 Initializing git repository...${NC}" -# -# cd /etc/nixos -# -# if [ ! -d .git ]; then -# sudo git init -# sudo git add . -# sudo git commit -m "Initial Omarchy configuration" -# fi -# -# echo -e "${GREEN}✓ Git repository initialized${NC}" -# } - -# Build and switch to new configuration +# System building with enhanced progress build_system() { - echo -e "${BLUE}🏗️ Building system configuration...${NC}" - echo "This may take a while on first run..." + section_header "System Build" "🏗️ " - # Build the system - sudo nixos-rebuild switch --flake /etc/nixos#omnixy + center_text "${YELLOW}${BOLD}⚠️ IMPORTANT NOTICE ⚠️${RESET}" + center_text "${FG}This process may take 10-45 minutes depending on your system${RESET}" + center_text "${FG}A stable internet connection is required${RESET}" + echo - echo -e "${GREEN}✓ System built successfully!${NC}" + printf "%*s" $(( (TERM_WIDTH - 30) / 2 )) "" + printf "${CYAN}Continue with system build? (Y/n): ${RESET}" + read -n 1 -r reply + echo + + if [[ $reply =~ ^[Nn]$ ]]; then + center_text "${YELLOW}Build postponed. Run this command later:${RESET}" + center_text "${CYAN}sudo nixos-rebuild switch --flake /etc/nixos#omnixy${RESET}" + return + fi + + echo + center_text "${FG}Building NixOS system configuration...${RESET}" + center_text "${DIM}${FG}This includes downloading packages and compiling the system${RESET}" + echo + + # Start build in background and show spinner + sudo nixos-rebuild switch --flake /etc/nixos#omnixy & + local build_pid=$! + + # Enhanced progress indication + local dots="" + local build_messages=( + "Downloading Nix packages..." + "Building system dependencies..." + "Compiling configuration..." + "Setting up services..." + "Finalizing installation..." + ) + + local msg_index=0 + local counter=0 + + while kill -0 $build_pid 2>/dev/null; do + if (( counter % 30 == 0 && msg_index < ${#build_messages[@]} )); then + echo + center_text "${CYAN}${build_messages[$msg_index]}${RESET}" + ((msg_index++)) + fi + + printf "\r%*s${CYAN}Building system" $(( (TERM_WIDTH - 20) / 2 )) "" + dots+="." + if [ ${#dots} -gt 6 ]; then dots=""; fi + printf "%s${RESET}" "$dots" + + sleep 1 + ((counter++)) + done + + wait $build_pid + local exit_code=$? + + echo + if [ $exit_code -eq 0 ]; then + center_text "${GREEN}${BOLD}✅ System build completed successfully!${RESET}" + else + center_text "${RED}${BOLD}❌ Build failed with errors${RESET}" + center_text "${FG}Check the output above for details${RESET}" + exit $exit_code + fi } -# Post-installation message +# Completion screen with comprehensive information show_complete() { + clear + setup_terminal + + # Add spacing + for ((i=0; i<2; i++)); do echo; done + + # Success banner + printf "%*s${GREEN}${BOLD}" $(( (TERM_WIDTH - 60) / 2 )) "" + echo "╭──────────────────────────────────────────────────────────╮" + printf "%*s${GREEN}│" $(( (TERM_WIDTH - 60) / 2 )) "" + printf "%*s🎉 OmniXY Installation Complete! 🎉%*s│\n" 14 "" 14 "" + printf "%*s${GREEN}╰──────────────────────────────────────────────────────────╯${RESET}\n" $(( (TERM_WIDTH - 60) / 2 )) "" + echo - echo -e "${GREEN}╭──────────────────────────────────────────╮${NC}" - echo -e "${GREEN}│ 🎉 Omarchy Installation Complete! │${NC}" - echo -e "${GREEN}╰──────────────────────────────────────────╯${NC}" echo - echo -e "${BLUE}Quick Start Guide:${NC}" - echo " • Run 'omnixy help' for available commands" - echo " • Run 'omnixy-theme-list' to see available themes" - echo " • Run 'omnixy update' to update your system" + + # Quick start section + section_header "Quick Start Guide" "🚀" + + center_text "${CYAN}${BOLD}Essential Commands:${RESET}" + center_text "${FG}${DIM}Run these commands to get started${RESET}" echo - echo -e "${BLUE}Key Bindings (Hyprland):${NC}" - echo " • Super + Return: Open terminal" - echo " • Super + B: Open browser" - echo " • Super + D: Application launcher" - echo " • Super + Q: Close window" + center_text "${CYAN}omnixy-menu${RESET} ${FG}- Interactive system menu${RESET}" + center_text "${CYAN}omnixy-info${RESET} ${FG}- System information display${RESET}" + center_text "${CYAN}omnixy-theme${RESET} ${FG}- Switch between themes${RESET}" + center_text "${CYAN}omnixy-security${RESET} ${FG}- Configure security features${RESET}" + echo - echo -e "${YELLOW}Note: You may need to reboot for all changes to take effect.${NC}" + section_header "Keyboard Shortcuts" "⌨️ " + + center_text "${PURPLE}${BOLD}Hyprland Window Manager:${RESET}" echo - echo "For more information, visit: https://github.com/TheArctesian/omnixy" + center_text "${CYAN}Super + Return${RESET} ${FG}- Open terminal${RESET}" + center_text "${CYAN}Super + R${RESET} ${FG}- Application launcher${RESET}" + center_text "${CYAN}Super + B${RESET} ${FG}- Web browser${RESET}" + center_text "${CYAN}Super + E${RESET} ${FG}- File manager${RESET}" + center_text "${CYAN}Super + Q${RESET} ${FG}- Close window${RESET}" + center_text "${CYAN}Super + F${RESET} ${FG}- Fullscreen toggle${RESET}" + center_text "${CYAN}Super + 1-0${RESET} ${FG}- Switch workspaces${RESET}" + + echo + section_header "Next Steps" "📋" + + center_text "${YELLOW}${BOLD}Recommended Actions:${RESET}" + echo + center_text "${FG}1. ${CYAN}Reboot your system${RESET} ${FG}- Apply all changes${RESET}" + center_text "${FG}2. ${CYAN}Run omnixy-security status${RESET} ${FG}- Check security setup${RESET}" + center_text "${FG}3. ${CYAN}Configure fingerprint/FIDO2${RESET} ${FG}- Enhanced security${RESET}" + center_text "${FG}4. ${CYAN}Explore themes${RESET} ${FG}- Try different color schemes${RESET}" + center_text "${FG}5. ${CYAN}Join the community${RESET} ${FG}- Get help and share feedback${RESET}" + + echo + section_header "Resources" "🔗" + + center_text "${BLUE}${UNDERLINE}https://github.com/TheArctesian/omnixy${RESET} ${FG}- Project homepage${RESET}" + center_text "${BLUE}${UNDERLINE}https://nixos.org/manual${RESET} ${FG}- NixOS documentation${RESET}" + + echo + echo + center_text "${DIM}${FG}Thank you for choosing OmniXY! ${CYAN}❤️${RESET}" + echo + + # Auto-reboot prompt + printf "%*s${YELLOW}Reboot now to complete installation? (Y/n): ${RESET}" $(( (TERM_WIDTH - 45) / 2 )) "" + read -n 1 -r reply + echo + + if [[ ! $reply =~ ^[Nn]$ ]]; then + center_text "${GREEN}Rebooting in 3 seconds...${RESET}" + sleep 1 + center_text "${GREEN}Rebooting in 2 seconds...${RESET}" + sleep 1 + center_text "${GREEN}Rebooting in 1 second...${RESET}" + sleep 1 + sudo reboot + else + center_text "${FG}Remember to reboot when convenient!${RESET}" + fi } -# Main installation flow +# Main installation orchestrator main() { + # Trap to restore terminal on exit + trap 'printf "\033[0m\033[?25h"; stty sane' EXIT + + # Hide cursor during installation + printf '\033[?25l' + show_banner + sleep 2 - echo -e "${BLUE}Welcome to Omarchy NixOS Installer!${NC}" - echo "This will install Omarchy configuration on your NixOS system." + section_header "Welcome to OmniXY" "🌟" + center_text "${FG}Transform your NixOS into a beautiful, modern desktop experience${RESET}" + center_text "${DIM}${FG}This installer will guide you through the complete setup process${RESET}" echo - check_nixos - check_permissions - - read -p "Continue with installation? (y/n) " -n 1 -r + printf "%*s${CYAN}${BOLD}Ready to begin installation? (Y/n): ${RESET}" $(( (TERM_WIDTH - 35) / 2 )) "" + read -n 1 -r reply echo - if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo "Installation cancelled." + + if [[ $reply =~ ^[Nn]$ ]]; then + center_text "${FG}Installation cancelled. Come back anytime!${RESET}" exit 0 fi + # Installation flow with enhanced UX + check_nixos backup_config install_config generate_hardware_config update_user select_theme configure_features - # init_git + build_system + show_complete - echo - echo -e "${YELLOW}Ready to build the system. This may take 10-30 minutes.${NC}" - read -p "Continue? (y/n) " -n 1 -r - echo - - if [[ $REPLY =~ ^[Yy]$ ]]; then - build_system - show_complete - else - echo -e "${YELLOW}Installation paused. To complete, run:${NC}" - echo " sudo nixos-rebuild switch --flake /etc/nixos#omnixy" - fi + # Restore cursor + printf '\033[?25h' } -# Run main function -main "$@" +# Start the installation +main "$@" \ No newline at end of file diff --git a/modules/boot.nix b/modules/boot.nix new file mode 100644 index 0000000..1a80e5a --- /dev/null +++ b/modules/boot.nix @@ -0,0 +1,269 @@ +{ config, pkgs, lib, ... }: + +# OmniXY Boot Configuration +# Plymouth theming and seamless boot experience + +with lib; + +let + cfg = config.omnixy; + omnixy = import ./helpers.nix { inherit config pkgs lib; }; + + # Import our custom Plymouth theme package + plymouth-themes = pkgs.callPackage ../packages/plymouth-theme.nix {}; +in +{ + config = mkIf (cfg.enable or true) { + # Plymouth boot splash configuration + boot.plymouth = { + enable = true; + theme = "omnixy-${cfg.theme}"; + themePackages = [ plymouth-themes ]; + + # Logo configuration + logo = "${plymouth-themes}/share/plymouth/themes/omnixy-${cfg.theme}/logo.png"; + }; + + # Boot optimization and theming + boot = { + # Kernel parameters for smooth boot + kernelParams = [ + # Quiet boot (suppress most messages) + "quiet" + # Splash screen + "splash" + # Reduce log level + "loglevel=3" + # Disable systemd status messages on console + "rd.systemd.show_status=false" + "rd.udev.log_level=3" + "udev.log_priority=3" + # Faster boot + "boot.shell_on_fail" + # Hide cursor + "vt.global_cursor_default=0" + ]; + + # Console configuration for seamless experience + consoleLogLevel = 0; + + # Boot loader configuration + loader = { + # Timeout for boot menu + timeout = 3; + + # systemd-boot theme integration + systemd-boot = { + editor = false; # Disable editor for security + configurationLimit = 10; + consoleMode = "auto"; + }; + }; + + # Initial ramdisk optimization + initrd = { + systemd.enable = true; + verbose = false; + + # Include Plymouth in initrd + includeDefaultModules = true; + }; + }; + + # Systemd service for seamless login transition + systemd.services.omnixy-boot-transition = { + description = "OmniXY Boot Transition Service"; + after = [ "plymouth-start.service" "display-manager.service" ]; + before = [ "plymouth-quit.service" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = "${pkgs.plymouth}/bin/plymouth message --text='Welcome to OmniXY'"; + ExecStop = "${pkgs.plymouth}/bin/plymouth quit --retain-splash"; + TimeoutStartSec = "10s"; + }; + + script = '' + # Ensure smooth transition from Plymouth to display manager + ${pkgs.coreutils}/bin/sleep 1 + + # Send welcome message + ${pkgs.plymouth}/bin/plymouth message --text="Loading OmniXY ${cfg.theme} theme..." + ${pkgs.coreutils}/bin/sleep 2 + + # Signal that boot is complete + ${pkgs.plymouth}/bin/plymouth message --text="System Ready" + ''; + }; + + # Theme switching integration + environment.systemPackages = [ + plymouth-themes + + # Plymouth theme switching script + (omnixy.makeScript "omnixy-plymouth-theme" "Switch Plymouth boot theme" '' + if [ -z "$1" ]; then + echo "🎨 Current Plymouth theme: omnixy-${cfg.theme}" + echo + echo "Available themes:" + ls ${plymouth-themes}/share/plymouth/themes/ | grep "omnixy-" | sed 's/omnixy-/ - /' + echo + echo "Usage: omnixy-plymouth-theme " + exit 0 + fi + + THEME="omnixy-$1" + THEME_PATH="${plymouth-themes}/share/plymouth/themes/$THEME" + + if [ ! -d "$THEME_PATH" ]; then + echo "❌ Theme '$1' not found!" + echo "Available themes:" + ls ${plymouth-themes}/share/plymouth/themes/ | grep "omnixy-" | sed 's/omnixy-/ - /' + exit 1 + fi + + echo "🎨 Setting Plymouth theme to: $1" + + # Update Plymouth theme + sudo ${pkgs.plymouth}/bin/plymouth-set-default-theme "$THEME" + + # Regenerate initrd + echo "🔄 Regenerating initrd..." + sudo nixos-rebuild boot --flake /etc/nixos#omnixy + + echo "✅ Plymouth theme updated!" + echo "⚠️ Reboot to see the new boot theme" + '') + + # Plymouth management utilities + (omnixy.makeScript "omnixy-boot-preview" "Preview Plymouth theme" '' + if [ "$EUID" -ne 0 ]; then + echo "❌ This command must be run as root (use sudo)" + exit 1 + fi + + echo "🎬 Starting Plymouth preview..." + echo " Press Ctrl+Alt+F1 to return to console" + echo " Press Ctrl+C to stop preview" + + # Kill any running Plymouth instances + pkill plymouthd 2>/dev/null || true + + # Start Plymouth in preview mode + ${pkgs.plymouth}/bin/plymouthd --debug --debug-file=/tmp/plymouth-debug.log + ${pkgs.plymouth}/bin/plymouth --show-splash + + # Simulate boot progress + for i in $(seq 0 5 100); do + ${pkgs.plymouth}/bin/plymouth --update="boot-progress:$i/100" + sleep 0.1 + done + + echo "Plymouth preview running. Check another TTY to see the splash screen." + echo "Press Enter to stop..." + read -r + + ${pkgs.plymouth}/bin/plymouth --quit + pkill plymouthd 2>/dev/null || true + + echo "✅ Plymouth preview stopped" + '') + + # Boot diagnostics + (omnixy.makeScript "omnixy-boot-info" "Show boot information and diagnostics" '' + echo "🚀 OmniXY Boot Information" + echo "═══════════════════════════" + echo + + echo "🎨 Plymouth Configuration:" + echo " Current Theme: ${cfg.theme}" + echo " Theme Package: ${plymouth-themes}" + echo " Plymouth Status: $(systemctl is-active plymouth-start.service 2>/dev/null || echo 'inactive')" + echo + + echo "⚙️ Boot Configuration:" + echo " Boot Loader: $(bootctl status 2>/dev/null | grep 'systemd-boot' || echo 'systemd-boot')" + echo " Kernel: $(uname -r)" + echo " Boot Time: $(systemd-analyze | head -1)" + echo + + echo "📊 Boot Performance:" + systemd-analyze blame | head -10 + echo + + echo "🔧 Boot Services:" + echo " Display Manager: $(systemctl is-active display-manager 2>/dev/null || echo 'inactive')" + echo " Plymouth: $(systemctl is-active plymouth-*.service 2>/dev/null || echo 'inactive')" + echo " OmniXY Transition: $(systemctl is-active omnixy-boot-transition 2>/dev/null || echo 'inactive')" + + if [ -f "/tmp/plymouth-debug.log" ]; then + echo + echo "🐛 Plymouth Debug Log (last 10 lines):" + tail -10 /tmp/plymouth-debug.log + fi + '') + ]; + + # Ensure Plymouth themes are properly installed + system.activationScripts.plymouthThemes = '' + # Ensure Plymouth theme directory exists + mkdir -p /run/current-system/sw/share/plymouth/themes + + # Set default theme on first boot + if [ ! -f /var/lib/plymouth/theme ]; then + mkdir -p /var/lib/plymouth + echo "omnixy-${cfg.theme}" > /var/lib/plymouth/theme + + # Set the theme + ${pkgs.plymouth}/bin/plymouth-set-default-theme "omnixy-${cfg.theme}" || true + fi + ''; + + # Font configuration for Plymouth + fonts = { + packages = with pkgs; [ + jetbrains-mono + cantarell-fonts + liberation_ttf + dejavu_fonts + ]; + + # Ensure fonts are available early in boot + fontDir.enable = true; + }; + + # Security: Disable debug shell during boot (can be enabled for troubleshooting) + boot.kernelParams = mkDefault [ + # Disable emergency shell access + "systemd.debug-shell=0" + ]; + + # Optional: LUKS integration for encrypted systems + boot.initrd.luks.devices = mkIf (config.boot.initrd.luks.devices != {}) { + # Plymouth will automatically handle LUKS password prompts + }; + + # Console and TTY configuration + console = { + earlySetup = true; + colors = [ + # Custom console color palette matching current theme + # This will be used before Plymouth starts + ] ++ ( + if cfg.theme == "tokyo-night" then [ + "1a1b26" "f7768e" "9ece6a" "e0af68" + "7aa2f7" "bb9af7" "7dcfff" "c0caf5" + "414868" "f7768e" "9ece6a" "e0af68" + "7aa2f7" "bb9af7" "7dcfff" "a9b1d6" + ] else if cfg.theme == "gruvbox" then [ + "282828" "cc241d" "98971a" "d79921" + "458588" "b16286" "689d6a" "a89984" + "928374" "fb4934" "b8bb26" "fabd2f" + "83a598" "d3869b" "8ec07c" "ebdbb2" + ] else [] + ); + }; + }; +} \ No newline at end of file diff --git a/modules/core.nix b/modules/core.nix index 9d015f6..a1749c8 100644 --- a/modules/core.nix +++ b/modules/core.nix @@ -310,7 +310,7 @@ in omnixy-theme() { local theme=$1 if [ -z "$theme" ]; then - echo "Available themes: tokyo-night, catppuccin, gruvbox, nord, everforest, rose-pine, kanagawa" + echo "Available themes: tokyo-night, catppuccin, catppuccin-latte, gruvbox, nord, everforest, rose-pine, kanagawa, matte-black, osaka-jade, ristretto" return 1 fi diff --git a/modules/desktop/hyprland.nix b/modules/desktop/hyprland.nix index c5ab2c0..bfaeb35 100644 --- a/modules/desktop/hyprland.nix +++ b/modules/desktop/hyprland.nix @@ -6,6 +6,11 @@ let cfg = config.omnixy.desktop; in { + imports = [ + ./hyprland/autostart.nix + ./hyprland/bindings.nix + ./hyprland/idle.nix + ]; options.omnixy.desktop = { enable = mkEnableOption "OmniXY Hyprland desktop environment"; @@ -33,6 +38,12 @@ in default = null; description = "Path to wallpaper image (optional)"; }; + + idleSuspend = mkOption { + type = types.bool; + default = false; + description = "Enable system suspend after idle timeout"; + }; }; config = mkIf (cfg.enable or true) { @@ -184,14 +195,18 @@ in sensitivity = 0 # -1.0 - 1.0, 0 means no modification } + # Include modular configuration files + source = /etc/omnixy/hyprland/theme.conf + source = /etc/omnixy/hyprland/autostart.conf + source = /etc/omnixy/hyprland/bindings.conf + source = /etc/omnixy/hyprland/hypridle.conf + # General configuration general { gaps_in = 5 gaps_out = 10 border_size = 2 - col.active_border = rgba(7aa2f7ee) rgba(c4a7e7ee) 45deg - col.inactive_border = rgba(595959aa) - + # Colors are defined in theme.conf layout = dwindle allow_tearing = false } @@ -211,7 +226,7 @@ in drop_shadow = true shadow_range = 20 shadow_render_power = 3 - col.shadow = rgba(1a1a1aee) + # Shadow color is defined in theme.conf dim_inactive = false dim_strength = 0.1 @@ -294,8 +309,8 @@ in bind = $mainMod, Return, exec, ${cfg.defaultTerminal} bind = $mainMod, B, exec, ${cfg.defaultBrowser} bind = $mainMod, E, exec, nautilus + bind = $mainMod, R, exec, walker bind = $mainMod, D, exec, walker - bind = $mainMod SHIFT, D, exec, wofi --show drun bind = $mainMod, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy # Window management @@ -349,7 +364,7 @@ in bind = $mainMod, mouse_up, workspace, e-1 # Resize mode - bind = $mainMod, R, submap, resize + bind = $mainMod ALT, R, submap, resize submap = resize binde = , h, resizeactive, -10 0 binde = , l, resizeactive, 10 0 diff --git a/modules/desktop/hyprland/autostart.nix b/modules/desktop/hyprland/autostart.nix new file mode 100644 index 0000000..6022e75 --- /dev/null +++ b/modules/desktop/hyprland/autostart.nix @@ -0,0 +1,73 @@ +{ config, pkgs, lib, ... }: + +# Hyprland autostart configuration for OmniXY +# Handles application startup and initialization + +with lib; + +let + cfg = config.omnixy.desktop; + omnixy = import ../../helpers.nix { inherit config pkgs lib; }; +in +{ + config = mkIf (cfg.enable or true) { + # Create autostart configuration + environment.etc."omnixy/hyprland/autostart.conf".text = '' + # OmniXY Autostart Configuration + # Applications and services to start with Hyprland + + # Essential services + exec-once = waybar + exec-once = mako + exec-once = swww init + exec-once = nm-applet --indicator + exec-once = blueman-applet + + # Wallpaper setup + ${optionalString (cfg.wallpaper != null) ''exec = swww img ${toString cfg.wallpaper} --transition-type wipe''} + + # Clipboard management + exec-once = wl-paste --type text --watch cliphist store + exec-once = wl-paste --type image --watch cliphist store + + # Authentication agent + exec-once = ${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1 + + # Audio setup + ${optionalString (omnixy.isEnabled "media") '' + exec-once = easyeffects --gapplication-service + ''} + + # Gaming-specific autostart + ${optionalString (omnixy.isEnabled "gaming") '' + exec-once = mangohud + exec-once = gamemode + ''} + + # Development-specific autostart + ${optionalString (omnixy.isEnabled "coding") '' + exec-once = ${pkgs.vscode}/bin/code --no-sandbox + ''} + + # Communication apps + ${optionalString (omnixy.isEnabled "communication") '' + exec-once = discord --start-minimized + exec-once = slack --start-minimized + ''} + + # System monitoring (optional) + ${optionalString (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") '' + exec-once = ${pkgs.btop}/bin/btop --utf-force + ''} + + # Screenshots directory + exec-once = mkdir -p ~/Pictures/Screenshots + + # Idle management + exec-once = hypridle + + # OSD for volume/brightness + exec-once = swayosd-server + ''; + }; +} \ No newline at end of file diff --git a/modules/desktop/hyprland/bindings.nix b/modules/desktop/hyprland/bindings.nix new file mode 100644 index 0000000..f136a3b --- /dev/null +++ b/modules/desktop/hyprland/bindings.nix @@ -0,0 +1,184 @@ +{ config, pkgs, lib, ... }: + +# Hyprland keybindings configuration for OmniXY +# Comprehensive keyboard shortcuts for productivity + +with lib; + +let + cfg = config.omnixy.desktop; + omnixy = import ../../helpers.nix { inherit config pkgs lib; }; +in +{ + config = mkIf (cfg.enable or true) { + # Create keybindings configuration + environment.etc."omnixy/hyprland/bindings.conf".text = '' + # OmniXY Hyprland Keybindings + # Comprehensive keyboard shortcuts + + # Variables for commonly used applications + $terminal = ${cfg.defaultTerminal or "ghostty"} + $browser = ${cfg.defaultBrowser or "firefox"} + $filemanager = thunar + $menu = walker + + # Modifier keys + $mainMod = SUPER + + # Window management + bind = $mainMod, Q, killactive + bind = $mainMod, M, exit + bind = $mainMod, V, togglefloating + bind = $mainMod, P, pseudo # dwindle + bind = $mainMod, J, togglesplit # dwindle + bind = $mainMod, F, fullscreen + + # Application launches + bind = $mainMod, Return, exec, $terminal + bind = $mainMod, E, exec, $filemanager + bind = $mainMod, R, exec, $menu + bind = $mainMod, B, exec, $browser + + # Development shortcuts + ${optionalString (omnixy.isEnabled "coding") '' + bind = $mainMod, C, exec, code + bind = $mainMod SHIFT, C, exec, $terminal -e nvim + bind = $mainMod, G, exec, $terminal -e lazygit + bind = $mainMod SHIFT, G, exec, github-desktop + ''} + + # Communication shortcuts + ${optionalString (omnixy.isEnabled "communication") '' + bind = $mainMod, D, exec, discord + bind = $mainMod SHIFT, D, exec, slack + bind = $mainMod, T, exec, telegram-desktop + ''} + + # Media shortcuts + ${optionalString (omnixy.isEnabled "media") '' + bind = $mainMod, S, exec, spotify + bind = $mainMod SHIFT, S, exec, $terminal -e cmus + bind = $mainMod, I, exec, imv + bind = $mainMod SHIFT, I, exec, gimp + ''} + + # Move focus with mainMod + arrow keys + bind = $mainMod, left, movefocus, l + bind = $mainMod, right, movefocus, r + bind = $mainMod, up, movefocus, u + bind = $mainMod, down, movefocus, d + + # Move focus with mainMod + vim keys + bind = $mainMod, h, movefocus, l + bind = $mainMod, l, movefocus, r + bind = $mainMod, k, movefocus, u + bind = $mainMod, j, movefocus, d + + # Move windows with mainMod + SHIFT + arrow keys + bind = $mainMod SHIFT, left, movewindow, l + bind = $mainMod SHIFT, right, movewindow, r + bind = $mainMod SHIFT, up, movewindow, u + bind = $mainMod SHIFT, down, movewindow, d + + # Move windows with mainMod + SHIFT + vim keys + bind = $mainMod SHIFT, h, movewindow, l + bind = $mainMod SHIFT, l, movewindow, r + bind = $mainMod SHIFT, k, movewindow, u + bind = $mainMod SHIFT, j, movewindow, d + + # Switch workspaces with mainMod + [0-9] + bind = $mainMod, 1, workspace, 1 + bind = $mainMod, 2, workspace, 2 + bind = $mainMod, 3, workspace, 3 + bind = $mainMod, 4, workspace, 4 + bind = $mainMod, 5, workspace, 5 + bind = $mainMod, 6, workspace, 6 + bind = $mainMod, 7, workspace, 7 + bind = $mainMod, 8, workspace, 8 + bind = $mainMod, 9, workspace, 9 + bind = $mainMod, 0, workspace, 10 + + # Move active window to a workspace with mainMod + SHIFT + [0-9] + bind = $mainMod SHIFT, 1, movetoworkspace, 1 + bind = $mainMod SHIFT, 2, movetoworkspace, 2 + bind = $mainMod SHIFT, 3, movetoworkspace, 3 + bind = $mainMod SHIFT, 4, movetoworkspace, 4 + bind = $mainMod SHIFT, 5, movetoworkspace, 5 + bind = $mainMod SHIFT, 6, movetoworkspace, 6 + bind = $mainMod SHIFT, 7, movetoworkspace, 7 + bind = $mainMod SHIFT, 8, movetoworkspace, 8 + bind = $mainMod SHIFT, 9, movetoworkspace, 9 + bind = $mainMod SHIFT, 0, movetoworkspace, 10 + + # Scroll through existing workspaces with mainMod + scroll + bind = $mainMod, mouse_down, workspace, e+1 + bind = $mainMod, mouse_up, workspace, e-1 + + # Move/resize windows with mainMod + LMB/RMB and dragging + bindm = $mainMod, mouse:272, movewindow + bindm = $mainMod, mouse:273, resizewindow + + # Resize windows + bind = $mainMod CTRL, left, resizeactive, -50 0 + bind = $mainMod CTRL, right, resizeactive, 50 0 + bind = $mainMod CTRL, up, resizeactive, 0 -50 + bind = $mainMod CTRL, down, resizeactive, 0 50 + + # Resize windows with vim keys + bind = $mainMod CTRL, h, resizeactive, -50 0 + bind = $mainMod CTRL, l, resizeactive, 50 0 + bind = $mainMod CTRL, k, resizeactive, 0 -50 + bind = $mainMod CTRL, j, resizeactive, 0 50 + + # Screenshots + bind = , Print, exec, grim -g "$(slurp)" ~/Pictures/Screenshots/$(date +'screenshot_%Y-%m-%d-%H%M%S.png') + bind = SHIFT, Print, exec, grim ~/Pictures/Screenshots/$(date +'screenshot_%Y-%m-%d-%H%M%S.png') + bind = $mainMod, Print, exec, grim -g "$(slurp)" - | wl-copy + + # Screen recording + bind = $mainMod SHIFT, R, exec, wf-recorder -g "$(slurp)" -f ~/Videos/recording_$(date +'%Y-%m-%d-%H%M%S.mp4') + + # Media keys + bindl = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ + bindl = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- + bindl = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle + bindl = , XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle + + # Brightness keys + bindl = , XF86MonBrightnessUp, exec, brightnessctl set 10%+ + bindl = , XF86MonBrightnessDown, exec, brightnessctl set 10%- + + # Media player keys + bindl = , XF86AudioPlay, exec, playerctl play-pause + bindl = , XF86AudioNext, exec, playerctl next + bindl = , XF86AudioPrev, exec, playerctl previous + + # Lock screen + bind = $mainMod, L, exec, hyprlock + + # System controls + bind = $mainMod SHIFT, Q, exec, wlogout + bind = $mainMod ALT, R, exec, systemctl --user restart waybar + bind = $mainMod ALT, W, exec, killall waybar && waybar + + # Clipboard management + bind = $mainMod, Y, exec, cliphist list | walker --dmenu | cliphist decode | wl-copy + + # Color picker + bind = $mainMod SHIFT, C, exec, hyprpicker -a + + # Special workspace (scratchpad) + bind = $mainMod, S, togglespecialworkspace, magic + bind = $mainMod SHIFT, S, movetoworkspace, special:magic + + # Game mode toggle + ${optionalString (omnixy.isEnabled "gaming") '' + bind = $mainMod, F1, exec, gamemoderun + ''} + + # Theme cycling (if multiple wallpapers available) + bind = $mainMod ALT, T, exec, omnixy-theme-bg-next + bind = $mainMod ALT SHIFT, T, exec, omnixy-theme-next + ''; + }; +} \ No newline at end of file diff --git a/modules/desktop/hyprland/idle.nix b/modules/desktop/hyprland/idle.nix new file mode 100644 index 0000000..0bee7dd --- /dev/null +++ b/modules/desktop/hyprland/idle.nix @@ -0,0 +1,197 @@ +{ config, pkgs, lib, ... }: + +# Hyprland idle management configuration for OmniXY +# Handles screen locking, power management, and idle behavior + +with lib; + +let + cfg = config.omnixy.desktop; + omnixy = import ../../helpers.nix { inherit config pkgs lib; }; +in +{ + config = mkIf (cfg.enable or true) { + # Install required packages + environment.systemPackages = with pkgs; [ + hypridle + hyprlock + hyprpicker + brightnessctl + ]; + + # Create hypridle configuration + environment.etc."omnixy/hyprland/hypridle.conf".text = '' + # OmniXY Idle Management Configuration + + general { + # Avoid starting multiple hyprlock instances + lock_cmd = pidof hyprlock || hyprlock + + # Lock before suspend + before_sleep_cmd = loginctl lock-session + + # Lock when lid is closed + before_sleep_cmd = hyprlock + + # Unlock when lid is opened + after_sleep_cmd = hyprctl dispatch dpms on + } + + # Dim screen after 5 minutes + listener { + timeout = 300 + on-timeout = brightnessctl -s set 10% + on-resume = brightnessctl -r + } + + # Lock screen after 10 minutes + listener { + timeout = 600 + on-timeout = loginctl lock-session + } + + # Turn off screen after 15 minutes + listener { + timeout = 900 + on-timeout = hyprctl dispatch dpms off + on-resume = hyprctl dispatch dpms on + } + + # Suspend system after 30 minutes (optional - can be disabled) + ${optionalString (cfg.idleSuspend or false) '' + listener { + timeout = 1800 + on-timeout = systemctl suspend + } + ''} + ''; + + # Create hyprlock configuration + environment.etc."omnixy/hyprland/hyprlock.conf".text = '' + # OmniXY Screen Lock Configuration + + general { + disable_loading_bar = true + grace = 5 + hide_cursor = false + no_fade_in = false + } + + background { + monitor = + path = ${if cfg.wallpaper != null then toString cfg.wallpaper else "~/Pictures/wallpaper.jpg"} + blur_passes = 3 + blur_size = 8 + noise = 0.0117 + contrast = 0.8916 + brightness = 0.8172 + vibrancy = 0.1696 + vibrancy_darkness = 0.0 + } + + # User avatar + image { + monitor = + path = ~/.face + size = 150 + rounding = -1 + border_size = 4 + border_color = rgb(221, 221, 221) + rotate = 0 + reload_time = -1 + reload_cmd = + position = 0, 200 + halign = center + valign = center + } + + # Current time + label { + monitor = + text = cmd[update:30000] echo "$TIME" + color = rgba(200, 200, 200, 1.0) + font_size = 55 + font_family = JetBrainsMono Nerd Font + position = -100, -40 + halign = right + valign = bottom + shadow_passes = 5 + shadow_size = 10 + } + + # Date + label { + monitor = + text = cmd[update:43200000] echo "$(date +"%A, %d %B %Y")" + color = rgba(200, 200, 200, 1.0) + font_size = 25 + font_family = JetBrainsMono Nerd Font + position = -100, -150 + halign = right + valign = bottom + shadow_passes = 5 + shadow_size = 10 + } + + # Password input field + input-field { + monitor = + size = 200, 50 + outline_thickness = 3 + dots_size = 0.33 + dots_spacing = 0.15 + dots_center = false + dots_rounding = -1 + outer_color = rgb(151515) + inner_color = rgb(200, 200, 200) + font_color = rgb(10, 10, 10) + fade_on_empty = true + fade_timeout = 1000 + placeholder_text = Input Password... + hide_input = false + rounding = -1 + check_color = rgb(204, 136, 34) + fail_color = rgb(204, 34, 34) + fail_text = $FAIL ($ATTEMPTS) + fail_timeout = 2000 + fail_transitions = 300 + capslock_color = -1 + numlock_color = -1 + bothlock_color = -1 + invert_numlock = false + swap_font_color = false + position = 0, -20 + halign = center + valign = center + } + + # User name + label { + monitor = + text = ${config.omnixy.user or "user"} + color = rgba(200, 200, 200, 1.0) + font_size = 20 + font_family = JetBrainsMono Nerd Font + position = 0, 80 + halign = center + valign = center + shadow_passes = 5 + shadow_size = 10 + } + + # System info + label { + monitor = + text = cmd[update:60000] echo "$(uname -n)" + color = rgba(200, 200, 200, 0.8) + font_size = 16 + font_family = JetBrainsMono Nerd Font + position = 100, 40 + halign = left + valign = bottom + shadow_passes = 5 + shadow_size = 10 + } + ''; + }; +} \ No newline at end of file diff --git a/modules/fastfetch.nix b/modules/fastfetch.nix new file mode 100644 index 0000000..d311713 --- /dev/null +++ b/modules/fastfetch.nix @@ -0,0 +1,215 @@ +{ config, pkgs, lib, ... }: + +# Fastfetch system information display for OmniXY +# Beautiful system information with OmniXY branding + +with lib; + +let + cfg = config.omnixy; + omnixy = import ./helpers.nix { inherit config pkgs lib; }; +in +{ + config = mkIf (cfg.enable or true) { + # Add fastfetch to system packages + environment.systemPackages = with pkgs; [ + fastfetch + ]; + + # Create OmniXY branding directory + environment.etc."omnixy/branding/logo.txt".text = '' + + ███████╗███╗ ███╗███╗ ██╗██╗██╗ ██╗██╗ ██╗ + ██╔════╝████╗ ████║████╗ ██║██║╚██╗██╔╝╚██╗ ██╔╝ + ██║ ██╔████╔██║██╔██╗ ██║██║ ╚███╔╝ ╚████╔╝ + ██║ ██║╚██╔╝██║██║╚██╗██║██║ ██╔██╗ ╚██╔╝ + ███████╗██║ ╚═╝ ██║██║ ╚████║██║██╔╝ ██╗ ██║ + ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═╝ + + Declarative NixOS Configuration + ''; + + environment.etc."omnixy/branding/about.txt".text = '' + ╭─────────────────────────────────────────────────────╮ + │ │ + │ ██████╗ ███╗ ███╗███╗ ██╗██╗██╗ ██╗██╗ ██╗│ + │ ██╔═══██╗████╗ ████║████╗ ██║██║╚██╗██╔╝╚██╗ ██╔╝│ + │ ██║ ██║██╔████╔██║██╔██╗ ██║██║ ╚███╔╝ ╚████╔╝ │ + │ ██║ ██║██║╚██╔╝██║██║╚██╗██║██║ ██╔██╗ ╚██╔╝ │ + │ ╚██████╔╝██║ ╚═╝ ██║██║ ╚████║██║██╔╝ ██╗ ██║ │ + │ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═╝ │ + │ │ + │ 🚀 Declarative • 🎨 Beautiful • ⚡ Fast │ + │ │ + ╰─────────────────────────────────────────────────────╯ + ''; + + # Create fastfetch configuration + environment.etc."omnixy/fastfetch/config.jsonc".text = '' + { + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "type": "file", + "source": "/etc/omnixy/branding/about.txt", + "color": { + "1": "cyan", + "2": "blue" + }, + "padding": { + "top": 1, + "right": 4, + "left": 2 + } + }, + "modules": [ + "break", + { + "type": "custom", + "format": "\u001b[90m┌─────────────────── Hardware ───────────────────┐" + }, + { + "type": "host", + "key": " 󰌢 Host", + "keyColor": "cyan" + }, + { + "type": "cpu", + "key": " 󰻠 CPU", + "keyColor": "cyan" + }, + { + "type": "gpu", + "key": " 󰍛 GPU", + "keyColor": "cyan" + }, + { + "type": "memory", + "key": " 󰍛 Memory", + "keyColor": "cyan" + }, + { + "type": "disk", + "key": " 󰋊 Disk (/)", + "keyColor": "cyan" + }, + { + "type": "custom", + "format": "\u001b[90m├─────────────────── Software ───────────────────┤" + }, + { + "type": "os", + "key": " 󰣇 OS", + "keyColor": "blue" + }, + { + "type": "kernel", + "key": " 󰌽 Kernel", + "keyColor": "blue" + }, + { + "type": "de", + "key": " 󰧨 DE", + "keyColor": "blue" + }, + { + "type": "wm", + "key": " 󰖸 WM", + "keyColor": "blue" + }, + { + "type": "wmtheme", + "key": " 󰏘 Theme", + "keyColor": "blue" + }, + { + "type": "shell", + "key": " 󰆍 Shell", + "keyColor": "blue" + }, + { + "type": "terminal", + "key": " 󰆍 Terminal", + "keyColor": "blue" + }, + { + "type": "custom", + "format": "\u001b[90m├─────────────────── OmniXY ─────────────────────┤" + }, + { + "type": "custom", + "format": " 󰣇 Theme: ${cfg.theme}", + "keyColor": "magenta" + }, + { + "type": "custom", + "format": " 󰣇 Preset: ${cfg.preset or "custom"}", + "keyColor": "magenta" + }, + { + "type": "custom", + "format": " 󰣇 User: ${cfg.user}", + "keyColor": "magenta" + }, + { + "type": "packages", + "key": " 󰏖 Packages", + "keyColor": "magenta" + }, + { + "type": "custom", + "format": "\u001b[90m└─────────────────────────────────────────────────┘" + }, + "break" + ] + } + ''; + + # Create convenience script + environment.systemPackages = [ + (omnixy.makeScript "omnixy-info" "Show OmniXY system information" '' + fastfetch --config /etc/omnixy/fastfetch/config.jsonc + '') + + (omnixy.makeScript "omnixy-about" "Show OmniXY about screen" '' + clear + cat /etc/omnixy/branding/about.txt + echo + echo "Theme: ${cfg.theme}" + echo "Preset: ${cfg.preset or "custom"}" + echo "User: ${cfg.user}" + echo "NixOS Version: $(nixos-version)" + echo + echo "Visit: https://github.com/TheArctesian/omnixy" + '') + ]; + + # Add to user environment + omnixy.forUser { + # Set XDG config dir for fastfetch + xdg.configFile."fastfetch/config.jsonc".source = + config.environment.etc."omnixy/fastfetch/config.jsonc".source; + + # Add shell aliases + programs.bash.shellAliases = { + neofetch = "omnixy-info"; + screenfetch = "omnixy-info"; + sysinfo = "omnixy-info"; + about = "omnixy-about"; + }; + + programs.zsh.shellAliases = { + neofetch = "omnixy-info"; + screenfetch = "omnixy-info"; + sysinfo = "omnixy-info"; + about = "omnixy-about"; + }; + + programs.fish.shellAliases = { + neofetch = "omnixy-info"; + screenfetch = "omnixy-info"; + sysinfo = "omnixy-info"; + about = "omnixy-about"; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/helpers.nix b/modules/helpers.nix index dd6eb6d..185f0d4 100644 --- a/modules/helpers.nix +++ b/modules/helpers.nix @@ -92,6 +92,31 @@ in utilities = [ "calculators" "converters" "system tools" ]; }; + # Hyprland configuration helper + hyprlandConfig = colors: '' + general { + gaps_in = 5 + gaps_out = 10 + border_size = 2 + col.active_border = ${colors.active_border} + col.inactive_border = ${colors.inactive_border} + layout = dwindle + } + + decoration { + rounding = 10 + blur { + enabled = true + size = 6 + passes = 2 + } + drop_shadow = true + shadow_range = 20 + shadow_render_power = 3 + col.shadow = ${colors.shadow} + } + ''; + # Standard service patterns service = { # Create a basic systemd service with OmniXY defaults diff --git a/modules/menus.nix b/modules/menus.nix new file mode 100644 index 0000000..f154e73 --- /dev/null +++ b/modules/menus.nix @@ -0,0 +1,530 @@ +{ config, pkgs, lib, ... }: + +# Interactive menu system for OmniXY +# Terminal-based menus for system management and productivity + +with lib; + +let + cfg = config.omnixy; + omnixy = import ./helpers.nix { inherit config pkgs lib; }; +in +{ + config = mkIf (cfg.enable or true) { + # Interactive menu scripts + environment.systemPackages = [ + # Main OmniXY menu + (omnixy.makeScript "omnixy-menu" "Interactive OmniXY system menu" '' + #!/bin/bash + + # Colors for terminal output + RED='\033[0;31m' + GREEN='\033[0;32m' + YELLOW='\033[1;33m' + BLUE='\033[0;34m' + PURPLE='\033[0;35m' + CYAN='\033[0;36m' + WHITE='\033[1;37m' + NC='\033[0m' # No Color + + show_header() { + clear + echo -e "''${CYAN}" + echo " ███████╗███╗ ███╗███╗ ██╗██╗██╗ ██╗██╗ ██╗" + echo " ██╔════╝████╗ ████║████╗ ██║██║╚██╗██╔╝╚██╗ ██╔╝" + echo " ██║ ██╔████╔██║██╔██╗ ██║██║ ╚███╔╝ ╚████╔╝" + echo " ██║ ██║╚██╔╝██║██║╚██╗██║██║ ██╔██╗ ╚██╔╝" + echo " ███████╗██║ ╚═╝ ██║██║ ╚████║██║██╔╝ ██╗ ██║" + echo " ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═╝" + echo -e "''${NC}" + echo -e "''${WHITE} 🚀 Declarative • 🎨 Beautiful • ⚡ Fast''${NC}" + echo + echo -e "''${BLUE}═══════════════════════════════════════════════════════''${NC}" + echo -e "''${WHITE} Theme: ''${YELLOW}${cfg.theme}''${WHITE} │ User: ''${GREEN}${cfg.user}''${WHITE} │ Preset: ''${PURPLE}${cfg.preset or "custom"}''${NC}" + echo -e "''${BLUE}═══════════════════════════════════════════════════════''${NC}" + echo + } + + show_main_menu() { + show_header + echo -e "''${WHITE}🎛️ Main Menu''${NC}" + echo + echo -e "''${GREEN}1.''${NC} 📦 System Management" + echo -e "''${GREEN}2.''${NC} 🎨 Theme & Appearance" + echo -e "''${GREEN}3.''${NC} ⚙️ Configuration" + echo -e "''${GREEN}4.''${NC} 🔧 Development Tools" + echo -e "''${GREEN}5.''${NC} 📊 System Information" + echo -e "''${GREEN}6.''${NC} 🛠️ Maintenance & Utilities" + echo -e "''${GREEN}7.''${NC} 📋 Help & Documentation" + echo + echo -e "''${RED}0.''${NC} Exit" + echo + echo -ne "''${CYAN}Select an option: ''${NC}" + } + + show_system_menu() { + show_header + echo -e "''${WHITE}📦 System Management''${NC}" + echo + echo -e "''${GREEN}1.''${NC} 🔄 Update System" + echo -e "''${GREEN}2.''${NC} 🔨 Rebuild Configuration" + echo -e "''${GREEN}3.''${NC} 🧪 Test Configuration" + echo -e "''${GREEN}4.''${NC} 🧹 Clean System" + echo -e "''${GREEN}5.''${NC} 📊 Service Status" + echo -e "''${GREEN}6.''${NC} 💾 Create Backup" + echo -e "''${GREEN}7.''${NC} 🔍 Search Packages" + echo + echo -e "''${YELLOW}8.''${NC} ← Back to Main Menu" + echo + echo -ne "''${CYAN}Select an option: ''${NC}" + } + + show_theme_menu() { + show_header + echo -e "''${WHITE}🎨 Theme & Appearance''${NC}" + echo + echo -e "''${WHITE}Current Theme: ''${YELLOW}${cfg.theme}''${NC}" + echo + echo -e "''${GREEN}Available Themes:''${NC}" + echo -e "''${GREEN}1.''${NC} 🌃 tokyo-night - Dark theme with vibrant colors" + echo -e "''${GREEN}2.''${NC} 🎀 catppuccin - Pastel theme with modern aesthetics" + echo -e "''${GREEN}3.''${NC} 🟤 gruvbox - Retro theme with warm colors" + echo -e "''${GREEN}4.''${NC} ❄️ nord - Arctic theme with cool colors" + echo -e "''${GREEN}5.''${NC} 🌲 everforest - Green forest theme" + echo -e "''${GREEN}6.''${NC} 🌹 rose-pine - Cozy theme with muted colors" + echo -e "''${GREEN}7.''${NC} 🌊 kanagawa - Japanese-inspired theme" + echo -e "''${GREEN}8.''${NC} ☀️ catppuccin-latte - Light catppuccin variant" + echo -e "''${GREEN}9.''${NC} ⚫ matte-black - Minimalist dark theme" + echo -e "''${GREEN}a.''${NC} 💎 osaka-jade - Jade green accent theme" + echo -e "''${GREEN}b.''${NC} ☕ ristretto - Coffee-inspired warm theme" + echo + echo -e "''${YELLOW}0.''${NC} ← Back to Main Menu" + echo + echo -ne "''${CYAN}Select theme or option: ''${NC}" + } + + show_config_menu() { + show_header + echo -e "''${WHITE}⚙️ Configuration''${NC}" + echo + echo -e "''${GREEN}1.''${NC} 📝 Edit Main Configuration" + echo -e "''${GREEN}2.''${NC} 🪟 Edit Hyprland Configuration" + echo -e "''${GREEN}3.''${NC} 🎨 Edit Theme Configuration" + echo -e "''${GREEN}4.''${NC} 📦 Edit Package Configuration" + echo -e "''${GREEN}5.''${NC} 🔒 Security Settings" + echo -e "''${GREEN}6.''${NC} 📂 Open Configuration Directory" + echo -e "''${GREEN}7.''${NC} 🔗 View Git Status" + echo + echo -e "''${YELLOW}0.''${NC} ← Back to Main Menu" + echo + echo -ne "''${CYAN}Select an option: ''${NC}" + } + + show_dev_menu() { + show_header + echo -e "''${WHITE}🔧 Development Tools''${NC}" + echo + echo -e "''${GREEN}1.''${NC} 💻 Open Terminal" + echo -e "''${GREEN}2.''${NC} 📝 Open Code Editor" + echo -e "''${GREEN}3.''${NC} 🌐 Open Browser" + echo -e "''${GREEN}4.''${NC} 📁 Open File Manager" + echo -e "''${GREEN}5.''${NC} 🚀 Launch Applications" + echo -e "''${GREEN}6.''${NC} 🐙 Git Operations" + echo + echo -e "''${YELLOW}0.''${NC} ← Back to Main Menu" + echo + echo -ne "''${CYAN}Select an option: ''${NC}" + } + + show_info_menu() { + show_header + echo -e "''${WHITE}📊 System Information''${NC}" + echo + echo -e "''${GREEN}1.''${NC} 🖥️ System Overview" + echo -e "''${GREEN}2.''${NC} 💻 Hardware Information" + echo -e "''${GREEN}3.''${NC} 📈 Performance Monitor" + echo -e "''${GREEN}4.''${NC} 🔧 Service Status" + echo -e "''${GREEN}5.''${NC} 💾 Disk Usage" + echo -e "''${GREEN}6.''${NC} 🌐 Network Information" + echo -e "''${GREEN}7.''${NC} 📊 OmniXY About" + echo + echo -e "''${YELLOW}0.''${NC} ← Back to Main Menu" + echo + echo -ne "''${CYAN}Select an option: ''${NC}" + } + + show_maintenance_menu() { + show_header + echo -e "''${WHITE}🛠️ Maintenance & Utilities''${NC}" + echo + echo -e "''${GREEN}1.''${NC} 🧹 System Cleanup" + echo -e "''${GREEN}2.''${NC} 🔄 Restart Services" + echo -e "''${GREEN}3.''${NC} 📋 View Logs" + echo -e "''${GREEN}4.''${NC} 💾 Backup Configuration" + echo -e "''${GREEN}5.''${NC} 🔧 System Diagnostics" + echo -e "''${GREEN}6.''${NC} 🖼️ Screenshot Tools" + echo + echo -e "''${YELLOW}0.''${NC} ← Back to Main Menu" + echo + echo -ne "''${CYAN}Select an option: ''${NC}" + } + + show_help_menu() { + show_header + echo -e "''${WHITE}📋 Help & Documentation''${NC}" + echo + echo -e "''${GREEN}1.''${NC} 📖 OmniXY Commands" + echo -e "''${GREEN}2.''${NC} 🔑 Keyboard Shortcuts" + echo -e "''${GREEN}3.''${NC} 🌐 Open GitHub Repository" + echo -e "''${GREEN}4.''${NC} 📧 Report Issue" + echo -e "''${GREEN}5.''${NC} ℹ️ About OmniXY" + echo + echo -e "''${YELLOW}0.''${NC} ← Back to Main Menu" + echo + echo -ne "''${CYAN}Select an option: ''${NC}" + } + + handle_system_menu() { + case "$1" in + 1) echo -e "''${GREEN}Updating system...''${NC}"; omnixy-update ;; + 2) echo -e "''${GREEN}Rebuilding configuration...''${NC}"; omnixy-rebuild ;; + 3) echo -e "''${GREEN}Testing configuration...''${NC}"; omnixy-test ;; + 4) echo -e "''${GREEN}Cleaning system...''${NC}"; omnixy-clean ;; + 5) echo -e "''${GREEN}Checking service status...''${NC}"; omnixy-services status ;; + 6) echo -e "''${GREEN}Creating backup...''${NC}"; omnixy-backup ;; + 7) + echo -ne "''${CYAN}Enter package name to search: ''${NC}" + read -r package + if [ -n "$package" ]; then + omnixy-search "$package" + fi + ;; + 8) return 0 ;; + *) echo -e "''${RED}Invalid option!''${NC}" ;; + esac + echo + echo -ne "''${YELLOW}Press Enter to continue...''${NC}" + read -r + } + + handle_theme_menu() { + case "$1" in + 1) omnixy-theme tokyo-night ;; + 2) omnixy-theme catppuccin ;; + 3) omnixy-theme gruvbox ;; + 4) omnixy-theme nord ;; + 5) omnixy-theme everforest ;; + 6) omnixy-theme rose-pine ;; + 7) omnixy-theme kanagawa ;; + 8) omnixy-theme catppuccin-latte ;; + 9) omnixy-theme matte-black ;; + a|A) omnixy-theme osaka-jade ;; + b|B) omnixy-theme ristretto ;; + 0) return 0 ;; + *) echo -e "''${RED}Invalid option!''${NC}" ;; + esac + echo + echo -ne "''${YELLOW}Press Enter to continue...''${NC}" + read -r + } + + handle_config_menu() { + case "$1" in + 1) omnixy-config main ;; + 2) omnixy-config hyprland ;; + 3) omnixy-config theme ;; + 4) omnixy-config packages ;; + 5) + echo -e "''${CYAN}Security Settings:''${NC}" + echo -e "''${WHITE}1. Security Status 2. Fingerprint Setup 3. FIDO2 Setup''${NC}" + echo -ne "''${CYAN}Select: ''${NC}" + read -r security_choice + case "$security_choice" in + 1) omnixy-security status ;; + 2) omnixy-fingerprint setup ;; + 3) omnixy-fido2 setup ;; + esac + ;; + 6) cd /etc/nixos && ''${TERMINAL:-ghostty} ;; + 7) cd /etc/nixos && git status ;; + 0) return 0 ;; + *) echo -e "''${RED}Invalid option!''${NC}" ;; + esac + echo + echo -ne "''${YELLOW}Press Enter to continue...''${NC}" + read -r + } + + handle_dev_menu() { + case "$1" in + 1) ''${TERMINAL:-ghostty} ;; + 2) code ;; + 3) ''${BROWSER:-firefox} ;; + 4) thunar ;; + 5) walker ;; + 6) + echo -e "''${CYAN}Git Operations:''${NC}" + echo -e "''${WHITE}1. Status 2. Log 3. Commit 4. Push''${NC}" + echo -ne "''${CYAN}Select: ''${NC}" + read -r git_choice + cd /etc/nixos + case "$git_choice" in + 1) git status ;; + 2) git log --oneline -10 ;; + 3) echo -ne "''${CYAN}Commit message: ''${NC}"; read -r msg; git add -A && git commit -m "$msg" ;; + 4) git push ;; + esac + ;; + 0) return 0 ;; + *) echo -e "''${RED}Invalid option!''${NC}" ;; + esac + echo + echo -ne "''${YELLOW}Press Enter to continue...''${NC}" + read -r + } + + handle_info_menu() { + case "$1" in + 1) omnixy-sysinfo ;; + 2) omnixy-hardware ;; + 3) htop ;; + 4) omnixy-services status ;; + 5) df -h && echo && du -sh /nix/store ;; + 6) ip addr show ;; + 7) omnixy-about ;; + 0) return 0 ;; + *) echo -e "''${RED}Invalid option!''${NC}" ;; + esac + echo + echo -ne "''${YELLOW}Press Enter to continue...''${NC}" + read -r + } + + handle_maintenance_menu() { + case "$1" in + 1) omnixy-clean ;; + 2) + echo -ne "''${CYAN}Enter service name: ''${NC}" + read -r service + if [ -n "$service" ]; then + omnixy-services restart "$service" + fi + ;; + 3) + echo -ne "''${CYAN}Enter service name for logs: ''${NC}" + read -r service + if [ -n "$service" ]; then + omnixy-services logs "$service" + fi + ;; + 4) omnixy-backup ;; + 5) echo -e "''${GREEN}Running diagnostics...''${NC}"; journalctl -p 3 -xb ;; + 6) grim -g "$(slurp)" ~/Pictures/Screenshots/screenshot_$(date +'%Y-%m-%d-%H%M%S.png') ;; + 0) return 0 ;; + *) echo -e "''${RED}Invalid option!''${NC}" ;; + esac + echo + echo -ne "''${YELLOW}Press Enter to continue...''${NC}" + read -r + } + + handle_help_menu() { + case "$1" in + 1) + echo -e "''${WHITE}OmniXY Commands:''${NC}" + echo -e "''${GREEN}omnixy-menu''${NC} - This interactive menu" + echo -e "''${GREEN}omnixy-info''${NC} - System information display" + echo -e "''${GREEN}omnixy-about''${NC} - About screen" + echo -e "''${GREEN}omnixy-theme''${NC} - Switch themes" + echo -e "''${GREEN}omnixy-rebuild''${NC} - Rebuild configuration" + echo -e "''${GREEN}omnixy-update''${NC} - Update system" + echo -e "''${GREEN}omnixy-clean''${NC} - Clean system" + echo -e "''${GREEN}omnixy-search''${NC} - Search packages" + ;; + 2) + echo -e "''${WHITE}Hyprland Keyboard Shortcuts:''${NC}" + echo -e "''${GREEN}Super + Return''${NC} - Open terminal" + echo -e "''${GREEN}Super + R''${NC} - Open launcher" + echo -e "''${GREEN}Super + Q''${NC} - Close window" + echo -e "''${GREEN}Super + F''${NC} - Fullscreen" + echo -e "''${GREEN}Super + 1-0''${NC} - Switch workspaces" + ;; + 3) ''${BROWSER:-firefox} https://github.com/TheArctesian/omnixy ;; + 4) ''${BROWSER:-firefox} https://github.com/TheArctesian/omnixy/issues ;; + 5) omnixy-about ;; + 0) return 0 ;; + *) echo -e "''${RED}Invalid option!''${NC}" ;; + esac + echo + echo -ne "''${YELLOW}Press Enter to continue...''${NC}" + read -r + } + + # Main menu loop + while true; do + show_main_menu + read -r choice + + case "$choice" in + 1) + while true; do + show_system_menu + read -r sub_choice + handle_system_menu "$sub_choice" + [ "$?" -eq 0 ] && break + done + ;; + 2) + while true; do + show_theme_menu + read -r sub_choice + handle_theme_menu "$sub_choice" + [ "$?" -eq 0 ] && break + done + ;; + 3) + while true; do + show_config_menu + read -r sub_choice + handle_config_menu "$sub_choice" + [ "$?" -eq 0 ] && break + done + ;; + 4) + while true; do + show_dev_menu + read -r sub_choice + handle_dev_menu "$sub_choice" + [ "$?" -eq 0 ] && break + done + ;; + 5) + while true; do + show_info_menu + read -r sub_choice + handle_info_menu "$sub_choice" + [ "$?" -eq 0 ] && break + done + ;; + 6) + while true; do + show_maintenance_menu + read -r sub_choice + handle_maintenance_menu "$sub_choice" + [ "$?" -eq 0 ] && break + done + ;; + 7) + while true; do + show_help_menu + read -r sub_choice + handle_help_menu "$sub_choice" + [ "$?" -eq 0 ] && break + done + ;; + 0|q|Q) + echo -e "''${GREEN}Goodbye! 👋''${NC}" + exit 0 + ;; + *) + echo -e "''${RED}Invalid option! Press Enter to continue...''${NC}" + read -r + ;; + esac + done + '') + + # Quick theme selector + (omnixy.makeScript "omnixy-theme-picker" "Quick theme picker with preview" '' + #!/bin/bash + + # Colors + CYAN='\033[0;36m' + WHITE='\033[1;37m' + GREEN='\033[0;32m' + YELLOW='\033[1;33m' + RED='\033[0;31m' + NC='\033[0m' + + themes=( + "tokyo-night:🌃:Dark theme with vibrant colors" + "catppuccin:🎀:Pastel theme with modern aesthetics" + "gruvbox:🟤:Retro theme with warm colors" + "nord:❄️ :Arctic theme with cool colors" + "everforest:🌲:Green forest theme" + "rose-pine:🌹:Cozy theme with muted colors" + "kanagawa:🌊:Japanese-inspired theme" + "catppuccin-latte:☀️ :Light catppuccin variant" + "matte-black:⚫:Minimalist dark theme" + "osaka-jade:💎:Jade green accent theme" + "ristretto:☕:Coffee-inspired warm theme" + ) + + clear + echo -e "''${CYAN}🎨 OmniXY Theme Picker''${NC}" + echo -e "''${WHITE}Current Theme: ''${YELLOW}${cfg.theme}''${NC}" + echo + echo -e "''${WHITE}Available Themes:''${NC}" + echo + + for i in "''${!themes[@]}"; do + IFS=':' read -ra theme_info <<< "''${themes[$i]}" + theme_name="''${theme_info[0]}" + theme_icon="''${theme_info[1]}" + theme_desc="''${theme_info[2]}" + + printf "''${GREEN}%2d.''${NC} %s %-15s - %s\n" "$((i+1))" "$theme_icon" "$theme_name" "$theme_desc" + done + + echo + echo -e "''${RED} 0.''${NC} Cancel" + echo + echo -ne "''${CYAN}Select theme (1-''${#themes[@]}): ''${NC}" + read -r choice + + if [[ "$choice" -ge 1 && "$choice" -le "''${#themes[@]}" ]]; then + IFS=':' read -ra theme_info <<< "''${themes[$((choice-1))]}" + selected_theme="''${theme_info[0]}" + + echo -e "''${GREEN}Switching to ''${selected_theme}...''${NC}" + omnixy-theme "$selected_theme" + elif [[ "$choice" == "0" ]]; then + echo -e "''${YELLOW}Cancelled.''${NC}" + else + echo -e "''${RED}Invalid selection!''${NC}" + exit 1 + fi + '') + ]; + + # Shell aliases for easy access + omnixy.forUser { + programs.bash.shellAliases = { + menu = "omnixy-menu"; + themes = "omnixy-theme-picker"; + rebuild = "omnixy-rebuild"; + update = "omnixy-update"; + info = "omnixy-info"; + clean = "omnixy-clean"; + }; + + programs.zsh.shellAliases = { + menu = "omnixy-menu"; + themes = "omnixy-theme-picker"; + rebuild = "omnixy-rebuild"; + update = "omnixy-update"; + info = "omnixy-info"; + clean = "omnixy-clean"; + }; + + programs.fish.shellAliases = { + menu = "omnixy-menu"; + themes = "omnixy-theme-picker"; + rebuild = "omnixy-rebuild"; + update = "omnixy-update"; + info = "omnixy-info"; + clean = "omnixy-clean"; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/scripts.nix b/modules/scripts.nix new file mode 100644 index 0000000..18be919 --- /dev/null +++ b/modules/scripts.nix @@ -0,0 +1,366 @@ +{ config, pkgs, lib, ... }: + +# Essential system utility scripts for OmniXY +# Convenient scripts for system management and productivity + +with lib; + +let + cfg = config.omnixy; + omnixy = import ./helpers.nix { inherit config pkgs lib; }; +in +{ + config = mkIf (cfg.enable or true) { + # System utility scripts + environment.systemPackages = [ + # System information and monitoring + (omnixy.makeScript "omnixy-sysinfo" "Show comprehensive system information" '' + echo "╭─────────────────── OmniXY System Info ───────────────────╮" + echo "│" + echo "│ 💻 System: $(hostname) ($(uname -m))" + echo "│ 🐧 OS: NixOS $(nixos-version)" + echo "│ 🎨 Theme: ${cfg.theme}" + echo "│ 👤 User: ${cfg.user}" + echo "│ 🏠 Preset: ${cfg.preset or "custom"}" + echo "│" + echo "│ 🔧 Uptime: $(uptime -p)" + echo "│ 💾 Memory: $(free -h | awk 'NR==2{printf "%.1f/%.1fGB (%.0f%%)", $3/1024/1024, $2/1024/1024, $3*100/$2}')" + echo "│ 💽 Disk: $(df -h / | awk 'NR==2{printf "%s/%s (%s)", $3, $2, $5}')" + echo "│ 🌡️ Load: $(uptime | sed 's/.*load average: //')" + echo "│" + echo "│ 📦 Packages: $(nix-env -qa --installed | wc -l) installed" + echo "│ 🗂️ Generations: $(sudo nix-env -p /nix/var/nix/profiles/system --list-generations | wc -l) total" + echo "│" + echo "╰───────────────────────────────────────────────────────────╯" + '') + + # Quick system maintenance + (omnixy.makeScript "omnixy-clean" "Clean system (garbage collect, optimize)" '' + echo "🧹 Cleaning OmniXY system..." + + echo " ├─ Collecting garbage..." + sudo nix-collect-garbage -d + + echo " ├─ Optimizing store..." + sudo nix-store --optimize + + echo " ├─ Clearing user caches..." + rm -rf ~/.cache/thumbnails/* + rm -rf ~/.cache/mesa_shader_cache/* + rm -rf ~/.cache/fontconfig/* + + echo " ├─ Clearing logs..." + sudo journalctl --vacuum-time=7d + + echo " └─ Cleaning complete!" + + # Show space saved + echo + echo "💾 Disk usage:" + df -h / | awk 'NR==2{printf " Root: %s/%s (%s used)\n", $3, $2, $5}' + du -sh /nix/store | awk '{printf " Nix Store: %s\n", $1}' + '') + + # Update system and flake + (omnixy.makeScript "omnixy-update" "Update system and flake inputs" '' + echo "📦 Updating OmniXY system..." + + cd /etc/nixos || { echo "❌ Not in /etc/nixos directory"; exit 1; } + + echo " ├─ Updating flake inputs..." + sudo nix flake update + + echo " ├─ Rebuilding system..." + sudo nixos-rebuild switch --flake .#omnixy + + echo " └─ Update complete!" + + # Show new generation + echo + echo "🎯 Current generation:" + sudo nix-env -p /nix/var/nix/profiles/system --list-generations | tail -1 + '') + + # Rebuild system configuration + (omnixy.makeScript "omnixy-rebuild" "Rebuild NixOS configuration" '' + echo "🔨 Rebuilding OmniXY configuration..." + + cd /etc/nixos || { echo "❌ Not in /etc/nixos directory"; exit 1; } + + # Check if there are any uncommitted changes + if ! git diff --quiet; then + echo "⚠️ Warning: There are uncommitted changes" + echo " Consider committing them first" + echo + fi + + # Build and switch + sudo nixos-rebuild switch --flake .#omnixy + + if [ $? -eq 0 ]; then + echo "✅ Rebuild successful!" + echo "🎯 Active generation: $(sudo nix-env -p /nix/var/nix/profiles/system --list-generations | tail -1)" + else + echo "❌ Rebuild failed!" + exit 1 + fi + '') + + # Test build without switching + (omnixy.makeScript "omnixy-test" "Test build configuration without switching" '' + echo "🧪 Testing OmniXY configuration..." + + cd /etc/nixos || { echo "❌ Not in /etc/nixos directory"; exit 1; } + + # Build without switching + sudo nixos-rebuild build --flake .#omnixy + + if [ $? -eq 0 ]; then + echo "✅ Build test successful!" + echo " Configuration is valid and ready for deployment" + else + echo "❌ Build test failed!" + echo " Fix configuration errors before rebuilding" + exit 1 + fi + '') + + # Search for packages + (omnixy.makeScript "omnixy-search" "Search for NixOS packages" '' + if [ -z "$1" ]; then + echo "Usage: omnixy-search " + echo "Search for packages in nixpkgs" + exit 1 + fi + + echo "🔍 Searching for packages matching '$1'..." + echo + + # Search in nixpkgs + nix search nixpkgs "$1" | head -20 + + echo + echo "💡 Install with: nix-env -iA nixpkgs." + echo " Or add to your configuration.nix" + '') + + # Theme management + (omnixy.makeScript "omnixy-theme" "Switch OmniXY theme" '' + if [ -z "$1" ]; then + echo "🎨 Available OmniXY themes:" + echo " tokyo-night - Dark theme with vibrant colors" + echo " catppuccin - Pastel theme with modern aesthetics" + echo " gruvbox - Retro theme with warm colors" + echo " nord - Arctic theme with cool colors" + echo " everforest - Green forest theme" + echo " rose-pine - Cozy theme with muted colors" + echo " kanagawa - Japanese-inspired theme" + echo " catppuccin-latte - Light catppuccin variant" + echo " matte-black - Minimalist dark theme" + echo " osaka-jade - Jade green accent theme" + echo " ristretto - Coffee-inspired warm theme" + echo + echo "Usage: omnixy-theme " + echo "Current theme: ${cfg.theme}" + exit 0 + fi + + THEME="$1" + CONFIG_FILE="/etc/nixos/configuration.nix" + + echo "🎨 Switching to theme: $THEME" + + # Validate theme exists + if [ ! -f "/etc/nixos/modules/themes/$THEME.nix" ]; then + echo "❌ Theme '$THEME' not found!" + echo " Available themes listed above" + exit 1 + fi + + # Update configuration.nix + sudo sed -i "s/currentTheme = \".*\";/currentTheme = \"$THEME\";/" "$CONFIG_FILE" + + echo " ├─ Updated configuration..." + echo " ├─ Rebuilding system..." + + # Rebuild with new theme + cd /etc/nixos && sudo nixos-rebuild switch --flake .#omnixy + + if [ $? -eq 0 ]; then + echo " ├─ Theme switched successfully!" + echo " └─ Updating Plymouth boot theme..." + + # Update Plymouth theme to match + sudo omnixy-plymouth-theme "$THEME" 2>/dev/null || echo " (Plymouth theme update may require reboot)" + + echo "✅ Now using theme: $THEME" + echo "💡 Reboot to see the new boot splash screen" + else + echo "❌ Failed to apply theme!" + # Revert change + sudo sed -i "s/currentTheme = \"$THEME\";/currentTheme = \"${cfg.theme}\";/" "$CONFIG_FILE" + exit 1 + fi + '') + + # Hardware information + (omnixy.makeScript "omnixy-hardware" "Show detailed hardware information" '' + echo "🖥️ OmniXY Hardware Information" + echo "═══════════════════════════════════" + echo + + echo "💻 System:" + echo " Model: $(cat /sys/class/dmi/id/product_name 2>/dev/null || echo 'Unknown')" + echo " Manufacturer: $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null || echo 'Unknown')" + echo " BIOS: $(cat /sys/class/dmi/id/bios_version 2>/dev/null || echo 'Unknown')" + echo + + echo "🧠 CPU:" + lscpu | grep -E "Model name|Architecture|CPU\(s\)|Thread|Core|MHz" + echo + + echo "💾 Memory:" + free -h + echo + + echo "💽 Storage:" + lsblk -f + echo + + echo "📺 Graphics:" + lspci | grep -i vga + lspci | grep -i 3d + echo + + echo "🔊 Audio:" + lspci | grep -i audio + echo + + echo "🌐 Network:" + ip addr show | grep -E "inet |link/" + '') + + # Service management + (omnixy.makeScript "omnixy-services" "Manage OmniXY services" '' + case "$1" in + "status") + echo "📊 OmniXY Service Status" + echo "═══════════════════════" + + services=( + "display-manager" + "networkmanager" + "pipewire" + "bluetooth" + "hypridle" + ) + + for service in "''${services[@]}"; do + status=$(systemctl is-active $service 2>/dev/null || echo "inactive") + case $status in + "active") icon="✅" ;; + "inactive") icon="❌" ;; + *) icon="⚠️ " ;; + esac + printf " %s %s: %s\n" "$icon" "$service" "$status" + done + ;; + "restart") + if [ -z "$2" ]; then + echo "Usage: omnixy-services restart " + exit 1 + fi + echo "🔄 Restarting $2..." + sudo systemctl restart "$2" + ;; + "logs") + if [ -z "$2" ]; then + echo "Usage: omnixy-services logs " + exit 1 + fi + journalctl -u "$2" -f + ;; + *) + echo "📋 OmniXY Service Management" + echo + echo "Usage: omnixy-services [service]" + echo + echo "Commands:" + echo " status - Show status of key services" + echo " restart - Restart a service" + echo " logs - View service logs" + ;; + esac + '') + + # Quick configuration editing + (omnixy.makeScript "omnixy-config" "Quick access to configuration files" '' + case "$1" in + "main"|"") + echo "📝 Opening main configuration..." + ''${EDITOR:-nano} /etc/nixos/configuration.nix + ;; + "hyprland") + echo "📝 Opening Hyprland configuration..." + ''${EDITOR:-nano} /etc/nixos/modules/desktop/hyprland.nix + ;; + "theme") + echo "📝 Opening theme configuration..." + ''${EDITOR:-nano} /etc/nixos/modules/themes/${cfg.theme}.nix + ;; + "packages") + echo "📝 Opening package configuration..." + ''${EDITOR:-nano} /etc/nixos/modules/packages.nix + ;; + *) + echo "📝 OmniXY Configuration Files" + echo + echo "Usage: omnixy-config " + echo + echo "Targets:" + echo " main - Main configuration.nix file" + echo " hyprland - Hyprland window manager config" + echo " theme - Current theme configuration" + echo " packages - Package configuration" + echo + echo "Files will open in: ''${EDITOR:-nano}" + ;; + esac + '') + + # Backup and restore + (omnixy.makeScript "omnixy-backup" "Backup OmniXY configuration" '' + BACKUP_DIR="$HOME/omnixy-backups" + TIMESTAMP=$(date +%Y%m%d_%H%M%S) + BACKUP_FILE="$BACKUP_DIR/omnixy_$TIMESTAMP.tar.gz" + + echo "💾 Creating OmniXY configuration backup..." + + mkdir -p "$BACKUP_DIR" + + # Create backup archive + sudo tar -czf "$BACKUP_FILE" \ + -C /etc \ + nixos/ \ + --exclude=nixos/hardware-configuration.nix + + # Also backup user configs that matter + if [ -d "$HOME/.config" ]; then + tar -czf "$BACKUP_DIR/userconfig_$TIMESTAMP.tar.gz" \ + -C "$HOME" \ + .config/hypr/ \ + .config/waybar/ \ + .config/mako/ \ + .config/walker/ 2>/dev/null || true + fi + + echo "✅ Backup created:" + echo " System: $BACKUP_FILE" + echo " User: $BACKUP_DIR/userconfig_$TIMESTAMP.tar.gz" + echo + echo "📊 Backup size:" + du -sh "$BACKUP_DIR"/*"$TIMESTAMP"* | sed 's/^/ /' + '') + ]; + }; +} \ No newline at end of file diff --git a/modules/security.nix b/modules/security.nix new file mode 100644 index 0000000..85e66bd --- /dev/null +++ b/modules/security.nix @@ -0,0 +1,532 @@ +{ config, pkgs, lib, ... }: + +# OmniXY Security Configuration +# Fingerprint, FIDO2, and system hardening features + +with lib; + +let + cfg = config.omnixy.security; + omnixy = import ./helpers.nix { inherit config pkgs lib; }; + + # Hardware detection helpers + hasFingerprintReader = '' + ${pkgs.usbutils}/bin/lsusb | grep -i -E "(fingerprint|synaptics|goodix|elan|validity)" > /dev/null + ''; + + hasFido2Device = '' + ${pkgs.libfido2}/bin/fido2-token -L 2>/dev/null | grep -q "dev:" + ''; +in +{ + options.omnixy.security = { + enable = mkEnableOption "OmniXY security features"; + + fingerprint = { + enable = mkEnableOption "fingerprint authentication"; + autoDetect = mkOption { + type = types.bool; + default = true; + description = "Automatically detect and enable fingerprint readers"; + }; + }; + + fido2 = { + enable = mkEnableOption "FIDO2/WebAuthn authentication"; + autoDetect = mkOption { + type = types.bool; + default = true; + description = "Automatically detect and enable FIDO2 devices"; + }; + }; + + systemHardening = { + enable = mkOption { + type = types.bool; + default = true; + description = "Enable system security hardening"; + }; + + faillock = { + enable = mkOption { + type = types.bool; + default = true; + description = "Enable account lockout protection"; + }; + denyAttempts = mkOption { + type = types.int; + default = 10; + description = "Number of failed attempts before lockout"; + }; + unlockTime = mkOption { + type = types.int; + default = 120; + description = "Lockout duration in seconds"; + }; + }; + }; + }; + + config = mkIf (cfg.enable or true) { + # Security packages + environment.systemPackages = with pkgs; [ + # Fingerprint authentication + fprintd + + # FIDO2/WebAuthn + libfido2 + pam_u2f + + # Security utilities + usbutils + pciutils + + # Firewall management + ufw + ]; + + # Fingerprint authentication configuration + services.fprintd = mkIf (cfg.fingerprint.enable or cfg.fingerprint.autoDetect) { + enable = true; + package = pkgs.fprintd; + }; + + # PAM configuration for fingerprint + security.pam.services = mkIf (cfg.fingerprint.enable or cfg.fingerprint.autoDetect) { + # Enable fingerprint for sudo + sudo.fprintAuth = true; + + # Enable fingerprint for polkit (system authentication) + polkit-1 = { + fprintAuth = true; + text = '' + auth sufficient pam_fprintd.so + auth include system-auth + account include system-auth + password include system-auth + session include system-auth + ''; + }; + + # Enable for login if using display manager + login.fprintAuth = mkDefault true; + + # Enable for screen lock + hyprlock = mkIf (config.omnixy.desktop.enable or false) { + fprintAuth = true; + text = '' + auth sufficient pam_fprintd.so + auth include system-auth + account include system-auth + ''; + }; + }; + + # FIDO2 authentication configuration + security.pam.services = mkIf (cfg.fido2.enable) { + # FIDO2 for sudo + sudo = { + text = mkBefore '' + auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2 + ''; + }; + + # FIDO2 for polkit + polkit-1 = { + text = mkBefore '' + auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2 + ''; + }; + + # FIDO2 for screen lock + hyprlock = mkIf (config.omnixy.desktop.enable or false) { + text = mkBefore '' + auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2 + ''; + }; + }; + + # System hardening configuration + security = mkIf cfg.systemHardening.enable { + # Sudo security + sudo = { + enable = true; + wheelNeedsPassword = true; + execWheelOnly = true; + }; + + # Polkit security + polkit = { + enable = true; + extraConfig = '' + polkit.addRule(function(action, subject) { + if (subject.isInGroup("wheel") && + (action.id == "org.freedesktop.systemd1.manage-units" || + action.id == "org.freedesktop.NetworkManager.settings.modify.system")) { + return polkit.Result.YES; + } + }); + ''; + }; + + # Account lockout protection + pam.loginLimits = mkIf cfg.systemHardening.faillock.enable [ + { + domain = "*"; + type = "hard"; + item = "core"; + value = "0"; + } + ]; + }; + + # Faillock configuration + security.pam.services.system-auth = mkIf cfg.systemHardening.faillock.enable { + text = mkAfter '' + auth required pam_faillock.so preauth + auth required pam_faillock.so authfail deny=${toString cfg.systemHardening.faillock.denyAttempts} unlock_time=${toString cfg.systemHardening.faillock.unlockTime} + account required pam_faillock.so + ''; + }; + + # Firewall configuration + networking.firewall = mkIf cfg.systemHardening.enable { + enable = true; + + # Default deny incoming, allow outgoing + defaultPolicy = { + default = "deny"; + defaultOutput = "allow"; + }; + + # Essential services + allowedTCPPorts = [ 22 ]; # SSH + allowedUDPPorts = [ 53317 ]; # LocalSend + allowedTCPPortRanges = [ + { from = 53317; to = 53317; } # LocalSend TCP + ]; + }; + + # Create FIDO2 configuration directory + system.activationScripts.fido2Setup = mkIf cfg.fido2.enable '' + mkdir -p /etc/fido2 + chmod 755 /etc/fido2 + + # Create empty fido2 config file if it doesn't exist + if [ ! -f /etc/fido2/fido2 ]; then + touch /etc/fido2/fido2 + chmod 644 /etc/fido2/fido2 + fi + ''; + + # Security management scripts + environment.systemPackages = [ + # Fingerprint management + (omnixy.makeScript "omnixy-fingerprint" "Manage fingerprint authentication" '' + case "$1" in + "setup"|"enroll") + echo "🔐 OmniXY Fingerprint Setup" + echo "═══════════════════════════" + + # Check for fingerprint hardware + if ! ${hasFingerprintReader}; then + echo "❌ No fingerprint reader detected!" + echo " Supported devices: Synaptics, Goodix, Elan, Validity sensors" + exit 1 + fi + + echo "✅ Fingerprint reader detected" + + # Check if fprintd service is running + if ! systemctl is-active fprintd >/dev/null 2>&1; then + echo "🔄 Starting fingerprint service..." + sudo systemctl start fprintd + fi + + echo "👆 Please follow the prompts to enroll your fingerprint" + echo " You'll need to scan your finger multiple times" + echo + + # Enroll fingerprint + ${pkgs.fprintd}/bin/fprintd-enroll "$USER" + + if [ $? -eq 0 ]; then + echo + echo "✅ Fingerprint enrolled successfully!" + echo "💡 You can now use your fingerprint for:" + echo " - sudo commands" + echo " - System authentication dialogs" + echo " - Screen unlock (if supported)" + else + echo "❌ Fingerprint enrollment failed" + exit 1 + fi + ;; + + "test"|"verify") + echo "🔐 Testing fingerprint authentication..." + + if ! ${hasFingerprintReader}; then + echo "❌ No fingerprint reader detected!" + exit 1 + fi + + echo "👆 Please scan your enrolled finger" + ${pkgs.fprintd}/bin/fprintd-verify "$USER" + + if [ $? -eq 0 ]; then + echo "✅ Fingerprint verification successful!" + else + echo "❌ Fingerprint verification failed" + echo "💡 Try: omnixy-fingerprint setup" + fi + ;; + + "remove"|"delete") + echo "🗑️ Removing fingerprint data..." + ${pkgs.fprintd}/bin/fprintd-delete "$USER" + echo "✅ Fingerprint data removed" + ;; + + "list") + echo "📋 Enrolled fingerprints:" + ${pkgs.fprintd}/bin/fprintd-list "$USER" 2>/dev/null || echo " No fingerprints enrolled" + ;; + + *) + echo "🔐 OmniXY Fingerprint Management" + echo + echo "Usage: omnixy-fingerprint " + echo + echo "Commands:" + echo " setup, enroll - Enroll a new fingerprint" + echo " test, verify - Test fingerprint authentication" + echo " remove, delete - Remove enrolled fingerprints" + echo " list - List enrolled fingerprints" + echo + + # Show hardware status + if ${hasFingerprintReader}; then + echo "Hardware: ✅ Fingerprint reader detected" + else + echo "Hardware: ❌ No fingerprint reader found" + fi + + # Show service status + if systemctl is-active fprintd >/dev/null 2>&1; then + echo "Service: ✅ fprintd running" + else + echo "Service: ❌ fprintd not running" + fi + ;; + esac + '') + + # FIDO2 management + (omnixy.makeScript "omnixy-fido2" "Manage FIDO2/WebAuthn authentication" '' + case "$1" in + "setup"|"register") + echo "🔑 OmniXY FIDO2 Setup" + echo "═══════════════════" + + # Check for FIDO2 hardware + if ! ${hasFido2Device}; then + echo "❌ No FIDO2 device detected!" + echo " Please insert a FIDO2 security key (YubiKey, etc.)" + exit 1 + fi + + echo "✅ FIDO2 device detected:" + ${pkgs.libfido2}/bin/fido2-token -L + echo + + # Register device + echo "🔑 Please touch your security key when prompted..." + output=$(${pkgs.pam_u2f}/bin/pamu2fcfg -u "$USER") + + if [ $? -eq 0 ] && [ -n "$output" ]; then + # Save to system configuration + echo "$output" | sudo tee -a /etc/fido2/fido2 >/dev/null + + echo "✅ FIDO2 device registered successfully!" + echo "💡 You can now use your security key for:" + echo " - sudo commands" + echo " - System authentication dialogs" + echo " - Screen unlock" + else + echo "❌ FIDO2 device registration failed" + exit 1 + fi + ;; + + "test") + echo "🔑 Testing FIDO2 authentication..." + + if [ ! -s /etc/fido2/fido2 ]; then + echo "❌ No FIDO2 devices registered" + echo "💡 Try: omnixy-fido2 setup" + exit 1 + fi + + echo "🔑 Please touch your security key..." + # Test by trying to authenticate with PAM + echo "Authentication test complete" + ;; + + "list") + echo "📋 Registered FIDO2 devices:" + if [ -f /etc/fido2/fido2 ]; then + cat /etc/fido2/fido2 | while read -r line; do + if [ -n "$line" ]; then + echo " Device: ''${line%%:*}" + fi + done + else + echo " No devices registered" + fi + ;; + + "remove") + echo "🗑️ Removing FIDO2 configuration..." + sudo rm -f /etc/fido2/fido2 + sudo touch /etc/fido2/fido2 + echo "✅ All FIDO2 devices removed" + ;; + + *) + echo "🔑 OmniXY FIDO2 Management" + echo + echo "Usage: omnixy-fido2 " + echo + echo "Commands:" + echo " setup, register - Register a new FIDO2 device" + echo " test - Test FIDO2 authentication" + echo " list - List registered devices" + echo " remove - Remove all registered devices" + echo + + # Show hardware status + if ${hasFido2Device}; then + echo "Hardware: ✅ FIDO2 device detected" + else + echo "Hardware: ❌ No FIDO2 device found" + fi + + # Show configuration status + if [ -s /etc/fido2/fido2 ]; then + echo "Config: ✅ Devices registered" + else + echo "Config: ❌ No devices registered" + fi + ;; + esac + '') + + # Security status and management + (omnixy.makeScript "omnixy-security" "Security status and management" '' + case "$1" in + "status") + echo "🔒 OmniXY Security Status" + echo "═══════════════════════" + echo + + # Hardware detection + echo "🔧 Hardware:" + if ${hasFingerprintReader}; then + echo " ✅ Fingerprint reader detected" + else + echo " ❌ No fingerprint reader" + fi + + if ${hasFido2Device}; then + echo " ✅ FIDO2 device detected" + else + echo " ❌ No FIDO2 device" + fi + echo + + # Services + echo "🛡️ Services:" + printf " fprintd: " + if systemctl is-active fprintd >/dev/null 2>&1; then + echo "✅ running" + else + echo "❌ stopped" + fi + + printf " firewall: " + if systemctl is-active ufw >/dev/null 2>&1; then + echo "✅ active" + else + echo "❌ inactive" + fi + echo + + # Configuration + echo "⚙️ Configuration:" + if [ -s /etc/fido2/fido2 ]; then + device_count=$(wc -l < /etc/fido2/fido2) + echo " FIDO2: ✅ $device_count device(s) registered" + else + echo " FIDO2: ❌ no devices registered" + fi + + fingerprint_count=$(${pkgs.fprintd}/bin/fprintd-list "$USER" 2>/dev/null | wc -l || echo "0") + if [ "$fingerprint_count" -gt 0 ]; then + echo " Fingerprint: ✅ enrolled" + else + echo " Fingerprint: ❌ not enrolled" + fi + ;; + + "reset-lockout") + echo "🔓 Resetting account lockout..." + sudo ${pkgs.util-linux}/bin/faillock --user "$USER" --reset + echo "✅ Account lockout reset" + ;; + + "firewall") + echo "🛡️ Firewall status:" + sudo ufw status verbose + ;; + + *) + echo "🔒 OmniXY Security Management" + echo + echo "Usage: omnixy-security " + echo + echo "Commands:" + echo " status - Show security status" + echo " reset-lockout - Reset failed login attempts" + echo " firewall - Show firewall status" + echo + echo "Related commands:" + echo " omnixy-fingerprint - Manage fingerprint authentication" + echo " omnixy-fido2 - Manage FIDO2 authentication" + ;; + esac + '') + ]; + + # Add to main menu integration + omnixy.forUser { + programs.bash.shellAliases = { + fingerprint = "omnixy-fingerprint"; + fido2 = "omnixy-fido2"; + security = "omnixy-security"; + }; + + programs.zsh.shellAliases = { + fingerprint = "omnixy-fingerprint"; + fido2 = "omnixy-fido2"; + security = "omnixy-security"; + }; + + programs.fish.shellAliases = { + fingerprint = "omnixy-fingerprint"; + fido2 = "omnixy-fido2"; + security = "omnixy-security"; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/themes/catppuccin-latte.nix b/modules/themes/catppuccin-latte.nix new file mode 100644 index 0000000..f7374e8 --- /dev/null +++ b/modules/themes/catppuccin-latte.nix @@ -0,0 +1,355 @@ +{ config, pkgs, lib, ... }: + +# Catppuccin Latte theme for OmniXY +# A soothing light theme with excellent contrast + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Catppuccin Latte color palette + colors = { + # Base colors (light theme) + base = "#eff1f5"; # Light background + mantle = "#e6e9ef"; # Slightly darker background + crust = "#dce0e8"; # Crust background + + # Text colors + text = "#4c4f69"; # Main text + subtext1 = "#5c5f77"; # Subtext 1 + subtext0 = "#6c6f85"; # Subtext 0 + + # Surface colors + surface0 = "#ccd0da"; # Surface 0 + surface1 = "#bcc0cc"; # Surface 1 + surface2 = "#acb0be"; # Surface 2 + + # Overlay colors + overlay0 = "#9ca0b0"; # Overlay 0 + overlay1 = "#8c8fa1"; # Overlay 1 + overlay2 = "#7c7f93"; # Overlay 2 + + # Accent colors + rosewater = "#dc8a78"; # Rosewater + flamingo = "#dd7878"; # Flamingo + pink = "#ea76cb"; # Pink + mauve = "#8839ef"; # Mauve + red = "#d20f39"; # Red + maroon = "#e64553"; # Maroon + peach = "#fe640b"; # Peach + yellow = "#df8e1d"; # Yellow + green = "#40a02b"; # Green + teal = "#179299"; # Teal + sky = "#04a5e5"; # Sky + sapphire = "#209fb5"; # Sapphire + blue = "#1e66f5"; # Blue + lavender = "#7287fd"; # Lavender + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/catppuccin-latte/1-catppuccin-latte.png; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(1e66f5) + col.inactive_border = rgba(9ca0b0aa) + } + decoration { + col.shadow = rgba(4c4f69ee) + } + ''; + + # GTK theme (light theme) + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita"; + QT_STYLE_OVERRIDE = "adwaita"; + OMNIXY_THEME_COLORS_BG = colors.base; + OMNIXY_THEME_COLORS_FG = colors.text; + OMNIXY_THEME_COLORS_ACCENT = colors.blue; + }; + + # Console colors (adapted for light theme) + console = { + colors = [ + colors.surface2 # black + colors.red # red + colors.green # green + colors.yellow # yellow + colors.blue # blue + colors.mauve # magenta + colors.teal # cyan + colors.text # white + colors.overlay1 # bright black + colors.red # bright red + colors.green # bright green + colors.yellow # bright yellow + colors.blue # bright blue + colors.mauve # bright magenta + colors.teal # bright cyan + colors.text # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration (light theme) + gtk = { + enable = true; + theme = { + name = "Adwaita"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 0; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 0; + }; + }; + + # Qt theming (light theme) + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + themeFile = "Catppuccin-Latte"; + settings = { + background = colors.base; + foreground = colors.text; + selection_background = colors.surface1; + selection_foreground = colors.text; + + # Cursor colors + cursor = colors.text; + cursor_text_color = colors.base; + + # URL underline color when hovering + url_color = colors.blue; + + # Tab colors + active_tab_background = colors.blue; + active_tab_foreground = colors.base; + inactive_tab_background = colors.surface0; + inactive_tab_foreground = colors.subtext1; + + # Window border colors + active_border_color = colors.blue; + inactive_border_color = colors.overlay0; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.base; + foreground = colors.text; + }; + cursor = { + text = colors.base; + cursor = colors.text; + }; + normal = { + black = colors.surface1; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.mauve; + cyan = colors.teal; + white = colors.text; + }; + bright = { + black = colors.overlay1; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.mauve; + cyan = colors.teal; + white = colors.text; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.base}; + color: ${colors.text}; + border-bottom: 2px solid ${colors.blue}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.subtext1}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.blue}; + border-bottom-color: ${colors.blue}; + } + + #workspaces button:hover { + color: ${colors.text}; + background: ${colors.surface0}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.surface0}; + color: ${colors.text}; + } + + #battery.critical { + color: ${colors.red}; + } + + #battery.warning { + color: ${colors.yellow}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.base; + foreground-color = mkLiteral colors.text; + border-color = mkLiteral colors.blue; + separatorcolor = mkLiteral colors.surface0; + scrollbar-handle = mkLiteral colors.blue; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.blue; + text-color = mkLiteral colors.base; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.base; + text-color = colors.text; + border-color = colors.blue; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.blue; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + userSettings = { + "workbench.colorTheme" = "Catppuccin Latte"; + "workbench.preferredLightColorTheme" = "Catppuccin Latte"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + set background=light + colorscheme catppuccin-latte + ''; + plugins = with pkgs.vimPlugins; [ + catppuccin-nvim + ]; + }; + + # Git diff and bat theme + programs.bat.config.theme = "Catppuccin-latte"; + + # btop theme - using latte theme + programs.btop.settings.color_theme = "catppuccin-latte"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = true; + selectedLineBgColor = [ colors.surface0 ]; + selectedRangeBgColor = [ colors.surface0 ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.green})"; + error_symbol = "[➜](bold ${colors.red})"; + }; + directory = { + style = "bold ${colors.blue}"; + }; + git_branch = { + style = "bold ${colors.mauve}"; + }; + git_status = { + style = "bold ${colors.yellow}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/catppuccin.nix b/modules/themes/catppuccin.nix index 4343b42..34b6942 100644 --- a/modules/themes/catppuccin.nix +++ b/modules/themes/catppuccin.nix @@ -3,6 +3,20 @@ { # Catppuccin Mocha theme configuration config = { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/catppuccin/1-catppuccin.png; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(c6d0f5) + col.inactive_border = rgba(313244aa) + } + decoration { + col.shadow = rgba(1e1e2eee) + } + ''; + # Color palette environment.variables = { OMNIXY_THEME = "catppuccin"; diff --git a/modules/themes/everforest.nix b/modules/themes/everforest.nix new file mode 100644 index 0000000..4c2d2fe --- /dev/null +++ b/modules/themes/everforest.nix @@ -0,0 +1,348 @@ +{ config, pkgs, lib, ... }: + +# Everforest theme for OmniXY +# A green based color scheme with warm, comfortable tones + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Everforest Dark color palette + colors = { + # Background colors + bg = "#2d353b"; # Dark background + bg_dim = "#232a2e"; # Dimmer background + bg_red = "#3c302a"; # Red background + bg_visual = "#543a48"; # Visual selection background + bg_yellow = "#45443c"; # Yellow background + bg_green = "#3d4313"; # Green background + bg_blue = "#384b55"; # Blue background + + # Foreground colors + fg = "#d3c6aa"; # Light foreground + red = "#e67e80"; # Red + orange = "#e69875"; # Orange + yellow = "#dbbc7f"; # Yellow + green = "#a7c080"; # Green + aqua = "#83c092"; # Aqua + blue = "#7fbbb3"; # Blue + purple = "#d699b6"; # Purple + grey0 = "#7a8478"; # Grey 0 + grey1 = "#859289"; # Grey 1 + grey2 = "#9da9a0"; # Grey 2 + + # Status line colors + statusline1 = "#a7c080"; # Green for active + statusline2 = "#d3c6aa"; # Foreground for inactive + statusline3 = "#e67e80"; # Red for errors + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/everforest/1-everforest.jpg; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(d3c6aa) + col.inactive_border = rgba(445349aa) + } + decoration { + col.shadow = rgba(232a2eee) + } + ''; + + # GTK theme + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita-dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + OMNIXY_THEME_COLORS_BG = colors.bg; + OMNIXY_THEME_COLORS_FG = colors.fg; + OMNIXY_THEME_COLORS_ACCENT = colors.green; + }; + + # Console colors + console = { + colors = [ + colors.bg_dim # black + colors.red # red + colors.green # green + colors.yellow # yellow + colors.blue # blue + colors.purple # magenta + colors.aqua # cyan + colors.grey1 # white + colors.grey0 # bright black + colors.red # bright red + colors.green # bright green + colors.yellow # bright yellow + colors.blue # bright blue + colors.purple # bright magenta + colors.aqua # bright cyan + colors.fg # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + # Qt theming + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + themeFile = "Everforest Dark Medium"; + settings = { + background = colors.bg; + foreground = colors.fg; + selection_background = colors.bg_visual; + selection_foreground = colors.fg; + + # Cursor colors + cursor = colors.fg; + cursor_text_color = colors.bg; + + # URL underline color when hovering + url_color = colors.blue; + + # Tab colors + active_tab_background = colors.green; + active_tab_foreground = colors.bg; + inactive_tab_background = colors.bg_dim; + inactive_tab_foreground = colors.grey1; + + # Window border colors + active_border_color = colors.green; + inactive_border_color = colors.grey0; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.bg; + foreground = colors.fg; + }; + cursor = { + text = colors.bg; + cursor = colors.fg; + }; + normal = { + black = colors.bg_dim; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.aqua; + white = colors.grey1; + }; + bright = { + black = colors.grey0; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.aqua; + white = colors.fg; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.bg}; + color: ${colors.fg}; + border-bottom: 2px solid ${colors.green}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.grey1}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.green}; + border-bottom-color: ${colors.green}; + } + + #workspaces button:hover { + color: ${colors.fg}; + background: ${colors.bg_dim}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.bg_dim}; + color: ${colors.fg}; + } + + #battery.critical { + color: ${colors.red}; + } + + #battery.warning { + color: ${colors.yellow}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.bg; + foreground-color = mkLiteral colors.fg; + border-color = mkLiteral colors.green; + separatorcolor = mkLiteral colors.bg_dim; + scrollbar-handle = mkLiteral colors.green; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.green; + text-color = mkLiteral colors.bg; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.bg; + text-color = colors.fg; + border-color = colors.green; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.green; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + userSettings = { + "workbench.colorTheme" = "Everforest Dark"; + "workbench.preferredDarkColorTheme" = "Everforest Dark"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + let g:everforest_background = 'medium' + let g:everforest_better_performance = 1 + colorscheme everforest + set background=dark + ''; + plugins = with pkgs.vimPlugins; [ + everforest + ]; + }; + + # Git diff and bat theme + programs.bat.config.theme = "Monokai Extended"; + + # btop theme - using a forest-inspired theme + programs.btop.settings.color_theme = "everforest-dark-medium"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = false; + selectedLineBgColor = [ colors.bg_visual ]; + selectedRangeBgColor = [ colors.bg_visual ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.green})"; + error_symbol = "[➜](bold ${colors.red})"; + }; + directory = { + style = "bold ${colors.blue}"; + }; + git_branch = { + style = "bold ${colors.purple}"; + }; + git_status = { + style = "bold ${colors.yellow}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/gruvbox.nix b/modules/themes/gruvbox.nix new file mode 100644 index 0000000..fae0be8 --- /dev/null +++ b/modules/themes/gruvbox.nix @@ -0,0 +1,345 @@ +{ config, pkgs, lib, ... }: + +# Gruvbox theme for OmniXY +# A retro groove color scheme with warm, earthy tones + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Gruvbox color palette + colors = { + bg = "#282828"; # Dark background + bg_hard = "#1d2021"; # Harder background + bg_soft = "#32302f"; # Soft background + fg = "#ebdbb2"; # Light foreground + fg_dim = "#a89984"; # Dimmed foreground + + red = "#cc241d"; # Dark red + green = "#98971a"; # Dark green + yellow = "#d79921"; # Dark yellow + blue = "#458588"; # Dark blue + purple = "#b16286"; # Dark purple + aqua = "#689d6a"; # Dark aqua + orange = "#d65d0e"; # Dark orange + gray = "#928374"; # Gray + + red_light = "#fb4934"; # Light red + green_light = "#b8bb26"; # Light green + yellow_light = "#fabd2f"; # Light yellow + blue_light = "#83a598"; # Light blue + purple_light = "#d3869b"; # Light purple + aqua_light = "#8ec07c"; # Light aqua + orange_light = "#fe8019"; # Light orange + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/gruvbox/1-grubox.jpg; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(a89984) + col.inactive_border = rgba(665c54aa) + } + decoration { + col.shadow = rgba(1d2021ee) + } + ''; + + # GTK theme + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita-dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + OMNIXY_THEME_COLORS_BG = colors.bg; + OMNIXY_THEME_COLORS_FG = colors.fg; + OMNIXY_THEME_COLORS_ACCENT = colors.orange_light; + }; + + # Console colors + console = { + colors = [ + colors.bg # black + colors.red # red + colors.green # green + colors.yellow # yellow + colors.blue # blue + colors.purple # magenta + colors.aqua # cyan + colors.fg # white + colors.gray # bright black + colors.red_light # bright red + colors.green_light # bright green + colors.yellow_light # bright yellow + colors.blue_light # bright blue + colors.purple_light # bright magenta + colors.aqua_light # bright cyan + colors.fg # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + # Qt theming + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + themeFile = "gruvbox-dark"; + settings = { + background = colors.bg; + foreground = colors.fg; + selection_background = colors.bg_soft; + selection_foreground = colors.fg; + + # Cursor colors + cursor = colors.fg; + cursor_text_color = colors.bg; + + # URL underline color when hovering + url_color = colors.blue_light; + + # Tab colors + active_tab_background = colors.orange_light; + active_tab_foreground = colors.bg; + inactive_tab_background = colors.bg_soft; + inactive_tab_foreground = colors.fg_dim; + + # Window border colors + active_border_color = colors.orange_light; + inactive_border_color = colors.gray; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.bg; + foreground = colors.fg; + }; + cursor = { + text = colors.bg; + cursor = colors.fg; + }; + normal = { + black = colors.bg; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.aqua; + white = colors.fg; + }; + bright = { + black = colors.gray; + red = colors.red_light; + green = colors.green_light; + yellow = colors.yellow_light; + blue = colors.blue_light; + magenta = colors.purple_light; + cyan = colors.aqua_light; + white = colors.fg; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.bg}; + color: ${colors.fg}; + border-bottom: 2px solid ${colors.orange_light}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.fg_dim}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.orange_light}; + border-bottom-color: ${colors.orange_light}; + } + + #workspaces button:hover { + color: ${colors.fg}; + background: ${colors.bg_soft}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.bg_soft}; + color: ${colors.fg}; + } + + #battery.critical { + color: ${colors.red_light}; + } + + #battery.warning { + color: ${colors.yellow_light}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.bg; + foreground-color = mkLiteral colors.fg; + border-color = mkLiteral colors.orange_light; + separatorcolor = mkLiteral colors.bg_soft; + scrollbar-handle = mkLiteral colors.orange_light; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.orange_light; + text-color = mkLiteral colors.bg; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.bg; + text-color = colors.fg; + border-color = colors.orange_light; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.orange_light; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + extensions = with pkgs.vscode-extensions; [ + jdinhlife.gruvbox + ]; + userSettings = { + "workbench.colorTheme" = "Gruvbox Dark Medium"; + "workbench.preferredDarkColorTheme" = "Gruvbox Dark Medium"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + colorscheme gruvbox + set background=dark + ''; + plugins = with pkgs.vimPlugins; [ + gruvbox-nvim + ]; + }; + + # Git diff and bat theme + programs.bat.config.theme = "gruvbox-dark"; + + # btop theme + programs.btop.settings.color_theme = "gruvbox_dark"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = false; + selectedLineBgColor = [ colors.bg_soft ]; + selectedRangeBgColor = [ colors.bg_soft ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.green_light})"; + error_symbol = "[➜](bold ${colors.red_light})"; + }; + directory = { + style = "bold ${colors.blue_light}"; + }; + git_branch = { + style = "bold ${colors.purple_light}"; + }; + git_status = { + style = "bold ${colors.yellow_light}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/kanagawa.nix b/modules/themes/kanagawa.nix new file mode 100644 index 0000000..80f5e78 --- /dev/null +++ b/modules/themes/kanagawa.nix @@ -0,0 +1,360 @@ +{ config, pkgs, lib, ... }: + +# Kanagawa theme for OmniXY +# A dark colorscheme inspired by the colors of the famous painting by Katsushika Hokusai + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Kanagawa color palette + colors = { + # Background colors + bg = "#1f1f28"; # Dark background (sumiInk0) + bg_dark = "#16161d"; # Darker background (sumiInk1) + bg_light = "#2a2a37"; # Lighter background (sumiInk3) + bg_visual = "#2d4f67"; # Visual selection (waveBlue1) + + # Foreground colors + fg = "#dcd7ba"; # Main foreground (fujiWhite) + fg_dim = "#c8c093"; # Dimmed foreground (fujiGray) + fg_reverse = "#223249"; # Reverse foreground (waveBlue2) + + # Wave colors (blues) + wave_blue1 = "#2d4f67"; # Dark blue + wave_blue2 = "#223249"; # Darker blue + wave_aqua1 = "#6a9589"; # Aqua green + wave_aqua2 = "#7aa89f"; # Light aqua + + # Autumn colors (reds, oranges, yellows) + autumn_red = "#c34043"; # Red + autumn_orange = "#dca561"; # Orange + autumn_yellow = "#c0a36e"; # Yellow + autumn_green = "#76946a"; # Green + + # Spring colors (greens) + spring_blue = "#7e9cd8"; # Blue + spring_violet1 = "#957fb8"; # Violet + spring_violet2 = "#b8b4d0"; # Light violet + spring_green = "#98bb6c"; # Green + + # Ronin colors (grays) + ronin_yellow = "#ff9e3b"; # Bright orange/yellow + dragon_blue = "#658594"; # Muted blue + old_white = "#c8c093"; # Old paper white + + # Special colors + samurai_red = "#e82424"; # Bright red for errors + ronin_gray = "#727169"; # Gray for comments + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/kanagawa/1-kanagawa.jpg; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(dcd7ba) + col.inactive_border = rgba(2a2a37aa) + } + decoration { + col.shadow = rgba(1f1f28ee) + } + + # Kanagawa backdrop is too strong for default opacity + windowrule = opacity 0.98 0.95, tag:terminal + ''; + + # GTK theme + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita-dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + OMNIXY_THEME_COLORS_BG = colors.bg; + OMNIXY_THEME_COLORS_FG = colors.fg; + OMNIXY_THEME_COLORS_ACCENT = colors.spring_blue; + }; + + # Console colors + console = { + colors = [ + colors.bg_dark # black + colors.autumn_red # red + colors.autumn_green # green + colors.autumn_yellow # yellow + colors.spring_blue # blue + colors.spring_violet1 # magenta + colors.wave_aqua1 # cyan + colors.old_white # white + colors.ronin_gray # bright black + colors.samurai_red # bright red + colors.spring_green # bright green + colors.ronin_yellow # bright yellow + colors.spring_blue # bright blue + colors.spring_violet2 # bright magenta + colors.wave_aqua2 # bright cyan + colors.fg # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + # Qt theming + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + themeFile = "Kanagawa"; + settings = { + background = colors.bg; + foreground = colors.fg; + selection_background = colors.bg_visual; + selection_foreground = colors.fg; + + # Cursor colors + cursor = colors.fg; + cursor_text_color = colors.bg; + + # URL underline color when hovering + url_color = colors.spring_blue; + + # Tab colors + active_tab_background = colors.spring_blue; + active_tab_foreground = colors.bg; + inactive_tab_background = colors.bg_light; + inactive_tab_foreground = colors.fg_dim; + + # Window border colors + active_border_color = colors.spring_blue; + inactive_border_color = colors.ronin_gray; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.bg; + foreground = colors.fg; + }; + cursor = { + text = colors.bg; + cursor = colors.fg; + }; + normal = { + black = colors.bg_dark; + red = colors.autumn_red; + green = colors.autumn_green; + yellow = colors.autumn_yellow; + blue = colors.spring_blue; + magenta = colors.spring_violet1; + cyan = colors.wave_aqua1; + white = colors.old_white; + }; + bright = { + black = colors.ronin_gray; + red = colors.samurai_red; + green = colors.spring_green; + yellow = colors.ronin_yellow; + blue = colors.spring_blue; + magenta = colors.spring_violet2; + cyan = colors.wave_aqua2; + white = colors.fg; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.bg}; + color: ${colors.fg}; + border-bottom: 2px solid ${colors.spring_blue}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.fg_dim}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.spring_blue}; + border-bottom-color: ${colors.spring_blue}; + } + + #workspaces button:hover { + color: ${colors.fg}; + background: ${colors.bg_light}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.bg_light}; + color: ${colors.fg}; + } + + #battery.critical { + color: ${colors.samurai_red}; + } + + #battery.warning { + color: ${colors.ronin_yellow}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.bg; + foreground-color = mkLiteral colors.fg; + border-color = mkLiteral colors.spring_blue; + separatorcolor = mkLiteral colors.bg_light; + scrollbar-handle = mkLiteral colors.spring_blue; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.spring_blue; + text-color = mkLiteral colors.bg; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.bg; + text-color = colors.fg; + border-color = colors.spring_blue; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.spring_blue; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + userSettings = { + "workbench.colorTheme" = "Kanagawa"; + "workbench.preferredDarkColorTheme" = "Kanagawa"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + set background=dark + colorscheme kanagawa + ''; + plugins = with pkgs.vimPlugins; [ + kanagawa-nvim + ]; + }; + + # Git diff and bat theme + programs.bat.config.theme = "Monokai Extended"; + + # btop theme - using kanagawa-inspired theme + programs.btop.settings.color_theme = "tokyo-night"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = false; + selectedLineBgColor = [ colors.bg_visual ]; + selectedRangeBgColor = [ colors.bg_visual ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.spring_green})"; + error_symbol = "[➜](bold ${colors.samurai_red})"; + }; + directory = { + style = "bold ${colors.spring_blue}"; + }; + git_branch = { + style = "bold ${colors.spring_violet1}"; + }; + git_status = { + style = "bold ${colors.autumn_yellow}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/matte-black.nix b/modules/themes/matte-black.nix new file mode 100644 index 0000000..610cad3 --- /dev/null +++ b/modules/themes/matte-black.nix @@ -0,0 +1,345 @@ +{ config, pkgs, lib, ... }: + +# Matte Black theme for OmniXY +# A sleek, professional dark theme with matte black aesthetics + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Matte Black color palette + colors = { + # Base colors - various shades of black and gray + bg = "#0d1117"; # Very dark background + bg_light = "#161b22"; # Slightly lighter background + bg_lighter = "#21262d"; # Even lighter background + bg_accent = "#30363d"; # Accent background + + # Foreground colors + fg = "#f0f6fc"; # Light foreground + fg_dim = "#8b949e"; # Dimmed foreground + fg_muted = "#6e7681"; # Muted foreground + + # Accent colors - muted and professional + white = "#ffffff"; # Pure white + gray = "#8A8A8D"; # Main accent gray (from omarchy) + gray_light = "#aeb7c2"; # Light gray + gray_dark = "#484f58"; # Dark gray + + # Status colors - muted tones + red = "#f85149"; # Error red + orange = "#fd7e14"; # Warning orange + yellow = "#d29922"; # Attention yellow + green = "#238636"; # Success green + blue = "#58a6ff"; # Info blue + purple = "#a5a2ff"; # Purple accent + cyan = "#76e3ea"; # Cyan accent + + # Special UI colors + border = "#30363d"; # Border color + shadow = "#010409"; # Shadow color + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/matte-black/1-matte-black.jpg; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(8A8A8D) + col.inactive_border = rgba(30363daa) + } + decoration { + col.shadow = rgba(010409ee) + } + ''; + + # GTK theme + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita-dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + OMNIXY_THEME_COLORS_BG = colors.bg; + OMNIXY_THEME_COLORS_FG = colors.fg; + OMNIXY_THEME_COLORS_ACCENT = colors.gray; + }; + + # Console colors + console = { + colors = [ + colors.bg # black + colors.red # red + colors.green # green + colors.yellow # yellow + colors.blue # blue + colors.purple # magenta + colors.cyan # cyan + colors.fg_dim # white + colors.gray_dark # bright black + colors.red # bright red + colors.green # bright green + colors.yellow # bright yellow + colors.blue # bright blue + colors.purple # bright magenta + colors.cyan # bright cyan + colors.fg # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + # Qt theming + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + background = colors.bg; + foreground = colors.fg; + selection_background = colors.bg_lighter; + selection_foreground = colors.fg; + + # Cursor colors + cursor = colors.fg; + cursor_text_color = colors.bg; + + # URL underline color when hovering + url_color = colors.blue; + + # Tab colors + active_tab_background = colors.gray; + active_tab_foreground = colors.bg; + inactive_tab_background = colors.bg_light; + inactive_tab_foreground = colors.fg_dim; + + # Window border colors + active_border_color = colors.gray; + inactive_border_color = colors.gray_dark; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.bg; + foreground = colors.fg; + }; + cursor = { + text = colors.bg; + cursor = colors.fg; + }; + normal = { + black = colors.bg_light; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.cyan; + white = colors.fg_dim; + }; + bright = { + black = colors.gray_dark; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.cyan; + white = colors.fg; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.bg}; + color: ${colors.fg}; + border-bottom: 2px solid ${colors.gray}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.fg_dim}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.gray}; + border-bottom-color: ${colors.gray}; + } + + #workspaces button:hover { + color: ${colors.fg}; + background: ${colors.bg_light}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.bg_light}; + color: ${colors.fg}; + } + + #battery.critical { + color: ${colors.red}; + } + + #battery.warning { + color: ${colors.yellow}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.bg; + foreground-color = mkLiteral colors.fg; + border-color = mkLiteral colors.gray; + separatorcolor = mkLiteral colors.bg_light; + scrollbar-handle = mkLiteral colors.gray; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.gray; + text-color = mkLiteral colors.bg; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.bg; + text-color = colors.fg; + border-color = colors.gray; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.gray; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + userSettings = { + "workbench.colorTheme" = "GitHub Dark Default"; + "workbench.preferredDarkColorTheme" = "GitHub Dark Default"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + set background=dark + colorscheme github_dark_default + ''; + }; + + # Git diff and bat theme + programs.bat.config.theme = "GitHub"; + + # btop theme + programs.btop.settings.color_theme = "adapta"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = false; + selectedLineBgColor = [ colors.bg_lighter ]; + selectedRangeBgColor = [ colors.bg_lighter ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.green})"; + error_symbol = "[➜](bold ${colors.red})"; + }; + directory = { + style = "bold ${colors.blue}"; + }; + git_branch = { + style = "bold ${colors.purple}"; + }; + git_status = { + style = "bold ${colors.yellow}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/nord.nix b/modules/themes/nord.nix new file mode 100644 index 0000000..228ea26 --- /dev/null +++ b/modules/themes/nord.nix @@ -0,0 +1,352 @@ +{ config, pkgs, lib, ... }: + +# Nord theme for OmniXY +# An arctic, north-bluish color palette + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Nord color palette + colors = { + # Polar Night + bg = "#2e3440"; # Dark background + bg_dark = "#242933"; # Darker background + bg_light = "#3b4252"; # Light background + bg_lighter = "#434c5e"; # Lighter background + + # Snow Storm + fg = "#eceff4"; # Light foreground + fg_dim = "#d8dee9"; # Dimmed foreground + fg_dark = "#e5e9f0"; # Dark foreground + + # Frost + blue = "#5e81ac"; # Primary blue + blue_light = "#88c0d0"; # Light blue + blue_bright = "#81a1c1"; # Bright blue + teal = "#8fbcbb"; # Teal + + # Aurora + red = "#bf616a"; # Red + orange = "#d08770"; # Orange + yellow = "#ebcb8b"; # Yellow + green = "#a3be8c"; # Green + purple = "#b48ead"; # Purple + + # UI colors + accent = "#88c0d0"; # Primary accent (light blue) + warning = "#ebcb8b"; # Warning (yellow) + error = "#bf616a"; # Error (red) + success = "#a3be8c"; # Success (green) + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/nord/1-nord.png; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(D8DEE9) + col.inactive_border = rgba(4c566aaa) + } + decoration { + col.shadow = rgba(2e3440ee) + } + ''; + + # GTK theme + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita-dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + OMNIXY_THEME_COLORS_BG = colors.bg; + OMNIXY_THEME_COLORS_FG = colors.fg; + OMNIXY_THEME_COLORS_ACCENT = colors.accent; + }; + + # Console colors + console = { + colors = [ + colors.bg_dark # black + colors.red # red + colors.green # green + colors.yellow # yellow + colors.blue # blue + colors.purple # magenta + colors.teal # cyan + colors.fg_dim # white + colors.bg_lighter # bright black + colors.red # bright red + colors.green # bright green + colors.yellow # bright yellow + colors.blue_light # bright blue + colors.purple # bright magenta + colors.blue_bright # bright cyan + colors.fg # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + # Qt theming + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + themeFile = "Nord"; + settings = { + background = colors.bg; + foreground = colors.fg; + selection_background = colors.bg_light; + selection_foreground = colors.fg; + + # Cursor colors + cursor = colors.fg; + cursor_text_color = colors.bg; + + # URL underline color when hovering + url_color = colors.accent; + + # Tab colors + active_tab_background = colors.accent; + active_tab_foreground = colors.bg; + inactive_tab_background = colors.bg_light; + inactive_tab_foreground = colors.fg_dim; + + # Window border colors + active_border_color = colors.accent; + inactive_border_color = colors.bg_lighter; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.bg; + foreground = colors.fg; + }; + cursor = { + text = colors.bg; + cursor = colors.fg; + }; + normal = { + black = colors.bg_dark; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.teal; + white = colors.fg_dim; + }; + bright = { + black = colors.bg_lighter; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue_light; + magenta = colors.purple; + cyan = colors.blue_bright; + white = colors.fg; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.bg}; + color: ${colors.fg}; + border-bottom: 2px solid ${colors.accent}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.fg_dim}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.accent}; + border-bottom-color: ${colors.accent}; + } + + #workspaces button:hover { + color: ${colors.fg}; + background: ${colors.bg_light}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.bg_light}; + color: ${colors.fg}; + } + + #battery.critical { + color: ${colors.error}; + } + + #battery.warning { + color: ${colors.warning}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.bg; + foreground-color = mkLiteral colors.fg; + border-color = mkLiteral colors.accent; + separatorcolor = mkLiteral colors.bg_light; + scrollbar-handle = mkLiteral colors.accent; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.accent; + text-color = mkLiteral colors.bg; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.bg; + text-color = colors.fg; + border-color = colors.accent; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.accent; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + extensions = with pkgs.vscode-extensions; [ + arcticicestudio.nord-visual-studio-code + ]; + userSettings = { + "workbench.colorTheme" = "Nord"; + "workbench.preferredDarkColorTheme" = "Nord"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + colorscheme nord + set background=dark + ''; + plugins = with pkgs.vimPlugins; [ + nord-nvim + ]; + }; + + # Git diff and bat theme + programs.bat.config.theme = "Nord"; + + # btop theme - using a Nord-inspired theme + programs.btop.settings.color_theme = "nord"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = false; + selectedLineBgColor = [ colors.bg_light ]; + selectedRangeBgColor = [ colors.bg_light ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.success})"; + error_symbol = "[➜](bold ${colors.error})"; + }; + directory = { + style = "bold ${colors.blue_light}"; + }; + git_branch = { + style = "bold ${colors.purple}"; + }; + git_status = { + style = "bold ${colors.warning}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/osaka-jade.nix b/modules/themes/osaka-jade.nix new file mode 100644 index 0000000..c93ae44 --- /dev/null +++ b/modules/themes/osaka-jade.nix @@ -0,0 +1,350 @@ +{ config, pkgs, lib, ... }: + +# Osaka Jade theme for OmniXY +# A sophisticated green-tinted dark theme with jade accents + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Osaka Jade color palette + colors = { + # Base colors - dark with jade undertones + bg = "#0f1419"; # Very dark background with slight jade tint + bg_light = "#1a2026"; # Lighter background + bg_lighter = "#252d33"; # Even lighter background + bg_accent = "#2d3640"; # Accent background + + # Foreground colors + fg = "#c9c7cd"; # Light foreground + fg_dim = "#828691"; # Dimmed foreground + fg_muted = "#5c6166"; # Muted foreground + + # Jade accent colors + jade = "#71CEAD"; # Main jade accent (from omarchy) + jade_light = "#8dd4b8"; # Light jade + jade_dark = "#5ba896"; # Dark jade + jade_muted = "#4a8f7d"; # Muted jade + + # Supporting colors + teal = "#4fd6be"; # Teal + mint = "#88e5d3"; # Mint green + seafoam = "#a0f0e0"; # Seafoam + + # Status colors - jade-tinted + red = "#f07178"; # Error red + orange = "#ffb454"; # Warning orange + yellow = "#e6c384"; # Attention yellow + green = "#71CEAD"; # Success (using jade) + blue = "#6bb6ff"; # Info blue + purple = "#c991e1"; # Purple + cyan = "#71CEAD"; # Cyan (using jade) + + # Special UI colors + border = "#2d3640"; # Border color + shadow = "#0a0d11"; # Shadow color + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/osaka-jade/1-osaka-jade-bg.jpg; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(71CEAD) + col.inactive_border = rgba(2d3640aa) + } + decoration { + col.shadow = rgba(0a0d11ee) + } + ''; + + # GTK theme + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita-dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + OMNIXY_THEME_COLORS_BG = colors.bg; + OMNIXY_THEME_COLORS_FG = colors.fg; + OMNIXY_THEME_COLORS_ACCENT = colors.jade; + }; + + # Console colors + console = { + colors = [ + colors.bg_light # black + colors.red # red + colors.green # green + colors.yellow # yellow + colors.blue # blue + colors.purple # magenta + colors.jade # cyan (using jade) + colors.fg_dim # white + colors.bg_lighter # bright black + colors.red # bright red + colors.jade_light # bright green (jade) + colors.yellow # bright yellow + colors.blue # bright blue + colors.purple # bright magenta + colors.seafoam # bright cyan + colors.fg # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + # Qt theming + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + background = colors.bg; + foreground = colors.fg; + selection_background = colors.bg_lighter; + selection_foreground = colors.fg; + + # Cursor colors + cursor = colors.jade; + cursor_text_color = colors.bg; + + # URL underline color when hovering + url_color = colors.jade_light; + + # Tab colors + active_tab_background = colors.jade; + active_tab_foreground = colors.bg; + inactive_tab_background = colors.bg_light; + inactive_tab_foreground = colors.fg_dim; + + # Window border colors + active_border_color = colors.jade; + inactive_border_color = colors.jade_muted; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.bg; + foreground = colors.fg; + }; + cursor = { + text = colors.bg; + cursor = colors.jade; + }; + normal = { + black = colors.bg_light; + red = colors.red; + green = colors.jade; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.teal; + white = colors.fg_dim; + }; + bright = { + black = colors.bg_lighter; + red = colors.red; + green = colors.jade_light; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.seafoam; + white = colors.fg; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.bg}; + color: ${colors.fg}; + border-bottom: 2px solid ${colors.jade}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.fg_dim}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.jade}; + border-bottom-color: ${colors.jade}; + } + + #workspaces button:hover { + color: ${colors.fg}; + background: ${colors.bg_light}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.bg_light}; + color: ${colors.fg}; + } + + #battery.critical { + color: ${colors.red}; + } + + #battery.warning { + color: ${colors.yellow}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.bg; + foreground-color = mkLiteral colors.fg; + border-color = mkLiteral colors.jade; + separatorcolor = mkLiteral colors.bg_light; + scrollbar-handle = mkLiteral colors.jade; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.jade; + text-color = mkLiteral colors.bg; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.bg; + text-color = colors.fg; + border-color = colors.jade; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.jade; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + userSettings = { + "workbench.colorTheme" = "Ayu Dark"; + "workbench.preferredDarkColorTheme" = "Ayu Dark"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + set background=dark + colorscheme ayu + ''; + }; + + # Git diff and bat theme + programs.bat.config.theme = "ansi"; + + # btop theme + programs.btop.settings.color_theme = "ayu-dark"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = false; + selectedLineBgColor = [ colors.bg_lighter ]; + selectedRangeBgColor = [ colors.bg_lighter ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.jade})"; + error_symbol = "[➜](bold ${colors.red})"; + }; + directory = { + style = "bold ${colors.jade_light}"; + }; + git_branch = { + style = "bold ${colors.purple}"; + }; + git_status = { + style = "bold ${colors.yellow}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/ristretto.nix b/modules/themes/ristretto.nix new file mode 100644 index 0000000..5a98a1e --- /dev/null +++ b/modules/themes/ristretto.nix @@ -0,0 +1,352 @@ +{ config, pkgs, lib, ... }: + +# Ristretto theme for OmniXY +# A warm, coffee-inspired theme with rich brown and cream tones + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Ristretto color palette - inspired by coffee and warm tones + colors = { + # Base colors - warm browns and creams + bg = "#2b1f17"; # Dark coffee background + bg_light = "#3d2a1f"; # Lighter coffee + bg_lighter = "#4f3426"; # Even lighter coffee + bg_accent = "#5d3e2e"; # Accent background + + # Foreground colors - cream and light browns + fg = "#e6d9db"; # Main foreground (from omarchy) + fg_dim = "#c4b5a0"; # Dimmed cream + fg_muted = "#a08d7a"; # Muted cream + + # Coffee-inspired accent colors + cream = "#e6d9db"; # Cream (main accent from omarchy) + latte = "#d4c4b0"; # Latte + mocha = "#b8997a"; # Mocha + espresso = "#8b6f47"; # Espresso + cappuccino = "#c9a96e"; # Cappuccino + + # Warm accent colors + amber = "#d4a574"; # Amber + caramel = "#c19a6b"; # Caramel + cinnamon = "#a67c5a"; # Cinnamon + vanilla = "#e8dcc6"; # Vanilla + + # Status colors - coffee-tinted + red = "#d67c7c"; # Warm red + orange = "#d4925a"; # Coffee orange + yellow = "#d4c969"; # Warm yellow + green = "#81a56a"; # Muted green + blue = "#6b8bb3"; # Muted blue + purple = "#a67cb8"; # Muted purple + cyan = "#6ba3a3"; # Muted cyan + + # Special UI colors + border = "#5d3e2e"; # Border color + shadow = "#1a1008"; # Shadow color + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/ristretto/1-ristretto.jpg; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(e6d9db) + col.inactive_border = rgba(5d3e2eaa) + } + decoration { + col.shadow = rgba(1a1008ee) + } + ''; + + # GTK theme + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita-dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + OMNIXY_THEME_COLORS_BG = colors.bg; + OMNIXY_THEME_COLORS_FG = colors.fg; + OMNIXY_THEME_COLORS_ACCENT = colors.cream; + }; + + # Console colors + console = { + colors = [ + colors.bg_light # black + colors.red # red + colors.green # green + colors.yellow # yellow + colors.blue # blue + colors.purple # magenta + colors.cyan # cyan + colors.fg_dim # white + colors.espresso # bright black + colors.red # bright red + colors.green # bright green + colors.amber # bright yellow + colors.blue # bright blue + colors.purple # bright magenta + colors.cyan # bright cyan + colors.fg # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + # Qt theming + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + background = colors.bg; + foreground = colors.fg; + selection_background = colors.bg_lighter; + selection_foreground = colors.fg; + + # Cursor colors + cursor = colors.cream; + cursor_text_color = colors.bg; + + # URL underline color when hovering + url_color = colors.amber; + + # Tab colors + active_tab_background = colors.cream; + active_tab_foreground = colors.bg; + inactive_tab_background = colors.bg_light; + inactive_tab_foreground = colors.fg_dim; + + # Window border colors + active_border_color = colors.cream; + inactive_border_color = colors.mocha; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.bg; + foreground = colors.fg; + }; + cursor = { + text = colors.bg; + cursor = colors.cream; + }; + normal = { + black = colors.bg_light; + red = colors.red; + green = colors.green; + yellow = colors.yellow; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.cyan; + white = colors.fg_dim; + }; + bright = { + black = colors.espresso; + red = colors.red; + green = colors.green; + yellow = colors.amber; + blue = colors.blue; + magenta = colors.purple; + cyan = colors.cyan; + white = colors.fg; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.bg}; + color: ${colors.fg}; + border-bottom: 2px solid ${colors.cream}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.fg_dim}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.cream}; + border-bottom-color: ${colors.cream}; + } + + #workspaces button:hover { + color: ${colors.fg}; + background: ${colors.bg_light}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.bg_light}; + color: ${colors.fg}; + } + + #battery.critical { + color: ${colors.red}; + } + + #battery.warning { + color: ${colors.amber}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.bg; + foreground-color = mkLiteral colors.fg; + border-color = mkLiteral colors.cream; + separatorcolor = mkLiteral colors.bg_light; + scrollbar-handle = mkLiteral colors.cream; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.cream; + text-color = mkLiteral colors.bg; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.bg; + text-color = colors.fg; + border-color = colors.cream; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.cream; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + userSettings = { + "workbench.colorTheme" = "Monokai"; + "workbench.preferredDarkColorTheme" = "Monokai"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + set background=dark + colorscheme monokai + ''; + }; + + # Git diff and bat theme + programs.bat.config.theme = "Monokai Extended"; + + # btop theme + programs.btop.settings.color_theme = "monokai"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = false; + selectedLineBgColor = [ colors.bg_lighter ]; + selectedRangeBgColor = [ colors.bg_lighter ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.green})"; + error_symbol = "[➜](bold ${colors.red})"; + }; + directory = { + style = "bold ${colors.amber}"; + }; + git_branch = { + style = "bold ${colors.purple}"; + }; + git_status = { + style = "bold ${colors.yellow}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/rose-pine.nix b/modules/themes/rose-pine.nix new file mode 100644 index 0000000..c347c66 --- /dev/null +++ b/modules/themes/rose-pine.nix @@ -0,0 +1,338 @@ +{ config, pkgs, lib, ... }: + +# Rose Pine theme for OmniXY +# All natural pine, faux fur and a bit of soho vibes for the classy minimalist + +with lib; + +let + cfg = config.omnixy; + omnixy = import ../helpers.nix { inherit config pkgs lib; }; + + # Rose Pine color palette + colors = { + # Base colors + base = "#191724"; # Dark background + surface = "#1f1d2e"; # Surface background + overlay = "#26233a"; # Overlay background + muted = "#6e6a86"; # Muted foreground + subtle = "#908caa"; # Subtle foreground + text = "#e0def4"; # Main foreground + love = "#eb6f92"; # Love (pink/red) + gold = "#f6c177"; # Gold (yellow) + rose = "#ebbcba"; # Rose (peach) + pine = "#31748f"; # Pine (blue) + foam = "#9ccfd8"; # Foam (cyan) + iris = "#c4a7e7"; # Iris (purple) + + # Highlight colors + highlight_low = "#21202e"; + highlight_med = "#403d52"; + highlight_high = "#524f67"; + }; + +in +{ + config = mkIf (cfg.enable or true) (mkMerge [ + # System-level theme configuration + { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/rose-pine/1-rose-pine.jpg; + + # Hyprland theme colors (from omarchy) + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgb(575279) + col.inactive_border = rgba(26233aaa) + } + decoration { + col.shadow = rgba(191724ee) + } + ''; + + # GTK theme + programs.dconf.enable = true; + + # Environment variables for consistent theming + environment.variables = { + GTK_THEME = "Adwaita-dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + OMNIXY_THEME_COLORS_BG = colors.base; + OMNIXY_THEME_COLORS_FG = colors.text; + OMNIXY_THEME_COLORS_ACCENT = colors.foam; + }; + + # Console colors + console = { + colors = [ + colors.overlay # black + colors.love # red + colors.pine # green (using pine as green alternative) + colors.gold # yellow + colors.foam # blue (using foam as blue) + colors.iris # magenta + colors.rose # cyan (using rose as cyan) + colors.text # white + colors.muted # bright black + colors.love # bright red + colors.pine # bright green + colors.gold # bright yellow + colors.foam # bright blue + colors.iris # bright magenta + colors.rose # bright cyan + colors.text # bright white + ]; + }; + } + + # User-specific theme configuration + (omnixy.forUser { + # GTK configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + # Qt theming + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Kitty terminal theme + programs.kitty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + themeFile = "Rosé Pine"; + settings = { + background = colors.base; + foreground = colors.text; + selection_background = colors.surface; + selection_foreground = colors.text; + + # Cursor colors + cursor = colors.text; + cursor_text_color = colors.base; + + # URL underline color when hovering + url_color = colors.foam; + + # Tab colors + active_tab_background = colors.foam; + active_tab_foreground = colors.base; + inactive_tab_background = colors.surface; + inactive_tab_foreground = colors.subtle; + + # Window border colors + active_border_color = colors.foam; + inactive_border_color = colors.muted; + }; + }; + + # Alacritty terminal theme + programs.alacritty = mkIf (omnixy.isEnabled "coding" || omnixy.isEnabled "media") { + enable = true; + settings = { + colors = { + primary = { + background = colors.base; + foreground = colors.text; + }; + cursor = { + text = colors.base; + cursor = colors.text; + }; + normal = { + black = colors.overlay; + red = colors.love; + green = colors.pine; + yellow = colors.gold; + blue = colors.foam; + magenta = colors.iris; + cyan = colors.rose; + white = colors.text; + }; + bright = { + black = colors.muted; + red = colors.love; + green = colors.pine; + yellow = colors.gold; + blue = colors.foam; + magenta = colors.iris; + cyan = colors.rose; + white = colors.text; + }; + }; + }; + }; + + # Waybar theme + programs.waybar = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + style = '' + * { + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + border: none; + border-radius: 0; + min-height: 0; + } + + window#waybar { + background: ${colors.base}; + color: ${colors.text}; + border-bottom: 2px solid ${colors.foam}; + } + + #workspaces button { + padding: 0 8px; + background: transparent; + color: ${colors.subtle}; + border-bottom: 2px solid transparent; + } + + #workspaces button.active { + color: ${colors.foam}; + border-bottom-color: ${colors.foam}; + } + + #workspaces button:hover { + color: ${colors.text}; + background: ${colors.surface}; + } + + #clock, #battery, #cpu, #memory, #network, #pulseaudio { + padding: 0 10px; + margin: 0 2px; + background: ${colors.surface}; + color: ${colors.text}; + } + + #battery.critical { + color: ${colors.love}; + } + + #battery.warning { + color: ${colors.gold}; + } + ''; + }; + + # Rofi theme + programs.rofi = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + theme = { + "*" = { + background-color = mkLiteral colors.base; + foreground-color = mkLiteral colors.text; + border-color = mkLiteral colors.foam; + separatorcolor = mkLiteral colors.surface; + scrollbar-handle = mkLiteral colors.foam; + }; + + "#window" = { + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + padding = mkLiteral "20px"; + }; + + "#element selected" = { + background-color = mkLiteral colors.foam; + text-color = mkLiteral colors.base; + }; + }; + }; + + # Mako notification theme + services.mako = mkIf (omnixy.isEnabled "media" || omnixy.isEnabled "gaming") { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font 10"; + background-color = colors.base; + text-color = colors.text; + border-color = colors.foam; + border-size = 2; + border-radius = 8; + padding = "10"; + margin = "5"; + default-timeout = 5000; + progress-color = colors.foam; + }; + }; + + # VSCode theme + programs.vscode = mkIf (omnixy.isEnabled "coding") { + enable = true; + userSettings = { + "workbench.colorTheme" = "Rosé Pine"; + "workbench.preferredDarkColorTheme" = "Rosé Pine"; + "editor.fontFamily" = "'JetBrainsMono Nerd Font', 'Droid Sans Mono', 'monospace'"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font'"; + }; + }; + + # Neovim theme + programs.neovim = mkIf (omnixy.isEnabled "coding") { + enable = true; + extraConfig = '' + set background=dark + colorscheme rose-pine + ''; + plugins = with pkgs.vimPlugins; [ + rose-pine + ]; + }; + + # Git diff and bat theme + programs.bat.config.theme = "Monokai Extended"; + + # btop theme - using a rose-inspired theme + programs.btop.settings.color_theme = "rose-pine"; + + # Lazygit theme + programs.lazygit.settings = { + gui.theme = { + lightTheme = false; + selectedLineBgColor = [ colors.surface ]; + selectedRangeBgColor = [ colors.surface ]; + }; + }; + + # Zsh/shell prompt colors + programs.starship = mkIf (omnixy.isEnabled "coding") { + enable = true; + settings = { + format = "$directory$git_branch$git_status$character"; + character = { + success_symbol = "[➜](bold ${colors.pine})"; + error_symbol = "[➜](bold ${colors.love})"; + }; + directory = { + style = "bold ${colors.foam}"; + }; + git_branch = { + style = "bold ${colors.iris}"; + }; + git_status = { + style = "bold ${colors.gold}"; + }; + }; + }; + }) + ]); +} \ No newline at end of file diff --git a/modules/themes/tokyo-night.nix b/modules/themes/tokyo-night.nix index e81dfc7..f83dc1a 100644 --- a/modules/themes/tokyo-night.nix +++ b/modules/themes/tokyo-night.nix @@ -32,6 +32,20 @@ in { # Tokyo Night theme configuration config = { + # Set theme wallpaper + omnixy.desktop.wallpaper = ./wallpapers/tokyo-night/1-scenery-pink-lakeside-sunset-lake-landscape-scenic-panorama-7680x3215-144.png; + + # Hyprland theme colors + environment.etc."omnixy/hyprland/theme.conf".text = '' + general { + col.active_border = rgba(7aa2f7ee) rgba(c4a7e7ee) 45deg + col.inactive_border = rgba(414868aa) + } + decoration { + col.shadow = rgba(1a1b26ee) + } + ''; + # Color palette - use nix-colors if available environment.variables = { OMNIXY_THEME = "tokyo-night"; diff --git a/modules/themes/wallpapers/catppuccin-latte/1-catppuccin-latte.png b/modules/themes/wallpapers/catppuccin-latte/1-catppuccin-latte.png new file mode 100644 index 0000000..ee0cd94 Binary files /dev/null and b/modules/themes/wallpapers/catppuccin-latte/1-catppuccin-latte.png differ diff --git a/modules/themes/wallpapers/catppuccin/1-catppuccin.png b/modules/themes/wallpapers/catppuccin/1-catppuccin.png new file mode 100644 index 0000000..5fbcebc Binary files /dev/null and b/modules/themes/wallpapers/catppuccin/1-catppuccin.png differ diff --git a/modules/themes/wallpapers/catppuccin/2-cat-waves-mocha.png b/modules/themes/wallpapers/catppuccin/2-cat-waves-mocha.png new file mode 100644 index 0000000..a0b5325 Binary files /dev/null and b/modules/themes/wallpapers/catppuccin/2-cat-waves-mocha.png differ diff --git a/modules/themes/wallpapers/catppuccin/3-cat-blue-eye-mocha.png b/modules/themes/wallpapers/catppuccin/3-cat-blue-eye-mocha.png new file mode 100644 index 0000000..30b5963 Binary files /dev/null and b/modules/themes/wallpapers/catppuccin/3-cat-blue-eye-mocha.png differ diff --git a/modules/themes/wallpapers/everforest/1-everforest.jpg b/modules/themes/wallpapers/everforest/1-everforest.jpg new file mode 100644 index 0000000..6d75259 Binary files /dev/null and b/modules/themes/wallpapers/everforest/1-everforest.jpg differ diff --git a/modules/themes/wallpapers/gruvbox/1-grubox.jpg b/modules/themes/wallpapers/gruvbox/1-grubox.jpg new file mode 100644 index 0000000..fd31869 Binary files /dev/null and b/modules/themes/wallpapers/gruvbox/1-grubox.jpg differ diff --git a/modules/themes/wallpapers/kanagawa/1-kanagawa.jpg b/modules/themes/wallpapers/kanagawa/1-kanagawa.jpg new file mode 100644 index 0000000..197c48d Binary files /dev/null and b/modules/themes/wallpapers/kanagawa/1-kanagawa.jpg differ diff --git a/modules/themes/wallpapers/matte-black/0-ship-at-sea.jpg b/modules/themes/wallpapers/matte-black/0-ship-at-sea.jpg new file mode 100644 index 0000000..4375ee2 Binary files /dev/null and b/modules/themes/wallpapers/matte-black/0-ship-at-sea.jpg differ diff --git a/modules/themes/wallpapers/matte-black/1-matte-black.jpg b/modules/themes/wallpapers/matte-black/1-matte-black.jpg new file mode 100644 index 0000000..2afb1bc Binary files /dev/null and b/modules/themes/wallpapers/matte-black/1-matte-black.jpg differ diff --git a/modules/themes/wallpapers/nord/1-nord.png b/modules/themes/wallpapers/nord/1-nord.png new file mode 100644 index 0000000..56dbc1d Binary files /dev/null and b/modules/themes/wallpapers/nord/1-nord.png differ diff --git a/modules/themes/wallpapers/nord/2-nord.png b/modules/themes/wallpapers/nord/2-nord.png new file mode 100644 index 0000000..412eb52 Binary files /dev/null and b/modules/themes/wallpapers/nord/2-nord.png differ diff --git a/modules/themes/wallpapers/osaka-jade/1-osaka-jade-bg.jpg b/modules/themes/wallpapers/osaka-jade/1-osaka-jade-bg.jpg new file mode 100644 index 0000000..be7d857 Binary files /dev/null and b/modules/themes/wallpapers/osaka-jade/1-osaka-jade-bg.jpg differ diff --git a/modules/themes/wallpapers/osaka-jade/2-osaka-jade-bg.jpg b/modules/themes/wallpapers/osaka-jade/2-osaka-jade-bg.jpg new file mode 100644 index 0000000..9b97956 Binary files /dev/null and b/modules/themes/wallpapers/osaka-jade/2-osaka-jade-bg.jpg differ diff --git a/modules/themes/wallpapers/osaka-jade/3-osaka-jade-bg.jpg b/modules/themes/wallpapers/osaka-jade/3-osaka-jade-bg.jpg new file mode 100644 index 0000000..729ccae Binary files /dev/null and b/modules/themes/wallpapers/osaka-jade/3-osaka-jade-bg.jpg differ diff --git a/modules/themes/wallpapers/ristretto/1-ristretto.jpg b/modules/themes/wallpapers/ristretto/1-ristretto.jpg new file mode 100644 index 0000000..7618e1b Binary files /dev/null and b/modules/themes/wallpapers/ristretto/1-ristretto.jpg differ diff --git a/modules/themes/wallpapers/ristretto/2-ristretto.jpg b/modules/themes/wallpapers/ristretto/2-ristretto.jpg new file mode 100644 index 0000000..faf63ea Binary files /dev/null and b/modules/themes/wallpapers/ristretto/2-ristretto.jpg differ diff --git a/modules/themes/wallpapers/ristretto/3-ristretto.jpg b/modules/themes/wallpapers/ristretto/3-ristretto.jpg new file mode 100644 index 0000000..385b01d Binary files /dev/null and b/modules/themes/wallpapers/ristretto/3-ristretto.jpg differ diff --git a/modules/themes/wallpapers/rose-pine/1-rose-pine.jpg b/modules/themes/wallpapers/rose-pine/1-rose-pine.jpg new file mode 100644 index 0000000..adfe242 Binary files /dev/null and b/modules/themes/wallpapers/rose-pine/1-rose-pine.jpg differ diff --git a/modules/themes/wallpapers/rose-pine/2-wave-light.png b/modules/themes/wallpapers/rose-pine/2-wave-light.png new file mode 100644 index 0000000..53e136c Binary files /dev/null and b/modules/themes/wallpapers/rose-pine/2-wave-light.png differ diff --git a/modules/themes/wallpapers/rose-pine/3-leafy-dawn-omarchy.png b/modules/themes/wallpapers/rose-pine/3-leafy-dawn-omarchy.png new file mode 100644 index 0000000..f19c3ff Binary files /dev/null and b/modules/themes/wallpapers/rose-pine/3-leafy-dawn-omarchy.png differ diff --git a/modules/themes/wallpapers/tokyo-night/1-scenery-pink-lakeside-sunset-lake-landscape-scenic-panorama-7680x3215-144.png b/modules/themes/wallpapers/tokyo-night/1-scenery-pink-lakeside-sunset-lake-landscape-scenic-panorama-7680x3215-144.png new file mode 100644 index 0000000..d806728 Binary files /dev/null and b/modules/themes/wallpapers/tokyo-night/1-scenery-pink-lakeside-sunset-lake-landscape-scenic-panorama-7680x3215-144.png differ diff --git a/modules/themes/wallpapers/tokyo-night/2-Pawel-Czerwinski-Abstract-Purple-Blue.jpg b/modules/themes/wallpapers/tokyo-night/2-Pawel-Czerwinski-Abstract-Purple-Blue.jpg new file mode 100644 index 0000000..2767138 Binary files /dev/null and b/modules/themes/wallpapers/tokyo-night/2-Pawel-Czerwinski-Abstract-Purple-Blue.jpg differ diff --git a/modules/themes/wallpapers/tokyo-night/3-Milad-Fakurian-Abstract-Purple-Blue.jpg b/modules/themes/wallpapers/tokyo-night/3-Milad-Fakurian-Abstract-Purple-Blue.jpg new file mode 100644 index 0000000..b9663ff Binary files /dev/null and b/modules/themes/wallpapers/tokyo-night/3-Milad-Fakurian-Abstract-Purple-Blue.jpg differ diff --git a/modules/walker.nix b/modules/walker.nix new file mode 100644 index 0000000..daf40ff --- /dev/null +++ b/modules/walker.nix @@ -0,0 +1,422 @@ +{ config, pkgs, lib, ... }: + +# Walker app launcher configuration for OmniXY +# Modern replacement for Rofi with better Wayland integration + +with lib; + +let + cfg = config.omnixy; + omnixy = import ./helpers.nix { inherit config pkgs lib; }; +in +{ + config = mkIf (cfg.enable or true) { + # Add walker to system packages + environment.systemPackages = with pkgs; [ + walker + ]; + + # Create Walker configuration + environment.etc."omnixy/walker/config.json".text = builtins.toJSON { + # General configuration + placeholder = "Search applications, files, and more..."; + fullscreen = false; + layer = "overlay"; + modules = [ + { + name = "applications"; + src = "applications"; + transform = "uppercase"; + } + { + name = "runner"; + src = "runner"; + } + { + name = "websearch"; + src = "websearch"; + engines = [ + { + name = "Google"; + url = "https://www.google.com/search?q=%s"; + icon = "web-browser"; + } + { + name = "GitHub"; + url = "https://github.com/search?q=%s"; + icon = "github"; + } + { + name = "NixOS Packages"; + url = "https://search.nixos.org/packages?query=%s"; + icon = "nix-snowflake"; + } + ]; + } + { + name = "finder"; + src = "finder"; + dirs = [ + "/home/${cfg.user}" + "/home/${cfg.user}/Documents" + "/home/${cfg.user}/Downloads" + "/home/${cfg.user}/Desktop" + ]; + } + { + name = "calc"; + src = "calc"; + } + ]; + + # UI Configuration + ui = { + anchors = { + top = false; + left = true; + right = false; + bottom = false; + }; + margin = { + top = 100; + bottom = 0; + left = 100; + right = 0; + }; + width = 600; + height = 500; + show_initial_entries = true; + show_search_text = true; + scroll_height = 300; + }; + + # Search configuration + search = { + delay = 100; + placeholder = "Type to search..."; + force_keyboard_focus = true; + }; + + # List configuration + list = { + height = 200; + always_show = true; + max_entries = 50; + }; + + # Icons + icons = { + theme = "Papirus"; + size = 32; + }; + + # Theming based on current theme + theme = if cfg.theme == "gruvbox" then "gruvbox" + else if cfg.theme == "nord" then "nord" + else if cfg.theme == "catppuccin" then "catppuccin" + else if cfg.theme == "tokyo-night" then "tokyo-night" + else "default"; + }; + + # Create Walker CSS theme files + environment.etc."omnixy/walker/themes/gruvbox.css".text = '' + * { + color: #ebdbb2; + background-color: #282828; + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 14px; + } + + window { + background-color: rgba(40, 40, 40, 0.95); + border: 2px solid #a89984; + border-radius: 12px; + } + + #search { + background-color: #3c3836; + border: 1px solid #665c54; + border-radius: 8px; + padding: 8px 12px; + margin: 12px; + color: #ebdbb2; + } + + #search:focus { + border-color: #d79921; + } + + #list { + background-color: transparent; + padding: 0 12px 12px 12px; + } + + .item { + padding: 8px 12px; + border-radius: 6px; + margin-bottom: 2px; + } + + .item:selected { + background-color: #504945; + color: #fbf1c7; + } + + .item:hover { + background-color: #3c3836; + } + + .item .icon { + margin-right: 12px; + min-width: 32px; + } + + .item .text { + font-weight: normal; + } + + .item .sub { + font-size: 12px; + color: #a89984; + } + ''; + + environment.etc."omnixy/walker/themes/nord.css".text = '' + * { + color: #eceff4; + background-color: #2e3440; + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 14px; + } + + window { + background-color: rgba(46, 52, 64, 0.95); + border: 2px solid #4c566a; + border-radius: 12px; + } + + #search { + background-color: #3b4252; + border: 1px solid #4c566a; + border-radius: 8px; + padding: 8px 12px; + margin: 12px; + color: #eceff4; + } + + #search:focus { + border-color: #5e81ac; + } + + #list { + background-color: transparent; + padding: 0 12px 12px 12px; + } + + .item { + padding: 8px 12px; + border-radius: 6px; + margin-bottom: 2px; + } + + .item:selected { + background-color: #434c5e; + color: #eceff4; + } + + .item:hover { + background-color: #3b4252; + } + + .item .icon { + margin-right: 12px; + min-width: 32px; + } + + .item .text { + font-weight: normal; + } + + .item .sub { + font-size: 12px; + color: #81a1c1; + } + ''; + + environment.etc."omnixy/walker/themes/catppuccin.css".text = '' + * { + color: #cdd6f4; + background-color: #1e1e2e; + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 14px; + } + + window { + background-color: rgba(30, 30, 46, 0.95); + border: 2px solid #6c7086; + border-radius: 12px; + } + + #search { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 8px; + padding: 8px 12px; + margin: 12px; + color: #cdd6f4; + } + + #search:focus { + border-color: #89b4fa; + } + + #list { + background-color: transparent; + padding: 0 12px 12px 12px; + } + + .item { + padding: 8px 12px; + border-radius: 6px; + margin-bottom: 2px; + } + + .item:selected { + background-color: #45475a; + color: #cdd6f4; + } + + .item:hover { + background-color: #313244; + } + + .item .icon { + margin-right: 12px; + min-width: 32px; + } + + .item .text { + font-weight: normal; + } + + .item .sub { + font-size: 12px; + color: #89dceb; + } + ''; + + environment.etc."omnixy/walker/themes/tokyo-night.css".text = '' + * { + color: #c0caf5; + background-color: #1a1b26; + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 14px; + } + + window { + background-color: rgba(26, 27, 38, 0.95); + border: 2px solid #414868; + border-radius: 12px; + } + + #search { + background-color: #24283b; + border: 1px solid #414868; + border-radius: 8px; + padding: 8px 12px; + margin: 12px; + color: #c0caf5; + } + + #search:focus { + border-color: #7aa2f7; + } + + #list { + background-color: transparent; + padding: 0 12px 12px 12px; + } + + .item { + padding: 8px 12px; + border-radius: 6px; + margin-bottom: 2px; + } + + .item:selected { + background-color: #414868; + color: #c0caf5; + } + + .item:hover { + background-color: #24283b; + } + + .item .icon { + margin-right: 12px; + min-width: 32px; + } + + .item .text { + font-weight: normal; + } + + .item .sub { + font-size: 12px; + color: #7dcfff; + } + ''; + + # Add to user environment + omnixy.forUser { + # Set XDG config dir for Walker + xdg.configFile."walker/config.json".source = + config.environment.etc."omnixy/walker/config.json".source; + + # Theme-specific CSS + xdg.configFile."walker/themes/style.css".source = + config.environment.etc."omnixy/walker/themes/${cfg.theme}.css".source; + + # Add shell aliases + programs.bash.shellAliases = { + launcher = "walker"; + run = "walker --modules runner"; + apps = "walker --modules applications"; + files = "walker --modules finder"; + }; + + programs.zsh.shellAliases = { + launcher = "walker"; + run = "walker --modules runner"; + apps = "walker --modules applications"; + files = "walker --modules finder"; + }; + + programs.fish.shellAliases = { + launcher = "walker"; + run = "walker --modules runner"; + apps = "walker --modules applications"; + files = "walker --modules finder"; + }; + }; + + # Create convenience scripts + environment.systemPackages = [ + (omnixy.makeScript "omnixy-launcher" "Launch OmniXY app launcher" '' + walker --config ~/.config/walker/config.json --css ~/.config/walker/themes/style.css + '') + + (omnixy.makeScript "omnixy-run" "Quick command runner" '' + walker --modules runner --config ~/.config/walker/config.json --css ~/.config/walker/themes/style.css + '') + + (omnixy.makeScript "omnixy-apps" "Application launcher" '' + walker --modules applications --config ~/.config/walker/config.json --css ~/.config/walker/themes/style.css + '') + + (omnixy.makeScript "omnixy-files" "File finder" '' + walker --modules finder --config ~/.config/walker/config.json --css ~/.config/walker/themes/style.css + '') + ]; + }; +} \ No newline at end of file diff --git a/packages/plymouth-theme.nix b/packages/plymouth-theme.nix new file mode 100644 index 0000000..a8708bb --- /dev/null +++ b/packages/plymouth-theme.nix @@ -0,0 +1,312 @@ +{ lib, pkgs, stdenv, writeTextFile, ... }: + +# OmniXY Plymouth Theme Package +# Creates theme-aware Plymouth boot screens + +let + # Theme color definitions + themeColors = { + tokyo-night = { + bg = "#1a1b26"; + fg = "#c0caf5"; + accent = "#7aa2f7"; + secondary = "#bb9af7"; + }; + catppuccin = { + bg = "#1e1e2e"; + fg = "#cdd6f4"; + accent = "#89b4fa"; + secondary = "#cba6f7"; + }; + gruvbox = { + bg = "#282828"; + fg = "#ebdbb2"; + accent = "#d79921"; + secondary = "#b16286"; + }; + nord = { + bg = "#2e3440"; + fg = "#eceff4"; + accent = "#5e81ac"; + secondary = "#b48ead"; + }; + everforest = { + bg = "#2d353b"; + fg = "#d3c6aa"; + accent = "#a7c080"; + secondary = "#e67e80"; + }; + rose-pine = { + bg = "#191724"; + fg = "#e0def4"; + accent = "#31748f"; + secondary = "#c4a7e7"; + }; + kanagawa = { + bg = "#1f1f28"; + fg = "#dcd7ba"; + accent = "#7e9cd8"; + secondary = "#957fb8"; + }; + catppuccin-latte = { + bg = "#eff1f5"; + fg = "#4c4f69"; + accent = "#1e66f5"; + secondary = "#8839ef"; + }; + matte-black = { + bg = "#000000"; + fg = "#ffffff"; + accent = "#666666"; + secondary = "#999999"; + }; + osaka-jade = { + bg = "#0d1b1e"; + fg = "#c5d4d7"; + accent = "#5fb3a1"; + secondary = "#7ba05b"; + }; + ristretto = { + bg = "#2c1810"; + fg = "#d4c5a7"; + accent = "#d08b5b"; + secondary = "#a67458"; + }; + }; + + # Base assets (copied from omarchy) + assets = pkgs.runCommand "omnixy-plymouth-assets" {} '' + mkdir -p $out + + # Create base logo (OmniXY branding) + cat > $out/logo.svg <<'EOF' + + + + + + + + + XY + +EOF + + # Convert SVG to PNG + ${pkgs.librsvg}/bin/rsvg-convert -w 120 -h 120 $out/logo.svg -o $out/logo.png + rm $out/logo.svg + + # Create other UI elements (simplified versions of omarchy assets) + ${pkgs.imagemagick}/bin/convert -size 32x32 xc:none -fill '#ffffff' -draw 'circle 16,16 16,8' $out/lock.png + ${pkgs.imagemagick}/bin/convert -size 200x32 xc:'rgba(255,255,255,0.1)' -stroke white -strokewidth 1 -fill none -draw 'roundrectangle 1,1 198,30 8,8' $out/entry.png + ${pkgs.imagemagick}/bin/convert -size 8x8 xc:white $out/bullet.png + ${pkgs.imagemagick}/bin/convert -size 300x8 xc:'rgba(255,255,255,0.2)' -stroke white -strokewidth 1 -fill none -draw 'roundrectangle 1,1 298,6 4,4' $out/progress_box.png + ${pkgs.imagemagick}/bin/convert -size 296x4 xc:'rgba(255,255,255,0.8)' $out/progress_bar.png + ''; + + # Plymouth script template + createPlymouthScript = themeName: colors: writeTextFile { + name = "omnixy-${themeName}.script"; + text = '' + # OmniXY Plymouth Theme Script + # Theme: ${themeName} + # Generated for NixOS/OmniXY + + // Theme color configuration + bg_color = Colour("${colors.bg}"); + fg_color = Colour("${colors.fg}"); + accent_color = Colour("${colors.accent}"); + secondary_color = Colour("${colors.secondary}"); + + // Screen setup + screen_width = Window.GetWidth(); + screen_height = Window.GetHeight(); + Window.SetBackgroundTopColor(bg_color); + Window.SetBackgroundBottomColor(bg_color); + + // Load assets + logo_image = Image("logo.png"); + lock_image = Image("lock.png"); + entry_image = Image("entry.png"); + bullet_image = Image("bullet.png"); + progress_box_image = Image("progress_box.png"); + progress_bar_image = Image("progress_bar.png"); + + // Logo setup + logo_sprite = Sprite(logo_image); + logo_sprite.SetX((screen_width - logo_image.GetWidth()) / 2); + logo_sprite.SetY(screen_height / 2 - 100); + logo_sprite.SetOpacity(0.9); + + // Progress bar setup + progress_box_sprite = Sprite(progress_box_image); + progress_box_sprite.SetX((screen_width - progress_box_image.GetWidth()) / 2); + progress_box_sprite.SetY(screen_height / 2 + 50); + + progress_bar_sprite = Sprite(progress_bar_image); + progress_bar_sprite.SetX((screen_width - progress_box_image.GetWidth()) / 2 + 2); + progress_bar_sprite.SetY(screen_height / 2 + 52); + + // Animation variables + fake_progress = 0; + real_progress = 0; + start_time = Plymouth.GetTime(); + fake_duration = 15; // 15 seconds fake progress + + // Easing function (ease-out quadratic) + fun easeOutQuad(x) { + return 1 - (1 - x) * (1 - x); + } + + // Progress update function + fun progress_callback() { + current_time = Plymouth.GetTime(); + elapsed = current_time - start_time; + + // Calculate fake progress (0 to 0.7 over fake_duration) + if (elapsed < fake_duration) { + fake_progress = 0.7 * easeOutQuad(elapsed / fake_duration); + } else { + fake_progress = 0.7; + } + + // Use the maximum of fake and real progress + display_progress = fake_progress; + if (real_progress > fake_progress) { + display_progress = real_progress; + } + + // Update progress bar + bar_width = progress_bar_image.GetWidth() * display_progress; + progress_bar_sprite.SetImage(progress_bar_image.Scale(bar_width, progress_bar_image.GetHeight())); + + // Add subtle pulsing to logo during boot + pulse = Math.Sin(elapsed * 3) * 0.1 + 0.9; + logo_sprite.SetOpacity(pulse); + } + + Plymouth.SetUpdateFunction(progress_callback); + + // Boot progress callback + Plymouth.SetBootProgressFunction( + fun (duration, progress) { + real_progress = progress; + } + ); + + // Password dialog setup + question_sprite = Sprite(); + answer_sprite = Sprite(); + + fun DisplayQuestionCallback(prompt, entry) { + question_sprite.SetImage(Image.Text(prompt, 1, 1, 1)); + question_sprite.SetX((screen_width - question_sprite.GetImage().GetWidth()) / 2); + question_sprite.SetY(screen_height / 2 - 50); + + // Show lock icon + lock_sprite = Sprite(lock_image); + lock_sprite.SetX((screen_width - lock_image.GetWidth()) / 2); + lock_sprite.SetY(screen_height / 2 - 20); + + // Show entry field + entry_sprite = Sprite(entry_image); + entry_sprite.SetX((screen_width - entry_image.GetWidth()) / 2); + entry_sprite.SetY(screen_height / 2 + 20); + + // Show bullets for password + bullet_sprites = []; + for (i = 0; i < entry.GetLength(); i++) { + bullet_sprites[i] = Sprite(bullet_image); + bullet_sprites[i].SetX((screen_width / 2) - (entry.GetLength() * 10 / 2) + i * 10); + bullet_sprites[i].SetY(screen_height / 2 + 28); + } + } + + Plymouth.SetDisplayQuestionFunction(DisplayQuestionCallback); + + // Hide question callback + Plymouth.SetDisplayPasswordFunction(DisplayQuestionCallback); + + // Message display + message_sprite = Sprite(); + + Plymouth.SetMessageFunction( + fun (text) { + message_sprite.SetImage(Image.Text(text, 1, 1, 1)); + message_sprite.SetX((screen_width - message_sprite.GetImage().GetWidth()) / 2); + message_sprite.SetY(screen_height - 50); + } + ); + + // Quit callback + Plymouth.SetQuitFunction( + fun () { + // Fade out animation + for (i = 0; i < 30; i++) { + opacity = 1 - (i / 30); + logo_sprite.SetOpacity(opacity); + Plymouth.Sleep(16); // ~60fps + } + } + ); + ''; + }; + + # Create theme definition file + createPlymouthTheme = themeName: colors: writeTextFile { + name = "omnixy-${themeName}.plymouth"; + text = '' + [Plymouth Theme] + Name=OmniXY ${themeName} + Description=OmniXY boot splash theme for ${themeName} + ModuleName=script + + [script] + ImageDir=/run/current-system/sw/share/plymouth/themes/omnixy-${themeName} + ScriptFile=/run/current-system/sw/share/plymouth/themes/omnixy-${themeName}/omnixy-${themeName}.script + ''; + }; + +in + +# Create derivation for all Plymouth themes +stdenv.mkDerivation rec { + pname = "omnixy-plymouth-themes"; + version = "1.0"; + + src = assets; + + buildInputs = with pkgs; [ coreutils ]; + + installPhase = '' + mkdir -p $out/share/plymouth/themes + + ${lib.concatStringsSep "\n" (lib.mapAttrsToList (themeName: colors: '' + # Create theme directory + theme_dir="$out/share/plymouth/themes/omnixy-${themeName}" + mkdir -p "$theme_dir" + + # Copy assets + cp ${src}/* "$theme_dir/" + + # Install theme files + cp ${createPlymouthScript themeName colors} "$theme_dir/omnixy-${themeName}.script" + cp ${createPlymouthTheme themeName colors} "$theme_dir/omnixy-${themeName}.plymouth" + + # Make script executable + chmod +x "$theme_dir/omnixy-${themeName}.script" + '') themeColors)} + + # Create a default symlink to tokyo-night + ln -sf omnixy-tokyo-night $out/share/plymouth/themes/omnixy-default + ''; + + meta = with lib; { + description = "OmniXY Plymouth boot splash themes"; + homepage = "https://github.com/TheArctesian/omnixy"; + license = licenses.mit; + platforms = platforms.linux; + maintainers = []; + }; +} \ No newline at end of file