{ lib, config, pkgs, __findFile, ... }: with lib; let
	cfg = config.style;

	mkTypeOption  = default: type: mkOption { inherit default type; };
	mkStrOption   = default: mkTypeOption default types.str;
	mkIntOption   = default: mkTypeOption default types.int;
	mkFloatOption = default: mkTypeOption default types.float;
	mkPkgOption   = default: mkTypeOption default types.package;
in {
	options.style = {
		color = {
			bg = {
				dark    = mkStrOption config.lib.stylix.colors.base00;
				light   = mkStrOption config.lib.stylix.colors.base07;
				regular = mkStrOption config.lib.stylix.colors.base01;
			};
			fg = {
				dark    = mkStrOption config.lib.stylix.colors.base04;
				light   = mkStrOption config.lib.stylix.colors.base06;
				regular = mkStrOption config.lib.stylix.colors.base05;
			};
			accent      = mkStrOption config.lib.stylix.colors.base0A;
			heading     = mkStrOption config.lib.stylix.colors.base0D;
			hl          = mkStrOption config.lib.stylix.colors.base03;
			keyword     = mkStrOption config.lib.stylix.colors.base0E;
			link        = mkStrOption config.lib.stylix.colors.base09;
			misc        = mkStrOption config.lib.stylix.colors.base0F;
			negative    = mkStrOption config.lib.stylix.colors.base08;
			neutral     = mkStrOption config.lib.stylix.colors.base0C;
			positive    = mkStrOption config.lib.stylix.colors.base0B;
			selection   = mkStrOption config.lib.stylix.colors.base02;
			transparent = mkStrOption "ffffff00";

			accent-b   = mkStrOption config.lib.stylix.colors.base0A-rgb-b;
			accent-g   = mkStrOption config.lib.stylix.colors.base0A-rgb-g;
			accent-r   = mkStrOption config.lib.stylix.colors.base0A-rgb-r;

			negative-b = mkStrOption config.lib.stylix.colors.base08-rgb-b;
			negative-g = mkStrOption config.lib.stylix.colors.base08-rgb-g;
			negative-r = mkStrOption config.lib.stylix.colors.base08-rgb-r;

			neutral-b  = mkStrOption config.lib.stylix.colors.base0C-rgb-b;
			neutral-g  = mkStrOption config.lib.stylix.colors.base0C-rgb-g;
			neutral-r  = mkStrOption config.lib.stylix.colors.base0C-rgb-r;

			positive-b = mkStrOption config.lib.stylix.colors.base0B-rgb-b;
			positive-g = mkStrOption config.lib.stylix.colors.base0B-rgb-g;
			positive-r = mkStrOption config.lib.stylix.colors.base0B-rgb-r;

			bg-b = mkStrOption config.lib.stylix.colors.base00-rgb-b;
			bg-g = mkStrOption config.lib.stylix.colors.base00-rgb-g;
			bg-r = mkStrOption config.lib.stylix.colors.base00-rgb-r;

			fg-b = mkStrOption config.lib.stylix.colors.base06-rgb-b;
			fg-g = mkStrOption config.lib.stylix.colors.base06-rgb-g;
			fg-r = mkStrOption config.lib.stylix.colors.base06-rgb-r;

			border   = mkStrOption config.lib.stylix.colors.base01;
			border-b = mkStrOption config.lib.stylix.colors.base01-rgb-b;
			border-g = mkStrOption config.lib.stylix.colors.base01-rgb-g;
			border-r = mkStrOption config.lib.stylix.colors.base01-rgb-r;
		};

		font = {
			size = {
				application = mkIntOption 12;
				terminal    = mkIntOption 14;
				popup       = mkIntOption 12;
				desktop     = mkIntOption 14;
			};
			serif = {
				package = mkPkgOption (pkgs.callPackage <package/applefont> {});
				name    = mkStrOption "SF Pro Display";
			};
			sansSerif = {
				package = mkPkgOption (pkgs.callPackage <package/applefont> {});
				name    = mkStrOption "SF Pro Display";
			};
			monospace = {
				package = mkPkgOption (pkgs.nerdfonts.override { fonts = [ "Terminus" ]; });
				name    = mkStrOption "Terminess Nerd Font Mono";
			};
			emoji = {
				package = mkPkgOption pkgs.noto-fonts-emoji;
				name    = mkStrOption "Noto Color Emoji";
			};
		};

		opacity = {
			application = mkFloatOption 0.85;
			desktop     = mkFloatOption 0.85;
			popup       = mkFloatOption 0.85;
			terminal    = mkFloatOption 0.85;
			hex         = mkStrOption "D9";
		};

		cursor = {
			name    = mkStrOption "Adwaita";
			package = mkPkgOption pkgs.adwaita-icon-theme;
			size    = mkIntOption 14;
		};

		window = {
			gap    = mkIntOption 8;
			border = mkIntOption 4;
		};
	};
}