diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf
new file mode 100644
index 0000000..7ed31f1
--- /dev/null
+++ b/hypr/hypridle.conf
@@ -0,0 +1,40 @@
+general {
+ lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
+ before_sleep_cmd = loginctl lock-session # lock before suspend.
+ after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
+}
+
+#listener {
+# timeout = 15 # 2.5min.
+# on-timeout = notify-send "Your are about to go idle"
+# on-resume = "notify-send "Resumed"
+#}
+
+listener {
+ timeout = 150 # 2.5min.
+ on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
+ on-resume = brightnessctl -r # monitor backlight restore.
+}
+
+# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
+listener {
+ timeout = 150 # 2.5min.
+ on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight.
+ on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight.
+}
+
+listener {
+ timeout = 300 # 5min
+ on-timeout = loginctl lock-session # lock screen when timeout has passed
+}
+
+listener {
+ timeout = 330 # 5.5min
+ on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
+ on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired.
+}
+
+listener {
+ timeout = 1800 # 30min
+ on-timeout = systemctl suspend # suspend pc
+}
diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf
new file mode 100644
index 0000000..2395a0b
--- /dev/null
+++ b/hypr/hyprland.conf
@@ -0,0 +1,315 @@
+
+# #######################################################################################
+# AUTOGENERATED HYPRLAND CONFIG.
+# PLEASE USE THE CONFIG PROVIDED IN THE GIT REPO /examples/hyprland.conf AND EDIT IT,
+# OR EDIT THIS ONE ACCORDING TO THE WIKI INSTRUCTIONS.
+# #######################################################################################
+
+# This is an example Hyprland config file.
+# Refer to the wiki for more information.
+# https://wiki.hyprland.org/Configuring/
+
+# Please note not all available settings / options are set here.
+# For a full list, see the wiki
+
+# You can split this configuration into multiple files
+# Create your files separately and then link them to this file like this:
+# source = ~/.config/hypr/myColors.conf
+
+################
+### MONITORS ###
+################
+
+# See https://wiki.hyprland.org/Configuring/Monitors/
+#monitor = , preferred, auto, 1
+
+
+###################
+### MY PROGRAMS ###
+###################
+
+# See https://wiki.hyprland.org/Configuring/Keywords/
+
+# Set programs that you use
+$terminal = kitty
+$fileManager = thunar
+$menu = wofi --show drun
+
+
+#################
+### AUTOSTART ###
+#################
+
+# Autostart necessary processes (like notifications daemons, status bars, etc.)
+# Or execute your favorite apps at launch like this:
+# exec-once = $terminal
+# exec-once = nm-applet &
+exec-once = wl-paste --type text --watch cliphist store
+exec-once = wl-paste --type image --watch cliphist store
+exec-once = waybar & disown
+exec-once = librewolf & disown
+exec-once = swaync & disown
+exec-once = hypridle & disown
+exec-once = ~/.config/hypr/scripts/monitor_setup.sh
+exec-once = hyprctl dispatch exec "[workspace 3 silent] signal-desktop"
+exec-once = hyprctl dispatch exec "[workspace 3 silent] discord"
+exec-once = hyprctl dispatch exec "[workspace 3 silent] thunderbird"
+#exec-once = hyprctl dispatch exec "[workspace 5 silent] steam"
+
+#############################
+### ENVIRONMENT VARIABLES ###
+#############################
+
+# See https://wiki.hyprland.org/Configuring/Environment-variables/
+
+env = XCURSOR_SIZE,20
+env = HYPRCURSOR_SIZE,20
+
+#####################
+### LOOK AND FEEL ###
+#####################
+
+# Refer to https://wiki.hyprland.org/Configuring/Variables/
+
+# https://wiki.hyprland.org/Configuring/Variables/#general
+general {
+ gaps_in = 0
+ gaps_out = 0
+
+ border_size = 1
+
+ # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
+ col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
+ col.inactive_border = rgba(595959aa)
+
+ # Set to true enable resizing windows by clicking and dragging on borders and gaps
+ resize_on_border = false
+
+ # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
+ allow_tearing = false
+
+ layout = dwindle
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#decoration
+decoration {
+ rounding = 10
+ rounding_power = 2
+
+ # Change transparency of focused and unfocused windows
+ active_opacity = 1.0
+ inactive_opacity = 0.9
+
+ shadow {
+ enabled = false
+ range = 4
+ render_power = 3
+ color = rgba(1a1a1aee)
+ }
+
+ # https://wiki.hyprland.org/Configuring/Variables/#blur
+ blur {
+ enabled = true
+ size = 3
+ passes = 1
+
+ vibrancy = 0.1696
+ }
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#animations
+animations {
+ enabled = no
+
+ # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+
+ bezier = easeOutQuint,0.23,1,0.32,1
+ bezier = easeInOutCubic,0.65,0.05,0.36,1
+ bezier = linear,0,0,1,1
+ bezier = almostLinear,0.5,0.5,0.75,1.0
+ bezier = quick,0.15,0,0.1,1
+
+ animation = global, 1, 10, default
+ animation = border, 1, 5.39, easeOutQuint
+ animation = windows, 1, 4.79, easeOutQuint
+ animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
+ animation = windowsOut, 1, 1.49, linear, popin 87%
+ animation = fadeIn, 1, 1.73, almostLinear
+ animation = fadeOut, 1, 1.46, almostLinear
+ animation = fade, 1, 3.03, quick
+ animation = layers, 1, 3.81, easeOutQuint
+ animation = layersIn, 1, 4, easeOutQuint, fade
+ animation = layersOut, 1, 1.5, linear, fade
+ animation = fadeLayersIn, 1, 1.79, almostLinear
+ animation = fadeLayersOut, 1, 1.39, almostLinear
+ animation = workspaces, 1, 1.94, almostLinear, fade
+ animation = workspacesIn, 1, 1.21, almostLinear, fade
+ animation = workspacesOut, 1, 1.94, almostLinear, fade
+}
+
+# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/
+# "Smart gaps" / "No gaps when only"
+# uncomment all if you wish to use that.
+# workspace = w[tv1], gapsout:0, gapsin:0
+# workspace = f[1], gapsout:0, gapsin:0
+# windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
+# windowrule = rounding 0, floating:0, onworkspace:w[tv1]
+# windowrule = bordersize 0, floating:0, onworkspace:f[1]
+# windowrule = rounding 0, floating:0, onworkspace:f[1]
+
+# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
+dwindle {
+ pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = true # You probably want this
+}
+
+# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
+master {
+ new_status = master
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#misc
+misc {
+ force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers
+ disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
+}
+
+
+#############
+### INPUT ###
+#############
+
+# https://wiki.hyprland.org/Configuring/Variables/#input
+input {
+ kb_layout = us
+ kb_variant =
+ kb_model =
+ kb_options =
+ kb_rules =
+
+ follow_mouse = 1
+
+ sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
+
+ touchpad {
+ natural_scroll = false
+ }
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#gestures
+gestures {
+ workspace_swipe = false
+}
+
+# Example per-device config
+# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
+device {
+ name = epic-mouse-v1
+ sensitivity = -0.5
+}
+
+
+###################
+### KEYBINDINGS ###
+###################
+
+# See https://wiki.hyprland.org/Configuring/Keywords/
+$mainMod = SUPER # Sets "Windows" key as main modifier
+
+# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
+bind = $mainMod, return, exec, $terminal
+bind = $mainMod, C, killactive,
+bind = $mainMod, M, exit,
+bind = $mainMod, E, exec, $fileManager
+bind = $mainMod, F, togglefloating,
+bind = $mainMod, space, exec, $menu
+bind = $mainMod, P, pseudo, # dwindle
+bind = $mainMod, J, togglesplit, # dwindle
+bind = $mainMod SHIFT, S, exec, hyprshot -m region --clipboard-only,
+bind = $mainMod, L, exec, hyprlock
+bind = $mainMod, backslash, exec, ~/.config/hypr/scripts/monitor_setup.sh
+bind = SUPER, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy
+
+# Move focus with mainMod + arrow keys
+bind = $mainMod, left, movefocus, l
+bind = $mainMod, right, movefocus, r
+bind = $mainMod, up, movefocus, u
+bind = $mainMod, down, movefocus, d
+
+# Switch workspaces with mainMod + [0-9]
+bind = $mainMod, 1, workspace, 1
+bind = $mainMod, 2, workspace, 2
+bind = $mainMod, 3, workspace, 3
+bind = $mainMod, 4, workspace, 4
+bind = $mainMod, 5, workspace, 5
+bind = $mainMod, 6, workspace, 6
+bind = $mainMod, 7, workspace, 7
+bind = $mainMod, 8, workspace, 8
+bind = $mainMod, 9, workspace, 9
+bind = $mainMod, 0, workspace, 10
+
+# Move active window to a workspace with mainMod + SHIFT + [0-9]
+bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1
+bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2
+bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3
+bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4
+bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5
+bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6
+bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7
+bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8
+bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9
+bind = $mainMod SHIFT, 0, movetoworkspacesilent, 10
+
+# Example special workspace (scratchpad)
+#bind = $mainMod, S, togglespecialworkspace, magic
+#bind = $mainMod SHIFT, S, movetoworkspace, special:magic
+
+bind = SUPER_ALT_CTRL, L, exec, hyprctl keyword monitor "eDP-1,preferred,auto,1"
+
+#Mouse Key Assignements
+#bind = , code:191, exec, $terminal
+#bind = , code:198, exec, $terminal
+
+
+# Lid Open & Closed
+bindl = , switch:off:Lid Switch, exec, ~/.config/hypr/scripts/monitor_setup.sh
+# trigger when the switch is turning on
+bindl = , switch:on:Lid Switch, exec, ~/.config/hypr/scripts/monitor_setup.sh
+
+# Scroll through existing workspaces with mainMod + scroll
+bind = $mainMod, mouse_down, workspace, e+1
+bind = $mainMod, mouse_up, workspace, e-1
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+# Laptop multimedia keys for volume and LCD brightness
+bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
+bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
+bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
+bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
+bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+
+bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%-
+
+# Requires playerctl
+bindl = , XF86AudioNext, exec, playerctl next
+bindl = , XF86AudioPause, exec, playerctl play-pause
+bindl = , XF86AudioPlay, exec, playerctl play-pause
+bindl = , XF86AudioPrev, exec, playerctl previous
+
+##############################
+### WINDOWS AND WORKSPACES ###
+##############################
+
+# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
+# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
+
+# Example windowrule
+# windowrule = float,class:^(kitty)$,title:^(kitty)$
+
+# Ignore maximize requests from apps. You'll probably like this.
+windowrule = suppressevent maximize, class:.*
+
+# Fix some dragging issues with XWayland
+windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
diff --git a/hypr/hyprland.conf.save b/hypr/hyprland.conf.save
new file mode 100644
index 0000000..b47e1fe
--- /dev/null
+++ b/hypr/hyprland.conf.save
@@ -0,0 +1,297 @@
+
+# #######################################################################################
+# AUTOGENERATED HYPRLAND CONFIG.
+# PLEASE USE THE CONFIG PROVIDED IN THE GIT REPO /examples/hyprland.conf AND EDIT IT,
+# OR EDIT THIS ONE ACCORDING TO THE WIKI INSTRUCTIONS.
+# #######################################################################################
+
+# This is an example Hyprland config file.
+# Refer to the wiki for more information.
+# https://wiki.hyprland.org/Configuring/
+
+# Please note not all available settings / options are set here.
+# For a full list, see the wiki
+
+# You can split this configuration into multiple files
+# Create your files separately and then link them to this file like this:
+# source = ~/.config/hypr/myColors.conf
+
+
+################
+### MONITORS ###
+################
+
+# See https://wiki.hyprland.org/Configuring/Monitors/
+#monitor=eDP-1,disable
+monitor=DP-3,5120x1440@120,0x1440,0.833333
+monitor=DP-4,3440x1440@60,840x0,0.833333
+monitor = , preferred, auto, 0.83
+
+
+###################
+### MY PROGRAMS ###
+###################
+
+# See https://wiki.hyprland.org/Configuring/Keywords/
+
+# Set programs that you use
+$terminal = kitty
+$fileManager = dolphin
+$menu = wofi --show drun
+
+
+#################
+### AUTOSTART ###
+#################
+
+# Autostart necessary processes (like notifications daemons, status bars, etc.)
+# Or execute your favorite apps at launch like this:
+# exec-once = $terminal
+# exec-once = nm-applet &
+exec-once = waybar & librewolf & swaync & hypridle
+
+
+#############################
+### ENVIRONMENT VARIABLES ###
+#############################
+
+# See https://wiki.hyprland.org/Configuring/Environment-variables/
+
+env = XCURSOR_SIZE,24
+env = HYPRCURSOR_SIZE,24
+
+
+#####################
+### LOOK AND FEEL ###
+#####################
+
+# Refer to https://wiki.hyprland.org/Configuring/Variables/
+
+# https://wiki.hyprland.org/Configuring/Variables/#general
+general {
+ gaps_in = 0
+ gaps_out = 0
+
+ border_size = 1
+
+ # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
+ col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
+ col.inactive_border = rgba(595959aa)
+
+ # Set to true enable resizing windows by clicking and dragging on borders and gaps
+ resize_on_border = false
+
+ # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
+ allow_tearing = false
+
+ layout = dwindle
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#decoration
+decoration {
+ rounding = 10
+ rounding_power = 2
+
+ # Change transparency of focused and unfocused windows
+ active_opacity = 1.0
+ inactive_opacity = 1.0
+
+ shadow {
+ enabled = true
+ range = 4
+ render_power = 3
+ color = rgba(1a1a1aee)
+ }
+
+ # https://wiki.hyprland.org/Configuring/Variables/#blur
+ blur {
+ enabled = true
+ size = 3
+ passes = 1
+
+ vibrancy = 0.1696
+ }
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#animations
+animations {
+ enabled = yes, please :)
+
+ # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+
+ bezier = easeOutQuint,0.23,1,0.32,1
+ bezier = easeInOutCubic,0.65,0.05,0.36,1
+ bezier = linear,0,0,1,1
+ bezier = almostLinear,0.5,0.5,0.75,1.0
+ bezier = quick,0.15,0,0.1,1
+
+ animation = global, 1, 10, default
+ animation = border, 1, 5.39, easeOutQuint
+ animation = windows, 1, 4.79, easeOutQuint
+ animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
+ animation = windowsOut, 1, 1.49, linear, popin 87%
+ animation = fadeIn, 1, 1.73, almostLinear
+ animation = fadeOut, 1, 1.46, almostLinear
+ animation = fade, 1, 3.03, quick
+ animation = layers, 1, 3.81, easeOutQuint
+ animation = layersIn, 1, 4, easeOutQuint, fade
+ animation = layersOut, 1, 1.5, linear, fade
+ animation = fadeLayersIn, 1, 1.79, almostLinear
+ animation = fadeLayersOut, 1, 1.39, almostLinear
+ animation = workspaces, 1, 1.94, almostLinear, fade
+ animation = workspacesIn, 1, 1.21, almostLinear, fade
+ animation = workspacesOut, 1, 1.94, almostLinear, fade
+}
+
+# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/
+# "Smart gaps" / "No gaps when only"
+# uncomment all if you wish to use that.
+# workspace = w[tv1], gapsout:0, gapsin:0
+# workspace = f[1], gapsout:0, gapsin:0
+# windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
+# windowrule = rounding 0, floating:0, onworkspace:w[tv1]
+# windowrule = bordersize 0, floating:0, onworkspace:f[1]
+# windowrule = rounding 0, floating:0, onworkspace:f[1]
+
+# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
+dwindle {
+ pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = true # You probably want this
+}
+
+# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
+master {
+ new_status = master
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#misc
+misc {
+ force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
+ disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
+}
+
+
+#############
+### INPUT ###
+#############
+
+# https://wiki.hyprland.org/Configuring/Variables/#input
+input {
+ kb_layout = us
+ kb_variant =
+ kb_model =
+ kb_options =
+ kb_rules =
+
+ follow_mouse = 1
+
+ sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
+
+ touchpad {
+ natural_scroll = false
+ }
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#gestures
+gestures {
+ workspace_swipe = false
+}
+
+# Example per-device config
+# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
+device {
+ name = epic-mouse-v1
+ sensitivity = -0.5
+}
+
+
+###################
+### KEYBINDINGS ###
+###################
+
+# See https://wiki.hyprland.org/Configuring/Keywords/
+$mainMod = SUPER # Sets "Windows" key as main modifier
+
+# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
+bind = $mainMod, return, exec, $terminal
+bind = $mainMod, C, killactive,
+bind = $mainMod, M, exit,
+bind = $mainMod, E, exec, $fileManager
+bind = $mainMod, V, togglefloating,
+bind = $mainMod, space, exec, $menu
+bind = $mainMod, P, pseudo, # dwindle
+bind = $mainMod, J, togglesplit, # dwindle
+bind = $mainMod, Q, exec, hyprshot -m region --clipboard-only,
+bind = $mainMod, L, exec, hyprlock
+
+# Move focus with mainMod + arrow keys
+bind = $mainMod, left, movefocus, l
+bind = $mainMod, right, movefocus, r
+bind = $mainMod, up, movefocus, u
+bind = $mainMod, down, movefocus, d
+
+# Switch workspaces with mainMod + [0-9]
+bind = $mainMod, 1, workspace, 1
+bind = $mainMod, 2, workspace, 2
+bind = $mainMod, 3, workspace, 3
+bind = $mainMod, 4, workspace, 4
+bind = $mainMod, 5, workspace, 5
+bind = $mainMod, 6, workspace, 6
+bind = $mainMod, 7, workspace, 7
+bind = $mainMod, 8, workspace, 8
+bind = $mainMod, 9, workspace, 9
+bind = $mainMod, 0, workspace, 10
+
+# Move active window to a workspace with mainMod + SHIFT + [0-9]
+bind = $mainMod SHIFT, 1, movetoworkspace, 1
+bind = $mainMod SHIFT, 2, movetoworkspace, 2
+bind = $mainMod SHIFT, 3, movetoworkspace, 3
+bind = $mainMod SHIFT, 4, movetoworkspace, 4
+bind = $mainMod SHIFT, 5, movetoworkspace, 5
+bind = $mainMod SHIFT, 6, movetoworkspace, 6
+bind = $mainMod SHIFT, 7, movetoworkspace, 7
+bind = $mainMod SHIFT, 8, movetoworkspace, 8
+bind = $mainMod SHIFT, 9, movetoworkspace, 9
+bind = $mainMod SHIFT, 0, movetoworkspace, 10
+
+# Example special workspace (scratchpad)
+bind = $mainMod, S, togglespecialworkspace, magic
+bind = $mainMod SHIFT, S, movetoworkspace, special:magic
+
+# Scroll through existing workspaces with mainMod + scroll
+bind = $mainMod, mouse_down, workspace, e+1
+bind = $mainMod, mouse_up, workspace, e-1
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+# Laptop multimedia keys for volume and LCD brightness
+bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
+bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
+bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
+bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
+bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+
+bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%-
+
+# Requires playerctl
+bindl = , XF86AudioNext, exec, playerctl next
+bindl = , XF86AudioPause, exec, playerctl play-pause
+bindl = , XF86AudioPlay, exec, playerctl play-pause
+bindl = , XF86AudioPrev, exec, playerctl previous
+
+##############################
+### WINDOWS AND WORKSPACES ###
+##############################
+
+# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
+# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
+
+# Example windowrule
+# windowrule = float,class:^(kitty)$,title:^(kitty)$
+
+# Ignore maximize requests from apps. You'll probably like this.
+windowrule = suppressevent maximize, class:.*
+
+# Fix some dragging issues with XWayland
+windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf
new file mode 100644
index 0000000..83f59d5
--- /dev/null
+++ b/hypr/hyprlock.conf
@@ -0,0 +1,35 @@
+background {
+ monitor =
+ color = rgba(0, 0, 0, 1.0)
+
+}
+input-field {
+ monitor =
+ size = 200, 50
+ outline_thickness = 3
+ dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8
+ dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0
+ dots_center = false
+ dots_rounding = -1 # -1 default circle, -2 follow input-field rounding
+ outer_color = rgb(151515)
+ inner_color = rgb(200, 200, 200)
+ font_color = rgb(10, 10, 10)
+ fade_on_empty = true
+ fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered.
+ placeholder_text = Input Password... # Text rendered in the input box when it's empty.
+ hide_input = false
+ rounding = -1 # -1 means complete rounding (circle/oval)
+ check_color = rgb(204, 136, 34)
+ fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color
+ fail_text = $FAIL ($ATTEMPTS) # can be set to empty
+ fail_transition = 300 # transition time in ms between normal outer_color and fail_color
+ capslock_color = -1
+ numlock_color = -1
+ bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above)
+ invert_numlock = false # change color if numlock is off
+ swap_font_color = false # see below
+
+ position = 0, -20
+ halign = center
+ valign = center
+}
diff --git a/hypr/scripts/monitor_setup.sh b/hypr/scripts/monitor_setup.sh
new file mode 100755
index 0000000..4474d01
--- /dev/null
+++ b/hypr/scripts/monitor_setup.sh
@@ -0,0 +1,130 @@
+#!/bin/bash
+# ~/.config/hypr/scripts/monitor_setup.sh
+notify-send -t 3000 "Monitor Setup" "Detecting display configuration..."
+LAPTOP="eDP-1"
+LID_STATE=$(grep -q "open" /proc/acpi/button/lid/LID/state && echo "open" || echo "closed")
+MONITORS=$(hyprctl monitors -j)
+
+EXTERNAL=$(echo "$MONITORS" | jq -r '.[] | select(.name != "'$LAPTOP'") | .name' | head -1)
+
+# Improved function to get the maximum resolution with highest refresh rate
+get_max_res() {
+ local monitor=$1
+
+ # Get all available modes for the monitor
+ local modes=$(echo "$MONITORS" | jq -r ".[] | select(.name == \"$monitor\") | .availableModes[]")
+
+ if [[ -z "$modes" ]]; then
+ echo "preferred"
+ return
+ fi
+
+ # Find the mode with the highest resolution and refresh rate
+ local max_pixels=0
+ local max_refresh=0
+ local best_mode="preferred"
+
+ while IFS= read -r mode; do
+ # Extract width, height, and refresh rate
+ local width=$(echo "$mode" | awk -F'@' '{print $1}' | awk -F'x' '{print $1}')
+ local height=$(echo "$mode" | awk -F'@' '{print $1}' | awk -F'x' '{print $2}')
+ local refresh=$(echo "$mode" | awk -F'@' '{print $2}' | sed 's/Hz//')
+
+ # Calculate total pixels (width × height) for better comparison
+ local pixels=$((width * height))
+
+ # First prioritize by total pixel count (resolution), then by refresh rate
+ if [[ $pixels -gt $max_pixels || ($pixels -eq $max_pixels && $(echo "$refresh > $max_refresh" | bc -l) -eq 1) ]]; then
+ max_pixels=$pixels
+ max_refresh=$refresh
+ best_mode="${width}x${height}@${refresh}"
+ fi
+ done <<< "$modes"
+
+ echo "$best_mode"
+}
+
+# Alternative method to get max resolution using hyprctl
+get_max_res_alt() {
+ local monitor=$1
+ local modes=$(hyprctl monitors -j | jq -r ".[] | select(.name == \"$monitor\") | .availableModes[]")
+
+ if [[ -z "$modes" ]]; then
+ # Try querying wlr-randr directly as a fallback
+ if command -v wlr-randr &> /dev/null; then
+ modes=$(wlr-randr | grep -A 10 "$monitor" | grep -o '[0-9]\+x[0-9]\+@[0-9.]\+Hz')
+ fi
+ fi
+
+ if [[ -z "$modes" ]]; then
+ echo "preferred"
+ return
+ fi
+
+ # Find highest resolution with best refresh rate
+ local best_mode=$(echo "$modes" | sort -nr -k1 -t'x' -k2 -t'@' | head -1)
+ echo "$best_mode"
+}
+
+# Get resolution for monitors - try both methods
+EXT_RES=$(get_max_res "$EXTERNAL")
+if [[ "$EXT_RES" == "preferred" ]]; then
+ EXT_RES=$(get_max_res_alt "$EXTERNAL")
+fi
+
+LAPTOP_RES=$(get_max_res "$LAPTOP")
+if [[ "$LAPTOP_RES" == "preferred" ]]; then
+ LAPTOP_RES=$(get_max_res_alt "$LAPTOP")
+fi
+
+# Case 1: Only laptop
+if [ -z "$EXTERNAL" ]; then
+ notify-send -t 3000 "Monitor Setup" "Laptop-only mode\nUsing: $LAPTOP_RES"
+ hyprctl keyword monitor "$LAPTOP,$LAPTOP_RES,auto,1"
+
+ for ws in {1..5}; do
+ hyprctl keyword "workspace $ws,monitor:$LAPTOP" >/dev/null 2>&1
+ hyprctl dispatch workspace "$ws" >/dev/null 2>&1
+ hyprctl dispatch moveworkspacetomonitor "$ws $LAPTOP" 2>/dev/null
+ done
+ exit 0
+fi
+
+# Case 2: External + open lid
+if [ "$LID_STATE" = "open" ]; then
+ notify-send -t 3000 "Monitor Setup" "Dual monitor mode (Laptop + External)\nLaptop: $LAPTOP_RES\nExternal: $EXT_RES"
+ hyprctl keyword monitor "$LAPTOP,$LAPTOP_RES,auto,1"
+ hyprctl keyword monitor "$EXTERNAL,$EXT_RES,auto,1"
+
+ for ws in {1..3}; do
+ hyprctl keyword "workspace $ws,monitor:$LAPTOP" >/dev/null 2>&1
+ hyprctl dispatch workspace "$ws" >/dev/null 2>&1
+ hyprctl dispatch moveworkspacetomonitor "$ws $LAPTOP" 2>/dev/null
+ done
+ for ws in {4..5}; do
+ hyprctl keyword "workspace $ws,monitor:$EXTERNAL" >/dev/null 2>&1
+ hyprctl dispatch workspace "$ws" >/dev/null 2>&1
+ hyprctl dispatch moveworkspacetomonitor "$ws $EXTERNAL" 2>/dev/null
+ done
+# Case 3: External + closed lid
+else
+ notify-send -t 3000 "Monitor Setup" "External monitor only (Lid closed)\nUsing: $EXT_RES"
+ hyprctl dispatch dpms off "$LAPTOP"
+ hyprctl keyword monitor "$LAPTOP,disable"
+ hyprctl keyword monitor "$EXTERNAL,$EXT_RES,0x0,1"
+
+ for ws in {1..5}; do
+ hyprctl keyword "workspace $ws,monitor:$EXTERNAL" >/dev/null 2>&1
+ hyprctl dispatch workspace "$ws" >/dev/null 2>&1
+ hyprctl dispatch moveworkspacetomonitor "$ws $EXTERNAL" 2>/dev/null
+ done
+fi
+
+# Debug output - helpful for troubleshooting
+echo "Monitor Configuration:" > /tmp/hypr_monitor_debug.log
+echo "LAPTOP: $LAPTOP with resolution $LAPTOP_RES" >> /tmp/hypr_monitor_debug.log
+echo "EXTERNAL: $EXTERNAL with resolution $EXT_RES" >> /tmp/hypr_monitor_debug.log
+echo "LID_STATE: $LID_STATE" >> /tmp/hypr_monitor_debug.log
+hyprctl monitors >> /tmp/hypr_monitor_debug.log
+
+notify-send -t 5000 "Monitor Setup Complete" "Active configuration:\n$(hyprctl monitors | grep -E 'Monitor|workspace|resolution')"
diff --git a/hypr/scripts/monitor_setup.sh.dual-not_working b/hypr/scripts/monitor_setup.sh.dual-not_working
new file mode 100755
index 0000000..b4ef309
--- /dev/null
+++ b/hypr/scripts/monitor_setup.sh.dual-not_working
@@ -0,0 +1,118 @@
+#!/usr/bin/env bash
+# Robust Monitor Setup with Workspace Assignments
+
+notify-send "Monitor Setup" "Starting configuration..."
+
+# -------------------------------------------------------------------
+# Phase 1: Reset State
+# -------------------------------------------------------------------
+#hyprctl keyword monitor "" # Clear all monitor rules
+#hyprctl keyword workspace "" # Clear workspace assignments
+#sleep 1
+
+# -------------------------------------------------------------------
+# Phase 2: Hardware Detection
+# -------------------------------------------------------------------
+MONITORS=$(hyprctl monitors -j all)
+LAPTOP="eDP-1"
+LID_STATE=$(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}')
+EXTERNAL_MONITORS=($(echo "$MONITORS" | jq -r '.[] | select(.name != "eDP-1") | .name'))
+
+# -------------------------------------------------------------------
+# Phase 3: Configuration
+# -------------------------------------------------------------------
+
+# Case 1: No externals - Laptop only
+if [ ${#EXTERNAL_MONITORS[@]} -eq 0 ]; then
+ notify-send "Monitor Setup" "Laptop-only mode"
+ hyprctl keyword monitor "$LAPTOP,1920x1200@60,0x0,1.5"
+ sleep 1
+
+ # Assign all workspaces to laptop
+ for ws in {1..10}; do
+ hyprctl keyword "workspace $ws, monitor:$LAPTOP"
+ done
+
+# Case 2: Any external monitors
+else
+ # Try to identify known monitors by serial
+ ULTRAWIDE=$(echo "$MONITORS" | jq -r '.[] | select(.serial == "303NTLE84432") | .name')
+ STANDARD=$(echo "$MONITORS" | jq -r '.[] | select(.serial == "H4LN801666") | .name')
+
+ # Dual monitor setup (known monitors)
+ if [ -n "$ULTRAWIDE" ] && [ -n "$STANDARD" ]; then
+ notify-send "Monitor Setup" "Dual monitor mode (Ultrawide + Standard)"
+
+ # Configure monitors
+ hyprctl keyword monitor "$ULTRAWIDE,5120x1440@120,0x1440,1"
+ sleep 1
+ hyprctl keyword monitor "$STANDARD,3440x1440@60,840x0,1"
+ sleep 1
+ hyprctl dispatch dpms off "$LAPTOP"
+
+ # Workspace assignments:
+ # 1-4 on Ultrawide, 5-10 on Standard
+ for ws in {1..4}; do
+ hyprctl keyword "workspace $ws, monitor:$ULTRAWIDE"
+ hyprctl dispatch moveworkspacetomonitor "$ws $ULTRAWIDE"
+ done
+ for ws in {5..9}; do
+ hyprctl keyword "workspace $ws, monitor:$STANDARD"
+ hyprctl dispatch moveworkspacetomonitor "$ws $STANDARD"
+ done
+
+ hyprctl keyword "workspace 10, monitor:$LAPTOP"
+ hyprctl dispatch moveworkspacetomonitor "10 $LAPTOP"
+
+ # Single external (any monitor)
+ else
+ EXT_MON=${EXTERNAL_MONITORS[0]}
+ notify-send "Monitor Setup" "Single external: $EXT_MON"
+
+ # Get max resolution
+ MAX_RES=$(echo "$MONITORS" | jq -r ".[] | select(.name == \"$EXT_MON\") | .availableModes[0] | \"\(.width)x\(.height)@\(.refreshRate)\"")
+
+ # Check lid state
+ if [ "$LID_STATE" == "closed" ]; then
+ # Lid closed - only external monitor
+ notify-send "Monitor Setup" "Lid closed - using external only"
+ hyprctl dispatch dpms off "$LAPTOP"
+ hyprctl keyword monitor "$EXT_MON,$MAX_RES,0x0,1"
+ sleep 1
+
+ hyprctl keyword "workspace 10, monitor:$LAPTOP"
+ hyprctl dispatch moveworkspacetomonitor "10 $LAPTOP"
+
+ # Assign all workspaces to external
+ for ws in {1..9}; do
+ hyprctl keyword "workspace $ws, monitor:$EXT_MON"
+ hyprctl dispatch moveworkspacetomonitor "$ws $EXT_MON"
+ done
+
+ else
+ # Lid open - both monitors
+ notify-send "Monitor Setup" "Lid open - using laptop + external"
+ hyprctl keyword monitor "$LAPTOP,1920x1200@60,0x0,1.5"
+ sleep 1
+ hyprctl keyword monitor "$EXT_MON,$MAX_RES,1920x0,1"
+ sleep 1
+
+ # Workspace assignments:
+ # 1-4 on laptop, 5-10 on external
+ for ws in {1..4}; do
+ hyprctl keyword "workspace $ws, monitor:$LAPTOP"
+ hyprctl dispatch moveworkspacetomonitor "$ws $LAPTOP"
+ done
+ for ws in {5..10}; do
+ hyprctl keyword "workspace $ws, monitor:$EXT_MON"
+ hyprctl dispatch moveworkspacetomonitor "$ws $EXT_MON"
+ done
+ fi
+ fi
+fi
+
+# -------------------------------------------------------------------
+# Finalization
+# -------------------------------------------------------------------
+sleep 1
+notify-send "Monitor Setup Complete" "Active configuration:\n$(hyprctl monitors)"
diff --git a/hypr/scripts/monitor_setup.sh.old b/hypr/scripts/monitor_setup.sh.old
new file mode 100755
index 0000000..aece268
--- /dev/null
+++ b/hypr/scripts/monitor_setup.sh.old
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+
+# Get all monitor info (including disabled)
+MONITORS=$(hyprctl monitors -j all)
+ALL_MONITORS=$(echo "$MONITORS" | jq -r '.[] | .name')
+EXTERNAL_COUNT=$(echo "$ALL_MONITORS" | grep -v "eDP-1" | wc -l)
+
+#echo $MONITORS
+#echo $ALL_MONITORS
+#echo $EXTERNAL_COUNT
+
+# Case 1: No externals - laptop only
+if [[ $EXTERNAL_COUNT -eq 0 ]]; then
+ hyprctl keyword monitor "eDP-1,1920x1200@60,0x0,1"
+ exit 0
+fi
+
+# Case 2: Single external monitor
+if [[ $EXTERNAL_COUNT -eq 1 ]]; then
+ EXT_MON=$(echo "$ALL_MONITORS" | grep -v "eDP-1")
+ MODES=$(echo "$MONITORS" | jq -r ".[] | select(.name == \"$EXT_MON\") | .availableModes | join(\" \")")
+ MAX_RES=$(echo "$MODES" | grep -oE "[0-9]+x[0-9]+@[0-9.]+" | awk -F'[@x]' '{print $1,$2,$3}' | sort -k1,1nr -k2,2nr -k3,3nr | awk '{print $1"x"$2"@"$3}' | head -n1)
+
+ hyprctl keyword monitor "eDP-1,1920x1200@60,0x0,1"
+ hyprctl keyword monitor "$EXT_MON,$MAX_RES,1920x0,1" # Right of laptop
+ exit 0
+fi
+
+# Identify our specific monitors
+ULTRAWIDE=""
+STANDARD_ULTRAWIDE=""
+
+for MON in $(echo "$ALL_MONITORS"); do
+ echo $MON
+ [[ $MON == "eDP-1" ]] && continue
+
+ MODES=$(echo "$MONITORS" | jq -r ".[] | select(.name == \"$MON\") | .availableModes | join(\" \")")
+
+ echo $MODES
+
+ if [[ $MODES =~ "5120x1440" ]]; then
+ ULTRAWIDE=$MON
+ echo "Ultrawide = $ULTRAWIDE"
+ elif [[ $MODES =~ "3440x1440" ]]; then
+ STANDARD_ULTRAWIDE=$MON
+ echo "Standard = $STANDARD_ULTRAWIDE"
+ fi
+done
+
+# Case 3: Dual monitor setup (only if we found both our specific monitors)
+if [[ -n "$ULTRAWIDE" && -n "$STANDARD_ULTRAWIDE" ]]; then
+ echo "dual monitors"
+ hyprctl keyword monitor "eDP-1,disable"
+ hyprctl keyword monitor "$ULTRAWIDE,5120x1440@120,0x1440,1" # 49" at bottom
+ hyprctl keyword monitor "$STANDARD_ULTRAWIDE,3440x1440@60,840x0,1" # 34" at top-left
+ exit 0
+fi
+
+# If we get here, it's an unexpected configuration - do nothing
+notify-send "Error detecting monitors, no changes"
diff --git a/kitty/kitty.conf b/kitty/kitty.conf
new file mode 100644
index 0000000..5ef9039
--- /dev/null
+++ b/kitty/kitty.conf
@@ -0,0 +1,20 @@
+include themes/gruvbox_dark.conf
+
+font_family Fira Code Regular # or JetBrains Mono
+font_size 12
+bold_font auto
+italic_font auto
+bold_italic_font auto
+
+# Enable Wayland support
+wayland_titlebar_color background
+linux_display_server wayland
+
+# Basic appearance
+font_size 12
+font_family Fira Code
+background_opacity 0.9
+
+# Key bindings
+map ctrl+shift+n new_os_window
+map ctrl+shift+t new_tab
diff --git a/kitty/themes/gruvbox_dark.conf b/kitty/themes/gruvbox_dark.conf
new file mode 100644
index 0000000..369da8d
--- /dev/null
+++ b/kitty/themes/gruvbox_dark.conf
@@ -0,0 +1,49 @@
+# gruvbox dark by morhetz, https://github.com/morhetz/gruvbox
+# This work is licensed under the terms of the MIT license.
+# For a copy, see https://opensource.org/licenses/MIT.
+
+background #282828
+foreground #ebdbb2
+
+cursor #928374
+
+selection_foreground #928374
+selection_background #3c3836
+
+color0 #282828
+color8 #928374
+
+# red
+color1 #cc241d
+# light red
+color9 #fb4934
+
+# green
+color2 #98971a
+# light green
+color10 #b8bb26
+
+# yellow
+color3 #d79921
+# light yellow
+color11 #fabd2d
+
+# blue
+color4 #458588
+# light blue
+color12 #83a598
+
+# magenta
+color5 #b16286
+# light magenta
+color13 #d3869b
+
+# cyan
+color6 #689d6a
+# lighy cyan
+color14 #8ec07c
+
+# light gray
+color7 #a89984
+# dark gray
+color15 #928374
diff --git a/nvim/.luarc.json b/nvim/.luarc.json
new file mode 100644
index 0000000..1e1765c
--- /dev/null
+++ b/nvim/.luarc.json
@@ -0,0 +1,5 @@
+{
+ "diagnostics.globals": [
+ "vim"
+ ]
+}
\ No newline at end of file
diff --git a/nvim/init.lua b/nvim/init.lua
new file mode 100644
index 0000000..9e9cba2
--- /dev/null
+++ b/nvim/init.lua
@@ -0,0 +1,16 @@
+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+if not (vim.uv or vim.loop).fs_stat(lazypath) then
+ vim.fn.system({
+ "git",
+ "clone",
+ "--filter=blob:none",
+ "https://github.com/folke/lazy.nvim.git",
+ "--branch=stable", -- latest stable release
+ lazypath,
+ })
+end
+vim.opt.rtp:prepend(lazypath)
+
+require("vim-options")
+require("lazy").setup("plugins")
+
diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json
new file mode 100644
index 0000000..6843e79
--- /dev/null
+++ b/nvim/lazy-lock.json
@@ -0,0 +1,31 @@
+{
+ "LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" },
+ "avante.nvim": { "branch": "main", "commit": "2f806ca34223a50435018dd21d443795f619828d" },
+ "cmp-nvim-lsp": { "branch": "main", "commit": "a8912b88ce488f411177fc8aed358b04dc246d7b" },
+ "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
+ "copilot.lua": { "branch": "master", "commit": "0929c92097a49b6ae3565aab157fa2bce398d953" },
+ "dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" },
+ "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
+ "fzf-lua": { "branch": "main", "commit": "66e620a7a724364809e78a1ae4b5bfe73e37df49" },
+ "gruvbox.nvim": { "branch": "main", "commit": "00e38a379bab3389e187b3953566d67d494dfddd" },
+ "img-clip.nvim": { "branch": "main", "commit": "08a02e14c8c0d42fa7a92c30a98fd04d6993b35d" },
+ "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
+ "lualine.nvim": { "branch": "master", "commit": "15884cee63a8c205334ab13ab1c891cd4d27101a" },
+ "mason-lspconfig.nvim": { "branch": "main", "commit": "d39a75bbce4b8aad5d627191ea915179c77c100f" },
+ "mason.nvim": { "branch": "main", "commit": "7c7318e8bae7e3536ef6b9e86b9e38e74f2e125e" },
+ "mini.icons": { "branch": "main", "commit": "397ed3807e96b59709ef3292f0a3e253d5c1dc0a" },
+ "mini.pick": { "branch": "main", "commit": "fa1e449e1080bf7aa9b2890ee186d23b1b4e1287" },
+ "neo-tree.nvim": { "branch": "v3.x", "commit": "f481de16a0eb59c985abac8985e3f2e2f75b4875" },
+ "none-ls.nvim": { "branch": "main", "commit": "90e4a27ccaa25979a6b732b9f06dfa43b54957b7" },
+ "nui.nvim": { "branch": "main", "commit": "f535005e6ad1016383f24e39559833759453564e" },
+ "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" },
+ "nvim-lspconfig": { "branch": "master", "commit": "61e5109c8cf24807e4ae29813a3a82b31821dd45" },
+ "nvim-treesitter": { "branch": "master", "commit": "28d480e0624b259095e56f353ec911f9f2a0f404" },
+ "nvim-web-devicons": { "branch": "master", "commit": "f1420728f59843eb2ef084406b3d0201a0a0932d" },
+ "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" },
+ "render-markdown.nvim": { "branch": "main", "commit": "a1b0988f5ab26698afb56b9c2f0525a4de1195c1" },
+ "snacks.nvim": { "branch": "main", "commit": "bc0630e43be5699bb94dadc302c0d21615421d93" },
+ "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" },
+ "telescope.nvim": { "branch": "master", "commit": "d90956833d7c27e73c621a61f20b29fdb7122709" },
+ "vim-tmux-navigator": { "branch": "master", "commit": "33afa80db65113561dc53fa732b7f5e53d5ecfd0" }
+}
diff --git a/nvim/lua/.luarc.json b/nvim/lua/.luarc.json
new file mode 100644
index 0000000..1e1765c
--- /dev/null
+++ b/nvim/lua/.luarc.json
@@ -0,0 +1,5 @@
+{
+ "diagnostics.globals": [
+ "vim"
+ ]
+}
\ No newline at end of file
diff --git a/nvim/lua/plugins.lua b/nvim/lua/plugins.lua
new file mode 100644
index 0000000..a564707
--- /dev/null
+++ b/nvim/lua/plugins.lua
@@ -0,0 +1 @@
+return {}
diff --git a/nvim/lua/plugins/.luarc.json b/nvim/lua/plugins/.luarc.json
new file mode 100644
index 0000000..1e1765c
--- /dev/null
+++ b/nvim/lua/plugins/.luarc.json
@@ -0,0 +1,5 @@
+{
+ "diagnostics.globals": [
+ "vim"
+ ]
+}
\ No newline at end of file
diff --git a/nvim/lua/plugins/avante.lua b/nvim/lua/plugins/avante.lua
new file mode 100644
index 0000000..9d9a979
--- /dev/null
+++ b/nvim/lua/plugins/avante.lua
@@ -0,0 +1,59 @@
+return {
+ "yetone/avante.nvim",
+ event = "VeryLazy",
+ lazy = false,
+ version = false, -- Set this to "*" to always pull the latest release version, or set it to false to update to the latest code changes.
+ opts = {
+ -- add any opts here
+ -- for example
+ provider = "claude",
+ claude = {
+ endpoint = "https://api.anthropic.com",
+ model = "claude-3-haiku-20240307",
+ timeout = 30000,
+ temperature = 0,
+ max_tokens = 2048,
+ },
+ },
+ -- if you want to build from source then do `make BUILD_FROM_SOURCE=true`
+ build = "make",
+ -- build = "powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false" -- for windows
+ dependencies = {
+ "nvim-treesitter/nvim-treesitter",
+ "stevearc/dressing.nvim",
+ "nvim-lua/plenary.nvim",
+ "MunifTanjim/nui.nvim",
+ --- The below dependencies are optional,
+ "echasnovski/mini.pick", -- for file_selector provider mini.pick
+ "nvim-telescope/telescope.nvim", -- for file_selector provider telescope
+ "hrsh7th/nvim-cmp", -- autocompletion for avante commands and mentions
+ "ibhagwan/fzf-lua", -- for file_selector provider fzf
+ "nvim-tree/nvim-web-devicons", -- or echasnovski/mini.icons
+ "zbirenbaum/copilot.lua", -- for providers='copilot'
+ {
+ -- support for image pasting
+ "HakonHarnes/img-clip.nvim",
+ event = "VeryLazy",
+ opts = {
+ -- recommended settings
+ default = {
+ embed_image_as_base64 = false,
+ prompt_for_file_name = false,
+ drag_and_drop = {
+ insert_mode = true,
+ },
+ -- required for Windows users
+ use_absolute_path = true,
+ },
+ },
+ },
+ {
+ -- Make sure to set this up properly if you have lazy=true
+ 'MeanderingProgrammer/render-markdown.nvim',
+ opts = {
+ file_types = { "markdown", "Avante" },
+ },
+ ft = { "markdown", "Avante" },
+ },
+ },
+}
diff --git a/nvim/lua/plugins/completions.lua b/nvim/lua/plugins/completions.lua
new file mode 100644
index 0000000..2e7396a
--- /dev/null
+++ b/nvim/lua/plugins/completions.lua
@@ -0,0 +1,44 @@
+return {
+ {
+ "hrsh7th/cmp-nvim-lsp"
+ },
+ {
+ "L3MON4D3/LuaSnip",
+ dependencies = {
+ "saadparwaiz1/cmp_luasnip",
+ "rafamadriz/friendly-snippets",
+ },
+ },
+ {
+ "hrsh7th/nvim-cmp",
+ config = function()
+ local cmp = require("cmp")
+ require("luasnip.loaders.from_vscode").lazy_load()
+
+ cmp.setup({
+ snippet = {
+ expand = function(args)
+ require("luasnip").lsp_expand(args.body)
+ end,
+ },
+ window = {
+ completion = cmp.config.window.bordered(),
+ documentation = cmp.config.window.bordered(),
+ },
+ mapping = cmp.mapping.preset.insert({
+ [""] = cmp.mapping.scroll_docs(-4),
+ [""] = cmp.mapping.scroll_docs(4),
+ [""] = cmp.mapping.complete(),
+ [""] = cmp.mapping.abort(),
+ [""] = cmp.mapping.confirm({ select = true }),
+ }),
+ sources = cmp.config.sources({
+ { name = "nvim_lsp" },
+ { name = "luasnip" }, -- For luasnip users.
+ }, {
+ { name = "buffer" },
+ }),
+ })
+ end,
+ },
+}
diff --git a/nvim/lua/plugins/gruvbox.lua b/nvim/lua/plugins/gruvbox.lua
new file mode 100644
index 0000000..eb0297b
--- /dev/null
+++ b/nvim/lua/plugins/gruvbox.lua
@@ -0,0 +1,21 @@
+return {
+ {
+ "ellisonleao/gruvbox.nvim",
+ lazy = false,
+ priority = 1000,
+ config = function()
+ require("gruvbox").setup({
+ terminal_colors = true,
+ italic = {
+ strings = true,
+ emphasis = true,
+ comments = true,
+ operators = false,
+ folds = true,
+ },
+ })
+ vim.o.background = "dark"
+ vim.cmd([[colorscheme gruvbox]])
+ end
+ }
+}
diff --git a/nvim/lua/plugins/lsp-config.lua b/nvim/lua/plugins/lsp-config.lua
new file mode 100644
index 0000000..87d5bee
--- /dev/null
+++ b/nvim/lua/plugins/lsp-config.lua
@@ -0,0 +1,36 @@
+return {
+ {
+ "williamboman/mason.nvim",
+ lazy = false,
+ config = function()
+ require("mason").setup()
+ end,
+ },
+ {
+ "williamboman/mason-lspconfig.nvim",
+ lazy = false,
+ config = function()
+ require("mason-lspconfig").setup({
+ ensure_installed = { "lua_ls" }
+ })
+ end
+ },
+ {
+ "neovim/nvim-lspconfig",
+ lazy = false,
+ config = function()
+ local capabilities = require('cmp_nvim_lsp').default_capabilities()
+
+ local lspconfig = require("lspconfig")
+ lspconfig.lua_ls.setup({
+ capabilities = capabilities
+ })
+
+ vim.keymap.set("n", "K", vim.lsp.buf.hover, {})
+ vim.keymap.set("n", "gd", vim.lsp.buf.definition, {})
+ vim.keymap.set("n", "gr", vim.lsp.buf.references, {})
+ vim.keymap.set("n", "ca", vim.lsp.buf.code_action, {})
+ end,
+ },
+ }
+
diff --git a/nvim/lua/plugins/lualine.lua b/nvim/lua/plugins/lualine.lua
new file mode 100644
index 0000000..56936fe
--- /dev/null
+++ b/nvim/lua/plugins/lualine.lua
@@ -0,0 +1,221 @@
+return {
+ 'nvim-lualine/lualine.nvim',
+ dependencies = { 'nvim-tree/nvim-web-devicons' },
+ config = function()
+ -- Color table for highlights
+ -- stylua: ignore
+ local colors = {
+ bg = '#202328',
+ fg = '#bbc2cf',
+ yellow = '#ECBE7B',
+ cyan = '#008080',
+ darkblue = '#081633',
+ green = '#98be65',
+ orange = '#FF8800',
+ violet = '#a9a1e1',
+ magenta = '#c678dd',
+ blue = '#51afef',
+ red = '#ec5f67',
+ }
+
+ local conditions = {
+ buffer_not_empty = function()
+ return vim.fn.empty(vim.fn.expand('%:t')) ~= 1
+ end,
+ hide_in_width = function()
+ return vim.fn.winwidth(0) > 80
+ end,
+ check_git_workspace = function()
+ local filepath = vim.fn.expand('%:p:h')
+ local gitdir = vim.fn.finddir('.git', filepath .. ';')
+ return gitdir and #gitdir > 0 and #gitdir < #filepath
+ end,
+ }
+
+ -- Config
+ local config = {
+ options = {
+ -- Disable sections and component separators
+ component_separators = '',
+ section_separators = '',
+ theme = 'gruvbox_dark', -- Using gruvbox_dark as the base theme
+ -- Theme can also be configured as shown in the original Eviline config
+ -- theme = {
+ -- normal = { c = { fg = colors.fg, bg = colors.bg } },
+ -- inactive = { c = { fg = colors.fg, bg = colors.bg } },
+ -- },
+ },
+ sections = {
+ -- these are to remove the defaults
+ lualine_a = {},
+ lualine_b = {},
+ lualine_y = {},
+ lualine_z = {},
+ -- These will be filled later
+ lualine_c = {},
+ lualine_x = {},
+ },
+ inactive_sections = {
+ -- these are to remove the defaults
+ lualine_a = {},
+ lualine_b = {},
+ lualine_y = {},
+ lualine_z = {},
+ lualine_c = {},
+ lualine_x = {},
+ },
+ }
+
+ -- Inserts a component in lualine_c at left section
+ local function ins_left(component)
+ table.insert(config.sections.lualine_c, component)
+ end
+
+ -- Inserts a component in lualine_x at right section
+ local function ins_right(component)
+ table.insert(config.sections.lualine_x, component)
+ end
+
+ ins_left {
+ function()
+ return '▊'
+ end,
+ color = { fg = colors.blue }, -- Sets highlighting of component
+ padding = { left = 0, right = 1 }, -- We don't need space before this
+ }
+
+ ins_left {
+ -- mode component
+ function()
+ return ''
+ end,
+ color = function()
+ -- auto change color according to neovims mode
+ local mode_color = {
+ n = colors.red,
+ i = colors.green,
+ v = colors.blue,
+ ['␖'] = colors.blue,
+ V = colors.blue,
+ c = colors.magenta,
+ no = colors.red,
+ s = colors.orange,
+ S = colors.orange,
+ ['␓'] = colors.orange,
+ ic = colors.yellow,
+ R = colors.violet,
+ Rv = colors.violet,
+ cv = colors.red,
+ ce = colors.red,
+ r = colors.cyan,
+ rm = colors.cyan,
+ ['r?'] = colors.cyan,
+ ['!'] = colors.red,
+ t = colors.red,
+ }
+ return { fg = mode_color[vim.fn.mode()] }
+ end,
+ padding = { right = 1 },
+ }
+
+ ins_left {
+ -- filesize component
+ 'filesize',
+ cond = conditions.buffer_not_empty,
+ }
+
+ ins_left {
+ 'filename',
+ cond = conditions.buffer_not_empty,
+ color = { fg = colors.magenta, gui = 'bold' },
+ }
+
+ ins_left { 'location' }
+
+ ins_left { 'progress', color = { fg = colors.fg, gui = 'bold' } }
+
+ ins_left {
+ 'diagnostics',
+ sources = { 'nvim_diagnostic' },
+ symbols = { error = ' ', warn = ' ', info = ' ' },
+ diagnostics_color = {
+ error = { fg = colors.red },
+ warn = { fg = colors.yellow },
+ info = { fg = colors.cyan },
+ },
+ }
+
+ -- Insert mid section. You can make any number of sections in neovim :)
+ -- for lualine it's any number greater then 2
+ ins_left {
+ function()
+ return '%='
+ end,
+ }
+
+ ins_left {
+ -- Lsp server name .
+ function()
+ local msg = 'No Active Lsp'
+ local buf_ft = vim.api.nvim_get_option_value('filetype', { buf = 0 })
+ local clients = vim.lsp.get_clients()
+ if next(clients) == nil then
+ return msg
+ end
+ for _, client in ipairs(clients) do
+ local filetypes = client.config.filetypes
+ if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then
+ return client.name
+ end
+ end
+ return msg
+ end,
+ icon = ' LSP:',
+ color = { fg = '#ffffff', gui = 'bold' },
+ }
+
+ -- Add components to right sections
+ ins_right {
+ 'o:encoding', -- option component same as &encoding in viml
+ fmt = string.upper, -- I'm not sure why it's upper case either ;)
+ cond = conditions.hide_in_width,
+ color = { fg = colors.green, gui = 'bold' },
+ }
+
+ ins_right {
+ 'fileformat',
+ fmt = string.upper,
+ icons_enabled = false, -- I think icons are cool but Eviline doesn't have them. sigh
+ color = { fg = colors.green, gui = 'bold' },
+ }
+
+ ins_right {
+ 'branch',
+ icon = '',
+ color = { fg = colors.violet, gui = 'bold' },
+ }
+
+ ins_right {
+ 'diff',
+ -- Is it me or the symbol for modified us really weird
+ symbols = { added = ' ', modified = ' ', removed = ' ' },
+ diff_color = {
+ added = { fg = colors.green },
+ modified = { fg = colors.orange },
+ removed = { fg = colors.red },
+ },
+ cond = conditions.hide_in_width,
+ }
+
+ ins_right {
+ function()
+ return '▊'
+ end,
+ color = { fg = colors.blue },
+ padding = { left = 1 },
+ }
+
+ -- Now don't forget to initialize lualine
+ require('lualine').setup(config)
+ end
+}
diff --git a/nvim/lua/plugins/neo-tree.lua b/nvim/lua/plugins/neo-tree.lua
new file mode 100644
index 0000000..904ce46
--- /dev/null
+++ b/nvim/lua/plugins/neo-tree.lua
@@ -0,0 +1,13 @@
+return {
+ "nvim-neo-tree/neo-tree.nvim",
+ branch = "v3.x",
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ "nvim-tree/nvim-web-devicons",
+ "MunifTanjim/nui.nvim",
+ },
+ config = function()
+ vim.keymap.set("n", "", ":Neotree filesystem reveal left", {})
+ vim.keymap.set("n", "bf", ":Neotree buffers reveal float", {})
+ end,
+}
diff --git a/nvim/lua/plugins/none-ls.lua b/nvim/lua/plugins/none-ls.lua
new file mode 100644
index 0000000..10e7a48
--- /dev/null
+++ b/nvim/lua/plugins/none-ls.lua
@@ -0,0 +1,16 @@
+return {
+ "nvimtools/none-ls.nvim",
+ config = function()
+ local null_ls = require("null-ls")
+ null_ls.setup({
+ sources = {
+ null_ls.builtins.formatting.stylua,
+ null_ls.builtins.formatting.prettier,
+ null_ls.builtins.formatting.black,
+ null_ls.builtins.formatting.isort,
+ },
+ })
+
+ vim.keymap.set("n", "gf", vim.lsp.buf.format, {})
+ end,
+}
diff --git a/nvim/lua/plugins/nvim-tmux-naviation.lua b/nvim/lua/plugins/nvim-tmux-naviation.lua
new file mode 100644
index 0000000..11c99cd
--- /dev/null
+++ b/nvim/lua/plugins/nvim-tmux-naviation.lua
@@ -0,0 +1,18 @@
+return {
+ "christoomey/vim-tmux-navigator",
+ cmd = {
+ "TmuxNavigateLeft",
+ "TmuxNavigateDown",
+ "TmuxNavigateUp",
+ "TmuxNavigateRight",
+ "TmuxNavigatePrevious",
+ "TmuxNavigatorProcessList",
+ },
+ keys = {
+ { "", "TmuxNavigateLeft" },
+ { "", "TmuxNavigateDown" },
+ { "", "TmuxNavigateUp" },
+ { "", "TmuxNavigateRight" },
+ { "", "TmuxNavigatePrevious" },
+ },
+}
diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua
new file mode 100644
index 0000000..057b5ff
--- /dev/null
+++ b/nvim/lua/plugins/snacks.lua
@@ -0,0 +1,46 @@
+return {
+ "folke/snacks.nvim",
+ dependencies = {
+ "echasnovski/mini.icons",
+ },
+ priority = 1000,
+ lazy = false,
+ opts = {
+ bigfile = { enabled = true },
+ dashboard = {
+ enabled = true,
+ preset = {
+ header = [[
+
+ ████ ██████ █████ ██
+ ███████████ █████
+ █████████ ███████████████████ ███ ███████████
+ █████████ ███ █████████████ █████ ██████████████
+ █████████ ██████████ █████████ █████ █████ ████ █████
+ ███████████ ███ ███ █████████ █████ █████ ████ █████
+ ██████ █████████████████████ ████ █████ █████ ████ ██████
+ ]],
+ },
+ },
+ indent = { enabled = true },
+ input = { enabled = true },
+ git = { enabled = true },
+ picker = { enabled = true },
+ notifier = { enabled = true },
+ quickfile = { enabled = true },
+ scroll = { enabled = false },
+ statuscolumn = { enabled = true },
+ words = { enabled = true },
+ },
+ keys = {
+ { "sf", function() Snacks.scratch() end, desc = "Toggle Scratch Buffer" },
+ { "S", function() Snacks.scratch.select() end, desc = "Select Scratch Buffer" },
+ { "gl", function() Snacks.lazygit.log_file() end, desc = "Lazygit Log (cwd)" },
+ { "lg", function() Snacks.lazygit() end, desc = "Lazygit" },
+ { "", function() Snacks.picker.pick("files") end, desc = "Find Files" },
+ { "", function() Snacks.picker.recent() end, desc = "Recent Files" },
+ { "fb", function() Snacks.picker.buffers() end, desc = "Buffers" },
+ { "fg", function() Snacks.picker.grep() end, desc = "Grep Files" },
+ { "", function() Snacks.explorer() end, desc = "Explorer" },
+ }
+ }
diff --git a/nvim/lua/plugins/telescope.lua b/nvim/lua/plugins/telescope.lua
new file mode 100644
index 0000000..710d0e8
--- /dev/null
+++ b/nvim/lua/plugins/telescope.lua
@@ -0,0 +1,25 @@
+return {
+ {
+ "nvim-telescope/telescope-ui-select.nvim",
+ },
+ {
+ "nvim-telescope/telescope.nvim",
+ tag = "0.1.5",
+ dependencies = { "nvim-lua/plenary.nvim" },
+ config = function()
+ require("telescope").setup({
+ extensions = {
+ ["ui-select"] = {
+ require("telescope.themes").get_dropdown({}),
+ },
+ },
+ })
+ local builtin = require("telescope.builtin")
+ vim.keymap.set("n", "", builtin.find_files, {})
+ vim.keymap.set("n", "fg", builtin.live_grep, {})
+ vim.keymap.set("n", "", builtin.oldfiles, {})
+
+ require("telescope").load_extension("ui-select")
+ end,
+ },
+}
diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua
new file mode 100644
index 0000000..6312070
--- /dev/null
+++ b/nvim/lua/plugins/treesitter.lua
@@ -0,0 +1,14 @@
+return {
+ {
+ "nvim-treesitter/nvim-treesitter",
+ build = ":TSUpdate",
+ config = function()
+ local config = require("nvim-treesitter.configs")
+ config.setup({
+ auto_install = true,
+ highlight = { enable = true },
+ indent = { enable = true },
+ })
+ end
+ }
+}
diff --git a/nvim/lua/plugins/vim-test.lua b/nvim/lua/plugins/vim-test.lua
new file mode 100644
index 0000000..500e95c
--- /dev/null
+++ b/nvim/lua/plugins/vim-test.lua
@@ -0,0 +1,14 @@
+return {
+ "vim-test/vim-test",
+ dependencies = {
+ "preservim/vimux"
+ },
+ config = function()
+ vim.keymap.set("n", "t", ":TestNearest", {})
+ vim.keymap.set("n", "T", ":TestFile", {})
+ vim.keymap.set("n", "a", ":TestSuite", {})
+ vim.keymap.set("n", "l", ":TestLast", {})
+ vim.keymap.set("n", "g", ":TestVisit", {})
+ vim.cmd("let test#strategy = 'vimux'")
+ end,
+}
diff --git a/nvim/lua/vim-options.lua b/nvim/lua/vim-options.lua
new file mode 100644
index 0000000..a885300
--- /dev/null
+++ b/nvim/lua/vim-options.lua
@@ -0,0 +1,12 @@
+vim.cmd("set expandtab")
+vim.cmd("set tabstop=2")
+vim.cmd("set softtabstop=2")
+vim.cmd("set shiftwidth=2")
+vim.g.mapleader= " "
+vim.opt.relativenumber = true
+vim.opt.nu = true
+
+vim.keymap.set('n', '', ':wincmd k')
+vim.keymap.set('n', '', ':wincmd j')
+vim.keymap.set('n', '', ':wincmd h')
+vim.keymap.set('n', '', ':wincmd l')
diff --git a/pavucontrol.ini b/pavucontrol.ini
new file mode 100644
index 0000000..d67bbba
--- /dev/null
+++ b/pavucontrol.ini
@@ -0,0 +1,8 @@
+[window]
+width=500
+height=400
+sinkInputType=1
+sourceOutputType=1
+sinkType=0
+sourceType=1
+showVolumeMeters=1
diff --git a/waybar/config.jsonc b/waybar/config.jsonc
new file mode 100644
index 0000000..fc9305c
--- /dev/null
+++ b/waybar/config.jsonc
@@ -0,0 +1,489 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mode": "dock",
+ "reload_style_on_change": true,
+ "gtk-layer-shell": true,
+
+ // <<--< Positions >-->>
+
+ "modules-left": [
+ "custom/ws", // window icon
+ "custom/left1",
+
+ "hyprland/workspaces", // workspaces
+ "custom/right1",
+
+ "custom/paddw",
+ "hyprland/window" // window title
+ ],
+
+ "modules-center": [
+ "custom/paddc",
+ "custom/left2",
+ "custom/temperature", // temperature
+
+ "custom/left3",
+ "memory", // memory
+
+ "custom/left4",
+ "cpu", // cpu
+ "custom/leftin1",
+
+ "custom/left5",
+ "custom/distro", // distro icon
+ "custom/right2",
+
+ "custom/rightin1",
+ "idle_inhibitor", // idle inhibitor
+ "clock#time", // time
+ "custom/right3",
+
+ "clock#date", // date
+ "custom/right4",
+
+ "custom/wifi", // wi-fi
+ "custom/wireguard", // wireguard
+ "bluetooth", // bluetooth
+ "custom/update", // system update
+ "custom/right5"
+ ],
+
+ "modules-right": [
+ "mpris", // media info
+
+ "custom/left6",
+ "pulseaudio", // output device
+
+ "custom/left7",
+ "backlight", // brightness
+
+ "custom/left8",
+ "battery", // battery
+
+ "custom/leftin2",
+ "custom/power" // power button
+ ],
+
+ // <<--< Modules >-->>
+
+ "custom/ws": {
+ "exec": "~/.config/waybar/scripts/current-theme.sh",
+ "return-type": "json",
+ "format": " ",
+ "on-click": "~/.config/waybar/scripts/theme-switcher.sh",
+ "min-length": 3,
+ "max-length": 3
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace -1",
+ "on-scroll-down": "hyprctl dispatch workspace +1",
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": []
+ }
+ },
+
+ "hyprland/window": {
+ "format": "{}",
+ "tooltip": false,
+ "min-length": 5,
+
+ "rewrite": {
+ // Desktop
+ "":
+ " Hyprland",
+
+ // Terminal
+ "~": " Terminal",
+ "zsh": " Terminal",
+ "kitty": " Terminal",
+
+ "tmux(.*)":
+ " Tmux",
+
+ // Browser
+
+ "(.*)Mozilla Firefox":
+ " Firefox",
+ "(.*) — Mozilla Firefox":
+ " $1",
+
+ "(.*)Zen Browser":
+ " Zen Browser",
+ "(.*) — Zen Browser":
+ " $1",
+
+ // Development
+
+ "(.*) - Visual Studio Code":
+ " $1",
+ "(.*)Visual Studio Code":
+ " Visual Studio Code",
+
+ "nvim":
+ " Neovim",
+ "nvim (.*)":
+ " $1",
+
+ "vim":
+ " Vim",
+ "vim (.*)":
+ " $1",
+
+ // Media
+
+ "(.*)Spotify":
+ " Spotify",
+ "(.*)Spotify Premium":
+ " Spotify Premium",
+
+ "OBS(.*)":
+ " OBS Studio",
+
+ "VLC media player":
+ " VLC Media Player",
+ "(.*) - VLC media player":
+ " $1",
+
+ "(.*) - mpv":
+ " $1",
+
+ "qView": " qView",
+
+ "(.*).jpg": " $1.jpg",
+ "(.*).png": " $1.png",
+ "(.*).svg": " $1.svg",
+
+ // Social
+
+ "vesktop":
+ " Discord",
+
+ "• Discord(.*)": "Discord$1",
+ "(.*)Discord(.*)":
+ " $1Discord$2",
+
+ // Documents
+
+ "ONLYOFFICE Desktop Editors":
+ " OnlyOffice Desktop",
+
+ "(.*).docx":
+ " $1.docx",
+ "(.*).xlsx":
+ " $1.xlsx",
+ "(.*).pptx":
+ " $1.pptx",
+ "(.*).pdf":
+ " $1.pdf",
+
+ // System
+ "Authenticate": " Authenticate"
+ }
+ },
+
+ "custom/temperature": {
+ "exec": "~/.config/waybar/scripts/cpu-temp.sh",
+ "return-type": "json",
+ "format": "{}",
+ "interval": 5,
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "memory": {
+ "states": {
+ "warning": 75,
+ "critical": 90
+ },
+
+ "format": " {percentage}%",
+ "format-critical": " {percentage}%",
+ "tooltip": false,
+ // "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB",
+ "interval": 5,
+ "min-length": 7,
+ "max-length": 7
+ },
+
+ "cpu": {
+ "format": " {usage}%",
+ "tooltip": false,
+ "interval": 5,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/distro": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+
+ "format-icons": {
+ "activated": " ",
+ "deactivated": " "
+ },
+
+ "tooltip-format-activated": "Presentation Mode",
+ "tooltip-format-deactivated": "Idle Mode",
+ "start-activated": false
+ },
+
+ "clock#time": {
+ "format": "{:%H:%M}",
+ "tooltip": false,
+ // "tooltip-format": "Standard Time: {:%I:%M %p}",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "clock#date": {
+ "format": " {:%m-%d}",
+ "tooltip-format": "{calendar}",
+
+ "calendar": {
+ "mode": "month",
+ "mode-mon-col": 6,
+ "weeks-pos": "right",
+ "on-click-right": "mode",
+
+ "format": {
+ "months":
+ "{}",
+ "weekdays":
+ "{}",
+ "today":
+ "{}"
+ }
+ },
+
+ "actions": {
+ "on-click": "mode",
+ "on-click-right": "mode"
+ },
+
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "custom/wifi": {
+ "exec": "~/.config/waybar/scripts/wifi-status.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "~/.config/waybar/scripts/wifi-menu.sh",
+ "on-click-right": "kitty --title ' Network Manager TUI' bash -c nmtui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/wireguard": {
+ "format": "{}",
+ "return-type": "json",
+ "interval": 10,
+ "exec": "~/.config/waybar/scripts/wireguard-status.sh",
+ "tooltip": true
+ },
+
+
+ "bluetooth": {
+ "format": "",
+ "format-disabled": "",
+ "format-connected": "",
+ "format-connected-battery": "",
+
+ "tooltip-format":
+ "{num_connections} connected",
+ "tooltip-format-disabled":
+ "Bluetooth Disabled",
+ "tooltip-format-connected":
+ "{device_enumerate}",
+ "tooltip-format-enumerate-connected":
+ "{device_alias}",
+ "tooltip-format-enumerate-connected-battery":
+ ":: {device_alias}: {device_battery_percentage}%",
+
+ "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh",
+ "on-click-right": "kitty --title ' Bluetooth TUI' bash -c bluetui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/update": {
+ "exec": "~/.config/waybar/scripts/system-update.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'",
+ "interval": 180,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "mpris": {
+ "format": "{player_icon} {title} - {artist}",
+ "format-paused": "{status_icon} {title} - {artist}",
+
+ "player-icons": {
+ "default": " ",
+ "spotify": " ",
+ "firefox": " "
+ },
+ "status-icons": {
+ "paused": "\u200A\u200A\u2009\u2009"
+ },
+
+ "tooltip-format": "Playing: {title} - {artist}",
+ "tooltip-format-paused": "Paused: {title} - {artist}",
+ "min-length": 5,
+ "max-length": 35
+ },
+
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "format-muted": " {volume}%",
+
+ "format-icons": {
+ "default": ["", "", ""],
+ "headphone": "",
+ "headset": ""
+ },
+
+ "tooltip-format": "Device: {desc}",
+ "on-click": "~/.config/waybar/scripts/volume-control.sh -o m",
+ "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "backlight": {
+ "format": "{icon} {percent}%",
+ "format-icons": ["", "", "", "", "", "", "", "", ""],
+ "tooltip": false,
+ "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 10
+ },
+
+ "format": "{icon} {capacity}%",
+ "format-icons": ["", "", "", "", "", "", "", "", "", ""],
+ "format-charging": " {capacity}%",
+
+ "tooltip-format": "Discharging: {time}",
+ "tooltip-format-charging": "Charging: {time}",
+ "interval": 1,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/power": {
+ "format": " ",
+ "tooltip": false,
+ // "tooltip-format": "Power Menu",
+ "on-click": "~/.config/waybar/scripts/power-menu.sh"
+ },
+
+ // <<--< Padding >-->>
+
+ "custom/paddw": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "custom/paddc": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ // Left Arrows
+
+ "custom/left1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left5": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left6": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left7": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left8": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Arrows
+
+ "custom/right1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right5": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Left Inverse
+
+ "custom/leftin1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/leftin2": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Inverse
+
+ "custom/rightin1": {
+ "format": "",
+ "tooltip": false
+ }
+}
diff --git a/waybar/config.jsonc.original b/waybar/config.jsonc.original
new file mode 100644
index 0000000..86194e0
--- /dev/null
+++ b/waybar/config.jsonc.original
@@ -0,0 +1,478 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mode": "dock",
+ "reload_style_on_change": true,
+ "gtk-layer-shell": true,
+
+ // <<--< Positions >-->>
+
+ "modules-left": [
+ "custom/ws", // window icon
+ "custom/left1",
+
+ "hyprland/workspaces", // workspaces
+ "custom/right1",
+
+ "custom/paddw",
+ "hyprland/window" // window title
+ ],
+
+ "modules-center": [
+ "custom/paddc",
+ "custom/left2",
+ "custom/temperature", // temperature
+
+ "custom/left3",
+ "memory", // memory
+
+ "custom/left4",
+ "cpu", // cpu
+ "custom/leftin1",
+
+ "custom/left5",
+ "custom/distro", // distro icon
+ "custom/right2",
+
+ "custom/rightin1",
+ "idle_inhibitor", // idle inhibitor
+ "clock#time", // time
+ "custom/right3",
+
+ "clock#date", // date
+ "custom/right4",
+
+ "custom/wifi", // wi-fi
+ "bluetooth", // bluetooth
+ "custom/update", // system update
+ "custom/right5"
+ ],
+
+ "modules-right": [
+ "mpris", // media info
+
+ "custom/left6",
+ "pulseaudio", // output device
+
+ "custom/left7",
+ "backlight", // brightness
+
+ "custom/left8",
+ "battery", // battery
+
+ "custom/leftin2",
+ "custom/power" // power button
+ ],
+
+ // <<--< Modules >-->>
+
+ "custom/ws": {
+ "exec": "~/.config/waybar/scripts/current-theme.sh",
+ "return-type": "json",
+ "format": " ",
+ "on-click": "~/.config/waybar/scripts/theme-switcher.sh",
+ "min-length": 3,
+ "max-length": 3
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace -1",
+ "on-scroll-down": "hyprctl dispatch workspace +1",
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": []
+ }
+ },
+
+ "hyprland/window": {
+ "format": "{}",
+ "tooltip": false,
+ "min-length": 5,
+
+ "rewrite": {
+ // Desktop
+ "":
+ " Hyprland",
+
+ // Terminal
+ "~": " Terminal",
+ "zsh": " Terminal",
+ "kitty": " Terminal",
+
+ "tmux(.*)":
+ " Tmux",
+
+ // Browser
+
+ "(.*)Mozilla Firefox":
+ " Firefox",
+ "(.*) — Mozilla Firefox":
+ " $1",
+
+ "(.*)Zen Browser":
+ " Zen Browser",
+ "(.*) — Zen Browser":
+ " $1",
+
+ // Development
+
+ "(.*) - Visual Studio Code":
+ " $1",
+ "(.*)Visual Studio Code":
+ " Visual Studio Code",
+
+ "nvim":
+ " Neovim",
+ "nvim (.*)":
+ " $1",
+
+ "vim":
+ " Vim",
+ "vim (.*)":
+ " $1",
+
+ // Media
+
+ "(.*)Spotify":
+ " Spotify",
+ "(.*)Spotify Premium":
+ " Spotify Premium",
+
+ "OBS(.*)":
+ " OBS Studio",
+
+ "VLC media player":
+ " VLC Media Player",
+ "(.*) - VLC media player":
+ " $1",
+
+ "(.*) - mpv":
+ " $1",
+
+ "qView": " qView",
+
+ "(.*).jpg": " $1.jpg",
+ "(.*).png": " $1.png",
+ "(.*).svg": " $1.svg",
+
+ // Social
+
+ "vesktop":
+ " Discord",
+
+ "• Discord(.*)": "Discord$1",
+ "(.*)Discord(.*)":
+ " $1Discord$2",
+
+ // Documents
+
+ "ONLYOFFICE Desktop Editors":
+ " OnlyOffice Desktop",
+
+ "(.*).docx":
+ " $1.docx",
+ "(.*).xlsx":
+ " $1.xlsx",
+ "(.*).pptx":
+ " $1.pptx",
+ "(.*).pdf":
+ " $1.pdf",
+
+ // System
+ "Authenticate": " Authenticate"
+ }
+ },
+
+ "custom/temperature": {
+ "exec": "~/.config/waybar/scripts/cpu-temp.sh",
+ "return-type": "json",
+ "format": "{}",
+ "interval": 5,
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "memory": {
+ "states": {
+ "warning": 75,
+ "critical": 90
+ },
+
+ "format": " {percentage}%",
+ "format-critical": " {percentage}%",
+ "tooltip": false,
+ // "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB",
+ "interval": 5,
+ "min-length": 7,
+ "max-length": 7
+ },
+
+ "cpu": {
+ "format": " {usage}%",
+ "tooltip": false,
+ "interval": 5,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/distro": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+
+ "format-icons": {
+ "activated": " ",
+ "deactivated": " "
+ },
+
+ "tooltip-format-activated": "Presentation Mode",
+ "tooltip-format-deactivated": "Idle Mode",
+ "start-activated": false
+ },
+
+ "clock#time": {
+ "format": "{:%H:%M}",
+ "tooltip": false,
+ // "tooltip-format": "Standard Time: {:%I:%M %p}",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "clock#date": {
+ "format": " {:%m-%d}",
+ "tooltip-format": "{calendar}",
+
+ "calendar": {
+ "mode": "month",
+ "mode-mon-col": 6,
+ "on-click-right": "mode",
+
+ "format": {
+ "months":
+ "{}",
+ "weekdays":
+ "{}",
+ "today":
+ "{}"
+ }
+ },
+
+ "actions": {
+ "on-click": "mode",
+ "on-click-right": "mode"
+ },
+
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "custom/wifi": {
+ "exec": "~/.config/waybar/scripts/wifi-status.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "~/.config/waybar/scripts/wifi-menu.sh",
+ "on-click-right": "kitty --title ' Network Manager TUI' bash -c nmtui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "bluetooth": {
+ "format": "",
+ "format-disabled": "",
+ "format-connected": "",
+ "format-connected-battery": "",
+
+ "tooltip-format":
+ "{num_connections} connected",
+ "tooltip-format-disabled":
+ "Bluetooth Disabled",
+ "tooltip-format-connected":
+ "{device_enumerate}",
+ "tooltip-format-enumerate-connected":
+ "{device_alias}",
+ "tooltip-format-enumerate-connected-battery":
+ ":: {device_alias}: {device_battery_percentage}%",
+
+ "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh",
+ "on-click-right": "kitty --title ' Bluetooth TUI' bash -c bluetui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/update": {
+ "exec": "~/.config/waybar/scripts/system-update.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'",
+ "interval": 30,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "mpris": {
+ "format": "{player_icon} {title} - {artist}",
+ "format-paused": "{status_icon} {title} - {artist}",
+
+ "player-icons": {
+ "default": " ",
+ "spotify": " ",
+ "firefox": " "
+ },
+ "status-icons": {
+ "paused": "\u200A\u200A\u2009\u2009"
+ },
+
+ "tooltip-format": "Playing: {title} - {artist}",
+ "tooltip-format-paused": "Paused: {title} - {artist}",
+ "min-length": 5,
+ "max-length": 35
+ },
+
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "format-muted": " {volume}%",
+
+ "format-icons": {
+ "default": ["", "", ""],
+ "headphone": "",
+ "headset": ""
+ },
+
+ "tooltip-format": "Device: {desc}",
+ "on-click": "~/.config/waybar/scripts/volume-control.sh -o m",
+ "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "backlight": {
+ "format": "{icon} {percent}%",
+ "format-icons": ["", "", "", "", "", "", "", "", ""],
+ "tooltip": false,
+ "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 10
+ },
+
+ "format": "{icon} {capacity}%",
+ "format-icons": ["", "", "", "", "", "", "", "", "", ""],
+ "format-charging": " {capacity}%",
+
+ "tooltip-format": "Discharging: {time}",
+ "tooltip-format-charging": "Charging: {time}",
+ "interval": 1,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/power": {
+ "format": " ",
+ "tooltip": false,
+ // "tooltip-format": "Power Menu",
+ "on-click": "~/.config/waybar/scripts/power-menu.sh"
+ },
+
+ // <<--< Padding >-->>
+
+ "custom/paddw": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "custom/paddc": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ // Left Arrows
+
+ "custom/left1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left5": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left6": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left7": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left8": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Arrows
+
+ "custom/right1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right5": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Left Inverse
+
+ "custom/leftin1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/leftin2": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Inverse
+
+ "custom/rightin1": {
+ "format": "",
+ "tooltip": false
+ }
+}
diff --git a/waybar/scripts/battery-level.sh b/waybar/scripts/battery-level.sh
new file mode 100755
index 0000000..ddde6ea
--- /dev/null
+++ b/waybar/scripts/battery-level.sh
@@ -0,0 +1,80 @@
+#!/usr/bin/env bash
+
+# Original script by Eric Murphy
+# https://github.com/ericmurphyxyz/dotfiles/blob/master/.local/bin/battery-alert
+#
+# Modified by Jesse Mirabel (@sejjy)
+# https://github.com/sejjy/mechabar
+
+# This script sends a notification when the battery is full, low, or critical.
+# icon theme used: tela-circle-icon-theme-dracula
+#
+# (see the bottom of the script for more information)
+
+export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
+
+# battery levels
+WARNING_LEVEL=20
+CRITICAL_LEVEL=10
+
+# get the battery state and percentage using upower (waybar dependency)
+BAT_PATH=$(upower -e | grep BAT | head -n 1)
+BATTERY_STATE=$(upower -i "$BAT_PATH" | awk '/state:/ {print $2}')
+BATTERY_LEVEL=$(upower -i "$BAT_PATH" | awk '/percentage:/ {print $2}' | tr -d '%')
+
+# prevent multiple notifications
+FILE_FULL=/tmp/battery-full
+FILE_WARNING=/tmp/battery-warning
+FILE_CRITICAL=/tmp/battery-critical
+
+# remove the files if the battery is no longer in that state
+if [ "$BATTERY_STATE" == "discharging" ]; then
+ rm -f $FILE_FULL
+elif [ "$BATTERY_STATE" == "charging" ]; then
+ rm -f "$FILE_WARNING" "$FILE_CRITICAL"
+fi
+
+# if the battery is full and is plugged in
+if [ "$BATTERY_LEVEL" -eq 100 ] && [ "$BATTERY_STATE" == "fully-charged" ] && [ ! -f $FILE_FULL ]; then
+ notify-send -a "state" "Battery Charged (${BATTERY_LEVEL}%)" "You might want to unplug your PC." -i "battery-full" -r 9991
+ touch $FILE_FULL
+
+# if the battery is low and is discharging
+elif [ "$BATTERY_LEVEL" -le $WARNING_LEVEL ] && [ "$BATTERY_STATE" == "discharging" ] && [ ! -f $FILE_WARNING ]; then
+ notify-send -a "state" "Battery Low (${BATTERY_LEVEL}%)" "You might want to plug in your PC." -u critical -i "battery-caution" -r 9991 -h string:fgcolor:\#fab387 -h string:frcolor:\#fab387
+ touch $FILE_WARNING
+
+# if the battery is critical and is discharging
+elif [ "$BATTERY_LEVEL" -le $CRITICAL_LEVEL ] && [ "$BATTERY_STATE" == "discharging" ] && [ ! -f $FILE_CRITICAL ]; then
+ notify-send -a "state" "Battery Critical (${BATTERY_LEVEL}%)" "Plug in your PC now." -u critical -i "battery-empty" -r 9991
+ touch $FILE_CRITICAL
+fi
+
+# systemd service
+# Add the following to ~/.config/systemd/user/battery-level.service:
+
+# [Unit]
+# Description=Battery Level Checker
+# After=graphical.target
+#
+# [Service]
+# ExecStart=%h/.config/waybar/scripts/battery-level.sh
+# Type=oneshot
+
+# systemd timer
+# Add the following to ~/.config/systemd/user/battery-level.timer:
+
+# [Unit]
+# Description=Run Battery Level Checker
+#
+# [Timer]
+# OnBootSec=1min
+# OnUnitActiveSec=1min
+# Unit=battery-level.service
+#
+# [Install]
+# WantedBy=timers.target
+
+# enable the timer by running the following commands:
+# systemctl --user daemon-reload
+# systemctl --user enable --now battery-level.timer
diff --git a/waybar/scripts/battery-state.sh b/waybar/scripts/battery-state.sh
new file mode 100755
index 0000000..d7cf5fc
--- /dev/null
+++ b/waybar/scripts/battery-state.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env bash
+
+# Original script by Eric Murphy
+# https://github.com/ericmurphyxyz/dotfiles/blob/master/.local/bin/battery-alert
+#
+# Modified by Jesse Mirabel (@sejjy)
+# https://github.com/sejjy/mechabar
+
+# This script sends a notification when the battery is charging or discharging.
+# icon theme used: tela-circle-icon-theme-dracula
+#
+# (see the bottom of the script for more information)
+
+export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
+
+# get the battery state from the udev rule
+BATTERY_STATE=$1
+
+# get the battery percentage using upower (waybar dependency)
+BAT_PATH=$(upower -e | grep BAT | head -n 1)
+BATTERY_LEVEL=$(upower -i "$BAT_PATH" | awk '/percentage:/ {print $2}' | tr -d '%')
+
+# set the battery charging state and icon
+case "$BATTERY_STATE" in
+"charging")
+ BATTERY_CHARGING="Charging"
+ BATTERY_ICON="090-charging"
+ ;;
+"discharging")
+ BATTERY_CHARGING="Disharging"
+ BATTERY_ICON="090"
+ ;;
+esac
+
+# send the notification
+notify-send -a "state" "Battery ${BATTERY_CHARGING} (${BATTERY_LEVEL}%)" -u normal -i "battery-${BATTERY_ICON}" -r 9991
+
+# udev rule
+# Add the following to /etc/udev/rules.d/60-power.rules:
+
+# ACTION=="change", SUBSYSTEM=="power_supply", ATTR{type}=="Mains", ATTR{online}=="0", ENV{DISPLAY}=":0", RUN+="/usr/bin/su -c '$HOME/.config/waybar/scripts/battery-state.sh discharging'"
+# ACTION=="change", SUBSYSTEM=="power_supply", ATTR{type}=="Mains", ATTR{online}=="1", ENV{DISPLAY}=":0", RUN+="/usr/bin/su -c '$HOME/.config/waybar/scripts/battery-state.sh charging'"
+
+# the number 60 in the udev rule can be changed to any number between 0 and 99.
+# the lower the number, the higher the priority.
+#
+# $USER does not work, so you have to replace "" with your username.
+
+# reload udev rules by running the following command:
+# sudo udevadm control --reload-rules
diff --git a/waybar/scripts/bluetooth-menu.sh b/waybar/scripts/bluetooth-menu.sh
new file mode 100755
index 0000000..40642fd
--- /dev/null
+++ b/waybar/scripts/bluetooth-menu.sh
@@ -0,0 +1,106 @@
+#!/usr/bin/env bash
+
+# Author: Jesse Mirabel (@sejjy)
+# GitHub: https://github.com/sejjy/mechabar
+
+# Rofi config
+config="$HOME/.config/rofi/bluetooth-menu.rasi"
+
+# Rofi window override
+override_disabled="mainbox { children: [ textbox-custom, listview ]; } listview { lines: 1; padding: 6px 6px 8px; }"
+
+get_device_icon() {
+ local device_mac=$1
+ device_info=$(bluetoothctl info "$device_mac")
+ device_icon=$(echo "$device_info" | grep "Icon:" | awk '{print $2}')
+
+ case "$device_icon" in
+ "audio-headphones" | "audio-headset") echo " " ;; # Headphones
+ "video-display" | "computer") echo " " ;; # Monitor
+ "audio-input-microphone") echo " " ;; # Microphone
+ "input-keyboard") echo " " ;; # Keyboard
+ "audio-speakers") echo " " ;; # Speakers
+ "input-mouse") echo " " ;; # Mouse
+ "phone") echo " " ;; # Phone
+ *)
+ echo " " # Default
+ ;;
+ esac
+}
+
+while true; do
+ # Get list of paired devices
+ bluetooth_devices=$(bluetoothctl devices | while read -r line; do
+ device_mac=$(echo "$line" | awk '{print $2}')
+ device_name=$(echo "$line" | awk '{$1=$2=""; print substr($0, 3)}')
+ icon=$(get_device_icon "$device_mac")
+ echo "$icon $device_name"
+ done)
+
+ options=$(
+ echo " Scan for devices"
+ echo " Disable Bluetooth"
+ echo "$bluetooth_devices"
+ )
+ option=" Enable Bluetooth"
+
+ # Get Bluetooth status
+ bluetooth_status=$(bluetoothctl show | grep "Powered:" | awk '{print $2}')
+
+ if [[ "$bluetooth_status" == "yes" ]]; then
+ selected_option=$(echo -e "$options" | rofi -dmenu -i -selected-row 1 -config "${config}" -p " " || pkill -x rofi)
+ else
+ selected_option=$(echo -e "$option" | rofi -dmenu -i -selected-row 1 -config "${config}" -theme-str "${override_disabled}" -p " " || pkill -x rofi)
+ fi
+
+ # Exit if no option is selected
+ if [ -z "$selected_option" ]; then
+ exit
+ fi
+
+ # Actions based on selected option
+ case "$selected_option" in
+ *"Enable Bluetooth")
+ notify-send "Bluetooth Enabled" -i "package-installed-outdated"
+ rfkill unblock bluetooth
+ bluetoothctl power on
+ sleep 1
+ ;;
+ *"Disable Bluetooth")
+ notify-send "Bluetooth Disabled" -i "package-broken"
+ rfkill block bluetooth
+ bluetoothctl power off
+ exit
+ ;;
+ *"Scan for devices")
+ notify-send "Press '?' to show help." -i "package-installed-outdated"
+ kitty --title ' Bluetooth TUI' bash -c "bluetui" # Launch bluetui
+ ;;
+ *)
+ # Extract device name
+ device_name="${selected_option#* }"
+ device_name="${device_name## }"
+
+ if [[ -n "$device_name" ]]; then
+ # Get MAC address
+ device_mac=$(bluetoothctl devices | grep "$device_name" | awk '{print $2}')
+
+ # Trust and pair device
+ bluetoothctl trust "$device_mac" >/dev/null 2>&1
+ bluetoothctl pair "$device_mac" >/dev/null 2>&1
+
+ # Connect to device
+ bluetoothctl connect "$device_mac" &
+ sleep 3
+ connection_status=$(bluetoothctl info "$device_mac" | grep "Connected:" | awk '{print $2}')
+
+ if [[ "$connection_status" == "yes" ]]; then
+ notify-send "Connected to \"$device_name\"." -i "package-installed-outdated"
+ exit
+ else
+ notify-send "Failed to connect to \"$device_name\"." -i "package-broken"
+ fi
+ fi
+ ;;
+ esac
+done
diff --git a/waybar/scripts/brightness-control.sh b/waybar/scripts/brightness-control.sh
new file mode 100755
index 0000000..28fa223
--- /dev/null
+++ b/waybar/scripts/brightness-control.sh
@@ -0,0 +1,92 @@
+#!/usr/bin/env bash
+
+# Print error message for invalid arguments
+print_error() {
+ cat <<"EOF"
+Usage: ./brightnesscontrol.sh
+Valid actions are:
+ i -- ncrease brightness [+2%]
+ d -- ecrease brightness [-2%]
+EOF
+}
+
+# Send a notification with brightness info
+send_notification() {
+ brightness=$(brightnessctl info | grep -oP "(?<=\()\d+(?=%)")
+ notify-send -a "state" -r 91190 -i "gpm-brightness-lcd" -h int:value:"$brightness" "Brightness: ${brightness}%" -u low
+}
+
+# Get the current brightness percentage and device name
+get_brightness() {
+ brightness=$(brightnessctl -m | grep -o '[0-9]\+%' | head -c-2)
+ device=$(brightnessctl -m | head -n 1 | awk -F',' '{print $1}' | sed 's/_/ /g; s/\<./\U&/g') # Get device name
+ current_brightness=$(brightnessctl -m | head -n 1 | awk -F',' '{print $3}') # Get current brightness
+ max_brightness=$(brightnessctl -m | head -n 1 | awk -F',' '{print $5}') # Get max brightness
+}
+get_brightness
+
+# Handle options
+while getopts o: opt; do
+ case "${opt}" in
+ o)
+ case $OPTARG in
+ i) # Increase brightness
+ if [[ $brightness -lt 10 ]]; then
+ brightnessctl set +1%
+ else
+ brightnessctl set +2%
+ fi
+ send_notification
+ ;;
+ d) # Decrease brightness
+ if [[ $brightness -le 1 ]]; then
+ brightnessctl set 1%
+ elif [[ $brightness -le 10 ]]; then
+ brightnessctl set 1%-
+ else
+ brightnessctl set 2%-
+ fi
+ send_notification
+ ;;
+ *)
+ print_error
+ ;;
+ esac
+ ;;
+ *)
+ print_error
+ ;;
+ esac
+done
+
+# Determine the icon based on brightness level
+get_icon() {
+ if ((brightness <= 5)); then
+ icon=""
+ elif ((brightness <= 15)); then
+ icon=""
+ elif ((brightness <= 30)); then
+ icon=""
+ elif ((brightness <= 45)); then
+ icon=""
+ elif ((brightness <= 55)); then
+ icon=""
+ elif ((brightness <= 65)); then
+ icon=""
+ elif ((brightness <= 80)); then
+ icon=""
+ elif ((brightness <= 95)); then
+ icon=""
+ else
+ icon=""
+ fi
+}
+
+# Backlight module and tooltip
+get_icon
+module="${icon} ${brightness}%"
+
+tooltip="Device Name: ${device}"
+tooltip+="\nBrightness: ${current_brightness} / ${max_brightness}"
+
+echo "{\"text\": \"${module}\", \"tooltip\": \"${tooltip}\"}"
diff --git a/waybar/scripts/cpu-temp.sh b/waybar/scripts/cpu-temp.sh
new file mode 100755
index 0000000..b6f2355
--- /dev/null
+++ b/waybar/scripts/cpu-temp.sh
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+
+model=$(awk -F ': ' '/model name/{print $2}' /proc/cpuinfo | head -n 1 | sed 's/@.*//; s/ *\((R)\|(TM)\)//g; s/^[ \t]*//; s/[ \t]*$//')
+
+# get CPU clock speeds
+get_cpu_frequency() {
+ freqlist=$(awk '/cpu MHz/ {print $4}' /proc/cpuinfo)
+ maxfreq=$(sed 's/...$//' /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)
+ if [ -z "$freqlist" ] || [ -z "$maxfreq" ]; then
+ echo "--"
+ return
+ fi
+ average_freq=$(echo "$freqlist" | tr ' ' '\n' | awk "{sum+=\$1} END {printf \"%.0f/%s MHz\", sum/NR, $maxfreq}")
+ echo "$average_freq"
+}
+
+# get CPU temp
+get_cpu_temperature() {
+ temp=$(sensors | awk '/Package id 0/ {print $4}' | awk -F '[+.]' '{print $2}')
+ if [[ -z "$temp" ]]; then
+ temp=$(sensors | awk '/Tctl/ {print $2}' | tr -d '+°C')
+ fi
+ if [[ -z "$temp" ]]; then
+ temp="--"
+ temp_f="--"
+ else
+ temp=${temp%.*}
+ temp_f=$(awk "BEGIN {printf \"%.1f\", ($temp * 9 / 5) + 32}")
+ fi
+ # Celsius and Fahrenheit
+ echo "${temp:---} ${temp_f:---}"
+}
+
+get_temperature_icon() {
+ temp_value=$1
+ if [ "$temp_value" = "--" ]; then
+ icon="" # none
+ elif [ "$temp_value" -ge 80 ]; then
+ icon="" # high
+ elif [ "$temp_value" -ge 70 ]; then
+ icon="" # medium
+ elif [ "$temp_value" -ge 60 ]; then
+ icon="" # normal
+ else
+ icon="" # low
+ fi
+ echo "$icon"
+}
+
+cpu_frequency=$(get_cpu_frequency)
+read -r temp_info < <(get_cpu_temperature)
+temp=$(echo "$temp_info" | awk '{print $1}')
+temp_f=$(echo "$temp_info" | awk '{print $2}')
+thermo_icon=$(get_temperature_icon "$temp")
+
+# high temp warning
+if [ "$temp" == "--" ] || [ "$temp" -ge 80 ]; then
+ text_output="${thermo_icon} ${temp}°C"
+else
+ text_output="${thermo_icon} ${temp}°C"
+fi
+
+tooltip=":: ${model}\n"
+tooltip+="Clock Speed: ${cpu_frequency}\nTemperature: ${temp_f}°F"
+
+# module and tooltip
+echo "{\"text\": \"$text_output\", \"tooltip\": \"$tooltip\"}"
diff --git a/waybar/scripts/current-theme.sh b/waybar/scripts/current-theme.sh
new file mode 100755
index 0000000..b7d5db6
--- /dev/null
+++ b/waybar/scripts/current-theme.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+CURRENT_THEME_FILE="$HOME/.config/waybar/themes/current-theme"
+
+# Get the current theme
+current_theme=$(cat "$CURRENT_THEME_FILE" 2>/dev/null || echo "")
+current_theme_name="Default"
+
+# Get the theme name
+if [[ -n "$current_theme" ]]; then
+ current_theme_name=$(basename "$current_theme" .css)
+
+ # Convert "theme-name" to "Theme Name"
+ formatted_theme_name="${current_theme_name//-/ }"
+ formatted_theme_name=$(echo "$formatted_theme_name" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)}1')
+else
+ formatted_theme_name="Default"
+fi
+
+tooltip="Theme: $formatted_theme_name"
+tooltip+="\nStyle: Classic" # hard-coded for now
+
+# Tooltip
+echo "{\"tooltip\": \"$tooltip\"}"
diff --git a/waybar/scripts/power-menu.sh b/waybar/scripts/power-menu.sh
new file mode 100755
index 0000000..ae971c9
--- /dev/null
+++ b/waybar/scripts/power-menu.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+config="$HOME/.config/rofi/power-menu.rasi"
+
+actions=$(echo -e " Lock\n Shutdown\n Reboot\n Suspend\n Hibernate\n Logout")
+
+# Display logout menu
+selected_option=$(echo -e "$actions" | rofi -dmenu -i -config "${config}" || pkill -x rofi)
+
+# Perform actions based on the selected option
+case "$selected_option" in
+*Lock)
+ loginctl lock-session
+ ;;
+*Shutdown)
+ systemctl poweroff
+ ;;
+*Reboot)
+ systemctl reboot
+ ;;
+*Suspend)
+ systemctl suspend
+ ;;
+*Hibernate)
+ systemctl hibernate
+ ;;
+*Logout)
+ loginctl kill-session "$XDG_SESSION_ID"
+ ;;
+esac
diff --git a/waybar/scripts/system-update.sh b/waybar/scripts/system-update.sh
new file mode 100755
index 0000000..2c3c62b
--- /dev/null
+++ b/waybar/scripts/system-update.sh
@@ -0,0 +1,86 @@
+#!/usr/bin/env bash
+
+# Check release
+if [ ! -f /etc/arch-release ]; then
+ exit 0
+fi
+
+pkg_installed() {
+ local pkg=$1
+
+ if pacman -Qi "${pkg}" &>/dev/null; then
+ return 0
+ elif pacman -Qi "flatpak" &>/dev/null && flatpak info "${pkg}" &>/dev/null; then
+ return 0
+ elif command -v "${pkg}" &>/dev/null; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+get_aur_helper() {
+ if pkg_installed yay; then
+ aur_helper="yay"
+ elif pkg_installed paru; then
+ aur_helper="paru"
+ fi
+}
+
+get_aur_helper
+export -f pkg_installed
+
+# Trigger upgrade
+if [ "$1" == "up" ]; then
+ trap 'pkill -RTMIN+20 waybar' EXIT
+ command="
+ $0 upgrade
+ ${aur_helper} -Syu
+ if pkg_installed flatpak; then flatpak update; fi
+ printf '\n'
+ read -n 1 -p 'Press any key to continue...'
+ "
+ kitty --title " System Update" sh -c "${command}"
+fi
+
+# Check for AUR updates
+if [ -n "$aur_helper" ]; then
+ aur_updates=$(${aur_helper} -Qua | grep -c '^')
+else
+ aur_updates=0
+fi
+
+# Check for official repository updates
+official_updates=$(
+ (while pgrep -x checkupdates >/dev/null; do sleep 1; done)
+ checkupdates | grep -c '^'
+)
+
+# Check for Flatpak updates
+if pkg_installed flatpak; then
+ flatpak_updates=$(flatpak remote-ls --updates | grep -c '^')
+else
+ flatpak_updates=0
+fi
+
+# Calculate total available updates
+total_updates=$((official_updates + aur_updates + flatpak_updates))
+
+# Handle formatting based on AUR helper
+if [ "$aur_helper" == "yay" ]; then
+ [ "${1}" == upgrade ] && printf "Official: %-10s\nAUR ($aur_helper): %-10s\nFlatpak: %-10s\n\n" "$official_updates" "$aur_updates" "$flatpak_updates" && exit
+
+ tooltip="Official: $official_updates\nAUR ($aur_helper): $aur_updates\nFlatpak: $flatpak_updates"
+
+elif [ "$aur_helper" == "paru" ]; then
+ [ "${1}" == upgrade ] && printf "Official: %-10s\nAUR ($aur_helper): %-10s\nFlatpak: %-10s\n\n" "$official_updates" "$aur_updates" "$flatpak_updates" && exit
+
+ tooltip="Official: $official_updates\nAUR ($aur_helper): $aur_updates\nFlatpak: $flatpak_updates"
+fi
+
+# Module and tooltip
+if [ $total_updates -eq 0 ]; then
+ echo "{\"text\":\"\", \"tooltip\":\"Packages are up to date\"}"
+else
+ echo "{\"text\":\"\", \"tooltip\":\"${tooltip//\"/\\\"}\"}"
+fi
diff --git a/waybar/scripts/theme-switcher.sh b/waybar/scripts/theme-switcher.sh
new file mode 100755
index 0000000..d5f1aca
--- /dev/null
+++ b/waybar/scripts/theme-switcher.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+
+WAYBAR_CSS_DIR="$HOME/.config/waybar/themes/css"
+WAYBAR_CSS_FILE="$HOME/.config/waybar/theme.css"
+WAYBAR_JSONC_DIR="$HOME/.config/waybar/themes/jsonc"
+WAYBAR_JSONC_FILE="$HOME/.config/waybar/config.jsonc"
+ROFI_THEMES_DIR="$HOME/.config/rofi/themes"
+ROFI_THEME_FILE="$HOME/.config/rofi/theme.rasi"
+CURRENT_THEME_FILE="$HOME/.config/waybar/themes/current-theme"
+
+for dir in "$WAYBAR_CSS_DIR" "$WAYBAR_JSONC_DIR" "$ROFI_THEMES_DIR"; do
+ [[ ! -d "$dir" ]] && echo "Error: $dir not found" && exit 1
+done
+
+# Get all themes
+waybar_css=("$WAYBAR_CSS_DIR"/*.css)
+waybar_jsonc=("$WAYBAR_JSONC_DIR"/*.jsonc)
+rofi_themes=("$ROFI_THEMES_DIR"/*.rasi)
+
+if [[ ${#waybar_css[@]} -eq 0 || ${#waybar_jsonc[@]} -eq 0 || ${#rofi_themes[@]} -eq 0 ]]; then
+ echo "Error: No themes found in one of the directories"
+ exit 1
+fi
+
+# Get the current theme
+current_theme=$(cat "$CURRENT_THEME_FILE" 2>/dev/null || echo "")
+
+# Find the index of the current theme
+next_theme_index=0
+for i in "${!waybar_css[@]}"; do
+ [[ "${waybar_css[$i]}" == "$current_theme" ]] && next_theme_index=$(((i + 1) % ${#waybar_css[@]})) && break
+done
+
+# Get the new theme
+new_waybar_css="${waybar_css[$next_theme_index]}"
+new_waybar_jsonc="${waybar_jsonc[$next_theme_index]}"
+new_rofi_theme="${rofi_themes[$next_theme_index]}"
+
+# Save the new theme
+echo "$new_waybar_css" >"$CURRENT_THEME_FILE"
+
+declare -A theme_files=(
+ ["$new_waybar_css"]="$WAYBAR_CSS_FILE"
+ ["$new_waybar_jsonc"]="$WAYBAR_JSONC_FILE"
+ ["$new_rofi_theme"]="$ROFI_THEME_FILE"
+)
+
+for src in "${!theme_files[@]}"; do
+ cp "$src" "${theme_files[$src]}"
+done
+
+# Restart Waybar to apply changes
+killall waybar || true
+nohup waybar --config "$HOME/.config/waybar/config.jsonc" --style "$HOME/.config/waybar/style.css" >/dev/null 2>&1 &
diff --git a/waybar/scripts/volume-control.sh b/waybar/scripts/volume-control.sh
new file mode 100755
index 0000000..76bb2f7
--- /dev/null
+++ b/waybar/scripts/volume-control.sh
@@ -0,0 +1,123 @@
+#!/usr/bin/env bash
+
+# Define functions
+print_error() {
+ cat <<"EOF"
+Usage: ./volumecontrol.sh -[device]
+...valid devices are...
+ i -- input device
+ o -- output device
+ p -- player application
+...valid actions are...
+ i -- increase volume [+2]
+ d -- decrease volume [-2]
+ m -- mute [x]
+EOF
+ exit 1
+}
+
+icon() {
+ vol=$(pactl get-sink-volume @DEFAULT_SINK@ | awk '{print $5}' | sed 's/%//')
+ mute=$(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}')
+
+ if [ "$mute" = "yes" ] || [ "$vol" -eq 0 ]; then
+ icon="volume-level-muted"
+ elif [ "$vol" -lt 33 ]; then
+ icon="volume-level-low"
+ elif [ "$vol" -lt 66 ]; then
+ icon="volume-level-medium"
+ else
+ icon="volume-level-high"
+ fi
+}
+
+send_notification() {
+ icon
+ notify-send -a "state" -r 91190 -i "$icon" -h int:value:"$vol" "Volume: ${vol}%" -u low
+}
+
+notify_mute() {
+ mute=$(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}')
+ if [ "$mute" = "yes" ]; then
+ notify-send -a "state" -r 91190 -i "volume-level-muted" "Volume: Muted" -u low
+ else
+ icon
+ notify-send -a "state" -r 91190 -i "$icon" "Volume: Unmuted" -u low
+ fi
+}
+
+action_volume() {
+ case "${1}" in
+ i)
+ # Increase volume if below 100
+ current_vol=$(pactl get-sink-volume @DEFAULT_SINK@ | awk '{print $5}' | sed 's/%//')
+ if [ "$current_vol" -lt 100 ]; then
+ new_vol=$((current_vol + 2))
+ [ "$new_vol" -gt 100 ] && new_vol=100
+ pactl set-sink-volume @DEFAULT_SINK@ "${new_vol}%"
+ fi
+ ;;
+ d)
+ # Decrease volume if above 0
+ current_vol=$(pactl get-sink-volume @DEFAULT_SINK@ | awk '{print $5}' | sed 's/%//')
+ new_vol=$((current_vol - 2))
+ [ "$new_vol" -lt 0 ] && new_vol=0
+ pactl set-sink-volume @DEFAULT_SINK@ "${new_vol}%"
+ ;;
+ esac
+}
+
+select_output() {
+ if [ "$@" ]; then
+ desc="$*"
+ device=$(pactl list sinks | grep -C2 -F "Description: $desc" | grep Name | cut -d: -f2 | xargs)
+ if pactl set-default-sink "$device"; then
+ notify-send -r 91190 "Activated: $desc"
+ else
+ notify-send -r 91190 "Error activating $desc"
+ fi
+ else
+ pactl list sinks | grep -ie "Description:" | awk -F ': ' '{print $2}' | sort
+ fi
+}
+
+# Evaluate device option
+while getopts iops: DeviceOpt; do
+ case "${DeviceOpt}" in
+ i)
+ nsink=$(pactl list sources short | awk '{print $2}')
+ [ -z "${nsink}" ] && echo "ERROR: Input device not found..." && exit 0
+ srce="--default-source"
+ ;;
+ o)
+ nsink=$(pactl list sinks short | awk '{print $2}')
+ [ -z "${nsink}" ] && echo "ERROR: Output device not found..." && exit 0
+ srce=""
+ ;;
+ p)
+ nsink=$(playerctl --list-all | grep -w "${OPTARG}")
+ [ -z "${nsink}" ] && echo "ERROR: Player ${OPTARG} not active..." && exit 0
+ # shellcheck disable=SC2034
+ srce="${nsink}"
+ ;;
+ s)
+ # Select an output device
+ select_output "$@"
+ exit
+ ;;
+ *) print_error ;;
+ esac
+done
+
+# Set default variables
+shift $((OPTIND - 1))
+
+# Execute action
+case "${1}" in
+i) action_volume i ;;
+d) action_volume d ;;
+m) pactl set-sink-mute @DEFAULT_SINK@ toggle && notify_mute && exit 0 ;;
+*) print_error ;;
+esac
+
+send_notification
diff --git a/waybar/scripts/wifi-menu.sh b/waybar/scripts/wifi-menu.sh
new file mode 100755
index 0000000..470722c
--- /dev/null
+++ b/waybar/scripts/wifi-menu.sh
@@ -0,0 +1,126 @@
+#!/usr/bin/env bash
+
+# Author: Jesse Mirabel (@sejjy)
+# GitHub: https://github.com/sejjy/mechabar
+
+# Rofi config
+config="$HOME/.config/rofi/wifi-menu.rasi"
+
+options=$(
+ echo " Manual Entry"
+ echo " Disable Wi-Fi"
+)
+option_disabled=" Enable Wi-Fi"
+
+# Rofi window override
+override_ssid="entry { placeholder: \"Enter SSID\"; } listview { lines: 0; padding: 20px 6px; }"
+override_password="entry { placeholder: \"Enter password\"; } listview { lines: 0; padding: 20px 6px; }"
+override_disabled="mainbox { children: [ textbox-custom, listview ]; } listview { lines: 1; padding: 6px 6px 8px; }"
+
+# Prompt for password
+get_password() {
+ rofi -dmenu -password -config "${config}" -theme-str "${override_password}" -p " " || pkill -x rofi
+}
+
+while true; do
+ wifi_list() {
+ nmcli --fields "SECURITY,SSID" device wifi list |
+ tail -n +2 | # Skip the header line from nmcli output
+ sed 's/ */ /g' | # Replace multiple spaces with a single space
+ sed -E "s/WPA*.?\S/ /g" | # Replace 'WPA*' with a Wi-Fi lock icon
+ sed "s/^--/ /g" | # Replace '--' (open networks) with an open Wi-Fi icon
+ sed "s/ //g" | # Remove duplicate Wi-Fi lock icons
+ sed "/--/d" | # Remove lines containing '--' (empty SSIDs)
+ awk '!seen[$0]++' # Filter out duplicate SSIDs
+ }
+
+ # Get Wi-Fi status
+ wifi_status=$(nmcli -fields WIFI g)
+
+ case "$wifi_status" in
+ *"enabled"*)
+ selected_option=$(echo "$options"$'\n'"$(wifi_list)" |
+ rofi -dmenu -i -selected-row 1 -config "${config}" -p " " || pkill -x rofi)
+ ;;
+ *"disabled"*)
+ selected_option=$(echo "$option_disabled" |
+ rofi -dmenu -i -config "${config}" -theme-str "${override_disabled}" || pkill -x rofi)
+ ;;
+ esac
+
+ # Extract selected SSID
+ read -r selected_ssid <<<"${selected_option:3}"
+
+ # Actions based on selected option
+ case "$selected_option" in
+ "")
+ exit
+ ;;
+ *"Enable Wi-Fi")
+ notify-send "Scanning for networks..." -i "package-installed-outdated"
+ nmcli radio wifi on
+ nmcli device wifi rescan
+ sleep 3
+ ;;
+ *"Disable Wi-Fi")
+ notify-send "Wi-Fi Disabled" -i "package-broken"
+ nmcli radio wifi off
+ exit
+ ;;
+ *"Manual Entry")
+ # Prompt for SSID
+ manual_ssid=$(rofi -dmenu -config "${config}" -theme-str "${override_ssid}" -p " " || pkill -x rofi)
+
+ # Exit if no option is selected
+ if [ -z "$manual_ssid" ]; then
+ exit
+ fi
+
+ # Prompt for Wi-Fi password
+ wifi_password=$(get_password)
+
+ if [ -z "$wifi_password" ]; then
+ # Without password
+ if nmcli device wifi connect "$manual_ssid" | grep -q "successfully"; then
+ notify-send "Connected to \"$manual_ssid\"." -i "package-installed-outdated"
+ exit
+ else
+ notify-send "Failed to connect to \"$manual_ssid\"." -i "package-broken"
+ fi
+ else
+ # With password
+ if nmcli device wifi connect "$manual_ssid" password "$wifi_password" | grep -q "successfully"; then
+ notify-send "Connected to \"$manual_ssid\"." -i "package-installed-outdated"
+ exit
+ else
+ notify-send "Failed to connect to \"$manual_ssid\"." -i "package-broken"
+ fi
+ fi
+ ;;
+ *)
+ # Get saved connections
+ saved_connections=$(nmcli -g NAME connection)
+
+ if echo "$saved_connections" | grep -qw "$selected_ssid"; then
+ if nmcli connection up id "$selected_ssid" | grep -q "successfully"; then
+ notify-send "Connected to \"$selected_ssid\"." -i "package-installed-outdated"
+ exit
+ else
+ notify-send "Failed to connect to \"$selected_ssid\"." -i "package-broken"
+ fi
+ else
+ # Handle secure network connection
+ if [[ "$selected_option" =~ ^"" ]]; then
+ wifi_password=$(get_password)
+ fi
+
+ if nmcli device wifi connect "$selected_ssid" password "$wifi_password" | grep -q "successfully"; then
+ notify-send "Connected to \"$selected_ssid\"." -i "package-installed-outdated"
+ exit
+ else
+ notify-send "Failed to connect to \"$selected_ssid\"." -i "package-broken"
+ fi
+ fi
+ ;;
+ esac
+done
diff --git a/waybar/scripts/wifi-status.sh b/waybar/scripts/wifi-status.sh
new file mode 100755
index 0000000..7a13711
--- /dev/null
+++ b/waybar/scripts/wifi-status.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+
+if ! command -v nmcli &>/dev/null; then
+ echo "{\"text\": \"\", \"tooltip\": \"nmcli utility is missing\"}"
+ exit 1
+fi
+
+# Check if Wi-Fi is enabled
+wifi_status=$(nmcli radio wifi)
+
+if [ "$wifi_status" = "disabled" ]; then
+ echo "{\"text\": \"\", \"tooltip\": \"Wi-Fi Disabled\"}"
+ exit 0
+fi
+
+wifi_info=$(nmcli -t -f active,ssid,signal,security dev wifi | grep "^yes")
+
+# If no ESSID is found, set a default value
+if [ -z "$wifi_info" ]; then
+ essid="No Connection"
+ signal=0
+ tooltip="No Connection"
+else
+ # Some defaults
+ ip_address="127.0.0.1"
+ security=$(echo "$wifi_info" | awk -F: '{print $4}')
+ signal=$(echo "$wifi_info" | awk -F: '{print $3}')
+
+ # Get active WiFi device, ignoring WireGuard interfaces (wg0, wg1, wg2)
+ active_device=$(nmcli -t -f DEVICE,TYPE,STATE device status |
+ grep -E 'wifi:connected$' |
+ grep -v -E '^(wg0|wg1|wg2):' |
+ awk -F: '{print $1}')
+
+ if [ -n "$active_device" ]; then
+ output=$(nmcli -e no -g ip4.address,ip4.gateway,general.hwaddr device show "$active_device")
+
+ ip_address=$(echo "$output" | sed -n '1p')
+
+ line=$(nmcli -e no -t -f active,bssid,chan,freq device wifi | grep "^yes")
+
+ chan=$(echo "$line" | awk -F':' '{print $8}')
+ freq=$(echo "$line" | awk -F':' '{print $9}')
+ chan="$chan ($freq)"
+
+ # Get the current Wi-Fi ESSID
+ essid=$(echo "$wifi_info" | awk -F: '{print $2}')
+
+ tooltip=":: ${essid}"
+ tooltip+="\nIP Address: ${ip_address}"
+ tooltip+="\nSecurity: ${security}"
+ tooltip+="\nChannel: ${chan}"
+ tooltip+="\nStrength: ${signal} / 100"
+ fi
+fi
+
+# Determine Wi-Fi icon based on signal strength
+if [ "$signal" -ge 80 ]; then
+ icon="" # Strong signal
+elif [ "$signal" -ge 60 ]; then
+ icon="" # Good signal
+elif [ "$signal" -ge 40 ]; then
+ icon="" # Weak signal
+elif [ "$signal" -ge 20 ]; then
+ icon="" # Very weak signal
+else
+ icon="" # No signal
+fi
+
+# Module and tooltip
+echo "{\"text\": \"${icon}\", \"tooltip\": \"${tooltip}\"}"
diff --git a/waybar/scripts/wireguard-status.sh b/waybar/scripts/wireguard-status.sh
new file mode 100755
index 0000000..2cca6cf
--- /dev/null
+++ b/waybar/scripts/wireguard-status.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+# WireGuard status using ip command (no wg show needed)
+ICON_ACTIVE="" # Shield with checkmark
+ICON_INACTIVE="" # Shield disabled
+
+# Get all WireGuard interfaces
+wg_interfaces=$(ip a | grep -o 'wg[0-9]\+' | sort -u)
+
+active_info=""
+tooltip="WireGuard Status"
+
+for interface in $wg_interfaces; do
+ # Check if interface has an IP address
+ ip_addr=$(ip -4 addr show dev "$interface" | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
+
+ if [ -n "$ip_addr" ]; then
+ # Interface is active
+ if [ -z "$active_info" ]; then
+ active_info="%{F#a3be8c}$ICON_ACTIVE%{F-} $interface:$ip_addr"
+ else
+ active_info+=" $interface:$ip_addr"
+ fi
+ tooltip+="\n\n$interface"
+ tooltip+="\nStatus: Active"
+ tooltip+="\nIP: $ip_addr"
+ else
+ # Interface exists but inactive
+ tooltip+="\n\n$interface"
+ tooltip+="\nStatus: Inactive"
+ fi
+done
+
+if [ -z "$wg_interfaces" ]; then
+ # No WireGuard interfaces found
+ echo "{\"text\":\"$ICON_INACTIVE\",\"tooltip\":\"No WireGuard interfaces configured\"}"
+elif [ -z "$active_info" ]; then
+ # Interfaces exist but none active
+ echo "{\"text\":\"$ICON_INACTIVE\",\"tooltip\":\"$tooltip\"}"
+else
+ # Active interfaces found
+ echo "{\"text\":\"$ICON_ACTIVE\",\"tooltip\":\"$tooltip\"}"
+fi
diff --git a/waybar/style.css b/waybar/style.css
new file mode 100644
index 0000000..0a44cfe
--- /dev/null
+++ b/waybar/style.css
@@ -0,0 +1,476 @@
+@import "theme.css";
+
+* {
+ min-height: 0;
+ border: none;
+ margin: 0;
+ padding: 0;
+}
+
+/* ----------------------------------------------------- MAIN BACKGROUND --- */
+
+window#waybar>box {
+ background: @main-bg;
+ margin: 2px;
+}
+
+/* --------------------------------------------------------- DROP SHADOW --- */
+
+window#waybar {
+ background: @shadow;
+}
+
+/* ------------------------------------------------------------ TOOLTIPS --- */
+
+tooltip {
+ background: @main-bg;
+ border: 1.5px solid @main-br;
+ border-radius: 8px;
+}
+
+tooltip label {
+ color: @main-fg;
+ margin: -1.5px 3px;
+}
+
+/* ---------------------------------------- WORKSPACE BUTTONS and LABELS --- */
+
+#workspaces button {
+ color: @module-fg;
+ border-radius: 8px;
+ box-shadow: none;
+ margin: 2px 0;
+ padding: 0 2px;
+ transition: none;
+}
+
+#workspaces button:hover {
+ color: @hover-fg;
+ background: @hover-bg;
+ text-shadow: none;
+}
+
+#workspaces button.active {
+ color: @active-fg;
+ background: @active-bg;
+ text-shadow: 0 0 2px rgba(0, 0, 0, 0.6);
+ box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.4);
+ margin: 2px;
+ padding: 0 6px;
+}
+
+/* ------------------------------------------------------------- GENERAL --- */
+
+#custom-ws,
+#workspaces,
+#window,
+#custom-temperature,
+#memory,
+#cpu,
+#idle_inhibitor,
+#clock,
+#custom-wifi,
+#custom-wireguard,
+#bluetooth,
+#custom-update,
+#mpris,
+#pulseaudio,
+#backlight,
+#battery,
+#custom-power {
+ opacity: 1;
+ color: @module-fg;
+ padding: 0 4px;
+}
+
+#custom-left1,
+#custom-left2,
+#custom-left3,
+#custom-left4,
+#custom-left5,
+#custom-left6,
+#custom-left7,
+#custom-left8 {
+ margin-bottom: 0;
+ text-shadow: -2px 0 2px rgba(0, 0, 0, 0.5);
+}
+
+#custom-right1,
+#custom-right2,
+#custom-right3,
+#custom-right4,
+#custom-right5 {
+ margin-bottom: 0;
+ padding-right: 3px;
+ text-shadow: 2px 0 2px rgba(0, 0, 0, 0.5);
+}
+
+/* ------------------------------------------------------------- MODULES --- */
+
+/* --------------------------------------------------------- window icon --- */
+
+#custom-ws {
+ background: @main-bg;
+}
+
+#custom-ws:hover {
+ color: @hover-fg;
+}
+
+/* ---------------------------------------------------------- workspaces --- */
+
+#custom-left1 {
+ color: @workspaces;
+ background: @main-bg;
+ margin-bottom: 0;
+ padding-left: 2px;
+}
+
+#workspaces {
+ background: @workspaces;
+}
+
+#custom-right1 {
+ color: @workspaces;
+ background: @main-bg;
+ text-shadow: 3px 0 2px rgba(0, 0, 0, 0.4);
+ margin-bottom: 0;
+}
+
+/* --------------------------------------------------------- temperature --- */
+
+#custom-paddc {
+ padding-right: 22px;
+}
+
+#custom-left2 {
+ color: @temperature;
+ background: @main-bg;
+ padding-left: 3px;
+}
+
+#custom-temperature {
+ background: @temperature;
+ padding: 0 0 0 1px;
+}
+
+/* -------------------------------------------------------------- memory --- */
+
+#custom-left3 {
+ color: @memory;
+ background: @temperature;
+ padding-left: 3px;
+}
+
+#memory {
+ background: @memory;
+ padding: 0 0 0 1px;
+}
+
+#memory.warning {
+ color: @warning;
+}
+
+#memory.critical {
+ color: @critical;
+}
+
+/* ----------------------------------------------------------------- cpu --- */
+
+#custom-left4 {
+ color: @cpu;
+ background: @memory;
+ padding-left: 3px;
+}
+
+#cpu {
+ background: @cpu;
+}
+
+#custom-leftin1 {
+ color: @cpu;
+ margin-bottom: -1px;
+}
+
+/* --------------------------------------------------------- distro icon --- */
+
+#custom-left5 {
+ color: @distro-bg;
+ background: @main-bg;
+ text-shadow: none;
+ margin-bottom: -2px;
+ padding-left: 3px;
+}
+
+#custom-distro {
+ color: @distro-fg;
+ background: @distro-bg;
+ margin: 0 -1px -2px 0;
+ padding: 0 0 0 3px;
+ text-shadow: 0 0 1.5px rgba(0, 0, 0, 1);
+}
+
+#custom-right2 {
+ color: @distro-bg;
+ background: @main-bg;
+ text-shadow: none;
+ margin-bottom: -2px;
+}
+
+/* ---------------------------------------------------------------- time --- */
+
+#custom-rightin1 {
+ color: @time;
+ margin-bottom: -1px;
+}
+
+#idle_inhibitor {
+ background: @time;
+ padding: 0 0 0 7px;
+}
+
+#idle_inhibitor:hover {
+ color: @hover-fg;
+}
+
+#clock.time {
+ background: @time;
+ margin-left: -2px;
+ padding: 0 3px 0 0;
+}
+
+#custom-right3 {
+ color: @time;
+ background: @date;
+}
+
+/* ---------------------------------------------------------------- date --- */
+
+#clock.date {
+ background: @date;
+}
+
+#clock.date:hover {
+ color: @hover-fg;
+}
+
+#custom-right4 {
+ color: @date;
+ background: @tray;
+}
+
+/* ---------------------------------------------------------------- tray --- */
+
+#custom-wifi {
+ background: @tray;
+ padding: 0 8px 0 5px;
+}
+
+#custom-wifi:hover {
+ color: @hover-fg;
+}
+
+#custom-wireguard {
+ background: @tray;
+ padding: 0 8px 0 5px;
+}
+
+#custom-wireguard:hover {
+ color: @hover-fg;
+}
+
+#bluetooth {
+ background: @tray;
+ padding-right: 5px;
+}
+
+#bluetooth:hover {
+ color: @hover-fg;
+}
+
+#custom-update {
+ padding-right: 8px;
+ background: @tray;
+}
+
+#custom-update:hover {
+ color: @hover-fg;
+}
+
+#custom-right5 {
+ color: @tray;
+ background: @main-bg;
+}
+
+/* ---------------------------------------------------------- media info --- */
+
+#mpris {
+ background: @main-bg;
+ padding: 0 8px 0;
+}
+
+#mpris:hover {
+ color: @hover-fg;
+}
+
+/*
+ output device
+*/
+
+#custom-left6 {
+ color: @pulseaudio;
+ background: @main-bg;
+ padding-left: 3px;
+}
+
+#pulseaudio {
+ background: @pulseaudio;
+}
+
+#pulseaudio:hover {
+ color: @hover-fg;
+}
+
+/* ---------------------------------------------------------- brightness --- */
+
+#custom-left7 {
+ color: @backlight;
+ background: @pulseaudio;
+ padding-left: 2px;
+}
+
+#backlight {
+ background: @backlight;
+}
+
+/* ------------------------------------------------------------- battery --- */
+
+#custom-left8 {
+ color: @battery;
+ background: @backlight;
+ padding-left: 2px;
+}
+
+#battery {
+ color: @module-fg;
+ background: @battery;
+}
+
+#battery.warning {
+ color: @warning;
+}
+
+#battery.critical {
+ color: @critical;
+}
+
+#battery.charging {
+ color: @charging;
+}
+
+/* -------------------------------------------------------- power button --- */
+
+#custom-leftin2 {
+ color: @battery;
+ background: @main-bg;
+ margin-bottom: -1px;
+}
+
+#custom-power {
+ color: @main-bg;
+ background: @power;
+ text-shadow: 0 0 2px rgba(0, 0, 0, 0.6);
+ box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.6);
+ border-radius: 10px;
+ margin: 2px 4px 2px 0;
+ padding: 0 6px 0 9px;
+}
+
+#custom-power:hover {
+ color: @hover-fg;
+ background: @hover-bg;
+ text-shadow: none;
+ box-shadow: none;
+}
+
+/* ---------------------------------------------------------- FONT SIZES --- */
+
+/*
+ NOTE: Be careful when changing font sizes, as they
+ can affect alignment.
+
+ Try adjusting whole numbers first, then refine with
+ decimals.
+
+ If you increase or decrease a value, make the same
+ change to all properties in this section to keep
+ the layout consistent.
+*/
+
+* {
+ font-family: "JetBrainsMono Nerd Font";
+ font-size: 10px;
+ font-weight: bold;
+}
+
+tooltip label,
+#window label,
+#mpris {
+ font-weight: normal;
+}
+
+/* ----------------------------------------------- left and right arrows --- */
+
+#custom-left1,
+#custom-left2,
+#custom-left3,
+#custom-left4,
+#custom-left5,
+#custom-left6,
+#custom-left7,
+#custom-left8,
+#custom-right1,
+#custom-right2,
+#custom-right3,
+#custom-right4,
+#custom-right5 {
+ font-size: 14.68px;
+}
+
+/* ---------------------------------------------- left and right inverse --- */
+
+#custom-leftin1,
+#custom-leftin2,
+#custom-rightin1 {
+ font-size: 15.5px;
+}
+
+/* -------------------------------------------------------------- distro --- */
+
+#custom-distro {
+ font-size: 14.6px;
+}
+
+#custom-left5,
+#custom-right2 {
+ font-size: 15.68px;
+}
+
+/*
+ Adjust these properties as well to keep the design
+ consistent.
+*/
+
+#workspaces button {
+ border-radius: 8px;
+ padding: 0 2px;
+}
+
+#workspaces button.active {
+ padding: 0 6px;
+}
+
+#custom-power {
+ border-radius: 10px;
+ padding: 0 6px 0 9px;
+}
diff --git a/waybar/theme.css b/waybar/theme.css
new file mode 100644
index 0000000..32ce8d7
--- /dev/null
+++ b/waybar/theme.css
@@ -0,0 +1,75 @@
+/* Gruvbox Dark */
+
+@define-color bg0_h #1d2021;
+@define-color bg0 #282828;
+@define-color bg1 #3c3836;
+@define-color bg2 #504945;
+@define-color bg3 #665c54;
+@define-color bg4 #7c6f64;
+@define-color gray #928374;
+@define-color fg4 #a89984;
+@define-color fg3 #bdae93;
+@define-color fg2 #d5c4a1;
+@define-color fg1 #ebdbb2;
+@define-color fg0 #fbf1c7;
+@define-color red #cc241d;
+@define-color bright_red #fb4934;
+@define-color green #98971a;
+@define-color bright_green #b8bb26;
+@define-color yellow #d79921;
+@define-color bright_yellow #fabd2f;
+@define-color blue #458588;
+@define-color bright_blue #83a598;
+@define-color purple #b16286;
+@define-color bright_purple #d3869b;
+@define-color aqua #689d6a;
+@define-color bright_aqua #8ec07c;
+@define-color orange #d65d0e;
+@define-color bright_orange #fe8019;
+
+@define-color white #ffffff;
+@define-color black #000000;
+
+/*
+ bg - background
+ fg - foreground
+ br - border
+*/
+
+/* Main Colors */
+
+@define-color shadow shade(@bg0_h, 0.5);
+@define-color main-fg @fg0;
+@define-color main-bg @bg0_h;
+@define-color main-br @fg0;
+
+@define-color active-bg @yellow;
+@define-color active-fg @bg0_h;
+
+@define-color hover-bg @bg2;
+@define-color hover-fg alpha(@fg0, 0.75);
+
+/* Module Colors */
+
+@define-color module-fg @fg0;
+@define-color workspaces @bg0;
+
+@define-color temperature @bg0;
+@define-color memory @bg1;
+@define-color cpu @bg2;
+@define-color distro-fg @black;
+@define-color distro-bg @yellow;
+@define-color time @bg2;
+@define-color date @bg1;
+@define-color tray @bg0;
+
+@define-color pulseaudio @bg0;
+@define-color backlight @bg1;
+@define-color battery @bg2;
+@define-color power @yellow;
+
+/* State Colors */
+
+@define-color warning @bright_orange;
+@define-color critical @bright_red;
+@define-color charging @fg0;
diff --git a/waybar/themes/css/catppuccin-frappe.css b/waybar/themes/css/catppuccin-frappe.css
new file mode 100644
index 0000000..a079f18
--- /dev/null
+++ b/waybar/themes/css/catppuccin-frappe.css
@@ -0,0 +1,75 @@
+/* Catppuccin Frappe */
+
+@define-color rosewater #f2d5cf;
+@define-color flamingo #eebebe;
+@define-color pink #f4b8e4;
+@define-color mauve #ca9ee6;
+@define-color red #e78284;
+@define-color maroon #ea999c;
+@define-color peach #ef9f76;
+@define-color yellow #e5c890;
+@define-color green #a6d189;
+@define-color teal #81c8be;
+@define-color sky #99d1db;
+@define-color sapphire #85c1dc;
+@define-color blue #8caaee;
+@define-color lavender #babbf1;
+@define-color text #c6d0f5;
+@define-color subtext1 #b5bfe2;
+@define-color subtext0 #a5adce;
+@define-color overlay2 #949cbb;
+@define-color overlay1 #838ba7;
+@define-color overlay0 #737994;
+@define-color surface2 #626880;
+@define-color surface1 #51576d;
+@define-color surface0 #414559;
+@define-color base #303446;
+@define-color mantle #292c3c;
+@define-color crust #232634;
+
+@define-color white #ffffff;
+@define-color black #000000;
+
+/*
+ bg - background
+ fg - foreground
+ br - border
+*/
+
+/* Main Colors */
+
+@define-color shadow shade(@crust, 0.5);
+@define-color main-fg @text;
+@define-color main-bg @crust;
+@define-color main-br @text;
+
+@define-color active-bg @overlay2;
+@define-color active-fg @crust;
+
+@define-color hover-bg @surface0;
+@define-color hover-fg alpha(@text, 0.75);
+
+/* Module Colors */
+
+@define-color module-fg @text;
+@define-color workspaces @mantle;
+
+@define-color temperature @mantle;
+@define-color memory @base;
+@define-color cpu @surface0;
+@define-color distro-fg @black;
+@define-color distro-bg @overlay2;
+@define-color time @surface0;
+@define-color date @base;
+@define-color tray @mantle;
+
+@define-color pulseaudio @mantle;
+@define-color backlight @base;
+@define-color battery @surface0;
+@define-color power @overlay2;
+
+/* State Colors */
+
+@define-color warning @yellow;
+@define-color critical @red;
+@define-color charging @text;
diff --git a/waybar/themes/css/catppuccin-latte.css b/waybar/themes/css/catppuccin-latte.css
new file mode 100644
index 0000000..ecd734f
--- /dev/null
+++ b/waybar/themes/css/catppuccin-latte.css
@@ -0,0 +1,75 @@
+/* Catppuccin Latte */
+
+@define-color rosewater #dc8a78;
+@define-color flamingo #dd7878;
+@define-color pink #ea76cb;
+@define-color mauve #8839ef;
+@define-color red #d20f39;
+@define-color maroon #e64553;
+@define-color peach #fe640b;
+@define-color yellow #df8e1d;
+@define-color green #40a02b;
+@define-color teal #179299;
+@define-color sky #04a5e5;
+@define-color sapphire #209fb5;
+@define-color blue #1e66f5;
+@define-color lavender #7287fd;
+@define-color text #4c4f69;
+@define-color subtext1 #5c5f77;
+@define-color subtext0 #6c6f85;
+@define-color overlay2 #7c7f93;
+@define-color overlay1 #8c8fa1;
+@define-color overlay0 #9ca0b0;
+@define-color surface2 #acb0be;
+@define-color surface1 #bcc0cc;
+@define-color surface0 #ccd0da;
+@define-color base #eff1f5;
+@define-color mantle #e6e9ef;
+@define-color crust #dce0e8;
+
+@define-color white #ffffff;
+@define-color black #000000;
+
+/*
+ bg - background
+ fg - foreground
+ br - border
+*/
+
+/* Main Colors */
+
+@define-color shadow shade(@crust, 0.5);
+@define-color main-fg @text;
+@define-color main-bg @crust;
+@define-color main-br @text;
+
+@define-color active-bg @overlay2;
+@define-color active-fg @crust;
+
+@define-color hover-bg @surface0;
+@define-color hover-fg alpha(@text, 0.75);
+
+/* Module Colors */
+
+@define-color module-fg @text;
+@define-color workspaces @mantle;
+
+@define-color temperature @mantle;
+@define-color memory @base;
+@define-color cpu @surface0;
+@define-color distro-fg @black;
+@define-color distro-bg @overlay2;
+@define-color time @surface0;
+@define-color date @base;
+@define-color tray @mantle;
+
+@define-color pulseaudio @mantle;
+@define-color backlight @base;
+@define-color battery @surface0;
+@define-color power @overlay2;
+
+/* State Colors */
+
+@define-color warning @yellow;
+@define-color critical @red;
+@define-color charging @text;
diff --git a/waybar/themes/css/catppuccin-macchiato.css b/waybar/themes/css/catppuccin-macchiato.css
new file mode 100644
index 0000000..cdc4737
--- /dev/null
+++ b/waybar/themes/css/catppuccin-macchiato.css
@@ -0,0 +1,75 @@
+/* Catppuccin Macchiato */
+
+@define-color rosewater #f4dbd6;
+@define-color flamingo #f0c6c6;
+@define-color pink #f5bde6;
+@define-color mauve #c6a0f6;
+@define-color red #ed8796;
+@define-color maroon #ee99a0;
+@define-color peach #f5a97f;
+@define-color yellow #eed49f;
+@define-color green #a6da95;
+@define-color teal #8bd5ca;
+@define-color sky #91d7e3;
+@define-color sapphire #7dc4e4;
+@define-color blue #8aadf4;
+@define-color lavender #b7bdf8;
+@define-color text #cad3f5;
+@define-color subtext1 #b8c0e0;
+@define-color subtext0 #a5adcb;
+@define-color overlay2 #939ab7;
+@define-color overlay1 #8087a2;
+@define-color overlay0 #6e738d;
+@define-color surface2 #5b6078;
+@define-color surface1 #494d64;
+@define-color surface0 #363a4f;
+@define-color base #24273a;
+@define-color mantle #1e2030;
+@define-color crust #181926;
+
+@define-color white #ffffff;
+@define-color black #000000;
+
+/*
+ bg - background
+ fg - foreground
+ br - border
+*/
+
+/* Main Colors */
+
+@define-color shadow shade(@crust, 0.5);
+@define-color main-fg @text;
+@define-color main-bg @crust;
+@define-color main-br @text;
+
+@define-color active-bg @overlay2;
+@define-color active-fg @crust;
+
+@define-color hover-bg @surface0;
+@define-color hover-fg alpha(@text, 0.75);
+
+/* Module Colors */
+
+@define-color module-fg @text;
+@define-color workspaces @mantle;
+
+@define-color temperature @mantle;
+@define-color memory @base;
+@define-color cpu @surface0;
+@define-color distro-fg @black;
+@define-color distro-bg @overlay2;
+@define-color time @surface0;
+@define-color date @base;
+@define-color tray @mantle;
+
+@define-color pulseaudio @mantle;
+@define-color backlight @base;
+@define-color battery @surface0;
+@define-color power @overlay2;
+
+/* State Colors */
+
+@define-color warning @yellow;
+@define-color critical @red;
+@define-color charging @text;
diff --git a/waybar/themes/css/catppuccin-mocha.css b/waybar/themes/css/catppuccin-mocha.css
new file mode 100644
index 0000000..244598f
--- /dev/null
+++ b/waybar/themes/css/catppuccin-mocha.css
@@ -0,0 +1,75 @@
+/* Catppuccin Mocha */
+
+@define-color rosewater #f5e0dc;
+@define-color flamingo #f2cdcd;
+@define-color pink #f5c2e7;
+@define-color mauve #cba6f7;
+@define-color red #f38ba8;
+@define-color maroon #eba0ac;
+@define-color peach #fab387;
+@define-color yellow #f9e2af;
+@define-color green #a6e3a1;
+@define-color teal #94e2d5;
+@define-color sky #89dceb;
+@define-color sapphire #74c7ec;
+@define-color blue #89b4fa;
+@define-color lavender #b4befe;
+@define-color text #cdd6f4;
+@define-color subtext1 #bac2de;
+@define-color subtext0 #a6adc8;
+@define-color overlay2 #9399b2;
+@define-color overlay1 #7f849c;
+@define-color overlay0 #6c7086;
+@define-color surface2 #585b70;
+@define-color surface1 #45475a;
+@define-color surface0 #313244;
+@define-color base #1e1e2e;
+@define-color mantle #181825;
+@define-color crust #11111b;
+
+@define-color white #ffffff;
+@define-color black #000000;
+
+/*
+ bg - background
+ fg - foreground
+ br - border
+*/
+
+/* Main Colors */
+
+@define-color shadow shade(@crust, 0.5);
+@define-color main-fg @text;
+@define-color main-bg @crust;
+@define-color main-br @text;
+
+@define-color active-bg @overlay2;
+@define-color active-fg @crust;
+
+@define-color hover-bg @surface0;
+@define-color hover-fg alpha(@text, 0.75);
+
+/* Module Colors */
+
+@define-color module-fg @text;
+@define-color workspaces @mantle;
+
+@define-color temperature @mantle;
+@define-color memory @base;
+@define-color cpu @surface0;
+@define-color distro-fg @black;
+@define-color distro-bg @overlay2;
+@define-color time @surface0;
+@define-color date @base;
+@define-color tray @mantle;
+
+@define-color pulseaudio @mantle;
+@define-color backlight @base;
+@define-color battery @surface0;
+@define-color power @overlay2;
+
+/* State Colors */
+
+@define-color warning @yellow;
+@define-color critical @red;
+@define-color charging @text;
diff --git a/waybar/themes/css/gruvbox-dark.css b/waybar/themes/css/gruvbox-dark.css
new file mode 100644
index 0000000..32ce8d7
--- /dev/null
+++ b/waybar/themes/css/gruvbox-dark.css
@@ -0,0 +1,75 @@
+/* Gruvbox Dark */
+
+@define-color bg0_h #1d2021;
+@define-color bg0 #282828;
+@define-color bg1 #3c3836;
+@define-color bg2 #504945;
+@define-color bg3 #665c54;
+@define-color bg4 #7c6f64;
+@define-color gray #928374;
+@define-color fg4 #a89984;
+@define-color fg3 #bdae93;
+@define-color fg2 #d5c4a1;
+@define-color fg1 #ebdbb2;
+@define-color fg0 #fbf1c7;
+@define-color red #cc241d;
+@define-color bright_red #fb4934;
+@define-color green #98971a;
+@define-color bright_green #b8bb26;
+@define-color yellow #d79921;
+@define-color bright_yellow #fabd2f;
+@define-color blue #458588;
+@define-color bright_blue #83a598;
+@define-color purple #b16286;
+@define-color bright_purple #d3869b;
+@define-color aqua #689d6a;
+@define-color bright_aqua #8ec07c;
+@define-color orange #d65d0e;
+@define-color bright_orange #fe8019;
+
+@define-color white #ffffff;
+@define-color black #000000;
+
+/*
+ bg - background
+ fg - foreground
+ br - border
+*/
+
+/* Main Colors */
+
+@define-color shadow shade(@bg0_h, 0.5);
+@define-color main-fg @fg0;
+@define-color main-bg @bg0_h;
+@define-color main-br @fg0;
+
+@define-color active-bg @yellow;
+@define-color active-fg @bg0_h;
+
+@define-color hover-bg @bg2;
+@define-color hover-fg alpha(@fg0, 0.75);
+
+/* Module Colors */
+
+@define-color module-fg @fg0;
+@define-color workspaces @bg0;
+
+@define-color temperature @bg0;
+@define-color memory @bg1;
+@define-color cpu @bg2;
+@define-color distro-fg @black;
+@define-color distro-bg @yellow;
+@define-color time @bg2;
+@define-color date @bg1;
+@define-color tray @bg0;
+
+@define-color pulseaudio @bg0;
+@define-color backlight @bg1;
+@define-color battery @bg2;
+@define-color power @yellow;
+
+/* State Colors */
+
+@define-color warning @bright_orange;
+@define-color critical @bright_red;
+@define-color charging @fg0;
diff --git a/waybar/themes/css/gruvbox-light.css b/waybar/themes/css/gruvbox-light.css
new file mode 100644
index 0000000..01db6d1
--- /dev/null
+++ b/waybar/themes/css/gruvbox-light.css
@@ -0,0 +1,75 @@
+/* Gruvbox Light */
+
+@define-color bg0_h #f9f5d7;
+@define-color bg0 #fbf1c7;
+@define-color bg1 #ebdbb2;
+@define-color bg2 #d5c4a1;
+@define-color bg3 #bdae93;
+@define-color bg4 #a89984;
+@define-color gray #928374;
+@define-color fg4 #7c6f64;
+@define-color fg3 #665c54;
+@define-color fg2 #504945;
+@define-color fg1 #3c3836;
+@define-color fg0 #282828;
+@define-color red #cc241d;
+@define-color bright_red #9d0006;
+@define-color green #98971a;
+@define-color bright_green #79740e;
+@define-color yellow #d79921;
+@define-color bright_yellow #b57614;
+@define-color blue #458588;
+@define-color bright_blue #076678;
+@define-color purple #b16286;
+@define-color bright_purple #8f3f71;
+@define-color aqua #689d6a;
+@define-color bright_aqua #427b58;
+@define-color orange #d65d0e;
+@define-color bright_orange #af3a03;
+
+@define-color white #ffffff;
+@define-color black #000000;
+
+/*
+ bg - background
+ fg - foreground
+ br - border
+*/
+
+/* Main Colors */
+
+@define-color shadow shade(@bg0_h, 0.5);
+@define-color main-fg @fg0;
+@define-color main-bg @bg0_h;
+@define-color main-br @fg0;
+
+@define-color active-bg @yellow;
+@define-color active-fg @bg0_h;
+
+@define-color hover-bg @bg2;
+@define-color hover-fg alpha(@fg0, 0.75);
+
+/* Module Colors */
+
+@define-color module-fg @fg0;
+@define-color workspaces @bg0;
+
+@define-color temperature @bg0;
+@define-color memory @bg1;
+@define-color cpu @bg2;
+@define-color distro-fg @black;
+@define-color distro-bg @yellow;
+@define-color time @bg2;
+@define-color date @bg1;
+@define-color tray @bg0;
+
+@define-color pulseaudio @bg0;
+@define-color backlight @bg1;
+@define-color battery @bg2;
+@define-color power @yellow;
+
+/* State Colors */
+
+@define-color warning @bright_orange;
+@define-color critical @bright_red;
+@define-color charging @fg0;
diff --git a/waybar/themes/current-theme b/waybar/themes/current-theme
new file mode 100644
index 0000000..6a7a63c
--- /dev/null
+++ b/waybar/themes/current-theme
@@ -0,0 +1 @@
+/home/saeijou/.config/waybar/themes/css/gruvbox-dark.css
diff --git a/waybar/themes/jsonc/catppuccin-frappe.jsonc b/waybar/themes/jsonc/catppuccin-frappe.jsonc
new file mode 100644
index 0000000..d740ef9
--- /dev/null
+++ b/waybar/themes/jsonc/catppuccin-frappe.jsonc
@@ -0,0 +1,478 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mode": "dock",
+ "reload_style_on_change": true,
+ "gtk-layer-shell": true,
+
+ // <<--< Positions >-->>
+
+ "modules-left": [
+ "custom/ws", // window icon
+ "custom/left1",
+
+ "hyprland/workspaces", // workspaces
+ "custom/right1",
+
+ "custom/paddw",
+ "hyprland/window" // window title
+ ],
+
+ "modules-center": [
+ "custom/paddc",
+ "custom/left2",
+ "custom/temperature", // temperature
+
+ "custom/left3",
+ "memory", // memory
+
+ "custom/left4",
+ "cpu", // cpu
+ "custom/leftin1",
+
+ "custom/left5",
+ "custom/distro", // distro icon
+ "custom/right2",
+
+ "custom/rightin1",
+ "idle_inhibitor", // idle inhibitor
+ "clock#time", // time
+ "custom/right3",
+
+ "clock#date", // date
+ "custom/right4",
+
+ "custom/wifi", // wi-fi
+ "bluetooth", // bluetooth
+ "custom/update", // system update
+ "custom/right5"
+ ],
+
+ "modules-right": [
+ "mpris", // media info
+
+ "custom/left6",
+ "pulseaudio", // output device
+
+ "custom/left7",
+ "backlight", // brightness
+
+ "custom/left8",
+ "battery", // battery
+
+ "custom/leftin2",
+ "custom/power" // power button
+ ],
+
+ // <<--< Modules >-->>
+
+ "custom/ws": {
+ "exec": "~/.config/waybar/scripts/current-theme.sh",
+ "return-type": "json",
+ "format": " ",
+ "on-click": "~/.config/waybar/scripts/theme-switcher.sh",
+ "min-length": 3,
+ "max-length": 3
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace -1",
+ "on-scroll-down": "hyprctl dispatch workspace +1",
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": []
+ }
+ },
+
+ "hyprland/window": {
+ "format": "{}",
+ "tooltip": false,
+ "min-length": 5,
+
+ "rewrite": {
+ // Desktop
+ "":
+ " Hyprland",
+
+ // Terminal
+ "~": " Terminal",
+ "zsh": " Terminal",
+ "kitty": " Terminal",
+
+ "tmux(.*)":
+ " Tmux",
+
+ // Browser
+
+ "(.*)Mozilla Firefox":
+ " Firefox",
+ "(.*) — Mozilla Firefox":
+ " $1",
+
+ "(.*)Zen Browser":
+ " Zen Browser",
+ "(.*) — Zen Browser":
+ " $1",
+
+ // Development
+
+ "(.*) - Visual Studio Code":
+ " $1",
+ "(.*)Visual Studio Code":
+ " Visual Studio Code",
+
+ "nvim":
+ " Neovim",
+ "nvim (.*)":
+ " $1",
+
+ "vim":
+ " Vim",
+ "vim (.*)":
+ " $1",
+
+ // Media
+
+ "(.*)Spotify":
+ " Spotify",
+ "(.*)Spotify Premium":
+ " Spotify Premium",
+
+ "OBS(.*)":
+ " OBS Studio",
+
+ "VLC media player":
+ " VLC Media Player",
+ "(.*) - VLC media player":
+ " $1",
+
+ "(.*) - mpv":
+ " $1",
+
+ "qView": " qView",
+
+ "(.*).jpg": " $1.jpg",
+ "(.*).png": " $1.png",
+ "(.*).svg": " $1.svg",
+
+ // Social
+
+ "vesktop":
+ " Discord",
+
+ "• Discord(.*)": "Discord$1",
+ "(.*)Discord(.*)":
+ " $1Discord$2",
+
+ // Documents
+
+ "ONLYOFFICE Desktop Editors":
+ " OnlyOffice Desktop",
+
+ "(.*).docx":
+ " $1.docx",
+ "(.*).xlsx":
+ " $1.xlsx",
+ "(.*).pptx":
+ " $1.pptx",
+ "(.*).pdf":
+ " $1.pdf",
+
+ // System
+ "Authenticate": " Authenticate"
+ }
+ },
+
+ "custom/temperature": {
+ "exec": "~/.config/waybar/scripts/cpu-temp.sh",
+ "return-type": "json",
+ "format": "{}",
+ "interval": 5,
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "memory": {
+ "states": {
+ "warning": 75,
+ "critical": 90
+ },
+
+ "format": " {percentage}%",
+ "format-critical": " {percentage}%",
+ "tooltip": false,
+ // "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB",
+ "interval": 5,
+ "min-length": 7,
+ "max-length": 7
+ },
+
+ "cpu": {
+ "format": " {usage}%",
+ "tooltip": false,
+ "interval": 5,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/distro": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+
+ "format-icons": {
+ "activated": " ",
+ "deactivated": " "
+ },
+
+ "tooltip-format-activated": "Presentation Mode",
+ "tooltip-format-deactivated": "Idle Mode",
+ "start-activated": false
+ },
+
+ "clock#time": {
+ "format": "{:%H:%M}",
+ "tooltip": false,
+ // "tooltip-format": "Standard Time: {:%I:%M %p}",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "clock#date": {
+ "format": " {:%m-%d}",
+ "tooltip-format": "{calendar}",
+
+ "calendar": {
+ "mode": "month",
+ "mode-mon-col": 6,
+ "on-click-right": "mode",
+
+ "format": {
+ "months":
+ "{}",
+ "weekdays":
+ "{}",
+ "today":
+ "{}"
+ }
+ },
+
+ "actions": {
+ "on-click": "mode",
+ "on-click-right": "mode"
+ },
+
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "custom/wifi": {
+ "exec": "~/.config/waybar/scripts/wifi-status.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "~/.config/waybar/scripts/wifi-menu.sh",
+ "on-click-right": "kitty --title ' Network Manager TUI' bash -c nmtui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "bluetooth": {
+ "format": "",
+ "format-disabled": "",
+ "format-connected": "",
+ "format-connected-battery": "",
+
+ "tooltip-format":
+ "{num_connections} connected",
+ "tooltip-format-disabled":
+ "Bluetooth Disabled",
+ "tooltip-format-connected":
+ "{device_enumerate}",
+ "tooltip-format-enumerate-connected":
+ "{device_alias}",
+ "tooltip-format-enumerate-connected-battery":
+ ":: {device_alias}: {device_battery_percentage}%",
+
+ "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh",
+ "on-click-right": "kitty --title ' Bluetooth TUI' bash -c bluetui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/update": {
+ "exec": "~/.config/waybar/scripts/system-update.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'",
+ "interval": 30,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "mpris": {
+ "format": "{player_icon} {title} - {artist}",
+ "format-paused": "{status_icon} {title} - {artist}",
+
+ "player-icons": {
+ "default": " ",
+ "spotify": " ",
+ "firefox": " "
+ },
+ "status-icons": {
+ "paused": "\u200A\u200A\u2009\u2009"
+ },
+
+ "tooltip-format": "Playing: {title} - {artist}",
+ "tooltip-format-paused": "Paused: {title} - {artist}",
+ "min-length": 5,
+ "max-length": 35
+ },
+
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "format-muted": " {volume}%",
+
+ "format-icons": {
+ "default": ["", "", ""],
+ "headphone": "",
+ "headset": ""
+ },
+
+ "tooltip-format": "Device: {desc}",
+ "on-click": "~/.config/waybar/scripts/volume-control.sh -o m",
+ "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "backlight": {
+ "format": "{icon} {percent}%",
+ "format-icons": ["", "", "", "", "", "", "", "", ""],
+ "tooltip": false,
+ "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 10
+ },
+
+ "format": "{icon} {capacity}%",
+ "format-icons": ["", "", "", "", "", "", "", "", "", ""],
+ "format-charging": " {capacity}%",
+
+ "tooltip-format": "Discharging: {time}",
+ "tooltip-format-charging": "Charging: {time}",
+ "interval": 1,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/power": {
+ "format": " ",
+ "tooltip": false,
+ // "tooltip-format": "Power Menu",
+ "on-click": "~/.config/waybar/scripts/power-menu.sh"
+ },
+
+ // <<--< Padding >-->>
+
+ "custom/paddw": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "custom/paddc": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ // Left Arrows
+
+ "custom/left1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left5": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left6": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left7": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left8": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Arrows
+
+ "custom/right1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right5": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Left Inverse
+
+ "custom/leftin1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/leftin2": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Inverse
+
+ "custom/rightin1": {
+ "format": "",
+ "tooltip": false
+ }
+}
diff --git a/waybar/themes/jsonc/catppuccin-latte.jsonc b/waybar/themes/jsonc/catppuccin-latte.jsonc
new file mode 100644
index 0000000..a76e81f
--- /dev/null
+++ b/waybar/themes/jsonc/catppuccin-latte.jsonc
@@ -0,0 +1,478 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mode": "dock",
+ "reload_style_on_change": true,
+ "gtk-layer-shell": true,
+
+ // <<--< Positions >-->>
+
+ "modules-left": [
+ "custom/ws", // window icon
+ "custom/left1",
+
+ "hyprland/workspaces", // workspaces
+ "custom/right1",
+
+ "custom/paddw",
+ "hyprland/window" // window title
+ ],
+
+ "modules-center": [
+ "custom/paddc",
+ "custom/left2",
+ "custom/temperature", // temperature
+
+ "custom/left3",
+ "memory", // memory
+
+ "custom/left4",
+ "cpu", // cpu
+ "custom/leftin1",
+
+ "custom/left5",
+ "custom/distro", // distro icon
+ "custom/right2",
+
+ "custom/rightin1",
+ "idle_inhibitor", // idle inhibitor
+ "clock#time", // time
+ "custom/right3",
+
+ "clock#date", // date
+ "custom/right4",
+
+ "custom/wifi", // wi-fi
+ "bluetooth", // bluetooth
+ "custom/update", // system update
+ "custom/right5"
+ ],
+
+ "modules-right": [
+ "mpris", // media info
+
+ "custom/left6",
+ "pulseaudio", // output device
+
+ "custom/left7",
+ "backlight", // brightness
+
+ "custom/left8",
+ "battery", // battery
+
+ "custom/leftin2",
+ "custom/power" // power button
+ ],
+
+ // <<--< Modules >-->>
+
+ "custom/ws": {
+ "exec": "~/.config/waybar/scripts/current-theme.sh",
+ "return-type": "json",
+ "format": " ",
+ "on-click": "~/.config/waybar/scripts/theme-switcher.sh",
+ "min-length": 3,
+ "max-length": 3
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace -1",
+ "on-scroll-down": "hyprctl dispatch workspace +1",
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": []
+ }
+ },
+
+ "hyprland/window": {
+ "format": "{}",
+ "tooltip": false,
+ "min-length": 5,
+
+ "rewrite": {
+ // Desktop
+ "":
+ " Hyprland",
+
+ // Terminal
+ "~": " Terminal",
+ "zsh": " Terminal",
+ "kitty": " Terminal",
+
+ "tmux(.*)":
+ " Tmux",
+
+ // Browser
+
+ "(.*)Mozilla Firefox":
+ " Firefox",
+ "(.*) — Mozilla Firefox":
+ " $1",
+
+ "(.*)Zen Browser":
+ " Zen Browser",
+ "(.*) — Zen Browser":
+ " $1",
+
+ // Development
+
+ "(.*) - Visual Studio Code":
+ " $1",
+ "(.*)Visual Studio Code":
+ " Visual Studio Code",
+
+ "nvim":
+ " Neovim",
+ "nvim (.*)":
+ " $1",
+
+ "vim":
+ " Vim",
+ "vim (.*)":
+ " $1",
+
+ // Media
+
+ "(.*)Spotify":
+ " Spotify",
+ "(.*)Spotify Premium":
+ " Spotify Premium",
+
+ "OBS(.*)":
+ " OBS Studio",
+
+ "VLC media player":
+ " VLC Media Player",
+ "(.*) - VLC media player":
+ " $1",
+
+ "(.*) - mpv":
+ " $1",
+
+ "qView": " qView",
+
+ "(.*).jpg": " $1.jpg",
+ "(.*).png": " $1.png",
+ "(.*).svg": " $1.svg",
+
+ // Social
+
+ "vesktop":
+ " Discord",
+
+ "• Discord(.*)": "Discord$1",
+ "(.*)Discord(.*)":
+ " $1Discord$2",
+
+ // Documents
+
+ "ONLYOFFICE Desktop Editors":
+ " OnlyOffice Desktop",
+
+ "(.*).docx":
+ " $1.docx",
+ "(.*).xlsx":
+ " $1.xlsx",
+ "(.*).pptx":
+ " $1.pptx",
+ "(.*).pdf":
+ " $1.pdf",
+
+ // System
+ "Authenticate": " Authenticate"
+ }
+ },
+
+ "custom/temperature": {
+ "exec": "~/.config/waybar/scripts/cpu-temp.sh",
+ "return-type": "json",
+ "format": "{}",
+ "interval": 5,
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "memory": {
+ "states": {
+ "warning": 75,
+ "critical": 90
+ },
+
+ "format": " {percentage}%",
+ "format-critical": " {percentage}%",
+ "tooltip": false,
+ // "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB",
+ "interval": 5,
+ "min-length": 7,
+ "max-length": 7
+ },
+
+ "cpu": {
+ "format": " {usage}%",
+ "tooltip": false,
+ "interval": 5,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/distro": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+
+ "format-icons": {
+ "activated": " ",
+ "deactivated": " "
+ },
+
+ "tooltip-format-activated": "Presentation Mode",
+ "tooltip-format-deactivated": "Idle Mode",
+ "start-activated": false
+ },
+
+ "clock#time": {
+ "format": "{:%H:%M}",
+ "tooltip": false,
+ // "tooltip-format": "Standard Time: {:%I:%M %p}",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "clock#date": {
+ "format": " {:%m-%d}",
+ "tooltip-format": "{calendar}",
+
+ "calendar": {
+ "mode": "month",
+ "mode-mon-col": 6,
+ "on-click-right": "mode",
+
+ "format": {
+ "months":
+ "{}",
+ "weekdays":
+ "{}",
+ "today":
+ "{}"
+ }
+ },
+
+ "actions": {
+ "on-click": "mode",
+ "on-click-right": "mode"
+ },
+
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "custom/wifi": {
+ "exec": "~/.config/waybar/scripts/wifi-status.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "~/.config/waybar/scripts/wifi-menu.sh",
+ "on-click-right": "kitty --title ' Network Manager TUI' bash -c nmtui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "bluetooth": {
+ "format": "",
+ "format-disabled": "",
+ "format-connected": "",
+ "format-connected-battery": "",
+
+ "tooltip-format":
+ "{num_connections} connected",
+ "tooltip-format-disabled":
+ "Bluetooth Disabled",
+ "tooltip-format-connected":
+ "{device_enumerate}",
+ "tooltip-format-enumerate-connected":
+ "{device_alias}",
+ "tooltip-format-enumerate-connected-battery":
+ ":: {device_alias}: {device_battery_percentage}%",
+
+ "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh",
+ "on-click-right": "kitty --title ' Bluetooth TUI' bash -c bluetui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/update": {
+ "exec": "~/.config/waybar/scripts/system-update.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'",
+ "interval": 30,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "mpris": {
+ "format": "{player_icon} {title} - {artist}",
+ "format-paused": "{status_icon} {title} - {artist}",
+
+ "player-icons": {
+ "default": " ",
+ "spotify": " ",
+ "firefox": " "
+ },
+ "status-icons": {
+ "paused": "\u200A\u200A\u2009\u2009"
+ },
+
+ "tooltip-format": "Playing: {title} - {artist}",
+ "tooltip-format-paused": "Paused: {title} - {artist}",
+ "min-length": 5,
+ "max-length": 35
+ },
+
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "format-muted": " {volume}%",
+
+ "format-icons": {
+ "default": ["", "", ""],
+ "headphone": "",
+ "headset": ""
+ },
+
+ "tooltip-format": "Device: {desc}",
+ "on-click": "~/.config/waybar/scripts/volume-control.sh -o m",
+ "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "backlight": {
+ "format": "{icon} {percent}%",
+ "format-icons": ["", "", "", "", "", "", "", "", ""],
+ "tooltip": false,
+ "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 10
+ },
+
+ "format": "{icon} {capacity}%",
+ "format-icons": ["", "", "", "", "", "", "", "", "", ""],
+ "format-charging": " {capacity}%",
+
+ "tooltip-format": "Discharging: {time}",
+ "tooltip-format-charging": "Charging: {time}",
+ "interval": 1,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/power": {
+ "format": " ",
+ "tooltip": false,
+ // "tooltip-format": "Power Menu",
+ "on-click": "~/.config/waybar/scripts/power-menu.sh"
+ },
+
+ // <<--< Padding >-->>
+
+ "custom/paddw": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "custom/paddc": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ // Left Arrows
+
+ "custom/left1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left5": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left6": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left7": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left8": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Arrows
+
+ "custom/right1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right5": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Left Inverse
+
+ "custom/leftin1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/leftin2": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Inverse
+
+ "custom/rightin1": {
+ "format": "",
+ "tooltip": false
+ }
+}
diff --git a/waybar/themes/jsonc/catppuccin-macchiato.jsonc b/waybar/themes/jsonc/catppuccin-macchiato.jsonc
new file mode 100644
index 0000000..86194e0
--- /dev/null
+++ b/waybar/themes/jsonc/catppuccin-macchiato.jsonc
@@ -0,0 +1,478 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mode": "dock",
+ "reload_style_on_change": true,
+ "gtk-layer-shell": true,
+
+ // <<--< Positions >-->>
+
+ "modules-left": [
+ "custom/ws", // window icon
+ "custom/left1",
+
+ "hyprland/workspaces", // workspaces
+ "custom/right1",
+
+ "custom/paddw",
+ "hyprland/window" // window title
+ ],
+
+ "modules-center": [
+ "custom/paddc",
+ "custom/left2",
+ "custom/temperature", // temperature
+
+ "custom/left3",
+ "memory", // memory
+
+ "custom/left4",
+ "cpu", // cpu
+ "custom/leftin1",
+
+ "custom/left5",
+ "custom/distro", // distro icon
+ "custom/right2",
+
+ "custom/rightin1",
+ "idle_inhibitor", // idle inhibitor
+ "clock#time", // time
+ "custom/right3",
+
+ "clock#date", // date
+ "custom/right4",
+
+ "custom/wifi", // wi-fi
+ "bluetooth", // bluetooth
+ "custom/update", // system update
+ "custom/right5"
+ ],
+
+ "modules-right": [
+ "mpris", // media info
+
+ "custom/left6",
+ "pulseaudio", // output device
+
+ "custom/left7",
+ "backlight", // brightness
+
+ "custom/left8",
+ "battery", // battery
+
+ "custom/leftin2",
+ "custom/power" // power button
+ ],
+
+ // <<--< Modules >-->>
+
+ "custom/ws": {
+ "exec": "~/.config/waybar/scripts/current-theme.sh",
+ "return-type": "json",
+ "format": " ",
+ "on-click": "~/.config/waybar/scripts/theme-switcher.sh",
+ "min-length": 3,
+ "max-length": 3
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace -1",
+ "on-scroll-down": "hyprctl dispatch workspace +1",
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": []
+ }
+ },
+
+ "hyprland/window": {
+ "format": "{}",
+ "tooltip": false,
+ "min-length": 5,
+
+ "rewrite": {
+ // Desktop
+ "":
+ " Hyprland",
+
+ // Terminal
+ "~": " Terminal",
+ "zsh": " Terminal",
+ "kitty": " Terminal",
+
+ "tmux(.*)":
+ " Tmux",
+
+ // Browser
+
+ "(.*)Mozilla Firefox":
+ " Firefox",
+ "(.*) — Mozilla Firefox":
+ " $1",
+
+ "(.*)Zen Browser":
+ " Zen Browser",
+ "(.*) — Zen Browser":
+ " $1",
+
+ // Development
+
+ "(.*) - Visual Studio Code":
+ " $1",
+ "(.*)Visual Studio Code":
+ " Visual Studio Code",
+
+ "nvim":
+ " Neovim",
+ "nvim (.*)":
+ " $1",
+
+ "vim":
+ " Vim",
+ "vim (.*)":
+ " $1",
+
+ // Media
+
+ "(.*)Spotify":
+ " Spotify",
+ "(.*)Spotify Premium":
+ " Spotify Premium",
+
+ "OBS(.*)":
+ " OBS Studio",
+
+ "VLC media player":
+ " VLC Media Player",
+ "(.*) - VLC media player":
+ " $1",
+
+ "(.*) - mpv":
+ " $1",
+
+ "qView": " qView",
+
+ "(.*).jpg": " $1.jpg",
+ "(.*).png": " $1.png",
+ "(.*).svg": " $1.svg",
+
+ // Social
+
+ "vesktop":
+ " Discord",
+
+ "• Discord(.*)": "Discord$1",
+ "(.*)Discord(.*)":
+ " $1Discord$2",
+
+ // Documents
+
+ "ONLYOFFICE Desktop Editors":
+ " OnlyOffice Desktop",
+
+ "(.*).docx":
+ " $1.docx",
+ "(.*).xlsx":
+ " $1.xlsx",
+ "(.*).pptx":
+ " $1.pptx",
+ "(.*).pdf":
+ " $1.pdf",
+
+ // System
+ "Authenticate": " Authenticate"
+ }
+ },
+
+ "custom/temperature": {
+ "exec": "~/.config/waybar/scripts/cpu-temp.sh",
+ "return-type": "json",
+ "format": "{}",
+ "interval": 5,
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "memory": {
+ "states": {
+ "warning": 75,
+ "critical": 90
+ },
+
+ "format": " {percentage}%",
+ "format-critical": " {percentage}%",
+ "tooltip": false,
+ // "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB",
+ "interval": 5,
+ "min-length": 7,
+ "max-length": 7
+ },
+
+ "cpu": {
+ "format": " {usage}%",
+ "tooltip": false,
+ "interval": 5,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/distro": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+
+ "format-icons": {
+ "activated": " ",
+ "deactivated": " "
+ },
+
+ "tooltip-format-activated": "Presentation Mode",
+ "tooltip-format-deactivated": "Idle Mode",
+ "start-activated": false
+ },
+
+ "clock#time": {
+ "format": "{:%H:%M}",
+ "tooltip": false,
+ // "tooltip-format": "Standard Time: {:%I:%M %p}",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "clock#date": {
+ "format": " {:%m-%d}",
+ "tooltip-format": "{calendar}",
+
+ "calendar": {
+ "mode": "month",
+ "mode-mon-col": 6,
+ "on-click-right": "mode",
+
+ "format": {
+ "months":
+ "{}",
+ "weekdays":
+ "{}",
+ "today":
+ "{}"
+ }
+ },
+
+ "actions": {
+ "on-click": "mode",
+ "on-click-right": "mode"
+ },
+
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "custom/wifi": {
+ "exec": "~/.config/waybar/scripts/wifi-status.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "~/.config/waybar/scripts/wifi-menu.sh",
+ "on-click-right": "kitty --title ' Network Manager TUI' bash -c nmtui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "bluetooth": {
+ "format": "",
+ "format-disabled": "",
+ "format-connected": "",
+ "format-connected-battery": "",
+
+ "tooltip-format":
+ "{num_connections} connected",
+ "tooltip-format-disabled":
+ "Bluetooth Disabled",
+ "tooltip-format-connected":
+ "{device_enumerate}",
+ "tooltip-format-enumerate-connected":
+ "{device_alias}",
+ "tooltip-format-enumerate-connected-battery":
+ ":: {device_alias}: {device_battery_percentage}%",
+
+ "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh",
+ "on-click-right": "kitty --title ' Bluetooth TUI' bash -c bluetui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/update": {
+ "exec": "~/.config/waybar/scripts/system-update.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'",
+ "interval": 30,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "mpris": {
+ "format": "{player_icon} {title} - {artist}",
+ "format-paused": "{status_icon} {title} - {artist}",
+
+ "player-icons": {
+ "default": " ",
+ "spotify": " ",
+ "firefox": " "
+ },
+ "status-icons": {
+ "paused": "\u200A\u200A\u2009\u2009"
+ },
+
+ "tooltip-format": "Playing: {title} - {artist}",
+ "tooltip-format-paused": "Paused: {title} - {artist}",
+ "min-length": 5,
+ "max-length": 35
+ },
+
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "format-muted": " {volume}%",
+
+ "format-icons": {
+ "default": ["", "", ""],
+ "headphone": "",
+ "headset": ""
+ },
+
+ "tooltip-format": "Device: {desc}",
+ "on-click": "~/.config/waybar/scripts/volume-control.sh -o m",
+ "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "backlight": {
+ "format": "{icon} {percent}%",
+ "format-icons": ["", "", "", "", "", "", "", "", ""],
+ "tooltip": false,
+ "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 10
+ },
+
+ "format": "{icon} {capacity}%",
+ "format-icons": ["", "", "", "", "", "", "", "", "", ""],
+ "format-charging": " {capacity}%",
+
+ "tooltip-format": "Discharging: {time}",
+ "tooltip-format-charging": "Charging: {time}",
+ "interval": 1,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/power": {
+ "format": " ",
+ "tooltip": false,
+ // "tooltip-format": "Power Menu",
+ "on-click": "~/.config/waybar/scripts/power-menu.sh"
+ },
+
+ // <<--< Padding >-->>
+
+ "custom/paddw": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "custom/paddc": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ // Left Arrows
+
+ "custom/left1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left5": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left6": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left7": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left8": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Arrows
+
+ "custom/right1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right5": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Left Inverse
+
+ "custom/leftin1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/leftin2": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Inverse
+
+ "custom/rightin1": {
+ "format": "",
+ "tooltip": false
+ }
+}
diff --git a/waybar/themes/jsonc/catppuccin-mocha.jsonc b/waybar/themes/jsonc/catppuccin-mocha.jsonc
new file mode 100644
index 0000000..4125b3d
--- /dev/null
+++ b/waybar/themes/jsonc/catppuccin-mocha.jsonc
@@ -0,0 +1,478 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mode": "dock",
+ "reload_style_on_change": true,
+ "gtk-layer-shell": true,
+
+ // <<--< Positions >-->>
+
+ "modules-left": [
+ "custom/ws", // window icon
+ "custom/left1",
+
+ "hyprland/workspaces", // workspaces
+ "custom/right1",
+
+ "custom/paddw",
+ "hyprland/window" // window title
+ ],
+
+ "modules-center": [
+ "custom/paddc",
+ "custom/left2",
+ "custom/temperature", // temperature
+
+ "custom/left3",
+ "memory", // memory
+
+ "custom/left4",
+ "cpu", // cpu
+ "custom/leftin1",
+
+ "custom/left5",
+ "custom/distro", // distro icon
+ "custom/right2",
+
+ "custom/rightin1",
+ "idle_inhibitor", // idle inhibitor
+ "clock#time", // time
+ "custom/right3",
+
+ "clock#date", // date
+ "custom/right4",
+
+ "custom/wifi", // wi-fi
+ "bluetooth", // bluetooth
+ "custom/update", // system update
+ "custom/right5"
+ ],
+
+ "modules-right": [
+ "mpris", // media info
+
+ "custom/left6",
+ "pulseaudio", // output device
+
+ "custom/left7",
+ "backlight", // brightness
+
+ "custom/left8",
+ "battery", // battery
+
+ "custom/leftin2",
+ "custom/power" // power button
+ ],
+
+ // <<--< Modules >-->>
+
+ "custom/ws": {
+ "exec": "~/.config/waybar/scripts/current-theme.sh",
+ "return-type": "json",
+ "format": " ",
+ "on-click": "~/.config/waybar/scripts/theme-switcher.sh",
+ "min-length": 3,
+ "max-length": 3
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace -1",
+ "on-scroll-down": "hyprctl dispatch workspace +1",
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": []
+ }
+ },
+
+ "hyprland/window": {
+ "format": "{}",
+ "tooltip": false,
+ "min-length": 5,
+
+ "rewrite": {
+ // Desktop
+ "":
+ " Hyprland",
+
+ // Terminal
+ "~": " Terminal",
+ "zsh": " Terminal",
+ "kitty": " Terminal",
+
+ "tmux(.*)":
+ " Tmux",
+
+ // Browser
+
+ "(.*)Mozilla Firefox":
+ " Firefox",
+ "(.*) — Mozilla Firefox":
+ " $1",
+
+ "(.*)Zen Browser":
+ " Zen Browser",
+ "(.*) — Zen Browser":
+ " $1",
+
+ // Development
+
+ "(.*) - Visual Studio Code":
+ " $1",
+ "(.*)Visual Studio Code":
+ " Visual Studio Code",
+
+ "nvim":
+ " Neovim",
+ "nvim (.*)":
+ " $1",
+
+ "vim":
+ " Vim",
+ "vim (.*)":
+ " $1",
+
+ // Media
+
+ "(.*)Spotify":
+ " Spotify",
+ "(.*)Spotify Premium":
+ " Spotify Premium",
+
+ "OBS(.*)":
+ " OBS Studio",
+
+ "VLC media player":
+ " VLC Media Player",
+ "(.*) - VLC media player":
+ " $1",
+
+ "(.*) - mpv":
+ " $1",
+
+ "qView": " qView",
+
+ "(.*).jpg": " $1.jpg",
+ "(.*).png": " $1.png",
+ "(.*).svg": " $1.svg",
+
+ // Social
+
+ "vesktop":
+ " Discord",
+
+ "• Discord(.*)": "Discord$1",
+ "(.*)Discord(.*)":
+ " $1Discord$2",
+
+ // Documents
+
+ "ONLYOFFICE Desktop Editors":
+ " OnlyOffice Desktop",
+
+ "(.*).docx":
+ " $1.docx",
+ "(.*).xlsx":
+ " $1.xlsx",
+ "(.*).pptx":
+ " $1.pptx",
+ "(.*).pdf":
+ " $1.pdf",
+
+ // System
+ "Authenticate": " Authenticate"
+ }
+ },
+
+ "custom/temperature": {
+ "exec": "~/.config/waybar/scripts/cpu-temp.sh",
+ "return-type": "json",
+ "format": "{}",
+ "interval": 5,
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "memory": {
+ "states": {
+ "warning": 75,
+ "critical": 90
+ },
+
+ "format": " {percentage}%",
+ "format-critical": " {percentage}%",
+ "tooltip": false,
+ // "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB",
+ "interval": 5,
+ "min-length": 7,
+ "max-length": 7
+ },
+
+ "cpu": {
+ "format": " {usage}%",
+ "tooltip": false,
+ "interval": 5,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/distro": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+
+ "format-icons": {
+ "activated": " ",
+ "deactivated": " "
+ },
+
+ "tooltip-format-activated": "Presentation Mode",
+ "tooltip-format-deactivated": "Idle Mode",
+ "start-activated": false
+ },
+
+ "clock#time": {
+ "format": "{:%H:%M}",
+ "tooltip": false,
+ // "tooltip-format": "Standard Time: {:%I:%M %p}",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "clock#date": {
+ "format": " {:%m-%d}",
+ "tooltip-format": "{calendar}",
+
+ "calendar": {
+ "mode": "month",
+ "mode-mon-col": 6,
+ "on-click-right": "mode",
+
+ "format": {
+ "months":
+ "{}",
+ "weekdays":
+ "{}",
+ "today":
+ "{}"
+ }
+ },
+
+ "actions": {
+ "on-click": "mode",
+ "on-click-right": "mode"
+ },
+
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "custom/wifi": {
+ "exec": "~/.config/waybar/scripts/wifi-status.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "~/.config/waybar/scripts/wifi-menu.sh",
+ "on-click-right": "kitty --title ' Network Manager TUI' bash -c nmtui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "bluetooth": {
+ "format": "",
+ "format-disabled": "",
+ "format-connected": "",
+ "format-connected-battery": "",
+
+ "tooltip-format":
+ "{num_connections} connected",
+ "tooltip-format-disabled":
+ "Bluetooth Disabled",
+ "tooltip-format-connected":
+ "{device_enumerate}",
+ "tooltip-format-enumerate-connected":
+ "{device_alias}",
+ "tooltip-format-enumerate-connected-battery":
+ ":: {device_alias}: {device_battery_percentage}%",
+
+ "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh",
+ "on-click-right": "kitty --title ' Bluetooth TUI' bash -c bluetui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/update": {
+ "exec": "~/.config/waybar/scripts/system-update.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'",
+ "interval": 30,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "mpris": {
+ "format": "{player_icon} {title} - {artist}",
+ "format-paused": "{status_icon} {title} - {artist}",
+
+ "player-icons": {
+ "default": " ",
+ "spotify": " ",
+ "firefox": " "
+ },
+ "status-icons": {
+ "paused": "\u200A\u200A\u2009\u2009"
+ },
+
+ "tooltip-format": "Playing: {title} - {artist}",
+ "tooltip-format-paused": "Paused: {title} - {artist}",
+ "min-length": 5,
+ "max-length": 35
+ },
+
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "format-muted": " {volume}%",
+
+ "format-icons": {
+ "default": ["", "", ""],
+ "headphone": "",
+ "headset": ""
+ },
+
+ "tooltip-format": "Device: {desc}",
+ "on-click": "~/.config/waybar/scripts/volume-control.sh -o m",
+ "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "backlight": {
+ "format": "{icon} {percent}%",
+ "format-icons": ["", "", "", "", "", "", "", "", ""],
+ "tooltip": false,
+ "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 10
+ },
+
+ "format": "{icon} {capacity}%",
+ "format-icons": ["", "", "", "", "", "", "", "", "", ""],
+ "format-charging": " {capacity}%",
+
+ "tooltip-format": "Discharging: {time}",
+ "tooltip-format-charging": "Charging: {time}",
+ "interval": 1,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/power": {
+ "format": " ",
+ "tooltip": false,
+ // "tooltip-format": "Power Menu",
+ "on-click": "~/.config/waybar/scripts/power-menu.sh"
+ },
+
+ // <<--< Padding >-->>
+
+ "custom/paddw": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "custom/paddc": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ // Left Arrows
+
+ "custom/left1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left5": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left6": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left7": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left8": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Arrows
+
+ "custom/right1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right5": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Left Inverse
+
+ "custom/leftin1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/leftin2": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Inverse
+
+ "custom/rightin1": {
+ "format": "",
+ "tooltip": false
+ }
+}
diff --git a/waybar/themes/jsonc/gruvbox-dark.jsonc b/waybar/themes/jsonc/gruvbox-dark.jsonc
new file mode 100644
index 0000000..64dad16
--- /dev/null
+++ b/waybar/themes/jsonc/gruvbox-dark.jsonc
@@ -0,0 +1,478 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mode": "dock",
+ "reload_style_on_change": true,
+ "gtk-layer-shell": true,
+
+ // <<--< Positions >-->>
+
+ "modules-left": [
+ "custom/ws", // window icon
+ "custom/left1",
+
+ "hyprland/workspaces", // workspaces
+ "custom/right1",
+
+ "custom/paddw",
+ "hyprland/window" // window title
+ ],
+
+ "modules-center": [
+ "custom/paddc",
+ "custom/left2",
+ "custom/temperature", // temperature
+
+ "custom/left3",
+ "memory", // memory
+
+ "custom/left4",
+ "cpu", // cpu
+ "custom/leftin1",
+
+ "custom/left5",
+ "custom/distro", // distro icon
+ "custom/right2",
+
+ "custom/rightin1",
+ "idle_inhibitor", // idle inhibitor
+ "clock#time", // time
+ "custom/right3",
+
+ "clock#date", // date
+ "custom/right4",
+
+ "custom/wifi", // wi-fi
+ "bluetooth", // bluetooth
+ "custom/update", // system update
+ "custom/right5"
+ ],
+
+ "modules-right": [
+ "mpris", // media info
+
+ "custom/left6",
+ "pulseaudio", // output device
+
+ "custom/left7",
+ "backlight", // brightness
+
+ "custom/left8",
+ "battery", // battery
+
+ "custom/leftin2",
+ "custom/power" // power button
+ ],
+
+ // <<--< Modules >-->>
+
+ "custom/ws": {
+ "exec": "~/.config/waybar/scripts/current-theme.sh",
+ "return-type": "json",
+ "format": " ",
+ "on-click": "~/.config/waybar/scripts/theme-switcher.sh",
+ "min-length": 3,
+ "max-length": 3
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace -1",
+ "on-scroll-down": "hyprctl dispatch workspace +1",
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": []
+ }
+ },
+
+ "hyprland/window": {
+ "format": "{}",
+ "tooltip": false,
+ "min-length": 5,
+
+ "rewrite": {
+ // Desktop
+ "":
+ " Hyprland",
+
+ // Terminal
+ "~": " Terminal",
+ "zsh": " Terminal",
+ "kitty": " Terminal",
+
+ "tmux(.*)":
+ " Tmux",
+
+ // Browser
+
+ "(.*)Mozilla Firefox":
+ " Firefox",
+ "(.*) — Mozilla Firefox":
+ " $1",
+
+ "(.*)Zen Browser":
+ " Zen Browser",
+ "(.*) — Zen Browser":
+ " $1",
+
+ // Development
+
+ "(.*) - Visual Studio Code":
+ " $1",
+ "(.*)Visual Studio Code":
+ " Visual Studio Code",
+
+ "nvim":
+ " Neovim",
+ "nvim (.*)":
+ " $1",
+
+ "vim":
+ " Vim",
+ "vim (.*)":
+ " $1",
+
+ // Media
+
+ "(.*)Spotify":
+ " Spotify",
+ "(.*)Spotify Premium":
+ " Spotify Premium",
+
+ "OBS(.*)":
+ " OBS Studio",
+
+ "VLC media player":
+ " VLC Media Player",
+ "(.*) - VLC media player":
+ " $1",
+
+ "(.*) - mpv":
+ " $1",
+
+ "qView": " qView",
+
+ "(.*).jpg": " $1.jpg",
+ "(.*).png": " $1.png",
+ "(.*).svg": " $1.svg",
+
+ // Social
+
+ "vesktop":
+ " Discord",
+
+ "• Discord(.*)": "Discord$1",
+ "(.*)Discord(.*)":
+ " $1Discord$2",
+
+ // Documents
+
+ "ONLYOFFICE Desktop Editors":
+ " OnlyOffice Desktop",
+
+ "(.*).docx":
+ " $1.docx",
+ "(.*).xlsx":
+ " $1.xlsx",
+ "(.*).pptx":
+ " $1.pptx",
+ "(.*).pdf":
+ " $1.pdf",
+
+ // System
+ "Authenticate": " Authenticate"
+ }
+ },
+
+ "custom/temperature": {
+ "exec": "~/.config/waybar/scripts/cpu-temp.sh",
+ "return-type": "json",
+ "format": "{}",
+ "interval": 5,
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "memory": {
+ "states": {
+ "warning": 75,
+ "critical": 90
+ },
+
+ "format": " {percentage}%",
+ "format-critical": " {percentage}%",
+ "tooltip": false,
+ // "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB",
+ "interval": 5,
+ "min-length": 7,
+ "max-length": 7
+ },
+
+ "cpu": {
+ "format": " {usage}%",
+ "tooltip": false,
+ "interval": 5,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/distro": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+
+ "format-icons": {
+ "activated": " ",
+ "deactivated": " "
+ },
+
+ "tooltip-format-activated": "Presentation Mode",
+ "tooltip-format-deactivated": "Idle Mode",
+ "start-activated": false
+ },
+
+ "clock#time": {
+ "format": "{:%H:%M}",
+ "tooltip": false,
+ // "tooltip-format": "Standard Time: {:%I:%M %p}",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "clock#date": {
+ "format": " {:%m-%d}",
+ "tooltip-format": "{calendar}",
+
+ "calendar": {
+ "mode": "month",
+ "mode-mon-col": 6,
+ "on-click-right": "mode",
+
+ "format": {
+ "months":
+ "{}",
+ "weekdays":
+ "{}",
+ "today":
+ "{}"
+ }
+ },
+
+ "actions": {
+ "on-click": "mode",
+ "on-click-right": "mode"
+ },
+
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "custom/wifi": {
+ "exec": "~/.config/waybar/scripts/wifi-status.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "~/.config/waybar/scripts/wifi-menu.sh",
+ "on-click-right": "kitty --title ' Network Manager TUI' bash -c nmtui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "bluetooth": {
+ "format": "",
+ "format-disabled": "",
+ "format-connected": "",
+ "format-connected-battery": "",
+
+ "tooltip-format":
+ "{num_connections} connected",
+ "tooltip-format-disabled":
+ "Bluetooth Disabled",
+ "tooltip-format-connected":
+ "{device_enumerate}",
+ "tooltip-format-enumerate-connected":
+ "{device_alias}",
+ "tooltip-format-enumerate-connected-battery":
+ ":: {device_alias}: {device_battery_percentage}%",
+
+ "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh",
+ "on-click-right": "kitty --title ' Bluetooth TUI' bash -c bluetui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/update": {
+ "exec": "~/.config/waybar/scripts/system-update.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'",
+ "interval": 30,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "mpris": {
+ "format": "{player_icon} {title} - {artist}",
+ "format-paused": "{status_icon} {title} - {artist}",
+
+ "player-icons": {
+ "default": " ",
+ "spotify": " ",
+ "firefox": " "
+ },
+ "status-icons": {
+ "paused": "\u200A\u200A\u2009\u2009"
+ },
+
+ "tooltip-format": "Playing: {title} - {artist}",
+ "tooltip-format-paused": "Paused: {title} - {artist}",
+ "min-length": 5,
+ "max-length": 35
+ },
+
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "format-muted": " {volume}%",
+
+ "format-icons": {
+ "default": ["", "", ""],
+ "headphone": "",
+ "headset": ""
+ },
+
+ "tooltip-format": "Device: {desc}",
+ "on-click": "~/.config/waybar/scripts/volume-control.sh -o m",
+ "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "backlight": {
+ "format": "{icon} {percent}%",
+ "format-icons": ["", "", "", "", "", "", "", "", ""],
+ "tooltip": false,
+ "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 10
+ },
+
+ "format": "{icon} {capacity}%",
+ "format-icons": ["", "", "", "", "", "", "", "", "", ""],
+ "format-charging": " {capacity}%",
+
+ "tooltip-format": "Discharging: {time}",
+ "tooltip-format-charging": "Charging: {time}",
+ "interval": 1,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/power": {
+ "format": " ",
+ "tooltip": false,
+ // "tooltip-format": "Power Menu",
+ "on-click": "~/.config/waybar/scripts/power-menu.sh"
+ },
+
+ // <<--< Padding >-->>
+
+ "custom/paddw": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "custom/paddc": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ // Left Arrows
+
+ "custom/left1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left5": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left6": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left7": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left8": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Arrows
+
+ "custom/right1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right5": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Left Inverse
+
+ "custom/leftin1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/leftin2": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Inverse
+
+ "custom/rightin1": {
+ "format": "",
+ "tooltip": false
+ }
+}
diff --git a/waybar/themes/jsonc/gruvbox-light.jsonc b/waybar/themes/jsonc/gruvbox-light.jsonc
new file mode 100644
index 0000000..42e5f7d
--- /dev/null
+++ b/waybar/themes/jsonc/gruvbox-light.jsonc
@@ -0,0 +1,478 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mode": "dock",
+ "reload_style_on_change": true,
+ "gtk-layer-shell": true,
+
+ // <<--< Positions >-->>
+
+ "modules-left": [
+ "custom/ws", // window icon
+ "custom/left1",
+
+ "hyprland/workspaces", // workspaces
+ "custom/right1",
+
+ "custom/paddw",
+ "hyprland/window" // window title
+ ],
+
+ "modules-center": [
+ "custom/paddc",
+ "custom/left2",
+ "custom/temperature", // temperature
+
+ "custom/left3",
+ "memory", // memory
+
+ "custom/left4",
+ "cpu", // cpu
+ "custom/leftin1",
+
+ "custom/left5",
+ "custom/distro", // distro icon
+ "custom/right2",
+
+ "custom/rightin1",
+ "idle_inhibitor", // idle inhibitor
+ "clock#time", // time
+ "custom/right3",
+
+ "clock#date", // date
+ "custom/right4",
+
+ "custom/wifi", // wi-fi
+ "bluetooth", // bluetooth
+ "custom/update", // system update
+ "custom/right5"
+ ],
+
+ "modules-right": [
+ "mpris", // media info
+
+ "custom/left6",
+ "pulseaudio", // output device
+
+ "custom/left7",
+ "backlight", // brightness
+
+ "custom/left8",
+ "battery", // battery
+
+ "custom/leftin2",
+ "custom/power" // power button
+ ],
+
+ // <<--< Modules >-->>
+
+ "custom/ws": {
+ "exec": "~/.config/waybar/scripts/current-theme.sh",
+ "return-type": "json",
+ "format": " ",
+ "on-click": "~/.config/waybar/scripts/theme-switcher.sh",
+ "min-length": 3,
+ "max-length": 3
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace -1",
+ "on-scroll-down": "hyprctl dispatch workspace +1",
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": []
+ }
+ },
+
+ "hyprland/window": {
+ "format": "{}",
+ "tooltip": false,
+ "min-length": 5,
+
+ "rewrite": {
+ // Desktop
+ "":
+ " Hyprland",
+
+ // Terminal
+ "~": " Terminal",
+ "zsh": " Terminal",
+ "kitty": " Terminal",
+
+ "tmux(.*)":
+ " Tmux",
+
+ // Browser
+
+ "(.*)Mozilla Firefox":
+ " Firefox",
+ "(.*) — Mozilla Firefox":
+ " $1",
+
+ "(.*)Zen Browser":
+ " Zen Browser",
+ "(.*) — Zen Browser":
+ " $1",
+
+ // Development
+
+ "(.*) - Visual Studio Code":
+ " $1",
+ "(.*)Visual Studio Code":
+ " Visual Studio Code",
+
+ "nvim":
+ " Neovim",
+ "nvim (.*)":
+ " $1",
+
+ "vim":
+ " Vim",
+ "vim (.*)":
+ " $1",
+
+ // Media
+
+ "(.*)Spotify":
+ " Spotify",
+ "(.*)Spotify Premium":
+ " Spotify Premium",
+
+ "OBS(.*)":
+ " OBS Studio",
+
+ "VLC media player":
+ " VLC Media Player",
+ "(.*) - VLC media player":
+ " $1",
+
+ "(.*) - mpv":
+ " $1",
+
+ "qView": " qView",
+
+ "(.*).jpg": " $1.jpg",
+ "(.*).png": " $1.png",
+ "(.*).svg": " $1.svg",
+
+ // Social
+
+ "vesktop":
+ " Discord",
+
+ "• Discord(.*)": "Discord$1",
+ "(.*)Discord(.*)":
+ " $1Discord$2",
+
+ // Documents
+
+ "ONLYOFFICE Desktop Editors":
+ " OnlyOffice Desktop",
+
+ "(.*).docx":
+ " $1.docx",
+ "(.*).xlsx":
+ " $1.xlsx",
+ "(.*).pptx":
+ " $1.pptx",
+ "(.*).pdf":
+ " $1.pdf",
+
+ // System
+ "Authenticate": " Authenticate"
+ }
+ },
+
+ "custom/temperature": {
+ "exec": "~/.config/waybar/scripts/cpu-temp.sh",
+ "return-type": "json",
+ "format": "{}",
+ "interval": 5,
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "memory": {
+ "states": {
+ "warning": 75,
+ "critical": 90
+ },
+
+ "format": " {percentage}%",
+ "format-critical": " {percentage}%",
+ "tooltip": false,
+ // "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB",
+ "interval": 5,
+ "min-length": 7,
+ "max-length": 7
+ },
+
+ "cpu": {
+ "format": " {usage}%",
+ "tooltip": false,
+ "interval": 5,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/distro": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+
+ "format-icons": {
+ "activated": " ",
+ "deactivated": " "
+ },
+
+ "tooltip-format-activated": "Presentation Mode",
+ "tooltip-format-deactivated": "Idle Mode",
+ "start-activated": false
+ },
+
+ "clock#time": {
+ "format": "{:%H:%M}",
+ "tooltip": false,
+ // "tooltip-format": "Standard Time: {:%I:%M %p}",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "clock#date": {
+ "format": " {:%m-%d}",
+ "tooltip-format": "{calendar}",
+
+ "calendar": {
+ "mode": "month",
+ "mode-mon-col": 6,
+ "on-click-right": "mode",
+
+ "format": {
+ "months":
+ "{}",
+ "weekdays":
+ "{}",
+ "today":
+ "{}"
+ }
+ },
+
+ "actions": {
+ "on-click": "mode",
+ "on-click-right": "mode"
+ },
+
+ "min-length": 8,
+ "max-length": 8
+ },
+
+ "custom/wifi": {
+ "exec": "~/.config/waybar/scripts/wifi-status.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "~/.config/waybar/scripts/wifi-menu.sh",
+ "on-click-right": "kitty --title ' Network Manager TUI' bash -c nmtui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "bluetooth": {
+ "format": "",
+ "format-disabled": "",
+ "format-connected": "",
+ "format-connected-battery": "",
+
+ "tooltip-format":
+ "{num_connections} connected",
+ "tooltip-format-disabled":
+ "Bluetooth Disabled",
+ "tooltip-format-connected":
+ "{device_enumerate}",
+ "tooltip-format-enumerate-connected":
+ "{device_alias}",
+ "tooltip-format-enumerate-connected-battery":
+ ":: {device_alias}: {device_battery_percentage}%",
+
+ "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh",
+ "on-click-right": "kitty --title ' Bluetooth TUI' bash -c bluetui",
+ "interval": 1,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "custom/update": {
+ "exec": "~/.config/waybar/scripts/system-update.sh",
+ "return-type": "json",
+ "format": "{}",
+ "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'",
+ "interval": 30,
+ "min-length": 1,
+ "max-length": 1
+ },
+
+ "mpris": {
+ "format": "{player_icon} {title} - {artist}",
+ "format-paused": "{status_icon} {title} - {artist}",
+
+ "player-icons": {
+ "default": " ",
+ "spotify": " ",
+ "firefox": " "
+ },
+ "status-icons": {
+ "paused": "\u200A\u200A\u2009\u2009"
+ },
+
+ "tooltip-format": "Playing: {title} - {artist}",
+ "tooltip-format-paused": "Paused: {title} - {artist}",
+ "min-length": 5,
+ "max-length": 35
+ },
+
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "format-muted": " {volume}%",
+
+ "format-icons": {
+ "default": ["", "", ""],
+ "headphone": "",
+ "headset": ""
+ },
+
+ "tooltip-format": "Device: {desc}",
+ "on-click": "~/.config/waybar/scripts/volume-control.sh -o m",
+ "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "backlight": {
+ "format": "{icon} {percent}%",
+ "format-icons": ["", "", "", "", "", "", "", "", ""],
+ "tooltip": false,
+ "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i",
+ "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d",
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 10
+ },
+
+ "format": "{icon} {capacity}%",
+ "format-icons": ["", "", "", "", "", "", "", "", "", ""],
+ "format-charging": " {capacity}%",
+
+ "tooltip-format": "Discharging: {time}",
+ "tooltip-format-charging": "Charging: {time}",
+ "interval": 1,
+ "min-length": 6,
+ "max-length": 6
+ },
+
+ "custom/power": {
+ "format": " ",
+ "tooltip": false,
+ // "tooltip-format": "Power Menu",
+ "on-click": "~/.config/waybar/scripts/power-menu.sh"
+ },
+
+ // <<--< Padding >-->>
+
+ "custom/paddw": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ "custom/paddc": {
+ "format": " ",
+ "tooltip": false
+ },
+
+ // Left Arrows
+
+ "custom/left1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left5": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left6": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left7": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/left8": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Arrows
+
+ "custom/right1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right2": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right3": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right4": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/right5": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Left Inverse
+
+ "custom/leftin1": {
+ "format": "",
+ "tooltip": false
+ },
+ "custom/leftin2": {
+ "format": "",
+ "tooltip": false
+ },
+
+ // Right Inverse
+
+ "custom/rightin1": {
+ "format": "",
+ "tooltip": false
+ }
+}
diff --git a/wofi/style.css b/wofi/style.css
new file mode 100644
index 0000000..f3b8b39
--- /dev/null
+++ b/wofi/style.css
@@ -0,0 +1,46 @@
+window {
+ margin: 0px;
+ border: 2px solid #3c3836;
+ background-color: #282828;
+ font-family: "Fira Code", "JetBrains Mono", monospace;
+ font-size: 14px;
+}
+
+#input {
+ margin: 5px;
+ border: none;
+ color: #ebdbb2;
+ background-color: #3c3836;
+}
+
+#inner-box {
+ margin: 5px;
+ border: none;
+ background-color: #282828;
+}
+
+#outer-box {
+ margin: 5px;
+ border: none;
+ background-color: #282828;
+}
+
+#scroll {
+ margin: 0px;
+ border: none;
+}
+
+#text {
+ margin: 5px;
+ border: none;
+ color: #ebdbb2;
+}
+
+#entry:selected {
+ background-color: #458588;
+ color: #fbf1c7;
+}
+
+#entry:selected #text {
+ color: #fbf1c7;
+}