# Global config { config, lib, pkgs, ... }: with lib; with types; let named = submodule { options = { normal = mkOption { type = str; }; bright = mkOption { type = str; }; pastel = mkOption { type = str; }; }; }; special = submodule { options = { primary = mkOption { type = str; }; normal = mkOption { type = str; }; slight = mkOption { type = str; }; }; }; themeType = submodule { options = { foreground = mkOption { type = special; }; background = mkOption { type = special; }; grayscales = mkOption { type = listOf str; }; red = mkOption { type = named; }; green = mkOption { type = named; }; blue = mkOption { type = named; }; yellow = mkOption { type = named; }; purple = mkOption { type = named; }; cyan = mkOption { type = named; }; pink = mkOption { type = named; }; orange = mkOption { type = named; }; misc = mkOption { type = attrsOf str; }; hex = mkOption { type = themeType; }; }; }; in { options.riley = with lib; { ide = mkOption { type = types.bool; description = '' Enable IDE-like plugins such as language servers for Rust, Haskell and Nix in the editor, and configure accordingly. If disabled, the editor will lack some features such as semantic highlighting. ''; default = true; }; gui = mkOption { type = types.bool; description = '' Enable the display server and related graphical programs. ''; default = true; }; theme = mkOption { type = themeType; description = '' The theme used across the installation. Not used if gui is disabled. ''; }; }; options.devices = mkOption { type = with types; submodule { options = { audio = mkOption { type = nullOr (submodule { options = { speakers = mkOption { type = str; }; external = mkOption { type = str; }; headset = mkOption { type = nullOr str; }; main-mic = mkOption { type = nullOr str; }; }; }); description = '' Known audio devices: outputs & microphones. Each string should be a pulseaudio sink or source. ''; }; video = mkOption { type = submodule { options = { displays = let output = submodule { options = { primary = mkOption { type = bool; default = false; }; position = mkOption { type = nullOr (listOf int); default = null; }; rotate = mkOption { type = enum [ "normal" "left" "right" "inverted" ]; default = "normal"; }; }; }; in mkOption { type = attrsOf output; description = '' A list of outputs with information on how to place them. ''; }; }; }; description = '' Define the video devices (just the displays, for now). ''; }; }; }; }; imports = [ ./ide ./gui ./fonts.nix ./git.nix ./ssh.nix ]; config = { riley.theme = (import ../colors.nix)."dark"; environment.systemPackages = with pkgs; [ # Web utils wget curl git # Coreutils ripgrep bottom skim exa bat lf fd ]; boot = { loader.systemd-boot = { enable = true; editor = false; configurationLimit = 10; }; loader.efi = { canTouchEfiVariables = true; }; cleanTmpDir = true; }; networking = { firewall.enable = false; useDHCP = false; }; nixpkgs.config.allowUnfree = true; users.users."riley" = { isNormalUser = true; extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. }; }; }