dotfiles-nix/nix/default.nix
2025-01-23 09:26:51 -05:00

320 lines
7.2 KiB
Nix

{ 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;
};
};
};
# base16 theme color options
# https://github.com/chriskempson/base16/blob/main/styling.md
base16Opts = self: {
options = {
name = mkOption {
type = types.str;
description = "Name of the theme";
};
author = mkOption {
type = types.str;
description = "Author of the theme";
};
base00 = mkOption {
type = types.str;
description = "Default Background.";
};
base01 = mkOption {
type = types.str;
description = "Lighter Background (Used for status bars, line number and folding marks).";
};
base02 = mkOption {
type = types.str;
description = "Selection Background.";
};
base03 = mkOption {
type = types.str;
description = "Comments, Invisibles, Line Highlighting.";
};
base04 = mkOption {
type = types.str;
description = "Dark Foreground (Used for status bars).";
};
base05 = mkOption {
type = types.str;
description = "Default Foreground, Caret, Delimiters, Operators.";
};
base06 = mkOption {
type = types.str;
description = "Light Foreground (Not often used).";
};
base07 = mkOption {
type = types.str;
description = "Light Background (Not often used).";
};
base08 = mkOption {
type = types.str;
description = "Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted.";
};
base09 = mkOption {
type = types.str;
description = "Integers, Boolean, Constants, XML Attributes, Markup Link Url.";
};
base0A = mkOption {
type = types.str;
description = "Classes, Markup Bold, Search Text Background.";
};
base0B = mkOption {
type = types.str;
description = "Strings, Inherited Class, Markup Code, Diff Inserted.";
};
base0C = mkOption {
type = types.str;
description = "Support, Regular Expressions, Escape Characters, Markup Quotes.";
};
base0D = mkOption {
type = types.str;
description = "Functions, Methods, Attribute IDs, Headings.";
};
base0E = mkOption {
type = types.str;
description = "Keywords, Storage, Selector, Markup Italic, Diff Changed.";
};
base0F = mkOption {
type = types.str;
description = "Deprecated, Opening/Closing Embedded Language Tags.";
};
accent = mkOption {
type = types.str;
description = "Accent color.";
default = config.theme.colors.base0D;
};
};
};
in
{
imports = [
./programs
./home
./system
];
options = {
#
# 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.str;
description = "Home directory path of the user";
default = "/home/${config.user}";
};
dotfilesPath = mkOption {
type = types.str;
description = "Dotfiles path inside the users home dir";
default = "${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 base16Opts);
description = "Base16 color scheme";
default = (import ./themes).catppuccin.mocha;
};
opacity = mkOption {
type = types.float;
description = "Window opacity.";
default = 1.0;
};
# theme fonts
font = {
size = mkOption {
type = types.int;
description = "Theme primary font size.";
default = 14;
};
regular = mkOption {
type = types.str;
description = "Regular system font.";
default = "JetBrains Mono";
};
monospace = mkOption {
type = types.str;
description = "Monospace system font.";
default = "monospace";
};
header = mkOption {
type = types.str;
description = "Header system font.";
default = "JetBrains Mono ExtraBold";
};
icon = mkOption {
type = types.str;
description = "Icon system font.";
default = "Font Awesome 6 Pro";
};
};
borderWidth = mkOption {
type = types.int;
description = "Theme border width";
default = 3;
};
outerRadius = mkOption {
type = types.int;
description = "Theme outer border radius.";
default = 5;
};
innerRadius = mkOption {
type = types.int;
description = "Theme inner border radius.";
default = 2;
};
outerGap = mkOption {
type = types.int;
description = "Theme outer gap/spacing.";
default = 10;
};
innerGap = mkOption {
type = types.int;
description = "Theme inner gap/spacing.";
default = 3;
};
wallpaper = mkOption {
type = types.str;
description = "Path to wallpaper image";
default = "";
};
avatar = mkOption {
type = types.str;
description = "Path to avatar image";
default = "";
};
};
#
# 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.";
};
};
#
# 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 = "25.05";
home-manager.users.root.home.stateVersion = "25.05";
system.stateVersion = "25.05";
};
}