diff --git a/config/claude/settings.json b/config/claude/settings.json index 15a5cfbc1..2074d3586 100644 --- a/config/claude/settings.json +++ b/config/claude/settings.json @@ -1,4 +1,8 @@ { + "model": "opus", + "env": { + "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1" + }, "cleanupPeriodDays": 99999, "enabledPlugins": { "commit-commands@claude-plugins-official": true, diff --git a/config/default.nix b/config/default.nix index 131aca6f2..af2fdb649 100644 --- a/config/default.nix +++ b/config/default.nix @@ -32,10 +32,8 @@ in [ ./gtk ./hyprland - ./swaync - ./waybar - ./wlogout - ./wofi + ./hyprpanel + ./walker ] else [ ] diff --git a/config/ghostty/config b/config/ghostty/config index d9ece2995..030b78277 100644 --- a/config/ghostty/config +++ b/config/ghostty/config @@ -3,7 +3,8 @@ # auto-update-channel = tip -theme = dark:Dracula,light:Catppuccin Latte +# theme = dark:Dracula,light:Catppuccin Latte +theme = Dracula background-opacity = 0.8 confirm-close-surface = true macos-option-as-alt = true @@ -26,3 +27,25 @@ keybind = super+shift+left=move_tab:-1 keybind = super+shift+up=move_tab:-1 keybind = super+shift+right=move_tab:1 keybind = super+shift+down=move_tab:1 + +# Navigate between splits (Vim-style) +keybind = super+h=goto_split:left +keybind = super+j=goto_split:down +keybind = super+k=goto_split:up +keybind = super+l=goto_split:right + +# Create new splits +keybind = ctrl+shift+backslash=new_split:right +keybind = ctrl+shift+minus=new_split:down + +# Split management +keybind = ctrl+shift+z=toggle_split_zoom +keybind = ctrl+shift+e=equalize_splits +keybind = ctrl+shift+w=close_surface + +# Split border styling +split-divider-color = #88c0d0 + +# Active panel highlighting (dim unfocused splits) +unfocused-split-opacity = 0.7 +unfocused-split-fill = #1e1e2e diff --git a/config/hyprland/default.nix b/config/hyprland/default.nix index ef522db13..26e229ec3 100644 --- a/config/hyprland/default.nix +++ b/config/hyprland/default.nix @@ -6,7 +6,6 @@ }: let hyprexpoPlugin = pkgs.hyprlandPlugins.hyprexpo; - wallpaper = "${pkgs.nixos-artwork.wallpapers.nineish-catppuccin-mocha-alt}/share/backgrounds/nixos/nix-wallpaper-nineish-catppuccin-mocha-alt.png"; in { wayland.windowManager.hyprland = { @@ -15,8 +14,7 @@ in systemd.enable = false; extraConfig = '' plugin = ${hyprexpoPlugin}/lib/libhyprexpo.so - exec-once = ${pkgs.swww}/bin/swww-daemon - exec-once = sleep 1 && ${pkgs.swww}/bin/swww img ${wallpaper} + exec-once = ${pkgs.hyprpanel}/bin/hyprpanel '' + builtins.readFile ./hyprland.conf; }; @@ -29,4 +27,15 @@ in source = ./hyprlock.conf; force = true; }; + + xdg.configFile."hypr/scripts/toggle-terminal.sh" = { + source = ./scripts/toggle-terminal.sh; + executable = true; + force = true; + }; + xdg.configFile."hypr/scripts/record-screen.sh" = { + source = ./scripts/record-screen.sh; + executable = true; + force = true; + }; } diff --git a/config/hyprland/hypridle.conf b/config/hyprland/hypridle.conf index 9298810d8..607acb292 100644 --- a/config/hyprland/hypridle.conf +++ b/config/hyprland/hypridle.conf @@ -2,6 +2,7 @@ general { lock_cmd = pidof hyprlock || hyprlock before_sleep_cmd = loginctl lock-session after_sleep_cmd = hyprctl dispatch dpms on + inhibit_sleep = 3 } # Dim screen after 2.5 minutes diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 9f5199fa0..1b3a6dc8c 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -23,21 +23,24 @@ $mod = SUPER # ============================================================================= env = XCURSOR_THEME,Adwaita env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 +env = HYPRCURSOR_THEME,Adwaita env = GTK_THEME,Adwaita:dark env = GDK_SCALE,1.5 env = QT_AUTO_SCREEN_SCALE_FACTOR,1 +env = QT_QPA_PLATFORM,wayland +env = SDL_VIDEODRIVER,wayland +env = MOZ_ENABLE_WAYLAND,1 +env = ELECTRON_OZONE_PLATFORM_HINT,wayland +env = OZONE_PLATFORM,wayland +env = GDK_BACKEND,wayland # ============================================================================= # Startup # ============================================================================= exec-once = dbus-update-activation-environment --systemd --all exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE XDG_RUNTIME_DIR HYPRLAND_INSTANCE_SIGNATURE XDG_SESSION_DESKTOP - -# Status bar -exec-once = waybar - -# Notification daemon -exec-once = swaync +exec-once = sleep 1 && systemctl --user restart xdg-desktop-portal-hyprland && sleep 0.5 && systemctl --user restart xdg-desktop-portal-gtk && sleep 0.5 && systemctl --user restart xdg-desktop-portal # Clipboard history exec-once = wl-paste --type text --watch cliphist store @@ -46,8 +49,11 @@ exec-once = wl-paste --type image --watch cliphist store # Idle management exec-once = hypridle -# Volume/brightness OSD -exec-once = rm -f /tmp/wobpipe && mkfifo /tmp/wobpipe && tail -f /tmp/wobpipe | wob +# Blue light filter +exec-once = hyprsunset + +# Clipboard persistence +exec-once = wl-clip-persist --clipboard regular & clipse -listen # ============================================================================= # Monitor (Framework 13" 2256x1504) @@ -136,6 +142,7 @@ animations { animation = borderangle, 1, 30, liner, loop animation = fade, 1, 3, default animation = workspaces, 1, 3, snap + animation = specialWorkspace, 1, 3, snap, slidevert } # ============================================================================= @@ -145,24 +152,78 @@ misc { disable_hyprland_logo = true disable_splash_rendering = true force_default_wallpaper = 0 + focus_on_activate = true + background_color = rgb(000000) +} + +ecosystem { + no_update_news = true } # ============================================================================= # Window Rules # ============================================================================= -windowrule = float on, match:class ^(wofi)$ windowrule = float on, match:class ^(1Password)$ windowrule = float on, match:title ^(Picture-in-Picture)$ windowrule = pin on, match:title ^(Picture-in-Picture)$ -# Notification center blur -layerrule = blur on, match:namespace swaync-control-center -layerrule = blur on, match:namespace swaync-notification-window -layerrule = ignore_alpha 0.0, match:namespace swaync-control-center -layerrule = ignore_alpha 0.0, match:namespace swaync-notification-window +# Screen-share indicator (auto-hide to special workspace) +$shareIndicator = match:title ^(.*)(is sharing (your screen|a window).*)$ +windowrule = no_focus on, $shareIndicator +windowrule = workspace special:share silent, $shareIndicator + +# Google Meet PIP +$meetPip = match:title ^(Meet - .+)$ +windowrule = float on, $meetPip +windowrule = pin on, $meetPip +windowrule = size 320 540, $meetPip +windowrule = move 100%-340 60, $meetPip + +# Workspace assignments removed — forced workspace rules apply to ALL +# windows of that class (including Cmd+N new windows), breaking expected +# behavior. Use Super+G/S/D focus-or-launch bindings instead. + +# Settings management (float for audio/bluetooth GUIs) +windowrule = float on, match:class ^(org.pulseaudio.pavucontrol|.blueman-manager-wrapped|blueman-manager)$ + +# Clipse clipboard manager (float centered) +windowrule = float on, match:class ^(clipse)$ +windowrule = size 622 652, match:class ^(clipse)$ +windowrule = stay_focused on, match:class ^(clipse)$ + +# Suppress maximize for all windows +windowrule = suppress_event maximize, match:class .* + +# Slight opacity for visual depth +windowrule = opacity 0.95 0.90, match:class ^(com.mitchellh.ghostty)$ +windowrule = opacity 0.90 0.85, match:class ^(google-chrome.*)$ +windowrule = opacity 0.95 0.90, match:class ^(Slack)$ +windowrule = opacity 0.90 0.85, match:class ^(code-url-handler)$ + +# Full opacity in fullscreen +windowrule = opacity 1.0 override 1.0 override, match:fullscreen 1 + +# Ghostty scratchpad +windowrule = workspace special:scratchpad silent, match:class ^(ghostty-scratchpad)$ +windowrule = float on, match:class ^(ghostty-scratchpad)$ +windowrule = size 90% 70%, match:class ^(ghostty-scratchpad)$ +windowrule = center on, match:class ^(ghostty-scratchpad)$ -# Prevent wofi animation -layerrule = animation slide, match:namespace ^(wofi)$ +# ============================================================================= +# Layer Rules +# ============================================================================= +# Blur for HyprPanel bar (frosted glass) +layerrule = blur on, match:namespace ^(bar-\d+)$ +layerrule = ignore_alpha 0.3, match:namespace ^(bar-\d+)$ + +# Blur for HyprPanel notifications (frosted glass) +layerrule = blur on, match:namespace ^(notifications-window)$ +layerrule = ignore_alpha 0.3, match:namespace ^(notifications-window)$ + +# Blur for walker +layerrule = blur on, match:namespace ^(walker)$ +layerrule = ignore_alpha on, match:namespace ^(walker)$ +layerrule = animation slide top, match:namespace ^(walker)$ # ============================================================================= # App Launch Hotkeys (Super + letter) @@ -173,15 +234,22 @@ bind = $mod, S, exec, hyprctl clients -j | grep -q '"class": "Slack"' && hyprctl bind = $mod, C, exec, cursor bind = $mod, P, exec, gtk-launch 1password bind = $mod, M, exec, gtk-launch signal-desktop +bind = $mod, D, exec, hyprctl clients -j | grep -q '"class": "discord"' && hyprctl dispatch focuswindow class:discord || discord bind = $mod, N, exec, ghostty -e yazi +# ============================================================================= +# System GUIs (WiFi / Bluetooth / Audio) +# ============================================================================= +bind = $mod, I, exec, hyprpanel toggleWindow network-menu +bind = $mod, B, exec, blueman-manager +bind = $mod, A, exec, pavucontrol + # ============================================================================= # Launcher & Clipboard # ============================================================================= +bind = CTRL ALT SHIFT, SPACE, exec, walker bind = $mod, V, exec, code -bind = $mod, D, exec, wofi --show drun -bind = $mod, E, exec, wofi-emoji -bind = $mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy +bind = $mod, E, exec, emote # ============================================================================= # Window Management @@ -190,7 +258,7 @@ bind = $mod, W, killactive, bind = $mod, F, togglefloating, bind = CTRL ALT SHIFT, F, exec, hyprctl --batch "dispatch movetoworkspace empty; dispatch fullscreen 0" bind = SUPER CTRL, F, fullscreen, 0 -bind = $mod SHIFT, Q, exec, wlogout +bind = $mod SHIFT, Q, exec, hyprpanel toggleWindow power-menu bind = $mod, TAB, hyprexpo:expo, toggle # Focus (vim keys) @@ -259,9 +327,27 @@ bindm = $mod, mouse:272, movewindow bindm = $mod, mouse:273, resizewindow # ============================================================================= -# Screenshot +# Scratchpad & Recording +# ============================================================================= +bind = $mod CTRL, T, exec, ~/.config/hypr/scripts/toggle-terminal.sh +bind = $mod SHIFT, R, exec, ~/.config/hypr/scripts/record-screen.sh + +# Quick previous-window toggle (like macOS Cmd+`) +bind = $mod, GRAVE, focuscurrentorlast + +# ============================================================================= +# Screenshot (grim+slurp+swappy for annotated, hyprshot for quick) # ============================================================================= bind = $mod SHIFT, S, exec, grim -g "$(slurp)" - | swappy -f - +bind = , PRINT, exec, hyprshot -m region +bind = SHIFT, PRINT, exec, hyprshot -m window +bind = CTRL, PRINT, exec, hyprshot -m output + +# Color picker +bind = $mod, PRINT, exec, hyprpicker -a + +# Clipboard manager (clipse) +bind = CTRL $mod, V, exec, ghostty --class clipse -e clipse # ============================================================================= # Media / Hardware Keys (Framework 13 AI 300) @@ -273,8 +359,8 @@ bindl = , F1, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- bindel = , F2, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- # F3: Volume up -bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ -bindel = , F3, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ +bindel = , F3, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ # F4: Previous track bindl = , XF86AudioPrev, exec, playerctl previous bindl = , F4, exec, playerctl previous @@ -297,9 +383,8 @@ bindl = , F9, exec, hyprctl -j monitors | jq -r '.[0].scale' | awk '{if($1>1.3) # F10: Airplane mode bindl = , XF86RFKill, exec, nmcli radio wifi toggle bindl = , F10, exec, nmcli radio wifi toggle -# F11: Print screen -bind = , Print, exec, grim -g "$(slurp)" - | swappy -f - -bind = , F11, exec, grim -g "$(slurp)" - | swappy -f - +# F11: Print screen (full output via hyprshot) +bind = , F11, exec, hyprshot -m output # ============================================================================= # Display Zoom (Framework + / - , macOS-style) @@ -312,12 +397,12 @@ binde = CTRL ALT SHIFT, minus, exec, hyprctl -j monitors | jq -r '.[0].scale' | # ============================================================================= # Lock Screen # ============================================================================= -bind = $mod CTRL, L, exec, hyprlock +bind = $mod SHIFT, L, exec, hyprlock # ============================================================================= # Notification Toggle # ============================================================================= -bind = $mod SHIFT, D, exec, swaync-client -t -sw +bind = $mod SHIFT, D, exec, hyprpanel toggleWindow notifications-center # ============================================================================= # Plugins diff --git a/config/hyprland/hyprlock.conf b/config/hyprland/hyprlock.conf index 9edc57e7c..d1c0e38d4 100644 --- a/config/hyprland/hyprlock.conf +++ b/config/hyprland/hyprlock.conf @@ -1,3 +1,14 @@ +general { + hide_cursor = true + grace = 0 +} + +auth { + fingerprint { + enabled = true + } +} + background { monitor = path = screenshot @@ -10,29 +21,47 @@ background { input-field { monitor = - size = 250, 50 - outline_thickness = 3 + size = 600, 100 + outline_thickness = 4 dots_size = 0.26 dots_spacing = 0.15 dots_center = true outer_color = rgb(bd93f9) inner_color = rgb(282a36) font_color = rgb(f8f8f2) - fade_on_empty = true - placeholder_text = Password... - hide_input = false - position = 0, -20 + font_family = JetBrainsMono Nerd Font + font_size = 32 + fade_on_empty = false + placeholder_text = Enter Password 󰈷 + fail_text = Wrong + rounding = 0 + shadow_passes = 0 + position = 0, 0 halign = center valign = center } +# Time display label { monitor = - text = $TIME + text = cmd[update:1000] date +"%H:%M:%S" color = rgb(f8f8f2) font_size = 64 font_family = JetBrainsMono Nerd Font - position = 0, 80 + position = 0, 150 + halign = center + valign = center +} + +# Fingerprint prompt +label { + monitor = + text = $FPRINTPROMPT + text_align = center + color = rgb(f8f8f2) + font_size = 24 + font_family = JetBrainsMono Nerd Font + position = 0, -100 halign = center valign = center } diff --git a/config/hyprland/scripts/record-screen.sh b/config/hyprland/scripts/record-screen.sh new file mode 100644 index 000000000..bd80dafb4 --- /dev/null +++ b/config/hyprland/scripts/record-screen.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# Toggle screen recording with wf-recorder + +PIDFILE=/tmp/wf-recorder.pid +OUTDIR="$HOME/Videos" + +if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then + kill "$(cat "$PIDFILE")" + rm -f "$PIDFILE" + notify-send "Screen Recording" "Recording saved to $OUTDIR" +else + mkdir -p "$OUTDIR" + FILENAME="$OUTDIR/recording-$(date +%Y%m%d-%H%M%S).mp4" + GEOMETRY=$(slurp) + if [ -n "$GEOMETRY" ]; then + wf-recorder -g "$GEOMETRY" -f "$FILENAME" & + echo $! >"$PIDFILE" + notify-send "Screen Recording" "Recording started..." + fi +fi diff --git a/config/hyprland/scripts/toggle-terminal.sh b/config/hyprland/scripts/toggle-terminal.sh new file mode 100644 index 000000000..7cb6ca4b2 --- /dev/null +++ b/config/hyprland/scripts/toggle-terminal.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# Toggle Ghostty scratchpad terminal + +CLASS="ghostty-scratchpad" + +if hyprctl clients -j | grep -q "\"class\": \"$CLASS\""; then + hyprctl dispatch togglespecialworkspace scratchpad +else + ghostty --class="$CLASS" & + sleep 0.3 + hyprctl dispatch togglespecialworkspace scratchpad +fi diff --git a/config/hyprpanel/default.nix b/config/hyprpanel/default.nix new file mode 100644 index 000000000..f7fee92db --- /dev/null +++ b/config/hyprpanel/default.nix @@ -0,0 +1,558 @@ +{ pkgs, ... }: +{ + programs.hyprpanel = { + enable = true; + systemd.enable = false; + settings = { + # Bar layout: workspaces left, clock center, modules right + "bar.layouts" = { + "0" = { + left = [ + "dashboard" + "workspaces" + ]; + middle = [ "clock" ]; + right = [ + "cpu" + "ram" + "volume" + "battery" + "network" + "bluetooth" + "systray" + "notifications" + ]; + }; + }; + + # Dashboard + "bar.dashboard.icon" = ""; + + # Clock + "bar.clock.format" = "%Y/%m/%d %H:%M:%S"; + + # Battery + "bar.battery.label" = true; + + # Network + "bar.network.label" = false; + + # Bluetooth + "bar.bluetooth.label" = false; + + # Workspaces + "bar.workspaces.show_icons" = true; + "bar.workspaces.numbered_active_indicator" = "underline"; + "bar.workspaces.show_application_icons" = true; + "bar.workspaces.workspaceIconMap" = { + "1" = ""; + "2" = ""; + "3" = ""; + "4" = "󰙯"; + }; + "bar.workspaces.applicationIconMap" = { + "google-chrome" = ""; + "[sS]lack" = ""; + "[dD]iscord" = "󰙯"; + "com.mitchellh.ghostty" = ""; + "cursor" = "󰨞"; + "1[pP]assword" = "󰌋"; + "code" = "󰨞"; + }; + + # Dashboard shortcuts (left) + "menus.dashboard.shortcuts.left.shortcut1.icon" = ""; + "menus.dashboard.shortcuts.left.shortcut1.tooltip" = "Google Chrome"; + "menus.dashboard.shortcuts.left.shortcut1.command" = "google-chrome-stable"; + "menus.dashboard.shortcuts.left.shortcut2.icon" = ""; + "menus.dashboard.shortcuts.left.shortcut2.tooltip" = "Slack"; + "menus.dashboard.shortcuts.left.shortcut2.command" = "slack"; + "menus.dashboard.shortcuts.left.shortcut3.icon" = "󰙯"; + "menus.dashboard.shortcuts.left.shortcut3.tooltip" = "Discord"; + "menus.dashboard.shortcuts.left.shortcut3.command" = "discord"; + + # Dashboard shortcuts (right) + "menus.dashboard.shortcuts.right.shortcut1.icon" = "󰌾"; + "menus.dashboard.shortcuts.right.shortcut1.tooltip" = "Screen Saver"; + "menus.dashboard.shortcuts.right.shortcut1.command" = "hyprlock"; + "menus.dashboard.shortcuts.right.shortcut2.icon" = "󰉋"; + "menus.dashboard.shortcuts.right.shortcut2.tooltip" = "Files"; + "menus.dashboard.shortcuts.right.shortcut2.command" = "ghostty -e yazi"; + "menus.dashboard.shortcuts.right.shortcut3.icon" = "󰊠"; + "menus.dashboard.shortcuts.right.shortcut3.tooltip" = "Terminal"; + "menus.dashboard.shortcuts.right.shortcut3.command" = "ghostty"; + + # Font + "theme.font.name" = "JetBrainsMono Nerd Font"; + "theme.font.size" = "14px"; + + # Bar + "theme.bar.transparent" = true; + "theme.bar.floating" = false; + + # Notifications + "notifications.position" = "top right"; + "notifications.cache_actions" = true; + "notifications.showActionsOnHover" = false; + + # Scaling (fix dropdown menus overflowing on fractional scale) + "scalingPriority" = "hyprland"; + + # OSD + "theme.osd.enable" = true; + "theme.osd.orientation" = "vertical"; + "theme.osd.location" = "right"; + + # ── Frosty Translucent Theme ───────────────────────────────────── + "theme.bar.background" = "#1a1b2680"; + "theme.bar.border.color" = "#ffffff18"; + "theme.bar.buttons.style" = "default"; + "theme.bar.buttons.background" = "#ffffff0d"; + "theme.bar.buttons.icon" = "#ffffffcc"; + "theme.bar.buttons.text" = "#ffffffcc"; + "theme.bar.buttons.hover" = "#ffffff1a"; + "theme.bar.buttons.icon_background" = "#ffffff0d"; + "theme.bar.buttons.borderColor" = "#ffffff18"; + + # Dashboard + "theme.bar.buttons.dashboard.icon" = "#88c0d0"; + "theme.bar.buttons.dashboard.border" = "#ffffff18"; + "theme.bar.buttons.dashboard.background" = "#ffffff0d"; + + # Workspaces + "theme.bar.buttons.workspaces.numbered_active_underline_color" = "#88c0d0"; + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color" = "#1a1b26"; + "theme.bar.buttons.workspaces.hover" = "#ffffff1a"; + "theme.bar.buttons.workspaces.active" = "#88c0d0"; + "theme.bar.buttons.workspaces.occupied" = "#ffffffaa"; + "theme.bar.buttons.workspaces.available" = "#ffffff55"; + "theme.bar.buttons.workspaces.border" = "#ffffff18"; + "theme.bar.buttons.workspaces.background" = "#ffffff0d"; + + # Window title + "theme.bar.buttons.windowtitle.icon_background" = "#ffffff0d"; + "theme.bar.buttons.windowtitle.icon" = "#ffffffcc"; + "theme.bar.buttons.windowtitle.text" = "#ffffffaa"; + "theme.bar.buttons.windowtitle.border" = "#ffffff18"; + "theme.bar.buttons.windowtitle.background" = "#ffffff0d"; + + # Media + "theme.bar.buttons.media.icon_background" = "#ffffff0d"; + "theme.bar.buttons.media.icon" = "#ffffffcc"; + "theme.bar.buttons.media.text" = "#ffffffaa"; + "theme.bar.buttons.media.background" = "#ffffff0d"; + "theme.bar.buttons.media.border" = "#ffffff18"; + + # Volume + "theme.bar.buttons.volume.icon_background" = "#ffffff0d"; + "theme.bar.buttons.volume.icon" = "#ffffffcc"; + "theme.bar.buttons.volume.text" = "#ffffffaa"; + "theme.bar.buttons.volume.background" = "#ffffff0d"; + "theme.bar.buttons.volume.border" = "#ffffff18"; + + # Network + "theme.bar.buttons.network.icon_background" = "#ffffff0d"; + "theme.bar.buttons.network.icon" = "#ffffffcc"; + "theme.bar.buttons.network.text" = "#ffffffaa"; + "theme.bar.buttons.network.background" = "#ffffff0d"; + "theme.bar.buttons.network.border" = "#ffffff18"; + + # Bluetooth + "theme.bar.buttons.bluetooth.icon_background" = "#ffffff0d"; + "theme.bar.buttons.bluetooth.icon" = "#ffffffcc"; + "theme.bar.buttons.bluetooth.text" = "#ffffffaa"; + "theme.bar.buttons.bluetooth.background" = "#ffffff0d"; + "theme.bar.buttons.bluetooth.border" = "#ffffff18"; + + # Systray + "theme.bar.buttons.systray.background" = "#ffffff0d"; + "theme.bar.buttons.systray.border" = "#ffffff18"; + "theme.bar.buttons.systray.customIcon" = "#ffffffcc"; + + # Battery + "theme.bar.buttons.battery.icon_background" = "#ffffff0d"; + "theme.bar.buttons.battery.icon" = "#ffffffcc"; + "theme.bar.buttons.battery.text" = "#ffffffaa"; + "theme.bar.buttons.battery.background" = "#ffffff0d"; + "theme.bar.buttons.battery.border" = "#ffffff18"; + + # Clock + "theme.bar.buttons.clock.icon_background" = "#ffffff0d"; + "theme.bar.buttons.clock.icon" = "#ffffffcc"; + "theme.bar.buttons.clock.text" = "#ffffffdd"; + "theme.bar.buttons.clock.background" = "#ffffff0d"; + "theme.bar.buttons.clock.border" = "#ffffff18"; + + # Notifications + "theme.bar.buttons.notifications.total" = "#88c0d0"; + "theme.bar.buttons.notifications.icon_background" = "#ffffff0d"; + "theme.bar.buttons.notifications.icon" = "#ffffffcc"; + "theme.bar.buttons.notifications.background" = "#ffffff0d"; + "theme.bar.buttons.notifications.border" = "#ffffff18"; + + # RAM + "theme.bar.buttons.modules.ram.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.ram.icon" = "#a3be8c"; + "theme.bar.buttons.modules.ram.text" = "#a3be8c"; + "theme.bar.buttons.modules.ram.background" = "#ffffff0d"; + "theme.bar.buttons.modules.ram.border" = "#ffffff18"; + + # CPU + "theme.bar.buttons.modules.cpu.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.cpu.icon" = "#88c0d0"; + "theme.bar.buttons.modules.cpu.text" = "#88c0d0"; + "theme.bar.buttons.modules.cpu.background" = "#ffffff0d"; + "theme.bar.buttons.modules.cpu.border" = "#ffffff18"; + + # Storage + "theme.bar.buttons.modules.storage.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.storage.icon" = "#b48ead"; + "theme.bar.buttons.modules.storage.text" = "#b48ead"; + "theme.bar.buttons.modules.storage.background" = "#ffffff0d"; + "theme.bar.buttons.modules.storage.border" = "#ffffff18"; + + # Netstat + "theme.bar.buttons.modules.netstat.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.netstat.icon" = "#a3be8c"; + "theme.bar.buttons.modules.netstat.text" = "#a3be8c"; + "theme.bar.buttons.modules.netstat.background" = "#ffffff0d"; + "theme.bar.buttons.modules.netstat.border" = "#ffffff18"; + + # Keyboard Layout + "theme.bar.buttons.modules.kbLayout.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.kbLayout.icon" = "#ffffffcc"; + "theme.bar.buttons.modules.kbLayout.text" = "#ffffffcc"; + "theme.bar.buttons.modules.kbLayout.background" = "#ffffff0d"; + "theme.bar.buttons.modules.kbLayout.border" = "#ffffff18"; + + # Updates + "theme.bar.buttons.modules.updates.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.updates.icon" = "#ebcb8b"; + "theme.bar.buttons.modules.updates.text" = "#ebcb8b"; + "theme.bar.buttons.modules.updates.background" = "#ffffff0d"; + "theme.bar.buttons.modules.updates.border" = "#ffffff18"; + + # Weather + "theme.bar.buttons.modules.weather.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.weather.icon" = "#ebcb8b"; + "theme.bar.buttons.modules.weather.text" = "#ebcb8b"; + "theme.bar.buttons.modules.weather.background" = "#ffffff0d"; + "theme.bar.buttons.modules.weather.border" = "#ffffff18"; + + # Power + "theme.bar.buttons.modules.power.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.power.icon" = "#bf616a"; + "theme.bar.buttons.modules.power.background" = "#ffffff0d"; + "theme.bar.buttons.modules.power.border" = "#ffffff18"; + + # Submap + "theme.bar.buttons.modules.submap.background" = "#ffffff0d"; + "theme.bar.buttons.modules.submap.text" = "#88c0d0"; + "theme.bar.buttons.modules.submap.border" = "#ffffff18"; + "theme.bar.buttons.modules.submap.icon" = "#88c0d0"; + "theme.bar.buttons.modules.submap.icon_background" = "#ffffff0d"; + + # Hyprsunset + "theme.bar.buttons.modules.hyprsunset.icon" = "#ebcb8b"; + "theme.bar.buttons.modules.hyprsunset.background" = "#ffffff0d"; + "theme.bar.buttons.modules.hyprsunset.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.hyprsunset.text" = "#ebcb8b"; + "theme.bar.buttons.modules.hyprsunset.border" = "#ffffff18"; + + # Hypridle + "theme.bar.buttons.modules.hypridle.icon" = "#b48ead"; + "theme.bar.buttons.modules.hypridle.background" = "#ffffff0d"; + "theme.bar.buttons.modules.hypridle.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.hypridle.text" = "#b48ead"; + "theme.bar.buttons.modules.hypridle.border" = "#ffffff18"; + + # Cava + "theme.bar.buttons.modules.cava.text" = "#88c0d0"; + "theme.bar.buttons.modules.cava.background" = "#ffffff0d"; + "theme.bar.buttons.modules.cava.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.cava.icon" = "#88c0d0"; + "theme.bar.buttons.modules.cava.border" = "#ffffff18"; + + # Microphone + "theme.bar.buttons.modules.microphone.border" = "#ffffff18"; + "theme.bar.buttons.modules.microphone.background" = "#ffffff0d"; + "theme.bar.buttons.modules.microphone.text" = "#a3be8c"; + "theme.bar.buttons.modules.microphone.icon" = "#a3be8c"; + "theme.bar.buttons.modules.microphone.icon_background" = "#ffffff0d"; + + # World Clock + "theme.bar.buttons.modules.worldclock.text" = "#ffffffcc"; + "theme.bar.buttons.modules.worldclock.background" = "#ffffff0d"; + "theme.bar.buttons.modules.worldclock.icon_background" = "#ffffff0d"; + "theme.bar.buttons.modules.worldclock.icon" = "#ffffffcc"; + "theme.bar.buttons.modules.worldclock.border" = "#ffffff18"; + + # ── Menu Theme (frosted glass) ────────────────────────────────── + "theme.bar.menus.background" = "#1a1b26cc"; + "theme.bar.menus.cards" = "#ffffff0d"; + "theme.bar.menus.border.color" = "#ffffff18"; + "theme.bar.menus.text" = "#ffffffdd"; + "theme.bar.menus.dimtext" = "#ffffff66"; + "theme.bar.menus.feinttext" = "#ffffff33"; + "theme.bar.menus.label" = "#88c0d0"; + "theme.bar.menus.popover.border" = "#ffffff18"; + "theme.bar.menus.popover.background" = "#1a1b26ee"; + "theme.bar.menus.popover.text" = "#88c0d0"; + "theme.bar.menus.listitems.active" = "#88c0d0"; + "theme.bar.menus.listitems.passive" = "#ffffffdd"; + "theme.bar.menus.icons.active" = "#88c0d0"; + "theme.bar.menus.icons.passive" = "#ffffff55"; + "theme.bar.menus.switch.enabled" = "#88c0d0"; + "theme.bar.menus.switch.disabled" = "#ffffff22"; + "theme.bar.menus.switch.puck" = "#ffffff44"; + "theme.bar.menus.check_radio_button.active" = "#88c0d0"; + "theme.bar.menus.check_radio_button.background" = "#ffffff0d"; + "theme.bar.menus.buttons.default" = "#88c0d0"; + "theme.bar.menus.buttons.active" = "#81a1c1"; + "theme.bar.menus.buttons.disabled" = "#ffffff22"; + "theme.bar.menus.buttons.text" = "#1a1b26"; + "theme.bar.menus.iconbuttons.active" = "#88c0d0"; + "theme.bar.menus.iconbuttons.passive" = "#ffffffdd"; + "theme.bar.menus.progressbar.foreground" = "#88c0d0"; + "theme.bar.menus.progressbar.background" = "#ffffff22"; + "theme.bar.menus.slider.primary" = "#88c0d0"; + "theme.bar.menus.slider.background" = "#ffffff22"; + "theme.bar.menus.slider.backgroundhover" = "#ffffff33"; + "theme.bar.menus.slider.puck" = "#ffffff44"; + "theme.bar.menus.dropdownmenu.background" = "#1a1b26ee"; + "theme.bar.menus.dropdownmenu.text" = "#ffffffdd"; + "theme.bar.menus.dropdownmenu.divider" = "#ffffff18"; + "theme.bar.menus.tooltip.background" = "#1a1b26ee"; + "theme.bar.menus.tooltip.text" = "#ffffffdd"; + + # Volume menu + "theme.bar.menus.menu.volume.card.color" = "#ffffff0d"; + "theme.bar.menus.menu.volume.background.color" = "#1a1b26cc"; + "theme.bar.menus.menu.volume.border.color" = "#ffffff18"; + "theme.bar.menus.menu.volume.label.color" = "#ebcb8b"; + "theme.bar.menus.menu.volume.text" = "#ffffffdd"; + "theme.bar.menus.menu.volume.listitems.active" = "#ebcb8b"; + "theme.bar.menus.menu.volume.listitems.passive" = "#ffffffdd"; + "theme.bar.menus.menu.volume.iconbutton.active" = "#ebcb8b"; + "theme.bar.menus.menu.volume.iconbutton.passive" = "#ffffffdd"; + "theme.bar.menus.menu.volume.icons.active" = "#ebcb8b"; + "theme.bar.menus.menu.volume.icons.passive" = "#ffffff55"; + "theme.bar.menus.menu.volume.audio_slider.primary" = "#ebcb8b"; + "theme.bar.menus.menu.volume.audio_slider.background" = "#ffffff22"; + "theme.bar.menus.menu.volume.audio_slider.backgroundhover" = "#ffffff33"; + "theme.bar.menus.menu.volume.audio_slider.puck" = "#ffffff44"; + "theme.bar.menus.menu.volume.input_slider.primary" = "#ebcb8b"; + "theme.bar.menus.menu.volume.input_slider.background" = "#ffffff22"; + "theme.bar.menus.menu.volume.input_slider.backgroundhover" = "#ffffff33"; + "theme.bar.menus.menu.volume.input_slider.puck" = "#ffffff44"; + + # Media menu + "theme.bar.menus.menu.media.background.color" = "#1a1b26cc"; + "theme.bar.menus.menu.media.card.color" = "#ffffff0d"; + "theme.bar.menus.menu.media.border.color" = "#ffffff18"; + "theme.bar.menus.menu.media.song" = "#88c0d0"; + "theme.bar.menus.menu.media.artist" = "#ffffffaa"; + "theme.bar.menus.menu.media.album" = "#b48ead"; + "theme.bar.menus.menu.media.timestamp" = "#ffffff88"; + "theme.bar.menus.menu.media.buttons.inactive" = "#ffffff33"; + "theme.bar.menus.menu.media.buttons.enabled" = "#88c0d0"; + "theme.bar.menus.menu.media.buttons.background" = "#88c0d0"; + "theme.bar.menus.menu.media.buttons.text" = "#1a1b26"; + "theme.bar.menus.menu.media.slider.primary" = "#88c0d0"; + "theme.bar.menus.menu.media.slider.background" = "#ffffff22"; + "theme.bar.menus.menu.media.slider.backgroundhover" = "#ffffff33"; + "theme.bar.menus.menu.media.slider.puck" = "#ffffff44"; + + # Network menu + "theme.bar.menus.menu.network.card.color" = "#ffffff0d"; + "theme.bar.menus.menu.network.background.color" = "#1a1b26cc"; + "theme.bar.menus.menu.network.border.color" = "#ffffff18"; + "theme.bar.menus.menu.network.label.color" = "#88c0d0"; + "theme.bar.menus.menu.network.text" = "#ffffffdd"; + "theme.bar.menus.menu.network.status.color" = "#ffffff55"; + "theme.bar.menus.menu.network.listitems.active" = "#88c0d0"; + "theme.bar.menus.menu.network.listitems.passive" = "#ffffffdd"; + "theme.bar.menus.menu.network.icons.active" = "#88c0d0"; + "theme.bar.menus.menu.network.icons.passive" = "#ffffff55"; + "theme.bar.menus.menu.network.iconbuttons.active" = "#88c0d0"; + "theme.bar.menus.menu.network.iconbuttons.passive" = "#ffffffdd"; + "theme.bar.menus.menu.network.switch.enabled" = "#88c0d0"; + "theme.bar.menus.menu.network.switch.disabled" = "#ffffff22"; + "theme.bar.menus.menu.network.switch.puck" = "#ffffff44"; + "theme.bar.menus.menu.network.scroller.color" = "#88c0d0"; + + # Bluetooth menu + "theme.bar.menus.menu.bluetooth.card.color" = "#ffffff0d"; + "theme.bar.menus.menu.bluetooth.background.color" = "#1a1b26cc"; + "theme.bar.menus.menu.bluetooth.border.color" = "#ffffff18"; + "theme.bar.menus.menu.bluetooth.label.color" = "#81a1c1"; + "theme.bar.menus.menu.bluetooth.text" = "#ffffffdd"; + "theme.bar.menus.menu.bluetooth.status" = "#ffffff55"; + "theme.bar.menus.menu.bluetooth.switch_divider" = "#ffffff18"; + "theme.bar.menus.menu.bluetooth.switch.enabled" = "#81a1c1"; + "theme.bar.menus.menu.bluetooth.switch.disabled" = "#ffffff22"; + "theme.bar.menus.menu.bluetooth.switch.puck" = "#ffffff44"; + "theme.bar.menus.menu.bluetooth.listitems.active" = "#81a1c1"; + "theme.bar.menus.menu.bluetooth.listitems.passive" = "#ffffffdd"; + "theme.bar.menus.menu.bluetooth.icons.active" = "#81a1c1"; + "theme.bar.menus.menu.bluetooth.icons.passive" = "#ffffff55"; + "theme.bar.menus.menu.bluetooth.iconbutton.active" = "#81a1c1"; + "theme.bar.menus.menu.bluetooth.iconbutton.passive" = "#ffffffdd"; + "theme.bar.menus.menu.bluetooth.scroller.color" = "#81a1c1"; + + # Systray menu + "theme.bar.menus.menu.systray.dropdownmenu.background" = "#1a1b26ee"; + "theme.bar.menus.menu.systray.dropdownmenu.text" = "#ffffffdd"; + "theme.bar.menus.menu.systray.dropdownmenu.divider" = "#ffffff18"; + + # Battery menu + "theme.bar.menus.menu.battery.card.color" = "#ffffff0d"; + "theme.bar.menus.menu.battery.background.color" = "#1a1b26cc"; + "theme.bar.menus.menu.battery.border.color" = "#ffffff18"; + "theme.bar.menus.menu.battery.label.color" = "#a3be8c"; + "theme.bar.menus.menu.battery.text" = "#ffffffdd"; + "theme.bar.menus.menu.battery.listitems.active" = "#a3be8c"; + "theme.bar.menus.menu.battery.listitems.passive" = "#ffffffdd"; + "theme.bar.menus.menu.battery.icons.active" = "#a3be8c"; + "theme.bar.menus.menu.battery.icons.passive" = "#ffffff55"; + "theme.bar.menus.menu.battery.slider.primary" = "#a3be8c"; + "theme.bar.menus.menu.battery.slider.background" = "#ffffff22"; + "theme.bar.menus.menu.battery.slider.backgroundhover" = "#ffffff33"; + "theme.bar.menus.menu.battery.slider.puck" = "#ffffff44"; + + # Clock menu + "theme.bar.menus.menu.clock.card.color" = "#ffffff0d"; + "theme.bar.menus.menu.clock.background.color" = "#1a1b26cc"; + "theme.bar.menus.menu.clock.border.color" = "#ffffff18"; + "theme.bar.menus.menu.clock.text" = "#ffffffdd"; + "theme.bar.menus.menu.clock.time.time" = "#88c0d0"; + "theme.bar.menus.menu.clock.time.timeperiod" = "#81a1c1"; + "theme.bar.menus.menu.clock.calendar.yearmonth" = "#88c0d0"; + "theme.bar.menus.menu.clock.calendar.weekdays" = "#81a1c1"; + "theme.bar.menus.menu.clock.calendar.paginator" = "#88c0d0"; + "theme.bar.menus.menu.clock.calendar.currentday" = "#88c0d0"; + "theme.bar.menus.menu.clock.calendar.days" = "#ffffffdd"; + "theme.bar.menus.menu.clock.calendar.contextdays" = "#ffffff33"; + "theme.bar.menus.menu.clock.weather.icon" = "#ebcb8b"; + "theme.bar.menus.menu.clock.weather.temperature" = "#ffffffdd"; + "theme.bar.menus.menu.clock.weather.status" = "#88c0d0"; + "theme.bar.menus.menu.clock.weather.stats" = "#81a1c1"; + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot" = "#bf616a"; + "theme.bar.menus.menu.clock.weather.thermometer.hot" = "#d08770"; + "theme.bar.menus.menu.clock.weather.thermometer.moderate" = "#ebcb8b"; + "theme.bar.menus.menu.clock.weather.thermometer.cold" = "#88c0d0"; + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold" = "#5e81ac"; + "theme.bar.menus.menu.clock.weather.hourly.time" = "#81a1c1"; + "theme.bar.menus.menu.clock.weather.hourly.icon" = "#88c0d0"; + "theme.bar.menus.menu.clock.weather.hourly.temperature" = "#ffffffdd"; + + # Dashboard menu + "theme.bar.menus.menu.dashboard.card.color" = "#ffffff0d"; + "theme.bar.menus.menu.dashboard.background.color" = "#1a1b26cc"; + "theme.bar.menus.menu.dashboard.border.color" = "#ffffff18"; + "theme.bar.menus.menu.dashboard.profile.name" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.powermenu.shutdown" = "#bf616a"; + "theme.bar.menus.menu.dashboard.powermenu.restart" = "#d08770"; + "theme.bar.menus.menu.dashboard.powermenu.logout" = "#a3be8c"; + "theme.bar.menus.menu.dashboard.powermenu.sleep" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card" = "#ffffff0d"; + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background" = "#1a1b26ee"; + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border" = "#ffffff18"; + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body" = "#ffffffdd"; + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm" = "#a3be8c"; + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny" = "#bf616a"; + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text" = "#1a1b26"; + "theme.bar.menus.menu.dashboard.shortcuts.background" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.shortcuts.text" = "#1a1b26"; + "theme.bar.menus.menu.dashboard.shortcuts.recording" = "#a3be8c"; + "theme.bar.menus.menu.dashboard.controls.disabled" = "#ffffff22"; + "theme.bar.menus.menu.dashboard.controls.wifi.background" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.controls.wifi.text" = "#1a1b26"; + "theme.bar.menus.menu.dashboard.controls.bluetooth.background" = "#81a1c1"; + "theme.bar.menus.menu.dashboard.controls.bluetooth.text" = "#1a1b26"; + "theme.bar.menus.menu.dashboard.controls.notifications.background" = "#ebcb8b"; + "theme.bar.menus.menu.dashboard.controls.notifications.text" = "#1a1b26"; + "theme.bar.menus.menu.dashboard.controls.volume.background" = "#d08770"; + "theme.bar.menus.menu.dashboard.controls.volume.text" = "#1a1b26"; + "theme.bar.menus.menu.dashboard.controls.input.background" = "#b48ead"; + "theme.bar.menus.menu.dashboard.controls.input.text" = "#1a1b26"; + "theme.bar.menus.menu.dashboard.directories.left.top.color" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.directories.left.middle.color" = "#a3be8c"; + "theme.bar.menus.menu.dashboard.directories.left.bottom.color" = "#bf616a"; + "theme.bar.menus.menu.dashboard.directories.right.top.color" = "#81a1c1"; + "theme.bar.menus.menu.dashboard.directories.right.middle.color" = "#b48ead"; + "theme.bar.menus.menu.dashboard.directories.right.bottom.color" = "#d08770"; + "theme.bar.menus.menu.dashboard.monitors.bar_background" = "#ffffff22"; + "theme.bar.menus.menu.dashboard.monitors.cpu.icon" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.monitors.cpu.bar" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.monitors.cpu.label" = "#88c0d0"; + "theme.bar.menus.menu.dashboard.monitors.ram.icon" = "#a3be8c"; + "theme.bar.menus.menu.dashboard.monitors.ram.bar" = "#a3be8c"; + "theme.bar.menus.menu.dashboard.monitors.ram.label" = "#a3be8c"; + "theme.bar.menus.menu.dashboard.monitors.gpu.icon" = "#ebcb8b"; + "theme.bar.menus.menu.dashboard.monitors.gpu.bar" = "#ebcb8b"; + "theme.bar.menus.menu.dashboard.monitors.gpu.label" = "#ebcb8b"; + "theme.bar.menus.menu.dashboard.monitors.disk.icon" = "#b48ead"; + "theme.bar.menus.menu.dashboard.monitors.disk.bar" = "#b48ead"; + "theme.bar.menus.menu.dashboard.monitors.disk.label" = "#b48ead"; + + # Power menu + "theme.bar.menus.menu.power.background.color" = "#1a1b26cc"; + "theme.bar.menus.menu.power.border.color" = "#ffffff18"; + "theme.bar.menus.menu.power.buttons.shutdown.background" = "#ffffff0d"; + "theme.bar.menus.menu.power.buttons.shutdown.icon_background" = "#bf616a"; + "theme.bar.menus.menu.power.buttons.shutdown.text" = "#ffffffdd"; + "theme.bar.menus.menu.power.buttons.shutdown.icon" = "#1a1b26"; + "theme.bar.menus.menu.power.buttons.restart.background" = "#ffffff0d"; + "theme.bar.menus.menu.power.buttons.restart.icon_background" = "#d08770"; + "theme.bar.menus.menu.power.buttons.restart.text" = "#d08770"; + "theme.bar.menus.menu.power.buttons.restart.icon" = "#1a1b26"; + "theme.bar.menus.menu.power.buttons.logout.background" = "#ffffff0d"; + "theme.bar.menus.menu.power.buttons.logout.icon_background" = "#a3be8c"; + "theme.bar.menus.menu.power.buttons.logout.text" = "#a3be8c"; + "theme.bar.menus.menu.power.buttons.logout.icon" = "#1a1b26"; + "theme.bar.menus.menu.power.buttons.sleep.background" = "#ffffff0d"; + "theme.bar.menus.menu.power.buttons.sleep.icon_background" = "#88c0d0"; + "theme.bar.menus.menu.power.buttons.sleep.text" = "#88c0d0"; + "theme.bar.menus.menu.power.buttons.sleep.icon" = "#1a1b26"; + + # Notifications menu + "theme.bar.menus.menu.notifications.background" = "#1a1b26cc"; + "theme.bar.menus.menu.notifications.card" = "#ffffff0d"; + "theme.bar.menus.menu.notifications.border" = "#ffffff18"; + "theme.bar.menus.menu.notifications.label" = "#88c0d0"; + "theme.bar.menus.menu.notifications.no_notifications_label" = "#ffffff44"; + "theme.bar.menus.menu.notifications.switch_divider" = "#ffffff18"; + "theme.bar.menus.menu.notifications.clear" = "#88c0d0"; + "theme.bar.menus.menu.notifications.switch.enabled" = "#88c0d0"; + "theme.bar.menus.menu.notifications.switch.disabled" = "#ffffff22"; + "theme.bar.menus.menu.notifications.switch.puck" = "#ffffff44"; + "theme.bar.menus.menu.notifications.pager.background" = "#ffffff0d"; + "theme.bar.menus.menu.notifications.pager.button" = "#88c0d0"; + "theme.bar.menus.menu.notifications.pager.label" = "#ffffff66"; + "theme.bar.menus.menu.notifications.scrollbar.color" = "#88c0d0"; + + # ── OSD Theme ──────────────────────────────────────────────────── + "theme.osd.bar_container" = "#1a1b26cc"; + "theme.osd.icon_container" = "#88c0d0"; + "theme.osd.bar_color" = "#88c0d0"; + "theme.osd.bar_empty_color" = "#ffffff22"; + "theme.osd.bar_overflow_color" = "#bf616a"; + "theme.osd.icon" = "#1a1b26"; + "theme.osd.label" = "#88c0d0"; + + # ── Notification Theme (frosted) ──────────────────────────────── + "theme.notification.background" = "#1a1b26cc"; + "theme.notification.actions.background" = "#88c0d0"; + "theme.notification.actions.text" = "#1a1b26"; + "theme.notification.label" = "#88c0d0"; + "theme.notification.border" = "#ffffff18"; + "theme.notification.time" = "#ffffff66"; + "theme.notification.text" = "#ffffffdd"; + "theme.notification.labelicon" = "#88c0d0"; + "theme.notification.close_button.background" = "#88c0d0"; + "theme.notification.close_button.label" = "#1a1b26"; + }; + }; +} diff --git a/config/keyd/default.conf b/config/keyd/default.conf index 6de897895..4c6406a4f 100644 --- a/config/keyd/default.conf +++ b/config/keyd/default.conf @@ -74,6 +74,9 @@ right = C-right up = C-up down = C-down +# Walker launcher (Framework+Space → Ctrl+Alt+Shift+Space) +space = C-A-S-space + # Display zoom (Hyprland intercepts these globally) equal = C-A-S-equal minus = C-A-S-minus diff --git a/config/swaync/config.json b/config/swaync/config.json deleted file mode 100644 index d9d6b1c26..000000000 --- a/config/swaync/config.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "$schema": "/etc/xdg/swaync/configSchema.json", - "positionX": "right", - "positionY": "top", - "layer": "overlay", - "control-center-width": 420, - "control-center-height": 600, - "notification-window-width": 380, - "notification-icon-size": 48, - "notification-body-image-height": 100, - "notification-body-image-width": 200, - "timeout": 5, - "timeout-low": 3, - "timeout-critical": 0, - "fit-to-screen": true, - "relative-timestamps": true, - "hide-on-action": true, - "hide-on-clear": true, - "widgets": [ - "title", - "dnd", - "notifications" - ], - "widget-config": { - "title": { - "text": "Notifications", - "clear-all-button": true, - "button-text": "Clear" - }, - "dnd": { - "text": "Do Not Disturb" - } - } -} diff --git a/config/swaync/default.nix b/config/swaync/default.nix deleted file mode 100644 index 0bf0a28d0..000000000 --- a/config/swaync/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ config, ... }: -{ - xdg.configFile."swaync/config.json" = { - source = ./config.json; - force = true; - }; - xdg.configFile."swaync/style.css" = { - source = ./style.css; - force = true; - }; -} diff --git a/config/swaync/style.css b/config/swaync/style.css deleted file mode 100644 index 9e09f66bb..000000000 --- a/config/swaync/style.css +++ /dev/null @@ -1,119 +0,0 @@ -.notification-row { - outline: none; -} - -.notification-row:focus, -.notification-row:hover { - background: #44475a; -} - -.notification { - border-radius: 12px; - margin: 4px 8px; - padding: 0; - border: 2px solid #44475a; - background: #282a36; -} - -.notification-content { - padding: 8px; -} - -.close-button { - background: #ff5555; - color: #282a36; - border-radius: 50%; - margin: 4px; - padding: 2px; - min-width: 20px; - min-height: 20px; -} - -.close-button:hover { - background: #ff79c6; -} - -.notification-default-action, -.notification-action { - border-radius: 8px; - margin: 4px; - padding: 4px 8px; - background: #44475a; - color: #f8f8f2; - border: none; -} - -.notification-default-action:hover, -.notification-action:hover { - background: #6272a4; -} - -.summary { - font-weight: bold; - font-size: 14px; - color: #f8f8f2; -} - -.body { - font-size: 13px; - color: #f8f8f2; -} - -.time { - font-size: 11px; - color: #6272a4; - margin-right: 8px; -} - -.control-center { - background: #282a36; - border: 2px solid #44475a; - border-radius: 12px; - margin: 8px; - padding: 8px; -} - -.control-center-list { - background: transparent; -} - -.widget-title { - color: #f8f8f2; - font-size: 16px; - font-weight: bold; - margin: 8px; -} - -.widget-title > button { - background: #bd93f9; - color: #282a36; - border-radius: 8px; - padding: 4px 12px; - border: none; - font-weight: bold; -} - -.widget-title > button:hover { - background: #ff79c6; -} - -.widget-dnd { - color: #f8f8f2; - margin: 4px 8px; - font-size: 14px; -} - -.widget-dnd > switch { - background: #44475a; - border-radius: 12px; - border: 2px solid #6272a4; -} - -.widget-dnd > switch:checked { - background: #bd93f9; -} - -.widget-dnd > switch slider { - background: #f8f8f2; - border-radius: 50%; -} diff --git a/config/walker/config.toml b/config/walker/config.toml new file mode 100644 index 000000000..3b63d5191 --- /dev/null +++ b/config/walker/config.toml @@ -0,0 +1,75 @@ +force_keyboard_focus = true +close_when_open = true +click_to_close = true +single_click_activation = true +selection_wrap = true +theme = "dracula" +resume_last_query = false +disable_mouse = false + +[shell] +anchor_top = true +anchor_bottom = false +anchor_left = true +anchor_right = true + +[placeholders] +"default" = { input = "Search...", list = "No Results" } + +[keybinds] +close = ["Escape"] +next = ["Down"] +previous = ["Up"] + +[providers] +default = ["desktopapplications", "customcommands", "calc", "websearch"] +empty = ["desktopapplications"] +max_results = 8 + +[[providers.prefixes]] +prefix = "=" +provider = "calc" + +[[providers.prefixes]] +prefix = "@" +provider = "websearch" + +[[providers.prefixes]] +prefix = ">" +provider = "runner" + +[[providers.prefixes]] +prefix = "/" +provider = "files" + +[[providers.prefixes]] +prefix = ":" +provider = "clipboard" + +[[providers.prefixes]] +prefix = "$" +provider = "windows" + +[[providers.prefixes]] +prefix = ";" +provider = "providerlist" + +# ============================================================================= +# Custom Commands (searchable system actions) +# ============================================================================= +[customcommands] +"Lock Screen" = "hyprlock" +"Start Screen Saver" = "hyprlock" +"Suspend" = "systemctl suspend" +"Reboot" = "systemctl reboot" +"Shutdown" = "systemctl poweroff" +"Logout" = "hyprctl dispatch exit" +"Toggle WiFi" = "nmcli radio wifi toggle" +"Bluetooth Manager" = "blueman-manager" +"Audio Settings" = "pavucontrol" +"Screenshot Region" = "grim -g \"$(slurp)\" - | swappy -f -" +"Record Screen" = "~/.config/hypr/scripts/record-screen.sh" +"Color Picker" = "hyprpicker -a" +"Toggle Notifications" = "hyprpanel toggleWindow notifications-center" +"Network Menu" = "hyprpanel toggleWindow network-menu" +"Power Menu" = "hyprpanel toggleWindow power-menu" diff --git a/config/walker/default.nix b/config/walker/default.nix new file mode 100644 index 000000000..d0b1e4714 --- /dev/null +++ b/config/walker/default.nix @@ -0,0 +1,11 @@ +{ config, pkgs, ... }: +{ + xdg.configFile."walker/config.toml" = { + source = ./config.toml; + force = true; + }; + xdg.configFile."walker/themes/dracula/style.css" = { + source = ./style.css; + force = true; + }; +} diff --git a/config/walker/style.css b/config/walker/style.css new file mode 100644 index 000000000..5c8ad1eb6 --- /dev/null +++ b/config/walker/style.css @@ -0,0 +1,75 @@ +#window { + background-color: rgba(40, 42, 54, 0.92); + border: 2px solid #bd93f9; + border-radius: 12px; +} + +#box { + padding: 8px; +} + +#input { + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 18px; + padding: 12px 16px; + background-color: #44475a; + color: #f8f8f2; + border: 2px solid transparent; + border-radius: 8px; + margin-bottom: 8px; +} + +#input:focus { + border-color: #bd93f9; +} + +#list { + background-color: transparent; +} + +#list row { + padding: 8px 12px; + border-radius: 8px; + margin: 2px 0; +} + +#list row:selected { + background-color: #bd93f9; +} + +#list row:hover:not(:selected) { + background-color: #44475a; +} + +.item-label { + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 14px; + color: #f8f8f2; +} + +#list row:selected .item-label { + color: #282a36; +} + +.item-sub { + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 12px; + color: #6272a4; +} + +#list row:selected .item-sub { + color: #44475a; +} + +.item-icon { + margin-right: 12px; +} + +.activation-label { + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 12px; + color: #6272a4; + padding: 2px 6px; + background-color: #44475a; + border-radius: 4px; +} diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc deleted file mode 100644 index 726855004..000000000 --- a/config/waybar/config.jsonc +++ /dev/null @@ -1,124 +0,0 @@ -{ - "layer": "top", - "position": "top", - "height": 36, - "spacing": 4, - - "modules-left": ["hyprland/workspaces"], - "modules-center": ["clock"], - "modules-right": [ - "cpu", - "memory", - "pulseaudio", - "backlight", - "battery", - "network", - "bluetooth", - "tray", - "custom/notification" - ], - - "hyprland/workspaces": { - "format": "{id}", - "on-click": "activate", - "sort-by-number": true - }, - - "clock": { - "interval": 1, - "format": "{:%Y/%m/%d %H:%M:%S}", - "tooltip-format": "{calendar}", - "calendar": { - "mode": "month", - "weeks-pos": "left", - "format": { - "months": "{}", - "weeks": "W{}", - "weekdays": "{}", - "today": "{}" - } - } - }, - - "cpu": { - "interval": 5, - "format": " {usage}%", - "tooltip-format": "{avg_frequency} GHz\n{usage}% used" - }, - - "memory": { - "interval": 5, - "format": " {percentage}%", - "tooltip-format": "{used:0.1f} / {total:0.1f} GiB" - }, - - "pulseaudio": { - "format": "{icon} {volume}%", - "format-muted": "󰝟 muted", - "format-icons": { - "default": ["󰕿", "󰖀", "󰕾"] - }, - "on-click": "pavucontrol", - "scroll-step": 5, - "tooltip": true - }, - - "backlight": { - "format": "{icon} {percent}%", - "format-icons": ["󰃞", "󰃟", "󰃠"], - "tooltip": true - }, - - "battery": { - "interval": 30, - "states": { - "warning": 30, - "critical": 15 - }, - "format": "{icon} {capacity}%", - "format-charging": "󰂄 {capacity}%", - "format-plugged": "󰂄 {capacity}%", - "format-icons": ["󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"], - "tooltip-format": "{timeTo}\n{capacity}% - {power}W" - }, - - "network": { - "format-wifi": "󰤨 {essid}", - "format-ethernet": "󰈀 {ipaddr}", - "format-disconnected": "󰤭 disconnected", - "tooltip-format-wifi": "{essid} ({signalStrength}%)\n{ipaddr}", - "tooltip-format-ethernet": "{ifname}\n{ipaddr}", - "on-click": "nm-connection-editor" - }, - - "bluetooth": { - "format": "󰂯", - "format-connected": "󰂱 {num_connections}", - "format-disabled": "󰂲", - "tooltip-format": "{status}\n{device_enumerate}", - "tooltip-format-enumerate-connected": "{device_alias}", - "on-click": "blueman-manager" - }, - - "tray": { - "icon-size": 16, - "spacing": 8 - }, - - "custom/notification": { - "tooltip": false, - "format": "{icon}", - "format-icons": { - "notification": "󰂚", - "none": "󰂜", - "dnd-notification": "󰂛", - "dnd-none": "󰪑" - }, - "return-type": "json", - "exec-if": "which swaync-client", - "exec": "swaync-client -swb", - "on-click": "swaync-client -t -sw", - "on-click-right": "swaync-client -d -sw", - "escape": true - } -} diff --git a/config/waybar/default.nix b/config/waybar/default.nix deleted file mode 100644 index 88d5c2824..000000000 --- a/config/waybar/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ config, ... }: -{ - xdg.configFile."waybar/config.jsonc" = { - source = ./config.jsonc; - force = true; - }; - xdg.configFile."waybar/style.css" = { - source = ./style.css; - force = true; - }; -} diff --git a/config/waybar/style.css b/config/waybar/style.css deleted file mode 100644 index 6e6b66a39..000000000 --- a/config/waybar/style.css +++ /dev/null @@ -1,143 +0,0 @@ -/* Dracula */ -@define-color background #282a36; -@define-color currentline #44475a; -@define-color foreground #f8f8f2; -@define-color comment #6272a4; -@define-color cyan #8be9fd; -@define-color green #50fa7b; -@define-color orange #ffb86c; -@define-color pink #ff79c6; -@define-color purple #bd93f9; -@define-color red #ff5555; -@define-color yellow #f1fa8c; - -* { - font-family: "JetBrainsMono Nerd Font", monospace; - font-size: 13px; - min-height: 0; -} - -window#waybar { - background-color: @background; - color: @foreground; - border-bottom: 2px solid @currentline; -} - -tooltip { - background-color: @background; - border: 1px solid @comment; - border-radius: 8px; - color: @foreground; -} - -#workspaces button { - padding: 0 8px; - color: @comment; - border-radius: 6px; - margin: 3px 2px; - background-color: transparent; -} - -#workspaces button.active { - color: @background; - background-color: @purple; -} - -#workspaces button:hover { - background-color: @currentline; - color: @foreground; -} - -#clock { - color: @foreground; - font-weight: bold; -} - -#cpu { - color: @orange; -} - -#memory { - color: @green; -} - -#pulseaudio { - color: @cyan; -} - -#pulseaudio.muted { - color: @comment; -} - -#backlight { - color: @yellow; -} - -#battery { - color: @green; -} - -#battery.warning { - color: @yellow; -} - -#battery.critical { - color: @red; - animation: blink 1s linear infinite; -} - -@keyframes blink { - to { - color: @background; - background-color: @red; - } -} - -#battery.charging { - color: @green; -} - -#network { - color: @cyan; -} - -#network.disconnected { - color: @comment; -} - -#bluetooth { - color: @purple; -} - -#bluetooth.disabled { - color: @comment; -} - -#tray { - color: @foreground; -} - -#tray > .passive { - -gtk-icon-effect: dim; -} - -#custom-notification { - color: @orange; - padding: 0 6px; -} - -/* Module spacing */ -#cpu, -#memory, -#pulseaudio, -#backlight, -#battery, -#network, -#bluetooth, -#tray, -#clock, -#custom-notification { - padding: 0 10px; - margin: 3px 0; - border-radius: 6px; -} diff --git a/config/wlogout/default.nix b/config/wlogout/default.nix deleted file mode 100644 index 31e3f5204..000000000 --- a/config/wlogout/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ config, ... }: -{ - xdg.configFile."wlogout/layout" = { - source = ./layout; - force = true; - }; - xdg.configFile."wlogout/style.css" = { - source = ./style.css; - force = true; - }; -} diff --git a/config/wlogout/layout b/config/wlogout/layout deleted file mode 100644 index bcb426522..000000000 --- a/config/wlogout/layout +++ /dev/null @@ -1,30 +0,0 @@ -{ - "label" : "lock", - "action" : "hyprlock", - "text" : "Lock", - "keybind" : "l" -} -{ - "label" : "logout", - "action" : "hyprctl dispatch exit", - "text" : "Logout", - "keybind" : "e" -} -{ - "label" : "suspend", - "action" : "systemctl suspend", - "text" : "Suspend", - "keybind" : "s" -} -{ - "label" : "reboot", - "action" : "systemctl reboot", - "text" : "Reboot", - "keybind" : "r" -} -{ - "label" : "shutdown", - "action" : "systemctl poweroff", - "text" : "Shutdown", - "keybind" : "p" -} diff --git a/config/wlogout/style.css b/config/wlogout/style.css deleted file mode 100644 index 86cee1020..000000000 --- a/config/wlogout/style.css +++ /dev/null @@ -1,49 +0,0 @@ -window { - background-color: rgba(40, 42, 54, 0.9); - font-family: "JetBrainsMono Nerd Font", monospace; -} - -button { - background-color: #44475a; - border-radius: 12px; - margin: 10px; - padding: 20px; - color: #f8f8f2; - font-size: 18px; - border: 2px solid #6272a4; - background-repeat: no-repeat; - background-position: center; - background-size: 48px; -} - -button:focus, -button:hover { - background-color: #6272a4; - border-color: #bd93f9; - outline: none; -} - -button:active { - background-color: #bd93f9; - color: #282a36; -} - -#lock { - background-image: image(url("/usr/share/wlogout/icons/lock.png")); -} - -#logout { - background-image: image(url("/usr/share/wlogout/icons/logout.png")); -} - -#suspend { - background-image: image(url("/usr/share/wlogout/icons/suspend.png")); -} - -#reboot { - background-image: image(url("/usr/share/wlogout/icons/reboot.png")); -} - -#shutdown { - background-image: image(url("/usr/share/wlogout/icons/shutdown.png")); -} diff --git a/config/wofi/config b/config/wofi/config deleted file mode 100644 index 678ed7bd7..000000000 --- a/config/wofi/config +++ /dev/null @@ -1,15 +0,0 @@ -width=600 -height=400 -location=center -show=drun -prompt=Search... -filter_rate=100 -allow_markup=true -no_actions=true -halign=fill -orientation=vertical -content_halign=fill -insensitive=true -allow_images=true -image_size=24 -layer=overlay diff --git a/config/wofi/default.nix b/config/wofi/default.nix deleted file mode 100644 index 11116bbfb..000000000 --- a/config/wofi/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ config, ... }: -{ - xdg.configFile."wofi/config" = { - source = ./config; - force = true; - }; - xdg.configFile."wofi/style.css" = { - source = ./style.css; - force = true; - }; -} diff --git a/config/wofi/style.css b/config/wofi/style.css deleted file mode 100644 index 45c29b8fc..000000000 --- a/config/wofi/style.css +++ /dev/null @@ -1,58 +0,0 @@ -window { - margin: 0; - border: 2px solid #bd93f9; - border-radius: 12px; - background-color: #282a36; - font-family: "JetBrainsMono Nerd Font", monospace; - font-size: 14px; -} - -#input { - margin: 8px; - padding: 8px 12px; - border: none; - border-radius: 8px; - background-color: #44475a; - color: #f8f8f2; - font-size: 14px; -} - -#input:focus { - border: 2px solid #bd93f9; -} - -#inner-box { - margin: 4px 8px; -} - -#outer-box { - margin: 0; - padding: 0; -} - -#scroll { - margin: 0; -} - -#text { - color: #f8f8f2; - margin: 0 4px; -} - -#entry { - padding: 6px 8px; - border-radius: 8px; -} - -#entry:selected { - background-color: #bd93f9; - color: #282a36; -} - -#entry:hover { - background-color: #44475a; -} - -#img { - margin-right: 8px; -} diff --git a/flake.nix b/flake.nix index 3e7191ed7..8ea444a4b 100644 --- a/flake.nix +++ b/flake.nix @@ -182,7 +182,7 @@ treefmtSettings = lib.recursiveUpdate treefmtToml { formatter = { nix = (treefmtToml.formatter.nix or { }) // { - command = lib.getExe pkgs.nixfmt-rfc-style; + command = lib.getExe pkgs.nixfmt; }; biome = (treefmtToml.formatter.biome or { }) // { command = lib.getExe pkgs.biome; diff --git a/home-manager/packages/default.nix b/home-manager/packages/default.nix index 6e45ad4dc..4ac5c2631 100644 --- a/home-manager/packages/default.nix +++ b/home-manager/packages/default.nix @@ -95,7 +95,7 @@ with pkgs; atop below binutils - blueberry + blueman claude-code cmake codex @@ -122,6 +122,7 @@ with pkgs; chromium clickup cliphist + discord emote ffmpeg ghostty @@ -130,22 +131,21 @@ with pkgs; grim hypridle hyprlock + hyprpicker + hyprshot + hyprsunset libnotify - networkmanagerapplet pavucontrol playerctl signal-desktop slack slurp swappy - swaynotificationcenter - swww + linux-wallpaperengine vlc vscode - waybar + walker + wf-recorder + wl-clip-persist wl-clipboard - wlogout - wob - wofi - wofi-emoji ] diff --git a/home-manager/programs/fish/default.nix b/home-manager/programs/fish/default.nix index 5ec74b63c..e42666780 100644 --- a/home-manager/programs/fish/default.nix +++ b/home-manager/programs/fish/default.nix @@ -111,6 +111,9 @@ pixeh = "_pixeh_function"; sag = "_ssh_add_github"; shortcuts = "_fish_shortcuts"; + tdo = "_tdo_function"; + tmo = "_tmo_function"; + tpo = "_tpo_function"; zdo = "_zdo_function"; zmo = "_zmo_function"; zpo = "_zpo_function"; @@ -192,6 +195,9 @@ "_pixe_function" "_pixeh_function" "_ssh_add_github" + "_tdo_function" + "_tmo_function" + "_tpo_function" "_zdo_function" "_zmo_function" "_zpo_function" diff --git a/home-manager/programs/fish/functions/_tdo_function.fish b/home-manager/programs/fish/functions/_tdo_function.fish new file mode 100644 index 000000000..075b20867 --- /dev/null +++ b/home-manager/programs/fish/functions/_tdo_function.fish @@ -0,0 +1,3 @@ +function _tdo_function --description "Attach to tmux desktop session" + tmux new-session -A -s desktop +end diff --git a/home-manager/programs/fish/functions/_tmo_function.fish b/home-manager/programs/fish/functions/_tmo_function.fish new file mode 100644 index 000000000..232a6d165 --- /dev/null +++ b/home-manager/programs/fish/functions/_tmo_function.fish @@ -0,0 +1,3 @@ +function _tmo_function --description "Attach to tmux mobile session" + tmux new-session -A -s mobile +end diff --git a/home-manager/programs/fish/functions/_tpo_function.fish b/home-manager/programs/fish/functions/_tpo_function.fish new file mode 100644 index 000000000..f759b03ed --- /dev/null +++ b/home-manager/programs/fish/functions/_tpo_function.fish @@ -0,0 +1,3 @@ +function _tpo_function --description "Attach to tmux primary session" + tmux new-session -A -s primary +end diff --git a/home-manager/programs/tmux/default.nix b/home-manager/programs/tmux/default.nix index 841289898..ad1f78216 100644 --- a/home-manager/programs/tmux/default.nix +++ b/home-manager/programs/tmux/default.nix @@ -4,10 +4,15 @@ enable = true; extraConfig = builtins.readFile ./tmux.conf; plugins = with pkgs.tmuxPlugins; [ - dracula sensible - tmux-fzf yank + tmux-fzf + resurrect + continuum + tmux-sessionx + tmux-thumbs + open + extrakto ]; }; } diff --git a/home-manager/programs/tmux/tmux.conf b/home-manager/programs/tmux/tmux.conf index 183095546..feafaab0b 100644 --- a/home-manager/programs/tmux/tmux.conf +++ b/home-manager/programs/tmux/tmux.conf @@ -97,10 +97,40 @@ set -g display-panes-active-colour colour245 set -g clock-mode-colour colour39 set -g clock-mode-style 24 -# Dracula theme -# From: https://github.com/dracula/tmux/blob/master/docs/CONFIG.md#Plugins -set -g @dracula-plugins "git battery time" -set -g @dracula-show-powerline false -set -g @dracula-show-battery true -set -g @dracula-refresh-rate 10 -set -g @dracula-time-format "%Y/%m/%d %H:%M" +# ============================================================================= +# Status bar — clean green theme +# ============================================================================= +set -g status-style "bg=colour22,fg=colour255" +set -g status-left "#[bg=colour28,fg=colour255,bold] #S #[bg=colour22,fg=colour28] " +set -g status-right "#[fg=colour250]#{?#{pane_current_command},#{pane_current_command},} #[fg=colour28]| #[fg=colour255]%Y/%m/%d %H:%M " +set -g status-left-length 30 +set -g status-right-length 60 + +# Window status +set -g window-status-format " #I:#W " +set -g window-status-current-format "#[bg=colour28,fg=colour255,bold] #I:#W " +set -g window-status-separator "" + +# Pane border +set -g pane-border-style "fg=colour238" +set -g pane-active-border-style "fg=colour82,bold" + +# Message style +set -g message-style "bg=colour28,fg=colour255" + +# ============================================================================= +# Plugin configuration +# ============================================================================= +# Resurrect + Continuum (session persistence) +set -g @resurrect-capture-pane-contents 'on' +set -g @continuum-restore 'on' +set -g @continuum-save-interval '15' + +# Tmux-thumbs (quick text copy) +set -g @thumbs-key Space + +# Sessionx (session manager) +set -g @sessionx-bind 'o' + +# Extrakto (text extraction) +set -g @extrakto_key 'tab' diff --git a/named-hosts/matic/default.nix b/named-hosts/matic/default.nix index fb9bba17f..0a092f870 100644 --- a/named-hosts/matic/default.nix +++ b/named-hosts/matic/default.nix @@ -90,8 +90,12 @@ inputs.nixpkgs.lib.nixosSystem { services.fwupd.enable = true; # Power management + services.upower.enable = true; services.power-profiles-daemon.enable = true; + # Power button behavior - lock screen instead of shutdown + services.logind.settings.Login.HandlePowerKey = "lock"; + # Auto timezone (via geolocation) services.geoclue2.enable = true; services.localtimed.enable = true; @@ -110,13 +114,25 @@ inputs.nixpkgs.lib.nixosSystem { # Bluetooth hardware.bluetooth.enable = true; hardware.bluetooth.powerOnBoot = true; - services.blueman.enable = true; - # Desktop environment (Hyprland) - services.xserver.enable = true; - services.displayManager.gdm.enable = true; - services.displayManager.defaultSession = "hyprland"; - services.desktopManager.gnome.enable = false; + # Login manager (greetd + tuigreet) + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --remember-session --asterisks --sessions /etc/greetd/wayland-sessions"; + user = "greeter"; + }; + }; + }; + + # Provide Hyprland session file for tuigreet to discover + environment.etc."greetd/wayland-sessions/hyprland.desktop".text = '' + [Desktop Entry] + Name=Hyprland + Exec=uwsm start hyprland-uwsm.desktop + Type=Application + ''; programs.hyprland = { enable = true; @@ -126,6 +142,9 @@ inputs.nixpkgs.lib.nixosSystem { withUWSM = true; }; + # Steam (for Wallpaper Engine assets) + programs.steam.enable = true; + programs.dconf.enable = true; xdg.portal = { @@ -133,6 +152,15 @@ inputs.nixpkgs.lib.nixosSystem { extraPortals = with pkgs; [ xdg-desktop-portal-gtk ]; + config = { + hyprland = { + default = [ + "hyprland" + "gtk" + ]; + "org.freedesktop.impl.portal.Settings" = [ "gtk" ]; + }; + }; }; # WiFi MT7925e fix (disable ASPM) @@ -249,6 +277,21 @@ inputs.nixpkgs.lib.nixosSystem { }) ]; + # Animated wallpaper via Wallpaper Engine + services.linux-wallpaperengine = { + enable = true; + assetsPath = "${config.home.homeDirectory}/.local/share/Steam/steamapps/common/wallpaper_engine/assets"; + wallpapers = [ + { + monitor = "eDP-1"; + wallpaperId = "3602362048"; + scaling = "fill"; + fps = 30; + audio.silent = true; + } + ]; + }; + # Agenix configuration for GitHub SSH key age.identityPaths = [ "/home/${username}/.ssh/id_ed25519" ]; age.secrets = builtins.mapAttrs ( diff --git a/spec/coverage_spec.sh b/spec/coverage_spec.sh index bc84ed6f3..775df54d3 100644 --- a/spec/coverage_spec.sh +++ b/spec/coverage_spec.sh @@ -21,6 +21,14 @@ It 'has spec file for config/claude/statusline-git.sh' The path "spec/statusline_git_spec.sh" should be exist End +It 'has spec file for config/hyprland/scripts/record-screen.sh' +The path "spec/hyprland_record_screen_spec.sh" should be exist +End + +It 'has spec file for config/hyprland/scripts/toggle-terminal.sh' +The path "spec/hyprland_toggle_terminal_spec.sh" should be exist +End + It 'has spec file for home-manager/programs/neovim/run_tests.sh' The path "spec/neovim_tests_spec.sh" should be exist End @@ -126,6 +134,8 @@ config/claude/notify.sh config/claude/pushover.sh config/claude/security.sh config/claude/statusline-git.sh +config/hyprland/scripts/record-screen.sh +config/hyprland/scripts/toggle-terminal.sh config/openclaw/hydrate.sh home-manager/modules/cargo-globals/install-cargo-globals.sh home-manager/modules/local-binaries/sync-local-binaries.sh diff --git a/spec/hyprland_record_screen_spec.sh b/spec/hyprland_record_screen_spec.sh new file mode 100644 index 000000000..af840d0fa --- /dev/null +++ b/spec/hyprland_record_screen_spec.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# shellcheck disable=SC2329 + +Describe 'record-screen.sh' +SCRIPT="$PWD/config/hyprland/scripts/record-screen.sh" + +Describe 'script structure' +It 'has a bash shebang' +When run bash -c "head -1 '$SCRIPT'" +The output should include '#!/usr/bin/env bash' +End + +It 'uses wf-recorder for screen recording' +When run bash -c "cat '$SCRIPT'" +The output should include 'wf-recorder' +End + +It 'uses slurp for region selection' +When run bash -c "cat '$SCRIPT'" +The output should include 'slurp' +End + +It 'saves recordings to Videos directory' +When run bash -c "cat '$SCRIPT'" +The output should include 'Videos' +End + +It 'uses a PID file for toggle behavior' +When run bash -c "cat '$SCRIPT'" +The output should include 'wf-recorder.pid' +End + +It 'sends notification on recording stop' +When run bash -c "cat '$SCRIPT'" +The output should include 'notify-send' +End + +It 'timestamps recording filenames' +When run bash -c "cat '$SCRIPT'" +The output should include 'date' +End +End + +End diff --git a/spec/hyprland_toggle_terminal_spec.sh b/spec/hyprland_toggle_terminal_spec.sh new file mode 100644 index 000000000..6cc433085 --- /dev/null +++ b/spec/hyprland_toggle_terminal_spec.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +# shellcheck disable=SC2329 + +Describe 'toggle-terminal.sh' +SCRIPT="$PWD/config/hyprland/scripts/toggle-terminal.sh" + +Describe 'script structure' +It 'has a bash shebang' +When run bash -c "head -1 '$SCRIPT'" +The output should include '#!/usr/bin/env bash' +End + +It 'uses ghostty-scratchpad class name' +When run bash -c "cat '$SCRIPT'" +The output should include 'ghostty-scratchpad' +End + +It 'checks for existing client with hyprctl' +When run bash -c "cat '$SCRIPT'" +The output should include 'hyprctl clients' +End + +It 'toggles scratchpad workspace' +When run bash -c "cat '$SCRIPT'" +The output should include 'togglespecialworkspace scratchpad' +End + +It 'launches ghostty with custom class if not running' +When run bash -c "cat '$SCRIPT'" +The output should include 'ghostty --class' +End +End + +End