Version 0.1.0

This commit is contained in:
2025-11-13 14:15:48 +00:00
parent daa7360b56
commit 292b8e9372
45 changed files with 3728 additions and 0 deletions

View File

@@ -0,0 +1,472 @@
{ config, pkgs, ... }:
{
home.file.".config/eww/windows/ascii/audio_status.yuck".text = ''
;; audio_status
;; Text displaying audio status.
;; Anchored top outside visualizer
(defwindow audio_status
:visible show_eww
:anchor "top right"
:geometry (geometry :x "79px" :y "288px" :width "300px" :height "40px")
:stacking "bg"
:monitor 0
:exclusive false
:focusable false
(box :orientation "vertical" :halign "end"
(label :text ascii_audio_status :class "ascii-core-status")
)
)
'';
home.file.".config/eww/windows/ascii/visualizer_window.yuck".text = ''
;; visualizer window
;; Displays ASCII visual for audio activity.
;; Anchored very top
(defwindow audio_status
:visible show_eww
:anchor "top right"
:geometry (geometry :x "79px" :y "288px" :width "300px" :height "40px")
:stacking "bg"
:monitor 0
:exclusive false
:focusable false
(box :orientation "vertical" :halign "end"
(label :text ascii_audio_status :class "ascii-core-status")
)
)
(defwindow visualizer_window
:visible show_eww
:monitor 0
:geometry (geometry :x 38 :y 143 :width 340 :height 150)
:layer "bottom"
:stacking "bg"
:focusable false
:window-type "wayland"
:anchor [ "top center" ]
(audio-visualizer))
(defwidget audio-visualizer []
(box
:class "visualizer-outer-frame"
:padding 6
(box
:class "visualizer-inner-frame"
:padding 10
(label
:text visualizer_content
:markup true
:class "visualizer-text"))))
'';
home.file.".config/eww/windows/bar/cpu_ram_storage_bars.yuck".text = ''
;; CPU RAM Storage
;; Text displaying cpu load, ram usage, storage
;; Anchored middle left
(defwindow cpu_ram_storage_bars
:visible show_eww
:anchor "top right"
:monitor 0
:geometry (geometry :x "33px" :y "482px" :width "450px" :height "140px")
:stacking "bg"
:exclusive false
:focusable false
(box :orientation "vertical" :halign "start" :space "10px"
;; ==== CPU LOAD ====
(label :text " [ CPU LOAD ]" :class "stats-label" :halign "start")
(box :orientation "horizontal" :halign "start" :space "4px"
(box :class "module-frame" :orientation "vertical" :halign "start" :style "margin-top: -8px;"
(label :text cpu_bar :class "ram-bar")
)
(box :class "module-frame" :orientation "vertical" :halign "start" :style "min-width: 40px; padding: 0px;"
(label :text cpu_usage :class "ram-bar2" :halign "center"))
)
;; ==== RAM USAGE ====
(label :text " [ RAM USAGE ]" :class "stats-label" :halign "start")
(box :orientation "horizontal" :halign "center" :space "4px"
;; LEFT: ASCII RAM BAR
(box :class "module-frame" :orientation "vertical" :halign "start" :style "margin-top: -8px;"
(label :text ram_bar :class "ram-bar"))
;; RIGHT: RAM PERCENT
(box :class "module-frame" :orientation "vertical" :halign "start" :style "padding: 0px; ; min-width: 40px"
(label :text ram_percent :class "ram-bar2" :halign "center"))
)
;; ==== CPU LOAD ====
;; ==== STORAGE REMAINING ====
(label :text " [ STORAGE ]" :class "stats-label" :halign "start")
(box :orientation "horizontal" :halign "center" :space "4px"
(box :class "module-frame" :orientation "vertical" :halign "start" :style "margin-top: -8px;"
(label :text storage_bar :class "ram-bar"))
(box :class "module-frame" :orientation "vertical" :halign "start" :style "min-width: 35px; padding: 2px;"
(label :text storage_percent :class "ram-bar2" :halign "center"))
)
)
)
'';
home.file.".config/eww/windows/misc/welcome_text.yuck".text = ''
;; welcome text
;; Text displaying date and weather in cyrilic
;; Anchored right screen
(defwindow welcome_text
:visible show_eww
:anchor "top"
:monitor 0
:geometry (geometry :x "1740px" :y "152px" :width "100px" :height "90px")
:stacking "bg"
:exclusive false
:focusable false
(box :orientation "vertical" :halign "end" :class "stats-box" :space "1px"
;; Welcome Line
(label :text "> Добро пожаловать, ${USER}" :class "label-primary" :halign "end" :style "margin-top: -20px;")
;; Date Line
(label :text "Текущая дата: ${welcome_date}" :class "label-primary" :halign "end" :style "margin-top: -10px;")
;; Weather Line
(label :text "Погода: ${weather_forecast}" :class "label-primary" :halign "end" :style "margin-top: -10px;")
)
)
'';
home.file.".config/eww/windows/net/ascii_decor_frame.yuck".text = ''
;; ascii decor frame
;; Text displaying audio status.
;; Anchored top inside visualizer
(defwindow ascii_decor_frame
:visible show_eww
:anchor "bottom right"
:geometry (geometry :x "30px" :y "808px" :width "220px" :height "100px")
:stacking "bg"
:exclusive false
:focusable false
:monitor 0
(box :orientation "vertical" :halign "center" :valign "center"
(label :text ascii_decor1 :class "ascii-decor1")
)
)
'';
home.file.".config/eww/windows/net/net_bars.yuck".text = ''
;; net bars
;; Text header and vectors showing network info
;; Anchored bottom
(defwindow net_bars
:visible show_eww
:anchor "top left"
:geometry (geometry :x "9px" :y "638px" :width "420px" :height "120px")
:stacking "bg"
:exclusive false
:focusable false
:monitor 0
;; Horizontal layout for side-by-side bars
(box :orientation "horizontal" :halign "center" :space "10px"
;; DOWNLOAD BAR
(box :orientation "vertical" :halign "center"
(label :text "[ DOWNLOAD ]" :style "margin-top: 160px;" :class "stats-label")
(box :class "module-frame2"
(label :text download_bar :class "ram-bar"))
)
;; UPLOAD BAR
(box :orientation "vertical" :halign "center" :style "min-width: 81px;"
(label :text "[ UPLOAD ]" :style "margin-top: 160px;" :class "stats-label")
(box :class "module-frame2"
(label :text upload_bar :class "ram-bar"))
)
;; LATENCY BAR
(box :orientation "vertical" :halign "center"
(label :text "[ LATENCY ]" :style "margin-top: 160px;" :class "stats-label")
(box :class "module-frame2"
(label :text ping_bar :class "ram-bar"))
)
;; VPN BAR
(box :orientation "vertical" :halign "center" :style "min-width: 81px;"
(label :text "[ VPN ]" :style "margin-top: 160px;" :class "stats-label")
(box :class "module-frame2"
(label
:text vpn_bar
:markup true ;; allow ASCII multi-line
:class "ram-bar"))
)
)
)
'';
home.file.".config/eww/windows/net/right_internet_text.yuck".text = ''
;; right internet text
;; Text displaying ping and vpn status
;; Anchored top very bottom right
(defwindow right_internet_text
:visible show_eww
:anchor "top left"
:monitor 0
:geometry (geometry :x "42px" :y "976px" :width "320px" :height "80px")
:stacking "bg"
:exclusive false
:focusable false
(box :class "internet-clean-box" :orientation "vertical" :halign "center" :space "8px"
(box :orientation "horizontal" :halign "center" :space "6px"
(label :text download_speed :class "label-primary2")
(label :text upload_speed :class "label-primary2")
(label :text ping_ms :class "label-primary2")
(label :text vpn_status_text :class "label-primary2")
)
)
)
'';
home.file.".config/eww/windows/sys/active_workspace.yuck".text = ''
;; active workspace
;; Text displaying active/inactive workspaces
;; Anchored middle right
(defwindow active_workspace
:visible show_eww
:anchor "top left"
:geometry (geometry :x "267px" :y "502px" :width "100px" :height "200px")
:stacking "bg"
:exclusive false
:monitor 0
:focusable false
(box :orientation "vertical" :space "10px" :valign "center"
;; === Workspace 1 ===
(box :class "info-left" :orientation "vertical" :space "2px" :style "margin-bottom: 15px;"
(label :text ws1 :class "ascii-core-status2"))
;; === Workspace 2 ===
(box :class "info-left" :orientation "vertical" :space "2px" :style "margin-bottom: 15px;"
(label :text ws2 :class "ascii-core-status2"))
;; === Workspace 3 ===
(box :class "info-left" :orientation "vertical" :space "2px" :style "margin-bottom: 15px;"
(label :text ws3 :class "ascii-core-status2"))
;; === Workspace 4 ===
(box :class "info-left" :orientation "vertical" :space "2px" :style "margin-bottom: 15px;"
(label :text ws4 :class "ascii-core-status2"))
)
)
;;box :orientation "vertical" :space "10px" :valign "center"
;; (label :text "Workspace 1" :class "label-primary")
;;(label :text "Workspace 2" :class "label-primary")
;;(label :text "" :class "label-primary")
;;
;; (label :text "Workspace 3" :class "label-primary")
;; (label :text "Workspace 4" :class "label-primary")))
'';
home.file.".config/eww/windows/sys/four_boxes.yuck".text = ''
;; four boxes
;; four boxes showing uptime, battery life, cpu temp, gpu temp
;; Anchored top
(defwindow four_boxes
:visible show_eww
:anchor "right"
:monitor 0
:geometry (geometry :x "4" :y "340px" :width "430px" :height "140")
:stacking "bg"
:exclusive false
(box :orientation "horizontal" :space-evenly true
;; LEFT COLUMN
(box :orientation "vertical" :halign "center" :space "10px"
;; REACTOR UPTIME
(box :class "module-frame" :orientation "vertical" :halign "center"
(label :text "[ REACTOR UPTIME ]" :class "stats-label")
(box :width "140px"
(label :text uptime_full :class "label-primary" :halign "center"))
)
;; CPU TEMP
(box :class "module-frame" :orientation "vertical" :halign "center"
(label :text "[ CPU TEMP ]" :class "stats-label")
(box :width "140px"
(label :text "${cpu_temp}" :class "label-primary" :halign "center"))
)
)
;; RIGHT COLUMN
(box :orientation "vertical" :halign "center" :space "10px"
;; MELTDOWN CLOCK
(box :class "module-frame" :orientation "vertical" :halign "center"
(label :text "[ MELTDOWN CLOCK ]" :class "stats-label")
(box :width "140px"
(label :text battery_time :class "label-primary" :halign "center"))
)
;; GPU TEMP
(box :class "module-frame" :orientation "vertical" :halign "center"
(label :text "[ GPU TEMP ]" :class "stats-label")
(box :width "140px"
(label :text "+${gpu_temp}°C" :class "label-primary" :halign "center"))
)
)
)
)
'';
home.file.".config/eww/windows/sys/orange_workspace.yuck".text = ''
;; orange workspace
;; Vectors displaying reactor number in cyrilic text
;; Anchored middle right
(defwindow orange_workspace
:visible show_eww
:anchor "top left"
:geometry (geometry :x "371px" :y "509px" :width "60px" :height "100px")
:stacking "bg"
:exclusive false
:focusable false
:monitor 0
(box :orientation "vertical" :space "10px"
(box :class "info-right-box" :valign "end" :halign "start" (label :text "А1" :class "info-right-text" ))
(box :class "info-right-box" :valign "end" :halign "start" (label :text "Б2" :class "info-right-text" ))
(box :class "info-right-box" :valign "end" :halign "start" (label :text "В3" :class "info-right-text" ))
(box :class "info-right-box" :valign "end" :halign "start" (label :text "Г4" :class "info-right-text" ))))
'';
home.file.".config/eww/windows/sys/power_cooling_header_text.yuck".text = ''
;; power cooling header
;; Text displaying header for cooling and power
;; Anchored bottom
(defwindow power-cooling_header_text
:visible show_eww
:anchor "top left"
:monitor 0
:geometry (geometry :x "-52px" :y "700px" :width "100px" :height "8px")
:stacking "bg"
:exclusive false
:focusable false
;; Switch to horizontal to place boxes side by side
(box :orientation "horizontal" :halign "center" :space "12px"
;; First box: POWER GRID
(label :text "[ POWER GRID ]" :class "stats-label3")
;; Second box: another label, e.g. MODE STATUS
(label :text "[ COOLING ]" :class "stats-label3" :halign "center")
)
)
'';
home.file.".config/eww/windows/sys/power_mode_text.yuck".text = ''
;; power mode text
;; Text displaying power in cyrilic text
;; Anchored bottom left
(defwindow power_mode_text
:anchor "top left"
:monitor 0
:geometry (geometry :x "-31px" :y "724px" :width "80px" :height "62px")
:stacking "bg"
:exclusive false
:focusable false
(box :orientation "vertical" :halign "start" :space "4px"
;; Power Draw
(box :orientation "horizontal" :halign "end" :space "4px" :style "margin-top:-10px;"
(label :text "> " :class "power-label2" :halign "end" )
(label :text "нагрузка: " :class "power-label")
(label :text power_draw :class "power-value" :halign "end" )
)
;; CPU Voltage
(box :orientation "horizontal" :halign "start" :space "4px" :style "margin-top: -10px;"
(label :text "> " :class "power-label2" :halign "end" )
(label :text "цпу: " :class "power-label")
(label :text cpu_voltage :class "power-value" :halign "end" )
)
;; GPU Voltage
(box :orientation "horizontal" :halign "start" :space "4px" :style "margin-top: -10px;"
(label :text "> " :class "power-label2" :halign "end" )
(label :text "гпу: " :class "power-label")
(label :text gpu_voltage :class "power-value" :halign "end" )
)
;; GPU Voltage
(box :orientation "horizontal" :halign "start" :space "4px" :style "margin-top: -10px;"
(label :text "> " :class "power-label2" :halign "end" )
(label :text "питание: " :class "power-label")
(label :text dc_voltage :class "power-value" :halign "end" )
)
)
)
'';
home.file.".config/eww/windows/sys/right_fan-data.yuck".text = ''
;; right fan data
;; Text displaying cooling and fan RPM
;; Anchored bottom right
(defwindow right_fan_data
:visible show_eww
:anchor "top left"
:monitor 0
:geometry (geometry :x "171px" :y "724px" :width "200px" :height "64px")
:stacking "bg"
:exclusive false
:focusable false
(box :orientation "vertical" :halign "start" :space "4px"
;; FAN
(box :orientation "horizontal" :halign "end" :space "4px" :style "margin-top:-10px;"
(label :text "> " :class "power-label2" :halign "end" )
(label :text "цпу вент: " :class "power-label3")
(label :text cpu_fan_rpm :class "power-value" :halign "end" )
)
;; FAN
(box :orientation "horizontal" :halign "start" :space "4px" :style "margin-top: -10px;"
(label :text "> " :class "power-label2" :halign "end" )
(label :text "оперконтроль: " :class "power-label3")
(label :text gpu_fan_ascii :class "power-value" :halign "end" )
)
;; fan
(box :orientation "horizontal" :halign "end" :space "4px" :style "margin-top:-10px;"
(label :text "> " :class "power-label2" :halign "end" )
(label :text "гпу вент: " :class "power-label3")
(label :text gpu_fan_rpm :class "power-value" :halign "end" )
)
;;fan
(box :orientation "horizontal" :halign "start" :space "4px" :style "margin-top: -10px;"
(label :text "> " :class "power-label2" :halign "end" )
(label :text "оперконтроль: " :class "power-label3")
(label :text gpu_fan_ascii :class "power-value" :halign "end" )
)
)
)
'';
home.file.".config/eww/windows/sys/workspace_window_text.yuck".text = ''
;; workspace window text
;; Text and ascii showing active workspace number
;; Anchored top middle
(defwindow workspace_window_text
:anchor "center"
:monitor 0
:geometry (geometry :x "9px" :y "300px" :width "420px" :height "220px")
:stacking "bg"
:exclusive false
:focusable false
(box :orientation "vertical" :halign "center"
(label :text reactor_core_layout :class "ascii-core-status2")
)
)
'';
}

View File

@@ -0,0 +1,629 @@
{ config, pkgs, ... }:
{
home.file.".config/eww/scripts/ascii/ascii_core_layout.sh".file = ''
#!/usr/bin/env bash
#
# ascii_core_layout.sh
# Gets the current Hyprland workspace ID and writes a small ASCII frame
# to /tmp/core_layout.txt.
# Example output (written to /tmp/core_layout.txt):
#
# [ 2 ]
#
#
ws=$(hyprctl activeworkspace -j | jq -r '.id')
cat <<EOF > /tmp/core_layout.txt
[ $ws ]
EOF
'';
home.file.".config/eww/scripts/audio/audio_cava_status.sh".file = ''
#!/usr/bin/env bash
#
# Checks whether the ASCII visualizer output file (/tmp/visualizer.txt)
# is actively updating by comparing MD5 hashes between loops.
# Outputs simple text.
# Called by ascii_audio_status window
#
VIS_FILE="/tmp/visualizer.txt"
HASH_FILE="/tmp/.last_vis_hash"
# Safety checks
if [ ! -s "$VIS_FILE" ]; then
echo "[ CORE STATUS: ] Standby."
exit 0
fi
# Hash current frame
if command -v md5sum >/dev/null 2>&1; then
CURRENT=$(md5sum "$VIS_FILE" | awk '{print $1}')
elif command -v md5 >/dev/null 2>&1; then # macOS/BSD fallback
CURRENT=$(md5 -q "$VIS_FILE")
else
echo "[ CORE STATUS: ] Unknown (no md5 tool found)"
exit 1
fi
LAST=$(cat "$HASH_FILE" 2>/dev/null || echo "")
# Save current hash for next check
echo "$CURRENT" > "$HASH_FILE"
# Compare
if [ "$CURRENT" = "$LAST" ] && [ -n "$LAST" ]; then
echo "[ CORE STATUS: ] Inactive."
else
echo "[ CORE STATUS: ] Generating visuals."
fi
'';
home.file.".config/eww/scripts/audio/audio_visualizer.py".text = ''
#!/usr/bin/env python3
#
# °˖* ( )🍸 pewdiepie/archdaemon/dionysh shhheersh
# vers. 1.0
#
# Reads /tmp/cava.raw and writes an ASCIIart file that can be shown by eww,
# waybar, or any terminal widget. Can run as exec once in hyprland config.
#
import argparse
import os
import signal
import sys
import time
import numpy as np
# Default visual parameters
DEFAULT_WIDTH = 64
DEFAULT_HEIGHT = 12
DEFAULT_FPS = 30
DEFAULT_DECAY = 0.92 # lower longer trails
CHARS = [" ", ".", ":", "·", "", ""] # ascending intensity
def parse_frame(line: str, width: int) -> list[int]:
"""Turn a semicolonseparated line from CAVA into a list of ints."""
try:
return [int(x) for x in line.strip().split(";") if x][:width]
except ValueError:
return [0] * width
def normalize(vals: list[int]) -> np.ndarray:
"""Scale values to the range [0, 1]."""
arr = np.array(vals, dtype=float)
return (arr - arr.min()) / (arr.max() - arr.min() + 1e-5)
def get_char_index(val: float) -> int:
"""Map a normalized value to the appropriate character index."""
return min(int(val * (len(CHARS) - 1)), len(CHARS) - 1)
def build_frame(_, history: np.ndarray, height: int, width: int) -> list[str]:
"""Create the ASCII rows from the decay buffer."""
frame = [[" " for _ in range(width)] for _ in range(height)]
for x in range(width):
for y in range(height):
strength = history[y, x]
idx = get_char_index(strength)
frame[height - y - 1][x] = CHARS[idx]
# No baseline drawing the remove request is satisfied
return ["".join(row) for row in frame]
def run(
cava_path: str,
out_path: str,
width: int = DEFAULT_WIDTH,
height: int = DEFAULT_HEIGHT,
fps: int = DEFAULT_FPS,
decay: float = DEFAULT_DECAY,
) -> None:
"""Main loop read CAVA output, update the decay buffer, write ASCII."""
os.makedirs(os.path.dirname(out_path), exist_ok=True)
decay_buffer = np.zeros((height, width), dtype=float)
while True:
try:
with open(cava_path, "r") as f:
# read one line at a time from the FIFO
line = f.readline()
if not line:
time.sleep(1.0 / fps)
continue
except Exception:
time.sleep(1.0 / fps)
continue
# 1 Parse & normalise
values = parse_frame(line, width)
values = normalize(values) if values else np.zeros(width)
# 2 Build a binary bars matrix for the current frame
new_frame = np.zeros((height, width), dtype=float)
for i, val in enumerate(values):
bar_h = int(val * height)
new_frame[:bar_h, i] = 1.0
# 3 Apply decay (trails) and blend with the new frame
decay_buffer = np.maximum(decay_buffer * decay, new_frame)
# 4 Render ASCII and write out
ascii_lines = build_frame(values, decay_buffer, height, width)
with open(out_path, "w") as out:
out.write("\n".join(ascii_lines))
time.sleep(1.0 / fps)
def _handle_sigint(signum, frame):
"""Graceful exit on CtrlC."""
print("\n[+] CAVA ASCII visualizer stopped.")
sys.exit(0)
def main() -> None:
parser = argparse.ArgumentParser(
description="CAVA ASCII visualizer (compatible with eww/widgets)",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument("--cava-path", default="/tmp/cava.raw",
help="Path to CAVA raw output file")
parser.add_argument("--out-path", default="/tmp/visualizer.txt",
help="File where ASCII art will be written")
parser.add_argument("--width", type=int, default=DEFAULT_WIDTH,
help="Number of columns (match CAVA `bars` setting)")
parser.add_argument("--height", type=int, default=DEFAULT_HEIGHT,
help="Number of rows in the ASCII canvas")
parser.add_argument("--fps", type=int, default=DEFAULT_FPS,
help="Refresh rate (frames per second)")
parser.add_argument("--decay", type=float, default=DEFAULT_DECAY,
help="Trailfade factor (01, lower = slower fade)")
args = parser.parse_args()
signal.signal(signal.SIGINT, _handle_sigint)
print("[+] Starting CAVA ASCII visualizer ")
run(
cava_path=args.cava_path,
out_path=args.out_path,
width=args.width,
height=args.height,
fps=args.fps,
decay=args.decay,
)
if __name__ == "__main__":
main()
'';
home.file.".config/eww/scripts/bar/bar_render.sh" = ''
#!/usr/bin/env bash
#
# Converts a numeric percentage (0100) into an ASCII block bar.
# Example:
# ./usage_render_bar.sh 73
#
#
usage=$1 # pass percentage as the first argument
full=""
half=""
empty=""
blocks=10
filled=$(( usage * blocks / 100 ))
bar=""
for ((i=0; i<blocks; i++)); do
if [ $i -lt $filled ]; then
bar+="$full"
else
bar+="$empty"
fi
done
echo "$bar"
'';
home.file.".config/eww/scripts/net/net_download.sh".text = ''
#!/usr/bin/env bash
#
# net_download.sh
# Samples network traffic on a given interface and reports download usage
# as a percentage (0100) of a configured max speed.
#
# Usage: ./net_download.sh
# Example: output "42" meaning 42% of max throughput.
#
#
iface="wlp4s0" # Wi-Fi interface
max_speed=12500000 # adjust: this is 100 Mbps (100*1e6 / 8)
# First sample
rx1=$(awk -v iface=$iface '$1 ~ iface {gsub(":", "", $1); print $2}' /proc/net/dev)
sleep 1
# Second sample
rx2=$(awk -v iface=$iface '$1 ~ iface {gsub(":", "", $1); print $2}' /proc/net/dev)
bps=$((rx2 - rx1)) # bytes per second
percent=$((bps * 100 / max_speed))
# Clamp between 0100
if [ "$percent" -gt 100 ]; then percent=100; fi
if [ "$percent" -lt 0 ]; then percent=0; fi
echo $percent
'';
home.file.".config/eww/scripts/net/net_download_bar.sh".text = ''
#!/usr/bin/env bash
#
# upload_bar.sh
# Renders a vertical bar (5 lines) from a given percentage (0100).
#
# Usage: ./upload_bar.sh <percent>
# Example: ./upload_bar.sh 73
# Output (top to bottom):
#
#
#
#
#
#
percent=$1
lines=5
# Cap the percent between 0 and 100
if [ "$percent" -gt 100 ]; then percent=100; fi
if [ "$percent" -lt 0 ]; then percent=0; fi
# Calculate how many rows to fill
filled=$((percent * lines / 100))
# Always show at least one block if >0
if (( percent > 0 && filled == 0 )); then
filled=1
fi
# Draw from top to bottom
for ((i=0; i<lines; i++)); do
row=$((lines - i)) # count from top
if (( row <= filled )); then
if (( row == filled )); then
echo ""
else
echo ""
fi
else
echo ""
fi
done
'';
home.file.".config/eww/scripts/net/net_ping.sh".text = ''
#!/usr/bin/env bash
#
# net_ping.sh
# Measures ICMP ping latency to 139.162.207.118 (natalie) and outputs the result in milliseconds.
# If the host is unreachable, prints "0".
#
# Usage: ./net_ping.sh
# Example: ./net_ping.sh 24 (ms)
#
# Requires: ping (iputils)
#
ping -c 1 -w 2 139.162.207.118 2>/dev/null \
| grep 'time=' \
| awk -F'time=' '{print int($2)}' \
|| echo 0
'';
home.file.".config/eww/scripts/net/ping_latency.sh".text = ''
#!/usr/bin/env bash
#
# net_ping_latency.sh
# Visualizes ping latency as a vertical bar (5 lines).
#
# Usage: ./net_ping_latency.sh <ms>
# Example: ./net_ping_latency.sh 120
# Output (top to bottom):
#
#
#
#
#
#
ms=$1
lines=5
max_ms=200 # adjust scale (200ms = 100%)
# Scale ping ms percentage
percent=$(( ms * 100 / max_ms ))
if [ "$percent" -gt 100 ]; then percent=100; fi
if [ "$percent" -lt 0 ]; then percent=0; fi
# Calculate filled rows
filled=$(( (percent * lines + 99) / 100 ))
if (( ms > 0 && filled == 0 )); then
filled=1
fi
for ((i=0; i<lines; i++)); do
row=$((lines - i))
if (( row <= filled )); then
if (( row == filled )); then
echo ""
else
echo ""
fi
else
echo ""
fi
done
'';
home.file.".config/eww/scripts/net/net_upload.sh".text = ''
#!/usr/bin/env bash
#
# net_upload.sh
# Samples network traffic on a given interface and reports upload usage
# as a percentage (0100) of a configured max speed.
#
iface="wlp4s0" # your active Wi-Fi interface (from `ip -br link`)
max_speed=12500000 # 100 Mbps = 100e6 / 8 (bytes/sec). Adjust if faster.
# First sample
tx1=$(awk -v iface=$iface '$1 ~ iface {gsub(":", "", $1); print $10}' /proc/net/dev)
sleep 1
# Second sample
tx2=$(awk -v iface=$iface '$1 ~ iface {gsub(":", "", $1); print $10}' /proc/net/dev)
bps=$((tx2 - tx1)) # bytes per second
percent=$((bps * 1000 / max_speed)) # scaled ×10 for sensitivity
# Clamp between 0100
if [ "$percent" -gt 100 ]; then percent=100; fi
if [ "$percent" -lt 0 ]; then percent=0; fi
echo $percent
'';
home.file.".config/eww/scripts/net/net_upload_bar.sh".text = ''
#!/usr/bin/env bash
#
# upload_bar.sh
# Renders a vertical bar (5 lines) from a given percentage (0100).
#
# Usage: ./upload_bar.sh <percent>
# Example: ./upload_bar.sh 73
# Output (top to bottom):
#
#
#
#
#
#
percent=$1
lines=5
# Cap 0100
if [ "$percent" -gt 100 ]; then percent=100; fi
if [ "$percent" -lt 0 ]; then percent=0; fi
# Scale percentage into rows (round up)
filled=$(( (percent * lines + 99) / 100 ))
# Always show at least one block if >0
if (( percent > 0 && filled == 0 )); then
filled=1
fi
# Draw from top to bottom
for ((i=0; i<lines; i++)); do
row=$((lines - i)) # count from top
if (( row <= filled )); then
if (( row == filled )); then
echo ""
else
echo ""
fi
else
echo ""
fi
done
'';
home.file.".config/eww/scripts/net/net_vpn.sh".text = ''
#!/usr/bin/env bash
#
# net_vpn.sh
# Checks if VPN (10.6.0.x) is active, outputs 100 (on) or 0 (off).
# Example: VPN connected 100
# VPN disconnected 0
#
if ip a | grep -q "10\.6\."; then
echo 100
else
echo 0
fi
'';
home.file.".config/eww/scripts/net/net_vpn_bar.sh".text = ''
#!/usr/bin/env bash
# ~/.config/eww/scripts/net/net_vpn_bar.sh
# Render a 5-line bar directly based on VPN (ipsec) status.
lines=5
if sudo /usr/bin/ipsec statusall 2>/dev/null | grep -q "ESTABLISHED"; then
# VPN is up full block bar
for ((i=0; i<lines; i++)); do
echo ""
done
else
# VPN is down thin bar
for ((i=0; i<lines; i++)); do
echo ""
done
fi
'';
home.file.".config/eww/scripts/net/net_vpn_status.sh".text = ''
#!/usr/bin/env bash
# ~/.config/eww/scripts/net/net_vpn_status.sh
# Show VPN status + country (for Eww)
if sudo /usr/bin/ipsec statusall 2>/dev/null | grep -q "ESTABLISHED"; then
country=$(curl -s ifconfig.co/country 2>/dev/null)
[[ -z "$country" ]] && country="НЕУСТАНОВЛЕНО"
echo "[УЗЕЛ] $country"
else
echo "[НЕТ СВЯЗИ]"
fi
'';
home.file.".config/eww/scripts/sys/sys_cpu_voltage.sh".text = ''
#!/usr/bin/env bash
#
# sys_dc_voltage.sh
# Reads the VDDNB (SoC / NB voltage) from lm-sensors and prints it in mV.
# Requires: lm-sensors (run `sensors-detect` to configure chip readings).
#
sensors | awk '/vddnb:/ {printf "%s mV\n", $2}' || echo "N/A"
'';
home.file.".config/eww/scripts/sys/sys_dc_voltage.sh".text = ''
#!/bin/bash
#
# sys_cpu_voltage.sh
# Reads CPU voltage (in0) from lm-sensors and prints it in volts.
# Requires: lm-sensors (and sensors-detect configured)
#
sensors | awk '/in0:/ {print $2 " V"}' || echo "N/A"
'';
home.file.".config/eww/scripts/sys/sys_fan_bar.sh".text = ''
#!/usr/bin/env bash
#
# bar_render.sh
# Renders a simple horizontal bar graph from a percentage value.
# Example: ./bar_render.sh 75
#
usage=$1 # percent or normalized value
full=""
empty=""
blocks=10
filled=$(( usage * blocks / 100 ))
bar=""
for ((i=0; i<blocks; i++)); do
if [ $i -lt $filled ]; then
bar+="$full"
else
bar+="$empty"
fi
done
echo "$bar"
'';
home.file.".config/eww/scripts/sys/sys_fan_spin.sh".text = ''
#!/usr/bin/env bash
#
# Script: sys_fan_spin.sh
# Purpose: Displays fan spinner animation (CPU/GPU) based on RPM
# Example:
# ./sys_fan_spin.sh cpu
#
SPIN=('|' '/' '-' '\\')
fan="$1"
# Simple cache file to track frame index across calls
cache="/tmp/${fan}_fan_frame"
if [ -f "$cache" ]; then
index=$(<"$cache")
else
index=0
fi
# Advance frame
index=$(( (index + 1) % ${#SPIN[@]} ))
echo "$index" > "$cache"
# Get RPM
if [ "$fan" = "cpu" ]; then
rpm=$(sensors | grep -i 'cpu_fan' | awk '{print $2}')
elif [ "$fan" = "gpu" ]; then
rpm=$(sensors | grep -i 'gpu_fan' | awk '{print $2}')
else
rpm=0
fi
[ -z "$rpm" ] && rpm=0
if [ "$rpm" -eq 0 ]; then
echo "|"
else
echo "${SPIN[$index]}"
fi
'';
home.file.".config/eww/scripts/sys/sys_gpu_voltage.sh".text = ''
#!/bin/bash
# ─────────────────────────────────────────────────────────────────────────────
# Reads NVIDIA GPU voltage using nvidia-smi and prints it in millivolts.
# ─────────────────────────────────────────────────────────────────────────────
sensors | awk '/vddgfx/ {print $2 " mV"}' || echo "N/A"
'';
home.file.".config/eww/scripts/sys/sys_workspace.sh".text = ''
#!/usr/bin/env bash
# ─────────────────────────────────────────────────────────────────────────────
# Prints the status of workspaces 14 in Hyprland, marking the active one.
# Output format: "wsN= [ ACTIVE ]" or "wsN= [INACTIVE]"
# ─────────────────────────────────────────────────────────────────────────────
# Get active workspace ID (requires jq + hyprctl)
CURRENT=$(hyprctl activeworkspace -j 2>/dev/null | jq -r '.id')
# Fallback if query fails
if [[ -z "$CURRENT" || "$CURRENT" == "null" ]]; then
echo "[!] Could not determine active workspace."
exit 1
fi
for i in {1..4}; do
if [[ "$i" -eq "$CURRENT" ]]; then
echo "ws${i}= [ ACTIVE ]"
else
echo "ws${i}= [INACTIVE]"
fi
done
'';
}

View File

@@ -0,0 +1,546 @@
{ config, pkgs, ... }:
{
imports = [
./01_windows.nix
./02_scripts.nix
];
home.file.".config/eww/eww.yuck".text = ''
;;
;; °˖* ( )🍸 pewdiepie/archdaemon/dionysh
;; shhheersh
;; EWW HUD config, some stuff duct taped, some stuff glued
;; vers. 1.0-nix
;;
;; === Windows
(include "./windows/ascii/visualizer_window.yuck")
(include "windows/ascii/audio_status.yuck")
(include "windows/sys/four_boxes.yuck")
(include "windows/sys/workspace_window_text.yuck")
(include "windows/bar/cpu_ram_storage_bars.yuck")
(include "windows/sys/active_workspace.yuck")
(include "windows/sys/orange_workspace.yuck")
(include "windows/sys/power_cooling_header_text.yuck")
(include "windows/sys/power_mode_text.yuck")
(include "windows/sys/right_fan_data.yuck")
(include "windows/net/ascii_decor_frame.yuck")
(include "windows/net/net_bars.yuck")
(include "windows/net/right_internet_text.yuck")
(include "windows/misc/welcome_text.yuck")
;; === Variables
(defvar max_fan_rpm "5000")
(defvar ascii_decor1 "
- -
-- --
- -
-- --
- -
-- --
- -
-- --
- -
-- --
- -
")
;; === Workspace Status
(defpoll ws1 :interval "1s" "bash ~/.config/eww/scripts/sys/sys_workspace.sh | grep ws1= | cut -d= -f2 || echo 'null'")
(defpoll ws2 :interval "1s" "bash ~/.config/eww/scripts/sys/sys_workspace.sh | grep ws2= | cut -d= -f2 || echo 'null'")
(defpoll ws3 :interval "1s" "bash ~/.config/eww/scripts/sys/sys_workspace.sh | grep ws3= | cut -d= -f2 || echo 'null'")
(defpoll ws4 :interval "1s" "bash ~/.config/eww/scripts/sys/sys_workspace.sh | grep ws4= | cut -d= -f2 || echo 'null'")
(defpoll current_workspace :interval "0.5s" "hyprctl activeworkspace -j | jq -r '.id' || echo 'null'")
;; === Power & Voltage
(defpoll gpu_voltage :interval "5s" "bash ~/.config/eww/scripts/sys/sys_gpu_voltage.sh || echo 'null'")
(defpoll cpu_voltage :interval "5s" "bash ~/.config/eww/scripts/sys/sys_cpu_voltage.sh || echo 'null'")
(defpoll dc_voltage :interval "10s" "bash ~/.config/eww/scripts/sys/sys_dc_voltage.sh || echo 'null'")
(defpoll power_mode :interval "10s" "bash ~/.config/eww/scripts/sys/sys_power_mode.sh || echo 'null'")
(defpoll power_draw :interval "5s" "sensors | grep -m 1 'power1:' | awk '{print $2 \" \"$3}' || echo 'N/A'")
;; === CPU & GPU Stats
(defpoll cpu :interval "10m" "lscpu | grep 'Model name' | cut -d ':' -f2 | xargs || echo 'null'")
(defpoll gpu :interval "10m" "lspci | grep -i vga | cut -d ':' -f3 || echo 'null'")
(defpoll cpu_usage :interval "2s" "top -bn1 | grep 'Cpu(s)' | awk '{print int($2 + $4)}' || echo 'null'")
(defpoll cpu_bar :interval "2s" "bash ~/.config/eww/scripts/bar/bar_render.sh $(top -bn1 | grep 'Cpu(s)' | awk '{print int($2 + $4)}') || echo 'null'")
(defpoll gpu_usage :interval "2s" "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits || echo 'N/A'")
(defpoll cpu_temp :interval "5s" "sensors | grep 'Tctl' | awk '{print $2}' || echo 'N/A'")
(defpoll gpu_temp :interval "5s" "nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits || echo 'N/A'")
;; Fan RPM values
(defpoll cpu_fan_rpm :interval "5s" "sensors | grep -i 'cpu_fan' | awk '{print $2 \" RPM\"}' || echo 'null'")
(defpoll gpu_fan_rpm :interval "5s" "sensors | grep -i 'gpu_fan' | awk '{print $2 \" RPM\"}' || echo 'null'")
;; Fan ASCII spinners
(defpoll cpu_fan_ascii :interval "0.2s" "bash ~/.config/eww/scripts/sys/sys_fan_spin.sh cpu || echo 'null'")
(defpoll gpu_fan_ascii :interval "0.2s" "bash ~/.config/eww/scripts/sys/sys_fan_spin.sh gpu || echo 'null'")
;; === Memory & Storage
(defpoll ram_info :interval "5s" "free -h | awk '/Mem:/ {print $3\" / \"$2}' || echo 'null'")
(defpoll ram_percent :interval "5s" "free | awk '/Mem:/ {printf \"%d\", $3/$2 * 100}' || echo 'null'")
(defpoll ram_bar :interval "5s" "bash ~/.config/eww/scripts/bar/bar_render.sh $(free | awk '/Mem:/ {printf(\"%.0f\", $3/$2 * 100)}') || echo 'null'")
(defpoll ram :interval "5s" "free -h | awk '/Mem:/ {print $3 \"/\" $2}' || echo 'null'")
(defpoll disk :interval "10s" "df -h / | awk 'NR==2 {print $3 \"/\" $2}' || echo 'null'")
(defpoll storage_percent :interval "5s" "df / | awk 'NR==2 {print int($3*100/$2)}' || echo 'null'")
(defpoll storage_bar :interval "5s" "bash ~/.config/eww/scripts/bar/bar_render.sh $(df / | awk 'NR==2 {print int($3*100/$2)}') || echo 'null'")
;; === Networking
(defpoll upload_speed :interval "3s" "bash ~/.config/eww/scripts/net/net_upload.sh || echo 'null'")
(defpoll upload_bar :interval "3s" "bash ~/.config/eww/scripts/net/net_upload.sh | xargs bash ~/.config/eww/scripts/net/net_upload_bar.sh || echo 'null'")
(defpoll download_speed :interval "3s" "bash ~/.config/eww/scripts/net/net_download.sh || echo 'null'")
(defpoll download_bar :interval "3s" "bash ~/.config/eww/scripts/net/net_download.sh | xargs bash ~/.config/eww/scripts/net/net_download_bar.sh || echo 'null'")
(defpoll ping_ms :interval "5s" "bash ~/.config/eww/scripts/net/net_ping.sh || echo 'null'")
(defpoll ping_bar :interval "5s" "bash ~/.config/eww/scripts/net/net_ping.sh | xargs bash ~/.config/eww/scripts/net/net_ping_latency.sh || echo 'null'")
(defpoll vpn_status_text :interval "5s" "bash ~/.config/eww/scripts/net/net_vpn_status.sh || echo 'null'")
(defpoll vpn_bar :interval "5s" "bash ~/.config/eww/scripts/net/net_vpn.sh | xargs bash ~/.config/eww/scripts/net/net_vpn_bar.sh || echo 'null'")
;; === Time & Date
(defpoll welcome_date :interval "30s" "date '+%A, %d %B %Y' || echo 'null'")
(defpoll weekday_str :interval "10s" "date +%A || echo 'null'")
(defpoll datetime_str :interval "10s" "date '+%H:%M %d %B %Y' || echo 'null'")
(defpoll weather_forecast :interval "30m" "curl -s 'wttr.in?format=%C+%t' || echo 'N/A'")
;; === System Info
(defpoll os :interval "10m" "uname -o || echo 'null'")
(defpoll desktop :interval "10m" "echo $XDG_CURRENT_DESKTOP || echo 'null'")
(defpoll wm :interval "10m" "echo $XDG_SESSION_TYPE || echo 'null'")
(defpoll shell :interval "10m" "basename $SHELL || echo 'null'")
(defpoll USER :interval "10m" "whoami || echo 'null'")
(defpoll install-age :interval "1h" "uptime -s | xargs -I{} date -d {} +%s | xargs -I{} echo $(( ($(date +%s) - {}) / 86400 ))' days' || echo 'null'")
(defpoll since-boot :interval "5s" "uptime -s || echo 'null'")
(defpoll uptime_full :interval "0.5s" "awk '{sec=int($1); ms=substr(sprintf(\"%.3f\", $1 - sec), 3); printf \"%02d:%02d:%02d.%s\\n\", sec/3600, (sec%3600)/60, sec%60, ms}' /proc/uptime || echo 'null'")
(defpoll centered-name :interval "10m" "echo $USER@$(hostname) || echo 'null'")
(defpoll battery_time :interval "10s"
"upower -i $(upower -e | grep BAT) 2>/dev/null | awk '
/state:/ { state = $2 }
/time to empty/ { print $4 \" \"$5 }
/time to full/ { full = $4 \" \"$5 }
END {
if (state == \"discharging\") exit 0;
else if (state == \"charging\") print \"Re-establishing\";
else print \"N/A\"
}' || echo 'null'")
;; === ASCII Widgets & Feeds ===
(defpoll visualizer_gen :interval "0.2s" "cat /tmp/visualizer.txt || echo 'null'")
(defpoll visualizer_content :interval "0.2s" "cat /tmp/visualizer.txt || echo '----------------------------standby--------------------------'")
(defpoll reactor_gen :interval "0.5s" "cat /tmp/reactor_frame.txt || echo 'null'")
(defpoll reactor_ascii :interval "0.5s" "cat /tmp/reactor_frame.txt || echo 'standby'")
(defpoll reactor_core_layout :interval "1s" "bash ~/.config/eww/scripts/ascii/ascii_core_layout.sh && cat /tmp/core_layout.txt || echo 'standby'")
(defpoll live_log_gen :interval "5s" "bash ~/.config/eww/scripts/ascii/ascii_live_log.sh || echo 'null'")
(defpoll live_text :interval "5s" "cat /tmp/live_text.txt || echo '--------------'")
(defpoll ascii_audio_status :interval "2s" "bash ~/.config/eww/scripts/audio/audio_cava_status.sh || echo 'null'")
;; === Widgets
(defwidget audio-visualizer []
(box :class "outer-frame"
(box :class "inner-frame"
(box :class "visualizer-container"
(label
:text visualizer_content
:markup true
:class "visualizer-text")))))
'';
home.file.".config/eww/eww.scss".text = ''
//
// °˖* ( )🍸 pewdiepie/archdaemon/dionysh
// shhheersh
// EWW HUD style
// vers. 1.0-nix
//
// Visualizer
.visualizer-container {
background-color: transparent;
}
.visualizer {
color: #08c0d0; // Nord Cyan
font-family: monospace;
background-color: transparent;
font-size: 9px;
}
.visualizer-container {
border-radius: 2px;
background: linear-gradient(to top, rgba(25,25,25,0.5), rgba(25,25,25,0));
padding: 4px;
}
.visualizer-text {
font-family: monospace;
font-size: 8px;
color: #56b6c2;
}
// Windows
window {
background-color: transparent;
box-shadow: none;
border: none;
}
.window {
background-color: transparent;
}
// Pixel ASCII
.pixel-container {
background-color: transparent;
padding: 2px;
}
.pixel-ascii {
font-family: monospace;
font-size: 6px;
color: #e5c07b;
background-color: transparent;
}
// Color Classes
.red_1 { color: #ff6c6b; }
.green_1 { color: #9cdef2; }
.blue_1 { color: #61afef; }
.yellow_1 { color: #9cdef2; }
.red_2 { color: #ff6c6b; }
.green_2 { color: #98c379; }
.blue_2 { color: #61afef; }
.yellow_2 { color: #fab387; }
// Frames
.outer-frame {
border: 2px solid #61afef;
border-radius: 3px;
padding: 4px;
background-color: transparent;
min-width: 350px;
}
.inner-frame {
border: 2px solid #56b6c2;
border-radius: 1px;
padding: 6px;
//background-color: rgba(25, 25, 25, 0.4);
}
.module-frame {
border: 2px solid #61afef;
border-radius: 2px;
margin-bottom: 5px;
margin-left: 5px;
margin-right: 5px;
margin-top: 5px;
min-height: 10px;
min-width: 140px;
}
.module-frame {
border: 2px solid #61afef;
border-radius: 2px;
margin: 5px;
padding: 1px;
min-height: 10px;
min-width: 140px;
background-image: linear-gradient(to left, rgba(0,0,0,0.4), rgba(0,0,0,0));
transition: all 0.2s ease-in-out;
}
.module-frame2 {
border: 2px solid #61afef;
border-radius: 2px;
margin: 5px;
padding: 1px;
min-height: 10px;
min-width: 10px;
background-image: linear-gradient(to left, rgba(0,0,0,0.4), rgba(0,0,0,0));
transition: all 0.2s ease-in-out;
}
.module-frame:hover {
border-color: #88c0d0;
background-image: linear-gradient(to left, rgba(136, 192, 208, 0.1), rgba(0, 0, 0, 0));
box-shadow: 0 0 8px rgba(136, 192, 208, 0.4);
}
// Labels & Stats
.label-primary {
font-size: 14px;
font-weight: bold;
color: #9cdef2;
}
.label-primary2 {
font-size: 9px;
font-weight: bold;
color: #9cdef2;
border: 2px solid #61afef;
border-radius: 2px;
margin-bottom: 50px;
margin-left: 27px;
margin-right: 4px;
margin-top: 5px;
padding: 1px;
min-height: 10px;
min-width: 50px;
border: none;
}
.label-secondary {
font-size: 8px;
color: #888;
}
.internet-clean-box {
background: transparent;
border: none;
box-shadow: none;
padding: 0;
}
.stats-label {
font-size: 10px;
font-weight: bold;
color: #56b6c2;
letter-spacing: 1px;
}
.stats-label2 {
font-size: 10px;
font-weight: bold;
color: #56b6c2;
letter-spacing: 1px;
}
.stats-label3 {
font-size: 10px;
margin-left: 87px;
font-weight: bold;
color: #56b6c2;
letter-spacing: 1px;
}
.stats-box {
border-radius: 12px;
min-height: 10px;
min-width: 100px;
}
// RAM & Bars
.ascii-bar-frame {
border: 1px solid #61afef;
border-radius: 4px;
margin: 4px;
padding: 4px;
min-width: 220px;
font-size: 10px;
}
.ram-bar {
font-size: 20px;
font-family: monospace;
color: #9cdef2;
letter-spacing: 4px;
padding: 2px 2px;
}
.ram-bar2 {
color: #9cdef2;
letter-spacing: 1.5px;
padding: 1px 1px;
font-size: 10px;
}
.ram-bar4 {
color: #9cdef2;
letter-spacing: 1.5px;
padding: 1px 1px;
font-size: 10px;
}
// Date & Time
.day-time-container {
padding: 1em;
border-radius: 12px;
border: 2px solid #88c0d0;
}
.weekday-container {
border: 2px solid #3b4252;
border-radius: 12px;
padding: 16px;
min-width: 200px;
}
.weekday-text {
font-size: 34px;
font-weight: bold;
color: #fab387;
}
.time-text {
font-size: 18px;
color: #a3be8c;
margin-top: 6px;
}
// Welcome
.welcome-box {
background-color: rgba(25,25,25,0.6);
border: 2px solid #88c0d0;
border-radius: 8px;
padding: 12px 20px;
margin-top: 10px;
}
.welcome-text { font-size: 18px; font-weight: bold; color: #9cdef2; }
.welcome-sub { font-size: 12px; color: #eceff4; margin-top: 4px; }
.welcome-label { color: #56b6c2; font-size: 12px; font-weight: bold; }
.welcome-value { color: #9cdef2; font-size: 12px; font-weight: bold; letter-spacing: 1px; }
// Shades & Animations
.shade2 { background: linear-gradient(to right, black 3px, rgba(19,19,19,0) 15%); }
.shade { background-color: #9cdef2; }
$window_visible: true;
.animated {
transition: opacity 0.4s ease, transform 0.4s ease;
opacity: 1;
}
@if not $window_visible {
.animated {
opacity: 0;
pointer-events: none;
}
}
// Fans
.fan-ascii {
font-family: "JetBrainsMono Nerd Font", monospace;
font-size: 15px;
color: #88c0d0;
letter-spacing: 3px;
transition: color 0.3s ease, transform 0.3s ease;
}
.fan-frame, .fan-frame2 {
padding: 0;
margin: 2px;
font-size: 10px;
min-height: 31.2px;
margin-bottom: 15px;
margin-top: 15px;
margin-left: 5px;
}
.fan-rpm { font-size: 10px; color: #9cdef2; }
.fan-rpm2 { font-size: 11px; min-width: 30px; color: #9cdef2; padding: 0; }
// Workspaces
.workspace-ascii {
font-family: monospace;
font-size: 14px;
color: #61afef;
}
.workspace-ascii-highlight {
font-family: monospace;
font-size: 20px;
font-weight: bold;
color: #9cdef2;
}
// Terminal & Reactor
.terminal-feed {
font-family: monospace;
font-size: 12px;
color: #08c0d0;
padding-left: 8px;
}
.reactor-ascii {
font-family: monospace;
font-size: 4px;
color: #9cdef2;
font-weight: bold;
min-height: 140px;
min-width: 280px;
}
.ascii-core-status {
font-family: monospace;
font-size: 10px;
border-radius: 0px;
color: #9cdef2;
}
.ascii-core-status2 {
font-family: monospace;
font-size: 14px;
padding: 4px;
border-radius: 0px;
color: #9cdef2;
}
.log-line {
font-family: monospace;
font-size: 10px;
color: #9cdef2;
padding: 4px;
}
.ascii-decor1 {
font-family: monospace;
font-size: 12px;
color: #9cdef2;
letter-spacing: 1px;
padding: 6px;
margin: 4px;
font-size: 10px;
}
// Info Panels
.data-row {
background-color: transparent;
padding: 2px;
}
.info-left {
background-color: #1e1e1e;
min-width: 1px;
border: 2px solid #61afef;
border-radius: 1px;
}
.info-left2 { min-height: 1px; }
.info-right-box {
background-color:#fab387;
min-height: 31.2px;
margin-bottom: 15px;
min-width: 26px;
}
.info-right-text {
font-size: 13px;
font-weight: bold;
color: #1e1e1e;
}
// Power
.power-label { font-size: 12px; color: #fab387; font-family: monospace; }
.power-label2 { font-size: 12px; color: #c4ecf0; font-family: monospace; }
.power-label3 { font-size: 12px; color: #61afef; font-family: monospace; }
.power-value { font-size: 10px; color: #9cdef2; font-family: monospace; margin: 5px; }
.power-header {
font-size: 10px;
font-weight: bold;
color:#56b6c2;
padding: 4px 8px;
min-width: 150px;
}
.power-header-alt {
font-size: 6px;
font-weight: bold;
color: #61afef;
padding: 4px 8px;
letter-spacing: 1px;
min-width: 15px;
}
'';
home.file.".config/eww/eww-state.yml".text = ''
window_visible: true
'';
}