feat: Nomarchy ground-up rewrite on NixOS 26.05
Full replacement of the previous iteration, rebuilt around three ideas:
- Pure evaluation: theme-state.json lives inside the flake and is read
via the nomarchy.stateFile option — no --impure, ever.
- All-Home-Manager theming: `nomarchy-theme-sync apply` writes the JSON
and runs `home-manager switch`; every theme change is one atomic,
rollbackable generation. Wallpaper (swww) is the sole runtime piece.
- Flat, downstream-first layout: modules/{nixos,home} with one
options.nix each, exported as nixosModules/homeModules + overlay +
flake template; system (nixos-rebuild) and desktop (home-manager
switch) rebuild paths are fully split.
Ships 21 themes imported from the previous iteration (palettes,
wallpapers, btop themes, six whole-swap Waybar identities), Stylix for
the GTK/Qt/cursor long tail, a live ISO target with offline theme
switching, and docs/TESTING.md with the QEMU verification workflow.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
10
.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# Study material from the previous iteration — not part of the flake.
|
||||
# Delete the directory once everything worth porting has been ported.
|
||||
old_distro/
|
||||
|
||||
# Nix build artifacts
|
||||
result
|
||||
result-*
|
||||
|
||||
__pycache__/
|
||||
.DS_Store
|
||||
197
README.md
Normal file
@@ -0,0 +1,197 @@
|
||||
# Nomarchy
|
||||
|
||||
**The rock-solid reproducibility of NixOS 26.05. The out-of-the-box polish of
|
||||
Omarchy/Omakub.** One JSON file rules the look of the entire desktop; every
|
||||
theme change is a Home Manager generation — atomic, rollbackable, never
|
||||
partial.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────────────────┐
|
||||
│ theme-state.json (single source of truth) │
|
||||
│ lives INSIDE your flake checkout, git-tracked │
|
||||
└───────────────────────────────────┬──────────────────────────────────────┘
|
||||
│
|
||||
nomarchy-theme-sync apply gruvbox
|
||||
1. merges the preset into the JSON (atomic write)
|
||||
2. runs `home-manager switch` (no sudo, no system rebuild)
|
||||
│
|
||||
▼ pure read (nomarchy.stateFile)
|
||||
┌──────────────────────────────────────────────────────────────────────────┐
|
||||
│ Home Manager bakes EVERYTHING into one read-only generation: │
|
||||
│ Hyprland (colors/gaps/borders) Waybar (palette or whole-swap) │
|
||||
│ Ghostty (full ANSI palette) btop (asset or generated) │
|
||||
│ Stylix → GTK, Qt, cursors, fonts │
|
||||
└───────────────────────────────────┬──────────────────────────────────────┘
|
||||
▼
|
||||
wallpaper via swww (the one runtime piece:
|
||||
applied post-switch + at session start, `bg next` cycles)
|
||||
```
|
||||
|
||||
## 1. Layout
|
||||
|
||||
Flat on purpose. Two module trees, one options file each, no hidden layers.
|
||||
|
||||
```
|
||||
.
|
||||
├── flake.nix # inputs + the downstream API (exports below)
|
||||
├── theme-state.json # ★ THE single source of truth (git-tracked!)
|
||||
├── themes/ # 21 presets: <slug>.json + optional <slug>/ assets
|
||||
│ ├── nord.json # palette (required, works alone)
|
||||
│ └── nord/ # assets (optional, fixed filenames)
|
||||
│ ├── backgrounds/ # wallpapers (auto-picked, SUPER+SHIFT+T cycles)
|
||||
│ ├── btop.theme # hand-made config drop (else generated)
|
||||
│ └── waybar.css # whole-swap: replaces the generated bar style
|
||||
├── modules/
|
||||
│ ├── nixos/ # the distro, system side
|
||||
│ │ ├── default.nix # Hyprland session, Pipewire, greetd, fonts
|
||||
│ │ └── options.nix # nomarchy.system.* toggles
|
||||
│ └── home/ # the distro, user side
|
||||
│ ├── default.nix # entry point
|
||||
│ ├── options.nix # nomarchy.* option surface
|
||||
│ ├── theme.nix # JSON ingestion + wallpaper hook
|
||||
│ ├── stylix.nix # GTK/Qt/cursors/fonts from the same JSON
|
||||
│ ├── hyprland.nix # all JSON-driven
|
||||
│ ├── waybar.nix
|
||||
│ ├── ghostty.nix
|
||||
│ └── btop.nix
|
||||
├── hosts/
|
||||
│ ├── default/ # reference machine (thin: boot, user, hostname)
|
||||
│ └── live.nix # bootable live ISO (try the distro, no install)
|
||||
├── pkgs/nomarchy-theme-sync/ # state writer + rebuild dispatcher (Python)
|
||||
├── templates/downstream/ # `nix flake init -t` starter for users
|
||||
├── docs/TESTING.md # how to verify changes (incl. AI-agent rules)
|
||||
└── tools/ # maintainer-only
|
||||
├── import-palettes.py # converts old-distro themes → JSON + assets
|
||||
└── test-live-iso.sh # build the ISO + boot it in QEMU
|
||||
```
|
||||
|
||||
**Rule of thumb:** `modules/` is the distro (reusable, no machine specifics),
|
||||
`hosts/` is a machine, `themes/` is data, `pkgs/` is code, `tools/` is
|
||||
maintainer-only. If a new file doesn't obviously belong to one of those, it
|
||||
probably shouldn't exist.
|
||||
|
||||
## 2. Try it first (live ISO)
|
||||
|
||||
Boot the full desktop from a USB stick or VM without installing anything:
|
||||
|
||||
```sh
|
||||
nix build .#nixosConfigurations.nomarchy-live.config.system.build.isoImage
|
||||
# → result/iso/*.iso — dd to a stick, or boot it in QEMU:
|
||||
tools/test-live-iso.sh
|
||||
```
|
||||
|
||||
The live session auto-logs-in, seeds the flake at `~/.nomarchy`, and pins
|
||||
the locked inputs into the ISO store — so theme switching (including the
|
||||
`home-manager switch` it triggers) works **offline**, exactly like on an
|
||||
installed system. Verification checklist: [docs/TESTING.md](docs/TESTING.md).
|
||||
|
||||
## 3. Using Nomarchy on your machine (downstream)
|
||||
|
||||
Nomarchy is consumed as a flake input — you never fork or edit this repo:
|
||||
|
||||
```sh
|
||||
mkdir my-machine && cd my-machine
|
||||
nix flake init -t github:YOUR-USER/nomarchy
|
||||
```
|
||||
|
||||
You own three files: `system.nix`, `home.nix`, and **your own
|
||||
`theme-state.json`**. Two deliberately separate rebuild paths:
|
||||
|
||||
```sh
|
||||
sudo nixos-rebuild switch --flake .#default # system: rare
|
||||
home-manager switch --flake .#me # desktop: every theme change, no sudo
|
||||
```
|
||||
|
||||
Override anything with plain NixOS/HM options (the distro uses `mkDefault`
|
||||
throughout) or the `nomarchy.*` surface:
|
||||
|
||||
| Option | Default | Purpose |
|
||||
|---|---|---|
|
||||
| `nomarchy.stateFile` | — (required) | Path to your theme-state.json |
|
||||
| `nomarchy.terminal` | `"ghostty"` | Terminal for keybinds and `$TERMINAL` |
|
||||
| `nomarchy.hyprland.enable` | `true` | Nomarchy's Hyprland config |
|
||||
| `nomarchy.waybar.enable` | `true` | Nomarchy's Waybar |
|
||||
| `nomarchy.ghostty.enable` | `true` | Nomarchy's Ghostty |
|
||||
| `nomarchy.btop.enable` | `true` | btop with per-theme colors |
|
||||
| `nomarchy.stylix.enable` | `true` | GTK/Qt/cursor theming |
|
||||
| `nomarchy.themesDir` | Nomarchy's `themes/` | Where per-theme app overrides are probed |
|
||||
| `nomarchy.system.greeter.enable` | `true` | greetd/tuigreet |
|
||||
| `nomarchy.system.audio.enable` | `true` | Pipewire stack |
|
||||
| `nomarchy.system.bluetooth.enable` | `true` | Bluetooth + blueman |
|
||||
|
||||
## 4. How theming works
|
||||
|
||||
### Pure JSON ingestion
|
||||
|
||||
The trap with "read a mutable file from Nix" is pure evaluation: flakes
|
||||
cannot read arbitrary `$HOME` paths without `--impure` (the old prototype
|
||||
required it — never again). Nomarchy's convention: **the state file lives
|
||||
inside the consuming flake** and is wired via
|
||||
`nomarchy.stateFile = ./theme-state.json;`. Reading it is pure — it's flake
|
||||
source. It must be git-tracked (`nomarchy-theme-sync` runs
|
||||
`git add --intent-to-add` after every write as a safety net).
|
||||
|
||||
### One change = one generation
|
||||
|
||||
`nomarchy-theme-sync apply <theme>` merges the preset into the JSON and runs
|
||||
`home-manager switch` (override the command with `$NOMARCHY_REBUILD`, or pass
|
||||
`--no-switch` to only write). Everything is baked: Hyprland, Waybar, Ghostty,
|
||||
btop, and — via Stylix, mapped onto base16 roles — GTK, Qt, cursors and
|
||||
fonts. No runtime patching means no partial states, and `home-manager
|
||||
generations` is also your theme history. Waybar even restyles in place: it
|
||||
re-reads `style.css` when the symlink flips.
|
||||
|
||||
The **wallpaper** is the one runtime piece (swww is imperative; nothing in
|
||||
Nix consumes the path): applied at session start and after every switch via
|
||||
a tiny activation hook, cycled instantly with `bg next`.
|
||||
|
||||
### Per-theme app assets (`themes/<slug>/`)
|
||||
|
||||
Recoloring covers 95% of theming; the rest is one optional assets directory
|
||||
per theme — a single place to look, unlike the old distro's split:
|
||||
|
||||
| Asset | Mechanism |
|
||||
|---|---|
|
||||
| `backgrounds/` | wallpapers; empty `wallpaper` in the state means "first one"; `bg next` cycles |
|
||||
| `btop.theme` | baked into the generation (generated from the palette when absent) |
|
||||
| `waybar.css` | **whole-swap**: replaces the generated bar style entirely (probed at eval time, self-contained) |
|
||||
| `waybar.jsonc` | whole-swap for the bar *layout* (must be plain JSON) |
|
||||
|
||||
Six ported themes ship a `waybar.css` identity (catppuccin, lumon, nord,
|
||||
retro-82, summer-day, summer-night). Custom user themes can live in
|
||||
`$NOMARCHY_PATH/themes/` (preset lookup) and `nomarchy.themesDir` (eval-time
|
||||
asset probe).
|
||||
|
||||
## 5. Day-to-day
|
||||
|
||||
```sh
|
||||
nomarchy-theme-sync list # 21 presets (nord, gruvbox, rose-pine, …)
|
||||
nomarchy-theme-sync apply kanagawa # whole desktop, one generation (~a switch)
|
||||
nomarchy-theme-sync set ui.gapsOut 16 # tweak one knob (also a switch)
|
||||
nomarchy-theme-sync bg next # cycle wallpapers — instant, no rebuild
|
||||
nomarchy-theme-sync bg auto # back to the theme's default wallpaper
|
||||
nomarchy-theme-sync get colors.accent
|
||||
```
|
||||
|
||||
Keybinds: `SUPER+Return` terminal · `SUPER+D` launcher · `SUPER+T` theme
|
||||
picker · `SUPER+SHIFT+T` next wallpaper · `SUPER+Q` close · `SUPER+1..9`
|
||||
workspaces · `Print` region screenshot.
|
||||
|
||||
## 6. Extending
|
||||
|
||||
- **New theme:** drop a JSON into `themes/` (schema = any existing preset),
|
||||
plus an optional `themes/<slug>/` assets directory.
|
||||
- **New themed value:** add the key to `theme-state.json` and consume it in
|
||||
the Nix modules. One place — there is no second renderer to keep in sync.
|
||||
- **Importing more old-distro palettes:**
|
||||
`tools/import-palettes.py <palettes-dir> themes/`.
|
||||
|
||||
## Roadmap
|
||||
|
||||
- **Faster switches:** move `backgrounds/` out of the flake source (the 86 MB
|
||||
re-copy on every state write is the main eval tax), then pre-built theme
|
||||
variants if still needed
|
||||
- Plymouth + SDDM/greeter theming from the same JSON
|
||||
- Interactive installer on the live ISO (disko BTRFS+LUKS, hardware
|
||||
profiles) — port from old_distro
|
||||
- `hyprlock`/`hypridle`, swayosd, launch-or-focus UX scripts
|
||||
89
docs/TESTING.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# Testing Nomarchy
|
||||
|
||||
How to verify changes actually work — from cheap eval checks to booting the
|
||||
full desktop. Adapted from the previous Nomarchy iteration's agent docs.
|
||||
|
||||
**The honesty rule (for humans and AI agents alike):** for Waybar, Hyprland,
|
||||
or any visual change, the only reliable check is booting the live ISO. If
|
||||
you can't boot it (e.g. you're on macOS or have no KVM), **say so** rather
|
||||
than claiming success. "All Nix files parse" is not "the bar renders."
|
||||
|
||||
## 1. Cheap checks (always do these first)
|
||||
|
||||
```sh
|
||||
nix flake check --no-build # full module-system evaluation, no builds
|
||||
nix-instantiate --parse <file> # syntax-only, works even on macOS
|
||||
python3 -m py_compile pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py
|
||||
```
|
||||
|
||||
`nix flake check` needs a Linux machine (or a Linux builder) since all
|
||||
outputs are `x86_64-linux`. It catches type errors, missing options, and
|
||||
bad merges — most breakage stops here.
|
||||
|
||||
## 2. Build and boot the live ISO
|
||||
|
||||
```sh
|
||||
# Build + boot in QEMU, one command:
|
||||
tools/test-live-iso.sh
|
||||
|
||||
# Or by hand:
|
||||
nix build .#nixosConfigurations.nomarchy-live.config.system.build.isoImage
|
||||
# → result/iso/*.iso — dd it to a USB stick for real hardware
|
||||
```
|
||||
|
||||
The script prefers UEFI (OVMF) with a legacy-BIOS fallback, uses KVM when
|
||||
`/dev/kvm` is readable, and boots with `virtio-vga-gl` + `gl=on` —
|
||||
**Hyprland and Ghostty need real OpenGL in the guest**; without it the
|
||||
session may not start.
|
||||
|
||||
### What the live environment gives you
|
||||
|
||||
- Auto-login as `nomarchy` (no password, passwordless sudo), greetd →
|
||||
Hyprland via `initial_session`; logging out lands on tuigreet.
|
||||
- The flake is seeded writable at `~/.nomarchy` (from the read-only
|
||||
`/etc/nomarchy` copy) — `$NOMARCHY_PATH` already points there.
|
||||
- Locked flake inputs are pinned into the ISO store, so
|
||||
`home-manager switch` works **without a network**.
|
||||
|
||||
## 3. Verification checklist
|
||||
|
||||
Work through these in order; each one exercises a different layer.
|
||||
|
||||
| # | Check | Verifies |
|
||||
|---|---|---|
|
||||
| 1 | Boots to Hyprland with Tokyo Night wallpaper visible | greetd autologin, swww, session start |
|
||||
| 2 | Waybar shows at top, themed (blue accent on dark) | HM waybar module, palette baking |
|
||||
| 3 | `SUPER+Return` opens Ghostty with Tokyo Night colors | terminal default, ANSI palette |
|
||||
| 4 | `btop` in the terminal is themed | per-theme asset baking |
|
||||
| 5 | `nomarchy-theme-sync list` prints 21 presets | package, baked themes dir |
|
||||
| 6 | `nomarchy-theme-sync apply gruvbox` → state written, `home-manager switch` runs, desktop re-themes, wallpaper changes | the whole engine: state write, pure eval, HM rebuild, wallpaper hook |
|
||||
| 7 | `SUPER+SHIFT+T` cycles wallpapers instantly (try `tokyo-night`: 4 of them) | the runtime wallpaper path |
|
||||
| 8 | `nomarchy-theme-sync apply summer-night` → after the switch the bar has its own identity (light bar, different styling) | whole-swap waybar.css assets |
|
||||
| 9 | Open a GTK app — dark theme matching the palette | Stylix layer |
|
||||
| 10 | `home-manager generations` lists one generation per theme change; activating an older one rolls the theme back | atomicity / rollback story |
|
||||
|
||||
Items 6 and 8 are the big ones — they prove the all-Home-Manager theming
|
||||
model end to end.
|
||||
|
||||
## 4. VM-specific gotchas
|
||||
|
||||
- **No KVM** (e.g. nested without acceleration): everything works but
|
||||
`home-manager switch` will be painfully slow. Don't read slowness as
|
||||
breakage.
|
||||
- **Black screen / session exits**: almost always missing guest GL. Use the
|
||||
script's qemu flags; on real hardware check `journalctl -b -u greetd`.
|
||||
- **Tiny resolution**: the live config forces `monitor = ,highres,auto,1`;
|
||||
if QEMU still picks 1024×768, resize the window — Hyprland follows.
|
||||
- **First theme switch is the slowest**: it evaluates the flake on a RAM
|
||||
disk. Subsequent switches reuse the eval cache.
|
||||
|
||||
## 5. When something fails
|
||||
|
||||
- Session/login problems: `journalctl -b -u greetd`, then `journalctl
|
||||
--user -b`.
|
||||
- Theme switch failures: run `nomarchy-theme-sync apply <x>` from a
|
||||
terminal — the home-manager output streams there. The state file is
|
||||
written *before* the rebuild, so after fixing you can just re-run
|
||||
`home-manager switch --flake ~/.nomarchy`.
|
||||
- Report results faithfully: what booted, what rendered, what you could
|
||||
not verify and why.
|
||||
138
flake.nix
Normal file
@@ -0,0 +1,138 @@
|
||||
{
|
||||
description = "Nomarchy — the rock-solid reproducibility of NixOS, the polish of an opinionated desktop";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
|
||||
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/release-26.05";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
stylix = {
|
||||
url = "github:danth/stylix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.home-manager.follows = "home-manager";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, home-manager, stylix, ... }:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
username = "nomarchy"; # reference host only; downstream picks its own
|
||||
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ self.overlays.default ];
|
||||
};
|
||||
in
|
||||
{
|
||||
# ─── Downstream API ────────────────────────────────────────────
|
||||
# A user's machine flake imports these and layers its own
|
||||
# system.nix / home.nix on top (see templates/downstream).
|
||||
# Their theme-state.json lives in THEIR flake and is wired up via
|
||||
# the `nomarchy.stateFile` option — reading it stays pure.
|
||||
|
||||
overlays.default = final: prev: {
|
||||
nomarchy-theme-sync = final.callPackage ./pkgs/nomarchy-theme-sync {
|
||||
# Presets baked into the package, so `nomarchy-theme-sync list`
|
||||
# works on machines that don't check out this repo.
|
||||
themesDir = ./themes;
|
||||
};
|
||||
};
|
||||
|
||||
nixosModules.nomarchy = {
|
||||
imports = [ ./modules/nixos ];
|
||||
nixpkgs.overlays = [ self.overlays.default ];
|
||||
};
|
||||
|
||||
homeModules.nomarchy = {
|
||||
# stylix's home module is injected here because it needs the
|
||||
# flake input; modules/home/stylix.nix only configures it.
|
||||
imports = [ stylix.homeModules.stylix ./modules/home ];
|
||||
};
|
||||
|
||||
templates.default = {
|
||||
path = ./templates/downstream;
|
||||
description = "Nomarchy machine configuration (downstream flake)";
|
||||
};
|
||||
|
||||
packages.${system} = {
|
||||
nomarchy-theme-sync = pkgs.nomarchy-theme-sync;
|
||||
default = pkgs.nomarchy-theme-sync;
|
||||
};
|
||||
|
||||
# ─── Reference host ────────────────────────────────────────────
|
||||
# Deliberately split rebuild paths:
|
||||
# system → sudo nixos-rebuild switch --flake .#nomarchy (rare)
|
||||
# desktop → home-manager switch --flake .#nomarchy (no sudo;
|
||||
# this is what `nomarchy-theme-sync apply` runs)
|
||||
# Theme changes never touch the system layer, so they never need
|
||||
# root and never rebuild the world.
|
||||
nixosConfigurations.nomarchy = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = { inherit username; };
|
||||
modules = [
|
||||
self.nixosModules.nomarchy
|
||||
./hosts/default/configuration.nix
|
||||
];
|
||||
};
|
||||
|
||||
homeConfigurations.${username} = home-manager.lib.homeManagerConfiguration {
|
||||
inherit pkgs;
|
||||
modules = [
|
||||
self.homeModules.nomarchy
|
||||
{
|
||||
# The single source of truth — pure read: the file is part
|
||||
# of this flake's source.
|
||||
nomarchy.stateFile = ./theme-state.json;
|
||||
home = {
|
||||
inherit username;
|
||||
homeDirectory = "/home/${username}";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
# ─── Live ISO ──────────────────────────────────────────────────
|
||||
# Full desktop on a bootable stick, no installation:
|
||||
# nix build .#nixosConfigurations.nomarchy-live.config.system.build.isoImage
|
||||
# Test in QEMU with tools/test-live-iso.sh. See docs/TESTING.md.
|
||||
nixosConfigurations.nomarchy-live = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = { inherit username; nomarchySrc = self; };
|
||||
modules = [
|
||||
"${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix"
|
||||
self.nixosModules.nomarchy
|
||||
./hosts/live.nix
|
||||
|
||||
# The ISO is a sealed artifact, so the desktop is baked in via
|
||||
# the HM NixOS module (the installed-system split into
|
||||
# nixos-rebuild vs home-manager switch doesn't apply here —
|
||||
# though the seeded ~/.nomarchy flake still allows standalone
|
||||
# `home-manager switch` for theme testing).
|
||||
home-manager.nixosModules.home-manager
|
||||
{
|
||||
home-manager = {
|
||||
useGlobalPkgs = true;
|
||||
useUserPackages = true;
|
||||
users.${username} = {
|
||||
imports = [ self.homeModules.nomarchy ];
|
||||
nomarchy.stateFile = ./theme-state.json;
|
||||
};
|
||||
};
|
||||
|
||||
# Keep the locked flake inputs in the ISO store so theme
|
||||
# switching on the live system works without a network: the
|
||||
# lockfile's narHashes resolve against these paths instead
|
||||
# of fetching from GitHub.
|
||||
system.extraDependencies = [
|
||||
nixpkgs.outPath
|
||||
home-manager.outPath
|
||||
stylix.outPath
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
24
hosts/default/configuration.nix
Normal file
@@ -0,0 +1,24 @@
|
||||
# Reference host — machine specifics ONLY.
|
||||
# The distro itself comes from nixosModules.nomarchy (modules/nixos),
|
||||
# imported in flake.nix. Keep this file boring.
|
||||
{ pkgs, username, ... }:
|
||||
|
||||
{
|
||||
imports = [ ./hardware-configuration.nix ];
|
||||
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||
|
||||
networking.hostName = "nomarchy";
|
||||
time.timeZone = "UTC"; # adjust per machine
|
||||
i18n.defaultLocale = "en_US.UTF-8";
|
||||
|
||||
users.users.${username} = {
|
||||
isNormalUser = true;
|
||||
description = "Nomarchy user";
|
||||
extraGroups = [ "wheel" "networkmanager" "video" "input" ];
|
||||
};
|
||||
|
||||
system.stateVersion = "26.05";
|
||||
}
|
||||
15
hosts/default/hardware-configuration.nix
Normal file
@@ -0,0 +1,15 @@
|
||||
# PLACEHOLDER — replace with the output of `nixos-generate-config` on the
|
||||
# target machine. The mkDefault values below only exist so the flake
|
||||
# evaluates and `nix flake check` passes before first install.
|
||||
{ lib, ... }:
|
||||
|
||||
{
|
||||
boot.initrd.availableKernelModules = lib.mkDefault [ "xhci_pci" "ahci" "nvme" "usbhid" "sd_mod" ];
|
||||
|
||||
fileSystems."/" = lib.mkDefault {
|
||||
device = "/dev/disk/by-label/nixos";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
}
|
||||
85
hosts/live.nix
Normal file
@@ -0,0 +1,85 @@
|
||||
# Live ISO host — boot the full Nomarchy desktop from a USB stick or QEMU
|
||||
# without touching the disk. No installer yet (see roadmap); this target
|
||||
# exists to test the distro end-to-end on real hardware.
|
||||
{ lib, pkgs, username, nomarchySrc, ... }:
|
||||
|
||||
{
|
||||
networking.hostName = "nomarchy-live";
|
||||
|
||||
isoImage.volumeID = lib.mkForce "NOMARCHY_LIVE";
|
||||
isoImage.edition = lib.mkForce "live";
|
||||
|
||||
# The minimal-CD profile enables wpa_supplicant; Nomarchy ships
|
||||
# NetworkManager and the two must not run together.
|
||||
networking.wireless.enable = lib.mkForce false;
|
||||
|
||||
# ── Live user: no password, straight into the desktop ──────────────
|
||||
users.users.${username} = {
|
||||
isNormalUser = true;
|
||||
initialHashedPassword = "";
|
||||
extraGroups = [ "wheel" "networkmanager" "video" "render" "audio" "input" ];
|
||||
};
|
||||
security.sudo.wheelNeedsPassword = false;
|
||||
services.getty.autologinUser = lib.mkForce username;
|
||||
|
||||
# Boot straight into Hyprland once; logging out lands on tuigreet.
|
||||
services.greetd.settings.initial_session = {
|
||||
command = "Hyprland";
|
||||
user = username;
|
||||
};
|
||||
|
||||
# ── Hardware breadth ────────────────────────────────────────────────
|
||||
# Force-loading every GPU driver in the initrd (amdgpu+radeon+nouveau+
|
||||
# i915) panics most machines — only one of them can claim the GPU and
|
||||
# the others explode. `availableKernelModules` lets udev load just the
|
||||
# one that matches; virtio_gpu covers QEMU (tools/test-live-iso.sh).
|
||||
boot.initrd.availableKernelModules = [ "amdgpu" "radeon" "nouveau" "i915" "virtio_gpu" ];
|
||||
services.qemuGuest.enable = lib.mkDefault true;
|
||||
|
||||
# ── The Nomarchy flake on board ─────────────────────────────────────
|
||||
# Read-only copy in /etc (also pins the flake source into the ISO
|
||||
# closure); seeded writable into the live home so theme switching —
|
||||
# state write + `home-manager switch` — works exactly like on an
|
||||
# installed system. $NOMARCHY_PATH already defaults to ~/.nomarchy.
|
||||
environment.etc."nomarchy".source = nomarchySrc;
|
||||
|
||||
systemd.services.nomarchy-seed-flake = {
|
||||
description = "Seed a writable Nomarchy flake into the live user's home";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
serviceConfig.Type = "oneshot";
|
||||
script = ''
|
||||
home=/home/${username}
|
||||
if [ ! -e "$home/.nomarchy" ]; then
|
||||
cp -r ${nomarchySrc} "$home/.nomarchy"
|
||||
chmod -R u+w "$home/.nomarchy"
|
||||
chown -R ${username}:users "$home/.nomarchy"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
services.getty.helpLine = lib.mkForce ''
|
||||
|
||||
Welcome to the Nomarchy live environment.
|
||||
|
||||
The graphical session autologins as '${username}' (no password).
|
||||
Theme switching: nomarchy-theme-sync apply <name> (or SUPER+T)
|
||||
Wallpapers: nomarchy-theme-sync bg next (or SUPER+SHIFT+T)
|
||||
The flake lives at ~/.nomarchy.
|
||||
'';
|
||||
|
||||
# ── Live-session desktop tweaks ─────────────────────────────────────
|
||||
home-manager.users.${username} = {
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
# QEMU (and some panels) report a tiny "preferred" mode; ask for
|
||||
# the highest resolution instead.
|
||||
monitor = lib.mkForce [ ",highres,auto,1" ];
|
||||
# Welcome toast once the session is up (concatenated onto the
|
||||
# base exec-once list).
|
||||
exec-once = [
|
||||
"sh -c 'sleep 3; notify-send -a Nomarchy \"Welcome to Nomarchy\" \"SUPER+Return terminal · SUPER+T themes · SUPER+SHIFT+T wallpaper\"'"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "26.05";
|
||||
}
|
||||
61
modules/home/btop.nix
Normal file
@@ -0,0 +1,61 @@
|
||||
# btop — themed from per-theme assets, baked at eval time.
|
||||
# A hand-made themes/<slug>/btop.theme asset wins; otherwise a theme is
|
||||
# generated from the palette, so custom themes get a themed btop too.
|
||||
{ config, lib, ... }:
|
||||
|
||||
let
|
||||
t = config.nomarchy.theme;
|
||||
c = t.colors;
|
||||
|
||||
asset = config.nomarchy.themesDir + "/${t.slug}/btop.theme";
|
||||
|
||||
generated =
|
||||
let
|
||||
pairs = {
|
||||
main_bg = c.base;
|
||||
main_fg = c.text;
|
||||
title = c.text;
|
||||
hi_fg = c.accent;
|
||||
selected_bg = c.overlay;
|
||||
selected_fg = c.text;
|
||||
inactive_fg = c.muted;
|
||||
graph_text = c.subtext;
|
||||
meter_bg = c.surface;
|
||||
proc_misc = c.accentAlt;
|
||||
cpu_box = c.accent;
|
||||
mem_box = c.good;
|
||||
net_box = c.accentAlt;
|
||||
proc_box = c.surface;
|
||||
div_line = c.overlay;
|
||||
temp_start = c.good;
|
||||
temp_mid = c.warn;
|
||||
temp_end = c.bad;
|
||||
cpu_start = c.good;
|
||||
cpu_mid = c.warn;
|
||||
cpu_end = c.bad;
|
||||
free_start = c.good;
|
||||
used_start = c.warn;
|
||||
download_start = c.accent;
|
||||
upload_start = c.accentAlt;
|
||||
};
|
||||
in
|
||||
lib.concatStringsSep "\n"
|
||||
(lib.mapAttrsToList (k: v: "theme[${k}]=\"${v}\"") pairs) + "\n";
|
||||
in
|
||||
{
|
||||
config = lib.mkIf config.nomarchy.btop.enable {
|
||||
programs.btop = {
|
||||
enable = true;
|
||||
settings = {
|
||||
color_theme = "nomarchy";
|
||||
theme_background = false; # let the terminal's opacity show through
|
||||
vim_keys = true;
|
||||
};
|
||||
};
|
||||
|
||||
xdg.configFile."btop/themes/nomarchy.theme" =
|
||||
if builtins.pathExists asset
|
||||
then { source = asset; }
|
||||
else { text = generated; };
|
||||
};
|
||||
}
|
||||
36
modules/home/default.nix
Normal file
@@ -0,0 +1,36 @@
|
||||
# Nomarchy — Home Manager entry point.
|
||||
# Consume this via homeModules.nomarchy (flake.nix), which also pulls in
|
||||
# the stylix home module that stylix.nix configures.
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./options.nix # the nomarchy.* option surface
|
||||
./theme.nix # ingests theme-state.json, owns the live-sync hooks
|
||||
./stylix.nix # GTK/Qt/cursor/fonts from the same JSON
|
||||
./hyprland.nix
|
||||
./waybar.nix
|
||||
./ghostty.nix
|
||||
./btop.nix
|
||||
];
|
||||
|
||||
home.stateVersion = "26.05";
|
||||
|
||||
home.packages = with pkgs; [
|
||||
swww # wallpaper daemon with animated transitions
|
||||
fuzzel # launcher / dmenu (used by the theme picker bind)
|
||||
libnotify
|
||||
];
|
||||
|
||||
home.sessionVariables = {
|
||||
TERMINAL = config.nomarchy.terminal;
|
||||
NIXOS_OZONE_WL = "1"; # Electron/Chromium native Wayland
|
||||
|
||||
# Where the Nomarchy flake (and therefore theme-state.json) lives on
|
||||
# disk. nomarchy-theme-sync writes its state here; rebuilds read from
|
||||
# here. Clone/symlink your flake to this path.
|
||||
NOMARCHY_PATH = "$HOME/.nomarchy";
|
||||
};
|
||||
|
||||
programs.home-manager.enable = true;
|
||||
}
|
||||
41
modules/home/ghostty.nix
Normal file
@@ -0,0 +1,41 @@
|
||||
# Ghostty — Nomarchy's default terminal, themed from theme-state.json.
|
||||
# Colors, fonts and the full 16-color ANSI palette are baked from the
|
||||
# JSON at eval time.
|
||||
{ config, lib, ... }:
|
||||
|
||||
let
|
||||
t = config.nomarchy.theme;
|
||||
c = t.colors;
|
||||
in
|
||||
{
|
||||
programs.ghostty = lib.mkIf config.nomarchy.ghostty.enable {
|
||||
enable = true;
|
||||
enableBashIntegration = true;
|
||||
|
||||
settings = {
|
||||
# ── Typography (from theme-state.json) ────────────────────────
|
||||
font-family = t.fonts.mono;
|
||||
font-size = t.fonts.size;
|
||||
|
||||
# ── Colors (from theme-state.json) ────────────────────────────
|
||||
background = c.base;
|
||||
foreground = c.text;
|
||||
cursor-color = c.accent;
|
||||
selection-background = c.overlay;
|
||||
selection-foreground = c.text;
|
||||
split-divider-color = c.surface;
|
||||
|
||||
# "N=#rrggbb" entries; Ghostty accepts repeated `palette` keys,
|
||||
# which the HM module renders from this list.
|
||||
palette = lib.imap0 (i: color: "${toString i}=${color}") t.ansi;
|
||||
|
||||
# ── Chrome ────────────────────────────────────────────────────
|
||||
background-opacity = t.ui.terminalOpacity;
|
||||
window-padding-x = 12;
|
||||
window-padding-y = 12;
|
||||
window-decoration = false;
|
||||
gtk-single-instance = true;
|
||||
confirm-close-surface = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
140
modules/home/hyprland.nix
Normal file
@@ -0,0 +1,140 @@
|
||||
# Hyprland — fully driven by config.nomarchy.theme (theme-state.json).
|
||||
# Gaps, borders and colors are baked from the JSON at eval time; theme
|
||||
# changes arrive via `home-manager switch`.
|
||||
{ config, lib, ... }:
|
||||
|
||||
let
|
||||
t = config.nomarchy.theme;
|
||||
c = t.colors;
|
||||
inherit (config.nomarchy.lib) rgb rgba;
|
||||
|
||||
# SUPER+1..9 / SUPER+SHIFT+1..9 workspace binds, generated.
|
||||
workspaceBinds = builtins.concatLists (builtins.genList
|
||||
(i:
|
||||
let ws = toString (i + 1);
|
||||
in [
|
||||
"$mod, ${ws}, workspace, ${ws}"
|
||||
"$mod SHIFT, ${ws}, movetoworkspace, ${ws}"
|
||||
])
|
||||
9);
|
||||
in
|
||||
{
|
||||
wayland.windowManager.hyprland = lib.mkIf config.nomarchy.hyprland.enable {
|
||||
enable = true;
|
||||
# The binary and portal come from the NixOS module
|
||||
# (programs.hyprland.enable); HM only manages configuration.
|
||||
package = null;
|
||||
portalPackage = null;
|
||||
|
||||
settings = {
|
||||
"$mod" = "SUPER";
|
||||
"$terminal" = config.nomarchy.terminal;
|
||||
|
||||
monitor = [ ",preferred,auto,1" ];
|
||||
|
||||
exec-once = [
|
||||
"swww-daemon"
|
||||
# Paint the wallpaper as soon as the session is up (waits for
|
||||
# swww-daemon internally).
|
||||
"nomarchy-theme-sync wallpaper"
|
||||
];
|
||||
|
||||
# ── Theme-driven look ──────────────────────────────────────────
|
||||
general = {
|
||||
gaps_in = t.ui.gapsIn;
|
||||
gaps_out = t.ui.gapsOut;
|
||||
border_size = t.ui.borderSize;
|
||||
"col.active_border" = "${rgb c.accent} ${rgb c.accentAlt} 45deg";
|
||||
"col.inactive_border" = rgb c.overlay;
|
||||
layout = "dwindle";
|
||||
resize_on_border = true;
|
||||
};
|
||||
|
||||
decoration = {
|
||||
rounding = t.ui.rounding;
|
||||
active_opacity = t.ui.activeOpacity;
|
||||
inactive_opacity = t.ui.inactiveOpacity;
|
||||
blur = {
|
||||
enabled = t.ui.blur;
|
||||
size = 8;
|
||||
passes = 2;
|
||||
popups = true;
|
||||
};
|
||||
shadow = {
|
||||
enabled = t.ui.shadow;
|
||||
range = 20;
|
||||
render_power = 3;
|
||||
color = rgba c.mantle "aa";
|
||||
};
|
||||
};
|
||||
|
||||
animations = {
|
||||
enabled = true;
|
||||
bezier = [
|
||||
"smooth, 0.25, 0.1, 0.25, 1.0"
|
||||
"snappy, 0.6, 0.0, 0.1, 1.0"
|
||||
];
|
||||
animation = [
|
||||
"windows, 1, 4, snappy, popin 85%"
|
||||
"border, 1, 8, smooth"
|
||||
"fade, 1, 5, smooth"
|
||||
"workspaces, 1, 4, snappy, slidefade 15%"
|
||||
];
|
||||
};
|
||||
|
||||
# ── Behaviour ──────────────────────────────────────────────────
|
||||
input = {
|
||||
kb_layout = "us";
|
||||
follow_mouse = 1;
|
||||
touchpad.natural_scroll = true;
|
||||
};
|
||||
|
||||
dwindle = {
|
||||
pseudotile = true;
|
||||
preserve_split = true;
|
||||
};
|
||||
|
||||
misc = {
|
||||
disable_hyprland_logo = true;
|
||||
force_default_wallpaper = 0;
|
||||
};
|
||||
|
||||
bind = [
|
||||
"$mod, Return, exec, $terminal"
|
||||
"$mod, D, exec, fuzzel"
|
||||
"$mod, Q, killactive"
|
||||
"$mod, F, fullscreen"
|
||||
"$mod, V, togglefloating"
|
||||
"$mod SHIFT, E, exit"
|
||||
|
||||
# Theme picker: fuzzel menu over the presets; apply writes the
|
||||
# state and runs home-manager switch (progress via notify-send).
|
||||
"$mod, T, exec, nomarchy-theme-sync apply \"$(nomarchy-theme-sync list | fuzzel --dmenu --prompt 'theme> ')\""
|
||||
# Cycle the current theme's wallpapers (instant, no rebuild).
|
||||
"$mod SHIFT, T, exec, nomarchy-theme-sync bg next"
|
||||
|
||||
# Focus
|
||||
"$mod, H, movefocus, l"
|
||||
"$mod, L, movefocus, r"
|
||||
"$mod, K, movefocus, u"
|
||||
"$mod, J, movefocus, d"
|
||||
|
||||
# Screenshot region to clipboard
|
||||
", Print, exec, grim -g \"$(slurp)\" - | wl-copy"
|
||||
] ++ workspaceBinds;
|
||||
|
||||
binde = [
|
||||
", XF86AudioRaiseVolume, exec, pamixer -i 5"
|
||||
", XF86AudioLowerVolume, exec, pamixer -d 5"
|
||||
", XF86AudioMute, exec, pamixer -t"
|
||||
", XF86MonBrightnessUp, exec, brightnessctl set +5%"
|
||||
", XF86MonBrightnessDown, exec, brightnessctl set 5%-"
|
||||
];
|
||||
|
||||
bindm = [
|
||||
"$mod, mouse:272, movewindow"
|
||||
"$mod, mouse:273, resizewindow"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
64
modules/home/options.nix
Normal file
@@ -0,0 +1,64 @@
|
||||
# User-level `nomarchy.*` options — the full surface downstream users
|
||||
# configure in their home.nix. Kept small on purpose.
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
options.nomarchy = {
|
||||
# ── Required ───────────────────────────────────────────────────
|
||||
stateFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
example = lib.literalExpression "./theme-state.json";
|
||||
description = ''
|
||||
Path to theme-state.json, the single source of truth for all UI
|
||||
configuration. Must live inside your flake (so evaluation stays
|
||||
pure) and be git-tracked. nomarchy-theme-sync writes to the
|
||||
on-disk copy; rebuilds bake it into the generation.
|
||||
'';
|
||||
};
|
||||
|
||||
# ── Preferences ────────────────────────────────────────────────
|
||||
terminal = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "ghostty";
|
||||
description = "Terminal emulator command, used by keybinds and $TERMINAL.";
|
||||
};
|
||||
|
||||
package = lib.mkOption {
|
||||
type = lib.types.package;
|
||||
default = pkgs.nomarchy-theme-sync;
|
||||
defaultText = lib.literalExpression "pkgs.nomarchy-theme-sync";
|
||||
description = "The nomarchy-theme-sync package (provided by overlays.default).";
|
||||
};
|
||||
|
||||
themesDir = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
default = ../../themes;
|
||||
defaultText = lib.literalExpression "\"\${nomarchy}/themes\"";
|
||||
description = ''
|
||||
Theme presets/assets directory probed at eval time for per-theme
|
||||
app overrides (<slug>/waybar.css, <slug>/waybar.jsonc). Point it
|
||||
at your own directory to ship custom layouts downstream.
|
||||
'';
|
||||
};
|
||||
|
||||
# ── Component toggles ──────────────────────────────────────────
|
||||
hyprland.enable = lib.mkEnableOption "Nomarchy's Hyprland configuration" // { default = true; };
|
||||
waybar.enable = lib.mkEnableOption "Nomarchy's Waybar configuration" // { default = true; };
|
||||
ghostty.enable = lib.mkEnableOption "Nomarchy's Ghostty configuration" // { default = true; };
|
||||
btop.enable = lib.mkEnableOption "btop with the per-theme nomarchy theme" // { default = true; };
|
||||
stylix.enable = lib.mkEnableOption "Stylix theming for the long tail of apps (GTK, Qt, cursors)" // { default = true; };
|
||||
|
||||
# ── Computed (read-only) ───────────────────────────────────────
|
||||
theme = lib.mkOption {
|
||||
type = lib.types.attrs;
|
||||
readOnly = true;
|
||||
description = "The parsed theme state (stateFile merged over defaults).";
|
||||
};
|
||||
|
||||
lib = lib.mkOption {
|
||||
type = lib.types.attrs;
|
||||
readOnly = true;
|
||||
description = "Color-format helpers shared by the theme consumers.";
|
||||
};
|
||||
};
|
||||
}
|
||||
79
modules/home/stylix.nix
Normal file
@@ -0,0 +1,79 @@
|
||||
# Stylix — themes the long tail of applications (GTK, Qt, cursors,
|
||||
# fonts) from the same theme-state.json that drives the live engine.
|
||||
#
|
||||
# Division of labour: the hot-reload trio (Hyprland, Waybar, Ghostty)
|
||||
# is owned by the Nomarchy engine and updates instantly; everything
|
||||
# Stylix touches updates on the next home-manager switch. That is why
|
||||
# autoEnable is off and the trio's Stylix targets stay disabled.
|
||||
#
|
||||
# Note: the stylix home module itself is imported by homeModules.nomarchy
|
||||
# in flake.nix (it needs the stylix flake input).
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.nomarchy;
|
||||
t = cfg.theme;
|
||||
c = t.colors;
|
||||
hex = lib.removePrefix "#";
|
||||
|
||||
# Map the Nomarchy palette onto base16 roles.
|
||||
base16 = {
|
||||
base00 = hex c.base; # default background
|
||||
base01 = hex c.mantle; # darker background (status bars)
|
||||
base02 = hex c.surface; # selection background
|
||||
base03 = hex c.muted; # comments
|
||||
base04 = hex c.subtext; # dark foreground
|
||||
base05 = hex c.text; # default foreground
|
||||
base06 = hex c.text; # light foreground
|
||||
base07 = hex c.text; # lightest foreground
|
||||
base08 = hex c.bad; # red
|
||||
base09 = hex c.warn; # orange
|
||||
base0A = hex c.warn; # yellow
|
||||
base0B = hex c.good; # green
|
||||
base0C = hex (builtins.elemAt t.ansi 6); # cyan
|
||||
base0D = hex c.accent; # blue
|
||||
base0E = hex c.accentAlt;# magenta
|
||||
base0F = hex c.bad; # brown/deprecated
|
||||
};
|
||||
in
|
||||
{
|
||||
config = lib.mkIf cfg.stylix.enable {
|
||||
stylix = {
|
||||
enable = true;
|
||||
autoEnable = false; # explicit targets only — the engine owns the rest
|
||||
polarity = if t.mode == "light" then "light" else "dark";
|
||||
base16Scheme = base16;
|
||||
|
||||
targets = {
|
||||
gtk.enable = true;
|
||||
qt.enable = true;
|
||||
};
|
||||
|
||||
cursor = {
|
||||
name = lib.mkDefault "Bibata-Modern-Classic";
|
||||
package = lib.mkDefault pkgs.bibata-cursors;
|
||||
size = lib.mkDefault 24;
|
||||
};
|
||||
|
||||
fonts = {
|
||||
monospace = {
|
||||
name = t.fonts.mono;
|
||||
package = lib.mkDefault pkgs.nerd-fonts.jetbrains-mono;
|
||||
};
|
||||
sansSerif = {
|
||||
name = t.fonts.ui;
|
||||
package = lib.mkDefault pkgs.inter;
|
||||
};
|
||||
serif = {
|
||||
name = t.fonts.ui;
|
||||
package = lib.mkDefault pkgs.inter;
|
||||
};
|
||||
emoji = {
|
||||
name = "Noto Color Emoji";
|
||||
package = lib.mkDefault pkgs.noto-fonts-color-emoji;
|
||||
};
|
||||
sizes.terminal = t.fonts.size;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
69
modules/home/theme.nix
Normal file
@@ -0,0 +1,69 @@
|
||||
# Nomarchy theming engine.
|
||||
#
|
||||
# nomarchy.stateFile (theme-state.json, inside the consuming flake) is
|
||||
# ingested at evaluation time — pure, because flake files are store
|
||||
# paths — and exposed to every other module as `config.nomarchy.theme`.
|
||||
#
|
||||
# Theme changes are fully Home Manager managed: `nomarchy-theme-sync
|
||||
# apply <theme>` writes the JSON and runs `home-manager switch`, baking
|
||||
# everything (Hyprland, Waybar, Ghostty, btop, Stylix) into one
|
||||
# read-only generation. No runtime patching, no partial states; theme
|
||||
# history is generation history.
|
||||
#
|
||||
# The one runtime exception is the wallpaper (swww is imperative by
|
||||
# nature): applied at session start, after every switch (hook below),
|
||||
# and cycled instantly with `nomarchy-theme-sync bg next`.
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.nomarchy;
|
||||
|
||||
themeState = builtins.fromJSON (builtins.readFile cfg.stateFile);
|
||||
|
||||
# Defaults guarantee evaluation succeeds on a sparse or older state
|
||||
# file (e.g. one written before a schema field was added). The shipped
|
||||
# Tokyo Night preset provides the color/ansi fallbacks; the path is
|
||||
# relative to this module, so it resolves inside Nomarchy's own flake
|
||||
# source even when consumed downstream.
|
||||
preset = builtins.fromJSON (builtins.readFile ../../themes/tokyo-night.json);
|
||||
|
||||
defaults = preset // {
|
||||
fonts = {
|
||||
mono = "JetBrainsMono Nerd Font";
|
||||
ui = "Inter";
|
||||
size = 11;
|
||||
};
|
||||
ui = {
|
||||
gapsIn = 5;
|
||||
gapsOut = 12;
|
||||
borderSize = 2;
|
||||
rounding = 10;
|
||||
activeOpacity = 1.0;
|
||||
inactiveOpacity = 0.95;
|
||||
terminalOpacity = 0.96;
|
||||
blur = true;
|
||||
shadow = true;
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
config = {
|
||||
nomarchy.theme = lib.recursiveUpdate defaults themeState;
|
||||
|
||||
nomarchy.lib = {
|
||||
# "#7aa2f7" -> "rgb(7aa2f7)" (Hyprland color syntax)
|
||||
rgb = c: "rgb(${lib.removePrefix "#" c})";
|
||||
# "#16161e" -> "rgba(16161eaa)" (Hyprland color + hex alpha)
|
||||
rgba = c: alpha: "rgba(${lib.removePrefix "#" c}${alpha})";
|
||||
};
|
||||
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
# After a switch the new theme's wallpaper should show without
|
||||
# logging out. Best-effort: outside a graphical session swww isn't
|
||||
# running and this is a no-op.
|
||||
home.activation.nomarchyWallpaper = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||
run ${lib.getExe cfg.package} --quiet wallpaper || true
|
||||
'';
|
||||
};
|
||||
}
|
||||
155
modules/home/waybar.nix
Normal file
@@ -0,0 +1,155 @@
|
||||
# Waybar — two-tier theming:
|
||||
#
|
||||
# 1. Default: structure, fonts, geometry AND palette baked from
|
||||
# theme-state.json (colors as GTK named colors, @define-color).
|
||||
#
|
||||
# 2. Whole-swap: themes with their own visual identity ship
|
||||
# <themesDir>/<slug>/waybar.css (and optionally waybar.jsonc) which
|
||||
# replace the generated style/layout entirely. Probed at eval time —
|
||||
# pure, it's flake source.
|
||||
{ config, lib, ... }:
|
||||
|
||||
let
|
||||
t = config.nomarchy.theme;
|
||||
|
||||
# Per-theme override probe.
|
||||
assetDir = config.nomarchy.themesDir + "/${t.slug}";
|
||||
styleOverride = assetDir + "/waybar.css";
|
||||
configOverride = assetDir + "/waybar.jsonc";
|
||||
hasStyleOverride = builtins.pathExists styleOverride;
|
||||
hasConfigOverride = builtins.pathExists configOverride;
|
||||
|
||||
# The palette as GTK named colors, straight from the JSON.
|
||||
colorDefs = lib.concatStringsSep "\n"
|
||||
(lib.mapAttrsToList (name: value: "@define-color ${name} ${value};") t.colors);
|
||||
|
||||
generatedSettings = {
|
||||
layer = "top";
|
||||
position = "top";
|
||||
height = 34;
|
||||
margin-top = t.ui.gapsOut;
|
||||
margin-left = t.ui.gapsOut;
|
||||
margin-right = t.ui.gapsOut;
|
||||
spacing = 8;
|
||||
|
||||
# waybar re-reads style.css when it changes on disk, so a
|
||||
# home-manager switch restyles the running bar without a restart.
|
||||
reload_style_on_change = true;
|
||||
|
||||
modules-left = [ "hyprland/workspaces" "hyprland/window" ];
|
||||
modules-center = [ "clock" ];
|
||||
modules-right = [ "tray" "pulseaudio" "network" "cpu" "memory" "battery" ];
|
||||
|
||||
"hyprland/workspaces" = {
|
||||
format = "{icon}";
|
||||
on-click = "activate";
|
||||
};
|
||||
|
||||
"hyprland/window" = {
|
||||
max-length = 48;
|
||||
separate-outputs = true;
|
||||
};
|
||||
|
||||
clock = {
|
||||
format = "{:%H:%M}";
|
||||
format-alt = "{:%A %d %B %Y}";
|
||||
tooltip-format = "<tt><small>{calendar}</small></tt>";
|
||||
};
|
||||
|
||||
pulseaudio = {
|
||||
format = "{icon} {volume}%";
|
||||
format-muted = "";
|
||||
format-icons.default = [ "" "" "" ];
|
||||
on-click = "pamixer -t";
|
||||
};
|
||||
|
||||
network = {
|
||||
format-wifi = " {essid}";
|
||||
format-ethernet = "";
|
||||
format-disconnected = "";
|
||||
tooltip-format = "{ipaddr} via {gwaddr}";
|
||||
};
|
||||
|
||||
cpu.format = " {usage}%";
|
||||
memory.format = " {percentage}%";
|
||||
|
||||
battery = {
|
||||
states = { warning = 25; critical = 10; };
|
||||
format = "{icon} {capacity}%";
|
||||
format-charging = " {capacity}%";
|
||||
format-icons = [ "" "" "" "" "" ];
|
||||
};
|
||||
|
||||
tray.spacing = 8;
|
||||
};
|
||||
|
||||
generatedStyle = ''
|
||||
/* Palette baked from theme-state.json */
|
||||
${colorDefs}
|
||||
|
||||
* {
|
||||
font-family: "${t.fonts.ui}", "${t.fonts.mono}";
|
||||
font-size: ${toString t.fonts.size}pt;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
background: alpha(@base, 0.85);
|
||||
color: @text;
|
||||
border: ${toString t.ui.borderSize}px solid alpha(@accent, 0.4);
|
||||
border-radius: ${toString t.ui.rounding}px;
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
padding: 0 8px;
|
||||
color: @muted;
|
||||
border-radius: ${toString t.ui.rounding}px;
|
||||
}
|
||||
|
||||
#workspaces button.active {
|
||||
color: @base;
|
||||
background: @accent;
|
||||
}
|
||||
|
||||
#workspaces button.urgent {
|
||||
color: @base;
|
||||
background: @bad;
|
||||
}
|
||||
|
||||
#window {
|
||||
color: @subtext;
|
||||
padding: 0 12px;
|
||||
}
|
||||
|
||||
#clock {
|
||||
color: @text;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#tray, #pulseaudio, #network, #cpu, #memory, #battery {
|
||||
color: @subtext;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
#pulseaudio.muted { color: @muted; }
|
||||
#battery.warning { color: @warn; }
|
||||
#battery.critical { color: @bad; }
|
||||
#battery.charging { color: @good; }
|
||||
'';
|
||||
in
|
||||
{
|
||||
programs.waybar = lib.mkIf config.nomarchy.waybar.enable {
|
||||
enable = true;
|
||||
systemd.enable = true; # started/stopped with graphical-session.target
|
||||
|
||||
settings.mainBar =
|
||||
if hasConfigOverride
|
||||
then builtins.fromJSON (builtins.readFile configOverride)
|
||||
else generatedSettings;
|
||||
|
||||
style =
|
||||
if hasStyleOverride
|
||||
then builtins.readFile styleOverride
|
||||
else generatedStyle;
|
||||
};
|
||||
}
|
||||
100
modules/nixos/default.nix
Normal file
@@ -0,0 +1,100 @@
|
||||
# Nomarchy — reusable system layer (NixOS 26.05).
|
||||
#
|
||||
# This module is the distro: import it from any host (see
|
||||
# nixosModules.nomarchy in flake.nix) and layer your machine specifics
|
||||
# (bootloader, hostname, users, hardware) on top. Host concerns are
|
||||
# deliberately NOT set here. Everything user-facing (Hyprland config,
|
||||
# Waybar, Ghostty, theming) lives in modules/home.
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.nomarchy.system;
|
||||
in
|
||||
{
|
||||
imports = [ ./options.nix ];
|
||||
|
||||
config = {
|
||||
# ── Wayland session: Hyprland ────────────────────────────────────
|
||||
# Installs the binary, registers the session, wires up
|
||||
# xdg-desktop-portal-hyprland. Configuration is Home Manager's job.
|
||||
programs.hyprland.enable = lib.mkDefault true;
|
||||
|
||||
xdg.portal = {
|
||||
enable = lib.mkDefault true;
|
||||
extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; # file pickers, etc.
|
||||
};
|
||||
|
||||
services.greetd = lib.mkIf cfg.greeter.enable {
|
||||
enable = lib.mkDefault true;
|
||||
settings.default_session = {
|
||||
command = lib.mkDefault "${pkgs.greetd.tuigreet}/bin/tuigreet --time --remember --cmd Hyprland";
|
||||
user = "greeter";
|
||||
};
|
||||
};
|
||||
|
||||
# ── Audio: Pipewire ──────────────────────────────────────────────
|
||||
security.rtkit.enable = lib.mkDefault cfg.audio.enable;
|
||||
services.pulseaudio.enable = lib.mkDefault false;
|
||||
services.pipewire = lib.mkIf cfg.audio.enable {
|
||||
enable = lib.mkDefault true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
wireplumber.enable = true;
|
||||
};
|
||||
|
||||
# ── Desktop services ─────────────────────────────────────────────
|
||||
security.polkit.enable = lib.mkDefault true;
|
||||
services.gnome.gnome-keyring.enable = lib.mkDefault true;
|
||||
services.dbus.enable = lib.mkDefault true;
|
||||
services.upower.enable = lib.mkDefault true;
|
||||
networking.networkmanager.enable = lib.mkDefault true;
|
||||
|
||||
hardware.bluetooth.enable = lib.mkDefault cfg.bluetooth.enable;
|
||||
services.blueman.enable = lib.mkDefault cfg.bluetooth.enable;
|
||||
|
||||
# ── Fonts ────────────────────────────────────────────────────────
|
||||
fonts = {
|
||||
packages = with pkgs; [
|
||||
nerd-fonts.jetbrains-mono
|
||||
inter
|
||||
noto-fonts
|
||||
noto-fonts-color-emoji
|
||||
];
|
||||
fontconfig.defaultFonts = {
|
||||
monospace = lib.mkDefault [ "JetBrainsMono Nerd Font" ];
|
||||
sansSerif = lib.mkDefault [ "Inter" ];
|
||||
emoji = lib.mkDefault [ "Noto Color Emoji" ];
|
||||
};
|
||||
};
|
||||
|
||||
# ── Essential packages ───────────────────────────────────────────
|
||||
environment.systemPackages = with pkgs; [
|
||||
nomarchy-theme-sync # provided by overlays.default
|
||||
git
|
||||
vim
|
||||
wget
|
||||
curl
|
||||
jq
|
||||
brightnessctl
|
||||
playerctl
|
||||
pamixer
|
||||
wl-clipboard
|
||||
grim
|
||||
slurp
|
||||
];
|
||||
|
||||
# ── Nix itself ───────────────────────────────────────────────────
|
||||
nix = {
|
||||
settings = {
|
||||
experimental-features = [ "nix-command" "flakes" ];
|
||||
auto-optimise-store = lib.mkDefault true;
|
||||
};
|
||||
gc = {
|
||||
automatic = lib.mkDefault true;
|
||||
dates = lib.mkDefault "weekly";
|
||||
options = lib.mkDefault "--delete-older-than 14d";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
14
modules/nixos/options.nix
Normal file
@@ -0,0 +1,14 @@
|
||||
# System-level `nomarchy.system.*` options.
|
||||
#
|
||||
# Deliberately small: only things a downstream user plausibly disagrees
|
||||
# with get a toggle. Everything else in the system module is set with
|
||||
# lib.mkDefault, so plain NixOS options override it natively.
|
||||
{ lib, ... }:
|
||||
|
||||
{
|
||||
options.nomarchy.system = {
|
||||
greeter.enable = lib.mkEnableOption "the greetd/tuigreet login screen" // { default = true; };
|
||||
audio.enable = lib.mkEnableOption "the Pipewire audio stack" // { default = true; };
|
||||
bluetooth.enable = lib.mkEnableOption "Bluetooth support with blueman" // { default = true; };
|
||||
};
|
||||
}
|
||||
49
pkgs/nomarchy-theme-sync/default.nix
Normal file
@@ -0,0 +1,49 @@
|
||||
{ lib
|
||||
, stdenvNoCC
|
||||
, python3
|
||||
, makeWrapper
|
||||
, swww
|
||||
, libnotify
|
||||
, git
|
||||
# Shipped theme presets, baked into the package as a fallback so
|
||||
# `list`/`apply` work even when $NOMARCHY_PATH has no themes/ dir.
|
||||
, themesDir ? null
|
||||
}:
|
||||
|
||||
stdenvNoCC.mkDerivation {
|
||||
pname = "nomarchy-theme-sync";
|
||||
version = "0.4.0";
|
||||
|
||||
src = ./.;
|
||||
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
buildInputs = [ python3 ];
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
install -Dm755 nomarchy-theme-sync.py $out/bin/nomarchy-theme-sync
|
||||
patchShebangs $out/bin/nomarchy-theme-sync
|
||||
|
||||
${lib.optionalString (themesDir != null) ''
|
||||
mkdir -p $out/share/nomarchy
|
||||
cp -r ${themesDir} $out/share/nomarchy/themes
|
||||
''}
|
||||
|
||||
# Stdlib-only Python. home-manager is deliberately NOT wrapped in —
|
||||
# the rebuild must use the user's own home-manager from their PATH.
|
||||
wrapProgram $out/bin/nomarchy-theme-sync \
|
||||
--prefix PATH : ${lib.makeBinPath [ swww libnotify git ]} \
|
||||
${lib.optionalString (themesDir != null)
|
||||
"--set NOMARCHY_DEFAULT_THEMES $out/share/nomarchy/themes"}
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
meta = {
|
||||
description = "Nomarchy theming: JSON state writer + Home Manager rebuild dispatcher";
|
||||
license = lib.licenses.mit;
|
||||
mainProgram = "nomarchy-theme-sync";
|
||||
platforms = lib.platforms.linux;
|
||||
};
|
||||
}
|
||||
327
pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py
Normal file
@@ -0,0 +1,327 @@
|
||||
#!/usr/bin/env python3
|
||||
"""nomarchy-theme-sync — state writer for Nomarchy's declarative theming.
|
||||
|
||||
Single source of truth: $NOMARCHY_PATH/theme-state.json (inside the flake,
|
||||
read purely by Home Manager via the nomarchy.stateFile option).
|
||||
|
||||
Theme changes are applied by Home Manager: this tool writes the new state
|
||||
and runs `home-manager switch` (override with $NOMARCHY_REBUILD, or skip
|
||||
with --no-switch). All app theming — Hyprland, Waybar, Ghostty, btop,
|
||||
Stylix — is baked into the generation; nothing is patched at runtime.
|
||||
|
||||
The one runtime exception is the wallpaper: swww is imperative by nature,
|
||||
so `bg next` cycles instantly and `wallpaper` (re-)applies the current one
|
||||
at session start and after a switch.
|
||||
|
||||
Commands:
|
||||
list list theme presets
|
||||
apply <name|file.json> merge a preset into the state + rebuild
|
||||
set <dotted.path> <value> tweak one key (e.g. `set ui.gapsOut 16`) + rebuild
|
||||
get [dotted.path] print the current state (or one key)
|
||||
wallpaper apply the current wallpaper via swww
|
||||
bg [next|auto] cycle the theme's wallpapers (instant, no rebuild)
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import shlex
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
# ─── Paths ────────────────────────────────────────────────────────────────
|
||||
|
||||
FLAKE_DIR = Path(os.environ.get("NOMARCHY_PATH", Path.home() / ".nomarchy")).expanduser()
|
||||
STATE_FILE = FLAKE_DIR / "theme-state.json"
|
||||
|
||||
# Preset search path: the user's flake first (their custom themes win),
|
||||
# then the presets baked into this package by the Nix build.
|
||||
THEMES_DIRS = [FLAKE_DIR / "themes"]
|
||||
if os.environ.get("NOMARCHY_DEFAULT_THEMES"):
|
||||
THEMES_DIRS.append(Path(os.environ["NOMARCHY_DEFAULT_THEMES"]))
|
||||
|
||||
WALLPAPER_EXTS = {".png", ".jpg", ".jpeg", ".webp"}
|
||||
|
||||
QUIET = False
|
||||
|
||||
|
||||
def log(msg: str) -> None:
|
||||
if not QUIET:
|
||||
print(f"nomarchy-theme-sync: {msg}")
|
||||
|
||||
|
||||
def die(msg: str) -> "None":
|
||||
print(f"nomarchy-theme-sync: error: {msg}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def notify(body: str) -> None:
|
||||
if shutil.which("notify-send"):
|
||||
subprocess.run(["notify-send", "-a", "Nomarchy", "Nomarchy", body],
|
||||
capture_output=True)
|
||||
|
||||
|
||||
# ─── State management ─────────────────────────────────────────────────────
|
||||
|
||||
def load_state(path: Path = STATE_FILE) -> dict:
|
||||
try:
|
||||
return json.loads(path.read_text())
|
||||
except FileNotFoundError:
|
||||
die(f"state file not found: {path} (set $NOMARCHY_PATH to your flake checkout)")
|
||||
except json.JSONDecodeError as e:
|
||||
die(f"invalid JSON in {path}: {e}")
|
||||
|
||||
|
||||
def write_state(state: dict) -> None:
|
||||
"""Atomic write: render to a temp file in the same dir, then rename."""
|
||||
STATE_FILE.parent.mkdir(parents=True, exist_ok=True)
|
||||
fd, tmp = tempfile.mkstemp(dir=STATE_FILE.parent, prefix=".theme-state.", suffix=".json")
|
||||
try:
|
||||
with os.fdopen(fd, "w") as f:
|
||||
json.dump(state, f, indent=2)
|
||||
f.write("\n")
|
||||
os.replace(tmp, STATE_FILE)
|
||||
except BaseException:
|
||||
os.unlink(tmp)
|
||||
raise
|
||||
log(f"state written to {STATE_FILE}")
|
||||
|
||||
# Flakes only see git-tracked files. theme-state.json ships tracked,
|
||||
# but make sure a fresh checkout / reset can't silently hide it.
|
||||
if (FLAKE_DIR / ".git").exists() and shutil.which("git"):
|
||||
subprocess.run(
|
||||
["git", "-C", str(FLAKE_DIR), "add", "--intent-to-add", "theme-state.json"],
|
||||
capture_output=True,
|
||||
)
|
||||
|
||||
|
||||
def deep_merge(base: dict, override: dict) -> dict:
|
||||
out = dict(base)
|
||||
for k, v in override.items():
|
||||
if isinstance(v, dict) and isinstance(out.get(k), dict):
|
||||
out[k] = deep_merge(out[k], v)
|
||||
else:
|
||||
out[k] = v
|
||||
return out
|
||||
|
||||
|
||||
# ─── Rebuild dispatch ─────────────────────────────────────────────────────
|
||||
|
||||
def run_switch() -> None:
|
||||
"""Bake the new state into a Home Manager generation."""
|
||||
override = os.environ.get("NOMARCHY_REBUILD")
|
||||
argv = shlex.split(override) if override else \
|
||||
["home-manager", "switch", "--flake", str(FLAKE_DIR)]
|
||||
|
||||
if shutil.which(argv[0]) is None:
|
||||
log(f"'{argv[0]}' not found — state written; rebuild manually to apply")
|
||||
return
|
||||
|
||||
log(f"rebuilding: {' '.join(argv)}")
|
||||
notify("Applying theme — rebuilding the desktop…")
|
||||
result = subprocess.run(argv) # stream output to the caller's terminal
|
||||
if result.returncode != 0:
|
||||
notify("Theme rebuild FAILED — see terminal / journal")
|
||||
die("rebuild failed (state file already updated; fix and re-run)")
|
||||
notify("Theme applied ✓")
|
||||
|
||||
|
||||
# ─── Theme assets (wallpapers) ────────────────────────────────────────────
|
||||
# Convention: a preset themes/<slug>.json may have a sibling directory
|
||||
# themes/<slug>/ with assets: backgrounds/ (wallpapers), btop.theme,
|
||||
# waybar.css / waybar.jsonc. All except backgrounds/ are consumed by the
|
||||
# Nix modules at eval time; wallpapers are applied here via swww.
|
||||
|
||||
def find_asset(slug: str, name: str):
|
||||
for themes_dir in THEMES_DIRS:
|
||||
candidate = themes_dir / slug / name
|
||||
if candidate.exists():
|
||||
return candidate
|
||||
return None
|
||||
|
||||
|
||||
def backgrounds_for(slug: str) -> list:
|
||||
bg_dir = find_asset(slug, "backgrounds")
|
||||
if bg_dir is None or not bg_dir.is_dir():
|
||||
return []
|
||||
return sorted(p for p in bg_dir.iterdir() if p.suffix.lower() in WALLPAPER_EXTS)
|
||||
|
||||
|
||||
def resolve_wallpaper(state: dict):
|
||||
"""Explicit path in the state wins; empty means 'first theme background'."""
|
||||
explicit = state.get("wallpaper", "")
|
||||
if explicit:
|
||||
path = Path(explicit).expanduser()
|
||||
if path.is_file():
|
||||
return path
|
||||
log(f"wallpaper not found, using theme default: {explicit}")
|
||||
backgrounds = backgrounds_for(state.get("slug", ""))
|
||||
return backgrounds[0] if backgrounds else None
|
||||
|
||||
|
||||
def apply_wallpaper(state: dict, wait: bool = False) -> None:
|
||||
wallpaper = resolve_wallpaper(state)
|
||||
if wallpaper is None:
|
||||
log(f"no wallpaper for theme '{state.get('slug', '?')}', skipping")
|
||||
return
|
||||
if shutil.which("swww") is None:
|
||||
log("swww not found, skipping wallpaper")
|
||||
return
|
||||
# At session start swww-daemon may still be coming up.
|
||||
for _ in range(10 if wait else 1):
|
||||
if subprocess.run(["swww", "query"], capture_output=True).returncode == 0:
|
||||
break
|
||||
time.sleep(0.5)
|
||||
result = subprocess.run(
|
||||
["swww", "img", str(wallpaper),
|
||||
"--transition-type", "grow",
|
||||
"--transition-pos", "center",
|
||||
"--transition-duration", "1",
|
||||
"--transition-fps", "60"],
|
||||
capture_output=True,
|
||||
)
|
||||
log(f"wallpaper: {wallpaper.name}" if result.returncode == 0
|
||||
else "wallpaper: swww failed (daemon not running?)")
|
||||
|
||||
|
||||
# ─── Commands ─────────────────────────────────────────────────────────────
|
||||
|
||||
def find_preset(name: str):
|
||||
for themes_dir in THEMES_DIRS:
|
||||
candidate = themes_dir / f"{name}.json"
|
||||
if candidate.is_file():
|
||||
return candidate
|
||||
return None
|
||||
|
||||
|
||||
def cmd_list(_args) -> None:
|
||||
names = sorted({f.stem for d in THEMES_DIRS if d.is_dir() for f in d.glob("*.json")})
|
||||
if not names:
|
||||
die(f"no theme presets found (searched: {', '.join(map(str, THEMES_DIRS))})")
|
||||
print("\n".join(names))
|
||||
|
||||
|
||||
def cmd_apply(args) -> None:
|
||||
candidate = Path(args.theme).expanduser()
|
||||
preset_path = candidate if candidate.is_file() else find_preset(args.theme)
|
||||
if preset_path is None:
|
||||
die(f"unknown theme '{args.theme}' (try `nomarchy-theme-sync list`)")
|
||||
|
||||
preset = json.loads(preset_path.read_text())
|
||||
# Merge over current state: presets define palette/name/wallpaper,
|
||||
# user tweaks (gaps, fonts) outside the preset survive.
|
||||
state = deep_merge(load_state(), preset)
|
||||
write_state(state)
|
||||
log(f"theme: {state.get('name', args.theme)}")
|
||||
if not args.no_switch:
|
||||
run_switch()
|
||||
apply_wallpaper(state)
|
||||
|
||||
|
||||
def cmd_set(args) -> None:
|
||||
state = load_state()
|
||||
try:
|
||||
value = json.loads(args.value) # numbers, bools, null, quoted strings
|
||||
except json.JSONDecodeError:
|
||||
value = args.value # bare string ("#7aa2f7", font names, paths)
|
||||
|
||||
node = state
|
||||
keys = args.path.split(".")
|
||||
for key in keys[:-1]:
|
||||
node = node.setdefault(key, {})
|
||||
if not isinstance(node, dict):
|
||||
die(f"cannot descend into non-object at '{key}' in '{args.path}'")
|
||||
node[keys[-1]] = value
|
||||
|
||||
write_state(state)
|
||||
log(f"set {args.path} = {value!r}")
|
||||
if not args.no_switch:
|
||||
run_switch()
|
||||
apply_wallpaper(state)
|
||||
|
||||
|
||||
def cmd_get(args) -> None:
|
||||
state = load_state()
|
||||
if args.path:
|
||||
node = state
|
||||
for key in args.path.split("."):
|
||||
try:
|
||||
node = node[key]
|
||||
except (KeyError, TypeError):
|
||||
die(f"no such key: {args.path}")
|
||||
print(json.dumps(node, indent=2) if isinstance(node, (dict, list)) else node)
|
||||
else:
|
||||
print(json.dumps(state, indent=2))
|
||||
|
||||
|
||||
def cmd_wallpaper(_args) -> None:
|
||||
"""Apply the current wallpaper (session start, post-switch hook)."""
|
||||
apply_wallpaper(load_state(), wait=True)
|
||||
|
||||
|
||||
def cmd_bg(args) -> None:
|
||||
"""Cycle the theme's wallpapers — instant, no rebuild needed (the
|
||||
wallpaper is runtime state for swww; nothing in Nix consumes it)."""
|
||||
state = load_state()
|
||||
if args.action == "auto":
|
||||
state["wallpaper"] = ""
|
||||
else: # next
|
||||
backgrounds = backgrounds_for(state.get("slug", ""))
|
||||
if not backgrounds:
|
||||
die(f"theme '{state.get('slug', '?')}' has no backgrounds/ directory")
|
||||
current = resolve_wallpaper(state)
|
||||
idx = (backgrounds.index(current) + 1) % len(backgrounds) if current in backgrounds else 0
|
||||
state["wallpaper"] = str(backgrounds[idx])
|
||||
write_state(state)
|
||||
apply_wallpaper(state)
|
||||
|
||||
|
||||
# ─── Entry point ──────────────────────────────────────────────────────────
|
||||
|
||||
def main() -> None:
|
||||
global QUIET
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="nomarchy-theme-sync",
|
||||
description="Nomarchy theming — state writer + Home Manager rebuild dispatcher.",
|
||||
)
|
||||
parser.add_argument("--quiet", action="store_true", help="suppress progress output")
|
||||
sub = parser.add_subparsers(dest="command", required=True)
|
||||
|
||||
sub.add_parser("list", help="list theme presets").set_defaults(func=cmd_list)
|
||||
|
||||
p = sub.add_parser("apply", help="apply a theme preset (name or JSON file) + rebuild")
|
||||
p.add_argument("theme")
|
||||
p.add_argument("--no-switch", action="store_true", help="write state only, skip the rebuild")
|
||||
p.set_defaults(func=cmd_apply)
|
||||
|
||||
p = sub.add_parser("set", help="set one key, e.g. `set ui.gapsOut 16` + rebuild")
|
||||
p.add_argument("path")
|
||||
p.add_argument("value")
|
||||
p.add_argument("--no-switch", action="store_true", help="write state only, skip the rebuild")
|
||||
p.set_defaults(func=cmd_set)
|
||||
|
||||
p = sub.add_parser("get", help="print state (or one dotted key)")
|
||||
p.add_argument("path", nargs="?")
|
||||
p.set_defaults(func=cmd_get)
|
||||
|
||||
sub.add_parser("wallpaper", help="apply the current wallpaper via swww").set_defaults(func=cmd_wallpaper)
|
||||
|
||||
p = sub.add_parser("bg", help="wallpaper control: `bg next` cycles, `bg auto` resets")
|
||||
p.add_argument("action", choices=["next", "auto"], default="next", nargs="?")
|
||||
p.set_defaults(func=cmd_bg)
|
||||
|
||||
args = parser.parse_args()
|
||||
QUIET = args.quiet
|
||||
try:
|
||||
args.func(args)
|
||||
except KeyboardInterrupt:
|
||||
sys.exit(130)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
22
templates/downstream/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# My Nomarchy machine
|
||||
|
||||
1. `nixos-generate-config --show-hardware-config > hardware-configuration.nix`
|
||||
2. Edit `flake.nix` (Nomarchy repo URL, username), `system.nix` (hostname,
|
||||
user), `home.nix` (your packages).
|
||||
3. `git init && git add -A` — flakes only see tracked files, including
|
||||
`theme-state.json`.
|
||||
4. System: `sudo nixos-rebuild switch --flake .#default`
|
||||
5. Desktop: `nix run home-manager -- switch --flake .#me`
|
||||
(afterwards just `home-manager switch --flake .#me` — it's installed)
|
||||
6. Clone/symlink this directory to `~/.nomarchy` (or export
|
||||
`NOMARCHY_PATH`) so `nomarchy-theme-sync` knows where the state lives.
|
||||
|
||||
Day-to-day:
|
||||
|
||||
```sh
|
||||
nomarchy-theme-sync list # 21 shipped presets
|
||||
nomarchy-theme-sync apply gruvbox # writes state + home-manager switch
|
||||
nomarchy-theme-sync bg next # cycle wallpapers (instant, no rebuild)
|
||||
```
|
||||
|
||||
The system layer only needs `nixos-rebuild` when you change `system.nix`.
|
||||
53
templates/downstream/flake.nix
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
description = "My Nomarchy machine";
|
||||
|
||||
inputs = {
|
||||
# Pin Nomarchy; nixpkgs and home-manager follow whatever it ships.
|
||||
nomarchy.url = "github:YOUR-USER/nomarchy"; # <- point at the distro repo
|
||||
nixpkgs.follows = "nomarchy/nixpkgs";
|
||||
home-manager.follows = "nomarchy/home-manager";
|
||||
};
|
||||
|
||||
outputs = { self, nomarchy, nixpkgs, home-manager, ... }:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
username = "me"; # <- your login name
|
||||
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ nomarchy.overlays.default ];
|
||||
};
|
||||
in
|
||||
{
|
||||
# System layer — rebuilt rarely:
|
||||
# sudo nixos-rebuild switch --flake .#default
|
||||
nixosConfigurations.default = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
modules = [
|
||||
nomarchy.nixosModules.nomarchy # the distro
|
||||
./hardware-configuration.nix # from `nixos-generate-config`
|
||||
./system.nix # your machine
|
||||
];
|
||||
};
|
||||
|
||||
# Desktop layer — rebuilt on every theme change, no sudo:
|
||||
# home-manager switch --flake .#me
|
||||
# (`nomarchy-theme-sync apply <theme>` runs this for you.)
|
||||
homeConfigurations.${username} = home-manager.lib.homeManagerConfiguration {
|
||||
inherit pkgs;
|
||||
modules = [
|
||||
nomarchy.homeModules.nomarchy
|
||||
./home.nix
|
||||
{
|
||||
# Your theme state — written by nomarchy-theme-sync, baked
|
||||
# in on every switch. Keep it git-tracked.
|
||||
nomarchy.stateFile = ./theme-state.json;
|
||||
home = {
|
||||
inherit username;
|
||||
homeDirectory = "/home/${username}";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
16
templates/downstream/home.nix
Normal file
@@ -0,0 +1,16 @@
|
||||
# Your user environment. The Nomarchy desktop (Hyprland, Waybar,
|
||||
# Ghostty, theming engine, Stylix) comes from homeModules.nomarchy;
|
||||
# tune it via the nomarchy.* options, add your own packages and
|
||||
# programs below.
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
# Examples:
|
||||
# nomarchy.terminal = "kitty"; # swap the default terminal
|
||||
# nomarchy.waybar.enable = false; # bring your own bar
|
||||
# nomarchy.stylix.enable = false; # opt out of GTK/Qt theming
|
||||
|
||||
home.packages = with pkgs; [
|
||||
# firefox
|
||||
];
|
||||
}
|
||||
25
templates/downstream/system.nix
Normal file
@@ -0,0 +1,25 @@
|
||||
# Your machine: bootloader, hostname, users, services.
|
||||
# The distro itself comes from nomarchy.nixosModules.nomarchy — override
|
||||
# any of its defaults here with plain NixOS options (they use mkDefault),
|
||||
# or via the nomarchy.system.* toggles.
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
networking.hostName = "my-nomarchy";
|
||||
time.timeZone = "UTC";
|
||||
i18n.defaultLocale = "en_US.UTF-8";
|
||||
|
||||
users.users.me = { # <- keep in sync with `username` in flake.nix
|
||||
isNormalUser = true;
|
||||
extraGroups = [ "wheel" "networkmanager" "video" "input" ];
|
||||
};
|
||||
|
||||
# Examples:
|
||||
# nomarchy.system.greeter.enable = false; # bring your own login manager
|
||||
# environment.systemPackages = [ pkgs.htop ];
|
||||
|
||||
system.stateVersion = "26.05";
|
||||
}
|
||||
55
templates/downstream/theme-state.json
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Tokyo Night",
|
||||
"slug": "tokyo-night",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#1a1b26",
|
||||
"mantle": "#161720",
|
||||
"surface": "#32344a",
|
||||
"overlay": "#444b6a",
|
||||
"text": "#a9b1d6",
|
||||
"subtext": "#787c99",
|
||||
"muted": "#444b6a",
|
||||
"accent": "#7aa2f7",
|
||||
"accentAlt": "#ad8ee6",
|
||||
"good": "#9ece6a",
|
||||
"warn": "#e0af68",
|
||||
"bad": "#f7768e"
|
||||
},
|
||||
"ansi": [
|
||||
"#32344a",
|
||||
"#f7768e",
|
||||
"#9ece6a",
|
||||
"#e0af68",
|
||||
"#7aa2f7",
|
||||
"#ad8ee6",
|
||||
"#449dab",
|
||||
"#787c99",
|
||||
"#444b6a",
|
||||
"#ff7a93",
|
||||
"#b9f27c",
|
||||
"#ff9e64",
|
||||
"#7da6ff",
|
||||
"#bb9af7",
|
||||
"#0db9d7",
|
||||
"#acb0d0"
|
||||
],
|
||||
"fonts": {
|
||||
"mono": "JetBrainsMono Nerd Font",
|
||||
"ui": "Inter",
|
||||
"size": 11
|
||||
},
|
||||
"ui": {
|
||||
"gapsIn": 5,
|
||||
"gapsOut": 12,
|
||||
"borderSize": 2,
|
||||
"rounding": 10,
|
||||
"activeOpacity": 1.0,
|
||||
"inactiveOpacity": 0.95,
|
||||
"terminalOpacity": 0.96,
|
||||
"blur": true,
|
||||
"shadow": true
|
||||
}
|
||||
}
|
||||
55
theme-state.json
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Tokyo Night",
|
||||
"slug": "tokyo-night",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#1a1b26",
|
||||
"mantle": "#161720",
|
||||
"surface": "#32344a",
|
||||
"overlay": "#444b6a",
|
||||
"text": "#a9b1d6",
|
||||
"subtext": "#787c99",
|
||||
"muted": "#444b6a",
|
||||
"accent": "#7aa2f7",
|
||||
"accentAlt": "#ad8ee6",
|
||||
"good": "#9ece6a",
|
||||
"warn": "#e0af68",
|
||||
"bad": "#f7768e"
|
||||
},
|
||||
"ansi": [
|
||||
"#32344a",
|
||||
"#f7768e",
|
||||
"#9ece6a",
|
||||
"#e0af68",
|
||||
"#7aa2f7",
|
||||
"#ad8ee6",
|
||||
"#449dab",
|
||||
"#787c99",
|
||||
"#444b6a",
|
||||
"#ff7a93",
|
||||
"#b9f27c",
|
||||
"#ff9e64",
|
||||
"#7da6ff",
|
||||
"#bb9af7",
|
||||
"#0db9d7",
|
||||
"#acb0d0"
|
||||
],
|
||||
"fonts": {
|
||||
"mono": "JetBrainsMono Nerd Font",
|
||||
"ui": "Inter",
|
||||
"size": 11
|
||||
},
|
||||
"ui": {
|
||||
"gapsIn": 5,
|
||||
"gapsOut": 12,
|
||||
"borderSize": 2,
|
||||
"rounding": 10,
|
||||
"activeOpacity": 1.0,
|
||||
"inactiveOpacity": 0.95,
|
||||
"terminalOpacity": 0.96,
|
||||
"blur": true,
|
||||
"shadow": true
|
||||
}
|
||||
}
|
||||
39
themes/catppuccin-latte.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Catppuccin Latte",
|
||||
"slug": "catppuccin-latte",
|
||||
"mode": "light",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#eff1f5",
|
||||
"mantle": "#cbcdd0",
|
||||
"surface": "#bcc0cc",
|
||||
"overlay": "#acb0be",
|
||||
"text": "#4c4f69",
|
||||
"subtext": "#5c5f77",
|
||||
"muted": "#acb0be",
|
||||
"accent": "#1e66f5",
|
||||
"accentAlt": "#ea76cb",
|
||||
"good": "#40a02b",
|
||||
"warn": "#df8e1d",
|
||||
"bad": "#d20f39"
|
||||
},
|
||||
"ansi": [
|
||||
"#bcc0cc",
|
||||
"#d20f39",
|
||||
"#40a02b",
|
||||
"#df8e1d",
|
||||
"#1e66f5",
|
||||
"#ea76cb",
|
||||
"#179299",
|
||||
"#5c5f77",
|
||||
"#acb0be",
|
||||
"#d20f39",
|
||||
"#40a02b",
|
||||
"#df8e1d",
|
||||
"#1e66f5",
|
||||
"#ea76cb",
|
||||
"#179299",
|
||||
"#6c6f85"
|
||||
]
|
||||
}
|
||||
BIN
themes/catppuccin-latte/backgrounds/1-color-fade.png
Normal file
|
After Width: | Height: | Size: 652 KiB |
84
themes/catppuccin-latte/btop.theme
Normal file
@@ -0,0 +1,84 @@
|
||||
# https://github.com/catppuccin/btop/blob/main/themes/catppuccin_latte.theme
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#eff1f5"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#4c4f69"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#4c4f69"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#1e66f5"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#bcc0cc"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#1e66f5"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#8c8fa1"
|
||||
|
||||
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
|
||||
theme[graph_text]="#dc8a78"
|
||||
|
||||
# Background color of the percentage meters
|
||||
theme[meter_bg]="#bcc0cc"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#dc8a78"
|
||||
|
||||
# CPU, Memory, Network, Proc box outline colors
|
||||
theme[cpu_box]="#8839ef" #Mauve
|
||||
theme[mem_box]="#40a02b" #Green
|
||||
theme[net_box]="#e64553" #Maroon
|
||||
theme[proc_box]="#1e66f5" #Blue
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#9ca0b0"
|
||||
|
||||
# Temperature graph color (Green -> Yellow -> Red)
|
||||
theme[temp_start]="#40a02b"
|
||||
theme[temp_mid]="#df8e1d"
|
||||
theme[temp_end]="#d20f39"
|
||||
|
||||
# CPU graph colors (Teal -> Lavender)
|
||||
theme[cpu_start]="#179299"
|
||||
theme[cpu_mid]="#209fb5"
|
||||
theme[cpu_end]="#7287fd"
|
||||
|
||||
# Mem/Disk free meter (Mauve -> Lavender -> Blue)
|
||||
theme[free_start]="#8839ef"
|
||||
theme[free_mid]="#7287fd"
|
||||
theme[free_end]="#1e66f5"
|
||||
|
||||
# Mem/Disk cached meter (Sapphire -> Lavender)
|
||||
theme[cached_start]="#209fb5"
|
||||
theme[cached_mid]="#1e66f5"
|
||||
theme[cached_end]="#7287fd"
|
||||
|
||||
# Mem/Disk available meter (Peach -> Red)
|
||||
theme[available_start]="#fe640b"
|
||||
theme[available_mid]="#e64553"
|
||||
theme[available_end]="#d20f39"
|
||||
|
||||
# Mem/Disk used meter (Green -> Sky)
|
||||
theme[used_start]="#40a02b"
|
||||
theme[used_mid]="#179299"
|
||||
theme[used_end]="#04a5e5"
|
||||
|
||||
# Download graph colors (Peach -> Red)
|
||||
theme[download_start]="#fe640b"
|
||||
theme[download_mid]="#e64553"
|
||||
theme[download_end]="#d20f39"
|
||||
|
||||
# Upload graph colors (Green -> Sky)
|
||||
theme[upload_start]="#40a02b"
|
||||
theme[upload_mid]="#179299"
|
||||
theme[upload_end]="#04a5e5"
|
||||
|
||||
# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)
|
||||
theme[process_start]="#209fb5"
|
||||
theme[process_mid]="#7287fd"
|
||||
theme[process_end]="#8839ef"
|
||||
39
themes/catppuccin.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Catppuccin",
|
||||
"slug": "catppuccin",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#1e1e2e",
|
||||
"mantle": "#1a1a27",
|
||||
"surface": "#45475a",
|
||||
"overlay": "#585b70",
|
||||
"text": "#cdd6f4",
|
||||
"subtext": "#bac2de",
|
||||
"muted": "#585b70",
|
||||
"accent": "#89b4fa",
|
||||
"accentAlt": "#f5c2e7",
|
||||
"good": "#a6e3a1",
|
||||
"warn": "#f9e2af",
|
||||
"bad": "#f38ba8"
|
||||
},
|
||||
"ansi": [
|
||||
"#45475a",
|
||||
"#f38ba8",
|
||||
"#a6e3a1",
|
||||
"#f9e2af",
|
||||
"#89b4fa",
|
||||
"#f5c2e7",
|
||||
"#94e2d5",
|
||||
"#bac2de",
|
||||
"#585b70",
|
||||
"#f38ba8",
|
||||
"#a6e3a1",
|
||||
"#f9e2af",
|
||||
"#89b4fa",
|
||||
"#f5c2e7",
|
||||
"#94e2d5",
|
||||
"#a6adc8"
|
||||
]
|
||||
}
|
||||
BIN
themes/catppuccin/backgrounds/1-totoro.png
Normal file
|
After Width: | Height: | Size: 353 KiB |
BIN
themes/catppuccin/backgrounds/2-waves.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
themes/catppuccin/backgrounds/3-blue-eye.png
Normal file
|
After Width: | Height: | Size: 254 KiB |
83
themes/catppuccin/btop.theme
Normal file
@@ -0,0 +1,83 @@
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#1E1E2E"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#c6d0f5"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#c6d0f5"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#8caaee"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#51576d"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#8caaee"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#838ba7"
|
||||
|
||||
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
|
||||
theme[graph_text]="#f2d5cf"
|
||||
|
||||
# Background color of the percentage meters
|
||||
theme[meter_bg]="#51576d"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#f2d5cf"
|
||||
|
||||
# CPU, Memory, Network, Proc box outline colors
|
||||
theme[cpu_box]="#ca9ee6" #Mauve
|
||||
theme[mem_box]="#a6d189" #Green
|
||||
theme[net_box]="#ea999c" #Maroon
|
||||
theme[proc_box]="#8caaee" #Blue
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#737994"
|
||||
|
||||
# Temperature graph color (Green -> Yellow -> Red)
|
||||
theme[temp_start]="#a6d189"
|
||||
theme[temp_mid]="#e5c890"
|
||||
theme[temp_end]="#e78284"
|
||||
|
||||
# CPU graph colors (Teal -> Lavender)
|
||||
theme[cpu_start]="#81c8be"
|
||||
theme[cpu_mid]="#85c1dc"
|
||||
theme[cpu_end]="#babbf1"
|
||||
|
||||
# Mem/Disk free meter (Mauve -> Lavender -> Blue)
|
||||
theme[free_start]="#ca9ee6"
|
||||
theme[free_mid]="#babbf1"
|
||||
theme[free_end]="#8caaee"
|
||||
|
||||
# Mem/Disk cached meter (Sapphire -> Lavender)
|
||||
theme[cached_start]="#85c1dc"
|
||||
theme[cached_mid]="#8caaee"
|
||||
theme[cached_end]="#babbf1"
|
||||
|
||||
# Mem/Disk available meter (Peach -> Red)
|
||||
theme[available_start]="#ef9f76"
|
||||
theme[available_mid]="#ea999c"
|
||||
theme[available_end]="#e78284"
|
||||
|
||||
# Mem/Disk used meter (Green -> Sky)
|
||||
theme[used_start]="#a6d189"
|
||||
theme[used_mid]="#81c8be"
|
||||
theme[used_end]="#99d1db"
|
||||
|
||||
# Download graph colors (Peach -> Red)
|
||||
theme[download_start]="#ef9f76"
|
||||
theme[download_mid]="#ea999c"
|
||||
theme[download_end]="#e78284"
|
||||
|
||||
# Upload graph colors (Green -> Sky)
|
||||
theme[upload_start]="#a6d189"
|
||||
theme[upload_mid]="#81c8be"
|
||||
theme[upload_end]="#99d1db"
|
||||
|
||||
# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)
|
||||
theme[process_start]="#85c1dc"
|
||||
theme[process_mid]="#babbf1"
|
||||
theme[process_end]="#ca9ee6"
|
||||
2
themes/catppuccin/waybar.css
Normal file
@@ -0,0 +1,2 @@
|
||||
@define-color foreground #cdd6f4;
|
||||
@define-color background #181824;
|
||||
39
themes/ethereal.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Ethereal",
|
||||
"slug": "ethereal",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#060B1E",
|
||||
"mantle": "#05091a",
|
||||
"surface": "#060B1E",
|
||||
"overlay": "#6d7db6",
|
||||
"text": "#ffcead",
|
||||
"subtext": "#F99957",
|
||||
"muted": "#6d7db6",
|
||||
"accent": "#7d82d9",
|
||||
"accentAlt": "#c89dc1",
|
||||
"good": "#92a593",
|
||||
"warn": "#E9BB4F",
|
||||
"bad": "#ED5B5A"
|
||||
},
|
||||
"ansi": [
|
||||
"#060B1E",
|
||||
"#ED5B5A",
|
||||
"#92a593",
|
||||
"#E9BB4F",
|
||||
"#7d82d9",
|
||||
"#c89dc1",
|
||||
"#a3bfd1",
|
||||
"#F99957",
|
||||
"#6d7db6",
|
||||
"#faaaa9",
|
||||
"#c4cfc4",
|
||||
"#f7dc9c",
|
||||
"#c2c4f0",
|
||||
"#ead7e7",
|
||||
"#dfeaf0",
|
||||
"#ffcead"
|
||||
]
|
||||
}
|
||||
BIN
themes/ethereal/backgrounds/1-cosmic.jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
themes/ethereal/backgrounds/2-meadow.jpg
Normal file
|
After Width: | Height: | Size: 3.8 MiB |
70
themes/ethereal/btop.theme
Normal file
@@ -0,0 +1,70 @@
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#060B1E"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#ffcead"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#c89dc1"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#a3bfd1"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#6d7db6"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#ffcead"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#6d7db6"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#c89dc1"
|
||||
|
||||
# Box outline and divider line color
|
||||
theme[cpu_box]="#92a593"
|
||||
theme[mem_box]="#92a593"
|
||||
theme[net_box]="#92a593"
|
||||
theme[proc_box]="#92a593"
|
||||
theme[div_line]="#6d7db6"
|
||||
|
||||
# Gradient for all meters and graphs
|
||||
theme[temp_start]="#a3bfd1"
|
||||
theme[temp_mid]="#7d82d9"
|
||||
theme[temp_end]="#92a593"
|
||||
|
||||
|
||||
theme[cpu_start]="#a3bfd1"
|
||||
theme[cpu_mid]="#7d82d9"
|
||||
theme[cpu_end]="#92a593"
|
||||
|
||||
|
||||
theme[free_start]="#7d82d9"
|
||||
theme[free_mid]="#E9BB4F"
|
||||
theme[free_end]="#E9BB4F"
|
||||
|
||||
|
||||
theme[cached_start]="#E9BB4F"
|
||||
theme[cached_mid]="#E9BB4F"
|
||||
theme[cached_end]="#E9BB4F"
|
||||
|
||||
|
||||
theme[available_start]="#a3bfd1"
|
||||
theme[available_mid]="#a3bfd1"
|
||||
theme[available_end]="#a3bfd1"
|
||||
|
||||
|
||||
theme[used_start]="#92a593"
|
||||
theme[used_mid]="#92a593"
|
||||
theme[used_end]="#92a593"
|
||||
|
||||
|
||||
theme[download_start]="#E9BB4F"
|
||||
theme[download_mid]="#a3bfd1"
|
||||
theme[download_end]="#7d82d9"
|
||||
|
||||
|
||||
theme[upload_start]="#E9BB4F"
|
||||
theme[upload_mid]="#a3bfd1"
|
||||
theme[upload_end]="#7d82d9"
|
||||
39
themes/everforest.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Everforest",
|
||||
"slug": "everforest",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#2d353b",
|
||||
"mantle": "#262d32",
|
||||
"surface": "#475258",
|
||||
"overlay": "#475258",
|
||||
"text": "#d3c6aa",
|
||||
"subtext": "#d3c6aa",
|
||||
"muted": "#475258",
|
||||
"accent": "#7fbbb3",
|
||||
"accentAlt": "#d699b6",
|
||||
"good": "#a7c080",
|
||||
"warn": "#dbbc7f",
|
||||
"bad": "#e67e80"
|
||||
},
|
||||
"ansi": [
|
||||
"#475258",
|
||||
"#e67e80",
|
||||
"#a7c080",
|
||||
"#dbbc7f",
|
||||
"#7fbbb3",
|
||||
"#d699b6",
|
||||
"#83c092",
|
||||
"#d3c6aa",
|
||||
"#475258",
|
||||
"#e67e80",
|
||||
"#a7c080",
|
||||
"#dbbc7f",
|
||||
"#7fbbb3",
|
||||
"#d699b6",
|
||||
"#83c092",
|
||||
"#d3c6aa"
|
||||
]
|
||||
}
|
||||
BIN
themes/everforest/backgrounds/1-tree-tops.jpg
Normal file
|
After Width: | Height: | Size: 315 KiB |
92
themes/everforest/btop.theme
Normal file
@@ -0,0 +1,92 @@
|
||||
# All graphs and meters can be gradients
|
||||
# For single color graphs leave "mid" and "end" variable empty.
|
||||
# Use "start" and "end" variables for two color gradient
|
||||
# Use "start", "mid" and "end" for three color gradient
|
||||
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#2d353b"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#d3c6aa"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#d3c6aa"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#e67e80"
|
||||
|
||||
# Background color of selected items
|
||||
theme[selected_bg]="#3d484d"
|
||||
|
||||
# Foreground color of selected items
|
||||
theme[selected_fg]="#dbbc7f"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#2d353b"
|
||||
|
||||
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
|
||||
theme[graph_text]="#d3c6aa"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#a7c080"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#3d484d"
|
||||
|
||||
# Memory/disks box outline color
|
||||
theme[mem_box]="#3d484d"
|
||||
|
||||
# Net up/down box outline color
|
||||
theme[net_box]="#3d484d"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#3d484d"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#3d484d"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#a7c080"
|
||||
theme[temp_mid]="#dbbc7f"
|
||||
theme[temp_end]="#f85552"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#a7c080"
|
||||
theme[cpu_mid]="#dbbc7f"
|
||||
theme[cpu_end]="#f85552"
|
||||
|
||||
# Mem/Disk free meter
|
||||
theme[free_start]="#f85552"
|
||||
theme[free_mid]="#dbbc7f"
|
||||
theme[free_end]="#a7c080"
|
||||
|
||||
# Mem/Disk cached meter
|
||||
theme[cached_start]="#7fbbb3"
|
||||
theme[cached_mid]="#83c092"
|
||||
theme[cached_end]="#a7c080"
|
||||
|
||||
# Mem/Disk available meter
|
||||
theme[available_start]="#f85552"
|
||||
theme[available_mid]="#dbbc7f"
|
||||
theme[available_end]="#a7c080"
|
||||
|
||||
# Mem/Disk used meter
|
||||
theme[used_start]="#a7c080"
|
||||
theme[used_mid]="#dbbc7f"
|
||||
theme[used_end]="#f85552"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#a7c080"
|
||||
theme[download_mid]="#83c092"
|
||||
theme[download_end]="#7fbbb3"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#dbbc7f"
|
||||
theme[upload_mid]="#e69875"
|
||||
theme[upload_end]="#e67e80"
|
||||
|
||||
# Process box color gradient for threads, mem and cpu usage
|
||||
theme[process_start]="#a7c080"
|
||||
theme[process_mid]="#e67e80"
|
||||
theme[process_end]="#f85552"
|
||||
|
||||
39
themes/flexoki-light.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Flexoki Light",
|
||||
"slug": "flexoki-light",
|
||||
"mode": "light",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#FFFCF0",
|
||||
"mantle": "#d9d6cc",
|
||||
"surface": "#100F0F",
|
||||
"overlay": "#100F0F",
|
||||
"text": "#100F0F",
|
||||
"subtext": "#FFFCF0",
|
||||
"muted": "#100F0F",
|
||||
"accent": "#205EA6",
|
||||
"accentAlt": "#CE5D97",
|
||||
"good": "#879A39",
|
||||
"warn": "#D0A215",
|
||||
"bad": "#D14D41"
|
||||
},
|
||||
"ansi": [
|
||||
"#100F0F",
|
||||
"#D14D41",
|
||||
"#879A39",
|
||||
"#D0A215",
|
||||
"#205EA6",
|
||||
"#CE5D97",
|
||||
"#3AA99F",
|
||||
"#FFFCF0",
|
||||
"#100F0F",
|
||||
"#D14D41",
|
||||
"#879A39",
|
||||
"#D0A215",
|
||||
"#4385BE",
|
||||
"#CE5D97",
|
||||
"#3AA99F",
|
||||
"#FFFCF0"
|
||||
]
|
||||
}
|
||||
BIN
themes/flexoki-light/backgrounds/1-orb.png
Normal file
|
After Width: | Height: | Size: 287 KiB |
BIN
themes/flexoki-light/backgrounds/2-nomarchy.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
78
themes/flexoki-light/btop.theme
Normal file
@@ -0,0 +1,78 @@
|
||||
# Main bg
|
||||
theme[main_bg]="#FFFCF0"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#100F0F"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#100F0F"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#205EA6"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#414868"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#100F0F"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#6F6E69"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#205EA6"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#6F6E69"
|
||||
|
||||
# Memory/disks box outline color
|
||||
theme[mem_box]="#6F6E69"
|
||||
|
||||
# Net up/down box outline color
|
||||
theme[net_box]="#6F6E69"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#6F6E69"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#6F6E69"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#66800B"
|
||||
theme[temp_mid]="#BC5215"
|
||||
theme[temp_end]="#AF3029"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#66800B"
|
||||
theme[cpu_mid]="#BC5215"
|
||||
theme[cpu_end]="#AF3029"
|
||||
|
||||
# Mem/Disk free meter
|
||||
theme[free_start]="#66800B"
|
||||
theme[free_mid]="#BC5215"
|
||||
theme[free_end]="#AF3029"
|
||||
|
||||
# Mem/Disk cached meter
|
||||
theme[cached_start]="#66800B"
|
||||
theme[cached_mid]="#BC5215"
|
||||
theme[cached_end]="#AF3029"
|
||||
|
||||
# Mem/Disk available meter
|
||||
theme[available_start]="#66800B"
|
||||
theme[available_mid]="#BC5215"
|
||||
theme[available_end]="#AF3029"
|
||||
|
||||
# Mem/Disk used meter
|
||||
theme[used_start]="#66800B"
|
||||
theme[used_mid]="#BC5215"
|
||||
theme[used_end]="#AF3029"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#66800B"
|
||||
theme[download_mid]="#BC5215"
|
||||
theme[download_end]="#AF3029"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#66800B"
|
||||
theme[upload_mid]="#BC5215"
|
||||
theme[upload_end]="#AF3029"
|
||||
39
themes/gruvbox.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Gruvbox",
|
||||
"slug": "gruvbox",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#282828",
|
||||
"mantle": "#222222",
|
||||
"surface": "#3c3836",
|
||||
"overlay": "#3c3836",
|
||||
"text": "#d4be98",
|
||||
"subtext": "#d4be98",
|
||||
"muted": "#3c3836",
|
||||
"accent": "#7daea3",
|
||||
"accentAlt": "#d3869b",
|
||||
"good": "#a9b665",
|
||||
"warn": "#d8a657",
|
||||
"bad": "#ea6962"
|
||||
},
|
||||
"ansi": [
|
||||
"#3c3836",
|
||||
"#ea6962",
|
||||
"#a9b665",
|
||||
"#d8a657",
|
||||
"#7daea3",
|
||||
"#d3869b",
|
||||
"#89b482",
|
||||
"#d4be98",
|
||||
"#3c3836",
|
||||
"#ea6962",
|
||||
"#a9b665",
|
||||
"#d8a657",
|
||||
"#7daea3",
|
||||
"#d3869b",
|
||||
"#89b482",
|
||||
"#d4be98"
|
||||
]
|
||||
}
|
||||
BIN
themes/gruvbox/backgrounds/1-the-backwater.jpg
Normal file
|
After Width: | Height: | Size: 3.9 MiB |
BIN
themes/gruvbox/backgrounds/2-flower-basket.jpg
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
themes/gruvbox/backgrounds/3-village-square.jpg
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
themes/gruvbox/backgrounds/4-idyllic-procession.jpg
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
themes/gruvbox/backgrounds/5-leaves.jpg
Normal file
|
After Width: | Height: | Size: 434 KiB |
92
themes/gruvbox/btop.theme
Normal file
@@ -0,0 +1,92 @@
|
||||
#Bashtop gruvbox (https://github.com/morhetz/gruvbox) theme
|
||||
#by BachoSeven
|
||||
|
||||
# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: "#RRGGBB", "#BW" or "0-255 0-255 0-255"
|
||||
# example for white: "#FFFFFF", "#ff" or "255 255 255".
|
||||
|
||||
# All graphs and meters can be gradients
|
||||
# For single color graphs leave "mid" and "end" variable empty.
|
||||
# Use "start" and "end" variables for two color gradient
|
||||
# Use "start", "mid" and "end" for three color gradient
|
||||
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#282828"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#a89984"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#ebdbb2"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#d79921"
|
||||
|
||||
# Background color of selected items
|
||||
theme[selected_bg]="#282828"
|
||||
|
||||
# Foreground color of selected items
|
||||
theme[selected_fg]="#fabd2f"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#282828"
|
||||
|
||||
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
|
||||
theme[graph_text]="#585858"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#98971a"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#a89984"
|
||||
|
||||
# Memory/disks box outline color
|
||||
theme[mem_box]="#a89984"
|
||||
|
||||
# Net up/down box outline color
|
||||
theme[net_box]="#a89984"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#a89984"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#a89984"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#458588"
|
||||
theme[temp_mid]="#d3869b"
|
||||
theme[temp_end]="#fb4394"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#b8bb26"
|
||||
theme[cpu_mid]="#d79921"
|
||||
theme[cpu_end]="#fb4934"
|
||||
|
||||
# Mem/Disk free meter
|
||||
theme[free_start]="#4e5900"
|
||||
theme[free_mid]=""
|
||||
theme[free_end]="#98971a"
|
||||
|
||||
# Mem/Disk cached meter
|
||||
theme[cached_start]="#458588"
|
||||
theme[cached_mid]=""
|
||||
theme[cached_end]="#83a598"
|
||||
|
||||
# Mem/Disk available meter
|
||||
theme[available_start]="#d79921"
|
||||
theme[available_mid]=""
|
||||
theme[available_end]="#fabd2f"
|
||||
|
||||
# Mem/Disk used meter
|
||||
theme[used_start]="#cc241d"
|
||||
theme[used_mid]=""
|
||||
theme[used_end]="#fb4934"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#3d4070"
|
||||
theme[download_mid]="#6c71c4"
|
||||
theme[download_end]="#a3a8f7"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#701c45"
|
||||
theme[upload_mid]="#b16286"
|
||||
theme[upload_end]="#d3869b"
|
||||
39
themes/hackerman.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Hackerman",
|
||||
"slug": "hackerman",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#0B0C16",
|
||||
"mantle": "#090a13",
|
||||
"surface": "#0B0C16",
|
||||
"overlay": "#6a6e95",
|
||||
"text": "#ddf7ff",
|
||||
"subtext": "#85E1FB",
|
||||
"muted": "#6a6e95",
|
||||
"accent": "#82FB9C",
|
||||
"accentAlt": "#86a7df",
|
||||
"good": "#4fe88f",
|
||||
"warn": "#50f7d4",
|
||||
"bad": "#50f872"
|
||||
},
|
||||
"ansi": [
|
||||
"#0B0C16",
|
||||
"#50f872",
|
||||
"#4fe88f",
|
||||
"#50f7d4",
|
||||
"#829dd4",
|
||||
"#86a7df",
|
||||
"#7cf8f7",
|
||||
"#85E1FB",
|
||||
"#6a6e95",
|
||||
"#85ff9d",
|
||||
"#9cf7c2",
|
||||
"#a4ffec",
|
||||
"#c4d2ed",
|
||||
"#cddbf4",
|
||||
"#d1fffe",
|
||||
"#ddf7ff"
|
||||
]
|
||||
}
|
||||
BIN
themes/hackerman/backgrounds/1-synth-scape.jpg
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
themes/hackerman/backgrounds/2-geometric.jpg
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
70
themes/hackerman/btop.theme
Normal file
@@ -0,0 +1,70 @@
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#0B0C16"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#ddf7ff"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#86a7df"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#7cf8f7"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#6a6e95"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#ddf7ff"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#6a6e95"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#86a7df"
|
||||
|
||||
# Box outline and divider line color
|
||||
theme[cpu_box]="#4fe88f"
|
||||
theme[mem_box]="#4fe88f"
|
||||
theme[net_box]="#4fe88f"
|
||||
theme[proc_box]="#4fe88f"
|
||||
theme[div_line]="#6a6e95"
|
||||
|
||||
# Gradient for all meters and graphs
|
||||
theme[temp_start]="#7cf8f7"
|
||||
theme[temp_mid]="#829dd4"
|
||||
theme[temp_end]="#4fe88f"
|
||||
|
||||
|
||||
theme[cpu_start]="#7cf8f7"
|
||||
theme[cpu_mid]="#829dd4"
|
||||
theme[cpu_end]="#4fe88f"
|
||||
|
||||
|
||||
theme[free_start]="#829dd4"
|
||||
theme[free_mid]="#50f7d4"
|
||||
theme[free_end]="#50f7d4"
|
||||
|
||||
|
||||
theme[cached_start]="#50f7d4"
|
||||
theme[cached_mid]="#50f7d4"
|
||||
theme[cached_end]="#50f7d4"
|
||||
|
||||
|
||||
theme[available_start]="#7cf8f7"
|
||||
theme[available_mid]="#7cf8f7"
|
||||
theme[available_end]="#7cf8f7"
|
||||
|
||||
|
||||
theme[used_start]="#4fe88f"
|
||||
theme[used_mid]="#4fe88f"
|
||||
theme[used_end]="#4fe88f"
|
||||
|
||||
|
||||
theme[download_start]="#50f7d4"
|
||||
theme[download_mid]="#7cf8f7"
|
||||
theme[download_end]="#829dd4"
|
||||
|
||||
|
||||
theme[upload_start]="#50f7d4"
|
||||
theme[upload_mid]="#7cf8f7"
|
||||
theme[upload_end]="#829dd4"
|
||||
39
themes/kanagawa.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Kanagawa",
|
||||
"slug": "kanagawa",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#1f1f28",
|
||||
"mantle": "#1a1a22",
|
||||
"surface": "#090618",
|
||||
"overlay": "#727169",
|
||||
"text": "#dcd7ba",
|
||||
"subtext": "#c8c093",
|
||||
"muted": "#727169",
|
||||
"accent": "#7e9cd8",
|
||||
"accentAlt": "#957fb8",
|
||||
"good": "#76946a",
|
||||
"warn": "#c0a36e",
|
||||
"bad": "#c34043"
|
||||
},
|
||||
"ansi": [
|
||||
"#090618",
|
||||
"#c34043",
|
||||
"#76946a",
|
||||
"#c0a36e",
|
||||
"#7e9cd8",
|
||||
"#957fb8",
|
||||
"#6a9589",
|
||||
"#c8c093",
|
||||
"#727169",
|
||||
"#e82424",
|
||||
"#98bb6c",
|
||||
"#e6c384",
|
||||
"#7fb4ca",
|
||||
"#938aa9",
|
||||
"#7aa89f",
|
||||
"#dcd7ba"
|
||||
]
|
||||
}
|
||||
BIN
themes/kanagawa/backgrounds/1-kanagawa.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
86
themes/kanagawa/btop.theme
Normal file
@@ -0,0 +1,86 @@
|
||||
# Bashtop Kanagawa-wave (https://github.com/rebelot/kanagawa.nvim) theme
|
||||
# By: philikarus
|
||||
|
||||
# Main bg
|
||||
theme[main_bg]="#1f1f28"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#dcd7ba"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#dcd7ba"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#C34043"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#223249"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#dca561"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#727169"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#7aa89f"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#727169"
|
||||
|
||||
# Memory/disks box outline color
|
||||
theme[mem_box]="#727169"
|
||||
|
||||
# Net up/down box outline color
|
||||
theme[net_box]="#727169"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#727169"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#727169"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#98BB6C"
|
||||
theme[temp_mid]="#DCA561"
|
||||
theme[temp_end]="#E82424"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#98BB6C"
|
||||
theme[cpu_mid]="#DCA561"
|
||||
theme[cpu_end]="#E82424"
|
||||
|
||||
# Mem/Disk free meter
|
||||
theme[free_start]="#E82424"
|
||||
theme[free_mid]="#C34043"
|
||||
theme[free_end]="#FF5D62"
|
||||
|
||||
# Mem/Disk cached meter
|
||||
theme[cached_start]="#C0A36E"
|
||||
theme[cached_mid]="#DCA561"
|
||||
theme[cached_end]="#FF9E3B"
|
||||
|
||||
# Mem/Disk available meter
|
||||
theme[available_start]="#938AA9"
|
||||
theme[available_mid]="#957FBB"
|
||||
theme[available_end]="#9CABCA"
|
||||
|
||||
# Mem/Disk used meter
|
||||
theme[used_start]="#658594"
|
||||
theme[used_mid]="#7E9CDB"
|
||||
theme[used_end]="#7FB4CA"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#7E9CDB"
|
||||
theme[download_mid]="#938AA9"
|
||||
theme[download_end]="#957FBB"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#DCA561"
|
||||
theme[upload_mid]="#E6C384"
|
||||
theme[upload_end]="#E82424"
|
||||
|
||||
# Process box color gradient for threads, mem and cpu usage
|
||||
theme[process_start]="#98BB6C"
|
||||
theme[process_mid]="#DCA561"
|
||||
theme[process_end]="#C34043"
|
||||
39
themes/lumon.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Lumon",
|
||||
"slug": "lumon",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#16242d",
|
||||
"mantle": "#131f26",
|
||||
"surface": "#1b2d40",
|
||||
"overlay": "#304860",
|
||||
"text": "#d6e2ee",
|
||||
"subtext": "#d6e2ee",
|
||||
"muted": "#304860",
|
||||
"accent": "#f2fcff",
|
||||
"accentAlt": "#8bc9eb",
|
||||
"good": "#5e95bc",
|
||||
"warn": "#6fa4c9",
|
||||
"bad": "#4d86b0"
|
||||
},
|
||||
"ansi": [
|
||||
"#1b2d40",
|
||||
"#4d86b0",
|
||||
"#5e95bc",
|
||||
"#6fa4c9",
|
||||
"#6fb8e3",
|
||||
"#8bc9eb",
|
||||
"#b4e4f6",
|
||||
"#d6e2ee",
|
||||
"#304860",
|
||||
"#73a6cb",
|
||||
"#86b7d8",
|
||||
"#9dcae5",
|
||||
"#f2fcff",
|
||||
"#b1d8ee",
|
||||
"#d1eef8",
|
||||
"#ffffff"
|
||||
]
|
||||
}
|
||||
BIN
themes/lumon/backgrounds/01-united-in-severance.jpg
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
themes/lumon/backgrounds/02-opinions-equally.jpg
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
64
themes/lumon/btop.theme
Normal file
@@ -0,0 +1,64 @@
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]=""
|
||||
theme_background=false
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#c7d2de"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#9fcfe9"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#b5deef"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#355066"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#c7d2de"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#355066"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#9fcfe9"
|
||||
|
||||
# Box outline and divider line color
|
||||
theme[cpu_box]="#79abd2"
|
||||
theme[mem_box]="#79abd2"
|
||||
theme[net_box]="#79abd2"
|
||||
theme[proc_box]="#79abd2"
|
||||
theme[div_line]="#355066"
|
||||
|
||||
# Gradient for all meters and graphs
|
||||
theme[temp_start]="#b5deef"
|
||||
theme[temp_mid]="#92c7e7"
|
||||
theme[temp_end]="#79abd2"
|
||||
|
||||
theme[cpu_start]="#b5deef"
|
||||
theme[cpu_mid]="#92c7e7"
|
||||
theme[cpu_end]="#79abd2"
|
||||
|
||||
theme[free_start]="#92c7e7"
|
||||
theme[free_mid]="#86b6da"
|
||||
theme[free_end]="#86b6da"
|
||||
|
||||
theme[cached_start]="#86b6da"
|
||||
theme[cached_mid]="#86b6da"
|
||||
theme[cached_end]="#86b6da"
|
||||
|
||||
theme[available_start]="#b5deef"
|
||||
theme[available_mid]="#b5deef"
|
||||
theme[available_end]="#b5deef"
|
||||
|
||||
theme[used_start]="#79abd2"
|
||||
theme[used_mid]="#79abd2"
|
||||
theme[used_end]="#79abd2"
|
||||
|
||||
theme[download_start]="#86b6da"
|
||||
theme[download_mid]="#b5deef"
|
||||
theme[download_end]="#92c7e7"
|
||||
|
||||
theme[upload_start]="#86b6da"
|
||||
theme[upload_mid]="#b5deef"
|
||||
theme[upload_end]="#92c7e7"
|
||||
2
themes/lumon/waybar.css
Normal file
@@ -0,0 +1,2 @@
|
||||
@define-color foreground #d6e2ee;
|
||||
@define-color background #213442;
|
||||
39
themes/matte-black.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Matte Black",
|
||||
"slug": "matte-black",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#121212",
|
||||
"mantle": "#0f0f0f",
|
||||
"surface": "#333333",
|
||||
"overlay": "#8a8a8d",
|
||||
"text": "#bebebe",
|
||||
"subtext": "#bebebe",
|
||||
"muted": "#8a8a8d",
|
||||
"accent": "#e68e0d",
|
||||
"accentAlt": "#D35F5F",
|
||||
"good": "#FFC107",
|
||||
"warn": "#b91c1c",
|
||||
"bad": "#D35F5F"
|
||||
},
|
||||
"ansi": [
|
||||
"#333333",
|
||||
"#D35F5F",
|
||||
"#FFC107",
|
||||
"#b91c1c",
|
||||
"#e68e0d",
|
||||
"#D35F5F",
|
||||
"#bebebe",
|
||||
"#bebebe",
|
||||
"#8a8a8d",
|
||||
"#B91C1C",
|
||||
"#FFC107",
|
||||
"#b90a0a",
|
||||
"#f59e0b",
|
||||
"#B91C1C",
|
||||
"#eaeaea",
|
||||
"#ffffff"
|
||||
]
|
||||
}
|
||||
BIN
themes/matte-black/backgrounds/0-ship-at-sea.jpg
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
themes/matte-black/backgrounds/1-dark-waters.jpg
Normal file
|
After Width: | Height: | Size: 1010 KiB |
BIN
themes/matte-black/backgrounds/2-dot-hands.jpg
Normal file
|
After Width: | Height: | Size: 471 KiB |
92
themes/matte-black/btop.theme
Normal file
@@ -0,0 +1,92 @@
|
||||
# ────────────────────────────────────────────────────────────
|
||||
# Bashtop theme - Nomarchy Matte Black
|
||||
# by tahayvr
|
||||
# https://github.com/tahayvr
|
||||
# ────────────────────────────────────────────────────────────
|
||||
|
||||
# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: "#RRGGBB", "#BW" or "0-255 0-255 0-255"
|
||||
# example for white: "#ffffff", "#ff" or "255 255 255".
|
||||
|
||||
# All graphs and meters can be gradients
|
||||
# For single color graphs leave "mid" and "end" variable empty.
|
||||
# Use "start" and "end" variables for two color gradient
|
||||
# Use "start", "mid" and "end" for three color gradient
|
||||
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]=""
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#EAEAEA"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#8a8a8d"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#f59e0b"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#f59e0b"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#EAEAEA"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#333333"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#8a8a8d"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#8a8a8d"
|
||||
|
||||
# Memory/disks box outline color
|
||||
theme[mem_box]="#8a8a8d"
|
||||
|
||||
# Net up/down box outline color
|
||||
theme[net_box]="#8a8a8d"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#8a8a8d"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#8a8a8d"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#8a8a8d"
|
||||
theme[temp_mid]="#f59e0b"
|
||||
theme[temp_end]="#b91c1c"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#8a8a8d"
|
||||
theme[cpu_mid]="#f59e0b"
|
||||
theme[cpu_end]="#b91c1c"
|
||||
|
||||
# Mem/Disk free meter
|
||||
theme[free_start]="#8a8a8d"
|
||||
theme[free_mid]="#f59e0b"
|
||||
theme[free_end]="#b91c1c"
|
||||
|
||||
# Mem/Disk cached meter
|
||||
theme[cached_start]="#8a8a8d"
|
||||
theme[cached_mid]="#f59e0b"
|
||||
theme[cached_end]="#b91c1c"
|
||||
|
||||
# Mem/Disk available meter
|
||||
theme[available_start]="#8a8a8d"
|
||||
theme[available_mid]="#f59e0b"
|
||||
theme[available_end]="#b91c1c"
|
||||
|
||||
# Mem/Disk used meter
|
||||
theme[used_start]="#8a8a8d"
|
||||
theme[used_mid]="#f59e0b"
|
||||
theme[used_end]="#b91c1c"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#8a8a8d"
|
||||
theme[download_mid]="#f59e0b"
|
||||
theme[download_end]="#b91c1c"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#8a8a8d"
|
||||
theme[upload_mid]="#f59e0b"
|
||||
theme[upload_end]="#b91c1c"
|
||||
39
themes/miasma.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Miasma",
|
||||
"slug": "miasma",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#222222",
|
||||
"mantle": "#1d1d1d",
|
||||
"surface": "#000000",
|
||||
"overlay": "#666666",
|
||||
"text": "#c2c2b0",
|
||||
"subtext": "#d7c483",
|
||||
"muted": "#666666",
|
||||
"accent": "#78824b",
|
||||
"accentAlt": "#bb7744",
|
||||
"good": "#5f875f",
|
||||
"warn": "#b36d43",
|
||||
"bad": "#685742"
|
||||
},
|
||||
"ansi": [
|
||||
"#000000",
|
||||
"#685742",
|
||||
"#5f875f",
|
||||
"#b36d43",
|
||||
"#78824b",
|
||||
"#bb7744",
|
||||
"#c9a554",
|
||||
"#d7c483",
|
||||
"#666666",
|
||||
"#685742",
|
||||
"#5f875f",
|
||||
"#b36d43",
|
||||
"#78824b",
|
||||
"#bb7744",
|
||||
"#c9a554",
|
||||
"#d7c483"
|
||||
]
|
||||
}
|
||||
BIN
themes/miasma/backgrounds/01-nature-of-fear.jpg
Normal file
|
After Width: | Height: | Size: 653 KiB |
BIN
themes/miasma/backgrounds/02-crowned.jpg
Normal file
|
After Width: | Height: | Size: 983 KiB |
70
themes/miasma/btop.theme
Normal file
@@ -0,0 +1,70 @@
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#222222"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#c2c2b0"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#bb7744"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#c9a554"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#e4c47a"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#000000"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#666666"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#bb7744"
|
||||
|
||||
# Box outline and divider line color
|
||||
theme[cpu_box]="#5f875f"
|
||||
theme[mem_box]="#5f875f"
|
||||
theme[net_box]="#5f875f"
|
||||
theme[proc_box]="#5f875f"
|
||||
theme[div_line]="#666666"
|
||||
|
||||
# Gradient for all meters and graphs
|
||||
theme[temp_start]="#c9a554"
|
||||
theme[temp_mid]="#78824b"
|
||||
theme[temp_end]="#5f875f"
|
||||
|
||||
|
||||
theme[cpu_start]="#c9a554"
|
||||
theme[cpu_mid]="#78824b"
|
||||
theme[cpu_end]="#5f875f"
|
||||
|
||||
|
||||
theme[free_start]="#78824b"
|
||||
theme[free_mid]="#b36d43"
|
||||
theme[free_end]="#b36d43"
|
||||
|
||||
|
||||
theme[cached_start]="#b36d43"
|
||||
theme[cached_mid]="#b36d43"
|
||||
theme[cached_end]="#b36d43"
|
||||
|
||||
|
||||
theme[available_start]="#c9a554"
|
||||
theme[available_mid]="#c9a554"
|
||||
theme[available_end]="#c9a554"
|
||||
|
||||
|
||||
theme[used_start]="#5f875f"
|
||||
theme[used_mid]="#5f875f"
|
||||
theme[used_end]="#5f875f"
|
||||
|
||||
|
||||
theme[download_start]="#b36d43"
|
||||
theme[download_mid]="#c9a554"
|
||||
theme[download_end]="#78824b"
|
||||
|
||||
|
||||
theme[upload_start]="#b36d43"
|
||||
theme[upload_mid]="#c9a554"
|
||||
theme[upload_end]="#78824b"
|
||||
39
themes/nord.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Nord",
|
||||
"slug": "nord",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#2e3440",
|
||||
"mantle": "#272c36",
|
||||
"surface": "#3b4252",
|
||||
"overlay": "#4c566a",
|
||||
"text": "#d8dee9",
|
||||
"subtext": "#e5e9f0",
|
||||
"muted": "#4c566a",
|
||||
"accent": "#81a1c1",
|
||||
"accentAlt": "#b48ead",
|
||||
"good": "#a3be8c",
|
||||
"warn": "#ebcb8b",
|
||||
"bad": "#bf616a"
|
||||
},
|
||||
"ansi": [
|
||||
"#3b4252",
|
||||
"#bf616a",
|
||||
"#a3be8c",
|
||||
"#ebcb8b",
|
||||
"#81a1c1",
|
||||
"#b48ead",
|
||||
"#88c0d0",
|
||||
"#e5e9f0",
|
||||
"#4c566a",
|
||||
"#bf616a",
|
||||
"#a3be8c",
|
||||
"#ebcb8b",
|
||||
"#81a1c1",
|
||||
"#b48ead",
|
||||
"#8fbcbb",
|
||||
"#eceff4"
|
||||
]
|
||||
}
|
||||
BIN
themes/nord/backgrounds/0-black-moon.jpg
Normal file
|
After Width: | Height: | Size: 3.1 MiB |
BIN
themes/nord/backgrounds/1-city-view.png
Normal file
|
After Width: | Height: | Size: 384 KiB |
BIN
themes/nord/backgrounds/2-night-hawks.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
89
themes/nord/btop.theme
Normal file
@@ -0,0 +1,89 @@
|
||||
#Bashtop theme with nord palette (https://www.nordtheme.com)
|
||||
#by Justin Zobel <justin.zobel@gmail.com>
|
||||
|
||||
# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: "#RRGGBB", "#BW" or "0-255 0-255 0-255"
|
||||
# example for white: "#ffffff", "#ff" or "255 255 255".
|
||||
|
||||
# All graphs and meters can be gradients
|
||||
# For single color graphs leave "mid" and "end" variable empty.
|
||||
# Use "start" and "end" variables for two color gradient
|
||||
# Use "start", "mid" and "end" for three color gradient
|
||||
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#2E3440"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#D8DEE9"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#8FBCBB"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#5E81AC"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#4C566A"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#ECEFF4"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#4C566A"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#5E81AC"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#4C566A"
|
||||
|
||||
# Memory/disks box outline color
|
||||
theme[mem_box]="#4C566A"
|
||||
|
||||
# Net up/down box outline color
|
||||
theme[net_box]="#4C566A"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#4C566A"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#4C566A"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#81A1C1"
|
||||
theme[temp_mid]="#88C0D0"
|
||||
theme[temp_end]="#ECEFF4"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#81A1C1"
|
||||
theme[cpu_mid]="#88C0D0"
|
||||
theme[cpu_end]="#ECEFF4"
|
||||
|
||||
# Mem/Disk free meter
|
||||
theme[free_start]="#81A1C1"
|
||||
theme[free_mid]="#88C0D0"
|
||||
theme[free_end]="#ECEFF4"
|
||||
|
||||
# Mem/Disk cached meter
|
||||
theme[cached_start]="#81A1C1"
|
||||
theme[cached_mid]="#88C0D0"
|
||||
theme[cached_end]="#ECEFF4"
|
||||
|
||||
# Mem/Disk available meter
|
||||
theme[available_start]="#81A1C1"
|
||||
theme[available_mid]="#88C0D0"
|
||||
theme[available_end]="#ECEFF4"
|
||||
|
||||
# Mem/Disk used meter
|
||||
theme[used_start]="#81A1C1"
|
||||
theme[used_mid]="#88C0D0"
|
||||
theme[used_end]="#ECEFF4"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#81A1C1"
|
||||
theme[download_mid]="#88C0D0"
|
||||
theme[download_end]="#ECEFF4"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#81A1C1"
|
||||
theme[upload_mid]="#88C0D0"
|
||||
theme[upload_end]="#ECEFF4"
|
||||
14
themes/nord/waybar.css
Normal file
@@ -0,0 +1,14 @@
|
||||
@define-color background #2e3440;
|
||||
@define-color foreground #d8dee9;
|
||||
@define-color accent #88c0d0;
|
||||
|
||||
/* Base style for Nord */
|
||||
* {
|
||||
font-family: JetBrainsMono Nerd Font, FontAwesome;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
background-color: @background;
|
||||
color: @foreground;
|
||||
}
|
||||
39
themes/osaka-jade.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Osaka Jade",
|
||||
"slug": "osaka-jade",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#111c18",
|
||||
"mantle": "#0e1814",
|
||||
"surface": "#23372B",
|
||||
"overlay": "#53685B",
|
||||
"text": "#C1C497",
|
||||
"subtext": "#F6F5DD",
|
||||
"muted": "#53685B",
|
||||
"accent": "#509475",
|
||||
"accentAlt": "#D2689C",
|
||||
"good": "#549e6a",
|
||||
"warn": "#459451",
|
||||
"bad": "#FF5345"
|
||||
},
|
||||
"ansi": [
|
||||
"#23372B",
|
||||
"#FF5345",
|
||||
"#549e6a",
|
||||
"#459451",
|
||||
"#509475",
|
||||
"#D2689C",
|
||||
"#2DD5B7",
|
||||
"#F6F5DD",
|
||||
"#53685B",
|
||||
"#db9f9c",
|
||||
"#63b07a",
|
||||
"#E5C736",
|
||||
"#ACD4CF",
|
||||
"#75bbb3",
|
||||
"#8CD3CB",
|
||||
"#9eebb3"
|
||||
]
|
||||
}
|
||||
BIN
themes/osaka-jade/backgrounds/1-glowing-city.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
themes/osaka-jade/backgrounds/2-shaded-entrance.jpg
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
themes/osaka-jade/backgrounds/3-mountain-moon.jpg
Normal file
|
After Width: | Height: | Size: 2.1 MiB |
87
themes/osaka-jade/btop.theme
Normal file
@@ -0,0 +1,87 @@
|
||||
# Main background
|
||||
theme[main_bg]="#111c18"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#F7E8B2"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#D6D5BC"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#E67D64"
|
||||
|
||||
# Background color of selected items
|
||||
theme[selected_bg]="#364538"
|
||||
|
||||
# Foreground color of selected items
|
||||
theme[selected_fg]="#DEB266"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#32473B"
|
||||
|
||||
# Color of text appearing on top of graphs
|
||||
theme[graph_text]="#E6D8BA"
|
||||
|
||||
# Misc colors for processes box
|
||||
theme[proc_misc]="#E6D8BA"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#81B8A8"
|
||||
|
||||
# Memory/disks box outline color
|
||||
theme[mem_box]="#81B8A8"
|
||||
|
||||
# Net up/down box outline color
|
||||
theme[net_box]="#81B8A8"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#81B8A8"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#81B8A8"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#BFD99A"
|
||||
theme[temp_mid]="#E1B55E"
|
||||
theme[temp_end]="#DBB05C"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#5F8C86"
|
||||
theme[cpu_mid]="#629C89"
|
||||
theme[cpu_end]="#76AD98"
|
||||
|
||||
# Mem/Disk free meter
|
||||
theme[free_start]="#5F8C86"
|
||||
theme[free_mid]="#629C89"
|
||||
theme[free_end]="#76AD98"
|
||||
|
||||
# Mem/Disk cached meter
|
||||
theme[cached_start]="#5F8C86"
|
||||
theme[cached_mid]="#629C89"
|
||||
theme[cached_end]="#76AD98"
|
||||
|
||||
# Mem/Disk available meter
|
||||
theme[available_start]="#5F8C86"
|
||||
theme[available_mid]="#629C89"
|
||||
theme[available_end]="#76AD98"
|
||||
|
||||
# Mem/Disk used meter
|
||||
theme[used_start]="#5F8C86"
|
||||
theme[used_mid]="#629C89"
|
||||
theme[used_end]="#76AD98"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#75BBB3"
|
||||
theme[download_mid]="#61949A"
|
||||
theme[download_end]="#215866"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#215866"
|
||||
theme[upload_mid]="#91C080"
|
||||
theme[upload_end]="#549E6A"
|
||||
|
||||
# Process box color gradient for threads, mem and cpu usage
|
||||
theme[process_start]="#72CFA3"
|
||||
theme[process_mid]="#D0D494"
|
||||
theme[process_end]="#DB9F9C"
|
||||
|
||||
39
themes/retro-82.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Retro 82",
|
||||
"slug": "retro-82",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#05182e",
|
||||
"mantle": "#041427",
|
||||
"surface": "#00172e",
|
||||
"overlay": "#134e5a",
|
||||
"text": "#f6dcac",
|
||||
"subtext": "#a7c9c6",
|
||||
"muted": "#134e5a",
|
||||
"accent": "#faa968",
|
||||
"accentAlt": "#3f8f8a",
|
||||
"good": "#028391",
|
||||
"warn": "#e97b3c",
|
||||
"bad": "#f85525"
|
||||
},
|
||||
"ansi": [
|
||||
"#00172e",
|
||||
"#f85525",
|
||||
"#028391",
|
||||
"#e97b3c",
|
||||
"#faa968",
|
||||
"#3f8f8a",
|
||||
"#8cbfb8",
|
||||
"#a7c9c6",
|
||||
"#134e5a",
|
||||
"#f85525",
|
||||
"#028391",
|
||||
"#e97b3c",
|
||||
"#faa968",
|
||||
"#3f8f8a",
|
||||
"#8cbfb8",
|
||||
"#f6dcac"
|
||||
]
|
||||
}
|
||||
BIN
themes/retro-82/backgrounds/1-in-the-groove.jpg
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
themes/retro-82/backgrounds/2-dusk-guardian.jpg
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
themes/retro-82/backgrounds/3-glassy-lines.jpg
Normal file
|
After Width: | Height: | Size: 3.4 MiB |
BIN
themes/retro-82/backgrounds/4-gateway.jpg
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
themes/retro-82/backgrounds/5-zen-boat.jpg
Normal file
|
After Width: | Height: | Size: 2.5 MiB |
BIN
themes/retro-82/backgrounds/6-abstract-pyramids.jpg
Normal file
|
After Width: | Height: | Size: 3.4 MiB |
BIN
themes/retro-82/backgrounds/7-the-journey.jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
themes/retro-82/backgrounds/8-glitter-glass.jpg
Normal file
|
After Width: | Height: | Size: 889 KiB |
63
themes/retro-82/btop.theme
Normal file
@@ -0,0 +1,63 @@
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]=""
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#f6dcac"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#3f8f8a"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#8cbfb8"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#134e5a"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#f6dcac"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#134e5a"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#3f8f8a"
|
||||
|
||||
# Box outline and divider line color
|
||||
theme[cpu_box]="#e97b3c"
|
||||
theme[mem_box]="#e97b3c"
|
||||
theme[net_box]="#e97b3c"
|
||||
theme[proc_box]="#e97b3c"
|
||||
theme[div_line]="#134e5a"
|
||||
|
||||
# Gradient for all meters and graphs
|
||||
theme[temp_start]="#a7c9c6"
|
||||
theme[temp_mid]="#8cbfb8"
|
||||
theme[temp_end]="#028391"
|
||||
|
||||
theme[cpu_start]="#a7c9c6"
|
||||
theme[cpu_mid]="#e97b3c"
|
||||
theme[cpu_end]="#f85525"
|
||||
|
||||
theme[free_start]="#faa968"
|
||||
theme[free_mid]="#e97b3c"
|
||||
theme[free_end]="#f85525"
|
||||
|
||||
theme[cached_start]="#faa968"
|
||||
theme[cached_mid]="#e97b3c"
|
||||
theme[cached_end]="#f85525"
|
||||
|
||||
theme[available_start]="#faa968"
|
||||
theme[available_mid]="#e97b3c"
|
||||
theme[available_end]="#f85525"
|
||||
|
||||
theme[used_start]="#faa968"
|
||||
theme[used_mid]="#e97b3c"
|
||||
theme[used_end]="#f85525"
|
||||
|
||||
theme[download_start]="#faa968"
|
||||
theme[download_mid]="#e97b3c"
|
||||
theme[download_end]="#f85525"
|
||||
|
||||
theme[upload_start]="#faa968"
|
||||
theme[upload_mid]="#e97b3c"
|
||||
theme[upload_end]="#f85525"
|
||||
3
themes/retro-82/waybar.css
Normal file
@@ -0,0 +1,3 @@
|
||||
@define-color bg #00172e;
|
||||
@define-color foreground #f6dcac;
|
||||
@define-color background alpha(@bg, 0.8);
|
||||
39
themes/ristretto.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"name": "Ristretto",
|
||||
"slug": "ristretto",
|
||||
"mode": "dark",
|
||||
"wallpaper": "",
|
||||
"colors": {
|
||||
"base": "#2c2525",
|
||||
"mantle": "#251f1f",
|
||||
"surface": "#72696a",
|
||||
"overlay": "#948a8b",
|
||||
"text": "#e6d9db",
|
||||
"subtext": "#e6d9db",
|
||||
"muted": "#948a8b",
|
||||
"accent": "#f38d70",
|
||||
"accentAlt": "#a8a9eb",
|
||||
"good": "#adda78",
|
||||
"warn": "#f9cc6c",
|
||||
"bad": "#fd6883"
|
||||
},
|
||||
"ansi": [
|
||||
"#72696a",
|
||||
"#fd6883",
|
||||
"#adda78",
|
||||
"#f9cc6c",
|
||||
"#f38d70",
|
||||
"#a8a9eb",
|
||||
"#85dacc",
|
||||
"#e6d9db",
|
||||
"#948a8b",
|
||||
"#ff8297",
|
||||
"#c8e292",
|
||||
"#fcd675",
|
||||
"#f8a788",
|
||||
"#bebffd",
|
||||
"#9bf1e1",
|
||||
"#f1e5e7"
|
||||
]
|
||||
}
|
||||
BIN
themes/ristretto/backgrounds/1-color-curves.jpg
Normal file
|
After Width: | Height: | Size: 205 KiB |
BIN
themes/ristretto/backgrounds/2-coffee-beans.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
themes/ristretto/backgrounds/3-industrial-moon.jpg
Normal file
|
After Width: | Height: | Size: 798 KiB |
82
themes/ristretto/btop.theme
Normal file
@@ -0,0 +1,82 @@
|
||||
#Btop monokai pro ristretto theme
|
||||
#Reconfigured from monokai theme
|
||||
|
||||
# Main background, empty for terminal default, need to be empty if you want transparent background
|
||||
theme[main_bg]="#2c2421"
|
||||
|
||||
# Main text color
|
||||
theme[main_fg]="#e6d9db"
|
||||
|
||||
# Title color for boxes
|
||||
theme[title]="#e6d9db"
|
||||
|
||||
# Highlight color for keyboard shortcuts
|
||||
theme[hi_fg]="#fd6883"
|
||||
|
||||
# Background color of selected item in processes box
|
||||
theme[selected_bg]="#3d2f2a"
|
||||
|
||||
# Foreground color of selected item in processes box
|
||||
theme[selected_fg]="#e6d9db"
|
||||
|
||||
# Color of inactive/disabled text
|
||||
theme[inactive_fg]="#72696a"
|
||||
|
||||
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
|
||||
theme[proc_misc]="#adda78"
|
||||
|
||||
# Cpu box outline color
|
||||
theme[cpu_box]="#5b4a45"
|
||||
|
||||
# Memory/disks box outline color
|
||||
theme[mem_box]="#5b4a45"
|
||||
|
||||
# Net up/down box outline color
|
||||
theme[net_box]="#5b4a45"
|
||||
|
||||
# Processes box outline color
|
||||
theme[proc_box]="#5b4a45"
|
||||
|
||||
# Box divider line and small boxes line color
|
||||
theme[div_line]="#72696a"
|
||||
|
||||
# Temperature graph colors
|
||||
theme[temp_start]="#a8a9eb"
|
||||
theme[temp_mid]="#f38d70"
|
||||
theme[temp_end]="#fd6a85"
|
||||
|
||||
# CPU graph colors
|
||||
theme[cpu_start]="#adda78"
|
||||
theme[cpu_mid]="#f9cc6c"
|
||||
theme[cpu_end]="#fd6883"
|
||||
|
||||
# Mem/Disk free meter
|
||||
theme[free_start]="#5b4a45"
|
||||
theme[free_mid]="#adda78"
|
||||
theme[free_end]="#c5e2a3"
|
||||
|
||||
# Mem/Disk cached meter
|
||||
theme[cached_start]="#5b4a45"
|
||||
theme[cached_mid]="#85dacc"
|
||||
theme[cached_end]="#b3e8dd"
|
||||
|
||||
# Mem/Disk available meter
|
||||
theme[available_start]="#5b4a45"
|
||||
theme[available_mid]="#f9cc6c"
|
||||
theme[available_end]="#fce2a3"
|
||||
|
||||
# Mem/Disk used meter
|
||||
theme[used_start]="#5b4a45"
|
||||
theme[used_mid]="#fd6a85"
|
||||
theme[used_end]="#feb5c7"
|
||||
|
||||
# Download graph colors
|
||||
theme[download_start]="#3d2f2a"
|
||||
theme[download_mid]="#a8a9eb"
|
||||
theme[download_end]="#c5c6f0"
|
||||
|
||||
# Upload graph colors
|
||||
theme[upload_start]="#3d2f2a"
|
||||
theme[upload_mid]="#fd6a85"
|
||||
theme[upload_end]="#feb5c7"
|
||||
|
||||