diff --git a/agent/BACKLOG.md b/agent/BACKLOG.md index f4b1f2b..fe81aaf 100644 --- a/agent/BACKLOG.md +++ b/agent/BACKLOG.md @@ -78,71 +78,6 @@ cable leaves. Capture steps in HARDWARE-QUEUE. ## NEXT -### 122. A crisper Nomarchy logo in fastfetch - -Bernardo 2026-07-14: the ASCII/block logo fastfetch prints should be **crisper, -with straight lines** — a "high resolution" ASCII logo rather than the chunky -mark it renders today. - -Where it comes from (`modules/home/fastfetch.nix:12-17`): the vendored vector -mark is rasterised at 220px (`rsvg-convert`), recoloured to `theme.colors.accent` -with `magick`, and converted at build time by -`chafa --format symbols --symbols block --size 20x10 --colors full`. **That -`--symbols block` is the cause**: it restricts chafa to full/half blocks, so a -20×10 grid carries roughly 20×20 pixels of detail and every diagonal turns into -a staircase. - -**`--symbols sextant` is the lever, and it is available — verified 2026-07-14 on -a real Nomarchy machine.** Chase the *fallback*, not one font's charset; this -was got wrong twice while filing, both times by checking a single font: - -- The mono face is **per theme** (`kitty.nix` → `t.fonts.mono` from the - theme JSON), not stylix's default. **Boreal — the default theme and the base - state — is `GeistMono Nerd Font`**; the other 23 themes are `JetBrainsMono - Nerd Font`. Any answer must hold for both. -- Neither of those two faces covers U+1FBxx (sextants), U+2800 (braille) — **and - GeistMono covers no block elements (U+2580–259F) or box drawing either**. So - **the logo already renders through fontconfig fallback on the default theme - today**, and has all along. Fallback is the normal case here, not the risk. -- Fallback resolves it: `fc-list :charset=1fb00` → **37 families** on a real - box, including the shipped `nerd-fonts.caskaydia-cove` plus - `noto-fonts`' Noto Sans Symbols 2; `fc-match "GeistMono Nerd Font:charset=1fb00"` - picks CaskaydiaCove. Braille: 59 families. **No tofu.** - -So the change itself is roughly a one-flag edit (`--symbols block` → -`sextant`, 2×3 subcells = 6× the detail, likely with a larger `--size` and a -matching `rsvg-convert -w`). **The work is the verification, not the edit.** -Two things can still make it look worse, and only a real terminal can say: -**(1) fallback metrics** — CaskaydiaCove's sextants drawn in GeistMono's cell -may not align or may differ in stroke weight, and this is precisely the kind of -seam that looks fine in a VM and wrong on a laptop; **(2)** the mark is -**diagonal-heavy** (an N-monogram of angled strokes), and diagonals staircase -under *any* cell symbol — more resolution makes a finer staircase, not a -straight line. If "straight lines" means the mark itself should be redrawn with -straight strokes, that is a **logo design change** to `logo.svg` — not a -renderer tweak — and it hits all three surfaces below. Settle which is wanted -before touching chafa flags. - -**Note the mark is diagonal-heavy** (an N-monogram of angled strokes), which is -the underlying tension: diagonals staircase under block symbols at *any* size. -If "straight lines" means the logo itself should be redrawn with straight -strokes, that is a **logo design change** to `logo.svg`, not a renderer tweak — -and it would hit all three surfaces below. Settle which is wanted first. - -Do **not** conflate the three logo surfaces — they are different renderers and -a change here touches only the first: fastfetch (this item), the ISO boot splash -(`hosts/live.nix` `isoSplash`, rsvg→magick), and the Waybar menu glyph -(`Nomarchy.ttf` U+F000, `modules/nixos/branding/`). The vector source -(`modules/nixos/branding/logo.svg`) is shared, so a change to *it* hits all -three — if the SVG is what needs work, say so and split the item. - -This is a **visual change**, so `agent/THEME-DESIGN.md` and the honesty rule -apply: no "it probably looks fine". Pass = the logo reads crisply in a real -terminal at the shipped font, **screenshots captured and viewed under at least -two themes** (one generated palette, one whole-swap), no tofu, it still tracks -the accent on a theme switch, and the fastfetch layout still lines up (the logo -column and the module list share a row grid — changing `--size` moves it). - ### 120. A netinstall ISO, next to the fat offline one Bernardo 2026-07-14, after seeing the measured size: **keep the current ISO @@ -234,13 +169,6 @@ a suspended machine hibernates after the configured delay and resumes, and a machine without hibernate support hides the row instead of offering a suspend that never wakes. -### 104. Runtime Airplane mode - -Add Airplane mode under System connectivity controls. It must disable Wi-Fi -and Bluetooth together, remember their prior states, and restore those states -when disengaged. Pass = the runtime round trip works, and a Waybar indicator is -visible only while engaged with parity across every whole-bar swap. - ### 105. `[big]` System-menu information architecture Keep exactly six root menu entries while reorganizing System into diff --git a/agent/HARDWARE-QUEUE.md b/agent/HARDWARE-QUEUE.md index ca46972..4942700 100644 --- a/agent/HARDWARE-QUEUE.md +++ b/agent/HARDWARE-QUEUE.md @@ -11,6 +11,13 @@ the **T14s** (webcam case). ## Any machine (dev box is fine) +- [ ] **#104 airplane mode radios (any laptop with Wi-Fi + BT)** — + after `nomarchy-home` + waybar restart: System › **Airplane mode (off)** + (or SUPER+CTRL+R). **Pass on:** Wi-Fi and Bluetooth both drop (nm-applet / + blueman confirm); Waybar shows a plane glyph; click glyph or menu again + restores **only** the radios that were on before. If Wi-Fi was already + off, it must stay off after disengage. Glyph must **not** appear when + airplane is off. - [ ] **#127 docked idle blackout (AMD dev box, 2026-07-15)** — **Incident (FAILED, unsolicited):** laptop docked, idle a few minutes, screens went black ("sleep"). External keyboard/mouse did not restore diff --git a/agent/JOURNAL.md b/agent/JOURNAL.md index cd8a329..442d22f 100644 --- a/agent/JOURNAL.md +++ b/agent/JOURNAL.md @@ -19,6 +19,20 @@ Template: --- +## 2026-07-15 — #104 airplane mode + #122 fastfetch sextant logo +- **Task:** NEXT #104 (Airplane) + #122 (crisper fastfetch logo). +- **Did:** (104) `nomarchy-airplane` runtime Wi-Fi+BT kill-switch with prior + restore; System menu row; SUPER+CTRL+R; Waybar `custom/airplane` (signal 11, + self-hides); whole-swap jsonc/css parity. (122) chafa `sextant` 24×12, + rsvg 360px. +- **Verified:** **V1** airplane state machine (on/off/status empty when off); + bash -n; keybinds-cheatsheet; menu-back; flake check --no-build; HM gen. + **V2** fastfetch: real kitty screenshots + `/tmp/nomarchy-v2-122/{boreal-sextant,summer-kitty,boreal-block}.png` — + sextant clearly finer than block; no tofu; accents track. +- **Pending:** V3 airplane on a machine with live radios (HARDWARE-QUEUE). +- **Next suggestion:** #111 Recovery menu, or #98 with screenshot. + ## 2026-07-15 — #107 state.json + nomarchy-state-sync - **Task:** BACKLOG #107 — rename misnamed system state file and CLI. - **Did:** `theme-state.json` → `state.json` (template, root, docs, modules); diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index e60ffe1..96ae3db 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -427,6 +427,15 @@ Design/decision records and a running log of shipped work (items marked default `$TERMINAL` / SUPER+Return, doctor + calendar + what-changed use `kitty --class=com.nomarchy.*`. Ghostty module and install-time GL probe removed. V3: Acer SUPER+Return + doctor float. +- ✓ **Airplane mode (#104):** System › Airplane mode + SUPER+CTRL+R + + Waybar plane glyph (self-hides when off). Runtime `nomarchy-airplane` + softs Wi-Fi (nmcli) + Bluetooth (rfkill/bluetoothctl), remembers prior + radio state in `$XDG_RUNTIME_DIR`, restores on disengage. Whole-swap + waybar parity. +- ✓ **Crisper fastfetch logo (#122):** chafa `--symbols sextant` at 24×12 + (was block 20×10), rsvg width 360. V2 kitty screenshots boreal + summer-night + accent; no tofu (fontconfig fallback as today). Diagonals still staircase + a little — logo SVG limit, not chafa. - ✓ **State file rename (#107):** `theme-state.json` → `state.json`; CLI `nomarchy-theme-sync` → `nomarchy-state-sync` (old binary name kept as a symlink). Eval/read shims accept the legacy file name; the next write diff --git a/modules/home/airplane.nix b/modules/home/airplane.nix new file mode 100644 index 0000000..35b30ba --- /dev/null +++ b/modules/home/airplane.nix @@ -0,0 +1,129 @@ +# Airplane mode — runtime kill-switch for Wi-Fi + Bluetooth together. +# Remembers each radio's prior state so disengage restores what you had +# (if Wi-Fi was already off, it stays off). Waybar shows a plane glyph +# only while engaged (status prints nothing otherwise → self-hides). +# +# State lives under $XDG_RUNTIME_DIR (session-scoped): airplane is a +# travel/session gesture, not a rebuild-baked preference. Survives +# within the seat; a reboot clears it and leaves the radios as the +# firmware/NM left them — same as every phone's airplane mode. +{ config, lib, pkgs, ... }: + +let + # signal 11: poke the bar on toggle so the glyph appears/vanishes + # without waiting for the poll interval (same pattern as recording=8, + # updates=9, doctor=10). + waybarSignal = 11; + + nomarchy-airplane = pkgs.writeShellScriptBin "nomarchy-airplane" '' + set -euo pipefail + rt="''${XDG_RUNTIME_DIR:-/run/user/$(id -u)}" + state_file="$rt/nomarchy-airplane.state" + PATH=${lib.makeBinPath [ pkgs.networkmanager pkgs.util-linux pkgs.bluez pkgs.coreutils pkgs.gnugrep pkgs.gawk pkgs.libnotify pkgs.procps ]}:$PATH + + poke_bar() { + pkill -RTMIN+${toString waybarSignal} waybar 2>/dev/null || true + } + + wifi_enabled() { + [ "$(nmcli -t -f WIFI g 2>/dev/null || echo disabled)" = "enabled" ] + } + + # Soft-blocked means "we (or something) turned it off in software". + # Hard-blocked is a laptop kill-switch — we never try to fight that. + bt_soft_unblocked() { + rfkill list bluetooth 2>/dev/null | ${pkgs.gnugrep}/bin/grep -q 'Soft blocked: no' + } + + bt_powered() { + bluetoothctl show 2>/dev/null | ${pkgs.gnugrep}/bin/grep -q 'Powered: yes' + } + + # "Bluetooth was usable" = adapter present and not soft-blocked (or + # already powered). Desktops without BT leave this false. + bt_was_on() { + ls /sys/class/bluetooth/hci* >/dev/null 2>&1 || return 1 + bt_powered || bt_soft_unblocked + } + + engaged() { [ -f "$state_file" ]; } + + engage() { + if engaged; then + notify-send -a Nomarchy "Airplane mode" "Already on." + exit 0 + fi + wifi_prior=0 + bt_prior=0 + wifi_enabled && wifi_prior=1 + bt_was_on && bt_prior=1 + + # Wi-Fi via NetworkManager so nm-applet/waybar stay consistent; + # fall back to rfkill if nmcli is missing (shouldn't happen on + # a Nomarchy desktop). + if command -v nmcli >/dev/null 2>&1; then + nmcli radio wifi off 2>/dev/null || true + else + rfkill block wlan 2>/dev/null || true + fi + # Bluetooth: soft-block the radio (covers adapters that ignore + # bluetoothctl) and ask the daemon to power off when present. + rfkill block bluetooth 2>/dev/null || true + bluetoothctl power off >/dev/null 2>&1 || true + + printf 'wifi_prior=%s\nbt_prior=%s\n' "$wifi_prior" "$bt_prior" > "$state_file" + poke_bar + notify-send -a Nomarchy "Airplane mode" "On — Wi-Fi and Bluetooth off." + } + + disengage() { + if ! engaged; then + notify-send -a Nomarchy "Airplane mode" "Already off." + exit 0 + fi + # shellcheck disable=SC1090 + . "$state_file" + wifi_prior=''${wifi_prior:-0} + bt_prior=''${bt_prior:-0} + + if [ "$wifi_prior" = 1 ]; then + if command -v nmcli >/dev/null 2>&1; then + nmcli radio wifi on 2>/dev/null || true + else + rfkill unblock wlan 2>/dev/null || true + fi + fi + if [ "$bt_prior" = 1 ]; then + rfkill unblock bluetooth 2>/dev/null || true + bluetoothctl power on >/dev/null 2>&1 || true + fi + + rm -f "$state_file" + poke_bar + notify-send -a Nomarchy "Airplane mode" "Off — prior radio state restored." + } + + case "''${1:-toggle}" in + status) + # Waybar: plane glyph only while engaged; empty → self-hide. + if engaged; then + printf '{"text":"󰀝","tooltip":"Airplane mode on — Wi-Fi and Bluetooth off (click to restore)","class":"on"}\n' + fi + exit 0 ;; + is-active) + if engaged; then echo on; else echo off; fi ;; + on) engage ;; + off) disengage ;; + toggle) + if engaged; then disengage; else engage; fi ;; + *) + echo "usage: nomarchy-airplane [toggle|status|on|off|is-active]" >&2 + exit 64 ;; + esac + ''; +in +{ + config = { + home.packages = [ nomarchy-airplane ]; + }; +} diff --git a/modules/home/default.nix b/modules/home/default.nix index 0dfa398..7b4bf25 100644 --- a/modules/home/default.nix +++ b/modules/home/default.nix @@ -18,6 +18,7 @@ ./yazi.nix # flagship TUI file manager, themed + plugins ./osd.nix # swayosd volume/brightness OSD, themed ./nightlight.nix # scheduled blue-light filter (hyprsunset), opt-in + ./airplane.nix # runtime Wi-Fi+BT airplane mode + Waybar glyph (#104) ./autotheme.nix # auto day/night theme switch (settings.autoTheme), opt-in ./timezone.nix # keep the Waybar clock in step with auto-timezone changes ./updates.nix # passive update-awareness indicator + notification, opt-in diff --git a/modules/home/fastfetch.nix b/modules/home/fastfetch.nix index 6d2422e..5901e95 100644 --- a/modules/home/fastfetch.nix +++ b/modules/home/fastfetch.nix @@ -9,11 +9,15 @@ let cfg = config.nomarchy; c = cfg.theme.colors; + # #122: sextants (2×3 subcells) give ~6× the detail of half/full blocks. + # Size and raster width stepped up together so the mark still fills the + # logo column without looking sparse. Diagonals still staircase a little + # (the SVG is an angled N); that is a logo-design limit, not chafa's. logo = pkgs.runCommand "nomarchy-fastfetch-logo" { nativeBuildInputs = [ pkgs.imagemagick pkgs.librsvg pkgs.chafa ]; } '' - rsvg-convert -w 220 ${../nixos/branding/logo.svg} > logo.png + rsvg-convert -w 360 ${../nixos/branding/logo.svg} > logo.png magick logo.png -fill "${c.accent}" -colorize 100 logo-c.png - chafa --format symbols --symbols block --size 20x10 --colors full --polite on logo-c.png > $out + chafa --format symbols --symbols sextant --size 24x12 --colors full --polite on logo-c.png > $out ''; in { diff --git a/modules/home/keybinds.nix b/modules/home/keybinds.nix index c14517f..9f95d3b 100644 --- a/modules/home/keybinds.nix +++ b/modules/home/keybinds.nix @@ -50,6 +50,7 @@ { mods = "$mod CTRL"; key = "E"; action = "exec, nomarchy-menu emoji"; desc = "Emoji picker"; group = "Menu"; } { mods = "$mod CTRL"; key = "N"; action = "exec, nomarchy-menu network"; desc = "Network (networkmanager_dmenu)"; group = "Menu"; } { mods = "$mod CTRL"; key = "B"; action = "exec, nomarchy-menu bluetooth"; desc = "Bluetooth"; group = "Menu"; } + { mods = "$mod CTRL"; key = "R"; action = "exec, nomarchy-menu airplane"; desc = "Airplane mode (Wi-Fi + Bluetooth)"; group = "Menu"; } { mods = "$mod CTRL"; key = "K"; action = "exec, nomarchy-menu keyboard"; desc = "Keyboard layout"; group = "Menu"; } { mods = "$mod CTRL"; key = "S"; action = "exec, nomarchy-menu capture"; desc = "Screenshot / capture"; group = "Media"; } { mods = "$mod CTRL"; key = "P"; action = "exec, nomarchy-menu colorpicker"; desc = "Color picker (→ clipboard)"; group = "Menu"; } diff --git a/modules/home/rofi.nix b/modules/home/rofi.nix index 76f8017..c20396a 100644 --- a/modules/home/rofi.nix +++ b/modules/home/rofi.nix @@ -864,6 +864,13 @@ ${themeRows} && exec nomarchy-nightlight toggle notify-send "Night light" "Not available (nomarchy.nightlight off?)."; exit 0 ;; + airplane) + # Runtime Wi-Fi + Bluetooth kill-switch (#104). Priors restored on + # disengage; Waybar plane glyph self-hides when off. + command -v nomarchy-airplane >/dev/null 2>&1 \ + && exec nomarchy-airplane toggle + notify-send "Airplane mode" "Not available."; exit 0 ;; + autotheme) # Look & Feel › Auto theme — automatic day/night theme switch # (settings.autoTheme, applied by the nomarchy-auto-theme timer from @@ -1169,6 +1176,12 @@ ${themeRows} choice=$( { row "Network${menuHint "network"}" network-wireless row "VPN" network-vpn + # Airplane mode (#104): runtime Wi-Fi+BT kill-switch. Label + # tracks the session flag; tool is always on PATH via airplane.nix. + if [ "$(nomarchy-airplane is-active 2>/dev/null)" = on ] + then row "Airplane mode (on)${menuHint "airplane"}" network-wireless-offline + else row "Airplane mode (off)${menuHint "airplane"}" network-wireless-offline + fi command -v blueman-manager >/dev/null 2>&1 \ && row "Bluetooth${menuHint "bluetooth"}" bluetooth [ -e "''${XDG_RUNTIME_DIR:-/run/user/$(id -u)}/pulse/native" ] \ @@ -1225,6 +1238,7 @@ ${themeRows} "$BACK") exec "$0" ;; *Network*) exec "$0" network ;; *VPN*) exec "$0" vpn ;; + *"Airplane mode"*) exec "$0" airplane ;; *Bluetooth*) exec "$0" bluetooth ;; *Audio*) exec "$0" audio ;; *Display*) exec "$0" display ;; @@ -1349,7 +1363,7 @@ ${themeRows} esac ;; *) - echo "usage: nomarchy-menu [lookfeel|tools|system|power|power-profile|powermgmt|batterylimit|theme|clipboard|calc|files|emoji|web|network|bluetooth|audio|display|display-profile|keyboard|printers|capture|colorpicker|keybinds|ask|dnd|nightlight|autotimezone|autologin|autocommit|vpn|snapshot|doctor|firmware|fingerprint|controlcenter|rollback|whatchanged]" >&2 + echo "usage: nomarchy-menu [lookfeel|tools|system|power|power-profile|powermgmt|batterylimit|theme|clipboard|calc|files|emoji|web|network|bluetooth|airplane|audio|display|display-profile|keyboard|printers|capture|colorpicker|keybinds|ask|dnd|nightlight|autotimezone|autologin|autocommit|vpn|snapshot|doctor|firmware|fingerprint|controlcenter|rollback|whatchanged]" >&2 exit 64 ;; esac ''; diff --git a/modules/home/waybar.nix b/modules/home/waybar.nix index 816dfc6..7867de6 100644 --- a/modules/home/waybar.nix +++ b/modules/home/waybar.nix @@ -174,7 +174,7 @@ let # — BACKLOG #63). Click targets are existing nomarchy-menu entry points. modules-left = [ "custom/nomarchy" "hyprland/workspaces" "hyprland/window" ]; modules-center = [ "clock" ]; - modules-right = [ "custom/recording" "idle_inhibitor" "tray" "custom/vpn" "pulseaudio" "custom/powerprofile" "custom/nightlight" ] + modules-right = [ "custom/recording" "idle_inhibitor" "tray" "custom/vpn" "custom/airplane" "pulseaudio" "custom/powerprofile" "custom/nightlight" ] ++ lib.optional showLanguage "hyprland/language" ++ [ "battery" "custom/doctor" "custom/updates" "custom/notification" "custom/powermenu" ]; @@ -333,6 +333,17 @@ let on-click = "nomarchy-nightlight toggle"; }; + # Airplane mode (#104). Self-gates: plane glyph only while engaged + # (status prints nothing otherwise). Click toggles Wi-Fi+BT and + # restores prior radio state on disengage. signal 11 = instant refresh. + "custom/airplane" = { + exec = "nomarchy-airplane status"; + return-type = "json"; + interval = 5; + signal = 11; + on-click = "nomarchy-airplane toggle"; + }; + # Update awareness. Self-gates: hidden unless nomarchy.updates is enabled # AND the periodic check found something (the helper prints nothing then). # signal 9 lets the checker refresh it instantly; click opens the upgrade @@ -449,7 +460,7 @@ let } #custom-nomarchy:hover { color: @accentAlt; } - #tray, #pulseaudio, #custom-powerprofile, #custom-nightlight, #custom-updates, #custom-vpn, #custom-recording, #idle_inhibitor, #language, #battery, #custom-doctor, #custom-notification, #custom-powermenu { + #tray, #pulseaudio, #custom-powerprofile, #custom-nightlight, #custom-airplane, #custom-updates, #custom-vpn, #custom-recording, #idle_inhibitor, #language, #battery, #custom-doctor, #custom-notification, #custom-powermenu { color: alpha(@text, 0.85); padding: 0 10px; } @@ -473,6 +484,7 @@ let /* Night-light active → warm tone, matching the filter it represents. */ #custom-nightlight.on { color: @warn; } + #custom-airplane.on { color: @warn; } /* Updates pending → accent, to draw the eye. */ #custom-updates.available { color: @accent; } @@ -485,7 +497,7 @@ let (size+2)pt Pango icon span the icon+text modules use — bump their font-size to match, or these glyphs read smaller than the volume / battery / language icons beside them. */ - #custom-recording, #custom-updates, #custom-vpn, #custom-nightlight, #custom-doctor, #custom-notification, #custom-powermenu { font-size: ${toString (t.fonts.size + 2)}pt; } + #custom-recording, #custom-updates, #custom-vpn, #custom-airplane, #custom-nightlight, #custom-doctor, #custom-notification, #custom-powermenu { font-size: ${toString (t.fonts.size + 2)}pt; } /* The speedometer + caffeine glyphs render small in their em box — size them up a touch more so they read at a glance. */ diff --git a/themes/boreal/waybar.css b/themes/boreal/waybar.css index 8a0b8fa..6a450d9 100644 --- a/themes/boreal/waybar.css +++ b/themes/boreal/waybar.css @@ -82,6 +82,7 @@ window#waybar { #custom-doctor, #idle_inhibitor, #custom-nightlight, +#custom-airplane, #language, #custom-vpn, #pulseaudio, @@ -143,6 +144,7 @@ window#waybar { #custom-doctor { color: @bad; } #idle_inhibitor.activated { color: @warn; } #custom-nightlight.on { color: @warn; } +#custom-airplane.on { color: @warn; } #custom-vpn.on { color: @good; } #pulseaudio.muted { color: @muted; } @@ -158,6 +160,7 @@ window#waybar { #custom-updates, #custom-doctor, #custom-nightlight, +#custom-airplane, #custom-vpn, #custom-notification { font-size: 17px; } /* Speedometer + caffeine cup render small in their em box — a touch more. */ diff --git a/themes/boreal/waybar.jsonc b/themes/boreal/waybar.jsonc index f0e8484..222947f 100644 --- a/themes/boreal/waybar.jsonc +++ b/themes/boreal/waybar.jsonc @@ -23,6 +23,7 @@ "custom/nightlight", "hyprland/language", "custom/vpn", + "custom/airplane", "pulseaudio", "battery", "custom/powerprofile", @@ -32,12 +33,12 @@ ], "custom/nomarchy": { "interval": "once", - "format": "", + "format": "\uf000", "on-click": "nomarchy-menu", "tooltip-format": "Nomarchy menu" }, "clock": { - "format": "{:%H:%M · %a %d %b}", + "format": "{:%H:%M \u00b7 %a %d %b}", "on-click": "nomarchy-calendar", "tooltip": true, "tooltip-format": "{:%A, %d %B %Y\n%Z (UTC%z)}" @@ -74,8 +75,8 @@ "idle_inhibitor": { "format": "{icon}", "format-icons": { - "activated": " 󰅶 ", - "deactivated": " 󰾪 " + "activated": " \udb80\udd76 ", + "deactivated": " \udb83\udfaa " } }, "custom/nightlight": { @@ -85,7 +86,7 @@ "on-click": "nomarchy-nightlight toggle" }, "hyprland/language": { - "format": "󰌌 {short}", + "format": "\udb80\udf0c {short}", "tooltip": false }, "custom/vpn": { @@ -97,20 +98,20 @@ "pulseaudio": { "scroll-step": 5, "format": "{icon}{volume}%", - "format-bluetooth": "{icon} {volume}%", - "format-bluetooth-muted": " {icon}", - "format-muted": "muted", + "format-bluetooth": "{icon}\uf294 {volume}%", + "format-bluetooth-muted": "\uf6a9 {icon}\uf294", + "format-muted": "\uf6a9 muted", "format-icons": { - "headphone": " ", - "hands-free": " ", - "headset": " ", - "phone": " ", - "portable": " ", - "car": " ", + "headphone": "\uf025 ", + "hands-free": "\uf025 ", + "headset": "\uf025 ", + "phone": "\uf095 ", + "portable": "\uf095 ", + "car": "\uf1b9 ", "default": [ - " ", - " ", - " " + "\uf026 ", + "\uf027 ", + "\uf028 " ] }, "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", @@ -124,15 +125,15 @@ "critical": 10 }, "format": "{icon}{capacity}%", - "format-charging": "{capacity}%", - "format-plugged": "{capacity}%", - "tooltip-format-plugged": "Plugged in, not charging — held at {capacity}% by the battery charge cap\nCharging resumes ~10% below the cap · click to adjust", + "format-charging": "\uf0e7 {capacity}%", + "format-plugged": "\uf1e6 {capacity}%", + "tooltip-format-plugged": "Plugged in, not charging \u2014 held at {capacity}% by the battery charge cap\nCharging resumes ~10% below the cap \u00b7 click to adjust", "format-icons": [ - " ", - " ", - " ", - " ", - " " + "\uf244 ", + "\uf243 ", + "\uf242 ", + "\uf241 ", + "\uf240 " ], "on-click": "nomarchy-menu powermgmt", "tooltip-format": "Battery status" @@ -157,19 +158,26 @@ "on-click": "swaync-client -t -sw", "on-click-right": "swaync-client -d -sw", "format-icons": { - "none": "󰂜", - "notification": "󰂚", - "dnd-none": "󰂛", - "dnd-notification": "󰂛", - "inhibited-none": "󰂛", - "inhibited-notification": "󰂛", - "dnd-inhibited-none": "󰂛", - "dnd-inhibited-notification": "󰂛" + "none": "\udb80\udc9c", + "notification": "\udb80\udc9a", + "dnd-none": "\udb80\udc9b", + "dnd-notification": "\udb80\udc9b", + "inhibited-none": "\udb80\udc9b", + "inhibited-notification": "\udb80\udc9b", + "dnd-inhibited-none": "\udb80\udc9b", + "dnd-inhibited-notification": "\udb80\udc9b" } }, "custom/powermenu": { - "format": "", + "format": "\uf011", "on-click": "nomarchy-menu power", "tooltip": false + }, + "custom/airplane": { + "return-type": "json", + "interval": 5, + "signal": 11, + "exec": "nomarchy-airplane status", + "on-click": "nomarchy-airplane toggle" } } diff --git a/themes/executive-slate/waybar.css b/themes/executive-slate/waybar.css index 8942b91..c555c5b 100644 --- a/themes/executive-slate/waybar.css +++ b/themes/executive-slate/waybar.css @@ -71,6 +71,7 @@ window#waybar { #custom-recording, #idle_inhibitor, #custom-nightlight, +#custom-airplane, #language, #custom-updates, #pulseaudio, @@ -148,6 +149,7 @@ window#waybar { #idle_inhibitor.activated { color: @warn; } #custom-nightlight.on { color: @warn; } +#custom-airplane.on { color: @warn; } #custom-updates.available { color: @accent; } @@ -157,6 +159,7 @@ window#waybar { neighbours. */ #custom-recording, #custom-nightlight, +#custom-airplane, #custom-updates, #custom-vpn, #custom-doctor, diff --git a/themes/executive-slate/waybar.jsonc b/themes/executive-slate/waybar.jsonc index c8507d1..071cd5a 100644 --- a/themes/executive-slate/waybar.jsonc +++ b/themes/executive-slate/waybar.jsonc @@ -25,6 +25,7 @@ "custom/powerprofile", "battery", "custom/vpn", + "custom/airplane", "custom/doctor", "custom/notification", "tray", @@ -32,7 +33,7 @@ ], "custom/nomarchy": { "interval": "once", - "format": "", + "format": "\uf000", "on-click": "nomarchy-menu", "tooltip-format": "Nomarchy menu" }, @@ -44,7 +45,7 @@ "on-scroll-down": "hyprctl dispatch workspace r-1" }, "clock": { - "format": "{:%H:%M · %a %d %b}", + "format": "{:%H:%M \u00b7 %a %d %b}", "on-click": "nomarchy-calendar", "tooltip": true, "tooltip-format": "{:%A, %d %B %Y\n%Z (UTC%z)}" @@ -59,8 +60,8 @@ "idle_inhibitor": { "format": "{icon}", "format-icons": { - "activated": " 󰅶 ", - "deactivated": " 󰾪 " + "activated": " \udb80\udd76 ", + "deactivated": " \udb83\udfaa " } }, "custom/nightlight": { @@ -70,7 +71,7 @@ "on-click": "nomarchy-nightlight toggle" }, "hyprland/language": { - "format": "󰌌 {short}", + "format": "\udb80\udf0c {short}", "tooltip": false }, "custom/updates": { @@ -83,20 +84,20 @@ "pulseaudio": { "scroll-step": 5, "format": "{icon}{volume}%", - "format-bluetooth": "{icon} {volume}%", - "format-bluetooth-muted": " {icon}", - "format-muted": "muted", + "format-bluetooth": "{icon}\uf294 {volume}%", + "format-bluetooth-muted": "\uf6a9 {icon}\uf294", + "format-muted": "\uf6a9 muted", "format-icons": { - "headphone": " ", - "hands-free": " ", - "headset": " ", - "phone": " ", - "portable": " ", - "car": " ", + "headphone": "\uf025 ", + "hands-free": "\uf025 ", + "headset": "\uf025 ", + "phone": "\uf095 ", + "portable": "\uf095 ", + "car": "\uf1b9 ", "default": [ - " ", - " ", - " " + "\uf026 ", + "\uf027 ", + "\uf028 " ] }, "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", @@ -116,15 +117,15 @@ "critical": 10 }, "format": "{icon}{capacity}%", - "format-charging": "{capacity}%", - "format-plugged": "{capacity}%", - "tooltip-format-plugged": "Plugged in, not charging — held at {capacity}% by the battery charge cap\nCharging resumes ~10% below the cap · click to adjust", + "format-charging": "\uf0e7 {capacity}%", + "format-plugged": "\uf1e6 {capacity}%", + "tooltip-format-plugged": "Plugged in, not charging \u2014 held at {capacity}% by the battery charge cap\nCharging resumes ~10% below the cap \u00b7 click to adjust", "format-icons": [ - " ", - " ", - " ", - " ", - " " + "\uf244 ", + "\uf243 ", + "\uf242 ", + "\uf241 ", + "\uf240 " ], "on-click": "nomarchy-menu powermgmt", "tooltip-format": "Battery status" @@ -153,22 +154,29 @@ "on-click": "swaync-client -t -sw", "on-click-right": "swaync-client -d -sw", "format-icons": { - "none": "󰂜", - "notification": "󰂚", - "dnd-none": "󰂛", - "dnd-notification": "󰂛", - "inhibited-none": "󰂛", - "inhibited-notification": "󰂛", - "dnd-inhibited-none": "󰂛", - "dnd-inhibited-notification": "󰂛" + "none": "\udb80\udc9c", + "notification": "\udb80\udc9a", + "dnd-none": "\udb80\udc9b", + "dnd-notification": "\udb80\udc9b", + "inhibited-none": "\udb80\udc9b", + "inhibited-notification": "\udb80\udc9b", + "dnd-inhibited-none": "\udb80\udc9b", + "dnd-inhibited-notification": "\udb80\udc9b" } }, "tray": { "spacing": 8 }, "custom/powermenu": { - "format": "", + "format": "\uf011", "on-click": "nomarchy-menu power", "tooltip": false + }, + "custom/airplane": { + "return-type": "json", + "interval": 5, + "signal": 11, + "exec": "nomarchy-airplane status", + "on-click": "nomarchy-airplane toggle" } } diff --git a/themes/summer-day/waybar.css b/themes/summer-day/waybar.css index caca7ae..5d73404 100755 --- a/themes/summer-day/waybar.css +++ b/themes/summer-day/waybar.css @@ -52,6 +52,7 @@ window#waybar { #pulseaudio, #custom-powerprofile, #custom-nightlight, +#custom-airplane, #language, #custom-updates, #battery, @@ -132,6 +133,7 @@ window#waybar { #custom-doctor { color: @red; } #idle_inhibitor.activated { color: @yellow; } #custom-nightlight.on { color: @yellow; } +#custom-airplane.on { color: @yellow; } #custom-vpn.on { color: @green; } #pulseaudio.muted { color: @grey2; } @@ -150,6 +152,7 @@ window#waybar { #custom-updates, #custom-doctor, #custom-nightlight, +#custom-airplane, #custom-vpn, #custom-notification { font-size: 17px; } diff --git a/themes/summer-day/waybar.jsonc b/themes/summer-day/waybar.jsonc index 9f7bc38..d5dcec2 100644 --- a/themes/summer-day/waybar.jsonc +++ b/themes/summer-day/waybar.jsonc @@ -26,6 +26,7 @@ "battery", "tray", "custom/vpn", + "custom/airplane", "custom/doctor", "custom/notification", "custom/powermenu" @@ -39,33 +40,33 @@ }, "custom/launcher": { "interval": "once", - "format": "", + "format": "\uf000", "on-click": "nomarchy-menu", "tooltip-format": "Nomarchy menu" }, "idle_inhibitor": { "format": "{icon}", "format-icons": { - "activated": " 󰅶 ", - "deactivated": " 󰾪 " + "activated": " \udb80\udd76 ", + "deactivated": " \udb83\udfaa " } }, "pulseaudio": { "format": "{icon}{volume}%", - "format-bluetooth": "{icon}  {volume}%", - "format-bluetooth-muted": "  muted", - "format-muted": "muted", + "format-bluetooth": "{icon} \uf294 {volume}%", + "format-bluetooth-muted": "\uf6a9 \uf294 muted", + "format-muted": "\uf6a9 muted", "format-icons": { - "headphone": " ", - "hands-free": " ", - "headset": " ", - "phone": " ", - "portable": " ", - "car": " ", + "headphone": "\uf025 ", + "hands-free": "\uf025 ", + "headset": "\uf025 ", + "phone": "\uf095 ", + "portable": "\uf095 ", + "car": "\uf1b9 ", "default": [ - " ", - " ", - " " + "\uf026 ", + "\uf027 ", + "\uf028 " ] }, "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", @@ -80,22 +81,22 @@ }, "max-length": 14, "format": "{icon}{capacity}%", - "format-charging": "{capacity}%", - "format-plugged": "{capacity}%", - "tooltip-format-plugged": "Plugged in, not charging — held at {capacity}% by the battery charge cap\nCharging resumes ~10% below the cap · click to adjust", - "format-full": " 100%", + "format-charging": "\uf0e7 {capacity}%", + "format-plugged": "\uf1e6 {capacity}%", + "tooltip-format-plugged": "Plugged in, not charging \u2014 held at {capacity}% by the battery charge cap\nCharging resumes ~10% below the cap \u00b7 click to adjust", + "format-full": "\uf1e6 100%", "format-icons": [ - " ", - " ", - " ", - " ", - " " + "\uf244 ", + "\uf243 ", + "\uf242 ", + "\uf241 ", + "\uf240 " ], "on-click": "nomarchy-menu powermgmt", "tooltip-format": "Battery status" }, "clock": { - "format": " {:%H:%M · %a %d %b}", + "format": "\uf017 {:%H:%M \u00b7 %a %d %b}", "on-click": "nomarchy-calendar", "tooltip": true, "tooltip-format": "{:%A, %d %B %Y\n%Z (UTC%z)}" @@ -131,7 +132,7 @@ "on-click": "nomarchy-vpn" }, "hyprland/language": { - "format": "󰌌 {short}", + "format": "\udb80\udf0c {short}", "tooltip": false }, "custom/nightlight": { @@ -157,19 +158,26 @@ "on-click": "swaync-client -t -sw", "on-click-right": "swaync-client -d -sw", "format-icons": { - "none": "", - "notification": "", - "dnd-none": "", - "dnd-notification": "", - "inhibited-none": "", - "inhibited-notification": "", - "dnd-inhibited-none": "", - "dnd-inhibited-notification": "" + "none": "\uf0f3", + "notification": "\uf0f3", + "dnd-none": "\uf1f6", + "dnd-notification": "\uf1f6", + "inhibited-none": "\uf1f6", + "inhibited-notification": "\uf1f6", + "dnd-inhibited-none": "\uf1f6", + "dnd-inhibited-notification": "\uf1f6" } }, "custom/powermenu": { - "format": "", + "format": "\uf011", "on-click": "nomarchy-menu power", "tooltip": false + }, + "custom/airplane": { + "return-type": "json", + "interval": 5, + "signal": 11, + "exec": "nomarchy-airplane status", + "on-click": "nomarchy-airplane toggle" } } diff --git a/themes/summer-night/waybar.css b/themes/summer-night/waybar.css index 9d1df57..7d3756a 100644 --- a/themes/summer-night/waybar.css +++ b/themes/summer-night/waybar.css @@ -57,6 +57,7 @@ window#waybar { #pulseaudio, #custom-powerprofile, #custom-nightlight, +#custom-airplane, #language, #custom-updates, #idle_inhibitor, @@ -140,6 +141,7 @@ window#waybar { #custom-doctor { color: @red; } #idle_inhibitor.activated { color: @yellow; } #custom-nightlight.on { color: @yellow; } +#custom-airplane.on { color: @yellow; } #custom-vpn.on { color: @green; } #pulseaudio.muted { color: @grey0; } @@ -158,6 +160,7 @@ window#waybar { #custom-updates, #custom-doctor, #custom-nightlight, +#custom-airplane, #custom-vpn, #custom-notification { font-size: 17px; } diff --git a/themes/summer-night/waybar.jsonc b/themes/summer-night/waybar.jsonc index 44b96cb..e26e433 100644 --- a/themes/summer-night/waybar.jsonc +++ b/themes/summer-night/waybar.jsonc @@ -26,6 +26,7 @@ "battery", "tray", "custom/vpn", + "custom/airplane", "custom/doctor", "custom/notification", "custom/powermenu" @@ -39,34 +40,34 @@ }, "custom/nomarchy": { "interval": "once", - "format": "", + "format": "\uf000", "on-click": "nomarchy-menu", "tooltip-format": "Nomarchy menu" }, "idle_inhibitor": { "format": "{icon}", "format-icons": { - "activated": " 󰅶 ", - "deactivated": " 󰾪 " + "activated": " \udb80\udd76 ", + "deactivated": " \udb83\udfaa " } }, "pulseaudio": { "scroll-step": 5, "format": "{icon}{volume}%", - "format-bluetooth": "{icon} {volume}%", - "format-bluetooth-muted": " {icon}", - "format-muted": "muted", + "format-bluetooth": "{icon}\uf294 {volume}%", + "format-bluetooth-muted": "\uf6a9 {icon}\uf294", + "format-muted": "\uf6a9 muted", "format-icons": { - "headphone": " ", - "hands-free": " ", - "headset": " ", - "phone": " ", - "portable": " ", - "car": " ", + "headphone": "\uf025 ", + "hands-free": "\uf025 ", + "headset": "\uf025 ", + "phone": "\uf095 ", + "portable": "\uf095 ", + "car": "\uf1b9 ", "default": [ - " ", - " ", - " " + "\uf026 ", + "\uf027 ", + "\uf028 " ] }, "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", @@ -80,21 +81,21 @@ "critical": 10 }, "format": "{icon}{capacity}%", - "format-charging": "{capacity}%", - "format-plugged": "{capacity}%", - "tooltip-format-plugged": "Plugged in, not charging — held at {capacity}% by the battery charge cap\nCharging resumes ~10% below the cap · click to adjust", + "format-charging": "\uf0e7 {capacity}%", + "format-plugged": "\uf1e6 {capacity}%", + "tooltip-format-plugged": "Plugged in, not charging \u2014 held at {capacity}% by the battery charge cap\nCharging resumes ~10% below the cap \u00b7 click to adjust", "format-icons": [ - " ", - " ", - " ", - " ", - " " + "\uf244 ", + "\uf243 ", + "\uf242 ", + "\uf241 ", + "\uf240 " ], "on-click": "nomarchy-menu powermgmt", "tooltip-format": "Battery status" }, "clock": { - "format": " {:%H:%M · %a %d %b}", + "format": "\uf017 {:%H:%M \u00b7 %a %d %b}", "on-click": "nomarchy-calendar", "tooltip": true, "tooltip-format": "{:%A, %d %B %Y\n%Z (UTC%z)}" @@ -130,7 +131,7 @@ "on-click": "nomarchy-vpn" }, "hyprland/language": { - "format": "󰌌 {short}", + "format": "\udb80\udf0c {short}", "tooltip": false }, "custom/nightlight": { @@ -156,19 +157,26 @@ "on-click": "swaync-client -t -sw", "on-click-right": "swaync-client -d -sw", "format-icons": { - "none": "", - "notification": "", - "dnd-none": "", - "dnd-notification": "", - "inhibited-none": "", - "inhibited-notification": "", - "dnd-inhibited-none": "", - "dnd-inhibited-notification": "" + "none": "\uf0f3", + "notification": "\uf0f3", + "dnd-none": "\uf1f6", + "dnd-notification": "\uf1f6", + "inhibited-none": "\uf1f6", + "inhibited-notification": "\uf1f6", + "dnd-inhibited-none": "\uf1f6", + "dnd-inhibited-notification": "\uf1f6" } }, "custom/powermenu": { - "format": "", + "format": "\uf011", "on-click": "nomarchy-menu power", "tooltip": false + }, + "custom/airplane": { + "return-type": "json", + "interval": 5, + "signal": 11, + "exec": "nomarchy-airplane status", + "on-click": "nomarchy-airplane toggle" } }