{ pkgs, lib, ... }: let inherit (pkgs.stdenv) isDarwin; # (hard constants) ppi = 72; dpi = 96; mustFloat = x: x * 1.0; px-pt = px: (mustFloat px) * ppi / dpi; in { # hard to find the right documentation page # https://nix-community.github.io/stylix/options/platforms/home_manager.html stylix = { enable = true; # actually refers to tinted-themes (https://github.com/tinted-theming/schemes) # but only in the base16 variants (TODO update nixpkgs) base16Scheme = "${pkgs.base16-schemes}/share/themes/atelier-dune-light.yaml"; fonts = { sansSerif = lib.mkIf isDarwin { name = "SF Pro"; }; monospace = { name = "Berkeley Mono"; }; sizes = { applications = px-pt 15; # desktop # popups # terminal }; }; targets = { fish.enable = false; fzf.colors.enable = false; zed = { inputs.enable = false; fonts.override = { sansSerif.name = ".ZedSans"; }; }; nixvim = { enable = true; plugin = "mini.base16"; }; emacs = { colors.enable = false; fonts.override.sizes.terminal = 15; }; }; }; home.packages = with pkgs; [ theme-sh ]; programs.fzf = { defaultOptions = [ "--color=16" ]; colors = { fg = "-1"; "fg+" = "-1"; bg = "-1"; "bg+" = "-1"; gutter = "8"; pointer = "-1"; header = "1"; border = "6"; hl = "3"; "hl+" = "11"; info = "2"; prompt = "14"; marker = "21"; spinner = "21"; scrollbar = "dim"; }; }; home.sessionVariables = { CLICOLOR = "1"; LSCOLORS = "gxfxcxdxDxegedabagacad"; # for macOS's ls THEME_LIGHT = "atelier-dune-light"; THEME_DARK = "atelier-dune"; }; programs.fish = { shellAliases.theme = "theme.sh"; loginShellInit = '' if test -e $XDG_CONFIG_HOME/.theme_history theme.sh (theme.sh -l | tail -n1) else theme.sh $THEME_LIGHT end bind \co toggle-light-dark ''; }; programs.zed-editor = { extensions = [ "flexoki-themes" ]; userSettings.theme = { light = "Flexoki Light"; dark = "Flexoki Dark"; }; }; programs.emacs = let pname = "flexoki-themes"; light-mode-theme = "flexoki-themes-light"; dark-mode-theme = "flexoki-themes-dark"; config = '' ;; (flexoki-themes-use-bold-keywords t) ;; (flexoki-themes-use-bold-builtins t) ;; (flexoki-themes-use-italic-comments t) ''; in { extraPackages = epkgs: [ epkgs.${pname} ]; extraConfig = '' (use-package ${pname} :if (or (daemonp) window-system) :config (progn ${config})) (let ((light-mode-theme '${light-mode-theme}) (dark-mode-theme '${dark-mode-theme})) (mapc #'disable-theme custom-enabled-themes) (load-theme light-mode-theme :noconfirm :noenable) (load-theme dark-mode-theme :noconfirm :noenable) (defun my/switch-theme-variant (mode) (interactive (list (intern (completing-read "Make it: " '("light" "dark") nil t)))) (cond ((eq mode 'dark) (disable-theme light-mode-theme) (enable-theme dark-mode-theme)) ((eq mode 'light) (disable-theme dark-mode-theme) (enable-theme light-mode-theme))) (modify-all-frames-parameters `((ns-appearance ,mode)))) (defun my/system-appearance () (if (and (eq system-type 'darwin) (string-equal "Dark" (string-trim-right (shell-command-to-string "defaults read -g AppleInterfaceStyle")))) 'dark 'light)) (defun my/match-theme-system-appearance () (interactive) (my/switch-theme-variant (my/system-appearance))) (my/switch-theme-variant (my/system-appearance)) (use-package kqueue :if (eq window-system 'ns) :config (progn (defun my/gp-notify-callback (event) (let* ((filename (elt event 2)) (basename (file-name-nondirectory filename))) (when (string-equal basename ".GlobalPreferences.plist") (my/match-theme-system-appearance)))) (setq my/kq-watcher-global-preferences (kqueue-add-watch (expand-file-name "~/Library/Preferences/") '(write) #'my/gp-notify-callback))))) ''; }; }