aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNatasha Moongrave <natasha@256phi.eu>2026-04-10 12:13:51 +0200
committerNatasha Moongrave <natasha@256phi.eu>2026-04-10 12:13:51 +0200
commit68029c245778f066aff0aad1977b23f6d6f6c561 (patch)
tree9cbfa978795f88c7e7c4ed3d80a903ffaeda9464
parent66888f3eea130323987ca9aa890085057b8ebd34 (diff)
Add schrottkatze rice: Eww status bars
Top bar (CPU, RAM, battery, systray, time, trans flag), bottom bar (workspaces, traveldings transit, Mullvad VPN, lesbian flag). Gruvbox CSS styling, Nushell scripts for battery and ICE train speed.
-rw-r--r--home/rices/schrottkatze/eww.nix6
-rw-r--r--home/rices/schrottkatze/eww/configDir/bottomBar/bottomBar.yuck77
-rw-r--r--home/rices/schrottkatze/eww/configDir/bottomBar/traveldings.yuck37
-rw-r--r--home/rices/schrottkatze/eww/configDir/bottomBar/workspaces.yuck18
-rw-r--r--home/rices/schrottkatze/eww/configDir/eww.css58
-rw-r--r--home/rices/schrottkatze/eww/configDir/eww.yuck36
-rwxr-xr-xhome/rices/schrottkatze/eww/configDir/scripts/bat.nu78
-rwxr-xr-xhome/rices/schrottkatze/eww/configDir/scripts/iceTacho.nu38
-rw-r--r--home/rices/schrottkatze/eww/configDir/topBar/sysinfo.yuck22
-rw-r--r--home/rices/schrottkatze/eww/configDir/topBar/time.yuck10
-rw-r--r--home/rices/schrottkatze/eww/configDir/topBar/topBar.yuck55
-rw-r--r--home/rices/schrottkatze/eww/configDir/util.yuck10
12 files changed, 445 insertions, 0 deletions
diff --git a/home/rices/schrottkatze/eww.nix b/home/rices/schrottkatze/eww.nix
new file mode 100644
index 0000000..599738a
--- /dev/null
+++ b/home/rices/schrottkatze/eww.nix
@@ -0,0 +1,6 @@
+{...}: {
+ programs.eww = {
+ enable = true;
+ configDir = ./eww/configDir;
+ };
+}
diff --git a/home/rices/schrottkatze/eww/configDir/bottomBar/bottomBar.yuck b/home/rices/schrottkatze/eww/configDir/bottomBar/bottomBar.yuck
new file mode 100644
index 0000000..d955d31
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/bottomBar/bottomBar.yuck
@@ -0,0 +1,77 @@
+(include "bottomBar/workspaces.yuck")
+(include "bottomBar/traveldings.yuck")
+
+(defwindow bottomBar
+ :monitor 0
+ :stacking "fg"
+ :wm-ignore true
+ :exclusive true
+ :geometry (geometry
+ :width "100%"
+ :height "33px"
+ :anchor "bottom center")
+ (bottomBar))
+
+(defwidget bottomBar []
+ (overlay
+ :class "bottomBar"
+ (transform
+ :translate-y "1.5px"
+ (centerbox
+ (box
+ :halign "start"
+ (workspaceWidget)
+ )
+ (box
+ :halign "center"
+ (traveldings)
+ )
+ (box
+ :halign "end"
+ ; (label :text "${iceData.speed}km/h")
+ (mullvadThing)
+ )
+ )
+ )
+ (box
+ :class "lesbianFlag"
+ :height 1
+ ( flagEl :flipped true :color "#D52D00")
+ ( flagEl :flipped true :color "#EF7627")
+ ( flagEl :flipped true :color "#FF9A56")
+ ( flagEl :flipped true :color "#FFFFFF")
+ ( flagEl :flipped true :color "#D162A4")
+ ( flagEl :flipped true :color "#B55690")
+ ( flagEl :flipped true :color "#A30262")
+ )
+ )
+)
+
+(deflisten mullvad
+ :initial "{\"state\":\"init\"}"
+ `mullvad status -j listen`
+)
+
+(defwidget mullvadThing []
+ (box
+ :class "container"
+ (button
+ :height 16
+ :width 16
+ :class "mullvad-state-${mullvad.state}"
+ )
+ )
+)
+
+(defwidget iceTacho []
+ (box
+ :class "iceTacho"
+ :tooltip "Tz${iceTachoData.tzn} (BR ${iceTachoData.br})"
+ (label :text "${iceTachoData.speed} km/h")
+ )
+)
+
+(deflisten iceTachoData
+ :initial "null"
+ { "~/.config/eww/scripts/iceTacho.nu" }
+)
diff --git a/home/rices/schrottkatze/eww/configDir/bottomBar/traveldings.yuck b/home/rices/schrottkatze/eww/configDir/bottomBar/traveldings.yuck
new file mode 100644
index 0000000..62de26e
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/bottomBar/traveldings.yuck
@@ -0,0 +1,37 @@
+(defwidget traveldings []
+ (revealer
+ :class "traveldings"
+ :transition "crossfade"
+ :reveal { traveldings_data != "null" }
+ (traveldingsBarWidget)
+ )
+)
+
+(defwidget traveldingsBarWidget []
+ (overlay
+ (box
+ :width 640
+ (label
+ :halign "start"
+ :text "${traveldings_data.line} -> ${strlength(traveldings_data.arrival_station) > 24 ? "${substring(traveldings_data.arrival_station, 0, 24)}…" : traveldings_data.arrival_station}${traveldings_data.arrival_platform_data_available ? " (Gl. ${traveldings_data.arrival_platform_real})" : ""}"
+ )
+ (label
+ :halign "end"
+ :text { traveldings_data.time_left >= 3600 ? formattime(traveldings_data.time_left, "noch %-Hh %-Mmin", "Etc/UTC") : formattime(traveldings_data.time_left, "noch %-Mmin", "Etc/UTC") }
+ )
+ )
+ (box
+ (progress
+ :class { traveldings_data.live ? "traveldings_live" : "traveldings_disconnected" }
+ :value {traveldings_data.progress * 100}
+ :orientation "horizontal"
+ )
+ )
+ )
+)
+
+
+(deflisten traveldings_data
+ :initial "null"
+ "traveldings current"
+)
diff --git a/home/rices/schrottkatze/eww/configDir/bottomBar/workspaces.yuck b/home/rices/schrottkatze/eww/configDir/bottomBar/workspaces.yuck
new file mode 100644
index 0000000..2709e1b
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/bottomBar/workspaces.yuck
@@ -0,0 +1,18 @@
+(defwidget workspaceWidget []
+ (box
+ :class "workspaces"
+ (for workspace in workspaces
+ (button
+ :style "border-bottom: 4px solid ${workspace.color}${workspace.active ? "; background-color: #3c3836" : ""}"
+ :class "${workspace.focused ? "focused" : ""}"
+ :onclick "niri msg action focus-workspace ${workspace.idx}"
+ (label :text "${workspace.icon ?: workspace.idx}")
+ )
+ )
+ )
+)
+
+(deflisten workspaces
+ :initial "[]"
+ "bar-ws-monitor"
+)
diff --git a/home/rices/schrottkatze/eww/configDir/eww.css b/home/rices/schrottkatze/eww/configDir/eww.css
new file mode 100644
index 0000000..2ce2ac5
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/eww.css
@@ -0,0 +1,58 @@
+label {
+ font: 14pt "Departure Mono Nerd Font";
+}
+
+button {
+ border-radius: 0px;
+ padding: 0;
+}
+
+.background {
+ background-color: #1d2021;
+}
+
+.workspaces button {
+ border: 0px;
+ padding: 5px 4px 0 4px;
+}
+
+.workspaces button.focused {
+ background-color: #504935;
+}
+
+.traveldings progressbar trough {
+ border: none;
+ background-color: #3c3836;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.traveldings progressbar.traveldings_live progress {
+ background-color: #79740e;
+ border-bottom-left-radius: 0;
+}
+
+.traveldings progressbar.traveldings_disconnected progress {
+ background-color: #cc241d;
+}
+
+
+.traveldingsWindow {
+ border-radius: 15px;
+}
+
+.mullvad-state-connected {
+ background-color: #98971a
+}
+
+.mullvad-state-connecting {
+ background-color: #d79921
+}
+
+.mullvad-state-disconnected {
+ background-color: #cc241d
+}
+
+.mullvad-state-init {
+ background-color: #458588
+}
diff --git a/home/rices/schrottkatze/eww/configDir/eww.yuck b/home/rices/schrottkatze/eww/configDir/eww.yuck
new file mode 100644
index 0000000..f6f20f5
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/eww.yuck
@@ -0,0 +1,36 @@
+(include "topBar/topBar.yuck")
+(include "bottomBar/bottomBar.yuck")
+
+(include "topBar/time.yuck")
+
+(defwindow streamUi
+ :monitor 0
+ :stacking "fg"
+ :wm-ignore true
+ :exclusive true
+ :geometry (geometry
+ :width "640px"
+ :height "100%"
+ :anchor "center right")
+ (centerbox
+ :style "padding: 0 3px"
+ :orientation "vertical"
+ (label :text "hi")
+ (label :text "hi")
+ (centerbox
+ :valign "end"
+ (box
+ :halign "start"
+ (systray
+ :icon-size 18
+ :spacing 3
+ )
+ )
+ (box)
+ (box
+ :halign "end"
+ (time)
+ )
+ )
+ )
+)
diff --git a/home/rices/schrottkatze/eww/configDir/scripts/bat.nu b/home/rices/schrottkatze/eww/configDir/scripts/bat.nu
new file mode 100755
index 0000000..fd34c50
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/scripts/bat.nu
@@ -0,0 +1,78 @@
+#!/usr/bin/env nu
+
+const ICONS = [
+ [ normal charging];
+ [ 󰂎 󰢟 ]
+ [ 󰁺 󰢜 ]
+ [ 󰁻 󰂆 ]
+ [ 󰁼 󰂇 ]
+ [ 󰁽 󰂈 ]
+ [ 󰁾 󰢝 ]
+ [ 󰁿 󰂉 ]
+ [ 󰂀 󰢞 ]
+ [ 󰂁 󰂊 ]
+ [ 󰂂 󰂋 ]
+ [ 󰁹 󰂅 ]
+];
+
+const DELAY = 2sec;
+
+def "main auto" [] {
+ loop {
+ let paths = ls "/sys/class/power_supply"
+ | each {|it| $it.name | path basename}
+ | filter {|it| $it starts-with "BAT"};
+
+ if ($paths | is-not-empty) {
+ let result = $paths
+ | each {|it| get_and_format $it}
+ | str join " | "
+ | prepend "| "
+ | str join;
+
+ print $result
+ } else {
+ print ""
+ }
+ sleep $DELAY;
+ }
+}
+
+def main [ path: string ] {
+ loop {
+ print (get_and_format $path)
+ sleep $DELAY;
+ }
+}
+
+def get_and_format [ path: string ] {
+ let fract = get_bat_charge_fraction $path;
+ let is_charging = get_bat_charging_status $path;
+ let percent = ($fract * 100) | math round;
+
+ return $"<span foreground=\"#d65d0e\">(get_bat_icon $fract $is_charging)</span> ($percent)<span foreground=\"#7c6f64\">%</span>";
+}
+
+def get_bat_charge_fraction [
+ path: string
+] {
+ let energy_full = open $"/sys/class/power_supply/($path)/energy_full" | into float;
+ let energy_now = open $"/sys/class/power_supply/($path)/energy_now" | into float;
+
+ $energy_now / $energy_full
+}
+
+def get_bat_charging_status [
+ path: string
+] {
+ let status = open $"/sys/class/power_supply/($path)/status";
+
+ $status like Charging
+}
+
+def get_bat_icon [
+ frac: float
+ is_charging = false
+] {
+ $ICONS | get (($frac * 10) | math round) | get (if ($is_charging) { "charging" } else { "normal" })
+}
diff --git a/home/rices/schrottkatze/eww/configDir/scripts/iceTacho.nu b/home/rices/schrottkatze/eww/configDir/scripts/iceTacho.nu
new file mode 100755
index 0000000..5225dc2
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/scripts/iceTacho.nu
@@ -0,0 +1,38 @@
+#!/usr/bin/env nu
+
+const TABLE = {
+ 401: 280
+ 402: 280
+ 403: 330
+ 406: 330
+ 407: 320
+ 408: 320
+ 411: 230
+ 415: 230
+ 412: 265
+ 605: 200
+};
+
+def main [ ] {
+ loop {
+ if ((iw dev wlp4s0 link | lines | filter {|it| $it =~ "WIFIonICE" } | length) == 1) {
+ let iceData = http get https://iceportal.de/api1/rs/status;
+ let tzn = $iceData.tzn;
+ let br = $iceData.series;
+ let speed = $iceData.speed;
+ let speedfrac = $speed / ($TABLE | get $br);
+
+ print ({
+ tzn: $tzn,
+ br: $br,
+ speed: $speed,
+ frac: $speedfrac
+ } | to json -r);
+
+ sleep 2sec;
+ } else {
+ print "null";
+ sleep 5sec;
+ }
+ }
+}
diff --git a/home/rices/schrottkatze/eww/configDir/topBar/sysinfo.yuck b/home/rices/schrottkatze/eww/configDir/topBar/sysinfo.yuck
new file mode 100644
index 0000000..c37838a
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/topBar/sysinfo.yuck
@@ -0,0 +1,22 @@
+(deflisten bat
+ :initial "<span foreground=\"#cc241d\">BAT0 ERR</span>"
+ { "~/.config/eww/scripts/bat.nu auto"}
+)
+
+(defwidget cpu []
+ (box
+ :class "cpuIndicator"
+ (label
+ :markup "<span foreground=\"#d65d0e\"></span> ${strlength(round(EWW_CPU.avg, 0)) == 1 ? " ${round(EWW_CPU.avg, 0)}" : round(EWW_CPU.avg, 0)}<span foreground=\"#7c6f64\">%</span>"
+ )
+ )
+)
+
+(defwidget mem []
+ (box
+ :class "memIndicator"
+ (label
+ :markup "<span foreground=\"#d65d0e\"> </span> ${round(EWW_RAM.used_mem_perc, 0)}<span foreground=\"#7c6f64\">%</span>"
+ )
+ )
+)
diff --git a/home/rices/schrottkatze/eww/configDir/topBar/time.yuck b/home/rices/schrottkatze/eww/configDir/topBar/time.yuck
new file mode 100644
index 0000000..ba22883
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/topBar/time.yuck
@@ -0,0 +1,10 @@
+(defwidget time []
+ (label
+ :markup {
+ formattime(
+ EWW_TIME,
+ "<span foreground=\"#d65d0e\"></span> %Y<span foreground=\"#7c6f64\">-</span>%m<span foreground=\"#7c6f64\">-</span>%d <span foreground=\"#d65d0e\"></span> %H<span foreground=\"#7c6f64\">:</span>%M<span foreground=\"#7c6f64\">:</span>%S "
+ )
+ }
+ )
+)
diff --git a/home/rices/schrottkatze/eww/configDir/topBar/topBar.yuck b/home/rices/schrottkatze/eww/configDir/topBar/topBar.yuck
new file mode 100644
index 0000000..4aee71f
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/topBar/topBar.yuck
@@ -0,0 +1,55 @@
+(include "topBar/time.yuck")
+(include "topBar/sysinfo.yuck")
+(include "util.yuck")
+
+(defwindow topBar
+ :monitor 0
+ :stacking "fg"
+ :wm-ignore true
+ :exclusive true
+ :geometry (geometry
+ :width "100%"
+ :height "33px"
+ :anchor "top center")
+ (topBar))
+
+(defwidget topBar []
+ (overlay
+ :class "topBar"
+ (transform
+ :translate-y "-1.5px"
+ (centerbox
+ (box
+ :halign "start"
+ :spacing 12
+ :space-evenly false
+ (label :text " ")
+ (cpu)
+ (sep)
+ (mem)
+ (label :markup bat)
+ )
+ (box
+ :halign "center"
+ (systray
+ :icon-size 18
+ :spacing 3
+ )
+ )
+ (box
+ :halign "end"
+ (time)
+ )
+ )
+ )
+ (box
+ :class "transFlag"
+ :height 1
+ ( flagEl :flipped false :color "#5BCEFA")
+ ( flagEl :flipped false :color "#F5A9B8")
+ ( flagEl :flipped false :color "#FFFFFF")
+ ( flagEl :flipped false :color "#F5A9B8")
+ ( flagEl :flipped false :color "#5BCEFA")
+ )
+ )
+)
diff --git a/home/rices/schrottkatze/eww/configDir/util.yuck b/home/rices/schrottkatze/eww/configDir/util.yuck
new file mode 100644
index 0000000..3df84ab
--- /dev/null
+++ b/home/rices/schrottkatze/eww/configDir/util.yuck
@@ -0,0 +1,10 @@
+(defwidget flagEl [color ?flipped]
+ (box
+ :style "border-${flipped ? "top" : "bottom"}: 3px solid ${color}"
+ :halign "fill"
+ )
+)
+
+(defwidget sep []
+ (label :text "|")
+)