nixos/shared/modules/home-manager/noctalia.nix

182 lines
4.6 KiB
Nix

{ 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;
};
}