{ config, lib, pkgs, inputs, ... }: with lib; let cfg = config.noctaliaShell; in { imports = [ inputs.noctalia.homeModules.default ]; options.noctaliaShell = { enable = mkEnableOption "Noctalia shell"; colorScheme = mkOption { type = types.str; default = "Noctalia (default)"; description = '' Predefined color scheme to use. Options include: "Noctalia (default)", "Monochrome", "Catppuccin Mocha", etc. See Noctalia docs for full list. ''; }; useWallpaperColors = mkOption { type = types.bool; default = false; description = "Generate colors from wallpaper instead of using predefined scheme"; }; darkMode = mkOption { type = types.bool; default = true; description = "Use dark mode for Noctalia shell"; }; barPosition = mkOption { type = types.enum [ "top" "bottom" "left" "right" ]; default = "top"; description = "Position of the Noctalia bar"; }; barDensity = mkOption { type = types.enum [ "default" "compact" ]; default = "default"; description = "Bar density (compact for vertical bars)"; }; enableDock = mkOption { type = types.bool; default = true; description = "Enable the Noctalia dock"; }; dockPosition = mkOption { type = types.enum [ "top" "bottom" "left" "right" ]; default = "bottom"; description = "Position of the dock"; }; pinnedApps = mkOption { type = types.listOf types.str; default = [ ]; description = "List of .desktop file names for pinned dock apps"; }; avatarImage = mkOption { type = types.str; default = ""; description = "Path to avatar image for user profile"; }; locationName = mkOption { type = types.str; default = "Denver"; description = "Location name for weather widget"; }; use12hourFormat = mkOption { type = types.bool; default = false; description = "Use 12-hour time format"; }; useFahrenheit = mkOption { type = types.bool; default = false; description = "Use Fahrenheit for temperature"; }; }; config = mkIf cfg.enable { # Configure Noctalia shell via home-manager module programs.noctalia-shell = { enable = true; # Don't install the package separately since systemd service handles it # But we need it for IPC commands in keybinds package = inputs.noctalia.packages.${pkgs.stdenv.hostPlatform.system}.default; settings = { colorSchemes = { useWallpaperColors = cfg.useWallpaperColors; predefinedScheme = cfg.colorScheme; darkMode = cfg.darkMode; }; bar = { position = cfg.barPosition; density = cfg.barDensity; showCapsule = true; floating = false; widgets = { left = [ { id = "Launcher"; } { id = "Clock"; } { id = "SystemMonitor"; } { id = "ActiveWindow"; } { id = "MediaMini"; } ]; center = [ { id = "Workspace"; } ]; right = [ { id = "Tray"; } { id = "NotificationHistory"; } { id = "Battery"; } { id = "Volume"; } { id = "Brightness"; } { id = "ControlCenter"; } ]; }; }; dock = { enabled = cfg.enableDock; position = cfg.dockPosition; displayMode = "auto_hide"; pinnedApps = cfg.pinnedApps; }; general = { avatarImage = cfg.avatarImage; radiusRatio = 1; animationSpeed = 1; enableShadows = true; }; location = { name = cfg.locationName; weatherEnabled = true; use12hourFormat = cfg.use12hourFormat; useFahrenheit = cfg.useFahrenheit; }; notifications = { enabled = true; location = "top_right"; }; appLauncher = { position = "center"; sortByMostUsed = true; viewMode = "list"; }; }; }; # Disable conflicting services that Noctalia replaces services.swayosd.enable = mkForce false; services.swaync.enable = mkForce false; # Disable wlsunset - Noctalia has built-in night light services.wlsunset.enable = mkForce false; # Disable waybar - Noctalia has its own bar waybarConfig.enable = mkForce false; programs.waybar.enable = mkForce false; }; }