commit f211ef0d09cc4d08d4aec65f38031b899f4e25a3 Author: Bernardo Magri Date: Wed Jun 10 10:59:13 2026 +0100 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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b47b0f --- /dev/null +++ b/.gitignore @@ -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 diff --git a/README.md b/README.md new file mode 100644 index 0000000..5009be7 --- /dev/null +++ b/README.md @@ -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: .json + optional / 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 ` 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//`) + +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//` 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 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 diff --git a/docs/TESTING.md b/docs/TESTING.md new file mode 100644 index 0000000..2ec2951 --- /dev/null +++ b/docs/TESTING.md @@ -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 # 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 ` 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. diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..ccfbad1 --- /dev/null +++ b/flake.nix @@ -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 + ]; + } + ]; + }; + }; +} diff --git a/hosts/default/configuration.nix b/hosts/default/configuration.nix new file mode 100644 index 0000000..055d484 --- /dev/null +++ b/hosts/default/configuration.nix @@ -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"; +} diff --git a/hosts/default/hardware-configuration.nix b/hosts/default/hardware-configuration.nix new file mode 100644 index 0000000..5691209 --- /dev/null +++ b/hosts/default/hardware-configuration.nix @@ -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"; +} diff --git a/hosts/live.nix b/hosts/live.nix new file mode 100644 index 0000000..de73237 --- /dev/null +++ b/hosts/live.nix @@ -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 (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"; +} diff --git a/modules/home/btop.nix b/modules/home/btop.nix new file mode 100644 index 0000000..7dfd4bd --- /dev/null +++ b/modules/home/btop.nix @@ -0,0 +1,61 @@ +# btop — themed from per-theme assets, baked at eval time. +# A hand-made themes//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; }; + }; +} diff --git a/modules/home/default.nix b/modules/home/default.nix new file mode 100644 index 0000000..1704b13 --- /dev/null +++ b/modules/home/default.nix @@ -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; +} diff --git a/modules/home/ghostty.nix b/modules/home/ghostty.nix new file mode 100644 index 0000000..01c45f5 --- /dev/null +++ b/modules/home/ghostty.nix @@ -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; + }; + }; +} diff --git a/modules/home/hyprland.nix b/modules/home/hyprland.nix new file mode 100644 index 0000000..29046bb --- /dev/null +++ b/modules/home/hyprland.nix @@ -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" + ]; + }; + }; +} diff --git a/modules/home/options.nix b/modules/home/options.nix new file mode 100644 index 0000000..69eafb8 --- /dev/null +++ b/modules/home/options.nix @@ -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 (/waybar.css, /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."; + }; + }; +} diff --git a/modules/home/stylix.nix b/modules/home/stylix.nix new file mode 100644 index 0000000..0edb147 --- /dev/null +++ b/modules/home/stylix.nix @@ -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; + }; + }; + }; +} diff --git a/modules/home/theme.nix b/modules/home/theme.nix new file mode 100644 index 0000000..0710fe8 --- /dev/null +++ b/modules/home/theme.nix @@ -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 ` 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 + ''; + }; +} diff --git a/modules/home/waybar.nix b/modules/home/waybar.nix new file mode 100644 index 0000000..e1bc3e5 --- /dev/null +++ b/modules/home/waybar.nix @@ -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 +# //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 = "{calendar}"; + }; + + 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; + }; +} diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix new file mode 100644 index 0000000..225a9ae --- /dev/null +++ b/modules/nixos/default.nix @@ -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"; + }; + }; + }; +} diff --git a/modules/nixos/options.nix b/modules/nixos/options.nix new file mode 100644 index 0000000..97cd222 --- /dev/null +++ b/modules/nixos/options.nix @@ -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; }; + }; +} diff --git a/pkgs/nomarchy-theme-sync/default.nix b/pkgs/nomarchy-theme-sync/default.nix new file mode 100644 index 0000000..cd999b5 --- /dev/null +++ b/pkgs/nomarchy-theme-sync/default.nix @@ -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; + }; +} diff --git a/pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py b/pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py new file mode 100644 index 0000000..3bf3a9c --- /dev/null +++ b/pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py @@ -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 merge a preset into the state + rebuild + set 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/.json may have a sibling directory +# themes// 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() diff --git a/templates/downstream/README.md b/templates/downstream/README.md new file mode 100644 index 0000000..f68fcc3 --- /dev/null +++ b/templates/downstream/README.md @@ -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`. diff --git a/templates/downstream/flake.nix b/templates/downstream/flake.nix new file mode 100644 index 0000000..d83b9ee --- /dev/null +++ b/templates/downstream/flake.nix @@ -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 ` 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}"; + }; + } + ]; + }; + }; +} diff --git a/templates/downstream/home.nix b/templates/downstream/home.nix new file mode 100644 index 0000000..29b4ba1 --- /dev/null +++ b/templates/downstream/home.nix @@ -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 + ]; +} diff --git a/templates/downstream/system.nix b/templates/downstream/system.nix new file mode 100644 index 0000000..0b202e3 --- /dev/null +++ b/templates/downstream/system.nix @@ -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"; +} diff --git a/templates/downstream/theme-state.json b/templates/downstream/theme-state.json new file mode 100644 index 0000000..635e11d --- /dev/null +++ b/templates/downstream/theme-state.json @@ -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 + } +} diff --git a/theme-state.json b/theme-state.json new file mode 100644 index 0000000..635e11d --- /dev/null +++ b/theme-state.json @@ -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 + } +} diff --git a/themes/catppuccin-latte.json b/themes/catppuccin-latte.json new file mode 100644 index 0000000..a6565d7 --- /dev/null +++ b/themes/catppuccin-latte.json @@ -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" + ] +} diff --git a/themes/catppuccin-latte/backgrounds/1-color-fade.png b/themes/catppuccin-latte/backgrounds/1-color-fade.png new file mode 100644 index 0000000..ee0cd94 Binary files /dev/null and b/themes/catppuccin-latte/backgrounds/1-color-fade.png differ diff --git a/themes/catppuccin-latte/btop.theme b/themes/catppuccin-latte/btop.theme new file mode 100644 index 0000000..87ed181 --- /dev/null +++ b/themes/catppuccin-latte/btop.theme @@ -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" diff --git a/themes/catppuccin.json b/themes/catppuccin.json new file mode 100644 index 0000000..da34057 --- /dev/null +++ b/themes/catppuccin.json @@ -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" + ] +} diff --git a/themes/catppuccin/backgrounds/1-totoro.png b/themes/catppuccin/backgrounds/1-totoro.png new file mode 100644 index 0000000..5fbcebc Binary files /dev/null and b/themes/catppuccin/backgrounds/1-totoro.png differ diff --git a/themes/catppuccin/backgrounds/2-waves.png b/themes/catppuccin/backgrounds/2-waves.png new file mode 100644 index 0000000..a0b5325 Binary files /dev/null and b/themes/catppuccin/backgrounds/2-waves.png differ diff --git a/themes/catppuccin/backgrounds/3-blue-eye.png b/themes/catppuccin/backgrounds/3-blue-eye.png new file mode 100644 index 0000000..30b5963 Binary files /dev/null and b/themes/catppuccin/backgrounds/3-blue-eye.png differ diff --git a/themes/catppuccin/btop.theme b/themes/catppuccin/btop.theme new file mode 100644 index 0000000..f0395b3 --- /dev/null +++ b/themes/catppuccin/btop.theme @@ -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" diff --git a/themes/catppuccin/waybar.css b/themes/catppuccin/waybar.css new file mode 100644 index 0000000..bf35a40 --- /dev/null +++ b/themes/catppuccin/waybar.css @@ -0,0 +1,2 @@ +@define-color foreground #cdd6f4; +@define-color background #181824; diff --git a/themes/ethereal.json b/themes/ethereal.json new file mode 100644 index 0000000..2b8fdc0 --- /dev/null +++ b/themes/ethereal.json @@ -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" + ] +} diff --git a/themes/ethereal/backgrounds/1-cosmic.jpg b/themes/ethereal/backgrounds/1-cosmic.jpg new file mode 100644 index 0000000..e5c1463 Binary files /dev/null and b/themes/ethereal/backgrounds/1-cosmic.jpg differ diff --git a/themes/ethereal/backgrounds/2-meadow.jpg b/themes/ethereal/backgrounds/2-meadow.jpg new file mode 100644 index 0000000..95fdafb Binary files /dev/null and b/themes/ethereal/backgrounds/2-meadow.jpg differ diff --git a/themes/ethereal/btop.theme b/themes/ethereal/btop.theme new file mode 100644 index 0000000..135da3d --- /dev/null +++ b/themes/ethereal/btop.theme @@ -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" \ No newline at end of file diff --git a/themes/everforest.json b/themes/everforest.json new file mode 100644 index 0000000..054406e --- /dev/null +++ b/themes/everforest.json @@ -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" + ] +} diff --git a/themes/everforest/backgrounds/1-tree-tops.jpg b/themes/everforest/backgrounds/1-tree-tops.jpg new file mode 100644 index 0000000..6d75259 Binary files /dev/null and b/themes/everforest/backgrounds/1-tree-tops.jpg differ diff --git a/themes/everforest/btop.theme b/themes/everforest/btop.theme new file mode 100644 index 0000000..2ad33bb --- /dev/null +++ b/themes/everforest/btop.theme @@ -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" + diff --git a/themes/flexoki-light.json b/themes/flexoki-light.json new file mode 100644 index 0000000..e972540 --- /dev/null +++ b/themes/flexoki-light.json @@ -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" + ] +} diff --git a/themes/flexoki-light/backgrounds/1-orb.png b/themes/flexoki-light/backgrounds/1-orb.png new file mode 100644 index 0000000..a564a17 Binary files /dev/null and b/themes/flexoki-light/backgrounds/1-orb.png differ diff --git a/themes/flexoki-light/backgrounds/2-nomarchy.png b/themes/flexoki-light/backgrounds/2-nomarchy.png new file mode 100644 index 0000000..cc755b1 Binary files /dev/null and b/themes/flexoki-light/backgrounds/2-nomarchy.png differ diff --git a/themes/flexoki-light/btop.theme b/themes/flexoki-light/btop.theme new file mode 100644 index 0000000..0caf9c6 --- /dev/null +++ b/themes/flexoki-light/btop.theme @@ -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" diff --git a/themes/gruvbox.json b/themes/gruvbox.json new file mode 100644 index 0000000..a95691d --- /dev/null +++ b/themes/gruvbox.json @@ -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" + ] +} diff --git a/themes/gruvbox/backgrounds/1-the-backwater.jpg b/themes/gruvbox/backgrounds/1-the-backwater.jpg new file mode 100644 index 0000000..c9ff531 Binary files /dev/null and b/themes/gruvbox/backgrounds/1-the-backwater.jpg differ diff --git a/themes/gruvbox/backgrounds/2-flower-basket.jpg b/themes/gruvbox/backgrounds/2-flower-basket.jpg new file mode 100644 index 0000000..42af8d1 Binary files /dev/null and b/themes/gruvbox/backgrounds/2-flower-basket.jpg differ diff --git a/themes/gruvbox/backgrounds/3-village-square.jpg b/themes/gruvbox/backgrounds/3-village-square.jpg new file mode 100644 index 0000000..0ff0160 Binary files /dev/null and b/themes/gruvbox/backgrounds/3-village-square.jpg differ diff --git a/themes/gruvbox/backgrounds/4-idyllic-procession.jpg b/themes/gruvbox/backgrounds/4-idyllic-procession.jpg new file mode 100644 index 0000000..3742024 Binary files /dev/null and b/themes/gruvbox/backgrounds/4-idyllic-procession.jpg differ diff --git a/themes/gruvbox/backgrounds/5-leaves.jpg b/themes/gruvbox/backgrounds/5-leaves.jpg new file mode 100644 index 0000000..fd31869 Binary files /dev/null and b/themes/gruvbox/backgrounds/5-leaves.jpg differ diff --git a/themes/gruvbox/btop.theme b/themes/gruvbox/btop.theme new file mode 100644 index 0000000..0584954 --- /dev/null +++ b/themes/gruvbox/btop.theme @@ -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" diff --git a/themes/hackerman.json b/themes/hackerman.json new file mode 100644 index 0000000..39bd534 --- /dev/null +++ b/themes/hackerman.json @@ -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" + ] +} diff --git a/themes/hackerman/backgrounds/1-synth-scape.jpg b/themes/hackerman/backgrounds/1-synth-scape.jpg new file mode 100644 index 0000000..7a36f6a Binary files /dev/null and b/themes/hackerman/backgrounds/1-synth-scape.jpg differ diff --git a/themes/hackerman/backgrounds/2-geometric.jpg b/themes/hackerman/backgrounds/2-geometric.jpg new file mode 100644 index 0000000..a18aff8 Binary files /dev/null and b/themes/hackerman/backgrounds/2-geometric.jpg differ diff --git a/themes/hackerman/btop.theme b/themes/hackerman/btop.theme new file mode 100644 index 0000000..7609189 --- /dev/null +++ b/themes/hackerman/btop.theme @@ -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" \ No newline at end of file diff --git a/themes/kanagawa.json b/themes/kanagawa.json new file mode 100644 index 0000000..96076d0 --- /dev/null +++ b/themes/kanagawa.json @@ -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" + ] +} diff --git a/themes/kanagawa/backgrounds/1-kanagawa.jpg b/themes/kanagawa/backgrounds/1-kanagawa.jpg new file mode 100644 index 0000000..197c48d Binary files /dev/null and b/themes/kanagawa/backgrounds/1-kanagawa.jpg differ diff --git a/themes/kanagawa/btop.theme b/themes/kanagawa/btop.theme new file mode 100644 index 0000000..5202748 --- /dev/null +++ b/themes/kanagawa/btop.theme @@ -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" diff --git a/themes/lumon.json b/themes/lumon.json new file mode 100644 index 0000000..e8558df --- /dev/null +++ b/themes/lumon.json @@ -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" + ] +} diff --git a/themes/lumon/backgrounds/01-united-in-severance.jpg b/themes/lumon/backgrounds/01-united-in-severance.jpg new file mode 100644 index 0000000..d07b636 Binary files /dev/null and b/themes/lumon/backgrounds/01-united-in-severance.jpg differ diff --git a/themes/lumon/backgrounds/02-opinions-equally.jpg b/themes/lumon/backgrounds/02-opinions-equally.jpg new file mode 100644 index 0000000..4f2a0bf Binary files /dev/null and b/themes/lumon/backgrounds/02-opinions-equally.jpg differ diff --git a/themes/lumon/btop.theme b/themes/lumon/btop.theme new file mode 100644 index 0000000..d9d0572 --- /dev/null +++ b/themes/lumon/btop.theme @@ -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" diff --git a/themes/lumon/waybar.css b/themes/lumon/waybar.css new file mode 100644 index 0000000..11f4905 --- /dev/null +++ b/themes/lumon/waybar.css @@ -0,0 +1,2 @@ +@define-color foreground #d6e2ee; +@define-color background #213442; diff --git a/themes/matte-black.json b/themes/matte-black.json new file mode 100644 index 0000000..714b5f2 --- /dev/null +++ b/themes/matte-black.json @@ -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" + ] +} diff --git a/themes/matte-black/backgrounds/0-ship-at-sea.jpg b/themes/matte-black/backgrounds/0-ship-at-sea.jpg new file mode 100644 index 0000000..4375ee2 Binary files /dev/null and b/themes/matte-black/backgrounds/0-ship-at-sea.jpg differ diff --git a/themes/matte-black/backgrounds/1-dark-waters.jpg b/themes/matte-black/backgrounds/1-dark-waters.jpg new file mode 100644 index 0000000..2afb1bc Binary files /dev/null and b/themes/matte-black/backgrounds/1-dark-waters.jpg differ diff --git a/themes/matte-black/backgrounds/2-dot-hands.jpg b/themes/matte-black/backgrounds/2-dot-hands.jpg new file mode 100644 index 0000000..b76792c Binary files /dev/null and b/themes/matte-black/backgrounds/2-dot-hands.jpg differ diff --git a/themes/matte-black/btop.theme b/themes/matte-black/btop.theme new file mode 100644 index 0000000..472154c --- /dev/null +++ b/themes/matte-black/btop.theme @@ -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" diff --git a/themes/miasma.json b/themes/miasma.json new file mode 100644 index 0000000..bcc23cf --- /dev/null +++ b/themes/miasma.json @@ -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" + ] +} diff --git a/themes/miasma/backgrounds/01-nature-of-fear.jpg b/themes/miasma/backgrounds/01-nature-of-fear.jpg new file mode 100644 index 0000000..16cf45b Binary files /dev/null and b/themes/miasma/backgrounds/01-nature-of-fear.jpg differ diff --git a/themes/miasma/backgrounds/02-crowned.jpg b/themes/miasma/backgrounds/02-crowned.jpg new file mode 100644 index 0000000..3a83fb3 Binary files /dev/null and b/themes/miasma/backgrounds/02-crowned.jpg differ diff --git a/themes/miasma/btop.theme b/themes/miasma/btop.theme new file mode 100644 index 0000000..4db76eb --- /dev/null +++ b/themes/miasma/btop.theme @@ -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" diff --git a/themes/nord.json b/themes/nord.json new file mode 100644 index 0000000..6c12550 --- /dev/null +++ b/themes/nord.json @@ -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" + ] +} diff --git a/themes/nord/backgrounds/0-black-moon.jpg b/themes/nord/backgrounds/0-black-moon.jpg new file mode 100644 index 0000000..55df377 Binary files /dev/null and b/themes/nord/backgrounds/0-black-moon.jpg differ diff --git a/themes/nord/backgrounds/1-city-view.png b/themes/nord/backgrounds/1-city-view.png new file mode 100644 index 0000000..56dbc1d Binary files /dev/null and b/themes/nord/backgrounds/1-city-view.png differ diff --git a/themes/nord/backgrounds/2-night-hawks.png b/themes/nord/backgrounds/2-night-hawks.png new file mode 100644 index 0000000..412eb52 Binary files /dev/null and b/themes/nord/backgrounds/2-night-hawks.png differ diff --git a/themes/nord/btop.theme b/themes/nord/btop.theme new file mode 100644 index 0000000..fbd0af1 --- /dev/null +++ b/themes/nord/btop.theme @@ -0,0 +1,89 @@ +#Bashtop theme with nord palette (https://www.nordtheme.com) +#by Justin Zobel + +# 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" diff --git a/themes/nord/waybar.css b/themes/nord/waybar.css new file mode 100644 index 0000000..5238598 --- /dev/null +++ b/themes/nord/waybar.css @@ -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; +} diff --git a/themes/osaka-jade.json b/themes/osaka-jade.json new file mode 100644 index 0000000..e794f56 --- /dev/null +++ b/themes/osaka-jade.json @@ -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" + ] +} diff --git a/themes/osaka-jade/backgrounds/1-glowing-city.jpg b/themes/osaka-jade/backgrounds/1-glowing-city.jpg new file mode 100644 index 0000000..be7d857 Binary files /dev/null and b/themes/osaka-jade/backgrounds/1-glowing-city.jpg differ diff --git a/themes/osaka-jade/backgrounds/2-shaded-entrance.jpg b/themes/osaka-jade/backgrounds/2-shaded-entrance.jpg new file mode 100644 index 0000000..9b97956 Binary files /dev/null and b/themes/osaka-jade/backgrounds/2-shaded-entrance.jpg differ diff --git a/themes/osaka-jade/backgrounds/3-mountain-moon.jpg b/themes/osaka-jade/backgrounds/3-mountain-moon.jpg new file mode 100644 index 0000000..729ccae Binary files /dev/null and b/themes/osaka-jade/backgrounds/3-mountain-moon.jpg differ diff --git a/themes/osaka-jade/btop.theme b/themes/osaka-jade/btop.theme new file mode 100644 index 0000000..8e22ec9 --- /dev/null +++ b/themes/osaka-jade/btop.theme @@ -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" + diff --git a/themes/retro-82.json b/themes/retro-82.json new file mode 100644 index 0000000..a5c9177 --- /dev/null +++ b/themes/retro-82.json @@ -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" + ] +} diff --git a/themes/retro-82/backgrounds/1-in-the-groove.jpg b/themes/retro-82/backgrounds/1-in-the-groove.jpg new file mode 100644 index 0000000..c9537a4 Binary files /dev/null and b/themes/retro-82/backgrounds/1-in-the-groove.jpg differ diff --git a/themes/retro-82/backgrounds/2-dusk-guardian.jpg b/themes/retro-82/backgrounds/2-dusk-guardian.jpg new file mode 100644 index 0000000..4f30b56 Binary files /dev/null and b/themes/retro-82/backgrounds/2-dusk-guardian.jpg differ diff --git a/themes/retro-82/backgrounds/3-glassy-lines.jpg b/themes/retro-82/backgrounds/3-glassy-lines.jpg new file mode 100644 index 0000000..c1106dc Binary files /dev/null and b/themes/retro-82/backgrounds/3-glassy-lines.jpg differ diff --git a/themes/retro-82/backgrounds/4-gateway.jpg b/themes/retro-82/backgrounds/4-gateway.jpg new file mode 100644 index 0000000..067baa4 Binary files /dev/null and b/themes/retro-82/backgrounds/4-gateway.jpg differ diff --git a/themes/retro-82/backgrounds/5-zen-boat.jpg b/themes/retro-82/backgrounds/5-zen-boat.jpg new file mode 100644 index 0000000..4a4821e Binary files /dev/null and b/themes/retro-82/backgrounds/5-zen-boat.jpg differ diff --git a/themes/retro-82/backgrounds/6-abstract-pyramids.jpg b/themes/retro-82/backgrounds/6-abstract-pyramids.jpg new file mode 100644 index 0000000..6dd9d0a Binary files /dev/null and b/themes/retro-82/backgrounds/6-abstract-pyramids.jpg differ diff --git a/themes/retro-82/backgrounds/7-the-journey.jpg b/themes/retro-82/backgrounds/7-the-journey.jpg new file mode 100644 index 0000000..03fc55c Binary files /dev/null and b/themes/retro-82/backgrounds/7-the-journey.jpg differ diff --git a/themes/retro-82/backgrounds/8-glitter-glass.jpg b/themes/retro-82/backgrounds/8-glitter-glass.jpg new file mode 100644 index 0000000..dfa5322 Binary files /dev/null and b/themes/retro-82/backgrounds/8-glitter-glass.jpg differ diff --git a/themes/retro-82/btop.theme b/themes/retro-82/btop.theme new file mode 100644 index 0000000..ded67f1 --- /dev/null +++ b/themes/retro-82/btop.theme @@ -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" diff --git a/themes/retro-82/waybar.css b/themes/retro-82/waybar.css new file mode 100644 index 0000000..f5944b1 --- /dev/null +++ b/themes/retro-82/waybar.css @@ -0,0 +1,3 @@ +@define-color bg #00172e; +@define-color foreground #f6dcac; +@define-color background alpha(@bg, 0.8); diff --git a/themes/ristretto.json b/themes/ristretto.json new file mode 100644 index 0000000..528d5aa --- /dev/null +++ b/themes/ristretto.json @@ -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" + ] +} diff --git a/themes/ristretto/backgrounds/1-color-curves.jpg b/themes/ristretto/backgrounds/1-color-curves.jpg new file mode 100644 index 0000000..7618e1b Binary files /dev/null and b/themes/ristretto/backgrounds/1-color-curves.jpg differ diff --git a/themes/ristretto/backgrounds/2-coffee-beans.jpg b/themes/ristretto/backgrounds/2-coffee-beans.jpg new file mode 100644 index 0000000..faf63ea Binary files /dev/null and b/themes/ristretto/backgrounds/2-coffee-beans.jpg differ diff --git a/themes/ristretto/backgrounds/3-industrial-moon.jpg b/themes/ristretto/backgrounds/3-industrial-moon.jpg new file mode 100644 index 0000000..385b01d Binary files /dev/null and b/themes/ristretto/backgrounds/3-industrial-moon.jpg differ diff --git a/themes/ristretto/btop.theme b/themes/ristretto/btop.theme new file mode 100644 index 0000000..b058a7f --- /dev/null +++ b/themes/ristretto/btop.theme @@ -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" + diff --git a/themes/rose-pine.json b/themes/rose-pine.json new file mode 100644 index 0000000..b11da41 --- /dev/null +++ b/themes/rose-pine.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "name": "Rose Pine", + "slug": "rose-pine", + "mode": "light", + "wallpaper": "", + "colors": { + "base": "#faf4ed", + "mantle": "#d4cfc9", + "surface": "#f2e9e1", + "overlay": "#9893a5", + "text": "#575279", + "subtext": "#575279", + "muted": "#9893a5", + "accent": "#56949f", + "accentAlt": "#907aa9", + "good": "#286983", + "warn": "#ea9d34", + "bad": "#b4637a" + }, + "ansi": [ + "#f2e9e1", + "#b4637a", + "#286983", + "#ea9d34", + "#56949f", + "#907aa9", + "#d7827e", + "#575279", + "#9893a5", + "#b4637a", + "#286983", + "#ea9d34", + "#56949f", + "#907aa9", + "#d7827e", + "#575279" + ] +} diff --git a/themes/rose-pine/backgrounds/1-funky-shapes.jpg b/themes/rose-pine/backgrounds/1-funky-shapes.jpg new file mode 100644 index 0000000..adfe242 Binary files /dev/null and b/themes/rose-pine/backgrounds/1-funky-shapes.jpg differ diff --git a/themes/rose-pine/backgrounds/2-dot-map.png b/themes/rose-pine/backgrounds/2-dot-map.png new file mode 100644 index 0000000..53e136c Binary files /dev/null and b/themes/rose-pine/backgrounds/2-dot-map.png differ diff --git a/themes/rose-pine/backgrounds/3-nomarchy-plants.png b/themes/rose-pine/backgrounds/3-nomarchy-plants.png new file mode 100644 index 0000000..f19c3ff Binary files /dev/null and b/themes/rose-pine/backgrounds/3-nomarchy-plants.png differ diff --git a/themes/rose-pine/btop.theme b/themes/rose-pine/btop.theme new file mode 100644 index 0000000..a992faa --- /dev/null +++ b/themes/rose-pine/btop.theme @@ -0,0 +1,119 @@ +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="#faf4ed" +# Base + +# Main text color +theme[main_fg]="#575279" +# Text + +# Title color for boxes +theme[title]="#908caa" +# Subtle + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#e0def4" +# Text + +# Background color of selected item in processes box +theme[selected_bg]="#524f67" +# HL High + +# Foreground color of selected item in processes box +theme[selected_fg]="#f6c177" +# Gold + +# Color of inactive/disabled text +theme[inactive_fg]="#403d52" +# HL Med + +# Color of text appearing on top of graphs, i.e uptime and current network graph scaling +theme[graph_text]="#9ccfd8" +# Foam + +# Background color of the percentage meters +theme[meter_bg]="#9ccfd8" +# Foam + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#c4a7e7" +# Iris + +# Cpu box outline color +theme[cpu_box]="#ebbcba" +# Rose + +# Memory/disks box outline color +theme[mem_box]="#31748f" +# Pine + +# Net up/down box outline color +theme[net_box]="#c4a7e7" +# Iris + +# Processes box outline color +theme[proc_box]="#eb6f92" +# Love + +# Box divider line and small boxes line color +theme[div_line]="#6e6a86" +# Muted + +# Temperature graph colors +theme[temp_start]="#ebbcba" +# Rose +theme[temp_mid]="#f6c177" +# Gold +theme[temp_end]="#eb6f92" +# Love + +# CPU graph colors +theme[cpu_start]="#f6c177" +# Gold +theme[cpu_mid]="#ebbcba" +# Rose +theme[cpu_end]="#eb6f92" +# Love + +# Mem/Disk free meter +# all love +theme[free_start]="#eb6f92" +theme[free_mid]="#eb6f92" +theme[free_end]="#eb6f92" + +# Mem/Disk cached meter +# all iris +theme[cached_start]="#c4a7e7" +theme[cached_mid]="#c4a7e7" +theme[cached_end]="#c4a7e7" + +# Mem/Disk available meter +# all pine +theme[available_start]="#31748f" +theme[available_mid]="#31748f" +theme[available_end]="#31748f" + +# Mem/Disk used meter +# all rose +theme[used_start]="#ebbcba" +theme[used_mid]="#ebbcba" +theme[used_end]="#ebbcba" + +# Download graph colors +# Pine for start, foam for the rest +theme[download_start]="#31748f" +theme[download_mid]="#9ccfd8" +theme[download_end]="#9ccfd8" + +# Upload graph colors +theme[upload_start]="#ebbcba" +# Rose for start +theme[upload_mid]="#eb6f92" +# Love for mid and end +theme[upload_end]="#eb6f92" + +# Process box color gradient for threads, mem and cpu usage +theme[process_start]="#31748f" +# Pine +theme[process_mid]="#9ccfd8" +# Foam for mid and end +theme[process_end]="#9ccfd8" diff --git a/themes/summer-day.json b/themes/summer-day.json new file mode 100644 index 0000000..29132ad --- /dev/null +++ b/themes/summer-day.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "name": "Summer Day", + "slug": "summer-day", + "mode": "light", + "wallpaper": "", + "colors": { + "base": "#fdf6e3", + "mantle": "#d7d1c1", + "surface": "#5c6a72", + "overlay": "#829181", + "text": "#5c6a72", + "subtext": "#fdf6e3", + "muted": "#829181", + "accent": "#3a94c5", + "accentAlt": "#df69ba", + "good": "#8da101", + "warn": "#dfa000", + "bad": "#f85552" + }, + "ansi": [ + "#5c6a72", + "#f85552", + "#8da101", + "#dfa000", + "#3a94c5", + "#df69ba", + "#35a77c", + "#fdf6e3", + "#829181", + "#f85552", + "#8da101", + "#dfa000", + "#3a94c5", + "#df69ba", + "#35a77c", + "#fdf6e3" + ] +} diff --git a/themes/summer-day/backgrounds/1-summer-day.png b/themes/summer-day/backgrounds/1-summer-day.png new file mode 100644 index 0000000..f444cea Binary files /dev/null and b/themes/summer-day/backgrounds/1-summer-day.png differ diff --git a/themes/summer-day/btop.theme b/themes/summer-day/btop.theme new file mode 100644 index 0000000..a368436 --- /dev/null +++ b/themes/summer-day/btop.theme @@ -0,0 +1,86 @@ +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="#fdf6e3" + +# Main text color +theme[main_fg]="#5c6a72" + +# Title color for boxes +theme[title]="#5c6a72" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#f85552" + +# Background color of selected items +theme[selected_bg]="#e6e2cc" + +# Foreground color of selected items +theme[selected_fg]="#dfa000" + +# Color of inactive/disabled text +theme[inactive_fg]="#bdc3af" + +# Color of text appearing on top of graphs, i.e uptime and current network graph scaling +theme[graph_text]="#5c6a72" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#8da101" + +# Cpu box outline color +theme[cpu_box]="#bdc3af" + +# Memory/disks box outline color +theme[mem_box]="#bdc3af" + +# Net up/down box outline color +theme[net_box]="#bdc3af" + +# Processes box outline color +theme[proc_box]="#bdc3af" + +# Box divider line and small boxes line color +theme[div_line]="#bdc3af" + +# Temperature graph colors +theme[temp_start]="#8da101" +theme[temp_mid]="#dfa000" +theme[temp_end]="#f85552" + +# CPU graph colors +theme[cpu_start]="#8da101" +theme[cpu_mid]="#dfa000" +theme[cpu_end]="#f85552" + +# Mem/Disk free meter +theme[free_start]="#f85552" +theme[free_mid]="#dfa000" +theme[free_end]="#8da101" + +# Mem/Disk cached meter +theme[cached_start]="#3a94c5" +theme[cached_mid]="#35a77c" +theme[cached_end]="#8da101" + +# Mem/Disk available meter +theme[available_start]="#f85552" +theme[available_mid]="#dfa000" +theme[available_end]="#8da101" + +# Mem/Disk used meter +theme[used_start]="#8da101" +theme[used_mid]="#dfa000" +theme[used_end]="#f85552" + +# Download graph colors +theme[download_start]="#8da101" +theme[download_mid]="#35a77c" +theme[download_end]="#3a94c5" + +# Upload graph colors +theme[upload_start]="#dfa000" +theme[upload_mid]="#df69ba" +theme[upload_end]="#f85552" + +# Process box color gradient for threads, mem and cpu usage +theme[process_start]="#8da101" +theme[process_mid]="#f85552" +theme[process_end]="#f85552" diff --git a/themes/summer-day/waybar.css b/themes/summer-day/waybar.css new file mode 100755 index 0000000..18ac8f3 --- /dev/null +++ b/themes/summer-day/waybar.css @@ -0,0 +1,102 @@ +@define-color bg_dim #efebd4; +@define-color bg0 #fdf6e3; +@define-color bg1 #f4f0d9; +@define-color bg2 #efebd4; +@define-color bg3 #e6e2cc; +@define-color bg4 #e0dcc7; +@define-color bg5 #bdc3af; +@define-color fg #5c6a72; +@define-color red #f85552; +@define-color orange #f57d26; +@define-color yellow #dfa000; +@define-color green #8da101; +@define-color aqua #35a77c; +@define-color blue #3a94c5; +@define-color purple #df69ba; +@define-color grey0 #a6b0a0; +@define-color grey1 #939f91; +@define-color grey2 #829181; + +/* margin: top right bottom left */ +/* Spacing outside the element */ + +/* padding: top right bottom left */ +/* Spacing inside the element */ + +* { + font-family: JetBrainsMono Nerd Font, FontAwesome; + font-size: 16px; + font-weight: bold; +} + +window#waybar { + background-color: @fg; + color: @bg0; + transition-property: background-color; + transition-duration: 0.5s; + border-radius: 0px 0px 15px 15px; + transition-duration: .5s; + + border-bottom-width: 5px; + border-bottom-color: #3d4a52; + border-bottom-style: solid; +} + +#custom-launcher, +#clock, +#clock-date, +#workspaces, +#pulseaudio, +#network, +#battery, +#custom-powermenu { + background-color: @bg0; + color: @fg; + + padding-left: 10px; + padding-right: 10px; + margin-top: 7px; + margin-bottom: 12px; + border-radius: 10px; + + border-bottom-width: 5px; + border-bottom-color: @bg5; + border-bottom-style: solid; +} + +#workspaces { + padding: 0px; +} + +#workspaces button.active { + background-color: @blue; + color: @bg0; + + border-radius: 10px; + + margin-bottom: -5px; + + border-bottom-width: 5px; + border-bottom-color: #1e6791; + border-bottom-style: solid; +} + +#custom-launcher { + background-color: @green; + color: @bg0; + border-bottom-color: #5d6b00; + + margin-left: 15px; + padding-left: 20px; + padding-right: 21px; +} + +#custom-powermenu { + background-color: @red; + color: @bg0; + border-bottom-color: #b32f2c; + + margin-right: 15px; + padding-left: 20px; + padding-right: 23px; +} diff --git a/themes/summer-night.json b/themes/summer-night.json new file mode 100644 index 0000000..488d3b1 --- /dev/null +++ b/themes/summer-night.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "name": "Summer Night", + "slug": "summer-night", + "mode": "dark", + "wallpaper": "", + "colors": { + "base": "#2d353b", + "mantle": "#262d32", + "surface": "#3c474d", + "overlay": "#868d80", + "text": "#d3c6aa", + "subtext": "#868d80", + "muted": "#868d80", + "accent": "#83b6af", + "accentAlt": "#d39bb6", + "good": "#a7c080", + "warn": "#d9bb80", + "bad": "#e68183" + }, + "ansi": [ + "#3c474d", + "#e68183", + "#a7c080", + "#d9bb80", + "#83b6af", + "#d39bb6", + "#87c095", + "#868d80", + "#868d80", + "#e68183", + "#a7c080", + "#d9bb80", + "#83b6af", + "#d39bb6", + "#87c095", + "#868d80" + ] +} diff --git a/themes/summer-night/backgrounds/1-summer-night.png b/themes/summer-night/backgrounds/1-summer-night.png new file mode 100644 index 0000000..37cfce9 Binary files /dev/null and b/themes/summer-night/backgrounds/1-summer-night.png differ diff --git a/themes/summer-night/btop.theme b/themes/summer-night/btop.theme new file mode 100644 index 0000000..33e3ebf --- /dev/null +++ b/themes/summer-night/btop.theme @@ -0,0 +1,86 @@ +# 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]="#e68183" + +# Background color of selected items +theme[selected_bg]="#3c474d" + +# Foreground color of selected items +theme[selected_fg]="#d9bb80" + +# 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]="#3c474d" + +# Memory/disks box outline color +theme[mem_box]="#3c474d" + +# Net up/down box outline color +theme[net_box]="#3c474d" + +# Processes box outline color +theme[proc_box]="#3c474d" + +# Box divider line and small boxes line color +theme[div_line]="#3c474d" + +# Temperature graph colors +theme[temp_start]="#a7c080" +theme[temp_mid]="#d9bb80" +theme[temp_end]="#e68183" + +# CPU graph colors +theme[cpu_start]="#a7c080" +theme[cpu_mid]="#d9bb80" +theme[cpu_end]="#e68183" + +# Mem/Disk free meter +theme[free_start]="#e68183" +theme[free_mid]="#d9bb80" +theme[free_end]="#a7c080" + +# Mem/Disk cached meter +theme[cached_start]="#83b6af" +theme[cached_mid]="#87c095" +theme[cached_end]="#a7c080" + +# Mem/Disk available meter +theme[available_start]="#e68183" +theme[available_mid]="#d9bb80" +theme[available_end]="#a7c080" + +# Mem/Disk used meter +theme[used_start]="#a7c080" +theme[used_mid]="#d9bb80" +theme[used_end]="#e68183" + +# Download graph colors +theme[download_start]="#a7c080" +theme[download_mid]="#87c095" +theme[download_end]="#83b6af" + +# Upload graph colors +theme[upload_start]="#d9bb80" +theme[upload_mid]="#d39bb6" +theme[upload_end]="#e68183" + +# Process box color gradient for threads, mem and cpu usage +theme[process_start]="#a7c080" +theme[process_mid]="#e68183" +theme[process_end]="#e68183" diff --git a/themes/summer-night/waybar.css b/themes/summer-night/waybar.css new file mode 100644 index 0000000..83466ad --- /dev/null +++ b/themes/summer-night/waybar.css @@ -0,0 +1,123 @@ +@define-color bg_dim #232a2e; +@define-color bg0 #2d353b; +@define-color bg1 #343f44; +@define-color bg2 #3d484d; +@define-color bg3 #475258; +@define-color bg4 #4f585e; +@define-color bg5 #56635f; +@define-color bg_visual #543a48; +@define-color bg_red #514045; +@define-color bg_green #425047; +@define-color bg_blue #3a515d; +@define-color bg_yellow #4d4c43; +@define-color fg #d3c6aa; +@define-color red #e67e80; +@define-color orange #e69875; +@define-color yellow #dbbc7f; +@define-color green #a7c080; +@define-color aqua #83c092; +@define-color blue #7fbbb3; +@define-color purple #d699b6; +@define-color grey0 #7a8478; +@define-color grey1 #859289; +@define-color grey2 #9da9a0; +/* margin: top right bottom left */ +/* Spacing outside the element */ + +/* padding: top right bottom left */ +/* Spacing inside the element */ + +* { + font-family: JetBrainsMono Nerd Font, FontAwesome; + font-size: 13px; + font-weight: bold; +} + +window#waybar { + background-color: @fg; + color: @bg0; + transition-property: background-color; + transition-duration: 0.5s; + border-radius: 0px 0px 15px 15px; + transition-duration: .5s; + + border-bottom-width: 5px; + border-bottom-color: #7d6a40; + border-bottom-style: solid; +} + +#backlight, +#tray, +#custom-nomarchy, +#clock, +#clock.date, +#workspaces, +#pulseaudio, +#idle_inhibitor, +#custom-battery, +#custom-powermenu { + background-color: @bg0; + color: @fg; + padding-left: 10px; + padding-right: 10px; + margin-top: 7px; + margin-bottom: 12px; + border-radius: 10px; + border-bottom-width: 5px; + border-bottom-color: #161a1d; + border-bottom-style: solid; +} + +#tray > .active { + color: @fg; +} + +#tray > .needs-attention { + color: @green; +} + +#workspaces { + padding: 0px; +} + +#workspaces button.active { + background-color: @blue; + color: @bg0; + border-radius: 10px; + margin-bottom: -5px; + border-bottom-width: 5px; + border-bottom-color: #366660; + border-bottom-style: solid; +} + +#custom-nomarchy { + background-color: @green; + color: @bg0; + border-bottom-color: #556a35; + + margin-left: 15px; + padding-left: 20px; + padding-right: 21px; + font-family: Nomarchy; + font-size: 20px; +} + +#custom-powermenu { + background-color: @red; + color: @bg0; + border-bottom-color: #951c1f; + + margin-right: 15px; + padding-left: 20px; + padding-right: 23px; +} + +#custom-battery.preservation { + color: @green; +} + +#idle_inhibitor { + padding-left: 10px; + padding-right: 10px; + font-size: 20px; +} diff --git a/themes/tokyo-night.json b/themes/tokyo-night.json new file mode 100644 index 0000000..aa7b209 --- /dev/null +++ b/themes/tokyo-night.json @@ -0,0 +1,39 @@ +{ + "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" + ] +} diff --git a/themes/tokyo-night/backgrounds/0-swirl-buck.jpg b/themes/tokyo-night/backgrounds/0-swirl-buck.jpg new file mode 100644 index 0000000..504f3db Binary files /dev/null and b/themes/tokyo-night/backgrounds/0-swirl-buck.jpg differ diff --git a/themes/tokyo-night/backgrounds/1-sunset-lake.png b/themes/tokyo-night/backgrounds/1-sunset-lake.png new file mode 100644 index 0000000..d806728 Binary files /dev/null and b/themes/tokyo-night/backgrounds/1-sunset-lake.png differ diff --git a/themes/tokyo-night/backgrounds/2-pawel-czerwinski.jpg b/themes/tokyo-night/backgrounds/2-pawel-czerwinski.jpg new file mode 100644 index 0000000..2767138 Binary files /dev/null and b/themes/tokyo-night/backgrounds/2-pawel-czerwinski.jpg differ diff --git a/themes/tokyo-night/backgrounds/3-milad-fakurian.jpg b/themes/tokyo-night/backgrounds/3-milad-fakurian.jpg new file mode 100644 index 0000000..b9663ff Binary files /dev/null and b/themes/tokyo-night/backgrounds/3-milad-fakurian.jpg differ diff --git a/themes/tokyo-night/btop.theme b/themes/tokyo-night/btop.theme new file mode 100644 index 0000000..290a3c7 --- /dev/null +++ b/themes/tokyo-night/btop.theme @@ -0,0 +1,82 @@ +# Theme: tokyo-night +# By: Pascal Jaeger + +# Main bg +theme[main_bg]="#1a1b26" + +# Main text color +theme[main_fg]="#cfc9c2" + +# Title color for boxes +theme[title]="#cfc9c2" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#7dcfff" + +# Background color of selected item in processes box +theme[selected_bg]="#414868" + +# Foreground color of selected item in processes box +theme[selected_fg]="#cfc9c2" + +# Color of inactive/disabled text +theme[inactive_fg]="#565f89" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#7dcfff" + +# Cpu box outline color +theme[cpu_box]="#565f89" + +# Memory/disks box outline color +theme[mem_box]="#565f89" + +# Net up/down box outline color +theme[net_box]="#565f89" + +# Processes box outline color +theme[proc_box]="#565f89" + +# Box divider line and small boxes line color +theme[div_line]="#565f89" + +# Temperature graph colors +theme[temp_start]="#9ece6a" +theme[temp_mid]="#e0af68" +theme[temp_end]="#f7768e" + +# CPU graph colors +theme[cpu_start]="#9ece6a" +theme[cpu_mid]="#e0af68" +theme[cpu_end]="#f7768e" + +# Mem/Disk free meter +theme[free_start]="#9ece6a" +theme[free_mid]="#e0af68" +theme[free_end]="#f7768e" + +# Mem/Disk cached meter +theme[cached_start]="#9ece6a" +theme[cached_mid]="#e0af68" +theme[cached_end]="#f7768e" + +# Mem/Disk available meter +theme[available_start]="#9ece6a" +theme[available_mid]="#e0af68" +theme[available_end]="#f7768e" + +# Mem/Disk used meter +theme[used_start]="#9ece6a" +theme[used_mid]="#e0af68" +theme[used_end]="#f7768e" + +# Download graph colors +theme[download_start]="#9ece6a" +theme[download_mid]="#e0af68" +theme[download_end]="#f7768e" + +# Upload graph colors +theme[upload_start]="#9ece6a" +theme[upload_mid]="#e0af68" +theme[upload_end]="#f7768e" + diff --git a/themes/vantablack.json b/themes/vantablack.json new file mode 100644 index 0000000..fada473 --- /dev/null +++ b/themes/vantablack.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "name": "Vantablack", + "slug": "vantablack", + "mode": "dark", + "wallpaper": "", + "colors": { + "base": "#0d0d0d", + "mantle": "#0b0b0b", + "surface": "#0d0d0d", + "overlay": "#fdfdfd", + "text": "#ffffff", + "subtext": "#ececec", + "muted": "#fdfdfd", + "accent": "#8d8d8d", + "accentAlt": "#9b9b9b", + "good": "#b6b6b6", + "warn": "#cecece", + "bad": "#a4a4a4" + }, + "ansi": [ + "#0d0d0d", + "#a4a4a4", + "#b6b6b6", + "#cecece", + "#8d8d8d", + "#9b9b9b", + "#b0b0b0", + "#ececec", + "#fdfdfd", + "#a4a4a4", + "#b6b6b6", + "#cecece", + "#8d8d8d", + "#9b9b9b", + "#b0b0b0", + "#ffffff" + ] +} diff --git a/themes/vantablack/backgrounds/1-twisted-stairs.jpg b/themes/vantablack/backgrounds/1-twisted-stairs.jpg new file mode 100644 index 0000000..ad81cf1 Binary files /dev/null and b/themes/vantablack/backgrounds/1-twisted-stairs.jpg differ diff --git a/themes/vantablack/backgrounds/2-layers-deep.jpg b/themes/vantablack/backgrounds/2-layers-deep.jpg new file mode 100644 index 0000000..e0f04b6 Binary files /dev/null and b/themes/vantablack/backgrounds/2-layers-deep.jpg differ diff --git a/themes/vantablack/backgrounds/3-layers-stacked.jpg b/themes/vantablack/backgrounds/3-layers-stacked.jpg new file mode 100644 index 0000000..4a81b94 Binary files /dev/null and b/themes/vantablack/backgrounds/3-layers-stacked.jpg differ diff --git a/themes/vantablack/btop.theme b/themes/vantablack/btop.theme new file mode 100644 index 0000000..cf3d98c --- /dev/null +++ b/themes/vantablack/btop.theme @@ -0,0 +1,70 @@ +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="#0d0d0d" + +# Main text color +theme[main_fg]="#ffffff" + +# Title color for boxes +theme[title]="#9b9b9b" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#b0b0b0" + +# Background color of selected item in processes box +theme[selected_bg]="#fdfdfd" + +# Foreground color of selected item in processes box +theme[selected_fg]="#ffffff" + +# Color of inactive/disabled text +theme[inactive_fg]="#fdfdfd" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#9b9b9b" + +# Box outline and divider line color +theme[cpu_box]="#b6b6b6" +theme[mem_box]="#b6b6b6" +theme[net_box]="#b6b6b6" +theme[proc_box]="#b6b6b6" +theme[div_line]="#fdfdfd" + +# Gradient for all meters and graphs +theme[temp_start]="#b0b0b0" +theme[temp_mid]="#8d8d8d" +theme[temp_end]="#b6b6b6" + + +theme[cpu_start]="#b0b0b0" +theme[cpu_mid]="#8d8d8d" +theme[cpu_end]="#b6b6b6" + + +theme[free_start]="#8d8d8d" +theme[free_mid]="#cecece" +theme[free_end]="#cecece" + + +theme[cached_start]="#cecece" +theme[cached_mid]="#cecece" +theme[cached_end]="#cecece" + + +theme[available_start]="#b0b0b0" +theme[available_mid]="#b0b0b0" +theme[available_end]="#b0b0b0" + + +theme[used_start]="#b6b6b6" +theme[used_mid]="#b6b6b6" +theme[used_end]="#b6b6b6" + + +theme[download_start]="#cecece" +theme[download_mid]="#b0b0b0" +theme[download_end]="#8d8d8d" + + +theme[upload_start]="#cecece" +theme[upload_mid]="#b0b0b0" +theme[upload_end]="#8d8d8d" \ No newline at end of file diff --git a/themes/white.json b/themes/white.json new file mode 100644 index 0000000..b65f62f --- /dev/null +++ b/themes/white.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "name": "White", + "slug": "white", + "mode": "light", + "wallpaper": "", + "colors": { + "base": "#ffffff", + "mantle": "#d9d9d9", + "surface": "#ffffff", + "overlay": "#c0c0c0", + "text": "#000000", + "subtext": "#000000", + "muted": "#c0c0c0", + "accent": "#6e6e6e", + "accentAlt": "#2e2e2e", + "good": "#3a3a3a", + "warn": "#4a4a4a", + "bad": "#2a2a2a" + }, + "ansi": [ + "#ffffff", + "#2a2a2a", + "#3a3a3a", + "#4a4a4a", + "#1a1a1a", + "#2e2e2e", + "#3e3e3e", + "#000000", + "#c0c0c0", + "#2a2a2a", + "#3a3a3a", + "#4a4a4a", + "#1a1a1a", + "#2e2e2e", + "#3e3e3e", + "#000000" + ] +} diff --git a/themes/white/backgrounds/1-white.jpg b/themes/white/backgrounds/1-white.jpg new file mode 100644 index 0000000..0e6121f Binary files /dev/null and b/themes/white/backgrounds/1-white.jpg differ diff --git a/themes/white/backgrounds/2-white.jpg b/themes/white/backgrounds/2-white.jpg new file mode 100644 index 0000000..b8c5a7d Binary files /dev/null and b/themes/white/backgrounds/2-white.jpg differ diff --git a/themes/white/backgrounds/3-white.jpg b/themes/white/backgrounds/3-white.jpg new file mode 100644 index 0000000..4ec4553 Binary files /dev/null and b/themes/white/backgrounds/3-white.jpg differ diff --git a/themes/white/btop.theme b/themes/white/btop.theme new file mode 100644 index 0000000..244253a --- /dev/null +++ b/themes/white/btop.theme @@ -0,0 +1,70 @@ +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="#ffffff" + +# Main text color +theme[main_fg]="#000000" + +# Title color for boxes +theme[title]="#2e2e2e" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#3e3e3e" + +# Background color of selected item in processes box +theme[selected_bg]="#c0c0c0" + +# Foreground color of selected item in processes box +theme[selected_fg]="#000000" + +# Color of inactive/disabled text +theme[inactive_fg]="#c0c0c0" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#2e2e2e" + +# Box outline and divider line color +theme[cpu_box]="#3a3a3a" +theme[mem_box]="#3a3a3a" +theme[net_box]="#3a3a3a" +theme[proc_box]="#3a3a3a" +theme[div_line]="#c0c0c0" + +# Gradient for all meters and graphs +theme[temp_start]="#3e3e3e" +theme[temp_mid]="#1a1a1a" +theme[temp_end]="#3a3a3a" + + +theme[cpu_start]="#3e3e3e" +theme[cpu_mid]="#1a1a1a" +theme[cpu_end]="#3a3a3a" + + +theme[free_start]="#1a1a1a" +theme[free_mid]="#4a4a4a" +theme[free_end]="#4a4a4a" + + +theme[cached_start]="#4a4a4a" +theme[cached_mid]="#4a4a4a" +theme[cached_end]="#4a4a4a" + + +theme[available_start]="#3e3e3e" +theme[available_mid]="#3e3e3e" +theme[available_end]="#3e3e3e" + + +theme[used_start]="#3a3a3a" +theme[used_mid]="#3a3a3a" +theme[used_end]="#3a3a3a" + + +theme[download_start]="#4a4a4a" +theme[download_mid]="#3e3e3e" +theme[download_end]="#1a1a1a" + + +theme[upload_start]="#4a4a4a" +theme[upload_mid]="#3e3e3e" +theme[upload_end]="#1a1a1a" \ No newline at end of file diff --git a/tools/import-palettes.py b/tools/import-palettes.py new file mode 100644 index 0000000..63c32a1 --- /dev/null +++ b/tools/import-palettes.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +"""Convert old-distro palettes (colors.toml) into Nomarchy theme JSON presets. + +Usage: tools/import-palettes.py + +Old format (per theme directory): + colors.toml kitty-style keys: background, foreground, accent, + selection_background, color0..color15 + light.mode marker file: theme is light + icons.theme icon theme name (informational, ignored for now) + backgrounds/ wallpapers + apps/ hand-made per-app theme files (btop.theme, ...) + +Output, per theme: + .json the palette (Nomarchy theme schema) + /backgrounds/ wallpapers, copied verbatim + /btop.theme copied from apps/ when present +""" + +import json +import shutil +import sys +import tomllib +from pathlib import Path + + +def darken(hex_color: str, factor: float = 0.85) -> str: + """Scale a #rrggbb color toward black (used to derive 'mantle').""" + h = hex_color.lstrip("#") + r, g, b = (int(h[i:i + 2], 16) for i in (0, 2, 4)) + return "#{:02x}{:02x}{:02x}".format(*(round(v * factor) for v in (r, g, b))) + + +def convert(theme_dir: Path) -> dict: + toml = tomllib.loads((theme_dir / "colors.toml").read_text()) + slug = theme_dir.name + ansi = [toml[f"color{i}"] for i in range(16)] + + return { + "version": 1, + "name": slug.replace("-", " ").title(), + "slug": slug, + "mode": "light" if (theme_dir / "light.mode").exists() else "dark", + # Empty = auto: nomarchy-theme-sync falls back to the first file in + # the theme's backgrounds/ directory. + "wallpaper": "", + "colors": { + "base": toml["background"], + "mantle": darken(toml["background"]), + "surface": toml["color0"], + "overlay": toml["color8"], + "text": toml["foreground"], + "subtext": toml["color7"], + "muted": toml["color8"], + "accent": toml["accent"], + "accentAlt": toml["color5"], + "good": toml["color2"], + "warn": toml["color3"], + "bad": toml["color1"], + }, + "ansi": ansi, + } + + +def main() -> None: + if len(sys.argv) != 3: + sys.exit(__doc__) + src, out = Path(sys.argv[1]), Path(sys.argv[2]) + out.mkdir(parents=True, exist_ok=True) + + converted = 0 + for theme_dir in sorted(src.iterdir()): + if not (theme_dir / "colors.toml").is_file(): + continue + theme = convert(theme_dir) + slug = theme["slug"] + (out / f"{slug}.json").write_text(json.dumps(theme, indent=2) + "\n") + + # Assets: wallpapers and hand-made per-app theme files. + extras = [] + if (theme_dir / "backgrounds").is_dir(): + shutil.copytree(theme_dir / "backgrounds", out / slug / "backgrounds", + dirs_exist_ok=True) + extras.append(f"{len(list((theme_dir / 'backgrounds').iterdir()))} wallpapers") + if (theme_dir / "apps" / "btop.theme").is_file(): + (out / slug).mkdir(parents=True, exist_ok=True) + shutil.copyfile(theme_dir / "apps" / "btop.theme", out / slug / "btop.theme") + extras.append("btop") + + print(f" {slug:<20} ({theme['mode']}{', ' + ', '.join(extras) if extras else ''})") + converted += 1 + print(f"converted {converted} palettes -> {out}") + + +if __name__ == "__main__": + main() diff --git a/tools/test-live-iso.sh b/tools/test-live-iso.sh new file mode 100755 index 0000000..92d52bf --- /dev/null +++ b/tools/test-live-iso.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# Build the Nomarchy live ISO and boot it in QEMU for a try-before-install +# run. Ported from the previous Nomarchy iteration. See docs/TESTING.md +# for what to verify once it's up. + +set -e +cd "$(dirname "$0")/.." + +echo "Building Nomarchy live ISO..." +nix build .#nixosConfigurations.nomarchy-live.config.system.build.isoImage + +ISO=$(ls -1 result/iso/*.iso 2>/dev/null | head -n 1) +if [ -z "$ISO" ]; then + echo "Error: ISO build succeeded but no .iso file found in result/iso/" >&2 + exit 1 +fi + +# Prefer UEFI with OVMF so the ISO boots the same way a modern install +# does; fall back to legacy BIOS if OVMF isn't available on this host. +OVMF_CANDIDATES=( + "/run/current-system/sw/share/OVMF/OVMF_CODE.fd" + "/run/current-system/sw/share/qemu/edk2-x86_64-code.fd" + "/nix/var/nix/profiles/system/sw/share/OVMF/OVMF_CODE.fd" + "/usr/share/OVMF/OVMF_CODE.fd" +) +BIOS_ARG=() +for c in "${OVMF_CANDIDATES[@]}"; do + if [ -f "$c" ]; then + BIOS_ARG=(-drive "if=pflash,format=raw,readonly=on,file=$c") + VARS="${c%_CODE.fd}_VARS.fd" + [ -f "$VARS" ] && BIOS_ARG+=(-drive "if=pflash,format=raw,readonly=on,file=$VARS") + break + fi +done + +# KVM if the host supports it; software emulation otherwise (slow). +ACCEL_ARG=() +[ -r /dev/kvm ] && ACCEL_ARG=(-enable-kvm -cpu host) + +echo "Launching ISO: $ISO" +# virtio-vga-gl + gl=on gives the guest real OpenGL — Hyprland and +# Ghostty need it; without GL the session may fail to start. +exec qemu-system-x86_64 \ + "${ACCEL_ARG[@]}" \ + -m 4096 -smp 2 \ + "${BIOS_ARG[@]}" \ + -device virtio-vga-gl -display gtk,gl=on \ + -device virtio-net-pci,netdev=n0 -netdev user,id=n0 \ + -cdrom "$ISO" -boot d