diff --git a/flake.nix b/flake.nix
index b37c184..03f7a5b 100644
--- a/flake.nix
+++ b/flake.nix
@@ -78,6 +78,17 @@
lib = nixpkgs.lib.extend customLib;
libHm = home-manager.lib.extend customLib;
+ systems = [
+ {
+ hostName = "desktop";
+ system = "x86_64-linux";
+ }
+ {
+ hostName = "thinkpad";
+ system = "x86_64-linux";
+ }
+ ];
+
in
{
#
@@ -89,51 +100,65 @@
#
# ========= Host Configurations =========
#
- nixosConfigurations.desktop =
- let
- hostName = "desktop";
- in
- nixpkgs.lib.nixosSystem {
- system = "x86_64-linux";
- specialArgs = {
- inherit
- outputs
- inputs
- common
- theme
- lib
- hostName
- ;
- isDarwin = false;
- };
- modules = [
- ./hosts/desktop
- home-manager.nixosModules.home-manager
- {
- home-manager = {
- # Backups conflicting files in case of error
- backupFileExtension = "bkp";
- useGlobalPkgs = true;
- useUserPackages = true;
- extraSpecialArgs = {
- inherit
- inputs
- common
- theme
- libHm
- hostName
- ;
- };
- users.${common.username} = import ./hosts/${hostName}/home-manager;
+ nixosConfigurations = builtins.listToAttrs (
+ builtins.map (
+ {
+ hostName,
+ system,
+ user ? {
+ name = common.username;
+ password = "temp";
+ },
+ version ? common.version,
+ }:
+ {
+ name = hostName;
+ value = nixpkgs.lib.nixosSystem {
+ inherit system;
+ specialArgs = {
+ inherit
+ outputs
+ inputs
+ common
+ theme
+ lib
+ hostName
+ version
+ ;
+ isDarwin = false;
};
- }
- {
- nixpkgs.overlays = with inputs; [
- hyprpanel.overlay
+ modules = [
+ ./hosts/${hostName}
+ home-manager.nixosModules.home-manager
+ {
+ home-manager = {
+ # Backups conflicting files in case of error
+ backupFileExtension = "bkp";
+ useGlobalPkgs = true;
+ useUserPackages = true;
+ extraSpecialArgs = {
+ inherit
+ inputs
+ common
+ theme
+ libHm
+ hostName
+ version
+ ;
+ };
+ users.${user.name} = import ./hosts/${hostName}/home-manager;
+ };
+ }
+ {
+ nixpkgs.overlays = with inputs; [
+ hyprpanel.overlay
+ ];
+ }
];
- }
- ];
- };
+ };
+ }
+ ) systems
+ );
#
# ========= Formatting =========
diff --git a/hosts/desktop/home-manager/default.nix b/hosts/desktop/home-manager/default.nix
index db18a80..b555ebf 100644
--- a/hosts/desktop/home-manager/default.nix
+++ b/hosts/desktop/home-manager/default.nix
@@ -25,7 +25,6 @@ in
./media
./nextcloud.nix
./rofi
- ./wlogout
./hyprland
./spicetify.nix
./yazi
diff --git a/hosts/desktop/home-manager/hyprland/default.nix b/hosts/desktop/home-manager/hyprland/default.nix
index 9969757..8763716 100644
--- a/hosts/desktop/home-manager/hyprland/default.nix
+++ b/hosts/desktop/home-manager/hyprland/default.nix
@@ -2,14 +2,12 @@
{
imports = [
./binds.nix
- ./waybar
./hypridle
./hyprlock
./hyprpanel
./hyprpaper.nix
./hyprshot.nix
./settings.nix
- ./swaync
];
wayland.windowManager.hyprland = {
diff --git a/hosts/desktop/home-manager/hyprland/swaync/default.nix b/hosts/desktop/home-manager/hyprland/swaync/default.nix
deleted file mode 100644
index 49986b8..0000000
--- a/hosts/desktop/home-manager/hyprland/swaync/default.nix
+++ /dev/null
@@ -1,461 +0,0 @@
-{ lib, theme, ... }:
-
-{
- services.swaync = {
- enable = false;
- style = lib.mkDefault ''
- * {
- all: unset;
- font-size: 14px;
- font-family: "${theme.nerdFont} Nerd Font", monospace;
- transition: 200ms;
- }
-
- trough highlight {
- background: #${theme.textAlpha};
- }
-
- scale trough {
- margin: 0 1rem;
- background-color: #${theme.surface0Alpha};
- min-height: 8px;
- min-width: 70px;
- }
-
- slider {
- background-color: #${theme.blueAlpha};
- }
-
- .floating-notifications.background .notification-row .notification-background {
- box-shadow:
- 0 0 8px 0 rgba(0, 0, 0, 0.8),
- inset 0 0 0 1px #${theme.surface0Alpha};
- border-radius: 12.6px;
- margin: 18px;
- background-color: #${theme.baseAlpha};
- color: #${theme.textAlpha};
- padding: 0;
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification {
- padding: 7px;
- border-radius: 12.6px;
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification.critical {
- box-shadow: inset 0 0 7px 0 #${theme.redAlpha};
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification
- .notification-content {
- margin: 7px;
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification
- .notification-content
- .summary {
- color: #${theme.textAlpha};
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification
- .notification-content
- .time {
- color: #${theme.subtext0Alpha};
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification
- .notification-content
- .body {
- color: #${theme.textAlpha};
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification
- > *:last-child
- > * {
- min-height: 3.4em;
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification
- > *:last-child
- > *
- .notification-action {
- border-radius: 7px;
- color: #${theme.textAlpha};
- background-color: #${theme.surface0Alpha};
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- margin: 7px;
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification
- > *:last-child
- > *
- .notification-action:hover {
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- background-color: #${theme.surface0Alpha};
- color: #${theme.textAlpha};
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .notification
- > *:last-child
- > *
- .notification-action:active {
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- background-color: #${theme.sapphireAlpha};
- color: #${theme.textAlpha};
- }
-
- /* Close Button */
- .floating-notifications.background
- .notification-row
- .notification-background
- .close-button {
- margin: 7px;
- padding: 2px;
- border-radius: 6.3px;
- color: #${theme.baseAlpha};
- background-color: #${theme.redAlpha};
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .close-button:hover {
- background-color: #${theme.maroonAlpha};
- color: #${theme.baseAlpha};
- }
-
- .floating-notifications.background
- .notification-row
- .notification-background
- .close-button:active {
- background-color: #${theme.redAlpha};
- color: #${theme.baseAlpha};
- }
-
- .control-center {
- box-shadow:
- 0 0 8px 0 rgba(0, 0, 0, 0.8),
- inset 0 0 0 1px #${theme.surface0Alpha};
- border-radius: 12.6px;
- margin: 18px;
- background-color: #${theme.baseAlpha};
- color: #${theme.textAlpha};
- padding: 14px;
- }
-
- .control-center .widget-title > label {
- color: #${theme.textAlpha};
- font-size: 1.3em;
- }
-
- .control-center .widget-title button {
- border-radius: 7px;
- color: #${theme.textAlpha};
- background-color: #${theme.surface0Alpha};
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- padding: 8px;
- }
-
- .control-center .widget-title button:hover {
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- background-color: #585b70;
- color: #${theme.textAlpha};
- }
-
- .control-center .widget-title button:active {
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- background-color: #${theme.sapphireAlpha};
- color: #${theme.baseAlpha};
- }
-
- .control-center .notification-row .notification-background {
- border-radius: 7px;
- color: #${theme.textAlpha};
- background-color: #${theme.surface0Alpha};
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- margin-top: 14px;
- }
-
- .control-center .notification-row .notification-background .notification {
- padding: 7px;
- border-radius: 7px;
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification.critical {
- box-shadow: inset 0 0 7px 0 #${theme.redAlpha};
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification
- .notification-content {
- margin: 7px;
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification
- .notification-content
- .summary {
- color: #${theme.textAlpha};
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification
- .notification-content
- .time {
- color: #a6adc8;
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification
- .notification-content
- .body {
- color: #${theme.textAlpha};
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification
- > *:last-child
- > * {
- min-height: 3.4em;
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification
- > *:last-child
- > *
- .notification-action {
- border-radius: 7px;
- color: #${theme.textAlpha};
- background-color: #${theme.crustAlpha};
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- margin: 7px;
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification
- > *:last-child
- > *
- .notification-action:hover {
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- background-color: #${theme.surface0Alpha};
- color: #${theme.textAlpha};
- }
-
- .control-center
- .notification-row
- .notification-background
- .notification
- > *:last-child
- > *
- .notification-action:active {
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- background-color: #${theme.sapphireAlpha};
- color: #${theme.textAlpha};
- }
-
- .control-center .notification-row .notification-background .close-button {
- margin: 7px;
- padding: 2px;
- border-radius: 6.3px;
- color: #${theme.baseAlpha};
- background-color: #${theme.maroonAlpha};
- }
-
- .close-button {
- border-radius: 6.3px;
- }
-
- .control-center .notification-row .notification-background .close-button:hover {
- background-color: #${theme.redAlpha};
- color: #${theme.baseAlpha};
- }
-
- .control-center
- .notification-row
- .notification-background
- .close-button:active {
- background-color: #${theme.redAlpha};
- color: #${theme.baseAlpha};
- }
-
- .control-center .notification-row .notification-background:hover {
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- background-color: #${theme.overlay1Alpha};
- color: #${theme.textAlpha};
- }
-
- .control-center .notification-row .notification-background:active {
- box-shadow: inset 0 0 0 1px #${theme.surface1Alpha};
- background-color: #${theme.sapphireAlpha};
- color: #${theme.textAlpha};
- }
-
- .notification.critical progress {
- background-color: #${theme.redAlpha};
- }
-
- .notification.low progress,
- .notification.normal progress {
- background-color: #${theme.blueAlpha};
- }
-
- .control-center-dnd {
- margin-top: 5px;
- border-radius: 8px;
- background: #${theme.surface0Alpha};
- border: 1px solid #${theme.surface1Alpha};
- box-shadow: none;
- }
-
- .control-center-dnd:checked {
- background: #${theme.surface0Alpha};
- }
-
- .control-center-dnd slider {
- background: #${theme.surface1Alpha};
- border-radius: 8px;
- }
-
- .widget-dnd {
- margin: 0px;
- font-size: 1.1rem;
- }
-
- .widget-dnd > switch {
- font-size: initial;
- border-radius: 8px;
- background: #${theme.surface0Alpha};
- border: 1px solid #${theme.surface1Alpha};
- box-shadow: none;
- }
-
- .widget-dnd > switch:checked {
- background: #${theme.surface0Alpha};
- }
-
- .widget-dnd > switch slider {
- background: #${theme.surface1Alpha};
- border-radius: 8px;
- border: 1px solid #${theme.overlay0Alpha};
- }
-
- .widget-mpris .widget-mpris-player {
- background: #${theme.surface0Alpha};
- padding: 7px;
- }
-
- .widget-mpris .widget-mpris-title {
- font-size: 1.2rem;
- }
-
- .widget-mpris .widget-mpris-subtitle {
- font-size: 0.8rem;
- }
-
- .widget-menubar > box > .menu-button-bar > button > label {
- font-size: 3rem;
- padding: 0.5rem 2rem;
- }
-
- .widget-menubar > box > .menu-button-bar > :last-child {
- color: #${theme.redAlpha};
- }
-
- .power-buttons button:hover,
- .powermode-buttons button:hover,
- .screenshot-buttons button:hover {
- background: #${theme.surface0Alpha};
- }
-
- .control-center .widget-label > label {
- color: #${theme.textAlpha};
- font-size: 2rem;
- }
-
- .widget-buttons-grid {
- padding-top: 1rem;
- }
-
- .widget-buttons-grid > flowbox > flowboxchild > button label {
- font-size: 2.5rem;
- }
-
- .widget-volume {
- padding-top: 1rem;
- }
-
- .widget-volume label {
- font-size: 1.5rem;
- color: #${theme.sapphireAlpha};
- }
-
- .widget-volume trough highlight {
- background: #${theme.sapphireAlpha};
- }
-
- .widget-backlight trough highlight {
- background: #${theme.yellowAlpha};
- }
-
- .widget-backlight label {
- font-size: 1.5rem;
- color: #${theme.yellowAlpha};
- }
-
- .widget-backlight .KB {
- padding-bottom: 1rem;
- }
-
- .image {
- padding-right: 0.5rem;
- }
- '';
- };
-}
diff --git a/hosts/desktop/home-manager/hyprland/waybar/config/config.jsonc b/hosts/desktop/home-manager/hyprland/waybar/config/config.jsonc
deleted file mode 100644
index 8c09f42..0000000
--- a/hosts/desktop/home-manager/hyprland/waybar/config/config.jsonc
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "layer": "top",
- // Waybar at top layer
- "position": "top",
- // Waybar position (top|bottom|left|right)
- // "width": 1280, // Waybar width
- // Choose the order of the modules
- "modules-left": ["hyprland/workspaces", "custom/music"],
- "modules-center": ["hyprland/window"],
- "modules-right": [
- "hyprland/language",
- "wireplumber",
- "backlight",
- "clock",
- "custom/notification",
- "tray",
- "custom/lock",
- "custom/power"
- ],
- "hyprland/workspaces": {
- "disable-scroll": false,
- "sort-by-name": true,
- "format": " {id} "
- },
- "hyprland/window": {
- "format": "{initialTitle}"
- },
- "tray": {
- "icon-size": 21,
- "spacing": 10
- },
- // TODO better music module
- "custom/music": {
- "format": " {}",
- "escape": true,
- "interval": 5,
- "tooltip": false,
- "exec": "playerctl metadata --format='{{ title }}'",
- "on-click": "playerctl play-pause",
- "max-length": 50
- },
- "clock": {
- "timezone": "Europe/Oslo",
- "tooltip-format": "{:%Y %B}\n{calendar}",
- "format": " {:%H:%M %d/%m}",
- "calendar": {
- "mode": "month",
- "weeks-pos": "left",
- "format": {
- "months": "{}",
- "days": "{}",
- "weeks": "W{}",
- "weekdays": "{}",
- "today": "{}"
- }
- }
- },
- "backlight": {
- "device": "intel_backlight",
- "format": "{icon}",
- "format-icons": ["", "", "", "", "", "", "", "", ""]
- },
- "wireplumber": {
- // "scroll-step": 1, // %, can be a float
- "format": "{icon} {volume}%",
- "format-muted": " ",
- "format-icons": {
- "default": ["", " ", " "]
- },
- "on-click": "pavucontrol"
- },
- "hyprland/language": {
- "format-en": "EN",
- "format-no": "NO",
- "keyboard-name": "logitech-logitech-g710-keyboard",
- "on-click": "hyprctl switchxkblayout logitech-logitech-g710-keyboard next"
- },
- "custom/lock": {
- "tooltip": false,
- "on-click": "sh -c '(sleep 0.5s; hyprlock)'",
- "format": ""
- },
- "custom/power": {
- "tooltip": false,
- "on-click": "wlogout &",
- "format": " "
- },
- "custom/notification": {
- "tooltip": false,
- "format": "{icon}",
- "format-icons": {
- "notification": "",
- "none": "",
- "dnd-notification": "",
- "dnd-none": "",
- "inhibited-notification": "",
- "inhibited-none": "",
- "dnd-inhibited-notification": "",
- "dnd-inhibited-none": ""
- },
- "return-type": "json",
- "exec-if": "which swaync-client",
- "exec": "swaync-client -swb",
- "on-click": "swaync-client -t -sw",
- "on-click-right": "swaync-client -d -sw",
- "escape": true
- }
-}
diff --git a/hosts/desktop/home-manager/hyprland/waybar/config/mocha.css b/hosts/desktop/home-manager/hyprland/waybar/config/mocha.css
deleted file mode 100644
index 98e218a..0000000
--- a/hosts/desktop/home-manager/hyprland/waybar/config/mocha.css
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-*
-* Catppuccin Mocha palette
-* Maintainer: rubyowo
-*
-*/
-
-@define-color base #1e1e2e;
-@define-color mantle #181825;
-@define-color crust #11111b;
-
-@define-color text #cdd6f4;
-@define-color subtext0 #a6adc8;
-@define-color subtext1 #bac2de;
-
-@define-color surface0 #313244;
-@define-color surface1 #45475a;
-@define-color surface2 #585b70;
-
-@define-color overlay0 #6c7086;
-@define-color overlay1 #7f849c;
-@define-color overlay2 #9399b2;
-
-@define-color blue #89b4fa;
-@define-color lavender #b4befe;
-@define-color sapphire #74c7ec;
-@define-color sky #89dceb;
-@define-color teal #94e2d5;
-@define-color green #a6e3a1;
-@define-color yellow #f9e2af;
-@define-color peach #fab387;
-@define-color maroon #eba0ac;
-@define-color red #f38ba8;
-@define-color mauve #cba6f7;
-@define-color pink #f5c2e7;
-@define-color flamingo #f2cdcd;
-@define-color rosewater #f5e0dc;
diff --git a/hosts/desktop/home-manager/hyprland/waybar/config/style.css b/hosts/desktop/home-manager/hyprland/waybar/config/style.css
deleted file mode 100644
index 77d2de3..0000000
--- a/hosts/desktop/home-manager/hyprland/waybar/config/style.css
+++ /dev/null
@@ -1,104 +0,0 @@
-@import "mocha.css";
-
-* {
- font-family: JetBrainsMono Nerd Font;
- font-size: 15px;
- min-height: 0;
-}
-
-#waybar {
- background: transparent;
- color: @text;
- margin: 5px 5px;
-}
-
-#workspaces {
- border-radius: 1rem;
- background-color: @surface0;
- margin: 5px 5px 5px 1rem;
-}
-
-#workspaces button {
- color: @lavender;
- border-radius: 1rem;
- padding: 0.4rem;
-}
-
-#workspaces button.active {
- color: @sky;
- border-radius: 1rem;
-}
-
-#workspaces button:hover {
- color: @sapphire;
- border-radius: 1rem;
-}
-
-#language,
-#window,
-#custom-notification,
-#custom-music,
-#tray,
-#backlight,
-#clock,
-#wireplumber,
-#custom-lock,
-#custom-power {
- background-color: @surface0;
- padding: 0.5rem 1rem;
- margin: 5px 0;
-}
-
-#clock {
- color: @blue;
-}
-
-#backlight {
- color: @yellow;
-}
-
-#backlight {
- border-radius: 0;
-}
-
-#language {
- color: @red;
- border-radius: 1rem 0 0 1rem;
- margin-left: 1rem;
-}
-
-#wireplumber {
- color: @maroon;
-}
-
-#custom-music {
- color: @mauve;
- border-radius: 1rem;
-}
-
-#window {
- color: @mauve;
- border-radius: 1rem;
-}
-
-#custom-lock {
- border-radius: 1rem 0 0 1rem;
- color: @lavender;
-}
-
-#custom-power {
- margin-right: 1rem;
- border-radius: 0 1rem 1rem 0;
- color: @red;
-}
-
-#custom-notification {
- margin-right: 1rem;
- border-radius: 0 1rem 1rem 0;
- color: @sapphire;
-}
-
-#tray {
- margin-right: 1rem;
- border-radius: 1rem;
-}
diff --git a/hosts/desktop/home-manager/hyprland/waybar/default.nix b/hosts/desktop/home-manager/hyprland/waybar/default.nix
deleted file mode 100644
index 23c50f4..0000000
--- a/hosts/desktop/home-manager/hyprland/waybar/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- home.file.".config/waybar" = {
- source = ./config;
- recursive = true;
- };
-}
diff --git a/hosts/desktop/home-manager/wlogout/default.nix b/hosts/desktop/home-manager/wlogout/default.nix
deleted file mode 100644
index de89d02..0000000
--- a/hosts/desktop/home-manager/wlogout/default.nix
+++ /dev/null
@@ -1,116 +0,0 @@
-# Log out and shutdown menu
-{
- home.file =
- let
- dir = ".config/wlogout";
- in
- {
- "${dir}/hibernate.svg".source = ./hibernate.svg;
- "${dir}/lock.svg".source = ./lock.svg;
- "${dir}/logout.svg".source = ./logout.svg;
- "${dir}/reboot.svg".source = ./reboot.svg;
- "${dir}/shutdown.svg".source = ./shutdown.svg;
- "${dir}/suspend.svg".source = ./suspend.svg;
- };
-
- programs.wlogout = {
- enable = false;
- layout = [
- {
- label = "lock";
- action = "sh -c '(sleep 0.5s; hyprlock)'";
- text = "Lock";
- keybind = "l";
- }
- {
- label = "hibernate";
- action = "systemctl hibernate";
- text = "Hibernate";
- keybind = "h";
- }
- {
- label = "logout";
- action = "loginctl terminate-user $USER";
- text = "Logout";
- keybind = "e";
- }
- {
- label = "shutdown";
- action = "systemctl poweroff";
- text = "Shutdown";
- keybind = "s";
- }
- {
- label = "suspend";
- action = "systemctl suspend";
- text = "Suspend";
- keybind = "u";
- }
- {
- label = "reboot";
- action = "systemctl reboot";
- text = "Reboot";
- keybind = "r";
- }
- ];
- style =
- let
- theme = import ../../theme.nix;
- in
- ''
- * {
- background-image: none;
- box-shadow: none;
- }
-
- window {
- background-color: rgba(30, 30, 46, 0.9);
- }
-
- button {
- border-radius: 0;
- border-color: #${theme.pinkAlpha};
- text-decoration-color: #${theme.textAlpha};
- color: #${theme.textAlpha};
- background-color: #${theme.mantleAlpha};
- border-style: solid;
- border-width: 1px;
- background-repeat: no-repeat;
- background-position: center;
- background-size: 25%;
- }
-
- button:focus,
- button:active,
- button:hover {
- /* 20% Overlay 2, 80% mantle */
- background-color: rgb(48, 50, 66);
- outline-style: none;
- }
-
- #lock {
- background-image: url("./lock.svg");
- }
-
- #logout {
- background-image: url("./logout.svg");
- }
-
- #suspend {
- background-image: url("./suspend.svg");
- }
-
- #hibernate {
- background-image: url("./hibernate.svg");
- }
-
- #shutdown {
- background-image: url("./shutdown.svg");
- }
-
- #reboot {
- background-image: url("./reboot.svg");
- }
- '';
- };
-}
diff --git a/hosts/desktop/home-manager/wlogout/hibernate.svg b/hosts/desktop/home-manager/wlogout/hibernate.svg
deleted file mode 100644
index 5626c72..0000000
--- a/hosts/desktop/home-manager/wlogout/hibernate.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/hosts/desktop/home-manager/wlogout/lock.svg b/hosts/desktop/home-manager/wlogout/lock.svg
deleted file mode 100644
index 4b629fd..0000000
--- a/hosts/desktop/home-manager/wlogout/lock.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/hosts/desktop/home-manager/wlogout/logout.svg b/hosts/desktop/home-manager/wlogout/logout.svg
deleted file mode 100644
index 3e0cc80..0000000
--- a/hosts/desktop/home-manager/wlogout/logout.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/hosts/desktop/home-manager/wlogout/reboot.svg b/hosts/desktop/home-manager/wlogout/reboot.svg
deleted file mode 100644
index c05f000..0000000
--- a/hosts/desktop/home-manager/wlogout/reboot.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/hosts/desktop/home-manager/wlogout/shutdown.svg b/hosts/desktop/home-manager/wlogout/shutdown.svg
deleted file mode 100644
index 6693b35..0000000
--- a/hosts/desktop/home-manager/wlogout/shutdown.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/hosts/desktop/home-manager/wlogout/style.css b/hosts/desktop/home-manager/wlogout/style.css
deleted file mode 100644
index 54752da..0000000
--- a/hosts/desktop/home-manager/wlogout/style.css
+++ /dev/null
@@ -1,53 +0,0 @@
-* {
- background-image: none;
- box-shadow: none;
-}
-
-window {
- background-color: rgba(30, 30, 46, 0.9);
-}
-
-button {
- border-radius: 0;
- border-color: #f5c2e7;
- text-decoration-color: #cdd6f4;
- color: #cdd6f4;
- background-color: #181825;
- border-style: solid;
- border-width: 1px;
- background-repeat: no-repeat;
- background-position: center;
- background-size: 25%;
-}
-
-button:focus,
-button:active,
-button:hover {
- /* 20% Overlay 2, 80% mantle */
- background-color: rgb(48, 50, 66);
- outline-style: none;
-}
-
-#lock {
- background-image: url("./lock.svg");
-}
-
-#logout {
- background-image: url("./logout.svg");
-}
-
-#suspend {
- background-image: url("./suspend.svg");
-}
-
-#hibernate {
- background-image: url("./hibernate.svg");
-}
-
-#shutdown {
- background-image: url("./shutdown.svg");
-}
-
-#reboot {
- background-image: url("./reboot.svg");
-}
diff --git a/hosts/desktop/home-manager/wlogout/suspend.svg b/hosts/desktop/home-manager/wlogout/suspend.svg
deleted file mode 100644
index 08214b4..0000000
--- a/hosts/desktop/home-manager/wlogout/suspend.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/hosts/pi4/default.nix b/hosts/pi4/default.nix
new file mode 100644
index 0000000..ff19397
--- /dev/null
+++ b/hosts/pi4/default.nix
@@ -0,0 +1,54 @@
+{
+ pkgs,
+ hostName,
+ user,
+ version,
+ ...
+}:
+
+{
+ boot = {
+ kernelPackages = pkgs.linuxKernel.packages.linux_rpi4;
+ initrd.availableKernelModules = [
+ "xhci_pci"
+ "usbhid"
+ "usb_storage"
+ ];
+ loader = {
+ grub.enable = false;
+ generic-extlinux-compatible.enable = true;
+ };
+ };
+
+ environment.systemPackages = with pkgs; [
+ vim
+ ];
+
+ fileSystems = {
+ "/" = {
+ device = "/dev/disk/by-label/NIXOS_SD";
+ fsType = "ext4";
+ options = [ "noatime" ];
+ };
+ };
+
+ hardware.enableRedistributableFirmware = true;
+
+ networking = {
+ inherit hostName;
+ networkmanager.enable = true;
+ };
+
+ services.openssh.enable = true;
+
+ system.stateVersion = version;
+
+ users = {
+ mutableUsers = false;
+ users.${user.name} = {
+ isNormalUser = true;
+ password = user.password;
+ extraGroups = [ "wheel" ];
+ };
+ };
+}
diff --git a/hosts/thinkpad/common.nix b/hosts/thinkpad/common.nix
new file mode 100644
index 0000000..a2fd81c
--- /dev/null
+++ b/hosts/thinkpad/common.nix
@@ -0,0 +1,25 @@
+rec {
+ default = {
+ browser = "zen";
+ calculator = "gnome-calculator";
+ fileManager = "nautilus";
+ imageViewer = "loupe";
+ lockScreen = "hyprlock";
+ terminal = "kitty";
+ };
+
+ dir = {
+ home = "/home/${username}";
+ pictures = "${dir.home}/Pictures";
+ };
+
+ keymaps = {
+ layout = "gb,no";
+ options = "grp:alt_shift_toggle"; # Toggle using ALT + SHIFT
+ };
+
+ # Empty matches all
+ monitor1 = "";
+
+ username = "martin";
+}
diff --git a/hosts/thinkpad/default.nix b/hosts/thinkpad/default.nix
new file mode 100644
index 0000000..6f0823f
--- /dev/null
+++ b/hosts/thinkpad/default.nix
@@ -0,0 +1,69 @@
+{
+ pkgs,
+ outputs,
+ common,
+ ...
+}:
+
+{
+ imports = [ ./modules ];
+
+ nixpkgs.overlays = [ outputs.overlays.unstable-packages ];
+
+ # Bootloader.
+ boot.loader = {
+ systemd-boot.enable = true;
+ efi.canTouchEfiVariables = true;
+ };
+
+ # Define a user account. Don't forget to set a password with 'passwd'.
+ users.users.${common.username} = {
+ isNormalUser = true;
+ description = common.username;
+ extraGroups = [
+ "networkmanager"
+ "wheel"
+ ];
+ };
+
+ # Allow unfree packages
+ nixpkgs.config.allowUnfree = true;
+
+ environment.sessionVariables = {
+ # Tells Electron apps to use Wayland
+ NIXOS_OZONE_WL = "1";
+ };
+
+ # List packages installed in system profile. To search, run:
+ # $ nix search wget
+ environment.systemPackages = with pkgs; [
+ brightnessctl
+ wget
+ xdg-utils
+ xdg-desktop-portal
+ xdg-desktop-portal-gtk
+ unstable.protonmail-desktop
+ stremio
+ fastfetch
+ discord
+ nix-prefetch-github # Cmd to get rev and hash from GitHub
+ gimp
+ vlc
+ vdhcoapp
+ onlyoffice-desktopeditors
+ ];
+
+ nix.settings.experimental-features = [
+ "nix-command"
+ "flakes"
+ ];
+
+ programs.kdeconnect.enable = true;
+
+ services = {
+ flatpak.enable = false;
+ xserver.enable = true;
+ };
+
+ system.stateVersion = common.system.version;
+}
diff --git a/hosts/thinkpad/home-manager/btop.nix b/hosts/thinkpad/home-manager/btop.nix
new file mode 100644
index 0000000..3d146b5
--- /dev/null
+++ b/hosts/thinkpad/home-manager/btop.nix
@@ -0,0 +1,9 @@
+let
+ theme = import ../theme.nix;
+in
+{
+ catppuccin.btop = {
+ enable = true;
+ flavor = theme.flavor;
+ };
+}
diff --git a/hosts/thinkpad/home-manager/cava/cava.png b/hosts/thinkpad/home-manager/cava/cava.png
new file mode 100644
index 0000000..60cbec3
Binary files /dev/null and b/hosts/thinkpad/home-manager/cava/cava.png differ
diff --git a/hosts/thinkpad/home-manager/cava/default.nix b/hosts/thinkpad/home-manager/cava/default.nix
new file mode 100644
index 0000000..661c02b
--- /dev/null
+++ b/hosts/thinkpad/home-manager/cava/default.nix
@@ -0,0 +1,29 @@
+## Audio visualizer
+{ pkgs, ... }:
+
+let
+ theme = import ../../theme.nix;
+in
+{
+ catppuccin.cava = {
+ enable = true;
+ flavor = theme.flavor;
+ };
+
+ programs.cava = {
+ enable = true;
+ package = pkgs.cava;
+ };
+
+ xdg.desktopEntries.cava = {
+ name = "Cava";
+ genericName = "Audio visualizer";
+ terminal = true;
+ exec = "${pkgs.cava}/bin/cava";
+ icon = ./cava.png;
+ categories = [
+ "Audio"
+ "AudioVideo"
+ ];
+ };
+}
diff --git a/hosts/thinkpad/home-manager/cursors.nix b/hosts/thinkpad/home-manager/cursors.nix
new file mode 100644
index 0000000..d0ad7b9
--- /dev/null
+++ b/hosts/thinkpad/home-manager/cursors.nix
@@ -0,0 +1,16 @@
+let
+ theme = import ../theme.nix;
+in
+{
+ catppuccin.cursors = {
+ enable = true;
+ flavor = theme.flavor;
+ accent = "dark";
+ };
+
+ home.pointerCursor = {
+ gtk.enable = true;
+ x11.enable = true;
+ size = 16;
+ };
+}
diff --git a/hosts/thinkpad/home-manager/default-applications.nix b/hosts/thinkpad/home-manager/default-applications.nix
new file mode 100644
index 0000000..d3f3e7f
--- /dev/null
+++ b/hosts/thinkpad/home-manager/default-applications.nix
@@ -0,0 +1,24 @@
+# TODO more defaults
+{
+ xdg.mimeApps = {
+ enable = true;
+ defaultApplications =
+ let
+ browser = "zen.desktop";
+ imageViewer = "org.gnome.Loupe.desktop";
+ pdfReader = "org.gnome.Papers.desktop";
+ in
+ {
+ "text/html" = browser;
+ "x-scheme-handler/http" = browser;
+ "x-scheme-handler/https" = browser;
+ "x-scheme-handler/about" = browser;
+ "x-scheme-handler/unknown" = browser;
+ "image/jpg" = imageViewer;
+ "image/jpeg" = imageViewer;
+ "image/png" = imageViewer;
+ "image/gif" = imageViewer;
+ "application/pdf" = pdfReader;
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/default.nix b/hosts/thinkpad/home-manager/default.nix
new file mode 100644
index 0000000..c32b866
--- /dev/null
+++ b/hosts/thinkpad/home-manager/default.nix
@@ -0,0 +1,67 @@
+{
+ pkgs,
+ inputs,
+ ...
+}:
+let
+ common = import ../common.nix;
+ username = common.username;
+ dir = common.dir;
+in
+{
+ imports = [
+ inputs.catppuccin.homeManagerModules.catppuccin
+ ./btop.nix
+ ./cava
+ ./cursors.nix
+ ./default-applications.nix
+ ./development
+ ./fastfetch.nix
+ ./fish.nix
+ ./freetube.nix
+ ./gtk.nix
+ ./kitty.nix
+ ./mpv.nix
+ ./nextcloud.nix
+ ./hyprland
+ ./spicetify.nix
+ ./yazi
+ ./zen
+ ];
+
+ dconf = {
+ enable = true;
+ settings = {
+ # Prefer dark mode for all GTK apps
+ "org/gnome/desktop/interface".color-scheme = "prefer-dark";
+ };
+ };
+
+ home = {
+ username = username;
+ homeDirectory = dir.home;
+
+ sessionVariables = {
+ XDG_PICTURES_DIR = dir.pictures; # Define the default dir for pictures
+ };
+
+ # You can update Home Manager without changing this value. See
+ # the Home Manager release notes for a list of state version
+ # changes in each release.
+ stateVersion = common.system.version;
+ };
+
+ programs = {
+ btop.enable = true;
+
+ # Let Home Manager install and manage itself.
+ home-manager.enable = true;
+ };
+
+ services = {
+ gpg-agent = {
+ enable = true;
+ pinentryPackage = pkgs.pinentry-curses;
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/development/default.nix b/hosts/thinkpad/home-manager/development/default.nix
new file mode 100644
index 0000000..ed66da1
--- /dev/null
+++ b/hosts/thinkpad/home-manager/development/default.nix
@@ -0,0 +1,9 @@
+{
+ imports = [
+ ./git.nix
+ ./nixvim
+ ./zed.nix
+ ];
+ # TODO set Wayland vmOptions in Jetbrains products, Requires current installed version in path
+ # -Dawt.toolkit.name=WLToolKit
+}
diff --git a/hosts/thinkpad/home-manager/development/git.nix b/hosts/thinkpad/home-manager/development/git.nix
new file mode 100644
index 0000000..11b4a4d
--- /dev/null
+++ b/hosts/thinkpad/home-manager/development/git.nix
@@ -0,0 +1,33 @@
+{ pkgs, ... }:
+
+{
+ home.packages = with pkgs; [ git-crypt ];
+
+ programs.git =
+ let
+ package = pkgs.git.override { withLibsecret = true; };
+ in
+ {
+ enable = true;
+ package = package;
+ userName = "Martin Berg Alstad";
+ userEmail = "git@martials.no";
+
+ aliases = {
+ amend = "commit --amend";
+ cm = "commit";
+ s = "status";
+ };
+
+ signing = {
+ signByDefault = true;
+ key = "848D71DE0590C199";
+ };
+
+ extraConfig = {
+ push.autoSetupRemote = true;
+ safe.directory = "/etc/nixos";
+ credential.helper = "${package}/bin/git-credential-libsecret";
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/development/nixvim/default.nix b/hosts/thinkpad/home-manager/development/nixvim/default.nix
new file mode 100644
index 0000000..1bccf09
--- /dev/null
+++ b/hosts/thinkpad/home-manager/development/nixvim/default.nix
@@ -0,0 +1,77 @@
+# Neovim configuration for Nix
+{ inputs, ... }:
+
+{
+ imports = [
+ inputs.nixvim.homeManagerModules.nixvim
+ ];
+
+ catppuccin.nvim.enable = true;
+
+ home.sessionVariables.EDITOR = "nvim";
+
+ programs.nixvim = {
+ enable = true;
+ clipboard.providers.wl-copy.enable = true;
+ colorschemes.catppuccin.enable = true;
+ defaultEditor = true;
+ vimdiffAlias = true; # Alias vimdiff to nvim -d
+
+ opts = {
+ number = true; # Show line numbers
+ relativenumber = true; # Show relative line numbers
+
+ shiftwidth = 2; # Tab width should be 2
+ };
+
+ plugins = {
+ bufferline.enable = false;
+
+ # Formatters
+ conform-nvim = {
+ enable = true;
+ # TODO use nix fmt on save
+ settings = { };
+ };
+
+ lsp = {
+ enable = true;
+ servers = {
+ nixd.enable = true;
+ };
+ };
+
+ lualine.enable = true;
+ luasnip.enable = true;
+
+ # Completions
+ cmp = {
+ enable = true;
+
+ autoEnableSources = true;
+
+ # TODO complete on
+ settings = {
+ sources = [
+ { name = "nvim-lsp"; }
+ { name = "path"; }
+ { name = "buffer"; }
+ ];
+ };
+ };
+
+ treesitter.enable = true;
+ web-devicons.enable = true;
+ };
+
+ extraConfigLua = ''
+ -- Translucent background
+ vim.cmd [[
+ highlight Normal guibg=none
+ highlight NonText guibg=none
+ highlight Normal ctermbg=none
+ highlight NonText ctermbg=none
+ ]]
+ '';
+ };
+}
diff --git a/hosts/thinkpad/home-manager/development/zed.nix b/hosts/thinkpad/home-manager/development/zed.nix
new file mode 100644
index 0000000..12c45b8
--- /dev/null
+++ b/hosts/thinkpad/home-manager/development/zed.nix
@@ -0,0 +1,57 @@
+{ pkgs, ... }:
+
+{
+ programs.zed-editor = {
+ enable = true;
+ package = pkgs.unstable.zed-editor;
+ extensions = [
+ "html"
+ "catppuccin"
+ "catppuccin-icons"
+ "toml"
+ "nix"
+ "git-firefly"
+ "just"
+ ];
+ userSettings =
+ let
+ theme = import ../../theme.nix;
+ font = "${theme.nerdFont} Nerd Font";
+ fontSize = 14;
+ in
+ {
+ assistant = {
+ default_model = {
+ provider = "ollama";
+ model = "deepseek-r1:8b";
+ };
+ version = "2";
+ };
+ autosave = "on_focus_change";
+ base_keymap = "JetBrains";
+ buffer_font_family = font;
+ features = {
+ edit_completion_provider = "zed";
+ };
+ icon_theme = "Catppuccin Mocha";
+ # icon_theme = { TODO replace icon theme above with below
+ # mode = theme.mode;
+ # light = "Catppuccin Mocha";
+ # dark = "Catppuccin Mocha";
+ # };
+ ui_font_family = font;
+ ui_font_size = fontSize;
+ buffer_font_size = fontSize;
+ tabs = {
+ file_icons = true;
+ git_status = true;
+ };
+ theme = {
+ mode = theme.mode;
+ light = "Catppuccin Latte";
+ dark = "Catppuccin Mocha";
+ };
+ lsp.nil.initialization_options.formatting.command = [ "nixfmt" ];
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/fastfetch.nix b/hosts/thinkpad/home-manager/fastfetch.nix
new file mode 100644
index 0000000..3da66cf
--- /dev/null
+++ b/hosts/thinkpad/home-manager/fastfetch.nix
@@ -0,0 +1,60 @@
+{
+ programs = {
+ fish.shellAliases.fetch = "fastfetch";
+ fastfetch = {
+ enable = true;
+ settings = {
+ logo = {
+ source = "${../Catppuccin.png}";
+ type = "kitty";
+ height = 18;
+ padding.top = 2;
+ };
+ display.separator = " ";
+ modules =
+ let
+ keyColor = "34";
+ module = type: key: {
+ inherit type key keyColor;
+ };
+ formatModule = type: key: format: {
+ inherit
+ type
+ key
+ format
+ keyColor
+ ;
+ };
+ in
+ [
+ "break"
+ "break"
+ {
+ type = "title";
+ keyWidth = 10;
+ }
+ "break"
+ (module "os" " ")
+ (module "kernel" " ")
+ (formatModule "packages" " " "{} (nixpkgs)")
+ (module "shell" " ")
+ (module "terminal" " ")
+ (module "wm" " ")
+ (module "theme" " ")
+ (module "cursor" " ")
+ (module "terminalfont" " ")
+ (module "uptime" " ")
+ (formatModule "datetime" " " "{1}-{3}-{11}")
+ (module "cpu" " ")
+ (module "gpu" " ")
+ (module "sound" " ")
+ (module "lm" " ")
+ "break"
+ "colors"
+ "break"
+ "break"
+ ];
+ };
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/fish.nix b/hosts/thinkpad/home-manager/fish.nix
new file mode 100644
index 0000000..7611f35
--- /dev/null
+++ b/hosts/thinkpad/home-manager/fish.nix
@@ -0,0 +1,57 @@
+{ pkgs, ... }:
+let
+ theme = import ../theme.nix;
+in
+{
+ catppuccin = {
+ fish = {
+ enable = true;
+ flavor = theme.flavor;
+ };
+ starship = {
+ enable = true;
+ flavor = theme.flavor;
+ };
+ };
+
+ programs = {
+ fish = {
+ enable = true;
+ # Start starship when creating a new shell
+ interactiveShellInit = ''
+ starship init fish | source
+ ${pkgs.fortune}/bin/fortune | ${pkgs.cowsay}/bin/cowsay -f tux
+ '';
+ plugins = [
+ {
+ # !! to get the previous command
+ # https://github.com/BrewingWeasel/fishbang
+ name = "fishbang";
+ src = pkgs.fetchFromGitHub {
+ owner = "BrewingWeasel";
+ repo = "fishbang";
+ rev = "50389667eb9ac79edcff9b987c83e1de8ac93921";
+ hash = "sha256-IneNWyfo29C7FDA5b6pTZRX3HpP6y/dRM6GXuLq2+zc=";
+ };
+ }
+ ];
+ shellAliases = {
+ nix-shell = "nix-shell --run fish"; # Start nix-shells using fishcd
+ };
+ };
+
+ starship = {
+ enable = true;
+ settings = {
+ directory.substitutions = {
+ "Documents" = " ";
+ "Downloads" = " ";
+ "Music" = " ";
+ "Pictures" = " ";
+ "Git" = " ";
+ "nextcloud" = " ";
+ };
+ };
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/freetube.nix b/hosts/thinkpad/home-manager/freetube.nix
new file mode 100644
index 0000000..aad9f56
--- /dev/null
+++ b/hosts/thinkpad/home-manager/freetube.nix
@@ -0,0 +1,53 @@
+{ pkgs, ... }:
+
+{
+ catppuccin.freetube.enable = true;
+
+ programs.freetube = {
+ enable = true;
+ package = pkgs.unstable.freetube;
+ settings = {
+ allowDashAv1Formats = true;
+ checkForUpdates = false;
+ currentLocale = "en-GB";
+ defaultTheatreMode = true;
+ defaultQuality = "1080";
+ displayVideoPlayButton = false;
+ region = "NO";
+ useSponsorBlock = true;
+
+ sponsorBlockSponsor = {
+ color = "CatppuccinMochaGreen";
+ skip = "autoSkip";
+ };
+ sponsorBlockSelfPromo = {
+ color = "CatppuccinMochaYellow";
+ skip = "showInSeekBar";
+ };
+ sponsorBlockInteraction = {
+ color = "CatppuccinMochaPink";
+ skip = "showInSeekBar";
+ };
+ sponsorBlockIntro = {
+ color = "CatppuccinMochaSapphire";
+ skip = "doNothing";
+ };
+ sponsorBlockOutro = {
+ color = "CatppuccinMochaBlue";
+ skip = "doNothing";
+ };
+ sponsorBlockRecap = {
+ color = "CatppuccinMochaMauve";
+ skip = "doNothing";
+ };
+ sponsorBlockMusicOffTopic = {
+ color = "CatppuccinMochaFlamingo";
+ skip = "doNothing";
+ };
+ sponsorBlockFiller = {
+ color = "CatppuccinMochaMauve";
+ skip = "doNothing";
+ };
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/gtk.nix b/hosts/thinkpad/home-manager/gtk.nix
new file mode 100644
index 0000000..4a766d8
--- /dev/null
+++ b/hosts/thinkpad/home-manager/gtk.nix
@@ -0,0 +1,11 @@
+let
+ theme = import ../theme.nix;
+in
+{
+ gtk.enable = true;
+ catppuccin.gtk = {
+ enable = true;
+ flavor = theme.flavor;
+ icon.enable = true;
+ };
+}
diff --git a/hosts/thinkpad/home-manager/hyprland/binds.nix b/hosts/thinkpad/home-manager/hyprland/binds.nix
new file mode 100644
index 0000000..d9e3b82
--- /dev/null
+++ b/hosts/thinkpad/home-manager/hyprland/binds.nix
@@ -0,0 +1,103 @@
+let
+ common = import ../../common.nix;
+ app = common.default;
+in
+{
+ # TODO binds to move focused window
+ wayland.windowManager.hyprland.settings = {
+ "$mainMod" = "SUPER";
+ "$shiftMod" = "$mainMod SHIFT";
+ "$ctrlMod" = "$mainMod CTRL";
+ "$menu" = "rofi -show drun";
+
+ bind = [
+ "$mainMod, Q, exec, ${app.terminal}"
+ "$mainMod, C, killactive,"
+ "$shiftMod, M, exit,"
+ "$mainMod, E, exec, ${app.fileManager}"
+ "$mainMod, V, togglefloating,"
+ "$mainMod, R, exec, $menu"
+ "$mainMod, P, pseudo," # dwindle
+ "$mainMod, J, togglesplit," # dwindle
+ "$mainMod, B, exec, ${app.browser}"
+ "$mainMod, L, exec, ${app.lockScreen}"
+ "$mainMod, K, exec, [float] ${app.calculator}"
+ "$mainMod, ESCAPE, exec, hyprpanel t dashboardmenu"
+
+ # Move focus with mainMod + arrow keys
+ "$mainMod, left, movefocus, l"
+ "$mainMod, right, movefocus, r"
+ "$mainMod, up, movefocus, u"
+ "$mainMod, down, movefocus, d"
+
+ # Move window with ctrl + mainMod + arrow keys
+ "$ctrlMod, left, movewindow, l"
+ "$ctrlMod, right, movewindow, r"
+ "$ctrlMod, up, movewindow, u"
+ "$ctrlMod, down, movewindow, d"
+
+ # Switch workspaces with mainMod + [0-9]
+ "$mainMod, 1, workspace, 1"
+ "$mainMod, 2, workspace, 2"
+ "$mainMod, 3, workspace, 3"
+ "$mainMod, 4, workspace, 4"
+ "$mainMod, 5, workspace, 5"
+ "$mainMod, 6, workspace, 6"
+ "$mainMod, 7, workspace, 7"
+ "$mainMod, 8, workspace, 8"
+ "$mainMod, 9, workspace, 9"
+ "$mainMod, 0, workspace, 10"
+
+ # Move active window to a workspace with mainMod + SHIFT + [0-9]
+ "$shiftMod, 1, movetoworkspace, 1"
+ "$shiftMod, 2, movetoworkspace, 2"
+ "$shiftMod, 3, movetoworkspace, 3"
+ "$shiftMod, 4, movetoworkspace, 4"
+ "$shiftMod, 5, movetoworkspace, 5"
+ "$shiftMod, 6, movetoworkspace, 6"
+ "$shiftMod, 7, movetoworkspace, 7"
+ "$shiftMod, 8, movetoworkspace, 8"
+ "$shiftMod, 9, movetoworkspace, 9"
+ "$shiftMod, 0, movetoworkspace, 10"
+
+ # Example special workspace (scratchpad)
+ "$mainMod, S, togglespecialworkspace, magic"
+ "$shiftMod, S, movetoworkspace, special:magic"
+
+ # Scroll through existing workspaces with mainMod + scroll
+ "$mainMod, mouse_down, workspace, e+1"
+ "$mainMod, mouse_up, workspace, e-1"
+ ];
+
+ binde = [
+ # Resize the focused window
+ "$shiftMod, right, resizeactive, 20 0"
+ "$shiftMod, left, resizeactive, -20 0"
+ "$shiftMod, up, resizeactive, 0 -20"
+ "$shiftMod, down, resizeactive, 0 20"
+ ];
+
+ bindm = [
+ # Move/resize windows with mainMod + LMB/RMB and dragging
+ "$mainMod, mouse:272, movewindow"
+ "$mainMod, mouse:273, resizewindow"
+ ];
+
+ bindl = [
+ ", XF86AudioNext, exec, playerctl next"
+ ", XF86AudioPause, exec, playerctl play-pause"
+ ", XF86AudioPlay, exec, playerctl play-pause"
+ ", XF86AudioPrev, exec, playerctl previous"
+ ];
+
+ bindel = [
+ # Laptop multimedia keys for volume and LCD brightness
+ ",XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
+ ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
+ ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
+ ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
+ ",XF86MonBrightnessUp, exec, brightnessctl s 10%+"
+ ",XF86MonBrightnessDown, exec, brightnessctl s 10%-"
+ ];
+ };
+}
diff --git a/hosts/thinkpad/home-manager/hyprland/default.nix b/hosts/thinkpad/home-manager/hyprland/default.nix
new file mode 100644
index 0000000..def2943
--- /dev/null
+++ b/hosts/thinkpad/home-manager/hyprland/default.nix
@@ -0,0 +1,22 @@
+# Home configurations for Hyprland. For system configs, see ./modules/hyprland
+{ outputs, ... }:
+
+{
+ imports = [
+ ./binds.nix
+ ./hypridle
+ ./hyprlock
+ ./hyprpanel
+ ./hyprpaper.nix
+ ./hyprshot.nix
+ ./settings.nix
+ ];
+
+ # Adds pkgs.unstable in order to fetch packages from unstable repositories
+ nixpkgs.overlays = [ outputs.overlays.unstable-packages ];
+
+ wayland.windowManager.hyprland = {
+ enable = true;
+ systemd.variables = [ "--all" ]; # Import environment into systemd
+ };
+}
diff --git a/hosts/thinkpad/home-manager/hyprland/hypridle/default.nix b/hosts/thinkpad/home-manager/hyprland/hypridle/default.nix
new file mode 100644
index 0000000..69768c3
--- /dev/null
+++ b/hosts/thinkpad/home-manager/hyprland/hypridle/default.nix
@@ -0,0 +1,38 @@
+let
+ # Time in seconds
+ lockAfter = 1200;
+ screenOffAfter = 1500;
+ suspendAfter = 7200;
+in
+{
+ services.hypridle = {
+ enable = true;
+ settings = {
+ general = {
+ before_sleep_cmd = "loginctl lock-session";
+ after_sleep_cmd = "hyprctl dispatch dpms on";
+ lock_cmd = "pidof hyprlock || hyprlock"; # Avoid running multiple instances of hyprlock
+ };
+
+ listener = [
+ # Lock
+ {
+ timeout = lockAfter;
+ on-timeout = "loginctl lock-session";
+ }
+ # Turn off screens
+ {
+ timeout = screenOffAfter;
+ on-timeout = "hyprctl dispatch dpms off";
+ on-resume = "hyprctl dispatch dpms on";
+ }
+ # Suspend
+ {
+ timeout = suspendAfter;
+ on-timeout = "systemctl suspend"; # suspend pc
+ }
+ ];
+ };
+ };
+ wayland.windowManager.hyprland.settings.exec-once = [ "hypridle" ];
+}
diff --git a/hosts/thinkpad/home-manager/hyprland/hyprlock/default.nix b/hosts/thinkpad/home-manager/hyprland/hyprlock/default.nix
new file mode 100644
index 0000000..2ff5a52
--- /dev/null
+++ b/hosts/thinkpad/home-manager/hyprland/hyprlock/default.nix
@@ -0,0 +1,89 @@
+{ lib, ... }:
+let
+ theme = import ../../../theme.nix;
+in
+{
+ programs.hyprlock = {
+ enable = true;
+ settings = {
+ "$font" = "${theme.nerdFont} Nerd Font";
+
+ background = [
+ {
+ path = "${../../../wallpapers/catppuccin_page_curl.png}";
+ }
+ ];
+
+ # GENERAL
+ general = {
+ disable_loading_bar = true;
+ hide_cursor = true;
+ };
+
+ # LAYOUT
+ label = [
+ {
+ text = "$LAYOUT";
+ color = "${theme.textRgb}";
+ font_size = 25;
+ font_family = "$font";
+ position = "30, -30";
+ halign = "left";
+ valign = "top";
+ }
+ # TIME
+ {
+ text = "$TIME";
+ color = "${theme.textRgb}";
+ font_size = 90;
+ font_family = "$font";
+ position = "-30, 0";
+ halign = "right";
+ valign = "top";
+ }
+ # DATE
+ {
+ text = "cmd[update:43200000] date +\"%A, %d %B %Y\"";
+ color = "${theme.textRgb}";
+ font_size = 25;
+ font_family = "$font";
+ position = "-30, -150";
+ halign = "right";
+ valign = "top";
+ }
+ ];
+
+ # USER AVATAR
+ image = {
+ path = "${../../face.png}";
+ size = 100;
+ border_color = "${theme.blueRgb}";
+ position = "0, 75";
+ halign = "center";
+ valign = "center";
+ };
+
+ # INPUT FIELD
+ input-field = {
+ size = "300, 60";
+ outline_thickness = 4;
+ dots_size = 0.2;
+ dots_spacing = 0.2;
+ dots_center = true;
+ outer_color = lib.mkDefault "${theme.blueRgb}";
+ inner_color = lib.mkDefault "${theme.surface0Rgb}";
+ font_color = lib.mkDefault "${theme.textRgb}";
+ fade_on_empty = false;
+ placeholder_text = " Logged in as $USER";
+ hide_input = false;
+ check_color = lib.mkDefault "${theme.blueRgb}";
+ fail_color = lib.mkDefault "${theme.redRgb}";
+ fail_text = "$FAIL ($ATTEMPTS)";
+ capslock_color = lib.mkDefault "${theme.yellowRgb}";
+ position = "0, -47"; # TODO change to use % at 25.05
+ halign = "center";
+ valign = "center";
+ };
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/hyprland/hyprpanel/default.nix b/hosts/thinkpad/home-manager/hyprland/hyprpanel/default.nix
new file mode 100644
index 0000000..4b20d4a
--- /dev/null
+++ b/hosts/thinkpad/home-manager/hyprland/hyprpanel/default.nix
@@ -0,0 +1,123 @@
+{
+ pkgs,
+ inputs,
+ lib,
+ ...
+}:
+let
+ common = import ../../../common.nix;
+ theme = import ../../../theme.nix;
+ loader = import ../../secretsLoader.nix lib;
+in
+{
+ imports = [ inputs.hyprpanel.homeManagerModules.hyprpanel ];
+
+ programs.hyprpanel = {
+ enable = true;
+ # Add hyprpanel to the Hyprland config 'exec-once'.
+ hyprland.enable = true;
+ # Fix the overwrite issue with HyprPanel.
+ overwrite.enable = true;
+
+ # Import a theme from './themes/*.json'.
+ theme = "";
+
+ # Override the final config with an arbitrary set.
+ # Useful for overriding colors in your selected theme.
+ # Default: {}
+ override = {
+ theme.bar.menus.text = "#123ABC";
+ };
+
+ # Configure bar layouts for monitors.
+ layout = {
+ "bar.layouts" = {
+ "*" = {
+ left = [
+ "dashboard"
+ "workspaces"
+ "windowtitle"
+ ];
+ middle = [ "media" ];
+ right = [
+ "kbinput"
+ "volume"
+ "network"
+ "systray"
+ "clock"
+ "battery"
+ "notifications"
+ ];
+ };
+ };
+ };
+
+ # Configure and theme almost all options from the GUI.
+ # Options that require '{}' or '[]' are not yet implemented,
+ # except for the layout above.
+ # See 'https://hyprpanel.com/configuration/settings.html'.
+ # Default:
+ settings = {
+ bar = {
+ clock.format = "%a %b %d %H:%M";
+ customModules.kbLayout.leftClick = "hyprctl switchxkblayout keychron-keychron-k8-pro next";
+ launcher.autoDetectIcon = true;
+ network.label = false;
+ volume = {
+ scrollDown = "${pkgs.hyprpanel}/bin/hyprpanel 'vol -1'";
+ scrollUp = "${pkgs.hyprpanel}/bin/hyprpanel 'vol +1'";
+ };
+ workspaces = {
+ show_icons = false;
+ show_numbered = true;
+ };
+ };
+
+ menus = {
+ clock = {
+ time = {
+ military = true;
+ hideSeconds = true;
+ };
+ weather = {
+ unit = "metric";
+ location = "Bergen, Norway";
+ key = loader.loadSecret ../../secrets/weather-api-key;
+ };
+ };
+
+ dashboard = {
+ directories.enabled = false;
+ powermenu.avatar.image = "${../../face.png}";
+ shortcuts.left = {
+ shortcut1 = {
+ command = common.default.browser;
+ icon = ""; # TODO replace with Zen icon
+ tooltip = "Zen";
+ };
+ shortcut2 = {
+ command = "spotify";
+ icon = "";
+ tooltip = "Spotify";
+ };
+ ## shortcut3 === discord
+ ## shortcut4 === rofi -show drun
+ };
+ stats.enable_gpu = true;
+ };
+ };
+
+ scalingPriority = "hyprland";
+
+ theme = {
+ bar.transparent = true;
+ font = {
+ name = "${theme.nerdFont} NF";
+ size = "16px";
+ };
+ };
+
+ wallpaper.enable = false;
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/hyprland/hyprpaper.nix b/hosts/thinkpad/home-manager/hyprland/hyprpaper.nix
new file mode 100644
index 0000000..bcb8c54
--- /dev/null
+++ b/hosts/thinkpad/home-manager/hyprland/hyprpaper.nix
@@ -0,0 +1,33 @@
+# Wallpapers
+{ pkgs, ... }:
+
+let
+ common = import ../../common.nix;
+in
+{
+ home.packages = with pkgs; [
+ hyprpaper
+ ];
+
+ services.hyprpaper = {
+ enable = true;
+ settings =
+ let
+ wallpaperDir = ../../wallpapers;
+ monitor1 = "${wallpaperDir}/nixos_waves.png";
+ in
+ {
+ ipc = "on";
+ splash = false;
+ splash_offset = 2.0;
+
+ preload = [
+ monitor1
+ ];
+
+ wallpaper = [
+ "${common.monitor1},${monitor1}"
+ ];
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/hyprland/hyprshot.nix b/hosts/thinkpad/home-manager/hyprland/hyprshot.nix
new file mode 100644
index 0000000..67dbb6b
--- /dev/null
+++ b/hosts/thinkpad/home-manager/hyprland/hyprshot.nix
@@ -0,0 +1,19 @@
+let
+ common = import ../../common.nix;
+in
+{
+ wayland.windowManager.hyprland.settings = {
+ "$mainMod" = "SUPER";
+ "$shiftMod" = "$mainMod SHIFT";
+
+ env = [
+ "HYPRSHOT_DIR,${common.dir.pictures}/screenshots" # Store screenshots here
+ ];
+
+ bind = [
+ "$mainMod, PRINT, exec, hyprshot -m window" # Window
+ ", PRINT, exec, hyprshot -m output" # Monitor
+ "$shiftMod, PRINT, exec, hyprshot -m region" # Region
+ ];
+ };
+}
diff --git a/hosts/thinkpad/home-manager/hyprland/settings.nix b/hosts/thinkpad/home-manager/hyprland/settings.nix
new file mode 100644
index 0000000..92c33f5
--- /dev/null
+++ b/hosts/thinkpad/home-manager/hyprland/settings.nix
@@ -0,0 +1,135 @@
+{ lib, ... }:
+let
+ common = import ../../common.nix;
+ theme = import ../../theme.nix;
+ app = common.default;
+in
+{
+ wayland.windowManager.hyprland.settings = {
+ monitor = [
+ "${common.monitor1}, 1920x1080@60.05, 0x0, 1"
+ ];
+
+ # Autostart
+ exec-once = [
+ app.browser
+ app.terminal
+ "systemctl --user start hyprpolkitagent"
+ "hyprsunset -t 5000" # Set blue light filter
+ ];
+
+ env = [
+ "ELECTRON_OZONE_PLATFORM_HINT,auto" # Tell Electron apps to use Wayland
+ ];
+
+ general = {
+ gaps_in = 5;
+ gaps_out = 20;
+ border_size = 2;
+ "col.active_border" = lib.mkDefault "${theme.mauveRgb} ${theme.tealRgb} 45deg";
+ "col.inactive_border" = lib.mkDefault "rgba(${theme.surface2Alpha}aa)";
+ resize_on_border = true;
+ allow_tearing = false;
+ layout = "dwindle";
+ };
+
+ decoration = {
+ rounding = 10;
+
+ # Change transparency of focused and unfocused windows
+ active_opacity = 1.0;
+ inactive_opacity = 1.0;
+
+ shadow = {
+ enabled = true;
+ range = 4;
+ render_power = 3;
+ color = lib.mkDefault theme.baseRgb;
+ };
+
+ blur = {
+ enabled = true;
+ size = 3;
+ passes = 1;
+
+ vibrancy = 0.1696;
+ };
+ };
+
+ animations = {
+ enabled = "yes, please :)";
+
+ bezier = [
+ "easeOutQuint,0.23,1,0.32,1"
+ "easeInOutCubic,0.65,0.05,0.36,1"
+ "linear,0,0,1,1"
+ "almostLinear,0.5,0.5,0.75,1.0"
+ "quick,0.15,0,0.1,1"
+ ];
+
+ animation = [
+ "global, 1, 10, default"
+ "border, 1, 5.39, easeOutQuint"
+ "windows, 1, 4.79, easeOutQuint"
+ "windowsIn, 1, 4.1, easeOutQuint, popin 87%"
+ "windowsOut, 1, 1.49, linear, popin 87%"
+ "fadeIn, 1, 1.73, almostLinear"
+ "fadeOut, 1, 1.46, almostLinear"
+ "fade, 1, 3.03, quick"
+ "layers, 1, 3.81, easeOutQuint"
+ "layersIn, 1, 4, easeOutQuint, fade"
+ "layersOut, 1, 1.5, linear, fade"
+ "fadeLayersIn, 1, 1.79, almostLinear"
+ "fadeLayersOut, 1, 1.39, almostLinear"
+ "workspaces, 1, 1.94, almostLinear, fade"
+ "workspacesIn, 1, 1.21, almostLinear, fade"
+ "workspacesOut, 1, 1.94, almostLinear, fade"
+ ];
+ };
+
+ dwindle = {
+ pseudotile = true; # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = true; # You probably want this
+ };
+
+ master.new_status = "master";
+
+ misc = {
+ force_default_wallpaper = 0;
+ disable_hyprland_logo = true;
+ };
+
+ debug.disable_logs = false;
+
+ input = {
+ kb_layout = common.keymaps.layout;
+ kb_options = common.keymaps.options;
+ follow_mouse = 1;
+ sensitivity = 0.4; # -1.0 - 1.0, 0 means no modification.
+ touchpad.natural_scroll = true;
+ };
+
+ gestures = {
+ workspace_swipe = true;
+ workspace_swipe_distance = 150;
+ workspace_swipe_min_speed_to_force = 0;
+ workspace_swipe_cancel_ratio = 0.5;
+ };
+
+ device = {
+ name = "logitech-g502-hero-gaming-mouse";
+ sensitivity = -0.10;
+ };
+
+ windowrulev2 = [
+ # Ignore maximize requests from apps
+ "suppressevent maximize, class:.*"
+ # Fix some dragging issues with XWayland
+ "nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0"
+ # Avoid locking in fullscreen
+ "idleinhibit fullscreen, class:^(*)$"
+ "idleinhibit fullscreen, title:^(*)$"
+ "idleinhibit fullscreen, fullscreen:1"
+ ];
+ };
+}
diff --git a/hosts/thinkpad/home-manager/kitty.nix b/hosts/thinkpad/home-manager/kitty.nix
new file mode 100644
index 0000000..4316146
--- /dev/null
+++ b/hosts/thinkpad/home-manager/kitty.nix
@@ -0,0 +1,25 @@
+let
+ common = import ../common.nix;
+ theme = import ../theme.nix;
+in
+{
+ catppuccin.kitty = {
+ enable = true;
+ flavor = theme.flavor;
+ };
+
+ programs = {
+ # Transfer shell config to target device
+ fish.shellAliases.ssh = "kitty +kitten ssh";
+ kitty = {
+ enable = common.default.terminal == "kitty";
+ font.name = theme.nerdFont;
+ settings = {
+ background_blur = 5;
+ background_opacity = 0.8;
+ confirm_os_window_close = 0;
+ window_padding_width = 10;
+ };
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/mpv.nix b/hosts/thinkpad/home-manager/mpv.nix
new file mode 100644
index 0000000..ef88358
--- /dev/null
+++ b/hosts/thinkpad/home-manager/mpv.nix
@@ -0,0 +1,29 @@
+{
+ catppuccin.mpv =
+ let
+ theme = import ../theme.nix;
+ in
+ {
+ enable = true;
+ flavor = theme.flavor;
+ };
+
+ programs = {
+ fish.shellAliases.mpvl = "mpv --profile=loop";
+ mpv = {
+ enable = true;
+ config = {
+ hwdec = "auto-safe";
+ vo = "gpu";
+ profile = "gpu-hq";
+ gpu-context = "wayland";
+ };
+ profiles = {
+ loop = {
+ loop-playlist = "inf";
+ loop-file = "inf";
+ };
+ };
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/nextcloud.nix b/hosts/thinkpad/home-manager/nextcloud.nix
new file mode 100644
index 0000000..6d6bc7c
--- /dev/null
+++ b/hosts/thinkpad/home-manager/nextcloud.nix
@@ -0,0 +1,6 @@
+{
+ services.nextcloud-client = {
+ enable = true;
+ startInBackground = true;
+ };
+}
diff --git a/hosts/thinkpad/home-manager/spicetify.nix b/hosts/thinkpad/home-manager/spicetify.nix
new file mode 100644
index 0000000..758b9dc
--- /dev/null
+++ b/hosts/thinkpad/home-manager/spicetify.nix
@@ -0,0 +1,35 @@
+{
+ pkgs,
+ inputs,
+ lib,
+ ...
+}:
+
+{
+ imports = [ inputs.spicetify-nix.homeManagerModules.default ];
+ programs.spicetify =
+ let
+ spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
+ theme = import ../theme.nix;
+ in
+ {
+ enable = true;
+
+ enabledExtensions = with spicePkgs.extensions; [
+ adblock
+ fullAppDisplay
+ hidePodcasts
+ shuffle # shuffle+ (special characters are sanitized out of extension names)
+ ];
+ enabledCustomApps = with spicePkgs.apps; [
+ newReleases
+ ncsVisualizer
+ ];
+ enabledSnippets = with spicePkgs.snippets; [
+ pointer
+ ];
+
+ theme = lib.mkForce spicePkgs.themes.catppuccin;
+ colorScheme = lib.mkForce theme.flavor;
+ };
+}
diff --git a/hosts/thinkpad/home-manager/yazi/catppuccin-mocha.tmTheme b/hosts/thinkpad/home-manager/yazi/catppuccin-mocha.tmTheme
new file mode 100644
index 0000000..6bd0f29
--- /dev/null
+++ b/hosts/thinkpad/home-manager/yazi/catppuccin-mocha.tmTheme
@@ -0,0 +1,2081 @@
+
+
+
+
+ name
+ Catppuccin Mocha
+ semanticClass
+ theme.dark.catppuccin-mocha
+ uuid
+ 627ce890-fabb-4d39-9819-7be71f4bdca7
+ author
+ Catppuccin Org
+ colorSpaceName
+ sRGB
+ settings
+
+
+ settings
+
+ background
+ #1e1e2e
+ foreground
+ #cdd6f4
+ caret
+ #f5e0dc
+ lineHighlight
+ #313244
+ misspelling
+ #f38ba8
+ accent
+ #cba6f7
+ selection
+ #9399b240
+ activeGuide
+ #45475a
+ findHighlight
+ #3e5767
+ gutterForeground
+ #7f849c
+
+
+
+ name
+ Basic text & variable names (incl. leading punctuation)
+ scope
+ text, source, variable.other.readwrite, punctuation.definition.variable
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Parentheses, Brackets, Braces
+ scope
+ punctuation
+ settings
+
+ foreground
+ #9399b2
+ fontStyle
+
+
+
+
+ name
+ Comments
+ scope
+ comment, punctuation.definition.comment
+ settings
+
+ foreground
+ #6c7086
+ fontStyle
+ italic
+
+
+
+ scope
+ string, punctuation.definition.string
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ scope
+ constant.character.escape
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Booleans, constants, numbers
+ scope
+ constant.numeric, variable.other.constant, entity.name.constant, constant.language.boolean, constant.language.false, constant.language.true, keyword.other.unit.user-defined, keyword.other.unit.suffix.floating-point
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ keyword, keyword.operator.word, keyword.operator.new, variable.language.super, support.type.primitive, storage.type, storage.modifier, punctuation.definition.keyword
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+
+
+
+
+ scope
+ entity.name.tag.documentation
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Punctuation
+ scope
+ keyword.operator, punctuation.accessor, punctuation.definition.generic, meta.function.closure punctuation.section.parameters, punctuation.definition.tag, punctuation.separator.key-value
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ scope
+ entity.name.function, meta.function-call.method, support.function, support.function.misc, variable.function
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Classes
+ scope
+ entity.name.class, entity.other.inherited-class, support.class, meta.function-call.constructor, entity.name.struct
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Enum
+ scope
+ entity.name.enum
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Enum member
+ scope
+ meta.enum variable.other.readwrite, variable.other.enummember
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Object properties
+ scope
+ meta.property.object
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Types
+ scope
+ meta.type, meta.type-alias, support.type, entity.name.type
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Decorators
+ scope
+ meta.annotation variable.function, meta.annotation variable.annotation.function, meta.annotation punctuation.definition.annotation, meta.decorator, punctuation.decorator
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ variable.parameter, meta.function.parameters
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+ italic
+
+
+
+ name
+ Built-ins
+ scope
+ constant.language, support.function.builtin
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ scope
+ entity.other.attribute-name.documentation
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ Preprocessor directives
+ scope
+ keyword.control.directive, punctuation.definition.directive
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Type parameters
+ scope
+ punctuation.definition.typeparameters
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ Namespaces
+ scope
+ entity.name.namespace
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Property names (left hand assignments in json/yaml/css)
+ scope
+ support.type.property-name.css
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+
+
+
+
+ name
+ This/Self keyword
+ scope
+ variable.language.this, variable.language.this punctuation.definition.variable
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ Object properties
+ scope
+ variable.object.property
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ String template interpolation
+ scope
+ string.template variable, string variable
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ `new` as bold
+ scope
+ keyword.operator.new
+ settings
+
+ fontStyle
+ bold
+
+
+
+ name
+ C++ extern keyword
+ scope
+ storage.modifier.specifier.extern.cpp
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ C++ scope resolution
+ scope
+ entity.name.scope-resolution.template.call.cpp, entity.name.scope-resolution.parameter.cpp, entity.name.scope-resolution.cpp, entity.name.scope-resolution.function.definition.cpp
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ C++ doc keywords
+ scope
+ storage.type.class.doxygen
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ C++ operators
+ scope
+ storage.modifier.reference.cpp
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ C# Interpolated Strings
+ scope
+ meta.interpolation.cs
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ C# xml-style docs
+ scope
+ comment.block.documentation.cs
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Classes, reflecting the className color in JSX
+ scope
+ source.css entity.other.attribute-name.class.css, entity.other.attribute-name.parent-selector.css punctuation.definition.entity.css
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Operators
+ scope
+ punctuation.separator.operator.css
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Pseudo classes
+ scope
+ source.css entity.other.attribute-name.pseudo-class
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ scope
+ source.css constant.other.unicode-range
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ source.css variable.parameter.url
+ settings
+
+ foreground
+ #a6e3a1
+ fontStyle
+
+
+
+
+ name
+ CSS vendored property names
+ scope
+ support.type.vendored.property-name
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ Less/SCSS right-hand variables (@/$-prefixed)
+ scope
+ source.css meta.property-value variable, source.css meta.property-value variable.other.less, source.css meta.property-value variable.other.less punctuation.definition.variable.less, meta.definition.variable.scss
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ CSS variables (--prefixed)
+ scope
+ source.css meta.property-list variable, meta.property-list variable.other.less, meta.property-list variable.other.less punctuation.definition.variable.less
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ CSS Percentage values, styled the same as numbers
+ scope
+ keyword.other.unit.percentage.css
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ CSS Attribute selectors, styled the same as strings
+ scope
+ source.css meta.attribute-selector
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ name
+ JSON/YAML keys, other left-hand assignments
+ scope
+ keyword.other.definition.ini, punctuation.support.type.property-name.json, support.type.property-name.json, punctuation.support.type.property-name.toml, support.type.property-name.toml, entity.name.tag.yaml, punctuation.support.type.property-name.yaml, support.type.property-name.yaml
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+
+
+
+
+ name
+ JSON/YAML constants
+ scope
+ constant.language.json, constant.language.yaml
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ YAML anchors
+ scope
+ entity.name.type.anchor.yaml, variable.other.alias.yaml
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+
+
+
+
+ name
+ TOML tables / ini groups
+ scope
+ support.type.property-name.table, entity.name.section.group-title.ini
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ TOML dates
+ scope
+ constant.other.time.datetime.offset.toml
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ YAML anchor puctuation
+ scope
+ punctuation.definition.anchor.yaml, punctuation.definition.alias.yaml
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ YAML triple dashes
+ scope
+ entity.other.document.begin.yaml
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Markup Diff
+ scope
+ markup.changed.diff
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Diff
+ scope
+ meta.diff.header.from-file, meta.diff.header.to-file, punctuation.definition.from-file.diff, punctuation.definition.to-file.diff
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Diff Inserted
+ scope
+ markup.inserted.diff
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ name
+ Diff Deleted
+ scope
+ markup.deleted.diff
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ dotenv left-hand side assignments
+ scope
+ variable.other.env
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ dotenv reference to existing env variable
+ scope
+ string.quoted variable.other.env
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ GDScript functions
+ scope
+ support.function.builtin.gdscript
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ GDScript constants
+ scope
+ constant.language.gdscript
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Comment keywords
+ scope
+ comment meta.annotation.go
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ go:embed, go:build, etc.
+ scope
+ comment meta.annotation.parameters.go
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Go constants (nil, true, false)
+ scope
+ constant.language.go
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ GraphQL variables
+ scope
+ variable.graphql
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ GraphQL aliases
+ scope
+ string.unquoted.alias.graphql
+ settings
+
+ foreground
+ #f2cdcd
+
+
+
+ name
+ GraphQL enum members
+ scope
+ constant.character.enum.graphql
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ GraphQL field in types
+ scope
+ meta.objectvalues.graphql constant.object.key.graphql string.unquoted.graphql
+ settings
+
+ foreground
+ #f2cdcd
+
+
+
+ name
+ HTML/XML DOCTYPE as keyword
+ scope
+ keyword.other.doctype, meta.tag.sgml.doctype punctuation.definition.tag, meta.tag.metadata.doctype entity.name.tag, meta.tag.metadata.doctype punctuation.definition.tag
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ HTML/XML-like <tags/>
+ scope
+ entity.name.tag
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+
+
+
+
+ name
+ Special characters like &
+ scope
+ text.html constant.character.entity, text.html constant.character.entity punctuation, constant.character.entity.xml, constant.character.entity.xml punctuation, constant.character.entity.js.jsx, constant.charactger.entity.js.jsx punctuation, constant.character.entity.tsx, constant.character.entity.tsx punctuation
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ HTML/XML tag attribute values
+ scope
+ entity.other.attribute-name
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Components
+ scope
+ support.class.component, support.class.component.jsx, support.class.component.tsx, support.class.component.vue
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+
+
+
+
+ name
+ Annotations
+ scope
+ punctuation.definition.annotation, storage.type.annotation
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Java enums
+ scope
+ constant.other.enum.java
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Java imports
+ scope
+ storage.modifier.import.java
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Javadoc
+ scope
+ comment.block.javadoc.java keyword.other.documentation.javadoc.java
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Exported Variable
+ scope
+ meta.export variable.other.readwrite.js
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ JS/TS constants & properties
+ scope
+ variable.other.constant.js, variable.other.constant.ts, variable.other.property.js, variable.other.property.ts
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ JSDoc; these are mainly params, so styled as such
+ scope
+ variable.other.jsdoc, comment.block.documentation variable.other
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+
+
+
+
+ name
+ JSDoc keywords
+ scope
+ storage.type.class.jsdoc
+ settings
+
+ fontStyle
+
+
+
+
+ scope
+ support.type.object.console.js
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Node constants as keywords (module, etc.)
+ scope
+ support.constant.node, support.type.object.module.js
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ implements as keyword
+ scope
+ storage.modifier.implements
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Builtin types
+ scope
+ constant.language.null.js, constant.language.null.ts, constant.language.undefined.js, constant.language.undefined.ts, support.type.builtin.ts
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ scope
+ variable.parameter.generic
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Arrow functions
+ scope
+ keyword.declaration.function.arrow.js, storage.type.function.arrow.ts
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Decorator punctuations (decorators inherit from blue functions, instead of styleguide peach)
+ scope
+ punctuation.decorator.ts
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Extra JS/TS keywords
+ scope
+ keyword.operator.expression.in.js, keyword.operator.expression.in.ts, keyword.operator.expression.infer.ts, keyword.operator.expression.instanceof.js, keyword.operator.expression.instanceof.ts, keyword.operator.expression.is, keyword.operator.expression.keyof.ts, keyword.operator.expression.of.js, keyword.operator.expression.of.ts, keyword.operator.expression.typeof.ts
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Julia macros
+ scope
+ support.function.macro.julia
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+ italic
+
+
+
+ name
+ Julia language constants (true, false)
+ scope
+ constant.language.julia
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Julia other constants (these seem to be arguments inside arrays)
+ scope
+ constant.other.symbol.julia
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ LaTeX preamble
+ scope
+ text.tex keyword.control.preamble
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ LaTeX be functions
+ scope
+ text.tex support.function.be
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ LaTeX math
+ scope
+ constant.other.general.math.tex
+ settings
+
+ foreground
+ #f2cdcd
+
+
+
+ name
+ Lua docstring keywords
+ scope
+ comment.line.double-dash.documentation.lua storage.type.annotation.lua
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+
+
+
+
+ name
+ Lua docstring variables
+ scope
+ comment.line.double-dash.documentation.lua entity.name.variable.lua, comment.line.double-dash.documentation.lua variable.lua
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ scope
+ heading.1.markdown punctuation.definition.heading.markdown, heading.1.markdown, markup.heading.atx.1.mdx, markup.heading.atx.1.mdx punctuation.definition.heading.mdx, markup.heading.setext.1.markdown, markup.heading.heading-0.asciidoc
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ scope
+ heading.2.markdown punctuation.definition.heading.markdown, heading.2.markdown, markup.heading.atx.2.mdx, markup.heading.atx.2.mdx punctuation.definition.heading.mdx, markup.heading.setext.2.markdown, markup.heading.heading-1.asciidoc
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ heading.3.markdown punctuation.definition.heading.markdown, heading.3.markdown, markup.heading.atx.3.mdx, markup.heading.atx.3.mdx punctuation.definition.heading.mdx, markup.heading.heading-2.asciidoc
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ scope
+ heading.4.markdown punctuation.definition.heading.markdown, heading.4.markdown, markup.heading.atx.4.mdx, markup.heading.atx.4.mdx punctuation.definition.heading.mdx, markup.heading.heading-3.asciidoc
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ scope
+ heading.5.markdown punctuation.definition.heading.markdown, heading.5.markdown, markup.heading.atx.5.mdx, markup.heading.atx.5.mdx punctuation.definition.heading.mdx, markup.heading.heading-4.asciidoc
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ scope
+ heading.6.markdown punctuation.definition.heading.markdown, heading.6.markdown, markup.heading.atx.6.mdx, markup.heading.atx.6.mdx punctuation.definition.heading.mdx, markup.heading.heading-5.asciidoc
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ scope
+ markup.bold
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ bold
+
+
+
+ scope
+ markup.italic
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ italic
+
+
+
+ scope
+ markup.strikethrough
+ settings
+
+ foreground
+ #a6adc8
+ fontStyle
+ strikethrough
+
+
+
+ name
+ Markdown auto links
+ scope
+ punctuation.definition.link, markup.underline.link
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Markdown links
+ scope
+ text.html.markdown punctuation.definition.link.title, string.other.link.title.markdown, markup.link, punctuation.definition.constant.markdown, constant.other.reference.link.markdown, markup.substitution.attribute-reference
+ settings
+
+ foreground
+ #b4befe
+
+
+
+ name
+ Markdown code spans
+ scope
+ punctuation.definition.raw.markdown, markup.inline.raw.string.markdown, markup.raw.block.markdown
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ name
+ Markdown triple backtick language identifier
+ scope
+ fenced_code.block.language
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ Markdown triple backticks
+ scope
+ markup.fenced_code.block punctuation.definition, markup.raw support.asciidoc
+ settings
+
+ foreground
+ #9399b2
+
+
+
+ name
+ Markdown quotes
+ scope
+ markup.quote, punctuation.definition.quote.begin
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Markdown separators
+ scope
+ meta.separator.markdown
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Markdown list bullets
+ scope
+ punctuation.definition.list.begin.markdown, markup.list.bullet
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Nix attribute names
+ scope
+ entity.other.attribute-name.multipart.nix, entity.other.attribute-name.single.nix
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Nix parameter names
+ scope
+ variable.parameter.name.nix
+ settings
+
+ foreground
+ #cdd6f4
+ fontStyle
+
+
+
+
+ name
+ Nix interpolated parameter names
+ scope
+ meta.embedded variable.parameter.name.nix
+ settings
+
+ foreground
+ #b4befe
+ fontStyle
+
+
+
+
+ name
+ Nix paths
+ scope
+ string.unquoted.path.nix
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+
+
+
+
+ name
+ PHP Attributes
+ scope
+ support.attribute.builtin, meta.attribute.php
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ PHP Parameters (needed for the leading dollar sign)
+ scope
+ meta.function.parameters.php punctuation.definition.variable.php
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ PHP Constants (null, __FILE__, etc.)
+ scope
+ constant.language.php
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ PHP functions
+ scope
+ text.html.php support.function
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ PHPdoc keywords
+ scope
+ keyword.other.phpdoc.php
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Python argument functions reset to text, otherwise they inherit blue from function-call
+ scope
+ support.variable.magic.python, meta.function-call.arguments.python
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Python double underscore functions
+ scope
+ support.function.magic.python
+ settings
+
+ foreground
+ #89dceb
+ fontStyle
+ italic
+
+
+
+ name
+ Python `self` keyword
+ scope
+ variable.parameter.function.language.special.self.python, variable.language.special.self.python
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ italic
+
+
+
+ name
+ python keyword flow/logical (for ... in)
+ scope
+ keyword.control.flow.python, keyword.operator.logical.python
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ python storage type
+ scope
+ storage.type.function.python
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ python function support
+ scope
+ support.token.decorator.python, meta.function.decorator.identifier.python
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ python function calls
+ scope
+ meta.function-call.python
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ python function decorators
+ scope
+ entity.name.function.decorator.python, punctuation.definition.decorator.python
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+ italic
+
+
+
+ name
+ python placeholder reset to normal string
+ scope
+ constant.character.format.placeholder.other.python
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Python exception & builtins such as exit()
+ scope
+ support.type.exception.python, support.function.builtin.python
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ entity.name.type
+ scope
+ support.type.python
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ python constants (True/False)
+ scope
+ constant.language.python
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Arguments accessed later in the function body
+ scope
+ meta.indexed-name.python, meta.item-access.python
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+ italic
+
+
+
+ name
+ Python f-strings/binary/unicode storage types
+ scope
+ storage.type.string.python
+ settings
+
+ foreground
+ #a6e3a1
+ fontStyle
+ italic
+
+
+
+ name
+ Python type hints
+ scope
+ meta.function.parameters.python
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Regex string begin/end in JS/TS
+ scope
+ string.regexp punctuation.definition.string.begin, string.regexp punctuation.definition.string.end
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Regex anchors (^, $)
+ scope
+ keyword.control.anchor.regexp
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Regex regular string match
+ scope
+ string.regexp.ts
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Regex group parenthesis & backreference (\1, \2, \3, ...)
+ scope
+ punctuation.definition.group.regexp, keyword.other.back-reference.regexp
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ name
+ Regex character class []
+ scope
+ punctuation.definition.character-class.regexp
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Regex character classes (\d, \w, \s)
+ scope
+ constant.other.character-class.regexp
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Regex range
+ scope
+ constant.other.character-class.range.regexp
+ settings
+
+ foreground
+ #f5e0dc
+
+
+
+ name
+ Regex quantifier
+ scope
+ keyword.operator.quantifier.regexp
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Regex constant/numeric
+ scope
+ constant.character.numeric.regexp
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Regex lookaheads, negative lookaheads, lookbehinds, negative lookbehinds
+ scope
+ punctuation.definition.group.no-capture.regexp, meta.assertion.look-ahead.regexp, meta.assertion.negative-look-ahead.regexp
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Rust attribute
+ scope
+ meta.annotation.rust, meta.annotation.rust punctuation, meta.attribute.rust, punctuation.definition.attribute.rust
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Rust attribute strings
+ scope
+ meta.attribute.rust string.quoted.double.rust, meta.attribute.rust string.quoted.single.char.rust
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Rust keyword
+ scope
+ entity.name.function.macro.rules.rust, storage.type.module.rust, storage.modifier.rust, storage.type.struct.rust, storage.type.enum.rust, storage.type.trait.rust, storage.type.union.rust, storage.type.impl.rust, storage.type.rust, storage.type.function.rust, storage.type.type.rust
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+
+
+
+
+ name
+ Rust u/i32, u/i64, etc.
+ scope
+ entity.name.type.numeric.rust
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+
+
+
+
+ name
+ Rust generic
+ scope
+ meta.generic.rust
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Rust impl
+ scope
+ entity.name.impl.rust
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Rust module
+ scope
+ entity.name.module.rust
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Rust trait
+ scope
+ entity.name.trait.rust
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Rust struct
+ scope
+ storage.type.source.rust
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Rust union
+ scope
+ entity.name.union.rust
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Rust enum member
+ scope
+ meta.enum.rust storage.type.source.rust
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Rust macro
+ scope
+ support.macro.rust, meta.macro.rust support.function.rust, entity.name.function.macro.rust
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Rust lifetime
+ scope
+ storage.modifier.lifetime.rust, entity.name.type.lifetime
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Rust string formatting
+ scope
+ string.quoted.double.rust constant.other.placeholder.rust
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Rust return type generic
+ scope
+ meta.function.return-type.rust meta.generic.rust storage.type.rust
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Rust functions
+ scope
+ meta.function.call.rust
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Rust angle brackets
+ scope
+ punctuation.brackets.angle.rust
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ Rust constants
+ scope
+ constant.other.caps.rust
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Rust function parameters
+ scope
+ meta.function.definition.rust variable.other.rust
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ Rust closure variables
+ scope
+ meta.function.call.rust variable.other.rust
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Rust self
+ scope
+ variable.language.self.rust
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ Rust metavariable names
+ scope
+ variable.other.metavariable.name.rust, meta.macro.metavariable.rust keyword.operator.macro.dollar.rust
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Shell shebang
+ scope
+ comment.line.shebang, comment.line.shebang punctuation.definition.comment, comment.line.shebang, punctuation.definition.comment.shebang.shell, meta.shebang.shell
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+ italic
+
+
+
+ name
+ Shell shebang command
+ scope
+ comment.line.shebang constant.language
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+ italic
+
+
+
+ name
+ Shell interpolated command
+ scope
+ meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation, meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ Shell interpolated command variable
+ scope
+ meta.string meta.interpolation.parameter.shell variable.other.readwrite
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+ italic
+
+
+
+ scope
+ source.shell punctuation.section.interpolation, punctuation.definition.evaluation.backticks.shell
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Shell EOF
+ scope
+ entity.name.tag.heredoc.shell
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Shell quoted variable
+ scope
+ string.quoted.double.shell variable.other.normal.shell
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ JSON Keys
+ scope
+ source.json meta.mapping.key string
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ JSON key surrounding quotes
+ scope
+ source.json meta.mapping.key punctuation.definition.string.begin, source.json meta.mapping.key punctuation.definition.string.end
+ settings
+
+ foreground
+ #9399b2
+
+
+
+ scope
+ markup.heading.synopsis.man, markup.heading.title.man, markup.heading.other.man, markup.heading.env.man
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ scope
+ markup.heading.commands.man
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ scope
+ markup.heading.env.man
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Man page options
+ scope
+ entity.name
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ scope
+ markup.heading.1.markdown
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ scope
+ markup.heading.2.markdown
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ markup.heading.markdown
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+
+
\ No newline at end of file
diff --git a/hosts/thinkpad/home-manager/yazi/default.nix b/hosts/thinkpad/home-manager/yazi/default.nix
new file mode 100644
index 0000000..8376601
--- /dev/null
+++ b/hosts/thinkpad/home-manager/yazi/default.nix
@@ -0,0 +1,327 @@
+{ lib, ... }:
+let
+ theme = import ../../theme.nix;
+ batTheme = ".config/yazi/catppuccin-${theme.flavor}.tmTheme";
+in
+{
+ home.file.${batTheme}.source = ./catppuccin-mocha.tmTheme;
+
+ programs.yazi = {
+ enable = true;
+ settings = {
+ manager = {
+ ratio = [
+ 2
+ 4
+ 2
+ ];
+ sort_by = "natural";
+ sort_sensitive = true;
+ sort_reverse = false;
+ sort_dir_first = true;
+ linemode = "none";
+ show_hidden = true;
+ show_symlink = true;
+ };
+
+ preview = {
+ image_filter = "lanczos3";
+ image_quality = 90;
+ tab_size = 1;
+ max_width = 600;
+ max_height = 900;
+ cache_dir = "";
+ ueberzug_scale = 1;
+ ueberzug_offset = [
+ 0
+ 0
+ 0
+ 0
+ ];
+ };
+
+ tasks = {
+ micro_workers = 5;
+ macro_workers = 10;
+ bizarre_retry = 5;
+ };
+ };
+ theme = lib.mkForce {
+ manager = {
+ cwd = {
+ fg = "#${theme.tealAlpha}";
+ };
+
+ hovered = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.blueAlpha}";
+ };
+ preview_hovered = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.textAlpha}";
+ };
+
+ find_keyword = {
+ fg = "#${theme.yellowAlpha}";
+ italic = true;
+ };
+ find_position = {
+ fg = "#${theme.pinkAlpha}";
+ bg = "reset";
+ italic = true;
+ };
+
+ marker_copied = {
+ fg = "#${theme.greenAlpha}";
+ bg = "#${theme.greenAlpha}";
+ };
+ marker_cut = {
+ fg = "#${theme.redAlpha}";
+ bg = "#${theme.redAlpha}";
+ };
+ marker_marked = {
+ fg = "#${theme.tealAlpha}";
+ bg = "#${theme.tealAlpha}";
+ };
+ marker_selected = {
+ fg = "#${theme.blueAlpha}";
+ bg = "#${theme.blueAlpha}";
+ };
+
+ tab_active = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.textAlpha}";
+ };
+ tab_inactive = {
+ fg = "#${theme.textAlpha}";
+ bg = "#${theme.surface1Alpha}";
+ };
+ tab_width = 1;
+
+ count_copied = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.greenAlpha}";
+ };
+ count_cut = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.redAlpha}";
+ };
+ count_selected = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.blueAlpha}";
+ };
+
+ border_symbol = "│";
+ border_style.fg = "#${theme.overlay1Alpha}";
+
+ syntect_theme = "~/${batTheme}";
+ };
+
+ mode = {
+ normal_main = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.blueAlpha}";
+ bold = true;
+ };
+ normal_alt = {
+ fg = "#${theme.blueAlpha}";
+ bg = "#${theme.surface0Alpha}";
+ };
+
+ select_main = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.greenAlpha}";
+ bold = true;
+ };
+ select_alt = {
+ fg = "#${theme.greenAlpha}";
+ bg = "#${theme.surface0Alpha}";
+ };
+
+ unset_main = {
+ fg = "#${theme.baseAlpha}";
+ bg = "#${theme.flamingoAlpha}";
+ bold = true;
+ };
+ unset_alt = {
+ fg = "#${theme.flamingoAlpha}";
+ bg = "#${theme.surface0Alpha}";
+ };
+ };
+
+ status = {
+ separator_open = "";
+ separator_close = "";
+
+ progress_label = {
+ fg = "#ffffff";
+ bold = true;
+ };
+ progress_normal = {
+ fg = "#${theme.blueAlpha}";
+ bg = "#${theme.surface1Alpha}";
+ };
+ progress_error = {
+ fg = "#${theme.redAlpha}";
+ bg = "#${theme.surface1Alpha}";
+ };
+
+ perm_type = {
+ fg = "#${theme.blueAlpha}";
+ };
+ perm_read = {
+ fg = "#${theme.yellowAlpha}";
+ };
+ perm_write = {
+ fg = "#${theme.redAlpha}";
+ };
+ perm_exec = {
+ fg = "#${theme.greenAlpha}";
+ };
+ perm_sep = {
+ fg = "#${theme.overlay1Alpha}";
+ };
+ };
+
+ input = {
+ border = {
+ fg = "#${theme.blueAlpha}";
+ };
+ title = { };
+ value = { };
+ selected.reversed = true;
+ };
+
+ pick = {
+ border = {
+ fg = "#${theme.blueAlpha}";
+ };
+ active = {
+ fg = "#${theme.pinkAlpha}";
+ };
+ inactive = { };
+ };
+
+ confirm = {
+ border = {
+ fg = "#${theme.blueAlpha}";
+ };
+ title = {
+ fg = "#${theme.blueAlpha}";
+ };
+ content = { };
+ list = { };
+ btn_yes = {
+ reversed = true;
+ };
+ btn_no = { };
+ };
+
+ completion = {
+ border = {
+ fg = "#${theme.blueAlpha}";
+ };
+ };
+ tasks = {
+ border = {
+ fg = "#${theme.blueAlpha}";
+ };
+ title = { };
+ hovered = {
+ underline = true;
+ };
+ };
+
+ which = {
+ mask = {
+ bg = "#${theme.surface0Alpha}";
+ };
+ cand = {
+ fg = "#${theme.tealAlpha}";
+ };
+ rest = {
+ fg = "#9399b2";
+ };
+ desc = {
+ fg = "#${theme.pinkAlpha}";
+ };
+ separator = " ";
+ separator_style = {
+ fg = "#${theme.surface2Alpha}";
+ };
+ };
+ help = {
+ on = {
+ fg = "#${theme.tealAlpha}";
+ };
+ run = {
+ fg = "#${theme.pinkAlpha}";
+ };
+ desc = {
+ fg = "#9399b2";
+ };
+ hovered = {
+ bg = "#${theme.surface2Alpha}";
+ bold = true;
+ };
+ footer = {
+ fg = "#${theme.textAlpha}";
+ bg = "#${theme.surface1Alpha}";
+ };
+ };
+
+ notify = {
+ title_info = {
+ fg = "#${theme.tealAlpha}";
+ };
+ title_warn = {
+ fg = "#${theme.yellowAlpha}";
+ };
+ title_error = {
+ fg = "#${theme.redAlpha}";
+ };
+ };
+ filetype = {
+ rules = [
+ # Media
+ {
+ mime = "image/*";
+ fg = "#${theme.tealAlpha}";
+ }
+ {
+ mime = "{audio;video}/*";
+ fg = "#${theme.yellowAlpha}";
+ }
+
+ # Archives
+ {
+ mime = "application/*zip";
+ fg = "#${theme.pinkAlpha}";
+ }
+ {
+ mime = "application/x-{tar;bzip*;7z-compressed;xz;rar}";
+ fg = "#${theme.pinkAlpha}";
+ }
+
+ # Documents
+ {
+ mime = "application/{pdf;doc;rtf}";
+ fg = "#${theme.greenAlpha}";
+ }
+
+ # Fallback
+ {
+ name = "*";
+ fg = "#${theme.textAlpha}";
+ }
+ {
+ name = "*/";
+ fg = "#${theme.blueAlpha}";
+ }
+ ];
+ };
+
+ icon = import ./icons.nix;
+ };
+ };
+}
diff --git a/hosts/thinkpad/home-manager/yazi/icons.nix b/hosts/thinkpad/home-manager/yazi/icons.nix
new file mode 100644
index 0000000..973cac2
--- /dev/null
+++ b/hosts/thinkpad/home-manager/yazi/icons.nix
@@ -0,0 +1,3146 @@
+{
+ files = [
+ {
+ name = "kritadisplayrc";
+ text = "";
+ fg = "#cba6f7";
+ }
+ {
+ name = ".gtkrc-2.0";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "bspwmrc";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "webpack";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "tsconfig.json";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = ".vimrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "gemfile$";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "xmobarrc";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "avif";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "fp-info-cache";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = ".zshrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "robots.txt";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "dockerfile";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".git-blame-ignore-revs";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".nvmrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "hyprpaper.conf";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = ".prettierignore";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "rakefile";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "code_of_conduct";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "cmakelists.txt";
+ text = "";
+ fg = "#cdd6f4";
+ }
+ {
+ name = ".env";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "copying.lesser";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "readme";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "settings.gradle";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "gruntfile.coffee";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".eslintignore";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "kdenliverc";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".prettierrc.cjs";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "cantorrc";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "rmd";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "vagrantfile$";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = ".Xauthority";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "prettier.config.ts";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "node_modules";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = ".prettierrc.toml";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "build.zig.zon";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".ds_store";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "PKGBUILD";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".prettierrc";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".bash_profile";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = ".npmignore";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = ".mailmap";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".codespellrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "svelte.config.js";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "eslint.config.ts";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "config";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = ".gitlab-ci.yml";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".gitconfig";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "_gvimrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = ".xinitrc";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "checkhealth";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "sxhkdrc";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = ".bashrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "tailwind.config.mjs";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "ext_typoscript_setup.txt";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "commitlint.config.ts";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = "py.typed";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = ".nanorc";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "commit_editmsg";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".luaurc";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "fp-lib-table";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = ".editorconfig";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "justfile";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "kdeglobals";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "license.md";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = ".clang-format";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "docker-compose.yaml";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "copying";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "go.mod";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "lxqt.conf";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "brewfile";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "gulpfile.coffee";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = ".dockerignore";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".settings.json";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "tailwind.config.js";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = ".clang-tidy";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = ".gvimrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "nuxt.config.cjs";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "xsettingsd.conf";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "nuxt.config.js";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "eslint.config.cjs";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "sym-lib-table";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = ".condarc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "xmonad.hs";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "tmux.conf";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "xmobarrc.hs";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = ".prettierrc.yaml";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".pre-commit-config.yaml";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "i3blocks.conf";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "xorg.conf";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".zshenv";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "vlcrc";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "license";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "unlicense";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "tmux.conf.local";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = ".SRCINFO";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "tailwind.config.ts";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "security.md";
+ text = "";
+ fg = "#bac2de";
+ }
+ {
+ name = "security";
+ text = "";
+ fg = "#bac2de";
+ }
+ {
+ name = ".eslintrc";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "gradle.properties";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "code_of_conduct.md";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "PrusaSlicerGcodeViewer.ini";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "PrusaSlicer.ini";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "procfile";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "mpv.conf";
+ text = "";
+ fg = "#1e1e2e";
+ }
+ {
+ name = ".prettierrc.json5";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "i3status.conf";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "prettier.config.mjs";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".pylintrc";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "prettier.config.cjs";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".luacheckrc";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "containerfile";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "eslint.config.mjs";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "gruntfile.js";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "bun.lockb";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = ".gitattributes";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "gruntfile.ts";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "pom.xml";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "favicon.ico";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "package-lock.json";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "build";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "package.json";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "nuxt.config.ts";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "nuxt.config.mjs";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "mix.lock";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "makefile";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "gulpfile.js";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "lxde-rc.xml";
+ text = "";
+ fg = "#9399b2";
+ }
+ {
+ name = "kritarc";
+ text = "";
+ fg = "#cba6f7";
+ }
+ {
+ name = "gtkrc";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "ionic.config.json";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".prettierrc.mjs";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".prettierrc.yml";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".npmrc";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "weston.ini";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "gulpfile.babel.js";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "i18n.config.ts";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "commitlint.config.js";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = ".gitmodules";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "gradle-wrapper.properties";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "hypridle.conf";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "vercel.json";
+ text = "▲";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "hyprlock.conf";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "go.sum";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "kdenlive-layoutsrc";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "gruntfile.babel.js";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "compose.yml";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "i18n.config.js";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "readme.md";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "gradlew";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "go.work";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "gulpfile.ts";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "gnumakefile";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "FreeCAD.conf";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "compose.yaml";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "eslint.config.js";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "hyprland.conf";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "docker-compose.yml";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "groovy";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "QtProject.conf";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "platformio.ini";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "build.gradle";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = ".nuxtrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "_vimrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = ".zprofile";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = ".xsession";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "prettier.config.js";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".babelrc";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "workspace";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = ".prettierrc.json";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".prettierrc.js";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = ".Xresources";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".gitignore";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = ".justfile";
+ text = "";
+ fg = "#7f849c";
+ }
+ ];
+ exts = [
+ {
+ name = "otf";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "import";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "krz";
+ text = "";
+ fg = "#cba6f7";
+ }
+ {
+ name = "adb";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = "ttf";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "webpack";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "dart";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "vsh";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "doc";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "zsh";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "ex";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "hx";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "fodt";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "mojo";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "templ";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "nix";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "cshtml";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "fish";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "ply";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "sldprt";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "gemspec";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "mjs";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "csh";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "cmake";
+ text = "";
+ fg = "#cdd6f4";
+ }
+ {
+ name = "fodp";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "vi";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "msf";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "blp";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "less";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "sh";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "odg";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "mint";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "dll";
+ text = "";
+ fg = "#11111b";
+ }
+ {
+ name = "odf";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "sqlite3";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "Dockerfile";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "ksh";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "rmd";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "wv";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "xml";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "markdown";
+ text = "";
+ fg = "#cdd6f4";
+ }
+ {
+ name = "qml";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "3gp";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "pxi";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "flac";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "gpr";
+ text = "";
+ fg = "#cba6f7";
+ }
+ {
+ name = "huff";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "json";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "gv";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "bmp";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "lock";
+ text = "";
+ fg = "#bac2de";
+ }
+ {
+ name = "sha384";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "cobol";
+ text = "⚙";
+ fg = "#585b70";
+ }
+ {
+ name = "cob";
+ text = "⚙";
+ fg = "#585b70";
+ }
+ {
+ name = "java";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "cjs";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "qm";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "ebuild";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "mustache";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "terminal";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "ejs";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "brep";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "rar";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "gradle";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "gnumakefile";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "applescript";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "elm";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "ebook";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "kra";
+ text = "";
+ fg = "#cba6f7";
+ }
+ {
+ name = "tf";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "xls";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "fnl";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "kdbx";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "kicad_pcb";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "cfg";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "ape";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "org";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = "yml";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "swift";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "eln";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "sol";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "awk";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "7z";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "apl";
+ text = "⍝";
+ fg = "#fab387";
+ }
+ {
+ name = "epp";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "app";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "dot";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "kpp";
+ text = "";
+ fg = "#cba6f7";
+ }
+ {
+ name = "eot";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "hpp";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "spec.tsx";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "hurl";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "cxxm";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "c";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "fcmacro";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "sass";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "yaml";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "xz";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "material";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "json5";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "signature";
+ text = "λ";
+ fg = "#fab387";
+ }
+ {
+ name = "3mf";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "jpg";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "xpi";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "fcmat";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "pot";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "bin";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "xlsx";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "aac";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "kicad_sym";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "xcstrings";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "lff";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "xcf";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "azcli";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "license";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "jsonc";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "xaml";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "md5";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "xm";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "sln";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "jl";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "ml";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "http";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "x";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "wvc";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "wrz";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "csproj";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "wrl";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "wma";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "woff2";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "woff";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "tscn";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "webmanifest";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "webm";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "fcbak";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "log";
+ text = "";
+ fg = "#cdd6f4";
+ }
+ {
+ name = "wav";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "wasm";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "styl";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "gif";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "resi";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "aiff";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "sha256";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "igs";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "vsix";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "vim";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "diff";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "drl";
+ text = "";
+ fg = "#eba0ac";
+ }
+ {
+ name = "erl";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "vhdl";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "🔥";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "hrl";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "fsi";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "mm";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "bz";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "vh";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "kdb";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "gz";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "cpp";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "ui";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "txt";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "spec.ts";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "ccm";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "typoscript";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "typ";
+ text = "";
+ fg = "#89dceb";
+ }
+ {
+ name = "txz";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "test.ts";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "tsx";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "mk";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "webp";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "opus";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "bicep";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "ts";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "tres";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "torrent";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = "cxx";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "iso";
+ text = "";
+ fg = "#f2cdcd";
+ }
+ {
+ name = "ixx";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "hxx";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "gql";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "tmux";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "ini";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "m3u8";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "image";
+ text = "";
+ fg = "#f2cdcd";
+ }
+ {
+ name = "tfvars";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "tex";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "cbl";
+ text = "⚙";
+ fg = "#585b70";
+ }
+ {
+ name = "flc";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "elc";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "test.tsx";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "twig";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "sql";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "test.jsx";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "htm";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "gcode";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "test.js";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "ino";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "tcl";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "cljs";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "tsconfig";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "img";
+ text = "";
+ fg = "#f2cdcd";
+ }
+ {
+ name = "t";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "fcstd1";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "out";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "jsx";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "bash";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "edn";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "rss";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "flf";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "cache";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "sbt";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "cppm";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "svelte";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "mo";
+ text = "∞";
+ fg = "#7f849c";
+ }
+ {
+ name = "sv";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "ko";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "suo";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "sldasm";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "icalendar";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "go";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "sublime";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "stl";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "mobi";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "graphql";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "m3u";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "cpy";
+ text = "⚙";
+ fg = "#585b70";
+ }
+ {
+ name = "kdenlive";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "pyo";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "po";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "scala";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "exs";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "odp";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "dump";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "stp";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "step";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "ste";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "aif";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "strings";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "cp";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "fsscript";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "mli";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "bak";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "ssa";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "toml";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "makefile";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "php";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "zst";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "spec.jsx";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "kbx";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "fbx";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "blend";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "ifc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "spec.js";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "so";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "desktop";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "sml";
+ text = "λ";
+ fg = "#fab387";
+ }
+ {
+ name = "slvs";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "pp";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "ps1";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "dropbox";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "kicad_mod";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "bat";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "slim";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "skp";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "css";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "xul";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "ige";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "glb";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "ppt";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "sha512";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "ics";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "mdx";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "sha1";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "f3d";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "ass";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "godot";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "ifb";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "cson";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "lib";
+ text = "";
+ fg = "#11111b";
+ }
+ {
+ name = "luac";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "heex";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "scm";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "psd1";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "sc";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "scad";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "kts";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "svh";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "mts";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "nfo";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "pck";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "rproj";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "rlib";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "cljd";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "ods";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "res";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "apk";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "haml";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "d.ts";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "razor";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "rake";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "patch";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "cuh";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "d";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "query";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "psb";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "nu";
+ text = ">";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "mov";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "lrc";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "pyx";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "pyw";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "cu";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "bazel";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "obj";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "pyi";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "pyd";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "exe";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "pyc";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "fctb";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "part";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = "blade.php";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "git";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "psd";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "qss";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "csv";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "psm1";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "dconf";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "config.ru";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "prisma";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "conf";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "clj";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "o";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "mp4";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "cc";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "kicad_prl";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "bz3";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "asc";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "png";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "android";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "pm";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "h";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "pls";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "ipynb";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "pl";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "ads";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "sqlite";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "pdf";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "pcm";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "ico";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "a";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "R";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "ogg";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "pxd";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "kdenlivetitle";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "jxl";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "nswag";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "nim";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "bqn";
+ text = "⎉";
+ fg = "#6c7086";
+ }
+ {
+ name = "cts";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "fcparam";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "rs";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "mpp";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "fdmdownload";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = "pptx";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "jpeg";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "bib";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "vhd";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "m";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "js";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "eex";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "tbc";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "astro";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "sha224";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "xcplayground";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "el";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "m4v";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "m4a";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "cs";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "hs";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "tgz";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "fs";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "luau";
+ text = "";
+ fg = "#89b4fa";
+ }
+ {
+ name = "dxf";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "download";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = "cast";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "qrc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "lua";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "lhs";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "md";
+ text = "";
+ fg = "#cdd6f4";
+ }
+ {
+ name = "leex";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "ai";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "lck";
+ text = "";
+ fg = "#bac2de";
+ }
+ {
+ name = "kt";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "bicepparam";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "hex";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "zig";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "bzl";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "cljc";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "kicad_dru";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "fctl";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "f#";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "odt";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "conda";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "vala";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "erb";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "mp3";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "bz2";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "coffee";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "cr";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "f90";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "jwmrc";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "c++";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "fcscript";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "fods";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "cue";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "srt";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "info";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "hh";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "sig";
+ text = "λ";
+ fg = "#fab387";
+ }
+ {
+ name = "html";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "iges";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "kicad_wks";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "hbs";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "fcstd";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "gresource";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "sub";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "ical";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "crdownload";
+ text = "";
+ fg = "#94e2d5";
+ }
+ {
+ name = "pub";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "vue";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "gd";
+ text = "";
+ fg = "#7f849c";
+ }
+ {
+ name = "fsx";
+ text = "";
+ fg = "#74c7ec";
+ }
+ {
+ name = "mkv";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "py";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "kicad_sch";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "epub";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "env";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "magnet";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "elf";
+ text = "";
+ fg = "#45475a";
+ }
+ {
+ name = "fodg";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "svg";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "dwg";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "docx";
+ text = "";
+ fg = "#585b70";
+ }
+ {
+ name = "pro";
+ text = "";
+ fg = "#f9e2af";
+ }
+ {
+ name = "db";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "rb";
+ text = "";
+ fg = "#313244";
+ }
+ {
+ name = "r";
+ text = "";
+ fg = "#6c7086";
+ }
+ {
+ name = "scss";
+ text = "";
+ fg = "#f38ba8";
+ }
+ {
+ name = "cow";
+ text = "";
+ fg = "#fab387";
+ }
+ {
+ name = "gleam";
+ text = "";
+ fg = "#f5c2e7";
+ }
+ {
+ name = "v";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "kicad_pro";
+ text = "";
+ fg = "#f5e0dc";
+ }
+ {
+ name = "liquid";
+ text = "";
+ fg = "#a6e3a1";
+ }
+ {
+ name = "zip";
+ text = "";
+ fg = "#fab387";
+ }
+ ];
+}
diff --git a/hosts/thinkpad/home-manager/zen/chrome/userChrome.css b/hosts/thinkpad/home-manager/zen/chrome/userChrome.css
new file mode 100644
index 0000000..b37a865
--- /dev/null
+++ b/hosts/thinkpad/home-manager/zen/chrome/userChrome.css
@@ -0,0 +1,113 @@
+/* Catppuccin Mocha Blue userChrome.css*/
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --zen-colors-primary: #313244 !important;
+ --zen-primary-color: #89b4fa !important;
+ --zen-colors-secondary: #313244 !important;
+ --zen-colors-tertiary: #181825 !important;
+ --zen-colors-border: #89b4fa !important;
+ --toolbarbutton-icon-fill: #89b4fa !important;
+ --lwt-text-color: #cdd6f4 !important;
+ --toolbar-field-color: #cdd6f4 !important;
+ --tab-selected-textcolor: rgb(171, 197, 247) !important;
+ --toolbar-field-focus-color: #cdd6f4 !important;
+ --toolbar-color: #cdd6f4 !important;
+ --newtab-text-primary-color: #cdd6f4 !important;
+ --arrowpanel-color: #cdd6f4 !important;
+ --arrowpanel-background: #1e1e2e !important;
+ --sidebar-text-color: #cdd6f4 !important;
+ --lwt-sidebar-text-color: #cdd6f4 !important;
+ --lwt-sidebar-background-color: #11111b !important;
+ --toolbar-bgcolor: #313244 !important;
+ --newtab-background-color: #1e1e2e !important;
+ --zen-themed-toolbar-bg: #181825 !important;
+ --zen-main-browser-background: #181825 !important;
+ }
+
+ #permissions-granted-icon {
+ color: #181825 !important;
+ }
+
+ .sidebar-placesTree {
+ background-color: #1e1e2e !important;
+ }
+
+ #zen-workspaces-button {
+ background-color: #1e1e2e !important;
+ }
+
+ #TabsToolbar {
+ background-color: #181825 !important;
+ }
+
+ #urlbar-background {
+ background-color: #1e1e2e !important;
+ }
+
+ .content-shortcuts {
+ background-color: #1e1e2e !important;
+ border-color: #89b4fa !important;
+ }
+
+ .urlbarView-url {
+ color: #89b4fa !important;
+ }
+
+ #zenEditBookmarkPanelFaviconContainer {
+ background: #11111b !important;
+ }
+
+ toolbar .toolbarbutton-1 {
+ &:not([disabled]) {
+ &:is([open], [checked])
+ > :is(
+ .toolbarbutton-icon,
+ .toolbarbutton-text,
+ .toolbarbutton-badge-stack
+ ) {
+ fill: #11111b;
+ }
+ }
+ }
+
+ .identity-color-blue {
+ --identity-tab-color: #89b4fa !important;
+ --identity-icon-color: #89b4fa !important;
+ }
+
+ .identity-color-turquoise {
+ --identity-tab-color: #94e2d5 !important;
+ --identity-icon-color: #94e2d5 !important;
+ }
+
+ .identity-color-green {
+ --identity-tab-color: #a6e3a1 !important;
+ --identity-icon-color: #a6e3a1 !important;
+ }
+
+ .identity-color-yellow {
+ --identity-tab-color: #f9e2af !important;
+ --identity-icon-color: #f9e2af !important;
+ }
+
+ .identity-color-orange {
+ --identity-tab-color: #fab387 !important;
+ --identity-icon-color: #fab387 !important;
+ }
+
+ .identity-color-red {
+ --identity-tab-color: #f38ba8 !important;
+ --identity-icon-color: #f38ba8 !important;
+ }
+
+ .identity-color-pink {
+ --identity-tab-color: #f5c2e7 !important;
+ --identity-icon-color: #f5c2e7 !important;
+ }
+
+ .identity-color-purple {
+ --identity-tab-color: #cba6f7 !important;
+ --identity-icon-color: #cba6f7 !important;
+ }
+}
diff --git a/hosts/thinkpad/home-manager/zen/chrome/userContent.css b/hosts/thinkpad/home-manager/zen/chrome/userContent.css
new file mode 100644
index 0000000..036655d
--- /dev/null
+++ b/hosts/thinkpad/home-manager/zen/chrome/userContent.css
@@ -0,0 +1,158 @@
+/* Catppuccin Mocha Blue userContent.css*/
+
+@media (prefers-color-scheme: dark) {
+ /* Common variables affecting all pages */
+ @-moz-document url-prefix("about:") {
+ :root {
+ --in-content-page-color: #cdd6f4 !important;
+ --color-accent-primary: #89b4fa !important;
+ --color-accent-primary-hover: rgb(163, 197, 251) !important;
+ --color-accent-primary-active: rgb(138, 153, 250) !important;
+ background-color: #1e1e2e !important;
+ --in-content-page-background: #1e1e2e !important;
+ }
+ }
+
+ /* Variables and styles specific to about:newtab and about:home */
+ @-moz-document url("about:newtab"), url("about:home") {
+ :root {
+ --newtab-background-color: #1e1e2e !important;
+ --newtab-background-color-secondary: #313244 !important;
+ --newtab-element-hover-color: #313244 !important;
+ --newtab-text-primary-color: #cdd6f4 !important;
+ --newtab-wordmark-color: #cdd6f4 !important;
+ --newtab-primary-action-background: #89b4fa !important;
+ }
+
+ .icon {
+ color: #89b4fa !important;
+ }
+
+ .search-wrapper .logo-and-wordmark .logo {
+ background:
+ url("zen-logo-mocha.svg"),
+ url("https://raw.githubusercontent.com/IAmJafeth/zen-browser/main/themes/Mocha/Blue/zen-logo-mocha.svg")
+ no-repeat center !important;
+ display: inline-block !important;
+ height: 82px !important;
+ width: 82px !important;
+ background-size: 82px !important;
+ }
+
+ @media (max-width: 609px) {
+ .search-wrapper .logo-and-wordmark .logo {
+ background-size: 64px !important;
+ height: 64px !important;
+ width: 64px !important;
+ }
+ }
+
+ .card-outer:is(:hover, :focus, .active):not(.placeholder) .card-title {
+ color: #89b4fa !important;
+ }
+
+ .top-site-outer .search-topsite {
+ background-color: #89b4fa !important;
+ }
+
+ .compact-cards .card-outer .card-context .card-context-icon.icon-download {
+ fill: #a6e3a1 !important;
+ }
+ }
+
+ /* Variables and styles specific to about:preferences */
+ @-moz-document url-prefix("about:preferences") {
+ :root {
+ --zen-colors-tertiary: #181825 !important;
+ --in-content-text-color: #cdd6f4 !important;
+ --link-color: #89b4fa !important;
+ --link-color-hover: rgb(163, 197, 251) !important;
+ --zen-colors-primary: #313244 !important;
+ --in-content-box-background: #313244 !important;
+ --zen-primary-color: #89b4fa !important;
+ }
+
+ groupbox,
+ moz-card {
+ background: #1e1e2e !important;
+ }
+
+ button,
+ groupbox menulist {
+ background: #313244 !important;
+ color: #cdd6f4 !important;
+ }
+
+ .main-content {
+ background-color: #11111b !important;
+ }
+
+ .identity-color-blue {
+ --identity-tab-color: #8aadf4 !important;
+ --identity-icon-color: #8aadf4 !important;
+ }
+
+ .identity-color-turquoise {
+ --identity-tab-color: #8bd5ca !important;
+ --identity-icon-color: #8bd5ca !important;
+ }
+
+ .identity-color-green {
+ --identity-tab-color: #a6da95 !important;
+ --identity-icon-color: #a6da95 !important;
+ }
+
+ .identity-color-yellow {
+ --identity-tab-color: #eed49f !important;
+ --identity-icon-color: #eed49f !important;
+ }
+
+ .identity-color-orange {
+ --identity-tab-color: #f5a97f !important;
+ --identity-icon-color: #f5a97f !important;
+ }
+
+ .identity-color-red {
+ --identity-tab-color: #ed8796 !important;
+ --identity-icon-color: #ed8796 !important;
+ }
+
+ .identity-color-pink {
+ --identity-tab-color: #f5bde6 !important;
+ --identity-icon-color: #f5bde6 !important;
+ }
+
+ .identity-color-purple {
+ --identity-tab-color: #c6a0f6 !important;
+ --identity-icon-color: #c6a0f6 !important;
+ }
+ }
+
+ /* Variables and styles specific to about:addons */
+ @-moz-document url-prefix("about:addons") {
+ :root {
+ --zen-dark-color-mix-base: #181825 !important;
+ --background-color-box: #1e1e2e !important;
+ }
+ }
+
+ /* Variables and styles specific to about:protections */
+ @-moz-document url-prefix("about:protections") {
+ :root {
+ --zen-primary-color: #1e1e2e !important;
+ --social-color: #cba6f7 !important;
+ --coockie-color: #89dceb !important;
+ --fingerprinter-color: #f9e2af !important;
+ --cryptominer-color: #b4befe !important;
+ --tracker-color: #a6e3a1 !important;
+ --in-content-primary-button-background-hover: rgb(81, 83, 105) !important;
+ --in-content-primary-button-text-color-hover: #cdd6f4 !important;
+ --in-content-primary-button-background: #45475a !important;
+ --in-content-primary-button-text-color: #cdd6f4 !important;
+ }
+
+ .card {
+ background-color: #313244 !important;
+ }
+ }
+}
diff --git a/hosts/thinkpad/home-manager/zen/chrome/zen-logo.svg b/hosts/thinkpad/home-manager/zen/chrome/zen-logo.svg
new file mode 100644
index 0000000..3038ff2
--- /dev/null
+++ b/hosts/thinkpad/home-manager/zen/chrome/zen-logo.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/hosts/thinkpad/home-manager/zen/default.nix b/hosts/thinkpad/home-manager/zen/default.nix
new file mode 100644
index 0000000..12c5207
--- /dev/null
+++ b/hosts/thinkpad/home-manager/zen/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, inputs, ... }:
+
+{
+ # TODO programatically get default name
+ home = {
+ file.".zen/xdaxqlov.default/chrome" = {
+ source = ./chrome;
+ recursive = true;
+ };
+ packages = with pkgs; [ inputs.zen-browser.packages.${system}.default ]; # Beta
+ };
+}
diff --git a/hosts/thinkpad/modules/battery.nix b/hosts/thinkpad/modules/battery.nix
new file mode 100644
index 0000000..0dbad90
--- /dev/null
+++ b/hosts/thinkpad/modules/battery.nix
@@ -0,0 +1,6 @@
+{
+ services = {
+ upower.enable = true;
+ power-profiles-daemon.enable = true;
+ };
+}
diff --git a/hosts/thinkpad/modules/bluetooth.nix b/hosts/thinkpad/modules/bluetooth.nix
new file mode 100644
index 0000000..a11b59f
--- /dev/null
+++ b/hosts/thinkpad/modules/bluetooth.nix
@@ -0,0 +1,14 @@
+{ pkgs, ... }:
+
+{
+ environment.systemPackages = [
+ pkgs.bluez
+ ];
+
+ hardware.bluetooth = {
+ enable = true;
+ powerOnBoot = true; # powers up the default Bluetooth controller on boot
+ };
+
+ services.blueman.enable = true;
+}
diff --git a/hosts/thinkpad/modules/default.nix b/hosts/thinkpad/modules/default.nix
new file mode 100644
index 0000000..de7f5de
--- /dev/null
+++ b/hosts/thinkpad/modules/default.nix
@@ -0,0 +1,19 @@
+{
+ imports = [
+ ./battery.nix
+ ./bluetooth.nix
+ ./development.nix
+ ./fonts.nix
+ ./gaming
+ ./gnome
+ ./hardware
+ ./locale.nix
+ ./networking.nix
+ ./nix-helper.nix
+ ./hyprland
+ ./sddm.nix
+ ./security.nix
+ ./shell.nix
+ ./qt.nix
+ ];
+}
diff --git a/hosts/thinkpad/modules/development.nix b/hosts/thinkpad/modules/development.nix
new file mode 100644
index 0000000..d0cde6b
--- /dev/null
+++ b/hosts/thinkpad/modules/development.nix
@@ -0,0 +1,41 @@
+{ pkgs, ... }:
+
+{
+ environment.systemPackages = with pkgs; [
+ # IDEs
+ jetbrains.rust-rover
+ jetbrains.webstorm
+ jetbrains.rider
+ vscodium # TODO set up extensions
+ # Tools
+ dotnet-sdk_9
+ dotnet-aspnetcore_9
+ git
+ rustup
+ nodejs_22
+ pnpm
+ just
+ gcc # Required for C, Rust and others
+ # Language servers
+ nixd
+ nil
+ # Formatters
+ nixfmt-rfc-style
+ treefmt
+ nodePackages.prettier
+ shfmt
+ ];
+
+ virtualisation.docker = {
+ enable = true;
+ storageDriver = "btrfs";
+ rootless = {
+ enable = true;
+ setSocketVariable = true;
+ };
+ };
+
+ services.ollama = {
+ enable = true;
+ };
+}
diff --git a/hosts/thinkpad/modules/fonts.nix b/hosts/thinkpad/modules/fonts.nix
new file mode 100644
index 0000000..c201c85
--- /dev/null
+++ b/hosts/thinkpad/modules/fonts.nix
@@ -0,0 +1,23 @@
+{ pkgs, ... }:
+
+{
+ environment.systemPackages = with pkgs; [
+ font-awesome # Icons
+ ];
+
+ fonts =
+ let
+ theme = import ../theme.nix;
+ in
+ {
+ fontconfig.enable = true;
+ packages = with pkgs; [
+ (nerdfonts.override { fonts = [ theme.nerdFont ]; })
+ jetbrains-mono
+ # The line below will replace the lines above in 25.05
+ # nerd-fonts.jetbrains-mono
+ font-awesome
+ ];
+ };
+
+}
diff --git a/hosts/thinkpad/modules/gaming/default.nix b/hosts/thinkpad/modules/gaming/default.nix
new file mode 100644
index 0000000..79f3794
--- /dev/null
+++ b/hosts/thinkpad/modules/gaming/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+{
+ imports = [
+ ./steam.nix
+ ];
+
+ environment.systemPackages = with pkgs; [
+ heroic
+ wine
+ ];
+}
diff --git a/hosts/thinkpad/modules/gaming/steam.nix b/hosts/thinkpad/modules/gaming/steam.nix
new file mode 100644
index 0000000..65035f8
--- /dev/null
+++ b/hosts/thinkpad/modules/gaming/steam.nix
@@ -0,0 +1,8 @@
+{
+ programs.steam = {
+ enable = true;
+ remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
+ dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
+ localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers
+ };
+}
diff --git a/hosts/thinkpad/modules/gnome/default.nix b/hosts/thinkpad/modules/gnome/default.nix
new file mode 100644
index 0000000..0a39f32
--- /dev/null
+++ b/hosts/thinkpad/modules/gnome/default.nix
@@ -0,0 +1,28 @@
+{ pkgs, ... }:
+
+{
+ imports = [
+ ./nautilus.nix
+ ];
+
+ environment.systemPackages = with pkgs; [
+ # adw-gtk3
+ glib
+ adwaita-icon-theme
+ gnomeExtensions.appindicator
+ # gnome-extension-manager
+ loupe
+ gnome-calculator
+ gnome-disk-utility
+ gnome-clocks
+ papers # PDFReader
+ ];
+
+ programs.dconf.enable = true; # Required for some gnome applications
+
+ services = {
+ gnome.gnome-keyring.enable = true;
+ gvfs.enable = true; # Gnome Virtual File-system. Required for various things in nautilus
+ udev.packages = with pkgs; [ gnome-settings-daemon ];
+ };
+}
diff --git a/hosts/thinkpad/modules/gnome/nautilus.nix b/hosts/thinkpad/modules/gnome/nautilus.nix
new file mode 100644
index 0000000..523bb95
--- /dev/null
+++ b/hosts/thinkpad/modules/gnome/nautilus.nix
@@ -0,0 +1,15 @@
+{ pkgs, ... }:
+let
+ common = import ../../common.nix;
+in
+{
+ environment.systemPackages = with pkgs; [
+ nautilus
+ ffmpegthumbnailer # Thumbnails
+ ];
+
+ programs.nautilus-open-any-terminal = {
+ enable = true;
+ terminal = common.default.terminal;
+ };
+}
diff --git a/hosts/thinkpad/modules/hardware/audio.nix b/hosts/thinkpad/modules/hardware/audio.nix
new file mode 100644
index 0000000..2b3429e
--- /dev/null
+++ b/hosts/thinkpad/modules/hardware/audio.nix
@@ -0,0 +1,33 @@
+{ pkgs, ... }:
+
+{
+ environment.systemPackages = with pkgs; [
+ gst_all_1.gstreamer
+ gst_all_1.gst-plugins-base
+ gst_all_1.gst-plugins-good
+ gst_all_1.gst-plugins-bad
+
+ wireplumber
+ playerctl # Interaction with audioplayers and browsers
+ pavucontrol # GUI
+ spotify
+ ];
+
+ hardware.pulseaudio.enable = false; # Will be moved to services in 25.05
+
+ security.rtkit.enable = true; # Enable RealtimeKit for audio purposes
+
+ services = {
+ pipewire = {
+ enable = true;
+ alsa = {
+ enable = true;
+ support32Bit = true;
+ };
+ pulse.enable = true;
+ # Uncomment the following line if you want to use JACK applications
+ # jack.enable = true;
+ };
+ # pulseaudio.enable = false; # TODO uncommenct at 25.05
+ };
+}
diff --git a/hosts/thinkpad/modules/hardware/default.nix b/hosts/thinkpad/modules/hardware/default.nix
new file mode 100644
index 0000000..ffd2b30
--- /dev/null
+++ b/hosts/thinkpad/modules/hardware/default.nix
@@ -0,0 +1,8 @@
+{
+ imports = [
+ ./audio.nix
+ ./graphics
+ ./hardware-configuration.nix
+ ./keyboard.nix
+ ];
+}
diff --git a/hosts/thinkpad/modules/hardware/graphics/default.nix b/hosts/thinkpad/modules/hardware/graphics/default.nix
new file mode 100644
index 0000000..eaade71
--- /dev/null
+++ b/hosts/thinkpad/modules/hardware/graphics/default.nix
@@ -0,0 +1,6 @@
+{
+ imports = [ ];
+
+ # Enable OpenGL
+ hardware.graphics.enable = true;
+}
diff --git a/hosts/thinkpad/modules/hardware/hardware-configuration.nix b/hosts/thinkpad/modules/hardware/hardware-configuration.nix
new file mode 100644
index 0000000..a46c293
--- /dev/null
+++ b/hosts/thinkpad/modules/hardware/hardware-configuration.nix
@@ -0,0 +1,57 @@
+# Do not modify this file! It was generated by ‘nixos-generate-config’
+# and may be overwritten by future invocations. Please make changes
+# to /etc/nixos/configuration.nix instead.
+{
+ config,
+ lib,
+ pkgs,
+ modulesPath,
+ ...
+}:
+
+{
+ imports = [
+ (modulesPath + "/installer/scan/not-detected.nix")
+ ];
+
+ boot.initrd.availableKernelModules = [
+ "nvme"
+ "xhci_pci"
+ "usb_storage"
+ "sd_mod"
+ "sdhci_pci"
+ ];
+ boot.initrd.kernelModules = [ ];
+ boot.kernelModules = [ "kvm-amd" ];
+ boot.extraModulePackages = [ ];
+
+ fileSystems."/" = {
+ device = "/dev/disk/by-uuid/5ac9c425-35ae-47d5-a683-68ee0dbfc2bc";
+ fsType = "ext4";
+ };
+
+ boot.initrd.luks.devices."luks-99b73f22-3fa1-42b5-ad48-54b0ccff72cc".device =
+ "/dev/disk/by-uuid/99b73f22-3fa1-42b5-ad48-54b0ccff72cc";
+
+ fileSystems."/boot" = {
+ device = "/dev/disk/by-uuid/3CFB-D12A";
+ fsType = "vfat";
+ options = [
+ "fmask=0077"
+ "dmask=0077"
+ ];
+ };
+
+ swapDevices = [ ];
+
+ # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
+ # (the default) this is the recommended approach. When using systemd-networkd it's
+ # still possible to use this option, but it's recommended to use it in conjunction
+ # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
+ networking.useDHCP = lib.mkDefault true;
+ # networking.interfaces.enp2s0f0.useDHCP = lib.mkDefault true;
+ # networking.interfaces.wlp3s0.useDHCP = lib.mkDefault true;
+
+ nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+ hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+}
diff --git a/hosts/thinkpad/modules/hardware/keyboard.nix b/hosts/thinkpad/modules/hardware/keyboard.nix
new file mode 100644
index 0000000..8840a94
--- /dev/null
+++ b/hosts/thinkpad/modules/hardware/keyboard.nix
@@ -0,0 +1,11 @@
+{ pkgs, ... }:
+
+{
+ environment.systemPackages = with pkgs; [
+ via
+ ];
+
+ hardware.keyboard.qmk.enable = true;
+
+ services.udev.packages = with pkgs; [ via ];
+}
diff --git a/hosts/thinkpad/modules/hyprland/default.nix b/hosts/thinkpad/modules/hyprland/default.nix
new file mode 100644
index 0000000..9e7c4a7
--- /dev/null
+++ b/hosts/thinkpad/modules/hyprland/default.nix
@@ -0,0 +1,25 @@
+# System configurations for Hyprland. For home configs, see ./home-manager/hyprland
+{ pkgs, ... }:
+
+{
+ environment.systemPackages = with pkgs; [
+ xdg-desktop-portal-hyprland
+ hyprpolkitagent # Auth deamon providing modals for password auth
+ hyprshot # Screenshots
+ hyprsunset # Blue light filter
+ unstable.hyprsysteminfo
+ unstable.hyprland-qtutils
+ unstable.hyprland-qt-support
+ ];
+
+ programs = {
+ hyprland = {
+ enable = true;
+ xwayland.enable = true;
+ withUWSM = true;
+ };
+ hyprlock.enable = true; # Lock screen
+ };
+
+ services.hypridle.enable = true; # Lock when unused
+}
diff --git a/hosts/thinkpad/modules/locale.nix b/hosts/thinkpad/modules/locale.nix
new file mode 100644
index 0000000..08677ca
--- /dev/null
+++ b/hosts/thinkpad/modules/locale.nix
@@ -0,0 +1,37 @@
+# TODO move locale config for hyprland here
+let
+ utf-8 = "UTF-8";
+ en = "en_GB.${utf-8}";
+ nb = "nb_NO.${utf-8}";
+ common = import ../common.nix;
+in
+{
+ # Configure console keymap
+ console.keyMap = "uk";
+
+ # Select internationalisation properties.
+ i18n = {
+ defaultLocale = en;
+ supportedLocales = [
+ "${en}/${utf-8}"
+ "${nb}/${utf-8}"
+ ];
+ extraLocaleSettings = {
+ LC_ADDRESS = nb;
+ LC_IDENTIFICATION = nb;
+ LC_MEASUREMENT = nb;
+ LC_MONETARY = nb;
+ LC_NAME = nb;
+ LC_NUMERIC = nb;
+ LC_PAPER = nb;
+ LC_TELEPHONE = nb;
+ LC_TIME = nb;
+ };
+ };
+
+ # Configure keymaps
+ services.xserver.xkb = common.keymaps;
+
+ # Set your time zone.
+ time.timeZone = "Europe/Oslo";
+}
diff --git a/hosts/thinkpad/modules/networking.nix b/hosts/thinkpad/modules/networking.nix
new file mode 100644
index 0000000..23db0c6
--- /dev/null
+++ b/hosts/thinkpad/modules/networking.nix
@@ -0,0 +1,23 @@
+let
+ common = import ../common.nix;
+in
+{
+ networking = {
+ networkmanager.enable = true;
+ hostName = common.hostname;
+ # wireless.enable = true; # Enables wireless support via wpa_supplicant.
+ };
+
+ # Configure network proxy if necessary
+ # networking.proxy.default = "http://user:password@proxy:port/";
+ # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
+ # Open ports in the firewall.
+ # networking.firewall.allowedTCPPorts = [ ... ];
+ # networking.firewall.allowedUDPPorts = [ ... ];
+ # Or disable the firewall altogether.
+ # networking.firewall.enable = false;
+
+ programs.ssh.enableAskPassword = false;
+
+ services.tailscale.enable = true;
+}
diff --git a/hosts/thinkpad/modules/nix-helper.nix b/hosts/thinkpad/modules/nix-helper.nix
new file mode 100644
index 0000000..f60cc0e
--- /dev/null
+++ b/hosts/thinkpad/modules/nix-helper.nix
@@ -0,0 +1,12 @@
+# Nix-Helper: github.com/viperML/nh
+{
+ programs.nh = {
+ enable = true;
+ flake = ../.;
+ clean = {
+ enable = true;
+ dates = "weekly";
+ extraArgs = "--keep-since 30d";
+ };
+ };
+}
diff --git a/hosts/thinkpad/modules/qt.nix b/hosts/thinkpad/modules/qt.nix
new file mode 100644
index 0000000..789cb01
--- /dev/null
+++ b/hosts/thinkpad/modules/qt.nix
@@ -0,0 +1,17 @@
+{ pkgs, ... }:
+
+{
+ environment = {
+ sessionVariables = {
+ QT_QPA_PLATFORMTHEME = "qt6ct";
+ QT_QPA_PLATFORM = "wayland"; # Enable Wayland for QT
+ };
+ systemPackages = with pkgs.kdePackages; [
+ qtwayland
+ qtsvg
+ qt6ct
+ ];
+ };
+
+ qt.enable = true;
+}
diff --git a/hosts/thinkpad/modules/sddm.nix b/hosts/thinkpad/modules/sddm.nix
new file mode 100644
index 0000000..ea1ef65
--- /dev/null
+++ b/hosts/thinkpad/modules/sddm.nix
@@ -0,0 +1,23 @@
+{ pkgs, ... }:
+let
+ theme = import ../theme.nix;
+ flavor = theme.flavor;
+in
+{
+ environment.systemPackages = with pkgs; [
+ (catppuccin-sddm.override {
+ flavor = flavor;
+ font = theme.nerdFont;
+ fontSize = "9";
+ background = "${../wallpapers/catppuccin_high.png}";
+ loginBackground = true;
+ })
+ ];
+
+ services.displayManager.sddm = {
+ enable = true;
+ theme = "catppuccin-${flavor}";
+ wayland.enable = true;
+ package = pkgs.kdePackages.sddm;
+ };
+}
diff --git a/hosts/thinkpad/modules/security.nix b/hosts/thinkpad/modules/security.nix
new file mode 100644
index 0000000..ea466d7
--- /dev/null
+++ b/hosts/thinkpad/modules/security.nix
@@ -0,0 +1,68 @@
+{ pkgs, ... }:
+
+{
+ environment.systemPackages = with pkgs; [
+ gnupg
+ yubioath-flutter
+ ];
+
+ programs.gnupg.agent.enable = true;
+
+ security = {
+ pam = {
+ services = {
+ gdm-fingerprint.text = ''
+ auth required pam_shells.so
+ auth requisite pam_nologin.so
+ auth requisite pam_faillock.so preauth
+ auth required ${pkgs.fprintd}/lib/security/pam_fprintd.so
+ auth optional pam_permit.so
+ auth required pam_env.so
+ auth [success=ok default=1] ${pkgs.gdm}/lib/security/pam_gdm.so
+ auth optional ${pkgs.gnome-keyring}/lib/security/pam_gnome_keyring.so
+
+ account include login
+
+ password required pam_deny.so
+
+ session include login
+ session optional ${pkgs.gnome-keyring}/lib/security/pam_gnome_keyring.so auto_start
+ '';
+ login = {
+ fprintAuth = false;
+ u2fAuth = false; # U2F and password
+ };
+ sudo.u2fAuth = true; # U2F or password
+ };
+ u2f = {
+ enable = true;
+ settings = {
+ cue = true; # Prompt: Please touch the device
+ interactive = false; # Prompt: Insert your U2F device, then press ENTER.
+ };
+ };
+ };
+ };
+
+ # Start the driver at boot
+ systemd.services.fprintd = {
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig.Type = "simple";
+ };
+
+ # Install the driver
+ services.fprintd = {
+ enable = true;
+ tod.driver = pkgs.libfprint-2-tod1-goodix-550a; # Goodix 550a driver (from Lenovo)
+ };
+
+ # however for focaltech 2808:a658, use fprintd with overidden package (without tod)
+ # services.fprintd.package = pkgs.fprintd.override {
+ # libfprint = pkgs.libfprint-focaltech-2808-a658;
+ # };
+
+ services = {
+ pcscd.enable = true; # Required for Yubikey
+ udev.packages = with pkgs; [ yubikey-personalization ];
+ };
+}
diff --git a/hosts/thinkpad/modules/shell.nix b/hosts/thinkpad/modules/shell.nix
new file mode 100644
index 0000000..84b5931
--- /dev/null
+++ b/hosts/thinkpad/modules/shell.nix
@@ -0,0 +1,19 @@
+# For Fish dotfiles, see: /home-manager/fish.nix
+{ pkgs, ... }:
+
+{
+ programs = {
+ bash = {
+ # Starts the OS using Bash, then starts fish if it's not running
+ interactiveShellInit = ''
+ if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
+ then
+ shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
+ exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
+ fi
+ '';
+ };
+
+ fish.enable = true;
+ };
+}