Commit 63055c8

HPCesia <me@hpcesia.com>
2025-10-13 18:05:04
feat: use stylix
Remove catppuccin module, and all configurations Stylix covered.
1 parent af7313d
modules/core/shell/starship/starship.toml
@@ -5,9 +5,9 @@ format = """
 $os\
 $username\
 $hostname\
-[](bg:peach fg:red)\
+[](bg:orange fg:red)\
 $directory\
-[](bg:yellow fg:peach)\
+[](bg:yellow fg:orange)\
 $git_branch\
 $git_status\
 [](fg:yellow bg:green)\
@@ -20,18 +20,18 @@ $java\
 $kotlin\
 $haskell\
 $python\
-[](fg:green bg:sapphire)\
+[](fg:green bg:bright-blue)\
 $conda\
-[](fg:sapphire bg:lavender)\
+[](fg:bright-blue bg:bright-white)\
 $time\
-[ ](fg:lavender)\
+[ ](fg:bright-white)\
 $cmd_duration\
 $line_break\
 $character"""
 
 [os]
 disabled = false
-style    = "bg:red fg:crust"
+style    = "bg:red fg:black"
 
 [os.symbols]
 Alpine           = " "
@@ -58,8 +58,8 @@ Windows          = " "
 
 [username]
 show_always = true
-style_user  = "bg:red fg:crust"
-style_root  = "bg:red fg:crust"
+style_user  = "bg:red fg:black"
+style_root  = "bg:red fg:black"
 format      = '[$user ]($style)'
 
 [hostname]
@@ -68,7 +68,7 @@ ssh_symbol = '@'
 format     = '[$ssh_symbol$hostname]($style)'
 
 [directory]
-style                     = "bg:peach fg:crust"
+style                     = "bg:orange fg:black"
 format                    = "[ $path ]($style)"
 truncation_length         = 3
 truncate_to_repo          = true
@@ -78,73 +78,73 @@ fish_style_pwd_dir_length = 1
 [git_branch]
 symbol = ""
 style  = "bg:yellow"
-format = '[[ $symbol $branch ](fg:crust bg:yellow)]($style)'
+format = '[[ $symbol $branch ](fg:black bg:yellow)]($style)'
 
 [git_status]
 style  = "bg:yellow"
-format = '[[($all_status$ahead_behind )](fg:crust bg:yellow)]($style)'
+format = '[[($all_status$ahead_behind )](fg:black bg:yellow)]($style)'
 
 [nodejs]
 symbol = ""
 style  = "bg:green"
-format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version) ](fg:black bg:green)]($style)'
 
 [c]
 symbol = " "
 style  = "bg:green"
-format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version) ](fg:black bg:green)]($style)'
 
 [rust]
 symbol = ""
 style  = "bg:green"
-format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version) ](fg:black bg:green)]($style)'
 
 [golang]
 symbol = ""
 style  = "bg:green"
-format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version) ](fg:black bg:green)]($style)'
 
 [php]
 symbol = ""
 style  = "bg:green"
-format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version) ](fg:black bg:green)]($style)'
 
 [java]
 symbol = " "
 style  = "bg:green"
-format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version) ](fg:black bg:green)]($style)'
 
 [kotlin]
 symbol = ""
 style  = "bg:green"
-format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version) ](fg:black bg:green)]($style)'
 
 [haskell]
 symbol = ""
 style  = "bg:green"
-format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version) ](fg:black bg:green)]($style)'
 
 [python]
 symbol = ""
 style  = "bg:green"
-format = '[[ $symbol( $version)(\(#$virtualenv\)) ](fg:crust bg:green)]($style)'
+format = '[[ $symbol( $version)(\(#$virtualenv\)) ](fg:black bg:green)]($style)'
 
 [docker_context]
 symbol = ""
-style  = "bg:sapphire"
-format = '[[ $symbol( $context) ](fg:crust bg:sapphire)]($style)'
+style  = "bg:bright-blue"
+format = '[[ $symbol( $context) ](fg:black bg:bright-blue)]($style)'
 
 [conda]
 symbol      = ""
-style       = "fg:crust bg:sapphire"
+style       = "fg:black bg:bright-blue"
 format      = '[$symbol$environment ]($style)'
 ignore_base = false
 
 [time]
 disabled    = false
 time_format = "%R"
-style       = "bg:lavender"
-format      = '[[  $time ](fg:crust bg:lavender)]($style)'
+style       = "bg:bright-white"
+format      = '[[  $time ](fg:black bg:bright-white)]($style)'
 
 [line_break]
 disabled = false
@@ -154,8 +154,8 @@ disabled                  = false
 success_symbol            = '[❯](bold fg:green)'
 error_symbol              = '[❯](bold fg:red)'
 vimcmd_symbol             = '[❮](bold fg:green)'
-vimcmd_replace_one_symbol = '[❮](bold fg:lavender)'
-vimcmd_replace_symbol     = '[❮](bold fg:lavender)'
+vimcmd_replace_one_symbol = '[❮](bold fg:bright-white)'
+vimcmd_replace_symbol     = '[❮](bold fg:bright-white)'
 vimcmd_visual_symbol      = '[❮](bold fg:yellow)'
 
 [cmd_duration]
modules/core/shell/fish.nix
@@ -1,5 +1,7 @@
 {inputs, ...}: {
   flake.modules.nixos.core = _: {
+    stylix.targets.fish.enable = false;
+
     programs.fish.enable = true;
   };
 
modules/core/stylix.nix
@@ -0,0 +1,58 @@
+{
+  inputs,
+  lib,
+  ...
+}: {
+  flake.modules.nixos.core = {
+    pkgs,
+    config,
+    ...
+  }: let
+    base16-schemes = pkgs.base16-schemes;
+    base24-schemes = base16-schemes.overrideAttrs {
+      installPhase = ''
+        runHook preInstall
+
+        mkdir -p $out/share/themes/
+        install base24/*.yaml $out/share/themes/
+
+        runHook postInstall
+      '';
+    };
+  in {
+    imports = [inputs.stylix.nixosModules.stylix];
+
+    stylix = let
+      schemeName = "catppuccin-mocha";
+      theme = "${base24-schemes}/share/themes/${schemeName}.yaml";
+
+      inputImage = "${inputs.wallpapers}/Nahida-2.png";
+      brightness =
+        if config.lib.stylix.colors.variant == "dark"
+        then "-20"
+        else "0";
+      contrast =
+        if config.lib.stylix.colors.variant == "dark"
+        then "10"
+        else "0";
+      fillColor =
+        if config.lib.stylix.colors.variant == "dark"
+        then "black"
+        else "white";
+    in {
+      enable = true;
+      base16Scheme = theme;
+      image = pkgs.runCommand "dimmed-background.png" {} ''
+        ${lib.getExe' pkgs.imagemagick "convert"} "${inputImage}" -brightness-contrast ${brightness},${contrast} -fill ${fillColor} $out
+      '';
+      opacity = {
+        applications = 0.975; # Slightly less than 1.0 for accessibility reasons.
+        desktop = 0.9;
+        popups = 0.9;
+        # In Plasma, I don't want transparency.
+        # In Niri, I set it on server-side instead beacuse server-side opacity is better.
+        terminal = 1.0;
+      };
+    };
+  };
+}
modules/desktop/apps/browser/firefox.nix
@@ -9,20 +9,19 @@
       && osConfig.services.desktopManager.plasma6.enable;
     isNiri = osConfig.programs.niri.enable;
   in {
-    catppuccin.firefox.profiles.default.enable = false;
+    stylix.targets.firefox = {
+      profileNames = ["default"];
+      colorTheme.enable = true;
+    };
 
     home.packages = lib.optionals isNiri [pkgs.pywalfox-native];
 
     programs.firefox = {
       enable = true;
       languagePacks = ["zh-CN" "en-US"];
-      nativeMessagingHosts =
-        (lib.optionals isPlasma [
-          pkgs.kdePackages.plasma-browser-integration
-        ])
-        ++ (lib.optionals isNiri [
-          pkgs.pywalfox-native
-        ]);
+      nativeMessagingHosts = lib.optionals isPlasma [
+        pkgs.kdePackages.plasma-browser-integration
+      ];
 
       policies = {
         DisableAppUpdate = true;
@@ -51,6 +50,7 @@
             baidu.metaData.hidden = true;
           };
         };
+        extensions.force = true;
         extensions.packages =
           (with pkgs.nur.repos.rycee.firefox-addons; [
             ublock-origin
@@ -62,14 +62,6 @@
           ++ (lib.optionals isPlasma
             (with pkgs.nur.repos.rycee.firefox-addons; [
               plasma-integration
-            ]))
-          ++ (lib.optionals isNiri
-            (with pkgs.nur.repos.rycee.firefox-addons; [
-              pywalfox
-            ]))
-          ++ (lib.optionals (!isNiri)
-            (with pkgs.nur.repos.rycee.firefox-addons; [
-              firefox-color
             ]));
         settings = {
           # No First Run
modules/desktop/apps/terminal/ghostty/default.nix
@@ -14,7 +14,6 @@
         window-new-tab-position = "current";
         window-decoration = lib.mkIf osConfig.programs.niri.enable "none";
         copy-on-select = false;
-        font-family = "Maple Mono CN";
       };
     };
   };
modules/desktop/apps/terminal/wezterm/default.nix
@@ -4,6 +4,6 @@
       enable = true;
     };
     xdg.configFile."wezterm".source = ./config;
-    catppuccin.wezterm.enable = false;
+    stylix.targets.wezterm.enable = false;
   };
 }
modules/desktop/apps/thunderbird/default.nix
@@ -16,7 +16,5 @@
         };
       };
     };
-
-    catppuccin.thunderbird.profile = "Default";
   };
 }
modules/desktop/apps/btop.nix
@@ -1,6 +1,6 @@
 {
   flake.modules.homeManager.desktop = _: {
-    # Enable btop in home-manager to auto apply catppuccin theme
+    # Enable btop in home-manager to auto apply stylix's theme
     # Btop is also a system package in modules/core/tools/packages.nix
     programs.btop = {
       enable = true;
modules/desktop/fonts/default.nix
@@ -1,40 +0,0 @@
-{
-  flake.modules.nixos.desktop = {pkgs, ...}: {
-    fonts = {
-      enableDefaultPackages = false;
-      fontDir.enable = true;
-
-      packages = with pkgs; [
-        nur.repos.rewine.ttf-ms-win10
-
-        noto-fonts
-        noto-fonts-emoji
-
-        source-sans
-        source-serif
-        source-han-sans
-        source-han-serif
-
-        lxgw-wenkai
-        smiley-sans
-
-        nerd-fonts.symbols-only
-        jetbrains-mono
-        maple-mono.CN
-      ];
-
-      fontconfig.defaultFonts = {
-        serif = ["Source Han Serif SC" "Source Han Serif TC" "Noto Color Emoji"];
-        sansSerif = ["Source Han Sans SC" "Source Han Sans TC" "Noto Color Emoji"];
-        monospace = ["JetBrains Mono" "Maple Mono CN" "Noto Color Emoji" "Symbols Nerd Font"];
-        emoji = ["Noto Color Emoji"];
-      };
-    };
-  };
-
-  flake.modules.homeManager.desktop = _: {
-    # Allow fontconfig to discover fonts and configurations installed through home.packages
-    # Needed if using niri-flake.
-    fonts.fontconfig.enable = true;
-  };
-}
modules/desktop/fonts/plasma.nix
@@ -1,33 +0,0 @@
-{lib, ...}: {
-  flake.modules.homeManager.desktop = {osConfig, ...}: let
-    hasPlasma = osConfig.services.desktopManager.plasma6.enable;
-  in
-    lib.optionalAttrs hasPlasma {
-      programs.plasma.fonts = {
-        general = {
-          family = "Source Han Sans SC";
-          pointSize = 12;
-        };
-        fixedWidth = {
-          family = "Maple Mono CN";
-          pointSize = 12;
-        };
-        menu = {
-          family = "Source Han Sans SC";
-          pointSize = 12;
-        };
-        small = {
-          family = "Source Han Sans SC";
-          pointSize = 10;
-        };
-        toolbar = {
-          family = "Source Han Sans SC";
-          pointSize = 12;
-        };
-        windowTitle = {
-          family = "Source Han Sans SC";
-          pointSize = 12;
-        };
-      };
-    };
-}
modules/desktop/input-method/fcitx5/default.nix
@@ -4,15 +4,6 @@
       rimeDataPkgs = [pkgs.nur.repos.xyenon.rime-ice];
     };
   in {
-    xdg.configFile = lib.mkIf pkgs.stdenv.hostPlatform.isLinux {
-      "fcitx5/profile" = {
-        source = ./profile;
-        # every time fcitx5 switch input method, it will modify ~/.config/fcitx5/profile,
-        # so we need to force replace it in every rebuild to avoid file conflict.
-        force = true;
-      };
-    };
-
     i18n.inputMethod = lib.mkIf pkgs.stdenv.hostPlatform.isLinux {
       enable = true;
       type = "fcitx5";
@@ -24,6 +15,20 @@
           fcitx5-gtk # gtk im module
         ];
         waylandFrontend = true;
+        settings = {
+          inputMethod = {
+            GroupOrder."0" = "Default";
+            "Groups/0" = {
+              Name = "Default";
+              "Default Layout" = "us";
+              DefaultIM = "rime";
+            };
+            "Groups/0/Items/0" = {
+              IM = "rime";
+              Layout = "us";
+            };
+          };
+        };
       };
     };
   };
modules/desktop/input-method/fcitx5/profile
@@ -1,17 +0,0 @@
-[Groups/0]
-# Group Name
-Name=Other
-# Layout
-Default Layout=us
-# Default Input Method
-DefaultIM=rime
-
-[Groups/0/Items/0]
-# Name
-Name=rime
-# Layout
-Layout=
-
-[GroupOrder]
-0=Other
-
modules/desktop/shell/niri/appearance/layout.nix
@@ -1,13 +1,14 @@
 {
-  flake.modules.homeManager.niri = _: let
+  flake.modules.homeManager.niri = {config, ...}: let
   in {
     programs.niri.settings.layout = {
       gaps = 10;
       focus-ring = {
         enable = true;
         width = 2;
-        active.color = "#8bd5ca"; # Catppuccin Macchiato Teal
+        active.color = config.lib.stylix.colors.base0E;
       };
+      border.enable = false;
       preset-column-widths = [
         {proportion = 1.0 / 3.0;}
         {proportion = 1.0 / 2.0;}
modules/desktop/shell/niri/appearance/theme.nix
@@ -1,87 +0,0 @@
-{lib, ...}: {
-  flake.modules.homeManager.niri = {
-    pkgs,
-    config,
-    ...
-  }: let
-    whitesur-icon-theme = pkgs.whitesur-icon-theme.override {
-      boldPanelIcons = true;
-      alternativeIcons = true;
-    };
-  in {
-    gtk = {
-      enable = true;
-      gtk2.enable = false;
-      theme = {
-        package = pkgs.catppuccin-gtk.override {
-          variant = config.catppuccin.flavor;
-          accents = [config.catppuccin.accent];
-        };
-        name = "catppuccin-macchiato-${config.catppuccin.accent}-standard";
-      };
-      iconTheme = lib.mkForce {
-        name = "WhiteSur";
-        package = whitesur-icon-theme;
-      };
-    };
-
-    catppuccin.kvantum.apply = false;
-
-    qt = {
-      enable = true;
-      platformTheme = {
-        name = "qt6ct";
-        package = pkgs.kdePackages.qt6ct;
-      };
-      style = {
-        name = "kvantum";
-        package = pkgs.kdePackages.qtstyleplugin-kvantum;
-      };
-    };
-
-    home.sessionVariables = {
-      XDG_ICON_DIR = "${whitesur-icon-theme}/share/icons/WhiteSur";
-    };
-
-    programs.noctalia-shell.colors = let
-      mocchiato = {
-        rosewater = "#f4dbd6";
-        flamingo = "#f0c6c6";
-        pink = "#f5bde6";
-        mauve = "#c6a0f6";
-        red = "#ed8796";
-        maroon = "#ee99a0";
-        peach = "#f5a97f";
-        yellow = "#eed49f";
-        green = "#a6da95";
-        teal = "#8bd5ca";
-        sky = "#91d7e3";
-        sapphire = "#7dc4e4";
-        blue = "#8aadf4";
-        lavender = "#b7bdf8";
-
-        text = "#cad3f5";
-        subtext0 = "#a5adcb";
-        overlay0 = "#6e738d";
-        surface0 = "#363a4f";
-        base = "#24273a";
-        crust = "#181926";
-      };
-    in {
-      mPrimary = mocchiato.${config.catppuccin.accent};
-      mOnPrimary = mocchiato.crust;
-      mSecondary = mocchiato.peach;
-      mOnSecondary = mocchiato.crust;
-      mTertiary = mocchiato.lavender;
-      mOnTertiary = mocchiato.crust;
-      mError = mocchiato.red;
-      mOnError = mocchiato.crust;
-      mSurface = mocchiato.base;
-      mOnSurface = mocchiato.text;
-      mSurfaceVariant = mocchiato.surface0;
-      mOnSurfaceVariant = mocchiato.subtext0;
-      mOutline = mocchiato.overlay0;
-      mShadow = mocchiato.crust;
-    };
-  };
-}
modules/desktop/shell/niri/appearance/window-rules.nix
@@ -1,5 +1,5 @@
 {lib, ...}: {
-  flake.modules.homeManager.niri = _: {
+  flake.modules.homeManager.niri = {config, ...}: {
     programs.niri.settings.window-rules = [
       # rules for all windows
       {
@@ -7,7 +7,7 @@
         geometry-corner-radius = lib.genAttrs ["bottom-left" "bottom-right" "top-left" "top-right"] (_: 15.0);
         tiled-state = true;
         draw-border-with-background = false;
-        opacity = 0.95;
+        opacity = config.stylix.opacity.applications;
       }
     ];
   };
modules/desktop/shell/niri/greeter.nix
@@ -1,29 +1,8 @@
-{inputs, ...}: {
-  flake.modules.nixos.niri = {
-    pkgs,
-    config,
-    ...
-  }: {
+{
+  flake.modules.nixos.niri = _: {
     programs.regreet = {
       enable = true;
-      font.size = 22;
-      theme = {
-        package = pkgs.catppuccin-gtk.override {
-          variant = config.catppuccin.flavor;
-          accents = [config.catppuccin.accent];
-        };
-        name = "catppuccin-macchiato-${config.catppuccin.accent}-standard";
-      };
-      cursorTheme = {
-        package = pkgs.bibata-cursors;
-        name = "Bibata-Modern-Classic";
-      };
-      settings = {
-        background = {
-          path = "${inputs.wallpapers}/Nahida-2.png";
-          fit = "Cover";
-        };
-      };
+      font.size = 24;
     };
   };
 }
modules/desktop/shell/niri/noctalia.nix
@@ -1,7 +1,11 @@
-{inputs, ...}: {
+{
   flake.modules.homeManager.niri = {config, ...}: {
     programs.noctalia-shell = {
       settings = {
+        ui = {
+          fontDefault = config.stylix.fonts.sansSerif.name;
+          fontFixed = config.stylix.fonts.monospace.name;
+        };
         general = {
           avatarImage = "${config.home.homeDirectory}/.face";
           radiusRatio = 0.75;
@@ -9,18 +13,17 @@
         };
         wallpaper = {
           enabled = true;
-          directory = inputs.wallpapers;
-          defaultWallpaper = "${inputs.wallpapers}/default_wallpaper";
+          defaultWallpaper = config.stylix.image;
         };
         appLauncher = {
-          backgroundOpacity = 0.8;
+          backgroundOpacity = config.stylix.opacity.popups;
           enableClipboardHistory = true;
           terminalCommand = "ghostty -e";
         };
         location.name = "重庆, 中国";
         screenRecorder.directory = config.xdg.userDirs.videos;
         bar = {
-          backgroundOpacity = 0.9;
+          backgroundOpacity = config.stylix.opacity.desktop;
           density = "comfortable";
           floating = true;
           marginHorizontal = 0.4;
@@ -74,5 +77,22 @@
         };
       };
     };
+
+    programs.noctalia-shell.colors = {
+      mPrimary = config.lib.stylix.colors.base0E;
+      mOnPrimary = config.lib.stylix.colors.base11;
+      mSecondary = config.lib.stylix.colors.base09;
+      mOnSecondary = config.lib.stylix.colors.base11;
+      mTertiary = config.lib.stylix.colors.base15;
+      mOnTertiary = config.lib.stylix.colors.base11;
+      mError = config.lib.stylix.colors.base08;
+      mOnError = config.lib.stylix.colors.base11;
+      mSurface = config.lib.stylix.colors.base00;
+      mOnSurface = config.lib.stylix.colors.base05;
+      mSurfaceVariant = config.lib.stylix.colors.base02;
+      mOnSurfaceVariant = config.lib.stylix.colors.base04;
+      mOutline = config.lib.stylix.colors.base03;
+      mShadow = config.lib.stylix.colors.base11;
+    };
   };
 }
modules/desktop/shell/plasma6/options/appearance.nix
@@ -1,28 +1,9 @@
-{inputs, ...}: {
+{
   flake.modules.homeManager.plasma6 = {
-    pkgs,
-    config,
-    ...
-  }: {
-    home.packages = [
-      (pkgs.catppuccin-kde.override {
-        flavour = [config.catppuccin.flavor];
-        accents = [config.catppuccin.accent];
-      })
-    ];
-
     programs.plasma = {
-      kscreenlocker.appearance.wallpaper = "${inputs.wallpapers}/default_wallpaper";
-
       workspace = {
-        wallpaper = "${inputs.wallpapers}/default_wallpaper";
         theme = "default";
-        colorScheme = "CatppuccinMacchiatoMauve";
-        iconTheme = "breeze-dark";
-        cursor = {
-          size = 24;
-          theme = config.home.pointerCursor.name;
-        };
+        cursor.size = 24;
       };
 
       panels = [
modules/desktop/shell/plasma6/sddm.nix
@@ -10,8 +10,6 @@
   in {
     environment.systemPackages = [sddm-theme sddm-theme.test];
 
-    catppuccin.sddm.enable = false;
-
     services.displayManager.sddm = {
       enable = true;
       package = lib.mkForce pkgs.kdePackages.sddm; # Use qt6 version of sddm
modules/desktop/catppuccin.nix
@@ -1,23 +0,0 @@
-{inputs, ...}: {
-  flake.modules.nixos.desktop = _: {
-    imports = [inputs.catppuccin.nixosModules.catppuccin];
-
-    catppuccin = {
-      enable = true;
-      flavor = "macchiato";
-      accent = "teal";
-    };
-
-    catppuccin.tty.enable = false;
-  };
-
-  flake.modules.homeManager.desktop = _: {
-    imports = [inputs.catppuccin.homeModules.catppuccin];
-
-    catppuccin = {
-      enable = true;
-      flavor = "macchiato";
-      accent = "teal";
-    };
-  };
-}
modules/desktop/cursor.nix
@@ -1,10 +1,8 @@
 {
-  flake.modules.homeManager.desktop = {pkgs, ...}: {
-    home.pointerCursor = {
-      gtk.enable = true;
-      x11.enable = true;
-      package = pkgs.bibata-cursors;
+  flake.modules.nixos.desktop = {pkgs, ...}: {
+    stylix.cursor = {
       name = "Bibata-Modern-Classic";
+      package = pkgs.bibata-cursors;
       size = 24;
     };
   };
modules/desktop/fonts.nix
@@ -0,0 +1,44 @@
+{
+  flake.modules.nixos.desktop = {pkgs, ...}: {
+    fonts = {
+      enableDefaultPackages = false;
+      fontDir.enable = true;
+      packages = with pkgs; [
+        noto-fonts
+
+        lxgw-wenkai
+        smiley-sans
+
+        nerd-fonts.symbols-only
+        jetbrains-mono
+        fira-code
+
+        nur.repos.rewine.ttf-ms-win10
+      ];
+    };
+
+    stylix.fonts = {
+      sizes = {
+        applications = 13;
+        desktop = 13;
+        terminal = 13;
+      };
+      serif = {
+        name = "Source Han Serif SC";
+        package = pkgs.source-han-serif-simplified-chinese;
+      };
+      sansSerif = {
+        name = "Source Han Sans SC";
+        package = pkgs.source-han-sans-simplified-chinese;
+      };
+      monospace = {
+        name = "Maple Mono CN";
+        package = pkgs.maple-mono.CN;
+      };
+      emoji = {
+        name = "Noto Color Emoji";
+        package = pkgs.noto-fonts-emoji;
+      };
+    };
+  };
+}
modules/desktop/icon-theme.nix
@@ -0,0 +1,15 @@
+{
+  flake.modules.nixos.desktop = {pkgs, ...}: {
+    stylix.icons = let
+      whitesur-icon-theme = pkgs.whitesur-icon-theme.override {
+        boldPanelIcons = true;
+        alternativeIcons = true;
+      };
+    in {
+      enable = true;
+      light = "WhiteSur";
+      dark = "WhiteSur";
+      package = whitesur-icon-theme;
+    };
+  };
+}
modules/dev/vscode/profiles/default.nix
@@ -26,19 +26,15 @@
             enableExtensionUpdateCheck = false;
             userSettings = {
               # --- Editor Settings --- #
-              "editor.fontSize" = 16;
-              "editor.fontFamily" = "JetBrains Mono, Maple Mono CN, Symbols Nerd Font";
               "editor.fontLigatures" = true;
               "editor.guides.bracketPairs" = true;
               "editor.formatOnSave" = true;
               "editor.unicodeHighlight.allowedLocales"."zh-hans" = true;
               "editor.lineNumbers" = "relative";
               # --- Terminal Settings --- #
-              "terminal.integrated.fontFamily" = "JetBrains Mono, Maple Mono CN, Symbols Nerd Font";
-              "terminal.integrated.fontSize" = 14;
               "terminal.integrated.defaultProfile.linux" = "fish";
               # --- Workbench Settings --- #
-              "workbench.colorTheme" = "Catppuccin Macchiato";
+              "workbench.colorTheme" = "Stylix"; # Use Stylix theme
               "workbench.iconTheme" = "material-icon-theme";
               "workbench.startupEditor" = "none";
               # --- Extension Settings --- #
@@ -72,6 +68,7 @@
                 "terminal.integrated.fontFamily"
                 "terminal.integrated.fontSize"
                 "terminal.integrated.defaultProfile.linux"
+                "workbench.colorCustomizations" # Keep Stylix's theme
                 "workbench.colorTheme"
                 "workbench.iconTheme"
                 "workbench.startupEditor"
@@ -96,7 +93,6 @@
       (_: v: (v // {extensions = v.extensions or [] ++ baseExtensions;}))
       (lib.mergeAttrsList profilesList);
   in {
-    catppuccin.vscode.profiles.default.icons.enable = false;
     programs.vscode.profiles = profiles;
   };
 }
modules/dev/vscode/base-extensions.nix
@@ -12,7 +12,6 @@
 
         # Appearance
         pkief.material-icon-theme
-        catppuccin.catppuccin-vsc
 
         # Utils
         mhutchie.git-graph
modules/hosts/chaser-kevin/boot.nix
@@ -1,7 +1,7 @@
 {inputs, ...}: {
   flake.modules.nixos."hosts/kevin" = {pkgs, ...}: {
-    catppuccin.plymouth.enable = false;
-    catppuccin.grub.enable = false;
+    stylix.targets.plymouth.enable = false;
+    stylix.targets.grub.enable = false;
 
     boot.loader = {
       grub = rec {
flake.lock
@@ -1,20 +1,70 @@
 {
   "nodes": {
-    "catppuccin": {
+    "base16": {
       "inputs": {
-        "nixpkgs": "nixpkgs"
+        "fromYaml": "fromYaml"
+      },
+      "locked": {
+        "lastModified": 1755819240,
+        "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=",
+        "owner": "SenchoPens",
+        "repo": "base16.nix",
+        "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6",
+        "type": "github"
       },
+      "original": {
+        "owner": "SenchoPens",
+        "repo": "base16.nix",
+        "type": "github"
+      }
+    },
+    "base16-fish": {
+      "flake": false,
       "locked": {
-        "lastModified": 1759572023,
-        "narHash": "sha256-2fzYq/m2PXie5WZO5LhyiZrTIUdUFp1SCLZAwvPL5xo=",
-        "owner": "catppuccin",
-        "repo": "nix",
-        "rev": "eeada12912d80d04733383d231a9d66172858718",
+        "lastModified": 1754405784,
+        "narHash": "sha256-l9xHIy+85FN+bEo6yquq2IjD1rSg9fjfjpyGP1W8YXo=",
+        "owner": "tomyun",
+        "repo": "base16-fish",
+        "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
         "type": "github"
       },
       "original": {
-        "owner": "catppuccin",
-        "repo": "nix",
+        "owner": "tomyun",
+        "repo": "base16-fish",
+        "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
+        "type": "github"
+      }
+    },
+    "base16-helix": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1752979451,
+        "narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=",
+        "owner": "tinted-theming",
+        "repo": "base16-helix",
+        "rev": "27cf1e66e50abc622fb76a3019012dc07c678fac",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-helix",
+        "type": "github"
+      }
+    },
+    "base16-vim": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1732806396,
+        "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=",
+        "owner": "tinted-theming",
+        "repo": "base16-vim",
+        "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-vim",
+        "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
         "type": "github"
       }
     },
@@ -79,7 +129,7 @@
     "distro-grub-themes": {
       "inputs": {
         "flake-utils": "flake-utils",
-        "nixpkgs": "nixpkgs_2"
+        "nixpkgs": "nixpkgs"
       },
       "locked": {
         "lastModified": 1734806114,
@@ -95,6 +145,22 @@
         "type": "github"
       }
     },
+    "firefox-gnome-theme": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1758112371,
+        "narHash": "sha256-lizRM2pj6PHrR25yimjyFn04OS4wcdbc38DCdBVa2rk=",
+        "owner": "rafaelmardojai",
+        "repo": "firefox-gnome-theme",
+        "rev": "0909cfe4a2af8d358ad13b20246a350e14c2473d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "rafaelmardojai",
+        "repo": "firefox-gnome-theme",
+        "type": "github"
+      }
+    },
     "flake-compat": {
       "flake": false,
       "locked": {
@@ -169,6 +235,27 @@
       }
     },
     "flake-parts_3": {
+      "inputs": {
+        "nixpkgs-lib": [
+          "stylix",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1756770412,
+        "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "4524271976b625a4a605beefd893f270620fd751",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_4": {
       "inputs": {
         "nixpkgs-lib": "nixpkgs-lib"
       },
@@ -204,6 +291,22 @@
         "type": "github"
       }
     },
+    "fromYaml": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1731966426,
+        "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=",
+        "owner": "SenchoPens",
+        "repo": "fromYaml",
+        "rev": "106af9e2f715e2d828df706c386a685698f3223b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "SenchoPens",
+        "repo": "fromYaml",
+        "type": "github"
+      }
+    },
     "gitignore": {
       "inputs": {
         "nixpkgs": [
@@ -226,6 +329,23 @@
         "type": "github"
       }
     },
+    "gnome-shell": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1748186689,
+        "narHash": "sha256-UaD7Y9f8iuLBMGHXeJlRu6U1Ggw5B9JnkFs3enZlap0=",
+        "owner": "GNOME",
+        "repo": "gnome-shell",
+        "rev": "8c88f917db0f1f0d80fa55206c863d3746fa18d0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "GNOME",
+        "ref": "48.2",
+        "repo": "gnome-shell",
+        "type": "github"
+      }
+    },
     "helix-fork": {
       "inputs": {
         "nixpkgs": [
@@ -376,15 +496,15 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1759381078,
-        "narHash": "sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs=",
-        "owner": "NixOS",
+        "lastModified": 1731676054,
+        "narHash": "sha256-OZiZ3m8SCMfh3B6bfGC/Bm4x3qc1m2SVEAlkV6iY7Yg=",
+        "owner": "nixos",
         "repo": "nixpkgs",
-        "rev": "7df7ff7d8e00218376575f0acdcc5d66741351ee",
+        "rev": "5e4fbfb6b3de1aa2872b76d49fafc942626e2add",
         "type": "github"
       },
       "original": {
-        "owner": "NixOS",
+        "owner": "nixos",
         "ref": "nixos-unstable",
         "repo": "nixpkgs",
         "type": "github"
@@ -454,22 +574,6 @@
       }
     },
     "nixpkgs_2": {
-      "locked": {
-        "lastModified": 1731676054,
-        "narHash": "sha256-OZiZ3m8SCMfh3B6bfGC/Bm4x3qc1m2SVEAlkV6iY7Yg=",
-        "owner": "nixos",
-        "repo": "nixpkgs",
-        "rev": "5e4fbfb6b3de1aa2872b76d49fafc942626e2add",
-        "type": "github"
-      },
-      "original": {
-        "owner": "nixos",
-        "ref": "nixos-unstable",
-        "repo": "nixpkgs",
-        "type": "github"
-      }
-    },
-    "nixpkgs_3": {
       "locked": {
         "lastModified": 1759381078,
         "narHash": "sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs=",
@@ -548,6 +652,31 @@
         "type": "github"
       }
     },
+    "nur_2": {
+      "inputs": {
+        "flake-parts": [
+          "stylix",
+          "flake-parts"
+        ],
+        "nixpkgs": [
+          "stylix",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1758998580,
+        "narHash": "sha256-VLx0z396gDCGSiowLMFz5XRO/XuNV+4EnDYjdJhHvUk=",
+        "owner": "nix-community",
+        "repo": "NUR",
+        "rev": "ba8d9c98f5f4630bcb0e815ab456afd90c930728",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "NUR",
+        "type": "github"
+      }
+    },
     "plasma-manager": {
       "inputs": {
         "home-manager": [
@@ -638,7 +767,6 @@
     },
     "root": {
       "inputs": {
-        "catppuccin": "catppuccin",
         "deploy-rs": "deploy-rs",
         "disko": "disko",
         "distro-grub-themes": "distro-grub-themes",
@@ -649,7 +777,7 @@
         "niri-flake": "niri-flake",
         "nixos-hardware": "nixos-hardware",
         "nixos-logo": "nixos-logo",
-        "nixpkgs": "nixpkgs_3",
+        "nixpkgs": "nixpkgs_2",
         "nixpkgs-stable": "nixpkgs-stable_2",
         "nixpkgs-unstable": "nixpkgs-unstable",
         "noctalia": "noctalia",
@@ -658,6 +786,7 @@
         "plasma-manager": "plasma-manager",
         "programsdb": "programsdb",
         "silentSDDM": "silentSDDM",
+        "stylix": "stylix",
         "vaultix": "vaultix",
         "wallpapers": "wallpapers"
       }
@@ -724,6 +853,40 @@
         "type": "github"
       }
     },
+    "stylix": {
+      "inputs": {
+        "base16": "base16",
+        "base16-fish": "base16-fish",
+        "base16-helix": "base16-helix",
+        "base16-vim": "base16-vim",
+        "firefox-gnome-theme": "firefox-gnome-theme",
+        "flake-parts": "flake-parts_3",
+        "gnome-shell": "gnome-shell",
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "nur": "nur_2",
+        "systems": "systems_4",
+        "tinted-foot": "tinted-foot",
+        "tinted-kitty": "tinted-kitty",
+        "tinted-schemes": "tinted-schemes",
+        "tinted-tmux": "tinted-tmux",
+        "tinted-zed": "tinted-zed"
+      },
+      "locked": {
+        "lastModified": 1760350849,
+        "narHash": "sha256-JqcM5Pkm5q1c9D5zpINJsN1yCB4Vq1cL12ZuFyo32T4=",
+        "owner": "nix-community",
+        "repo": "stylix",
+        "rev": "7b4957d716f4fb615bf0e37d3b23c112579b1408",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "stylix",
+        "type": "github"
+      }
+    },
     "systems": {
       "locked": {
         "lastModified": 1681028828,
@@ -769,6 +932,102 @@
         "type": "github"
       }
     },
+    "systems_4": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
+    "tinted-foot": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1726913040,
+        "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=",
+        "owner": "tinted-theming",
+        "repo": "tinted-foot",
+        "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-foot",
+        "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+        "type": "github"
+      }
+    },
+    "tinted-kitty": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1735730497,
+        "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=",
+        "owner": "tinted-theming",
+        "repo": "tinted-kitty",
+        "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-kitty",
+        "type": "github"
+      }
+    },
+    "tinted-schemes": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757716333,
+        "narHash": "sha256-d4km8W7w2zCUEmPAPUoLk1NlYrGODuVa3P7St+UrqkM=",
+        "owner": "tinted-theming",
+        "repo": "schemes",
+        "rev": "317a5e10c35825a6c905d912e480dfe8e71c7559",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "schemes",
+        "type": "github"
+      }
+    },
+    "tinted-tmux": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757811970,
+        "narHash": "sha256-n5ZJgmzGZXOD9pZdAl1OnBu3PIqD+X3vEBUGbTi4JiI=",
+        "owner": "tinted-theming",
+        "repo": "tinted-tmux",
+        "rev": "d217ba31c846006e9e0ae70775b0ee0f00aa6b1e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-tmux",
+        "type": "github"
+      }
+    },
+    "tinted-zed": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757811247,
+        "narHash": "sha256-4EFOUyLj85NRL3OacHoLGEo0wjiRJzfsXtR4CZWAn6w=",
+        "owner": "tinted-theming",
+        "repo": "base16-zed",
+        "rev": "824fe0aacf82b3c26690d14e8d2cedd56e18404e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-zed",
+        "type": "github"
+      }
+    },
     "utils": {
       "inputs": {
         "systems": "systems"
@@ -805,7 +1064,7 @@
     "vaultix": {
       "inputs": {
         "crane": "crane",
-        "flake-parts": "flake-parts_3",
+        "flake-parts": "flake-parts_4",
         "nixpkgs": [
           "nixpkgs"
         ],
flake.nix
@@ -2,8 +2,6 @@
   description = "NixOS configuration of HPCesia.";
 
   inputs = {
-    catppuccin.url = "github:catppuccin/nix";
-
     deploy-rs.url = "github:serokell/deploy-rs";
     deploy-rs.inputs.nixpkgs.follows = "nixpkgs";
 
@@ -48,6 +46,9 @@
     silentSDDM.url = "github:uiriansan/SilentSDDM";
     silentSDDM.inputs.nixpkgs.follows = "nixpkgs";
 
+    stylix.url = "github:nix-community/stylix";
+    stylix.inputs.nixpkgs.follows = "nixpkgs";
+
     vaultix.url = "github:milieuim/vaultix";
     vaultix.inputs.nixpkgs.follows = "nixpkgs";