{ config, lib, pkgs, ... }: with lib; let # monitor options monitorOpts = self: { options = { name = mkOption { type = types.str; description = "Name of the monitor."; }; scale = mkOption { type = types.float; description = "Scaling factor of the monitor."; default = 1.0; }; bitdepth = mkOption { type = types.int; description = "Monitor color bitdepth"; default = 8; }; }; }; # theme color options colorOpts = self: { options = { name = mkOption { type = types.str; description = "Name of the theme"; }; author = mkOption { type = types.str; description = "Author of the theme"; }; text = mkOption { type = types.str; description = "Text color."; }; subtext = mkOption { type = types.str; description = "Subtext color."; }; base = mkOption { type = types.str; description = "Base background color."; }; surface = mkOption { type = types.str; description = "Surface (lighter) background color."; }; overlay = mkOption { type = types.str; description = "Overlay (light) background color."; }; primary = mkOption { type = types.str; description = "Primary accent color"; }; success = mkOption { type = types.str; description = "Success color"; }; warning = mkOption { type = types.str; description = "Warning color"; }; error = mkOption { type = types.str; description = "Error color"; }; normal = { black = mkOption { type = types.str; description = "Terminal black normal color"; }; red = mkOption { type = types.str; description = "Terminal red normal color"; }; green = mkOption { type = types.str; description = "Terminal green normal color"; }; yellow = mkOption { type = types.str; description = "Terminal yellow normal color"; }; blue = mkOption { type = types.str; description = "Terminal blue normal color"; }; magenta = mkOption { type = types.str; description = "Terminal magenta normal color"; }; cyan = mkOption { type = types.str; description = "Terminal cyan normal color"; }; white = mkOption { type = types.str; description = "Terminal white normal color"; }; pink = mkOption { type = types.str; description = "Terminal pink (extended) normal color."; }; orange = mkOption { type = types.str; description = "Terminal orange (extended) normal color."; }; }; bright = { black = mkOption { type = types.str; description = "Terminal black bright color"; }; red = mkOption { type = types.str; description = "Terminal red bright color"; }; green = mkOption { type = types.str; description = "Terminal green bright color"; }; yellow = mkOption { type = types.str; description = "Terminal yellow bright color"; }; blue = mkOption { type = types.str; description = "Terminal blue bright color"; }; magenta = mkOption { type = types.str; description = "Terminal magenta bright color"; }; cyan = mkOption { type = types.str; description = "Terminal cyan bright color"; }; white = mkOption { type = types.str; description = "Terminal white bright color"; }; pink = mkOption { type = types.str; description = "Terminal pink (extended) bright color."; }; orange = mkOption { type = types.str; description = "Terminal orange (extended) bright color."; }; }; }; }; stateVersion = "25.05"; in { options = { # # System information # hostName = mkOption { type = types.str; description = "Hostname of the system."; }; timeZone = mkOption { type = types.str; description = "System time zone"; default = "America/New_York"; }; # # System modules # battery = mkEnableOption { description = "Install battery and power system services and programs."; }; bluetooth = mkEnableOption { description = "Install bluetooth system services and programs."; }; network = mkEnableOption { description = "Install networking system services and programs."; }; minimal = mkEnableOption { description = "Install only required system services, drivers, and programs."; }; # # Primary user of the system # user = mkOption { type = types.str; description = "Primary user of the system"; }; fullName = mkOption { type = types.str; description = "Human readable name of the user"; }; email = mkOption { type = types.str; description = "Primary email of the user"; }; homePath = mkOption { type = types.path; description = "Home directory path of the user"; default = builtins.toPath "/home/${config.user}"; }; dotfilesPath = mkOption { type = types.path; description = "Dotfiles path inside the users home dir"; default = builtins.toPath "${config.homePath}/.config/nix"; }; # # Monitors of the system # monitors = mkOption { default = []; description = "Monitors of the system."; type = with types; listOf (submodule monitorOpts); }; # # Theme of the system # theme = { colors = mkOption { type = with types; (submodule colorOpts); description = "color scheme"; }; opacity = mkOption { type = types.float; description = "Window opacity."; }; # theme fonts font = { size = mkOption { type = types.int; description = "Theme primary font size."; }; regular = mkOption { type = types.str; description = "Regular system font."; }; monospace = mkOption { type = types.str; description = "Monospace system font."; }; header = mkOption { type = types.str; description = "Header system font."; }; icon = mkOption { type = types.str; description = "Icon system font."; }; }; borderWidth = mkOption { type = types.int; description = "Theme border width"; }; outerRadius = mkOption { type = types.int; description = "Theme outer border radius."; }; innerRadius = mkOption { type = types.int; description = "Theme inner border radius."; }; outerGap = mkOption { type = types.int; description = "Theme outer gap/spacing."; }; innerGap = mkOption { type = types.int; description = "Theme inner gap/spacing."; }; blur = mkEnableOption { description = "If to enable blur in some programs."; }; wallpaper = mkOption { type = types.str; description = "Path to wallpaper image"; }; lockscreen = mkOption { type = types.str; description = "Path to lockscreen image"; }; avatar = mkOption { type = types.str; description = "Path to avatar image"; }; }; # # Default programs # default = { browser = mkOption { type = types.str; description = "Default browser launch command."; }; appLauncher = mkOption { type = types.str; description = "Default application launcher launch command."; }; lockScreen = mkOption { type = types.str; description = "Default lock screen launch command."; }; terminal = mkOption { type = types.str; description = "Default terminal launch command."; }; session = mkOption { type = types.str; description = "Default systemd graphical session target."; default = "wayland-session.target"; }; }; # # Programs to auto start on launch # autoRun = mkOption { type = with types; listOf str; description = "List of programs to auto run in a graphical environment."; default = []; }; }; config = { # use system packages in home manager home-manager.useGlobalPkgs = true; # install user packages to /etc/profiles and not home directory home-manager.useUserPackages = true; # allow unfree packages nixpkgs.config.allowUnfree = true; # set state version home-manager.users.${config.user}.home.stateVersion = stateVersion; home-manager.users.root.home.stateVersion = stateVersion; system.stateVersion = stateVersion; }; }