26 Commits
Author SHA1 Message Date
nvrl 26f8c79767 update 2025-11-02 23:53:10 +01:00
nvrl a1ac6850bb updated waybar 2025-08-28 19:45:40 +02:00
nvrl bd49925080 updated style 2025-08-23 19:32:51 +02:00
nvrl f0739adf34 updated scripts 2025-08-23 19:28:41 +02:00
nvrl 98bd7c5393 styles + window rules 2025-08-23 16:19:05 +02:00
nvrl 01f7b4fb8e updated scripts and waybar 2025-08-18 19:31:04 +02:00
nvrl 6e647070d8 i have to rework the bar... too full 2025-08-15 21:13:36 +02:00
nvrl e45ea11b28 resolved merge conflict 2025-08-15 20:10:58 +02:00
nvrl df361218f9 fixed the pixelbuds script 2025-08-15 11:10:22 +02:00
nvrl ac16d751ce fucked my pixelbuds module 2025-08-15 10:08:20 +02:00
nvrl dc3133cc94 updated gpu module 2025-08-15 09:19:05 +02:00
nvrl 8eb626164b updated 2025-08-15 03:14:44 +02:00
nvrl bc86670611 fixed discord streaming 2025-08-14 03:29:50 +02:00
nvrl 0eb25b77a6 added rice pics 2025-08-12 21:12:07 +02:00
nvrl 30b83934d1 increased interval for pixelbuds 2025-08-09 20:52:06 +02:00
nvrl 087f199ca0 added own notification script 2025-08-09 20:01:04 +02:00
nvrl e2d9f5ab05 added wireplumber confs 2025-08-09 19:11:31 +02:00
nvrl b0783e09e5 updated replay command 2025-08-09 17:18:32 +02:00
nvrl eb3c74373d increased sleep timer before replay starts 2025-08-09 15:33:10 +02:00
nvrl 283a649486 added modules to waybar 2025-08-09 15:32:12 +02:00
nvrl 134a0ff79a huh 2025-08-07 06:33:06 +02:00
nvrl 6a4f312ec9 fuck btop 2025-08-07 06:32:47 +02:00
nvrl 2f7b121bda removed btop catppuccin 2025-08-07 06:31:23 +02:00
nvrl 52137e5e3b fuck submodules 2025-08-07 06:29:46 +02:00
nvrl e240822532 init? 2025-08-07 06:19:03 +02:00
nvrl b6e8123c91 init 2025-08-07 05:56:44 +02:00
169 changed files with 2356 additions and 11581 deletions
-4
View File
@@ -6,9 +6,7 @@
!alacritty/ !alacritty/
!dunst/ !dunst/
!hypr/ !hypr/
!hyprpanel/
!nvim/ !nvim/
!quickshell/
!waybar/ !waybar/
!zathura/ !zathura/
!mimeapps.list !mimeapps.list
@@ -25,5 +23,3 @@
!wireplumber/ !wireplumber/
!systemd/ !systemd/
fish/fish_variables fish/fish_variables
waybar/fluxo-rs
!fluxo/
+12 -15
View File
@@ -1,12 +1,3 @@
[submodule "waybar/catppuccin-waybar"]
path = waybar/catppuccin-waybar
url = https://github.com/catppuccin/waybar.git
[submodule "hypr/catppuccin-hyprland"]
path = hypr/catppuccin-hyprland
url = https://github.com/catppuccin/hyprland.git
[submodule "hypr/catppuccin-hyprlock"]
path = hypr/catppuccin-hyprlock
url = https://github.com/catppuccin/hyprlock.git
[submodule "zathura/catppuccin-zathura"] [submodule "zathura/catppuccin-zathura"]
path = zathura/catppuccin-zathura path = zathura/catppuccin-zathura
url = https://github.com/catppuccin/zathura.git url = https://github.com/catppuccin/zathura.git
@@ -16,12 +7,18 @@
[submodule "nvim/pack/nvim/start/nvim-lspconfig"] [submodule "nvim/pack/nvim/start/nvim-lspconfig"]
path = nvim/pack/nvim/start/nvim-lspconfig path = nvim/pack/nvim/start/nvim-lspconfig
url = https://github.com/neovim/nvim-lspconfig url = https://github.com/neovim/nvim-lspconfig
[submodule "btop/catppuccin-btop"] [submodule "waybar/catppuccin-waybar"]
path = btop/catppuccin-btop path = waybar/catppuccin-waybar
url = https://github.com/catppuccin/btop.git url = https://github.com/catppuccin/waybar.git
[submodule "hypr/catppuccin-hyprland"]
path = hypr/catppuccin-hyprland
url = https://github.com/catppuccin/hyprland.git
[submodule "hypr/catppuccin-hyprlock"]
path = hypr/catppuccin-hyprlock
url = https://github.com/catppuccin/hyprlock.git
[submodule "fuzzel/catppuccin-fuzzel"] [submodule "fuzzel/catppuccin-fuzzel"]
path = fuzzel/catppuccin-fuzzel path = fuzzel/catppuccin-fuzzel
url = https://github.com/catppuccin/fuzzel.git url = https://github.com/catppuccin/fuzzel.git
[submodule "nvim"] [submodule "btop/catppuccin-btop"]
path = nvim path = btop/catppuccin-btop
url = https://git.narl.io/nvrl/nvim-config.git url = https://github.com/catppuccin/btop.git
+1 -3
View File
@@ -1,5 +1,3 @@
# My dotfiles # desktop rice
![image not found](./rice.png) ![image not found](./rice.png)
![image not found](./rice-2.png)
![image not found](./rice-3.png)
+2 -7
View File
@@ -26,8 +26,8 @@ lines = 24
## Blank space added around the window in pixels. ## Blank space added around the window in pixels.
[window.padding] [window.padding]
x = 3 x = 30
y = 0 y = 30
## SCROLLING ------------------------------------------------------ ## SCROLLING ------------------------------------------------------
[scrolling] [scrolling]
@@ -104,8 +104,3 @@ ipc_socket = true
## Import additional configuration files. ## Import additional configuration files.
import = ["~/.config/alacritty/colors.toml", "~/.config/alacritty/fonts.toml"] import = ["~/.config/alacritty/colors.toml", "~/.config/alacritty/fonts.toml"]
[[keyboard.bindings]]
key = "Return"
mods = "Shift"
chars = "\u001B\r"
+5 -5
View File
@@ -4,26 +4,26 @@
[font] [font]
## Font size in points. ## Font size in points.
size = 10 size = 14
## When true, Alacritty will use a custom built-in font for box drawing characters and powerline symbols. ## When true, Alacritty will use a custom built-in font for box drawing characters and powerline symbols.
builtin_box_drawing = true builtin_box_drawing = true
## Normal font family. ## Normal font family.
[font.normal] [font.normal]
family = "0xProto Nerd Font Mono" family = "Fira Mono"
## If the family is not specified, it will fall back to the value specified for the normal font. ## If the family is not specified, it will fall back to the value specified for the normal font.
[font.bold] [font.bold]
family = "0xProto Nerd Font Mono" family = "Fira Mono"
## If the family is not specified, it will fall back to the value specified for the normal font. ## If the family is not specified, it will fall back to the value specified for the normal font.
[font.italic] [font.italic]
family = "0xProto Nerd Font Mono" family = "Fira Mono"
## If the family is not specified, it will fall back to the value specified for the normal font. ## If the family is not specified, it will fall back to the value specified for the normal font.
[font.bold_italic] [font.bold_italic]
family = "0xProto Nerd Font Mono" family = "Fira Mono"
## Offset is the extra space around each character. ## Offset is the extra space around each character.
## 'y' can be thought of as modifying the line spacing, and 'x' as modifying the letter spacing. ## 'y' can be thought of as modifying the line spacing, and 'x' as modifying the letter spacing.
+51 -80
View File
@@ -1,23 +1,18 @@
#? Config file for btop v.1.4.7 #? Config file for btop v. 1.4.5
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. #* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" #* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
color_theme = "/home/narl/.config/btop/themes/catppuccin_mocha.theme" color_theme = "/home/narl/.config/btop/themes/catppuccin_mocha.theme"
#* If the theme set background should be shown, set to False if you want terminal background transparency. #* If the theme set background should be shown, set to False if you want terminal background transparency.
theme_background = false theme_background = False
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. #* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
truecolor = true truecolor = True
#* Set to true to force tty mode regardless if a real tty has been detected or not. #* Set to true to force tty mode regardless if a real tty has been detected or not.
#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. #* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
force_tty = false force_tty = False
#* Option to disable presets. Either the default preset, custom presets, or all presets.
#* "Off" All presets are enabled.
#* "Default" preset is disabled.#* "Custom" presets are disabled.#* "All" presets are disabled.
disable_presets = "Off"
#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. #* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. #* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
@@ -27,16 +22,10 @@ presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:defaul
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. #* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. #* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
vim_keys = true vim_keys = True
#* Disable all mouse events.
disable_mouse = false
#* Rounded corners on boxes, is ignored if TTY mode is ON. #* Rounded corners on boxes, is ignored if TTY mode is ON.
rounded_corners = true rounded_corners = True
#* Use terminal synchronized output sequences to reduce flickering on supported terminals.
terminal_sync = true
#* Default symbols to use for graph creation, "braille", "block" or "tty". #* Default symbols to use for graph creation, "braille", "block" or "tty".
#* "braille" offers the highest resolution but might not be included in all fonts. #* "braille" offers the highest resolution but might not be included in all fonts.
@@ -64,50 +53,44 @@ graph_symbol_proc = "default"
shown_boxes = "cpu mem net proc" shown_boxes = "cpu mem net proc"
#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. #* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
update_ms = 1000 update_ms = 2000
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", #* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. #* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
proc_sorting = "memory" proc_sorting = "cpu direct"
#* Reverse sorting order, True or False. #* Reverse sorting order, True or False.
proc_reversed = false proc_reversed = False
#* Show processes as a tree. #* Show processes as a tree.
proc_tree = true proc_tree = True
#* Use the cpu graph colors in the process list. #* Use the cpu graph colors in the process list.
proc_colors = true proc_colors = True
#* Use a darkening gradient in the process list. #* Use a darkening gradient in the process list.
proc_gradient = true proc_gradient = True
#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. #* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
proc_per_core = false proc_per_core = True
#* Show process memory as bytes instead of percent. #* Show process memory as bytes instead of percent.
proc_mem_bytes = true proc_mem_bytes = True
#* Show cpu graph for each process. #* Show cpu graph for each process.
proc_cpu_graphs = true proc_cpu_graphs = True
#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) #* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
proc_info_smaps = false proc_info_smaps = False
#* Show proc box on left side of screen instead of right. #* Show proc box on left side of screen instead of right.
proc_left = false proc_left = False
#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). #* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
proc_filter_kernel = false proc_filter_kernel = False
#* Should the process list follow the selected process when detailed view is open.
proc_follow_detailed = true
#* In tree-view, always accumulate child process resources in the parent process. #* In tree-view, always accumulate child process resources in the parent process.
proc_aggregate = false proc_aggregate = False
#* Should cpu and memory usage display be preserved for dead processes when paused.
keep_dead_proc_usage = false
#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. #* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu. #* Select from a list of detected attributes from the options menu.
@@ -121,28 +104,28 @@ cpu_graph_lower = "Auto"
show_gpu_info = "Auto" show_gpu_info = "Auto"
#* Toggles if the lower CPU graph should be inverted. #* Toggles if the lower CPU graph should be inverted.
cpu_invert_lower = true cpu_invert_lower = True
#* Set to True to completely disable the lower CPU graph. #* Set to True to completely disable the lower CPU graph.
cpu_single_graph = false cpu_single_graph = False
#* Show cpu box at bottom of screen instead of top. #* Show cpu box at bottom of screen instead of top.
cpu_bottom = false cpu_bottom = False
#* Shows the system uptime in the CPU box. #* Shows the system uptime in the CPU box.
show_uptime = true show_uptime = True
#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo. #* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo.
show_cpu_watts = true show_cpu_watts = True
#* Show cpu temperature. #* Show cpu temperature.
check_temp = true check_temp = True
#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. #* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
cpu_sensor = "Auto" cpu_sensor = "Auto"
#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. #* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
show_coretemp = true show_coretemp = True
#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. #* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. #* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
@@ -154,20 +137,17 @@ cpu_core_map = ""
temp_scale = "celsius" temp_scale = "celsius"
#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. #* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
base_10_sizes = false base_10_sizes = False
#* Show CPU frequency. #* Show CPU frequency.
show_cpu_freq = true show_cpu_freq = True
#* How to calculate CPU frequency, available values: "first", "range", "lowest", "highest" and "average".
freq_mode = "first"
#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. #* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
#* Special formatting: /host = hostname | /user = username | /uptime = system uptime #* Special formatting: /host = hostname | /user = username | /uptime = system uptime
clock_format = "%X" clock_format = "%X"
#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. #* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
background_update = true background_update = True
#* Custom cpu model name, empty string to disable. #* Custom cpu model name, empty string to disable.
custom_cpu_name = "" custom_cpu_name = ""
@@ -177,61 +157,58 @@ custom_cpu_name = ""
disks_filter = "" disks_filter = ""
#* Show graphs instead of meters for memory values. #* Show graphs instead of meters for memory values.
mem_graphs = true mem_graphs = True
#* Show mem box below net box instead of above. #* Show mem box below net box instead of above.
mem_below_net = false mem_below_net = False
#* Count ZFS ARC in cached and available memory. #* Count ZFS ARC in cached and available memory.
zfs_arc_cached = true zfs_arc_cached = True
#* If swap memory should be shown in memory box. #* If swap memory should be shown in memory box.
show_swap = true show_swap = True
#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. #* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
swap_disk = true swap_disk = True
#* If mem box should be split to also show disks info. #* If mem box should be split to also show disks info.
show_disks = true show_disks = True
#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. #* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
only_physical = true only_physical = True
#* Read disks list from /etc/fstab. This also disables only_physical. #* Read disks list from /etc/fstab. This also disables only_physical.
use_fstab = true use_fstab = True
#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) #* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
zfs_hide_datasets = false zfs_hide_datasets = False
#* Set to true to show available disk space for privileged users. #* Set to true to show available disk space for privileged users.
disk_free_priv = false disk_free_priv = False
#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. #* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
show_io_stat = true show_io_stat = True
#* Toggles io mode for disks, showing big graphs for disk read/write speeds. #* Toggles io mode for disks, showing big graphs for disk read/write speeds.
io_mode = false io_mode = False
#* Set to True to show combined read/write io graphs in io mode. #* Set to True to show combined read/write io graphs in io mode.
io_graph_combined = false io_graph_combined = False
#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". #* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
#* Example: "/mnt/media:100 /:20 /boot:1". #* Example: "/mnt/media:100 /:20 /boot:1".
io_graph_speeds = "" io_graph_speeds = ""
#* Swap the positions of the upload and download speed graphs. When true, upload will be on top.
swap_upload_download = false
#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. #* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
net_download = 100 net_download = 100
net_upload = 100 net_upload = 100
#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. #* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
net_auto = true net_auto = True
#* Sync the auto scaling for download and upload to whichever currently has the highest scale. #* Sync the auto scaling for download and upload to whichever currently has the highest scale.
net_sync = true net_sync = True
#* Starts with the Network Interface specified here. #* Starts with the Network Interface specified here.
net_iface = "" net_iface = ""
@@ -240,35 +217,29 @@ net_iface = ""
base_10_bitrate = "Auto" base_10_bitrate = "Auto"
#* Show battery stats in top right if battery is present. #* Show battery stats in top right if battery is present.
show_battery = true show_battery = True
#* Which battery to use if multiple are present. "Auto" for auto detection. #* Which battery to use if multiple are present. "Auto" for auto detection.
selected_battery = "Auto" selected_battery = "Auto"
#* Show power stats of battery next to charge indicator. #* Show power stats of battery next to charge indicator.
show_battery_watts = true show_battery_watts = True
#* Set loglevel for "~/.local/state/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". #* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. #* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
log_level = "WARNING" log_level = "WARNING"
#* Automatically save current settings to config file on exit.
save_config_on_exit = true
#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards. #* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
nvml_measure_pcie_speeds = true nvml_measure_pcie_speeds = True
#* Measure PCIe throughput on AMD cards, may impact performance on certain cards. #* Measure PCIe throughput on AMD cards, may impact performance on certain cards.
rsmi_measure_pcie_speeds = true rsmi_measure_pcie_speeds = True
#* Horizontally mirror the GPU graph. #* Horizontally mirror the GPU graph.
gpu_mirror_graph = true gpu_mirror_graph = True
#* Set which GPU vendors to show. Available values are "nvidia amd intel apple"
shown_gpus = "nvidia amd intel"
#* Custom gpu0 model name, empty string to disable. #* Custom gpu0 model name, empty string to disable.
custom_gpu_name0 = "Radeon Vega" custom_gpu_name0 = ""
#* Custom gpu1 model name, empty string to disable. #* Custom gpu1 model name, empty string to disable.
custom_gpu_name1 = "" custom_gpu_name1 = ""
-3
View File
@@ -1,3 +0,0 @@
--enable-features=AcceleratedVideoDecodeLinuxGL,DefaultANGLEVulkan,VaapiIgnoreDriverChecks,Vulkan,VulkanFromANGLE,AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoEncoder
--use-angle=vulkan
--use-gl=angle
+2 -2
View File
@@ -1,10 +1,10 @@
[global] [global]
corner_radius = 4 corner_radius = 4
transparency = 90 transparency = 90
frame_color = "#f38ba8" frame_color = "#94e2d5"
frame_width = 1 frame_width = 1
separator_color= frame separator_color= frame
highlight = "#89dceb" highlight = "#89b4fa"
[urgency_low] [urgency_low]
background = "#1e1e2e" background = "#1e1e2e"
-14
View File
@@ -1,14 +0,0 @@
# This file was created by fish when upgrading to version 4.3, to migrate
# the 'fish_key_bindings' variable from its old default scope (universal)
# to its new default scope (global). We recommend you delete this file
# and configure key bindings in ~/.config/fish/config.fish if needed.
set --global fish_key_bindings fish_vi_key_bindings
# Prior to version 4.3, fish shipped an event handler that runs
# `set --universal fish_key_bindings fish_default_key_bindings`
# whenever the fish_key_bindings variable is erased.
# This means that as long as any fish < 4.3 is still running on this system,
# we cannot complete the migration.
# As a workaround, erase the universal variable at every shell startup.
set --erase --universal fish_key_bindings
-49
View File
@@ -1,49 +0,0 @@
# This file was created by fish when upgrading to version 4.3, to migrate
# theme variables from universal to global scope.
# Don't edit this file, as it will be written by the web-config tool (`fish_config`).
# To customize your theme, delete this file and see
# help interactive#syntax-highlighting
# or
# man fish-interactive | less +/^SYNTAX.HIGHLIGHTING
# for appropriate commands to add to ~/.config/fish/config.fish instead.
# See also the release notes for fish 4.3.0 (run `help relnotes`).
set --global fish_color_autosuggestion 6c7086
set --global fish_color_cancel f38ba8
set --global fish_color_command 89b4fa
set --global fish_color_comment 7f849c
set --global fish_color_cwd f9e2af
set --global fish_color_cwd_root red
set --global fish_color_end fab387
set --global fish_color_error f38ba8
set --global fish_color_escape eba0ac
set --global fish_color_gray 6c7086
set --global fish_color_history_current --bold
set --global fish_color_host 89b4fa
set --global fish_color_host_remote a6e3a1
set --global fish_color_keyword f38ba8
set --global fish_color_match --background=brblue
set --global fish_color_normal cdd6f4
set --global fish_color_operator f5c2e7
set --global fish_color_option a6e3a1
set --global fish_color_param f2cdcd
set --global fish_color_quote a6e3a1
set --global fish_color_redirection f5c2e7
set --global fish_color_search_match --background=313244
set --global fish_color_selection --background=313244
set --global fish_color_status f38ba8
set --global fish_color_user 94e2d5
set --global fish_color_valid_path --underline
set --global fish_pager_color_background
set --global fish_pager_color_completion cdd6f4
set --global fish_pager_color_description 6c7086
set --global fish_pager_color_prefix f5c2e7
set --global fish_pager_color_progress 6c7086
set --global fish_pager_color_secondary_background
set --global fish_pager_color_secondary_completion
set --global fish_pager_color_secondary_description
set --global fish_pager_color_secondary_prefix
set --global fish_pager_color_selected_background
set --global fish_pager_color_selected_completion
set --global fish_pager_color_selected_description
set --global fish_pager_color_selected_prefix
-7
View File
@@ -1,7 +0,0 @@
# Path to Oh My Fish install.
set -q XDG_DATA_HOME
and set -gx OMF_PATH "$XDG_DATA_HOME/omf"
or set -gx OMF_PATH "$HOME/.local/share/omf"
# Load Oh My Fish configuration.
source $OMF_PATH/init.fish
-34
View File
@@ -1,43 +1,9 @@
if status is-interactive
# Commands to run in interactive sessions can go here
end
# set SPACESHIP_PROMPT_ADD_NEWLINE false
# set SPACESHIP_TIME_SHOW false
# set SPACESHIP_USER_SHOW always
# set SPACESHIP_HOST_SHOW true
# set SPACESHIP_CHAR_SYMBOL ""
# set SPACESHIP_CHAR_SYMBOL=" "
# set SPACESHIP_VI_MODE_INSERT 
# set SPACESHIP_VI_MODE_NORMAL 
# Set the cursor shapes for the different vi modes.
set fish_cursor_default block blink set fish_cursor_default block blink
set fish_cursor_insert line blink set fish_cursor_insert line blink
set fish_cursor_replace_one underscore blink set fish_cursor_replace_one underscore blink
set fish_cursor_visual block set fish_cursor_visual block
# starship init fish | source
fish_vi_key_bindings fish_vi_key_bindings
if test -e ~/.cache/wal/colors.fish
source ~/.cache/wal/colors.fish
end
zoxide init --cmd cd fish | source zoxide init --cmd cd fish | source
set -gx PATH ~/.local/bin $PATH
# if not pgrep --full ssh-agent | string collect > /dev/null
# eval (ssh-agent -c)
# set -Ux SSH_AGENT_PID $SSH_AGENT_PID
# set -Ux SSH_AUTH_SOCK $SSH_AUTH_SOCK
# end
# Set SSH_AUTH_SOCK for GNOME Keyring / systemd
# The socket path is predictable
set -l GCR_SSH_SOCK $XDG_RUNTIME_DIR/gcr/ssh
if test -S "$GCR_SSH_SOCK"
set -gx SSH_AUTH_SOCK "$GCR_SSH_SOCK"
end
if status is-login && test -z "$DISPLAY" -a -z "$WAYLAND_DISPLAY"
if uwsm check may-start && uwsm select if uwsm check may-start && uwsm select
exec uwsm start default exec uwsm start default
end end
end
# Claude environments
alias claude="CLAUDE_CONFIG_DIR=~/.claude command claude"
alias claude-work="CLAUDE_CONFIG_DIR=~/.claude-work command claude"
+1
View File
@@ -1,2 +1,3 @@
franciscolourenco/done franciscolourenco/done
jorgebucaran/autopair.fish jorgebucaran/autopair.fish
catppuccin/fish
+130
View File
@@ -0,0 +1,130 @@
# This file contains fish universal variable definitions.
# VERSION: 3.0
SETUVAR CUDAToolkit_ROOT:/opt/cuda/
SETUVAR DATABASE_URL:sqlite\x3adatabase\x2esqlite
SETUVAR GLFW_IM_MODULE:ibus
SETUVAR MANPAGER:sh\x20\x2dc\x20\x27col\x20\x2dbx\x20\x7c\x20bat\x20\x2dl\x20man\x20\x2dp\x27
SETUVAR RUST_LOG:debug
SETUVAR --export SSH_AGENT_PID:967
SETUVAR --export SSH_AUTH_SOCK:/tmp/ssh\x2dXXXXXX7Ck8nI/agent\x2e966
SETUVAR SXHKD_SHELL:/usr/bin/bash
SETUVAR ZO_CMD:zo
SETUVAR Z_CMD:z
SETUVAR Z_DATA:/home/narl/\x2elocal/share/z/data
SETUVAR Z_DATA_DIR:/home/narl/\x2elocal/share/z
SETUVAR Z_EXCLUDE:\x5e/home/narl\x24
SETUVAR __done_min_cmd_duration:5000
SETUVAR __fish_initialized:3800
SETUVAR _fisher_catppuccin_2F_fish_files:\x7e/\x2econfig/fish/themes/Catppuccin\x20Frappe\x2etheme\x1e\x7e/\x2econfig/fish/themes/Catppuccin\x20Latte\x2etheme\x1e\x7e/\x2econfig/fish/themes/Catppuccin\x20Macchiato\x2etheme\x1e\x7e/\x2econfig/fish/themes/Catppuccin\x20Mocha\x2etheme
SETUVAR _fisher_franciscolourenco_2F_done_files:/home/niru/\x2econfig/fish/conf\x2ed/done\x2efish
SETUVAR _fisher_jorgebucaran_2F_autopair_2E_fish_files:/home/niru/\x2econfig/fish/functions/_autopair_backspace\x2efish\x1e/home/niru/\x2econfig/fish/functions/_autopair_insert_left\x2efish\x1e/home/niru/\x2econfig/fish/functions/_autopair_insert_right\x2efish\x1e/home/niru/\x2econfig/fish/functions/_autopair_insert_same\x2efish\x1e/home/niru/\x2econfig/fish/functions/_autopair_tab\x2efish\x1e/home/niru/\x2econfig/fish/conf\x2ed/autopair\x2efish
SETUVAR _fisher_plugins:franciscolourenco/done\x1ejorgebucaran/autopair\x2efish\x1ecatppuccin/fish
SETUVAR _fisher_upgraded_to_4_4:\x1d
SETUVAR fish_color_autosuggestion:6c7086
SETUVAR fish_color_cancel:f38ba8
SETUVAR fish_color_command:89b4fa
SETUVAR fish_color_comment:7f849c
SETUVAR fish_color_cwd:f9e2af
SETUVAR fish_color_cwd_root:red
SETUVAR fish_color_end:fab387
SETUVAR fish_color_error:f38ba8
SETUVAR fish_color_escape:eba0ac
SETUVAR fish_color_gray:6c7086
SETUVAR fish_color_history_current:\x2d\x2dbold
SETUVAR fish_color_host:89b4fa
SETUVAR fish_color_host_remote:a6e3a1
SETUVAR fish_color_keyword:f38ba8
SETUVAR fish_color_match:\x2d\x2dbackground\x3dbrblue
SETUVAR fish_color_normal:cdd6f4
SETUVAR fish_color_operator:f5c2e7
SETUVAR fish_color_option:a6e3a1
SETUVAR fish_color_param:f2cdcd
SETUVAR fish_color_quote:a6e3a1
SETUVAR fish_color_redirection:f5c2e7
SETUVAR fish_color_search_match:\x2d\x2dbackground\x3d313244
SETUVAR fish_color_selection:\x2d\x2dbackground\x3d313244
SETUVAR fish_color_status:f38ba8
SETUVAR fish_color_user:94e2d5
SETUVAR fish_color_valid_path:\x2d\x2dunderline
SETUVAR fish_greeting:\x1d
SETUVAR fish_key_bindings:fish_vi_key_bindings
SETUVAR fish_pager_color_background:\x1d
SETUVAR fish_pager_color_completion:cdd6f4
SETUVAR fish_pager_color_description:6c7086
SETUVAR fish_pager_color_prefix:f5c2e7
SETUVAR fish_pager_color_progress:6c7086
SETUVAR fish_pager_color_secondary_background:\x1d
SETUVAR fish_pager_color_secondary_completion:\x1d
SETUVAR fish_pager_color_secondary_description:\x1d
SETUVAR fish_pager_color_secondary_prefix:\x1d
SETUVAR fish_pager_color_selected_background:\x1d
SETUVAR fish_pager_color_selected_completion:\x1d
SETUVAR fish_pager_color_selected_description:\x1d
SETUVAR fish_pager_color_selected_prefix:\x1d
SETUVAR fish_user_paths:/home/narl/\x2elocal/share/nvim/mason/bin\x1e/home/niru/\x2escripts\x1e/home/niru/Documents/rust\x2ddev/practice\x2drs/target/release\x1e/opt/cuda/bin\x1e/home/niru/\x2e
SETUVAR pure_begin_prompt_with_current_directory:true
SETUVAR pure_check_for_new_release:false
SETUVAR pure_color_at_sign:pure_color_mute
SETUVAR pure_color_aws_profile:pure_color_warning
SETUVAR pure_color_command_duration:pure_color_warning
SETUVAR pure_color_current_directory:pure_color_primary
SETUVAR pure_color_danger:red
SETUVAR pure_color_dark:black
SETUVAR pure_color_git_branch:pure_color_mute
SETUVAR pure_color_git_dirty:pure_color_mute
SETUVAR pure_color_git_stash:pure_color_info
SETUVAR pure_color_git_unpulled_commits:pure_color_info
SETUVAR pure_color_git_unpushed_commits:pure_color_info
SETUVAR pure_color_hostname:pure_color_mute
SETUVAR pure_color_info:cyan
SETUVAR pure_color_jobs:pure_color_normal
SETUVAR pure_color_k8s_context:pure_color_success
SETUVAR pure_color_k8s_namespace:pure_color_primary
SETUVAR pure_color_k8s_prefix:pure_color_info
SETUVAR pure_color_light:white
SETUVAR pure_color_mute:brblack
SETUVAR pure_color_nixdevshell_prefix:pure_color_info
SETUVAR pure_color_nixdevshell_symbol:pure_color_mute
SETUVAR pure_color_normal:normal
SETUVAR pure_color_prefix_root_prompt:pure_color_danger
SETUVAR pure_color_primary:blue
SETUVAR pure_color_prompt_on_error:pure_color_danger
SETUVAR pure_color_prompt_on_success:pure_color_success
SETUVAR pure_color_success:magenta
SETUVAR pure_color_system_time:pure_color_mute
SETUVAR pure_color_username_normal:pure_color_mute
SETUVAR pure_color_username_root:pure_color_light
SETUVAR pure_color_virtualenv:pure_color_mute
SETUVAR pure_color_warning:yellow
SETUVAR pure_enable_aws_profile:true
SETUVAR pure_enable_container_detection:true
SETUVAR pure_enable_git:true
SETUVAR pure_enable_k8s:false
SETUVAR pure_enable_nixdevshell:false
SETUVAR pure_enable_single_line_prompt:false
SETUVAR pure_enable_virtualenv:true
SETUVAR pure_reverse_prompt_symbol_in_vimode:true
SETUVAR pure_separate_prompt_on_error:false
SETUVAR pure_shorten_prompt_current_directory_length:0
SETUVAR pure_shorten_window_title_current_directory_length:0
SETUVAR pure_show_jobs:true
SETUVAR pure_show_prefix_root_prompt:false
SETUVAR pure_show_subsecond_command_duration:false
SETUVAR pure_show_system_time:false
SETUVAR pure_symbol_aws_profile_prefix:
SETUVAR pure_symbol_container_prefix:
SETUVAR pure_symbol_git_dirty:\x2a
SETUVAR pure_symbol_git_stash:\u2261
SETUVAR pure_symbol_git_unpulled_commits:\u21e3
SETUVAR pure_symbol_git_unpushed_commits:\u21e1
SETUVAR pure_symbol_k8s_prefix:\u2638
SETUVAR pure_symbol_nixdevshell_prefix:\u2744\ufe0f
SETUVAR pure_symbol_prefix_root_prompt:\x23
SETUVAR pure_symbol_prompt:\x3e_
SETUVAR pure_symbol_reverse_prompt:\x7c_
SETUVAR pure_symbol_ssh_prefix:
SETUVAR pure_symbol_title_bar_separator:\x2d
SETUVAR pure_symbol_virtualenv_prefix:
SETUVAR pure_threshold_command_duration:5
SETUVAR pure_truncate_prompt_current_directory_keeps:\x2d1
SETUVAR pure_truncate_window_title_current_directory_keeps:\x2d1
+3
View File
@@ -0,0 +1,3 @@
function convert_discord --wraps='ffmpeg -i <source> -s 1280x720 <source>-discord.mp4' --description 'alias convert_discord=ffmpeg -i <source> -s 1280x720 <source>-discord.mp4'
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i $argv[1] -s 1280x720 (string split -r -m1 . $argv[1])[1]-discord.mp4;
end
-3
View File
@@ -1,3 +0,0 @@
function feh --description 'alias feh=feh -.'
command feh -. $argv
end
-30
View File
@@ -1,30 +0,0 @@
function fish_prompt --description 'Write out the prompt'
set -l last_status $status
set -l normal (set_color normal)
set -l status_color (set_color brgreen)
set -l cwd_color (set_color $fish_color_cwd)
set -l vcs_color (set_color brpurple)
set -l prompt_status ""
# Since we display the prompt on a new line allow the directory names to be longer.
set -q fish_prompt_pwd_dir_length
or set -lx fish_prompt_pwd_dir_length 0
# Color the prompt differently when we're root
set -l suffix ''
if functions -q fish_is_root_user; and fish_is_root_user
if set -q fish_color_cwd_root
set cwd_color (set_color $fish_color_cwd_root)
end
set suffix '#'
end
# Color the prompt in red on error
if test $last_status -ne 0
set status_color (set_color $fish_color_error)
set prompt_status $status_color "[" $last_status "]" $normal
end
echo -s (prompt_login) ' ' $cwd_color (prompt_pwd) $vcs_color (fish_vcs_prompt) $normal ' ' $prompt_status
echo -n -s $status_color $suffix ' ' $normal
end
+3
View File
@@ -0,0 +1,3 @@
function get_open_ports --wraps='netstat -tunlp' --description 'alias get_open_ports=netstat -tunlp'
netstat -tunlp $argv;
end
-3
View File
@@ -1,3 +0,0 @@
function gitzip
git archive HEAD -o (basename $PWD).zip
end
+1 -1
View File
@@ -1,3 +1,3 @@
function ls --wraps='exa --long --color=auto' --description 'alias ls=exa --long --color=auto' function ls --wraps='exa --long --color=auto' --description 'alias ls=exa --long --color=auto'
exa -l --color=auto $argv; exa --long --color=auto $argv;
end end
+3
View File
@@ -0,0 +1,3 @@
function mpv_vr --wraps='mpv --script=360plugin.lua --script-opts=360plugin-enabled=yes' --description 'alias mpv_vr=mpv --script=360plugin.lua --script-opts=360plugin-enabled=yes'
mpv --script=~/.config/mpv/scripts/360plugin.lua --script-opts=360plugin-enabled=yes $argv;
end
-3
View File
@@ -1,3 +0,0 @@
function open -d "Open an application detached from the terminal"
nohup $argv >/dev/null 2>&1 &
end
-90
View File
@@ -1,90 +0,0 @@
# fluxo-rs configuration
# Location: ~/.config/fluxo/config.toml
#
# The hardware modules below emit raw pipe-delimited values rather than display
# strings. The Quickshell config (~/.config/quickshell/services/Sys.qml) parses
# them and does its own formatting. The previous human-readable Waybar formats
# are preserved in config.toml.waybar-bak.
[general]
menu_command = "fuzzel --dmenu --prompt \"$FLUXO_PROMPT\""
[signals]
network = 1
cpu = 2
memory = 3
gpu = 4
sys = 5
disk = 6
game = 7
audio = 8
bt = 9
power = 10
mpris = 11
backlight = 12
dnd = 13
[network]
format = "{interface}|{ip}|{rx:.3}|{tx:.3}"
[cpu]
format = "{usage:.1}|{temp:.1}"
[memory]
format = "{used:.2}|{total:.2}"
[sys]
format = "{uptime}|{load1:.2}|{load5:.2}|{load15:.2}"
[disk]
format = "{mount}|{used:.1}|{total:.1}"
[power]
format = "{percentage}"
[audio]
format_sink_unmuted = "{name} {volume:>3}% <span size='large'>{icon}</span>"
format_sink_muted = "{name} <span size='large'> {icon}</span>"
format_source_unmuted = "{name} {volume:>3}% <span size='large'>{icon}</span>"
format_source_muted = "{name} <span size='large'>{icon}</span>"
[bt]
format_plugin = "{alias} [{left}|{right}] {anc} <span size='large'>󰂰</span>"
format_connected = "{alias} <span size='large'>󰂰</span>"
format_disconnected = "Disconnected <span size='large'>󰂯</span>"
format_disabled = "<span size='large'>󰂲</span>"
[game]
format_active = "<span size='large'>󰊖</span>"
format_inactive = "<span size='large'></span>"
[mpris]
format = "{artist} - {title}"
max_length = 20
scroll = true
scroll_speed = 500
scroll_separator = " /// "
[pool]
enabled = false
format = "{used:>4.0}G / {total:>4.0}G"
[gpu]
enabled = true
format_amd = "{usage:.0}|{vram_used:.2}|{vram_total:.2}|{temp:.1}"
format_intel = "{usage:.0}|0|0|0"
format_nvidia = "{usage:.0}|{vram_used:.2}|{vram_total:.2}|{temp:.1}"
[keyboard]
enabled = false
format = "{layout}"
[backlight]
enable = true
format = "{percentage}"
[dnd]
enabled = true
format_dnd = "<span size='large'>󰂛</span>"
format_normal = "<span size='large'>󰂚</span>"
-85
View File
@@ -1,85 +0,0 @@
# fluxo-rs configuration
# Location: ~/.config/fluxo/config.toml
[general]
menu_command = "fuzzel --dmenu --prompt \"$FLUXO_PROMPT\""
[signals]
network = 1
cpu = 2
memory = 3
gpu = 4
sys = 5
disk = 6
game = 7
audio = 8
bt = 9
power = 10
mpris = 11
backlight = 12
dnd = 13
[network]
format = "{interface} ({ip}):  {rx:^4.1} MB/s  {tx:^4.1} MB/s"
[cpu]
format = "CPU: {usage:^4.1}% {temp:^4.1}C"
[memory]
format = "MEM: {used:^4.1}/{total:^4.1}GB"
[sys]
format = "UP: {uptime} LOAD: {load1:^3.1} "
[disk]
format = "{mount} {used:^3.0}/{total:^3.0}G"
[power]
format = "{percentage:>3}% {icon}"
[audio]
format_sink_unmuted = "{name} {volume:>3}% <span size='large'>{icon}</span>"
format_sink_muted = "{name} <span size='large'> {icon}</span>"
format_source_unmuted = "{name} {volume:>3}% <span size='large'>{icon}</span>"
format_source_muted = "{name} <span size='large'>{icon}</span>"
[bt]
format_plugin = "{alias} [{left}|{right}] {anc} <span size='large'>󰂰</span>"
format_connected = "{alias} <span size='large'>󰂰</span>"
format_disconnected = "Disconnected <span size='large'>󰂯</span>"
format_disabled = "<span size='large'>󰂲</span>"
[game]
format_active = "<span size='large'>󰊖</span>"
format_inactive = "<span size='large'></span>"
[mpris]
format = "{artist} - {title}"
max_length = 20
scroll = true
scroll_speed = 500
scroll_separator = " /// "
[pool]
enabled = false
format = "{used:>4.0}G / {total:>4.0}G"
[gpu]
enabled = false
format_amd = "AMD: {usage:>3.0}% {vram_used:>4.1}/{vram_total:>4.1}GB {temp:>4.1}C"
format_intel = "iGPU: {usage:>3.0}%"
format_nvidia = "NV: {usage:>3.0}% {vram_used:>4.1}/{vram_total:>4.1}GB {temp:>4.1}C"
[keyboard]
enabled = false
format = "{layout}"
[backlight]
enable = true
format = " {icon} {percentage}"
[dnd]
enabled = true
format_dnd = "<span size='large'>󰂛</span>"
format_normal = "<span size='large'>󰂚</span>"
+5 -20
View File
@@ -1,28 +1,13 @@
include=~/.config/fuzzel/catppuccin-fuzzel/themes/catppuccin-mocha/red.ini include=~/.config/fuzzel/catppuccin-fuzzel/themes/catppuccin-mocha/mauve.ini
include=~/.config/fuzzel/catppuccin-fuzzel/themes/catppuccin-mocha/red.ini
[main] [main]
font=FiraCode Nerd Font:size=14 font=FiraCode Nerd Font:size=14
terminal=alacritty terminal=alacritty
dpi-aware=no dpi-aware=no
prompt="> "
width=45 icon-theme=Papirus-Dark
lines=8 show-actions=yes
horizontal-pad=20
vertical-pad=20
inner-pad=10
prompt=" "
show-actions=no
layer=overlay
[border] [border]
radius=12 radius=4
width=2 width=2
[colors]
background=1e1e2e80
# Matches the background so the counter becomes invisible for a cleaner look
counter=1e1e2eff
border=f38ba8ff
-83
View File
@@ -1,83 +0,0 @@
<div align="center">
<h1>✦ Google-ish Hyprlock Theme ✦</h1>
<h3></h3>
</div>
## ▶️ Preview
<details>
<summary><b>Without Profile & User Info</b></summary>
<img src="https://github.com/user-attachments/assets/7bbacd47-b0d7-4132-9951-53dc0ead604c" alt="Hyprlock-Without-Profile" width="1280">
</details>
<details>
<summary><b>With Profile & User Info</b></summary>
<img src="https://github.com/user-attachments/assets/9a58a6e2-a71f-4b28-998a-8a45c8950aaf" alt="Hyprlock-With-Profile" width="1280">
</details>
<details>
<summary><b>With Profile & User Info [12H Format]</b></summary>
<img src="https://github.com/user-attachments/assets/e0049860-7511-432e-8814-8d17d448182b" alt="Hyprlock-With-Profile" width="1280">
</details>
## 📦 Installation
><i><b>❗ This configuration is based on a 1080p display, if you are using a higher screen resolution,</br>you may need to reconfigure the sizes and recoordinate all the components.</b></i>
<b>Auto-Installation :</b>
```bash
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Tamarindtype/googlish-hyprlock-theme/main/install.sh)"
```
</br><b>Manual Installation :</b>
```bash
# Backup your current Hyprlock config first!
# Clone the repository
git clone https://github.com/Tamarindtype/googlish-hyprlock-theme.git
# Move all the files to the hyprland config folder
mv ./googlish-hyprlock-theme/* ~/.config/hypr/
# Go to script folder
cd $HOME/.config/hypr/hyprlock/
# Change all the scripts permission to make them executable
chmod +x *.sh
# Run the Hyprlock
hyprlock
```
## 🗄️ Directory Structure
```md
$HOME
└── .config
└── hypr
├── hyprlock
│ ├── assets
│ ├── battery.sh
│ ├── bluetooth.sh
│ ├── change_wallpaper.sh
│ ├── greeting.sh
│ ├── network.sh
│ ├── medianotif.sh
│ └── weatherinfo.sh
└── hyprlock.conf
```
## 🗨️ FAQ
| Question | Answer |
| --- | --- |
| Profile & User info does not appear? | By default, it set without profile and user info. You can enable it by uncomment the `image` @PROFILE PICTURE and `label` @USER INFO in `hyprlock.conf` |
| Battery percentage number does not appear? | Change your battery module in `battery.sh`. The default is `BAT0`, you can check it by running this command `ls /sys/class/power_supply/` |
| How to change the 24H Format to 12H Format? | Comment the 24H format and uncomment the 12H format. also uncomment the AM/PM `label` & `shape` in `hyprlock.conf` |
| null location or Unable to determine your location? | Change the IP Geolocation provider in `weatherinfo.sh` |
## 🏅 Recommendations
| Type | Name | Links |
| --- | --- | --- |
| Regular | PP Neue Machina | [Pangram Pangram](https://pangrampangram.com/products/neue-machina) |
| Nerd Font | Geist & Space Mono | [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts/releases) |
| Emoji | Apple Emoji | [apple-emoji-linux](https://github.com/samuelngs/apple-emoji-linux) |
## ✨ Special Thanks & Credits
| Details | Credit |
| --- | --- |
| Battery & Playerctl Widget Scripts | @ashish-kus [minimal Hyprlock](https://gist.github.com/ashish-kus/dd562b0bf5e8488a09e0b9c289f4574c) |
| Helped Me Create Dynamic WiFi, Bluetooth, Weathercast and Greeting Widget | @OPENAI [ChatGPT](https://chatgpt.com/)|
+2
View File
@@ -1,5 +1,6 @@
# narls hyprland dotfiles # narls hyprland dotfiles
source = ~/.config/hypr/modules/plugins.conf
source = ~/.config/hypr/modules/monitors.conf source = ~/.config/hypr/modules/monitors.conf
@@ -16,3 +17,4 @@ source = ~/.config/hypr/modules/input.conf
source = ~/.config/hypr/modules/keybinds.conf source = ~/.config/hypr/modules/keybinds.conf
source = ~/.config/hypr/modules/window_rules.conf source = ~/.config/hypr/modules/window_rules.conf
+59 -504
View File
@@ -1,545 +1,100 @@
# For more information visit https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/ source = $HOME/.config/hypr/catppuccin-hyprland/themes/mocha.conf
source = ~/.config/hypr/catppuccin-hyprland/themes/mocha.conf
$scrPath = ~/.config/hypr/hyprlock/
$imgPath = ~/.config/hypr/hyprlock/assets/
$USER = narl # Your Alias
$host = uname -n #Your Alias
$wifi-mode = false # Change the WiFi output. true = show SSID, false = Connected.
$bt-mode = false # Change the Bluetooth output. true = show Device name, false = Connected.
# Default geolocation provider is IP-API.COM, hardcode it if the location does not match the current location.
# Hardcode your location (If hardcode does not recognize your City, change it to IP Geolocation provider in weatherinfo.sh)
$CITY =
$COUNTRY =
# WALLPAPER
# Just comment and uncomment to select
$wallpaper = screenshot
#$wallpaper = ~/your/wallpaper-path.png
$blur = 2
# ADJUST HERE
$rounding = 12
$shape-rd = -1
$font-text = GeistMono Nerd Font Bold
$font-text0 = GeistMono Nerd Font
$font-display = PP Neue Machina Ultra-Bold
$font-symbol = JetBrainsMono Nerd Font Mono
# Input Var
$weight = 2
$inner-color = rgba($baseAlpha80)
$border-color = rgba($mauveAlpha80)
# Colors
$clock-color = $text
$fg0 = $text
$fg1 = $base
$shape-col0 = $mauve
$shape-col1 = rgba($surface0Alpha80)
$shape-col2 = rgba($surface1Alpha80)
$shadow-pass = 2
$shadow-size = 3
$shadow-color = $crust
$shadow-boost = 1.2
$text-shadow-pass = 1
$text-shadow-boost = 0.5
$accent = $mauve
$accentAlpha = $mauveAlpha
$font = JetBrainsMono Nerd Font
# GENERAL # GENERAL
general { general {
no_fade_in = true
grace = 1
disable_loading_bar = false
hide_cursor = true hide_cursor = true
ignore_empty_input = true
text_trim = true
} }
# BACKGROUND # BACKGROUND
background { background {
monitor = monitor =
path = $wallpaper path = $HOME/Pictures/wallpapers/rem-latte.jpg
blur_passes = 0
blur_passes = $blur color = $base
contrast = 0.8916
brightness = 0.7172
vibrancy = 0.1696
vibrancy_darkness = 0
} }
# PROFILE PICTURE # LAYOUT
image {
monitor =
path = $imgPath/profile.jpg
size = 120 # lesser side if not 1:1 ratio
opacity = 0.25
shadow_pass = $shadow-pass
shadow_size = $shadow-size
shadow_color = $shadow-color
shadow_boost = $shadow-boost
rounding = $rounding # negative values mean circle
border_size = 4
border_color = $mauve
rotate = 0 # degrees, counter-clockwise
position = 20, -20
halign = left
valign = top
zindex = 1
}
# USER INFO
label { label {
monitor = monitor =
text = cmd[update:1000] echo -e "$USER\n󰁥 $($host)\n\n$(uname -r)\nPackages: $(pacman -Q | wc -l) pacman" text = Layout: $LAYOUT
color = $text
shadow_passes = 1 font_size = 25
shadow_boost = 0.5 font_family = $font
position = 30, -30
color = $fg0
font_size = 11
font_family = $font-text
position = 170, -35
halign = left halign = left
valign = top valign = top
} }
# WEATHERCAST & LOCATION # TIME
label { label {
monitor = monitor =
text = cmd[update:1000] echo "$(bash $scrPath/weatherinfo.sh)" text = $TIME
color = $text
shadow_passes = 1 font_size = 90
shadow_boost = 0.5 font_family = $font
position = -30, 0
color = $fg0 halign = right
font_size = 11
font_family = $font-text
position = 0, -20
halign = center
valign = top valign = top
} }
# INPUT FIELD
input-field {
monitor =
size = 275, 55
rounding = $rounding
outline_thickness = $weight
outer_color = $border-color
dots_size = 0.1 # Scale of input-field height, 0.2 - 0.8
dots_spacing = 1 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = true
inner_color = $inner-color
font_color = $fg0
fade_on_empty = false
font_family = $font-text
placeholder_text = <span foreground="##$textAlpha">󰢏 $USER</span>
hide_input = false
check_color = $mauve
fail_color = $red
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
capslock_color = $yellow
position = 0, -240
halign = center
valign = center
zindex = 10
}
# TIME HR
label {
monitor =
text = cmd[update:1000] echo -e "$(date +"%H")" # 24-Hour Format
#text = cmd[update:1000] echo -e "$(date +"%I")" # 12-Hour Format
color = $clock-color
shadow_pass = $shadow-pass
shadow_size = $shadow-size
shadow_color = $shadow-color
shadow_boost = $shadow-boost
font_size = 150
font_family = $font-display
position = 0, -155
halign = center
valign = top
}
# TIME MM
label {
monitor =
text = cmd[update:1000] echo -e "$(date +"%M")"
color = $clock-color
shadow_pass = $shadow-pass
shadow_size = $shadow-size
shadow_color = $shadow-color
shadow_boost = $shadow-boost
font_size = 150
font_family = $font-display
position = 0, -325
halign = center
valign = top
}
# AM/PM for 12-Hour Format
#label {
monitor =
text = cmd[update:1000] echo -e "$(date +"%p")"
color = $clock-color
shadow_pass = $shadow-pass
shadow_size = $shadow-size
shadow_color = $shadow-color
shadow_boost = $shadow-boost
font_size = 16
font_family = $font-display
position = 0, 17
halign = center
valign = center
zindex = 5
}
# AM/PM BG
#shape {
monitor =
size = 70, 40
shadow_passes = $text-shadow-pass
shadow_boost = $text-shadow-boost
color = $shape-col2
rounding = $rounding
border_size =
border_color =
position = 0, 20
halign = center
valign = center
zindex = 1
}
# GREETING
label {
monitor =
text = cmd[update:1000] echo "$(bash $scrPath/greeting.sh)"
shadow_passes = $text-shadow-pass
shadow_boost = $text-shadow-boost
color = $fg0
font_size = 11
font_family = $font-text
position = 0, -55
halign = center
valign = center
}
# TODAY IS
label {
monitor =
text = cmd[update:1000] bash -c 'day=$(date +%A); echo "Today is $day"'
shadow_passes = $text-shadow-pass
shadow_boost = $text-shadow-boost
color = $fg0
font_size = 11
font_family = $font-text
position = 0, -75
halign = center
valign = center
}
# DATE # DATE
label { label {
monitor = monitor =
text = cmd[update:1000] bash -c 'day=$(date +%d); case "$day" in 1) suffix="st";; 2) suffix="nd";; 3) suffix="rd";; *) suffix="th";; esac; echo -e "$(date +"%B %e")'$day'$suffix, $(date +%Y)"' text = cmd[update:43200000] date +"%A, %d %B %Y"
color = $text
shadow_passes = $text-shadow-pass font_size = 25
shadow_boost = $text-shadow-boost font_family = $font
position = -30, -150
color = $fg0
font_size = 14
font_family = $font-text
position = 0, -115
halign = center
valign = center
}
# BATTERY
label {
monitor =
text = cmd[update:1000] echo -e "$($scrPath/battery.sh)"
color = $fg1
font_size = 12
font_family = $font-text
position = -37, 29
halign = right halign = right
valign = bottom valign = top
zindex = 5
} }
# NETWORK # FINGERPRINT
label { {
monitor = monitor = "";
text = cmd[update:1000] echo -e "$($scrPath/network.sh)" text = "$FPRINTPROMPT";
color = "$text";
color = $fg1 font_size = 14;
font_size = 12 font_family = $font;
font_family = $font-text position = "0, -107";
halign = "center";
position = 37, 29 valign = "center";
halign = left
valign = bottom
zindex = 5
} }
# BLUETOOTH # USER AVATAR
label {
monitor =
text = cmd[update:1000] echo -e "$(~/.config/hypr/hyprlock/bluetooth.sh)"
color = $fg1
font_size = 12
font_family = $font-text
position = 37, 85
halign = left
valign = bottom
zindex = 5
}
# BATTERY BG
shape {
monitor =
size = 90, 40
shadow_passes = $text-shadow-pass
shadow_boost = $text-shadow-boost
color = $shape-col0
rounding = $shape-rd
border_size =
border_color =
position = -20, 20
halign = right
valign = bottom
zindex = 1
}
# NETWORK BG
shape {
monitor =
size = 150, 40
shadow_passes = $text-shadow-pass
shadow_boost = $text-shadow-boost
color = $shape-col0
rounding = $shape-rd
border_size =
border_color =
position = 20, 20
halign = left
valign = bottom
zindex = 1
}
# BLUETOOTH BG
shape {
monitor =
size = 150, 40
shadow_passes = $text-shadow-pass
shadow_boost = $text-shadow-boost
color = $shape-col0
rounding = $shape-rd
border_size =
border_color =
position = 20, 75
halign = left
valign = bottom
zindex = 1
}
# MEDIA BG
image { image {
monitor = monitor =
path = $imgPath/media-bg-dark-25.png path = $HOME/.face
size = 8% size = 100
opacity = 0.25 border_color = $accent
position = 0, 75
rounding = 5
border_size = 0
rotate = 0
position = 0, -10%
halign = center halign = center
valign = center valign = center
zindex = 1
} }
shape { # INPUT FIELD
input-field {
monitor = monitor =
size = 35%, 8% size = 300, 60
outline_thickness = 4
shadow_passes = $text-shadow-pass dots_size = 0.2
shadow_boost = $text-shadow-boost dots_spacing = 0.2
dots_center = true
color = $shape-col1 outer_color = $accent
rounding = $rounding inner_color = $surface0
border_size = font_color = $text
border_color = fade_on_empty = false
placeholder_text = <span foreground="##$textAlpha"><i>󰌾 Logged in as </i><span foreground="##$accentAlpha">$USER</span></span>
position = 0, 5% hide_input = false
halign = center check_color = $accent
valign = bottom fail_color = $red
zindex = 1 fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
} capslock_color = $yellow
position = 0, -47
# PLAYER TITLE
label {
monitor =
text = cmd[update:1000] echo "$($scrPath/playerctl.sh --title)"
color = $fg0
font_size = 14
font_family = $font-text
position = 0, -40%
halign = center halign = center
valign = center valign = center
zindex = 5
} }
# PLAYER ARTIST
label {
monitor =
text = cmd[update:1000] echo "$($scrPath/playerctl.sh --artist)"
color = $fg0
font_size = 11
font_family = $font-text
position = 0, -42%
halign = center
valign = center
zindex = 5
}
# PLAYER ALBUM
label {
monitor =
text = cmd[update:1000] echo "$($scrPath/playerctl.sh --album)"
color = $fg0
font_size = 11
font_family = $font-text0
position = 0, -44%
halign = center
valign = center
zindex = 5
}
# PLAYER STATUS SYMBOL
label {
monitor =
text = cmd[update:1000] echo "$($scrPath/playerctl.sh --status-symbol)"
color = $fg0
font_size = 16
font_family = $font-symbol
position = 33.5%, -38%
halign = left
valign = center
zindex = 5
}
# PLAYER STATUS
label {
monitor =
text = cmd[update:1000] echo "$($scrPath/playerctl.sh --status)"
color = $fg0
font_size = 10
font_family = $font-text
position = 35%, -38%
halign = left
valign = center
zindex = 5
}
# PLAYER SOURCE SYMBOL
label {
monitor =
text = cmd[update:1000] echo "$($scrPath/playerctl.sh --source-symbol)"
color = rgba($subtext0Alpha99)
font_size = 16
font_family = $font-symbol
position = -33.5%, -38%
halign = right
valign = center
zindex = 5
}
# PLAYER SOURCE
label {
monitor =
text = cmd[update:1000] echo "$($scrPath/playerctl.sh --source)"
color = rgba($subtext0Alpha99)
font_size = 10
font_family = $font-text
position = -35%, -38%
halign = right
valign = center
zindex = 5
}
label {
monitor =
text =
color = $fg0
font_size = 24
font_family = $font-symbol
position = 0, 1%
halign = center
valign = bottom
}
-155
View File
@@ -1,155 +0,0 @@
source = $HOME/.config/hypr/catppuccin-hyprland/themes/mocha.conf
$accent = $mauve
$accentAlpha = $mauveAlpha
$font = JetBrainsMono Nerd Font
# GENERAL
general {
hide_cursor = true
no_fade_in = false
grace = 0
disable_loading_bar = true
}
# BACKGROUND
background {
monitor =
path = $HOME/Pictures/reze/reze.png
blur_passes = 3
blur_size = 7
noise = 0.0117
contrast = 0.8916
brightness = 0.8172
vibrancy = 0.1696
vibrancy_darkness = 0.0
color = $base
}
# TIME
label {
monitor =
text = $TIME
color = $text
font_size = 120
font_family = $font
position = 0, 300
halign = center
valign = center
}
# DATE
label {
monitor =
text = cmd[update:43200000] date +"%A, %d %B %Y"
color = $text
font_size = 30
font_family = $font
position = 0, 200
halign = center
valign = center
}
# USER AVATAR (Center)
image {
monitor =
path = $HOME/.face
size = 120
border_color = rgba(255, 255, 255, 0.1)
position = 0, 50
halign = center
valign = center
}
# INPUT FIELD (Center)
input-field {
monitor =
size = 300, 60
outline_thickness = 2
dots_size = 0.2
dots_spacing = 0.2
dots_center = true
outer_color = rgba(255, 255, 255, 0.1)
inner_color = rgba(0, 0, 0, 0.2)
font_color = $text
fade_on_empty = false
placeholder_text = <span foreground="##$textAlpha"><i>󰌾 Logged in as </i><span foreground="##$accentAlpha">$USER</span></span>
hide_input = false
check_color = $accent
fail_color = $red
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
capslock_color = $yellow
position = 0, -60
halign = center
valign = center
}
# --- MUSIC DASHBOARD (TOP RIGHT) ---
# ALBUM ART (At the very top right, 80px high, adjusted -3px for perfect alignment)
image {
monitor =
path = /tmp/hyprlock_art.png
size = 80
rounding = 15
border_color = rgba(255, 255, 255, 0.1)
reload_time = 2
reload_cmd = ~/.config/hypr/scripts/album_art.sh
position = -20, -17
halign = right
valign = top
}
# MUSIC TEXT BOX (To the left of the image, same height)
shape {
monitor =
size = 300, 80
color = rgba(0, 0, 0, 0.3)
rounding = 15
border_size = 1
border_color = rgba(255, 255, 255, 0.1)
position = -110, -20
halign = right
valign = top
}
# MUSIC TEXT (Right aligned and vertically centered inside the 80px box)
label {
monitor =
text = cmd[update:1000] ~/.config/hypr/scripts/songdetail.sh
color = $text
font_size = 14
font_family = $font
position = -125, -37
halign = right
valign = top
text_align = right
}
# --- STATUS DASHBOARD (BOTTOM RIGHT) ---
# SYSTEM INFO BOX (Vertical stack container)
shape {
monitor =
size = 300, 100
color = rgba(0, 0, 0, 0.3)
rounding = 15
border_size = 1
border_color = rgba(255, 255, 255, 0.1)
position = -20, 20
halign = right
valign = bottom
}
# SYSTEM INFO TEXT (3 lines, top of each other, right aligned)
label {
monitor =
text = cmd[update:5000] ~/.config/hypr/scripts/status_info.sh
color = $text
font_size = 14
font_family = $font
position = -35, 35
halign = right
valign = bottom
text_align = right
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

-33
View File
@@ -1,33 +0,0 @@
#!/bin/bash
# Get the current battery percentage
battery_percentage=$(cat /sys/class/power_supply/BAT0/capacity)
# Get the battery status (Charging or Discharging)
battery_status=$(cat /sys/class/power_supply/BAT0/status)
# Define the battery icons for each 10% segment
battery_icons=("󰂃" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰁹")
# Define the charging icon
charging_icon="󰂄"
# Calculate the index for the icon array
# Ensure the index is within bounds (0 to 9) for battery percentages 0 to 100
icon_index=$((battery_percentage / 10))
# If the battery is 100%, use the last icon (index 9)
if [ "$battery_percentage" -eq 100 ]; then
icon_index=9
fi
# Get the corresponding icon
battery_icon=${battery_icons[$icon_index]}
# Check if the battery is charging
if [ "$battery_status" = "Charging" ]; then
battery_icon="$charging_icon"
fi
# Output the battery percentage and icon
echo "$battery_percentage% $battery_icon"
-47
View File
@@ -1,47 +0,0 @@
#!/bin/bash
# Path to the Hyprland configuration file
config_file="$HOME/.config/hypr/hyprlock.conf"
# Read the bt-mode value from the configuration file
bt_mode=$(grep -oP '^\$bt-mode\s*=\s*\K\S+' ~/.config/hypr/hyprlock.conf)
# Get Bluetooth power status
bluetooth_status=$(bluetoothctl show | grep "Powered:" | awk '{print $2}')
# Check if Bluetooth is powered on
if [ "$bluetooth_status" != "yes" ]; then
echo "󰂯 Bluetooth Off"
exit 0
fi
# Initialize connected devices
connected_devices=$(echo "$connected_devices" | sed 's/[[:space:]]*$//')
# Process Bluetooth devices
while read -r line; do
echo "Processing line: $line" >&2
device_mac=$(echo "$line" | awk '{print $2}')
device_name=$(echo "$line" | cut -d' ' -f3-)
echo "Device MAC: $device_mac" >&2
echo "Device Name: $device_name" >&2
if bluetoothctl info "$device_mac" | grep -q "Connected: yes"; then
connected_devices+="$device_name "
fi
echo "Finished processing $device_mac" >&2
echo "---" >&2
done < <(bluetoothctl devices)
# If no connected devices, show "No Devices"
if [ -z "$connected_devices" ]; then
echo "󰂲 No Devices"
exit 0
fi
# Display output based on bt-mode
if [ "$bt_mode" = "true" ]; then
echo "󰂯 $connected_devices"
else
echo "󰂯 Connected"
fi
-22
View File
@@ -1,22 +0,0 @@
#!/bin/bash
# Only works if you use SWWW for your wallpapers
SWWW_DIR="$HOME/.cache/swww/"
HYPRLOCK="$HOME/.config/hypr/hyprlock.conf"
# Get a Monitor Cache File
FIRST_FILE=$(find "$SWWW_DIR" -type f | head -n 1)
# Check if SWWW file exists
if [ -n "$FIRST_FILE" ] && [ -f "$FIRST_FILE" ]; then
WALLPAPER=$(sed -n '2p' "$FIRST_FILE")
sed -i "s|^\(\$wallpaper[[:space:]]*=[[:space:]]*\).*|\1$WALLPAPER # (screenshot or /path/to/your/wallpaper.jpg)|" "$HYPRLOCK"
echo "Wallpaper path updated to $WALLPAPER"
exit 0
fi
# Error
echo "Fehler: kein Wallpaper gefunden."
exit 1
-32
View File
@@ -1,32 +0,0 @@
#!/bin/bash
# Set your Username
# username="TamarindX"
# Read the username alias from hyprlock.conf
username=$(grep -oP '^\$USER\s*=\s*\K\S+' ~/.config/hypr/hyprlock.conf)
# Check if the username was successfully extracted
if [ -z "$username" ]; then
echo "Username not found in hyprlock.conf."
exit 1
fi
# Get the current hour
hour=$(date +%H)
# Determine the greeting based on the time
if [ "$hour" -ge 5 ] && [ "$hour" -lt 12 ]; then
greeting="Good Morning"
elif [ "$hour" -ge 12 ] && [ "$hour" -lt 17 ]; then
greeting="Good Afternoon"
elif [ "$hour" -ge 17 ] && [ "$hour" -lt 21 ]; then
greeting="Good Evening"
elif [ "$hour" -ge 21 ] && [ "$hour" -lt 24 ]; then
greeting="Good Night"
else
greeting="GO TO SLEEP!"
fi
# Output the combined text
echo -e "Hello, $username! $greeting"
-65
View File
@@ -1,65 +0,0 @@
#!/bin/bash
# Set this variable to control the output
# Set to "true" to show SSID, "false" to show "Connected"
# show_ssid=false
# Read the wifi-mode alias from hyprlock.conf
show_ssid=$(grep -oP '^\$wifi-mode\s*=\s*\K\S+' ~/.config/hypr/hyprlock.conf)
# Check if the SSID was successfully extracted else fallback?!
if [ -z "$show_ssid" ]; then
show_ssid=false
fi
# Check if any Ethernet connection is active
ethernet_connected=$(nmcli -t -f DEVICE,TYPE,STATE dev | grep -E 'ethernet:connected')
# If Ethernet
if [ -n "$ethernet_connected" ]; then
echo "󰈀 Ethernet"
exit 0
fi
# Get Wi-Fi connection status
wifi_status=$(nmcli -t -f WIFI g)
# Check if Wi-Fi is enabled
if [ "$wifi_status" != "enabled" ]; then
echo "󰤮 Wi-Fi Off"
exit 0
fi
# Get active Wi-Fi connection details
wifi_info=$(nmcli -t -f ACTIVE,SSID,SIGNAL dev wifi | grep '^yes')
# If no active connection, show "Disconnected"
if [ -z "$wifi_info" ]; then
echo "󰤮 No Wi-Fi"
exit 0
fi
# Extract SSID
ssid=$(echo "$wifi_info" | cut -d':' -f2)
# Extract signal strength
signal_strength=$(echo "$wifi_info" | cut -d':' -f3)
# Define Wi-Fi icons based on signal strength
wifi_icons=("󰤯" "󰤟" "󰤢" "󰤥" "󰤨") # From low to high signal
# Clamp signal strength between 0 and 100
signal_strength=$((signal_strength < 0 ? 0 : (signal_strength > 100 ? 100 : signal_strength)))
# Calculate the icon index based on signal strength
icon_index=$((signal_strength / 25))
# Get the corresponding icon
wifi_icon=${wifi_icons[$icon_index]}
# Output based on show_ssid variable
if [ "$show_ssid" = true ]; then
echo "$wifi_icon $ssid"
else
echo "$wifi_icon Connected"
fi
-116
View File
@@ -1,116 +0,0 @@
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 --title | --artist | --album | --source | --source-symbol"
exit 1
fi
# Function to get metadata using playerctl
get_metadata() {
key=$1
playerctl metadata --player=%any,chromium,firefox --format "{{ $key }}" 2>/dev/null
}
# Check for arguments
# Function to determine the source and return an icon and text
get_source_info_symbol() {
trackid=$(get_metadata "mpris:trackid")
if [[ "$trackid" == *"firefox"* ]]; then
echo -e "󰈹"
elif [[ "$trackid" == *"spotify"* ]]; then
echo -e ""
elif [[ "$trackid" == *"chromium"* ]]; then
echo -e ""
else
echo ""
fi
}
get_source_info() {
trackid=$(get_metadata "mpris:trackid")
if [[ "$trackid" == *"firefox"* ]]; then
echo -e "Firefox"
elif [[ "$trackid" == *"spotify"* ]]; then
echo -e "Spotify"
elif [[ "$trackid" == *"chromium"* ]]; then
echo -e "Chrome"
else
echo ""
fi
}
# Function to truncate text with ellipsis if necessary
truncate_with_ellipsis() {
text=$1
max_length=$2
if [ ${#text} -gt $max_length ]; then
echo "${text:0:$((max_length - 3))}..."
else
echo "$text"
fi
}
# Parse the argument
case "$1" in
--title)
title=$(get_metadata "xesam:title")
if [ -z "$title" ]; then
echo ""
else
truncate_with_ellipsis "$title" 28 # Limit the output to 50 characters
fi
;;
--artist)
artist=$(get_metadata "xesam:artist")
if [ -z "$artist" ]; then
echo ""
else
truncate_with_ellipsis "$artist" 28 # Limit the output to 50 characters
fi
;;
--status-symbol)
status=$(playerctl status 2>/dev/null)
if [[ $status == "Playing" ]]; then
echo "󰎆"
elif [[ $status == "Paused" ]]; then
echo "󰏥"
else
echo ""
fi
;;
--status)
status=$(playerctl status 2>/dev/null)
if [[ $status == "Playing" ]]; then
echo "Playing Now"
elif [[ $status == "Paused" ]]; then
echo "Paused"
else
echo ""
fi
;;
--album)
album=$(playerctl metadata --player=%any,chromium,firefox --format "{{ xesam:album }}" 2>/dev/null)
if [[ -n $album ]]; then
echo "$album"
else
status=$(playerctl status 2>/dev/null)
if [[ -n $status ]]; then
echo "Not album"
else
truncate_with_ellipsis "$album" 28 # Limit the output to 50 characters
fi
fi
;;
--source-symbol)
get_source_info_symbol
;;
--source)
get_source_info
;;
*)
echo "Invalid option: $1"
echo "Usage: $0 --title | --artist | --album | --source | --source-symbol"
exit 1
;;
esac
-39
View File
@@ -1,39 +0,0 @@
#!/bin/bash
# Get location data using IP Geolocation
# Recommended with API, but you can try w/o API [IPINFO.IO]
# API_TOKEN="YOUR_API_TOKEN"
# location_data=$(curl -s "https://ipinfo.io?token=$API_TOKEN" 2>/dev/null)
# location_data=$(curl -s https://ipinfo.io 2>/dev/null) #[Limited requests. Require API to send 50k request/month]
# Extract city and country code (ISO 3166-1 alpha-2 code)
# CITY=$(echo "$location_data" | jq -r '.city // empty')
# COUNTRY=$(echo "$location_data" | jq -r '.country // empty')
# IPINFO Alternative [IP-API.COM]
location_data=$(curl -s "http://ip-api.com/json/" 2>/dev/null)
# Extract city and country code
CITY=$(echo "$location_data" | jq -r '.city // empty')
COUNTRY=$(echo "$location_data" | jq -r '.countryCode // empty')
# Visit http://ip-api.com/json/ to find other variables
# HARDCODE Location
# CITY=$(grep -oP '^\$CITY\s*=\s*\K.+' ~/.config/hypr/hyprlock.conf)
# COUNTRY=$(grep -oP '^\$COUNTRY\s*=\s*\K.+' ~/.config/hypr/hyprlock.conf)
# Check if CITY and COUNTRY are valid
if [[ -n "$CITY" && -n "$COUNTRY" ]]; then
# Fetch weather info for the detected city from wttr.in
weather_info=$(curl -s "wttr.in/$CITY?format=%c+%C+%t" 2>/dev/null)
# Check if the weather info is valid
if [[ -n "$weather_info" ]]; then
echo "$COUNTRY, $CITY: $weather_info"
else
echo "Weather info unavailable for $COUNTRY, $CITY"
fi
else
echo "Unable to determine your location"
fi
+4 -7
View File
@@ -1,7 +1,4 @@
wallpaper { # preload = ~/Pictures/red_moon/red_moon-latte.jpg
monitor = preload = ~/Pictures/wallpapers/rem.jpg
path = ~/.wallpapers/takemi_2.jpg # wallpaper = ,~/Pictures/red_moon/red_moon-latte.jpg
fit_mode = cover wallpaper = ,~/Pictures/wallpapers/rem.jpg
}
splash = false
+3
View File
@@ -0,0 +1,3 @@
color_scheme=/usr/share/qt6ct/colors/catppuccin-mocha-maroon.conf
icon_theme=Papirus
style=Fusion
-97
View File
@@ -1,97 +0,0 @@
#!/bin/bash
# Set paths
CONFIG_DIR="$HOME/.config/hypr"
BACKUP_DIR="$CONFIG_DIR/hyprlock-backup-$(date +%Y%m%d%H%M%S)"
REPO_URL="https://github.com/Tamarindtype/googlish-hyprlock-theme.git"
TEMP_DIR="$(mktemp -d)"
read -p "Do you want to see every command executed? [y/N]: " choice
choice=${choice,,}
if [[ "$choice" == "y" ]]; then
SHOW_COMMANDS=true
else
SHOW_COMMANDS=false
fi
run_cmd() {
local desc="$1"
local cmd="$2"
if [[ "$SHOW_COMMANDS" == true ]]; then
echo -e "\n$desc"
echo "-> $cmd"
read -p "Run command? [Y/n]: " confirm
confirm=${confirm,,}
if [[ "$confirm" == "n" ]]; then
echo "⏭ Skipped."
else
eval "$cmd"
fi
else
eval "$cmd"
fi
}
# Backup existing config
if [ -d "$CONFIG_DIR/hyprlock" ] || [ -f "$CONFIG_DIR/hyprlock.conf" ]; then
read -p "Do you want to create a backup of your config? [Y/n]: " choice
choice=${choice,,}
if [[ "$choice" != "n" ]]; then
run_cmd "Creating backup folder" "mkdir -p \"$BACKUP_DIR\""
if [ -d "$CONFIG_DIR/hyprlock" ]; then
run_cmd "Backing up folder" "mv \"$CONFIG_DIR/hyprlock\" \"$BACKUP_DIR/\""
fi
if [ -f "$CONFIG_DIR/hyprlock.conf" ]; then
run_cmd "Backing up file" "mv \"$CONFIG_DIR/hyprlock.conf\" \"$BACKUP_DIR/\""
fi
fi
else
echo "No existing hyprlock config found. Skipping backup."
fi
# Clone the repo
run_cmd "Cloning repository..." "git clone \"$REPO_URL\" \"$TEMP_DIR\""
# Move files
run_cmd "Creating config directory" "mkdir -p \"$CONFIG_DIR\""
if [ -d "$TEMP_DIR/hyprlock" ]; then
run_cmd "Moving hyprlock folder" "mv \"$TEMP_DIR/hyprlock\" \"$CONFIG_DIR/\""
fi
if [ -f "$TEMP_DIR/hyprlock.conf" ]; then
run_cmd "Moving hyprlock.conf" "mv \"$TEMP_DIR/hyprlock.conf\" \"$CONFIG_DIR/\""
fi
# Make scripts executable
if [ -d "$CONFIG_DIR/hyprlock" ]; then
run_cmd "Making scripts executable..." "chmod +x \"$CONFIG_DIR/hyprlock\"/*.sh"
fi
# Optional: Run hyprlock
run_cmd "Running Hyprlock" "hyprlock"
read -p "Do you want to install the 'hyprlock-change-wallpaper' command? [Y/n]: " choice
choice=${choice,,}
if [[ "$choice" != "n" ]]; then
run_cmd "Installing hyprlock-change-wallpaper shortcut" "sudo ln -sf $CONFIG_DIR/hyprlock/change_wallpaper.sh /usr/local/bin/hyprlock-change-wallpaper"
run_cmd "Make command runable" "chmod +x $CONFIG_DIR/hyprlock/change_wallpaper.sh"
if command -v hyprlock-change-wallpaper &>/dev/null; then
echo "hyprlock-change-wallpaper was succesfully installed"
else
echo "Error while installing hyprlock-change-wallpaper."
fi
else
echo "⏭ installation of hyprlock-change-wallpaper skipped"
fi
# Cleanup
run_cmd "Cleaning up temp files..." "rm -rf \"$TEMP_DIR\""
-1
View File
@@ -1 +0,0 @@
+2 -8
View File
@@ -2,20 +2,14 @@
# Autostart necessary processes (like notifications daemons, status bars, etc.) # Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this: # Or execute your favorite apps at launch like this:
# Takemi shell — bar, popouts, notifications, OSD, power menu and lock screen.
# Config lives in ~/.config/quickshell. It owns org.freedesktop.Notifications,
# so dunst must stay masked (systemctl --user mask dunst.service).
exec-once = uwsm app -- qs
# exec-once = uwsm app -- waybar # exec-once = uwsm app -- waybar
# exec-once = uwsm app -- hyprpanel
# exec-once = uwsm app -- nextcloud --background # exec-once = uwsm app -- nextcloud --background
exec-once = uwsm app -- nm-applet --indicator exec-once = uwsm app -- nm-applet --indicator
# exec-once = uwsm app -- rclone mount google_drive: ~/gdrive # exec-once = uwsm app -- rclone mount google_drive: ~/gdrive
# exec-once = uwsm app -- protonvpn-app exec-once = uwsm app -- protonvpn-app
exec-once = uwsm app -- hyprpaper exec-once = uwsm app -- hyprpaper
# exec-once = uwsm app -- /usr/bin/discord --enable-features=UseOzonePlatform --ozone-platform=wayland --start-minimized &> /dev/null # exec-once = uwsm app -- /usr/bin/discord --enable-features=UseOzonePlatform --ozone-platform=wayland --start-minimized &> /dev/null
# exec-once = sleep 5 && ~/.config/hypr/scripts/replay-ctrl.sh start exec-once = sleep 5 && ~/.config/hypr/scripts/replay-ctrl.sh start
# exec-once = uwsm app -- /usr/lib/xdg-desktop-portal-hyprland # exec-once = uwsm app -- /usr/lib/xdg-desktop-portal-hyprland
exec-once = wl-paste --type text --watch cliphist store # Stores only text data exec-once = wl-paste --type text --watch cliphist store # Stores only text data
exec-once = wl-paste --type image --watch cliphist store # Stores only image data exec-once = wl-paste --type image --watch cliphist store # Stores only image data
+4 -5
View File
@@ -1,18 +1,17 @@
# See https://wiki.hyprland.org/Configuring/Environment-variables/ # See https://wiki.hyprland.org/Configuring/Environment-variables/
# env = INTEL_DEBUG,noccs
# env = WLR_DRM_NO_ATOMIC,1
env = HYPRCURSOR_THEME,Bibata-Modern-Classic env = HYPRCURSOR_THEME,Bibata-Modern-Classic
env = HYPRCURSOR_SIZE,24 env = HYPRCURSOR_SIZE,24
env = XCURSOR_SIZE,24 env = XCURSOR_SIZE,24
env = XCURSOR_THEME,Bibata-Modern-Classic env = XCURSOR_THEME,Bibata-Modern-Classic
env = XDG_CURRENT_DESKTOP,Hyprland env = XDG_CURRENT_DESKTOP,Hyprland
# env = debug:full_cm_proto,true env = debug:full_cm_proto,true
env = QT_QPA_PLATFORMTHEME,qt6ct env = QT_QPA_PLATFORMTHEME,qt6ct
env = LIBVA_DRIVER_NAME,radeonsi env = LIBVA_DRIVER_NAME,radeonsi
env = VDPAU_DRIVER,radeonsi env = VDPAU_DRIVER,radeonsi
env = AMD_VULKAN_ICD,RADV
env = MOZ_ENABLE_WAYLAND,1 env = MOZ_ENABLE_WAYLAND,1
env = ELECTRON_OZONE_PLATFORM_HINT,wayland env = ELECTRON_OZONE_PLATFORM_HINT,wayland
env = EDITOR,nvim env = AMD_VULKAN_ICD,RADV
env = WLR_NO_HARDWARE_CURSORS,0
env = QT_QPA_PLATFORMTHEME,hyprqt6engine
+4 -17
View File
@@ -1,13 +1,12 @@
# https://wiki.hyprland.org/Configuring/Variables/#input # https://wiki.hyprland.org/Configuring/Variables/#input
input { input {
# index 0 = dvorak-intl (default), index 1 = us-intl kb_layout = us
# switch with $mainMod ALT, SPACE (see keybinds.conf) # kb_variant = dvorak-intl, intl
kb_layout = us,us kb_variant = intl
kb_variant = dvorak-intl,intl
kb_model = kb_model =
kb_options =
kb_rules = kb_rules =
kb_options = caps:backspace
follow_mouse = 0 follow_mouse = 0
@@ -18,15 +17,3 @@ input {
natural_scroll = false natural_scroll = false
} }
} }
# Layouts are inherited from the global input block so that layout
# switching applies to these too. Only bind resolution differs here.
device {
name = at-translated-set-2-keyboard
resolve_binds_by_sym = 1
}
device {
name = topre-corporation-hhkb-professional
resolve_binds_by_sym = 1
}
+13 -26
View File
@@ -1,37 +1,22 @@
$mainMod = SUPER # Sets "Windows" key as main modifier $mainMod = SUPER # Sets "Windows" key as main modifier
bindl=,switch:on:Lid Switch,exec,~/.config/hypr/scripts/lid_handler.sh close
bindl=,switch:off:Lid Switch,exec,~/.config/hypr/scripts/lid_handler.sh open
bindr = ALT, m, exec, cliphist list | fuzzel --dmenu | cliphist decode | wl-copy bindr = ALT, m, exec, cliphist list | fuzzel --dmenu | cliphist decode | wl-copy
bind = , PRINT, exec, grim -g "$(slurp)" - | wl-copy bind = , PRINT, exec, grim -g "$(slurp)" - | wl-copy
bind = SHIFT, PRINT, exec, grim -g "$(slurp)" ~/Pictures/Screenshots/$(date +'%Y-%m-%d_%H-%M-%S').png
bind = CTRL, PRINT, exec, ~/.config/hypr/scripts/screenshot_window.sh copy
bind = CTRL SHIFT, PRINT, exec, ~/.config/hypr/scripts/screenshot_window.sh save
bindr = ALT SHIFT, z, exec, ~/.config/hypr/scripts/replay-ctrl.sh save bindr = ALT SHIFT, z, exec, ~/.config/hypr/scripts/replay-ctrl.sh save
bindr = ALT, z, exec, ~/.config/hypr/scripts/replay-ctrl.sh toggle bindr = ALT, z, exec, ~/.config/hypr/scripts/replay-ctrl.sh toggle
bindr = ALT SHIFT, c, exec, ~/.config/hypr/scripts/droidcam-ctrl.sh toggle bindr = ALT SHIFT, c, exec, ~/.config/hypr/scripts/droidcam-ctrl.sh toggle
# general binds # general binds
bind = $mainMod, M, exec, pdfs-prompt
bind = $mainMod, B, exec, fluxo bt menu
bind = $mainMod, RETURN, exec, $terminal bind = $mainMod, RETURN, exec, $terminal
bind = $mainMod SHIFT, Q, killactive, bind = $mainMod SHIFT, Q, killactive,
bind = $mainMod CTRL, L, exec, qs ipc call shell lock bind = $mainMod CTRL, L, exec, hyprlock
bind = $mainMod, E, exec, $fileManager bind = $mainMod, E, exec, $fileManager
bind = $mainMod, V, togglefloating, bind = $mainMod, V, togglefloating,
bind = $mainMod, F, fullscreen, bind = $mainMod, F, fullscreen,
bind = $mainMod, SPACE, exec, $menu bind = $mainMod, SPACE, exec, $menu
bind = $mainMod, P, exec, qs ipc call shell power bind = $mainMod, P, exec, ~/.config/hypr/scripts/powermenu.sh
bind = $mainMod, t, togglesplit, # dwindle
# Takemi shell
bind = $mainMod SHIFT, N, exec, qs ipc call shell toggleDnd
bind = $mainMod CTRL SHIFT, N, exec, qs ipc call shell clearNotifications
bind = $mainMod SHIFT, R, exec, qs ipc call shell reloadConfig
# cycle keyboard layout (dvorak-intl <-> us-intl)
bind = $mainMod ALT, SPACE, exec, hyprctl switchxkblayout all next
# bind = $mainMod, t, togglesplit, # dwindle
bind = $mainMod, n, togglegroup bind = $mainMod, n, togglegroup
# Move focus with mainMod + arrow keys # Move focus with mainMod + arrow keys
@@ -75,8 +60,8 @@ bind = ALT, Tab, changegroupactive, next
# Example special workspace (scratchpad) # Example special workspace (scratchpad)
bind = $mainMod, S, togglespecialworkspace, virtual bind = $mainMod, S, togglespecialworkspace, magic
bind = $mainMod SHIFT, S, movetoworkspace, special:virtual bind = $mainMod SHIFT, S, movetoworkspace, special:magic
bind = $mainMod, D, togglespecialworkspace, discord bind = $mainMod, D, togglespecialworkspace, discord
bind = $mainMod SHIFT, D, movetoworkspace, special:discord bind = $mainMod SHIFT, D, movetoworkspace, special:discord
@@ -89,15 +74,17 @@ bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow bindm = $mainMod, mouse:273, resizewindow
# Laptop multimedia keys for volume and LCD brightness # Laptop multimedia keys for volume and LCD brightness
bindel = ,XF86AudioRaiseVolume, exec, fluxo vol up 5 bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindel = ,XF86AudioLowerVolume, exec, fluxo vol down 5 bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = ,XF86AudioMute, exec, fluxo vol mute bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = ,XF86AudioMicMute, exec, fluxo mic mute bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl s +10% bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%- bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
# Requires playerctl # Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous bindl = , XF86AudioPrev, exec, playerctl previous
bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%-
+9 -12
View File
@@ -1,13 +1,10 @@
# laptop screen monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 2560x1440@240, 0x0, 1
monitor = eDP-1, 1920x1080@60, 0x0, 1 # monitorv2 {
# samsung home monitor # desc = Samsung Electric Company LC27G7xT H4ZRA00734
# monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 1280x720@240, 0x0, 1 # mode = 2560x1440@240
monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 2560x1440@240, -2560x0, 1 # position = 0x0
# monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 2560x1440@144, 0x0, 1 # scale = 1
# monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 1920x1080@144, 0x0, 1 # bitdepth = 10
# monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 2560x1440@60, 0x0, 1 # cm = wide
# }
# lid_state fallback
source = ~/.config/hypr/lid_state.conf
+38
View File
@@ -0,0 +1,38 @@
exec-once = hyprpm reload -n
# plugin:hyprfocus {
# enabled = yes
# animate_floating = yes
# animate_workspacechange = yes
# focus_animation = shrink
# # Beziers for focus animations
# bezier = bezIn, 0.5,0.0,1.0,0.5
# bezier = bezOut, 0.0,0.5,0.5,1.0
# bezier = overshot, 0.05, 0.9, 0.1, 1.05
# bezier = smoothOut, 0.36, 0, 0.66, -0.56
# bezier = smoothIn, 0.25, 1, 0.5, 1
# bezier = realsmooth, 0.28,0.29,.69,1.08
# # Flash settings
# flash {
# flash_opacity = 0.95
# in_bezier = realsmooth
# in_speed = 0.5
# out_bezier = realsmooth
# out_speed = 3
# }
# # Shrink settings
# shrink {
# shrink_percentage = 0.95
# in_bezier = realsmooth
# in_speed = 1
# out_bezier = realsmooth
# out_speed = 2
# }
# }
#
# plugin:csgo-vulkan-fix {
# res_w = 1280
# res_h = 960
# class = gamescope
# fix_mouse = true
# }
-25
View File
@@ -1,25 +0,0 @@
# Takemi palette — kept in step with ~/.config/quickshell/config/Theme.qml.
# Derived from ~/.wallpapers/takemi_2.jpg: cold teal over near-black, with
# Persona 5 crimson as the accent.
$base = rgb(04070a)
$mantle = rgb(080e14)
$surface = rgb(0d1922)
$surfaceAlt = rgb(14262f)
$overlay = rgb(1d3a47)
$outline = rgb(2b5567)
$text = rgb(e2f4f8)
$subtext = rgb(93b8c4)
$muted = rgb(587c8a)
$primary = rgb(34d3e6)
$primaryDim = rgb(17879b)
$glow = rgb(8ef2ff)
$blue = rgb(3b8fd6)
$deep = rgb(0d4b5e)
$accent = rgb(ff2d40)
$accentDim = rgb(a8121f)
$warn = rgb(ffb03a)
$ok = rgb(35e08f)
+58 -85
View File
@@ -1,99 +1,90 @@
# Takemi — Persona 5 flavoured theme, matched to ~/.config/quickshell. # catppuccin mocha theme
source = ~/.config/hypr/modules/takemi.conf source = ~/.config/hypr/catppuccin-hyprland/themes/mocha.conf
# Refer to https://wiki.hyprland.org/Configuring/Variables/ # Refer to https://wiki.hyprland.org/Configuring/Variables/
# https://wiki.hyprland.org/Configuring/Variables/#general # https://wiki.hyprland.org/Configuring/Variables/#general
general { general {
gaps_in = 5 gaps_in = 5
gaps_out = 6, 8, 8, 8 gaps_out = 5, 5, 5, 5
border_size = 2 border_size = 3
# Teal into crimson, on the diagonal — the shell's two voices. # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
col.active_border = $primary $accent 135deg # col.active_border = rgba(cba6f7ee) rgba(f38ba8ee) 45deg
col.inactive_border = $outline col.active_border = rgb($mauveAlpha) rgb($blueAlpha) 30deg
col.inactive_border = rgb($surface2Alpha)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false resize_on_border = false
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = false allow_tearing = true
layout = dwindle layout = dwindle
} }
# https://wiki.hyprland.org/Configuring/Variables/#decoration # https://wiki.hyprland.org/Configuring/Variables/#decoration
decoration { decoration {
# Persona 5 has no rounded corners. Neither do we. rounding = 4
rounding = 0 rounding_power = 1
# Change transparency of focused and unfocused windows
active_opacity = 1.0 active_opacity = 1.0
inactive_opacity = 0.96 inactive_opacity = 1.0
shadow { shadow {
enabled = true enabled = true
range = 18 range = 4
render_power = 3 render_power = 3
offset = 0 4 color = rgba(1a1a1aee)
color = rgba(04070aee)
color_inactive = rgba(04070a88)
} }
# https://wiki.hyprland.org/Configuring/Variables/#blur # https://wiki.hyprland.org/Configuring/Variables/#blur
blur { blur {
enabled = true enabled = true
size = 6 size = 3
passes = 3 passes = 1
new_optimizations = true
ignore_opacity = true
xray = false
noise = 0.02
contrast = 1.1
brightness = 0.85
vibrancy = 0.25
vibrancy_darkness = 0.3
# The bar and its popouts do their own thing. vibrancy = 0.1696
popups = true
popups_ignorealpha = 0.4
} }
} }
# https://wiki.hyprland.org/Configuring/Animations/ # https://wiki.hyprland.org/Configuring/Variables/#animations
# Snappy with a little overshoot — nothing here should feel soft.
animations { animations {
enabled = yes, please :) enabled = yes, please :)
bezier = snap, 0.16, 1.00, 0.30, 1.00 # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = overshoot, 0.34, 1.56, 0.64, 1.00
bezier = hard, 0.55, 0.00, 0.90, 0.35 bezier = easeOutQuint,0.23,1,0.32,1
bezier = easeInOutCubic,0.65,0.05,0.36,1
bezier = linear,0,0,1,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, 4, snap animation = global, 1, 10, default
animation = border, 1, 6, snap animation = border, 1, 5.39, easeOutQuint
animation = borderangle, 1, 60, linear, loop 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
}
animation = windows, 1, 4, overshoot # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
animation = windowsIn, 1, 4.2, overshoot, popin 88% dwindle {
animation = windowsOut, 1, 2.4, hard, popin 90% pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
animation = windowsMove, 1, 3.6, snap preserve_split = true # You probably want this
animation = fade, 1, 3, snap
animation = fadeIn, 1, 2.4, snap
animation = fadeOut, 1, 1.8, hard
animation = fadeSwitch, 1, 2, snap
animation = fadeShadow, 1, 3, snap
animation = fadeDim, 1, 2.4, snap
animation = layers, 1, 3, overshoot
animation = layersIn, 1, 3.4, overshoot, slide
animation = layersOut, 1, 2, hard, slide
animation = workspaces, 1, 3.4, overshoot, slidevert
animation = workspacesIn, 1, 3.4, overshoot, slidevert
animation = workspacesOut, 1, 2.6, hard, slidevert
animation = specialWorkspace, 1, 3.6, overshoot, slidevert
} }
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
@@ -101,40 +92,22 @@ master {
new_status = master new_status = master
} }
dwindle {
preserve_split = true
}
# https://wiki.hyprland.org/Configuring/Variables/#misc # https://wiki.hyprland.org/Configuring/Variables/#misc
misc { misc {
force_default_wallpaper = 0 force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = true disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :(
# 0 = off, 1 = always, 2 = fullscreen only (G7 is a 240Hz VRR panel) vrr = 0
vrr = 2
font_family = FiraCode Nerd Font font_family = FiraCode Nerd Font
background_color = $base
focus_on_activate = true
} }
group { group {
col.border_active = $primary $accent 135deg
col.border_inactive = $outline
groupbar { groupbar {
font_family = JetBrainsMono Nerd Font font_size = 14
font_size = 11 text_color = $text
text_color_inactive = $text
height = 24 col.active = $maroon
gradients = false col.inactive = $surface2
# --- Active Tab ---
col.active = $primary
text_color = $base
# --- Inactive Tab ---
col.inactive = $surface
text_color_inactive = $muted
indicator_height = 3
} }
col.border_active = $maroon $teal 30deg
col.border_inactive = $surface2
} }
+69 -71
View File
@@ -1,89 +1,87 @@
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
# ==========================================
# VARIABLES
# ==========================================
# Dialogs and utility apps that should float in the center
$dialog_titles = ^(Open Form|Open File|Select a File|Choose a file|Open Workspace|Choose Directory.*|Save As.*|Save File.*|branchdialog|pinentry-gtk-2|Confirm to replace files|File Operation Progress|Open Files.*|Anmelden.*|File Upload.*|TRuDI-Export laden)$
$dialog_classes = ^(pavucontrol|blueman-manager|nm-connection-editor|org.pulseaudio.pavucontrol|io.narl.proton-drive-linux-prompt)$
# App classes
$steam = ^(steam)$
$gamescope = ^(gamescope)$
# ==========================================
# GENERAL & FIXES
# ==========================================
# Ignore maximize requests from apps. You'll probably like this. # Ignore maximize requests from apps. You'll probably like this.
# windowrule = suppress_event maximize, match:class .* windowrule = suppressevent maximize, class:.*
# Fix some dragging issues with XWayland # Fix some dragging issues with XWayland
# windowrule = no_focus 1, match:class ^$, match:title ^$, match:xwayland 1, match:floating 1, match:fullscreen 0, match:pinned 0 windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
windowrule = no_blur 1, match:class ^$, match:title ^$ windowrulev2=noblur,class:^()$,title:^()$
# ========================================== # games for tearing add the immediate rule
# FLOATING & CENTERED DIALOGS
# ==========================================
# Make them float
windowrule = float 1, match:title $dialog_titles
windowrule = float 1, match:class $dialog_classes
# Set to 800x600 # Float Windows
windowrule = size 800 600, match:title $dialog_titles windowrulev2=float,title:^(Open File)$
windowrule = size 800 600, match:class $dialog_classes windowrulev2=float,title:^(Select a File)$
windowrulev2=float,title:^(Select Folder)$
windowrulev2=float,title:^(Choose a file)$
windowrulev2=float,title:^(Save As)$
windowrulev2=float,title:^(Save File)$
windowrulev2=float,title:^(branchdialog)$
windowrulev2=float,title:^(pinentry-gtk-2)$
windowrulev2=float,title:^(Confirm to replace files)$
windowrulev2=float,title:^(File Operation Progress)$
windowrulev2=float,class:^(pavucontrol|blueman-manager|nm-connection-editor)$
# Center them on the screen # Center and Resize Windows
windowrule = center 1, match:title $dialog_titles windowrulev2=size 800 600,title:^(Open File)$
windowrule = center 1, match:class $dialog_classes windowrulev2=size 800 600,title:^(Select a File)$
windowrulev2=size 800 600,title:^(Choose a file)$
windowrulev2=size 800 600,title:^(Save As)$
windowrulev2=size 800 600,title:^(Save File)$
windowrulev2=size 800 600,title:^(branchdialog)$
windowrulev2=size 800 600,title:^(pinentry-gtk-2)$
windowrulev2=size 800 600,title:^(Confirm to replace files)$
windowrulev2=size 800 600,title:^(File Operation Progress)$
windowrulev2=size 800 600,class:^(pavucontrol|blueman-manager|nm-connection-editor)$
windowrulev2=center,title:^(Open File)$
windowrulev2=center,title:^(Select a File)$
windowrulev2=center,title:^(Choose a file)$
windowrulev2=center,title:^(Save As)$
windowrulev2=center,title:^(Save File)$
windowrulev2=center,title:^(branchdialog)$
windowrulev2=center,title:^(pinentry-gtk-2)$
windowrulev2=center,title:^(Confirm to replace files)$
windowrulev2=center,title:^(File Operation Progress)$
windowrulev2=center,class:^(pavucontrol|blueman-manager|nm-connection-editor)$
windowrulev2=noblur,title:^(Open File)$
windowrulev2=noblur,title:^(Select a File)$
windowrulev2=noblur,title:^(Choose a file)$
windowrulev2=noblur,title:^(Save As)$
windowrulev2=noblur,title:^(Save File)$
windowrulev2=noblur,title:^(branchdialog)$
windowrulev2=noblur,title:^(pinentry-gtk-2)$
windowrulev2=noblur,title:^(Confirm to replace files)$
windowrulev2=noblur,title:^(File Operation Progress)$
windowrulev2=noblur,class:^(pavucontrol|blueman-manager|nm-connection-editor)$
# Disable blur # Workspace Rules
windowrule = no_blur 1, match:title $dialog_titles # windowrule=workspace 1,class:^(firefox)$
windowrule = no_blur 1, match:class $dialog_classes # windowrule=workspace 2,class:^(kitty)$
# windowrule=workspace 3,class:^(Code)$
# ========================================== windowrulev2=workspace special:magic,class:^(Spotify)$
# WORKSPACE ASSIGNMENTS windowrulev2=workspace special:magic,class:^(spotify)$
# ========================================== windowrulev2=workspace special:discord,class:^(discord|vesktop)$
# Normal Workspaces # windowrulev2=workspace 2, class:^(brave-browser)$
# windowrule = workspace 1, match:class ^(firefox)$
# windowrule = workspace 2, match:class ^(kitty)$
# windowrule = workspace 3, match:class ^(Code)$
windowrule = workspace 1, match:class $gamescope
# Special Workspaces # steam rules
windowrule = workspace special:virtual, match:class ^(Spotify|spotify)$
windowrule = workspace special:discord, match:class ^(discord|vesktop)$
windowrulev2=workspace 3 silent, class:^(steam)$, title:^(Steam)$
windowrulev2=workspace 4, class:^(gamescope)$
# ========================================== # fixed sizes for different windows
# APP-SPECIFIC RULES: STEAM & GAMING windowrulev2=size 400 800,title:^(Friends List)$ class:^(steam)$
# ========================================== windowrulev2=size 1000 800,title:^(Steam Settings)$ class:^(steam)$
# windowrule = workspace 3 silent, match:class $steam, match:title ^(Steam)$ windowrulev2=size 1000 800,title:^(Add Non-Steam Game)$ class:^(steam)$
# Fixed sizes for specific Steam windows # float windows that arent the main steam window
windowrule = size 400 800, match:title ^(Friends List)$, match:class $steam windowrulev2 = float, class:^(steam)$, title:negative:^(Steam)$
windowrule = size 1000 800, match:title ^(Steam Settings)$, match:class $steam windowrulev2 = noblur, class:^(steam)$, title:negative:^(Steam)$
windowrule = size 1000 800, match:title ^(Add Non-Steam Game)$, match:class $steam # windowrulev2 = center, class:^(steam)$, title:negative:^(Steam)$
# Float and disable blur for Steam windows that aren't the main window # allow tearing for games started with gamescope
windowrule = float 1, match:class $steam, match:title negative:^(Steam)$ windowrulev2 = immediate, class:^(gamescope)$
windowrule = no_blur 1, match:class $steam, match:title negative:^(Steam)$
# windowrule = center 1, match:class $steam, match:title negative:^(Steam)$
# Allow tearing for games started with Gamescope
windowrule = immediate 1, match:class $gamescope
# Layer rules
# waybar blur
layerrule = blur on, match:namespace bottom
layerrule = blur on, match:namespace top
layerrule = ignore_alpha 0.5, match:namespace bottom
layerrule = ignore_alpha 0.5, match:namespace top
# launcher blur
layerrule = blur on, match:namespace launcher
layerrule = ignore_alpha 0.5, match:namespace launcher
-11
View File
@@ -1,11 +0,0 @@
#!/bin/bash
url=$(playerctl metadata mpris:artUrl 2>/dev/null)
if [[ "$url" == file://* ]]; then
cp "${url#file://}" /tmp/hyprlock_art.png
echo "/tmp/hyprlock_art.png"
elif [[ "$url" == http* ]]; then
curl -s "$url" -o /tmp/hyprlock_art.png
echo "/tmp/hyprlock_art.png"
else
echo "$HOME/.config/hypr/catppuccin-hyprland/assets/mocha.webp"
fi
+7 -1
View File
@@ -15,7 +15,13 @@ start() {
notify-send -u low "$PROGRAM_NAME" "$PROGRAM_NAME is starting ..." notify-send -u low "$PROGRAM_NAME" "$PROGRAM_NAME is starting ..."
ANDROID_SERIAL=$ANDROID_SERIAL droidcam-cli -a -v -size=1920x1080 adb 4747 &> /dev/null & ANDROID_SERIAL=$ANDROID_SERIAL droidcam-cli -a -v -size=1920x1080 adb 4747 &> /dev/null &
echo $! > "$PID_FILE" PID=$!
sleep 1
if ! ps -p "$PID" > /dev/null; then
notify-send -u critical "$PROGRAM_NAME" "$PROGRAM_NAME did not start"
exit 1
fi
echo "$PID" > "$PID_FILE"
} }
-54
View File
@@ -1,54 +0,0 @@
#!/bin/bash
# ~/.config/hypr/scripts/lid_handler.sh
# The file that tells Hyprland to keep the lid off during reloads
LID_STATE_FILE="$HOME/.config/hypr/lid_state.conf"
restart_ui() {
# The Quickshell bar follows monitor hotplug on its own, so only the
# wallpaper daemon needs a kick.
systemctl restart --user hyprpaper
}
if [[ "$1" == "close" ]]; then
# Check if ANY external monitor is connected and active
if hyprctl monitors all | grep -qE "Monitor (DP|HDMI|Type-C)-"; then
# Prevent laptop screen from turning on during manual config reloads
echo "monitor=eDP-1, disable" > "$LID_STATE_FILE"
# Extract the CURRENT live settings of all external monitors using jq
# This grabs the active resolution, refresh rate, position, and scale.
LIVE_MONITORS=$(hyprctl -j monitors | jq -c '.[] | select(.name != "eDP-1")')
# 3. Disable the laptop screen
hyprctl keyword monitor "eDP-1, disable"
# 4. Re-apply the live settings to external monitors so they don't reset
echo "$LIVE_MONITORS" | while read -r mon_json; do
NAME=$(echo "$mon_json" | jq -r '.name')
WIDTH=$(echo "$mon_json" | jq -r '.width')
HEIGHT=$(echo "$mon_json" | jq -r '.height')
REFRESH=$(echo "$mon_json" | jq -r '.refreshRate')
X=$(echo "$mon_json" | jq -r '.x')
Y=$(echo "$mon_json" | jq -r '.y')
SCALE=$(echo "$mon_json" | jq -r '.scale')
# Formats it exactly as Hyprland expects: DP-1, 1920x1080@240, 0x0, 1
hyprctl keyword monitor "$NAME, ${WIDTH}x${HEIGHT}@${REFRESH}, ${X}x${Y}, $SCALE"
done
# restart ui
restart_ui
fi
elif [[ "$1" == "open" ]]; then
# Clear the override file so the laptop screen is allowed to turn on again
echo "" > "$LID_STATE_FILE"
# Let Hyprland reload itself.
# This automatically re-enables eDP-1 based on your hardcoded hyprland.conf!
hyprctl reload
restart_ui
fi
+2 -2
View File
@@ -18,14 +18,14 @@ start() {
gpu-screen-recorder \ gpu-screen-recorder \
-w screen \ -w screen \
-f 60 \ -f 60 \
-a default_output -a default_input \ -a "default_input|default_output" \
-fm vfr \ -fm vfr \
-c mkv \ -c mkv \
-encoder gpu \ -encoder gpu \
-bm qp \ -bm qp \
-cr full \ -cr full \
-tune quality \ -tune quality \
-k av1_10bit \ -k av1 \
-q high \ -q high \
-r 120 \ -r 120 \
-replay-storage ram \ -replay-storage ram \
-49
View File
@@ -1,49 +0,0 @@
#!/bin/sh
# Get active window info in JSON format
WINDOW_INFO=$(hyprctl activewindow -j)
# Extract window class name (app name)
APP_NAME=$(echo "$WINDOW_INFO" | jq -r '.class')
# If app name is empty, null, or invalid, default to "unknown"
if [ -z "$APP_NAME" ] || [ "$APP_NAME" = "null" ]; then
APP_NAME="unknown"
fi
# Sanitize app name: convert to lowercase and replace characters that aren't letters, numbers, hyphens, or underscores with underscores
APP_NAME_SAFE=$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9_-]/_/g')
# Extract geometry: "x,y wxh"
GEOMETRY=$(echo "$WINDOW_INFO" | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')
# Check if geometry is valid
if [ -z "$GEOMETRY" ] || [ "$GEOMETRY" = "null,null nullxnull" ]; then
notify-send -u normal "Screenshot Error" "No active window found to screenshot."
exit 1
fi
ACTION=$1
case "$ACTION" in
copy)
grim -g "$GEOMETRY" - | wl-copy
notify-send -u low "Screenshot" "Active window ($APP_NAME) copied to clipboard"
;;
save)
SCREENSHOTS_DIR="$HOME/Pictures/Screenshots"
APP_DIR="$SCREENSHOTS_DIR/$APP_NAME_SAFE"
mkdir -p "$APP_DIR"
FILE_NAME="$(date +'%Y-%m-%d_%H-%M-%S').png"
FILE_PATH="$APP_DIR/$FILE_NAME"
grim -g "$GEOMETRY" "$FILE_PATH"
notify-send -u low "Screenshot" "Saved active window to $APP_NAME_SAFE/$FILE_NAME"
;;
*)
echo "Usage: $0 {copy|save}"
exit 1
;;
esac
exit 0
-13
View File
@@ -1,13 +0,0 @@
#!/bin/bash
status=$(playerctl status 2>/dev/null)
if [ "$status" = "Playing" ] || [ "$status" = "Paused" ]; then
title=$(playerctl metadata title | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
artist=$(playerctl metadata artist | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
if [ ${#title} -gt 25 ]; then title="${title:0:22}..."; fi
if [ ${#artist} -gt 25 ]; then artist="${artist:0:22}..."; fi
echo "<span weight='bold' foreground='#cba6f7'>$title</span>"
echo "<span foreground='#bac2de' size='small'>$artist</span>"
else
echo "<span weight='bold' foreground='#cdd6f4'>No Media</span>"
echo "<span size='small' foreground='#a6adc8'>Idling</span>"
fi
-14
View File
@@ -1,14 +0,0 @@
#!/bin/bash
# 1. Network
net=$(nmcli -t -f active,ssid dev wifi | grep '^yes' | cut -d: -f2 || echo 'Offline')
if [ ${#net} -gt 15 ]; then net="${net:0:12}..."; fi
# 2. Battery
bat_cap=$(cat /sys/class/power_supply/BAT0/capacity)
bat_stat=$(cat /sys/class/power_supply/BAT0/status)
if [ "$bat_stat" = "Charging" ]; then icon="󰂄"; else icon="󰁹"; fi
# 3. Load
cpu=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}' | cut -d. -f1)
# Output 3 lines for the vertical stack
echo "󰖩 $net"
echo "$icon $bat_cap% ($bat_stat)"
echo "󰍛 Load: $cpu%"
-166
View File
@@ -1,166 +0,0 @@
{
"log_level": "LOG_LEVEL_INFO",
"log_subprocesses_to_journal": false,
"dbus": {
"enabled": true,
"connect_timeout": "20s",
"connect_interval": "0.200s",
"notifications": {
"enabled": true
},
"systray": {
"enabled": true
},
"shortcuts": {
"enabled": true
},
"brightness": {
"enabled": true,
"adjust_step_percent": 5,
"min_brightness": 1,
"enable_logind": true,
"hud_notifications": true
},
"power": {
"enabled": true,
"low_percent": 10,
"critical_percent": 5,
"hud_notifications": true
}
},
"audio": {
"enabled": true,
"volume_step_percent": 5,
"volume_exceed_maximum": false,
"hud_notifications": true
},
"panels": [
{
"id": "panel0",
"edge": "EDGE_TOP",
"size": 34,
"monitor": "",
"modules": [
{
"pager": {
"icon_size": 14,
"active_monitor_only": false,
"scroll_wrap_workspaces": true,
"scroll_include_inactive": true,
"enable_workspace_names": false,
"pinned": [1, 2, 3, 4, 5, 6],
"preview_width": 256
}
},
{
"spacer": {
"size": 8,
"expand": false
}
},
{
"taskbar": {
"icon_size": 24,
"active_workspace_only": true,
"active_monitor_only": true,
"group_tasks": true,
"expand": false
}
},
{
"spacer": {
"expand": true
}
},
{
"clock": {
"time_format": "15:04",
"date_format": "%a %d %b",
"tooltip_time_format": "15:04",
"tooltip_date_format": "Monday, 02 January 2006"
}
},
{
"spacer": {
"expand": true
}
},
{
"systray": {
"icon_size": 18,
"menu_icon_size": 18,
"pinned": [
"nm-applet"
],
"modules": [
{
"power": {
"icon_size": 18,
"icon_symbolic": true
}
}
]
}
},
{
"spacer": {
"size": 8,
"expand": false
}
},
{
"notifications": {
"icon_size": 18,
"notification_icon_size": 48,
"default_timeout": "7s",
"position": "POSITION_TOP_RIGHT",
"margin": 24
}
},
{
"spacer": {
"size": 8,
"expand": false
}
},
{
"audio": {
"icon_size": 18,
"icon_symbolic": true,
"command_mixer": "pavucontrol",
"enable_source": true
}
},
{
"spacer": {
"size": 8,
"expand": false
}
},
{
"session": {
"icon_size": 18,
"icon_symbolic": true,
"overlay_icon_size": 64,
"overlay_icon_symbolic": true,
"command_logout": "uwsm stop",
"command_reboot": "systemctl reboot",
"command_suspend": "systemctl suspend",
"command_shutdown": "systemctl poweroff"
}
},
{
"spacer": {
"size": 8,
"expand": false
}
}
]
}
],
"launch_wrapper": [
"uwsm",
"app",
"--"
]
}
-127
View File
@@ -1,127 +0,0 @@
/* Catppuccin Mocha Palette */
@define-color base #1e1e2e;
@define-color mantle #181825;
@define-color crust #11111b;
@define-color surface0 #313244;
@define-color surface1 #45475a;
@define-color surface2 #585b70;
@define-color text #cdd6f4;
@define-color subtext0 #a6adc8;
@define-color subtext1 #bac2de;
@define-color overlay0 #6c7086;
@define-color overlay1 #7f849c;
@define-color overlay2 #9399b2;
@define-color blue #89b4fa;
@define-color lavender #b4befe;
@define-color sapphire #74c7ec;
@define-color sky #89dceb;
@define-color teal #94e2d5;
@define-color green #a6e3a1;
@define-color yellow #f9e2af;
@define-color peach #fab387;
@define-color maroon #eba0ac;
@define-color red #f38ba8;
@define-color mauve #cba6f7;
@define-color flamingo #f2cdcd;
@define-color rosewater #f5e0dc;
* {
font-family: "JetBrainsMono Nerd Font";
font-size: 13px;
border: none;
box-shadow: none;
}
window#panel0 {
background-color: alpha(@base, 0.7);
color: @text;
}
#pager {
margin: 4px;
}
#pager button {
background-color: @surface0;
color: @subtext0;
border-radius: 12px;
margin: 0 2px;
padding: 0 12px;
transition: all 0.2s ease-in-out;
}
#pager button.active {
background-color: @mauve;
color: @base;
}
#pager button:hover {
background-color: @surface1;
color: @text;
}
#taskbar button {
background-color: transparent;
color: @subtext1;
border-radius: 12px;
margin: 0 2px;
padding: 0 8px;
}
#taskbar button.active {
background-color: @surface0;
border-bottom: 2px solid @mauve;
}
#clock, #systray, #audio, #session, #notifications {
background-color: @surface0;
color: @text;
border-radius: 15px;
margin: 4px 3px;
padding: 0 12px;
}
#notifications {
color: @yellow;
}
#clock {
color: @mauve;
font-weight: bold;
}
#audio {
color: @sapphire;
}
#audio.muted {
color: @subtext0;
}
#session {
color: @red;
padding: 0 8px;
}
/* Notifications and HUD */
#notifications {
background-color: @base;
color: @text;
border: 1px solid @surface1;
border-radius: 12px;
}
#hud {
background-color: alpha(@base, 0.8);
color: @text;
border-radius: 20px;
padding: 10px;
}
#hud .progress-bar {
background-color: @surface1;
}
#hud .progress-bar-fill {
background-color: @mauve;
}
+14 -21
View File
@@ -1,42 +1,35 @@
[Default Applications] [Default Applications]
application/pdf=org.pwmt.zathura-pdf-poppler.desktop text/html=zen.desktop
image/jpeg=feh.desktop x-scheme-handler/http=zen.desktop
x-scheme-handler/https=zen.desktop
x-scheme-handler/about=brave-browser.desktop
x-scheme-handler/unknown=brave-browser.desktop
image/png=feh.desktop image/png=feh.desktop
x-scheme-handler/http=brave-browser.desktop x-scheme-handler/discord=vesktop.desktop
x-scheme-handler/https=brave-browser.desktop image/jpeg=feh.desktop
audio/flac=mpv.desktop
x-scheme-handler/ror2mm=r2modman.desktop
image/webp=feh.desktop
x-scheme-handler/chrome=zen.desktop x-scheme-handler/chrome=zen.desktop
text/html=brave-browser.desktop
application/x-extension-htm=zen.desktop application/x-extension-htm=zen.desktop
application/x-extension-html=zen.desktop application/x-extension-html=zen.desktop
application/x-extension-shtml=zen.desktop application/x-extension-shtml=zen.desktop
application/xhtml+xml=zen.desktop application/xhtml+xml=zen.desktop
application/x-extension-xhtml=zen.desktop application/x-extension-xhtml=zen.desktop
application/x-extension-xht=zen.desktop application/x-extension-xht=zen.desktop
x-scheme-handler/about=brave-browser.desktop
x-scheme-handler/unknown=brave-browser.desktop
application/vnd.openxmlformats-officedocument.wordprocessingml.document=libreoffice-writer.desktop
x-scheme-handler/ror2mm=r2modman.desktop
image/webp=feh.desktop
x-scheme-handler/claude-cli=claude-code-url-handler.desktop
x-scheme-handler/msteams=teams-for-linux.desktop
x-scheme-handler/slack=slack.desktop
audio/flac=mpv.desktop
x-scheme-handler/codex=ChatGPT.desktop
[Added Associations] [Added Associations]
application/pdf=org.pwmt.zathura-pdf-poppler.desktop;
image/jpeg=feh.desktop;
image/png=feh.desktop; image/png=feh.desktop;
image/jpeg=feh.desktop;
audio/flac=mpv.desktop;
image/webp=feh.desktop;
x-scheme-handler/http=zen.desktop; x-scheme-handler/http=zen.desktop;
x-scheme-handler/https=zen.desktop; x-scheme-handler/https=zen.desktop;
text/html=zen.desktop;
x-scheme-handler/chrome=zen.desktop; x-scheme-handler/chrome=zen.desktop;
application/vnd.openxmlformats-officedocument.wordprocessingml.document=libreoffice-writer.desktop; text/html=zen.desktop;
image/webp=feh.desktop;
application/x-extension-htm=zen.desktop; application/x-extension-htm=zen.desktop;
application/x-extension-html=zen.desktop; application/x-extension-html=zen.desktop;
application/x-extension-shtml=zen.desktop; application/x-extension-shtml=zen.desktop;
application/xhtml+xml=zen.desktop; application/xhtml+xml=zen.desktop;
application/x-extension-xhtml=zen.desktop; application/x-extension-xhtml=zen.desktop;
application/x-extension-xht=zen.desktop; application/x-extension-xht=zen.desktop;
audio/flac=mpv.desktop;
Submodule nvim deleted from 8d657d0f8d
+334
View File
@@ -0,0 +1,334 @@
vim.o.number = true
vim.o.wrap = false
vim.o.tabstop = 4
vim.o.shiftwidth = 4
vim.o.smartcase = true
vim.o.ignorecase = true
vim.o.hlsearch = false
vim.o.signcolumn = 'yes'
vim.o.clipboard = 'unnamedplus'
vim.o.undofile = true
vim.o.undodir = '/home/narl/.cache/nvim-undodir'
vim.g.mapleader = ','
-- Set up 'mini.deps' (customize to your liking)
require('mini.deps').setup()
local add = MiniDeps.add
add({
source = 'williamboman/mason.nvim'
})
add({
source = 'stevearc/conform.nvim'
})
add({
source = 'williamboman/mason-lspconfig.nvim'
})
add({
source = 'mfussenegger/nvim-lint'
})
add({
source = 'akinsho/toggleterm.nvim'
})
-- Add to current session (install if absent)
add({
source = 'neovim/nvim-lspconfig',
-- Supply dependencies near target plugin
depends = { 'williamboman/mason.nvim' },
})
add({
source = 'seblyng/roslyn.nvim',
})
add({
source = 'tris203/rzls.nvim',
})
add({
source = 'nvim-treesitter/nvim-treesitter',
-- Use 'master' while monitoring updates in 'main'
checkout = 'master',
monitor = 'main',
-- Perform action after every checkout
hooks = { post_checkout = function() vim.cmd('TSUpdate') end },
})
add({
-- Completion framework:
source = 'hrsh7th/nvim-cmp',
-- LSP completion source:
depends = {'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-nvim-lua',
'hrsh7th/cmp-nvim-lsp-signature-help',
'hrsh7th/cmp-vsnip',
'hrsh7th/cmp-path',
'hrsh7th/cmp-buffer',
'hrsh7th/vim-vsnip',
},
})
add({ source = "catppuccin/nvim", name = "catppuccin" })
require('mini.files').setup({
mappings = {
show_help = 'gh',
},
})
require('mini.icons').setup({style = 'ascii'})
require('mini.pick').setup({})
require('mini.snippets').setup({})
require('mini.notify').setup({})
require('mini.statusline').setup({})
require('mini.tabline').setup({})
require('mini.git').setup({})
local imap_expr = function(lhs, rhs)
vim.keymap.set('i', lhs, rhs, { expr = true })
end
imap_expr('<Tab>', [[pumvisible() ? "\<C-n>" : "\<Tab>"]])
imap_expr('<S-Tab>', [[pumvisible() ? "\<C-p>" : "\<S-Tab>"]])
_G.cr_action = function()
-- If there is selected item in popup, accept it with <C-y>
if vim.fn.complete_info()['selected'] ~= -1 then return '\25' end
-- Fall back to plain `<CR>`. You might want to customize this
-- according to other plugins. For example if 'mini.pairs' is set up, replace
-- next line with `return MiniPairs.cr()`
return '\r'
end
vim.keymap.set('i', '<CR>', 'v:lua.cr_action()', { expr = true })
require("toggleterm").setup{
size = function(term)
if term.direction == "horizontal" then
return 30
elseif term.direction == "vertical" then
return 69
end
end,
open_mapping = [[<c-\>]],
hide_numbers = true,
shade_terminals = true,
persist_size = true,
direction = 'float',
close_on_exit = true,
shell = vim.o.shell,
}
require('nvim-treesitter.configs').setup {
ensure_installed = { "lua", "rust", "toml", "c_sharp" },
auto_install = true,
highlight = {
enable = true,
additional_vim_regex_highlighting=false,
},
ident = { enable = true },
rainbow = {
enable = true,
extended_mode = true,
max_file_lines = nil,
}
}
require("mason").setup({
registries = {
"github:mason-org/mason-registry",
"github:Crashdummyy/mason-registry",
},
ui = {
icons = {
package_installed = "",
package_pending = "",
package_uninstalled = ""
}
}
})
require("mason-lspconfig").setup()
vim.lsp.config('rust_analyzer', {
-- Server-specific settings. See `:help lsp-quickstart`
settings = {
['rust-analyzer'] = {},
},
})
require('roslyn').setup({
config = {
-- the rest of your Roslyn configuration
handlers = require("rzls.roslyn_handlers"),
},
})
require("catppuccin").setup({
flavour = "auto", -- latte, frappe, macchiato, mocha
background = { -- :h background
light = "latte",
dark = "mocha",
},
transparent_background = false, -- disables setting the background color.
show_end_of_buffer = false, -- shows the '~' characters after the end of buffers
term_colors = false, -- sets terminal colors (e.g. `g:terminal_color_0`)
dim_inactive = {
enabled = false, -- dims the background color of inactive window
shade = "dark",
percentage = 0.15, -- percentage of the shade to apply to the inactive window
},
no_italic = false, -- Force no italic
no_bold = false, -- Force no bold
no_underline = false, -- Force no underline
styles = { -- Handles the styles of general hi groups (see `:h highlight-args`):
comments = { "italic" }, -- Change the style of comments
conditionals = { "italic" },
loops = {},
functions = {},
keywords = {},
strings = {},
variables = {},
numbers = {},
booleans = {},
properties = {},
types = {},
operators = {},
-- miscs = {}, -- Uncomment to turn off hard-coded styles
},
color_overrides = {},
custom_highlights = {},
default_integrations = true,
integrations = {
cmp = true,
gitsigns = true,
nvimtree = true,
treesitter = true,
notify = false,
mini = {
enabled = true,
indentscope_color = "",
},
-- For more plugins integrations please scroll down (https://github.com/catppuccin/nvim#integrations)
},
})
local sign = function(opts)
vim.fn.sign_define(opts.name, {
texthl = opts.name,
text = opts.text,
numhl = ''
})
end
sign({name = 'DiagnosticSignError', text = ''})
sign({name = 'DiagnosticSignWarn', text = ''})
sign({name = 'DiagnosticSignHint', text = ''})
sign({name = 'DiagnosticSignInfo', text = ''})
--Set completeopt to have a better completion experience
-- :help completeopt
-- menuone: popup even when there's only one match
-- noinsert: Do not insert text until a selection is made
-- noselect: Do not select, force to select one from the menu
-- shortness: avoid showing extra messages when using completion
-- updatetime: set updatetime for CursorHold
vim.opt.completeopt = {'menuone', 'noselect', 'noinsert'}
vim.opt.shortmess = vim.opt.shortmess + { c = true}
vim.api.nvim_set_option('updatetime', 300)
-- Fixed column for diagnostics to appear
-- Show autodiagnostic popup on cursor hover_range
-- Goto previous / next diagnostic warning / error
-- Show inlay_hints more frequently
vim.cmd([[
set signcolumn=yes
autocmd CursorHold * lua vim.diagnostic.open_float(nil, { focusable = false })
]])
vim.diagnostic.config({
virtual_text = false,
signs = true,
update_in_insert = true,
underline = true,
severity_sort = false,
float = {
border = 'rounded',
source = 'always',
header = '',
prefix = '',
},
})
-- setup must be called before loading
vim.cmd.colorscheme "catppuccin"
vim.keymap.set('n', '<leader>w', '<cmd>write<cr>', {desc = 'Save file'})
vim.keymap.set('n', '<leader>q', '<cmd>quitall<cr>', {desc = 'Exit vim'})
-- Simplified clipboard mappings
-- vim.keymap.set({'n', 'x', 'o'}, '<leader>y', '"+y', {desc = 'Copy to clipboard'})
-- vim.keymap.set({'n', 'x'}, '<leader>p', '"+p', {desc = 'Paste from clipboard'})
vim.keymap.set('n', '<leader>e', '<cmd>lua MiniFiles.open()<cr>', {desc = 'File explorer'})
vim.keymap.set('n', '<leader><space>', '<cmd>Pick buffers<cr>', {desc = 'Search open files'})
vim.keymap.set('n', '<leader>ff', '<cmd>Pick files<cr>', {desc = 'Search all files'})
vim.keymap.set('n', '<leader>fh', '<cmd>Pick help<cr>', {desc = 'Search help tags'})
vim.keymap.set('n', '<leader>h', '<cmd>wincmd h<cr>')
vim.keymap.set('n', '<leader>l', '<cmd>wincmd l<cr>')
vim.keymap.set('n', '<leader>j', '<cmd>wincmd j<cr>')
vim.keymap.set('n', '<leader>k', '<cmd>wincmd k<cr>')
-- Rust
local cmp = require'cmp'
cmp.setup({
-- Enable LSP snippets
snippet = {
expand = function(args)
vim.fn["vsnip#anonymous"](args.body)
end,
},
mapping = {
['<C-p>'] = cmp.mapping.select_prev_item(),
['<C-n>'] = cmp.mapping.select_next_item(),
-- Add tab support
['<S-Tab>'] = cmp.mapping.select_prev_item(),
['<Tab>'] = cmp.mapping.select_next_item(),
['<C-S-f>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.close(),
['<CR>'] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Insert,
select = true,
})
},
-- Installed sources:
sources = {
{ name = 'path' }, -- file paths
{ name = 'nvim_lsp', keyword_length = 3 }, -- from language server
{ name = 'nvim_lsp_signature_help'}, -- display function signatures with current parameter emphasized
{ name = 'nvim_lua', keyword_length = 2}, -- complete neovim's Lua runtime API such vim.lsp.*
{ name = 'buffer', keyword_length = 2 }, -- source current buffer
{ name = 'vsnip', keyword_length = 2 }, -- nvim-cmp source for vim-vsnip
{ name = 'calc'}, -- source for math calculation
},
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
formatting = {
fields = {'menu', 'abbr', 'kind'},
format = function(entry, item)
local menu_icon ={
nvim_lsp = 'λ',
vsnip = '',
buffer = 'Ω',
path = '🖫',
}
item.menu = menu_icon[entry.source.name]
return item
end,
},
})
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
rm -rf ~/.config/nvim
cp -r nvim ~/.config/
git clone https://github.com/neovim/nvim-lspconfig ~/.config/nvim/pack/vendor/start/nvim-lspconfig
git clone https://github.com/echasnovski/mini.nvim ~/.config/nvim/pack/vendor/start/mini.nvim
-1799
View File
File diff suppressed because it is too large Load Diff
-118
View File
@@ -1,118 +0,0 @@
# Takemi
A Persona 5 flavoured Quickshell desktop for Hyprland. Cold teal and near-black
pulled from `~/.wallpapers/takemi_2.jpg`, with crimson as the accent voice.
Everything leans, corners are chopped rather than rounded, and headings carry
the wallpaper's RGB split.
Replaces Waybar, dunst and hyprlock.
## Running
```sh
qs # starts the shell (Hyprland does this via autostart.conf)
qs -p lockpreview.qml # the lock screen in an ordinary window, for styling
```
Hyprland starts it from `~/.config/hypr/modules/autostart.conf`.
## Layout
```
shell.qml entrypoint — one bar, power menu, toasts and OSD per screen
config/ palette, type scale, geometry, motion curves
components/ the P5 primitives: panels, gauges, sliders, split-ink text
services/ data sources, all singletons
bar/ the bar and its modules
popouts/ hover panels hanging off bar modules
overlays/ power menu, notification toasts, volume/brightness OSD
lock/ session lock
assets/ halftone and stripe tiles, generated with ImageMagick
```
`P5Panel` is the base surface everything sits on. It does not auto-size —
callers set implicit sizes from their own layout (`row.implicitWidth +
contentPad * 2`), which keeps the shape maths out of binding loops.
## Bar
| Module | Left click | Right click | Middle | Scroll | Hover |
|---|---|---|---|---|---|
| Sigil | app menu | reload shell | | | |
| Workspaces | switch | | | | |
| CPU/MEM/GPU | btop | | | | resource dashboard |
| Media | play/pause | next | raise player | next/prev | full player |
| Clock | pin calendar | | | | calendar |
| Tray | activate | app menu | secondary | | |
| Network | pin panel | toggle Wi-Fi | nm-connection-editor | | networks |
| Bluetooth | pin panel | toggle adapter | | | devices |
| Volume | mute | pin panel | pavucontrol | volume | audio mixer |
| Mic | mute | pin panel | | mic volume | audio mixer |
| Brightness | | | | brightness | |
| Battery | pin panel | | | | power detail |
| Bell | history + mark read | do not disturb | | | history |
| Power | power menu | | | | |
Popouts open on a short dwell and stay while the pointer is over the trigger or
the panel. Clicking pins one open.
## Keybinds
Set in `~/.config/hypr/modules/keybinds.conf`:
- `Super+Ctrl+L` — lock
- `Super+P` — power menu
- `Super+Shift+N` — toggle do not disturb
- `Super+Ctrl+Shift+N` — clear notifications
- `Super+Shift+R` — reload the shell
All of these go through Quickshell's IPC, so they work from any script:
```sh
qs ipc call shell lock
qs ipc call shell power
qs ipc call shell toggleDnd
qs ipc call shell clearNotifications
qs ipc call shell reloadConfig
```
## Data sources
Hardware telemetry comes from `fluxo`, whose hardware modules are configured to
emit raw pipe-delimited values rather than display strings — `services/Sys.qml`
parses them and does its own formatting. The previous human-readable Waybar
formats are preserved in `~/.config/fluxo/config.toml.waybar-bak`.
Everything else is native: PipeWire for audio, BlueZ for bluetooth,
NetworkManager for Wi-Fi, UPower for battery, MPRIS for media, and Quickshell's
own notification server. These are event-driven, so the bar and OSD react the
instant a volume key is pressed instead of on the next poll.
## Lock screen
Authenticates through `/etc/pam.d/hyprlock`, which on this box is just
`auth include login`. The visuals live in `lock/LockFace.qml` so they can be
styled in an ordinary window (`qs -p lockpreview.qml`) without locking the
session.
If the shell ever dies while the session is locked, the compositor keeps the
session secured by protocol and there is no unlocker left to talk to — recovery
means restarting Hyprland from a TTY.
## What was retired
- `waybar.service` — disabled. Its config is still in `~/.config/waybar`.
- `dunst.service` — masked, so it cannot be D-Bus activated and steal
`org.freedesktop.Notifications`. Undo with
`systemctl --user unmask dunst.service`.
- `hyprlock` — no longer bound. `hyprlock.conf` is untouched.
## Optional
`power-profiles-daemon` is not installed (TLP is), so the power-profile
switching in `services/Battery.qml` stays dormant. Nothing else depends on it.
The display face is Adwaita Sans Black Italic, which is what was already on the
box. A heavy condensed grotesque — Anton, Archivo Black, Oswald — would land
closer to the real Persona 5 type. Change `Theme.fontDisplay` and everything
follows.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

-75
View File
@@ -1,75 +0,0 @@
import QtQuick
import Quickshell
import Quickshell.Hyprland
import "root:/config"
import "root:/components"
// Focused window title, glitching on every change the way a Persona 5 caption
// snaps into place.
Item {
id: root
required property var screenRef
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(screenRef)
readonly property HyprlandToplevel toplevel: Hyprland.activeToplevel
// Only speak for the monitor this bar lives on.
readonly property bool mine: toplevel !== null
&& (root.monitor === null || toplevel.monitor === null
|| toplevel.monitor.id === root.monitor.id)
readonly property string title: mine && toplevel.title ? toplevel.title : "—"
// The bar shrinks this when the three clusters would otherwise collide.
property real maxWidth: 240
implicitWidth: Math.min(maxWidth, Math.max(70, label.implicitWidth + 4))
implicitHeight: 20
Behavior on implicitWidth {
NumberAnimation { duration: Theme.durSlow; easing.type: Easing.OutExpo }
}
Marquee {
id: label
anchors.fill: parent
text: root.title
color: root.mine ? Theme.subtext : Theme.muted
pixelSize: Theme.fsSmall
family: Theme.fontDisplay
italic: true
weight: Font.DemiBold
}
onTitleChanged: flash.restart()
// A quick crimson wipe under the title on focus change.
Rectangle {
id: wipe
anchors.bottom: parent.bottom
height: 2
width: 0
color: Theme.accent
opacity: 0
}
SequentialAnimation {
id: flash
ParallelAnimation {
NumberAnimation {
target: wipe; property: "width"
from: 0; to: root.width
duration: Theme.durBase; easing.type: Easing.OutExpo
}
NumberAnimation {
target: wipe; property: "opacity"
from: 0; to: 1; duration: Theme.durFast
}
}
NumberAnimation {
target: wipe; property: "opacity"
to: 0; duration: Theme.durSlow
}
}
}
-159
View File
@@ -1,159 +0,0 @@
import QtQuick
import Quickshell
import Quickshell.Wayland
import "root:/config"
import "root:/components"
import "root:/services"
// One bar per monitor.
//
// Layout is three clusters: identity and system state on the left, the clock
// and player dead centre, controls on the right. The centre is genuinely
// centred, so the left cluster's window title is capped at whatever space is
// actually left over — otherwise the clusters overlap on a 1080p panel.
PanelWindow {
id: root
required property var modelData
screen: modelData
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.namespace: "takemi-bar"
anchors {
top: true
left: true
right: true
}
margins {
top: Theme.barMargin
left: Theme.barMargin
right: Theme.barMargin
}
implicitHeight: Theme.barHeight
exclusiveZone: Theme.barHeight + Theme.barMargin
color: "transparent"
// Half the space not taken by the centre cluster, minus breathing room.
readonly property real sideBudget:
(width - centreCluster.width) / 2 - Theme.barGap * 2
// ------------------------------------------------------------------ left
Row {
id: leftCluster
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.barGap
Sigil {
id: sigil
screenRef: root.modelData
}
BarPill {
id: spacesPill
accent: Theme.primary
padding: Theme.padS
interactive: false
implicitWidth: spacesRow.implicitWidth + contentPad * 2
Row {
id: spacesRow
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
spacing: Theme.padM
Workspaces {
id: spaces
anchors.verticalCenter: parent.verticalCenter
screenRef: root.modelData
}
Rectangle {
anchors.verticalCenter: parent.verticalCenter
width: 1
height: 18
color: Theme.alpha(Theme.outline, 0.8)
}
ActiveWindow {
anchors.verticalCenter: parent.verticalCenter
screenRef: root.modelData
// Everything else on this side is fixed width, so the title
// gets whatever remains.
maxWidth: Math.max(70, root.sideBudget
- sigil.implicitWidth
- resources.implicitWidth
- spaces.implicitWidth
- Theme.barGap * 2
- Theme.padM * 3
- spacesPill.leanInset)
}
}
}
Resources {
id: resources
screenRef: root.modelData
}
}
// ---------------------------------------------------------------- centre
Row {
id: centreCluster
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.barGap
MediaPill {
screenRef: root.modelData
}
Clock {
screenRef: root.modelData
}
}
// ----------------------------------------------------------------- right
Row {
id: rightCluster
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.barGap
Tray {
screenRef: root.modelData
}
Status {
screenRef: root.modelData
}
NotifButton {
screenRef: root.modelData
}
PowerButton {
screenRef: root.modelData
}
}
// A hairline of crimson under the whole bar — the Persona 5 underscore.
Rectangle {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
height: 1
gradient: Gradient {
orientation: Gradient.Horizontal
GradientStop { position: 0.0; color: "transparent" }
GradientStop { position: 0.18; color: Theme.alpha(Theme.accent, 0.55) }
GradientStop { position: 0.5; color: Theme.alpha(Theme.primary, 0.35) }
GradientStop { position: 0.82; color: Theme.alpha(Theme.accent, 0.55) }
GradientStop { position: 1.0; color: "transparent" }
}
}
}
-107
View File
@@ -1,107 +0,0 @@
import QtQuick
import "root:/config"
import "root:/components"
// Shared chrome for every bar module: a leaning slab that lifts and lights up
// under the pointer, and forwards clicks and scrolls to the widget.
Item {
id: root
property color accent: Theme.primary
property bool active: false
property bool slash: false
property real lean: Theme.skew
property real padding: Theme.padM
property bool interactive: true
property bool halftone: false
readonly property bool hovered: hover.hovered
readonly property real leanInset: panel.leanInset
// Total horizontal inset a pill must add on top of its content width.
readonly property real contentPad: panel.contentPad
readonly property alias panelItem: panel
default property alias content: holder.data
signal clicked()
signal rightClicked()
signal middleClicked()
signal scrolled(real delta)
implicitHeight: Theme.barHeight
P5Panel {
id: panel
anchors.fill: parent
lean: root.lean
padding: root.padding
halftone: root.halftone
halftoneColor: root.accent
sheen: true
fill: root.active ? Theme.surfaceAlt : Theme.surface
fillOpacity: root.hovered ? 0.98 : 0.88
border: root.hovered || root.active
? Theme.alpha(root.accent, 0.9)
: Theme.alpha(Theme.outline, 0.7)
borderWidth: root.hovered || root.active ? Theme.stroke : 1
slash: root.slash || root.active
slashColor: root.accent
Behavior on fillOpacity {
NumberAnimation { duration: Theme.durFast }
}
Behavior on border {
ColorAnimation { duration: Theme.durBase }
}
Item {
id: holder
anchors.fill: parent
}
}
// Lift toward the pointer. Subtle, but it makes the bar feel alive.
transform: Translate {
y: root.hovered && root.interactive ? -2 : 0
Behavior on y {
NumberAnimation {
duration: Theme.durBase
easing.type: Easing.OutBack
}
}
}
HoverHandler {
id: hover
enabled: root.interactive
cursorShape: Qt.PointingHandCursor
}
TapHandler {
enabled: root.interactive
acceptedButtons: Qt.LeftButton
onTapped: root.clicked()
}
TapHandler {
enabled: root.interactive
acceptedButtons: Qt.RightButton
onTapped: root.rightClicked()
}
TapHandler {
enabled: root.interactive
acceptedButtons: Qt.MiddleButton
onTapped: root.middleClicked()
}
WheelHandler {
enabled: root.interactive
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
onWheel: event => root.scrolled(event.angleDelta.y)
}
}
-101
View File
@@ -1,101 +0,0 @@
import QtQuick
import Quickshell
import "root:/config"
import "root:/components"
import "root:/popouts"
// Centre-stage clock. Hovering drops the calendar.
BarPill {
id: root
required property var screenRef
accent: Theme.accent
slash: true
padding: Theme.padS
implicitWidth: layout.implicitWidth + contentPad * 2
SystemClock {
id: clock
precision: SystemClock.Seconds
}
onClicked: calendar.pinned = !calendar.pinned
Row {
id: layout
anchors.centerIn: parent
spacing: Theme.padM
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: -1
Text {
text: Qt.formatDateTime(clock.date, "ddd").toUpperCase()
color: Theme.accent
font.family: Theme.fontMono
font.pixelSize: Theme.fsMicro
font.letterSpacing: 2.5
renderType: Text.NativeRendering
}
Text {
text: Qt.formatDateTime(clock.date, "dd MMM").toUpperCase()
color: Theme.subtext
font.family: Theme.fontMono
font.pixelSize: Theme.fsMicro
font.letterSpacing: 1
renderType: Text.NativeRendering
}
}
Rectangle {
anchors.verticalCenter: parent.verticalCenter
width: 2
height: 22
color: Theme.alpha(Theme.accent, 0.6)
transform: Matrix4x4 {
matrix: Qt.matrix4x4(1, -Theme.skew, 0, 22 * Theme.skew,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
}
}
SplitText {
id: timeText
anchors.verticalCenter: parent.verticalCenter
text: Qt.formatDateTime(clock.date, "HH:mm")
pixelSize: Theme.fsTitle
split: 1.4
}
// Seconds, kept quiet so they read as a ticking detail rather than noise.
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: 4
text: Qt.formatDateTime(clock.date, "ss")
color: Theme.alpha(Theme.primary, 0.8)
font.family: Theme.fontMono
font.pixelSize: Theme.fsMicro
renderType: Text.NativeRendering
}
}
// Glitch the time on the hour, because it should feel like something happened.
property int lastHour: -1
Connections {
target: clock
function onDateChanged() {
const h = clock.date.getHours();
if (root.lastHour !== -1 && h !== root.lastHour) timeText.glitch();
root.lastHour = h;
}
}
CalendarPopout {
id: calendar
anchorItem: root
triggerHovered: root.hovered
clockDate: clock.date
}
}
-185
View File
@@ -1,185 +0,0 @@
import QtQuick
import QtQuick.Shapes
import Quickshell
import "root:/config"
import "root:/components"
import "root:/services"
import "root:/popouts"
// Now-playing module. Collapses to nothing when no player is around.
BarPill {
id: root
required property var screenRef
accent: Theme.primary
padding: Theme.padS
visible: Media.hasPlayer || width > 1
implicitWidth: Media.hasPlayer
? layout.implicitWidth + contentPad * 2
: 0
Behavior on implicitWidth {
NumberAnimation { duration: Theme.durSlow; easing.type: Easing.OutExpo }
}
clip: true
onClicked: Media.playPause()
onRightClicked: Media.next()
onMiddleClicked: Media.raise()
onScrolled: delta => delta > 0 ? Media.next() : Media.previous()
Row {
id: layout
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
spacing: Theme.padS
// Album art, chopped into the house shape.
Item {
id: artFrame
anchors.verticalCenter: parent.verticalCenter
width: 24
height: 24
Shape {
id: artMask
anchors.fill: parent
visible: false
layer.enabled: true
preferredRendererType: Shape.CurveRenderer
ShapePath {
fillColor: "white"
strokeColor: "transparent"
PathPolyline {
path: Geom.chamfer(Geom.parallelogram(24, 24, 0.18), 5, [1, 3])
}
}
}
Image {
id: art
anchors.fill: parent
source: Media.artUrl
fillMode: Image.PreserveAspectCrop
cache: true
asynchronous: true
visible: status === Image.Ready
layer.enabled: true
layer.effect: MaskedArt { maskItem: artMask }
}
// Fallback: the source app's glyph.
Icon {
anchors.centerIn: parent
visible: art.status !== Image.Ready
text: Media.sourceIcon
font.pixelSize: Theme.fsLarge
color: Theme.primary
pulsing: Media.playing
pulseScale: 1.12
}
}
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: 0
Marquee {
width: 130
height: 14
text: Media.title || Media.identity
color: Theme.text
pixelSize: Theme.fsSmall
family: Theme.fontDisplay
weight: Font.DemiBold
italic: true
}
Marquee {
width: 130
height: 12
text: Media.artist || Media.album || Media.identity
color: Theme.muted
pixelSize: Theme.fsMicro
family: Theme.fontMono
}
}
// Play state, as a two-bar equaliser that freezes when paused.
Row {
anchors.verticalCenter: parent.verticalCenter
spacing: 2
Repeater {
model: 3
Rectangle {
required property int index
width: 3
height: 6
anchors.verticalCenter: parent.verticalCenter
color: Media.playing ? Theme.primary : Theme.muted
SequentialAnimation on height {
running: Media.playing
loops: Animation.Infinite
NumberAnimation {
to: 4 + (index * 5) % 13
duration: 320 + index * 90
easing.type: Easing.InOutSine
}
NumberAnimation {
to: 14 - (index * 4) % 9
duration: 280 + index * 70
easing.type: Easing.InOutSine
}
}
Behavior on color {
ColorAnimation { duration: Theme.durBase }
}
}
}
}
}
// Track progress, hairline along the bottom of the pill.
Rectangle {
anchors.bottom: parent.bottom
anchors.bottomMargin: 3
anchors.left: parent.left
anchors.leftMargin: root.leanInset
width: Math.max(0, (root.width - root.leanInset * 2) * Media.progress)
height: 2
color: Theme.accent
visible: Media.canSeek
Behavior on width {
NumberAnimation { duration: 480; easing.type: Easing.OutQuad }
}
}
onVisibleChanged: if (visible) titleGlitch.restart()
Connections {
target: Media
function onTrackChanged() { titleGlitch.restart(); }
}
SequentialAnimation {
id: titleGlitch
NumberAnimation {
target: artFrame; property: "rotation"
from: -8; to: 0; duration: Theme.durSlow; easing.type: Easing.OutBack
}
}
MediaPopout {
id: popout
anchorItem: root
triggerHovered: root.hovered && Media.hasPlayer
}
}
-75
View File
@@ -1,75 +0,0 @@
import QtQuick
import Quickshell
import "root:/config"
import "root:/components"
import "root:/services"
import "root:/popouts"
// Notification bell with an unread badge. Click opens the history, right click
// toggles do-not-disturb.
BarPill {
id: root
required property var screenRef
accent: Notifs.dnd ? Theme.muted : Theme.primary
padding: Theme.padS
implicitWidth: Theme.barHeight - 4 + contentPad
onClicked: {
popout.pinned = !popout.pinned;
Notifs.markRead();
}
onRightClicked: Notifs.toggleDnd()
Icon {
id: bell
anchors.centerIn: parent
text: Notifs.icon
font.pixelSize: Theme.fsLarge
color: {
if (Notifs.dnd) return Theme.muted;
if (Notifs.hasUnread) return Theme.accent;
return root.hovered ? Theme.glow : Theme.primary;
}
}
// Unread badge, chopped like everything else.
Rectangle {
visible: Notifs.unread > 0 && !Notifs.dnd
anchors.right: parent.right
anchors.rightMargin: 2
anchors.top: parent.top
anchors.topMargin: 4
width: Math.max(12, badge.implicitWidth + 5)
height: 12
color: Theme.accent
Text {
id: badge
anchors.centerIn: parent
text: Notifs.unread > 9 ? "9+" : Notifs.unread
color: Theme.text
font.family: Theme.fontMono
font.pixelSize: 8
font.weight: Font.Bold
renderType: Text.NativeRendering
}
transform: Matrix4x4 {
matrix: Qt.matrix4x4(1, -Theme.skew, 0, 12 * Theme.skew,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
}
}
Connections {
target: Notifs
function onPopupRequested() { bell.bump(); }
}
NotifPopout {
id: popout
anchorItem: root
triggerHovered: root.hovered
}
}
-42
View File
@@ -1,42 +0,0 @@
import QtQuick
import Quickshell
import "root:/config"
import "root:/components"
import "root:/services"
// Far right. Opens the full-screen power menu.
BarPill {
id: root
required property var screenRef
accent: Theme.accent
slash: true
padding: Theme.padS
active: Actions.powerMenuOpen
implicitWidth: Theme.barHeight - 4 + contentPad
onClicked: Actions.togglePowerMenu()
Icon {
id: glyph
anchors.centerIn: parent
text: "󰐥"
font.pixelSize: Theme.fsLarge
color: root.hovered || Actions.powerMenuOpen ? Theme.accent : Theme.subtext
}
// A crimson halo that swells under the pointer.
Rectangle {
anchors.centerIn: glyph
z: -1
width: root.hovered ? 26 : 0
height: width
radius: width / 2
color: Theme.alpha(Theme.accent, 0.18)
Behavior on width {
NumberAnimation { duration: Theme.durBase; easing.type: Easing.OutBack }
}
}
}
-114
View File
@@ -1,114 +0,0 @@
import QtQuick
import Quickshell
import "root:/config"
import "root:/components"
import "root:/services"
import "root:/popouts"
// Compact CPU / MEM / GPU readout. Each metric is a number over a segmented
// meter; hovering opens the full gauge cluster.
BarPill {
id: root
required property var screenRef
accent: Theme.heat(Math.max(Sys.cpuUsage, Sys.memPercent))
padding: Theme.padS
implicitWidth: layout.implicitWidth + contentPad * 2
onClicked: Actions.openSystemMonitor()
Row {
id: layout
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
spacing: Theme.padM
Metric {
label: "CPU"
value: Sys.cpuUsage
readout: Math.round(Sys.cpuUsage) + "%"
}
Divider {}
Metric {
label: "MEM"
value: Sys.memPercent
readout: Sys.memUsed.toFixed(1) + "G"
}
Divider { visible: Sys.gpuAvailable }
Metric {
visible: Sys.gpuAvailable
label: "GPU"
value: Sys.gpuUsage
readout: Math.round(Sys.gpuUsage) + "%"
}
}
component Divider: Rectangle {
anchors.verticalCenter: parent.verticalCenter
width: 1
height: 18
color: Theme.alpha(Theme.outline, 0.8)
transform: Matrix4x4 {
matrix: Qt.matrix4x4(1, -Theme.skew, 0, 18 * Theme.skew,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
}
}
component Metric: Column {
id: metric
property string label: ""
property real value: 0
property string readout: ""
anchors.verticalCenter: parent.verticalCenter
spacing: 1
Row {
spacing: 4
Text {
anchors.verticalCenter: parent.verticalCenter
text: metric.label
color: Theme.muted
font.family: Theme.fontMono
font.pixelSize: Theme.fsMicro
font.letterSpacing: 1.5
renderType: Text.NativeRendering
}
Text {
anchors.verticalCenter: parent.verticalCenter
text: metric.readout
color: Theme.heat(metric.value)
font.family: Theme.fontMono
font.pixelSize: Theme.fsSmall
font.weight: Font.DemiBold
renderType: Text.NativeRendering
Behavior on color {
ColorAnimation { duration: Theme.durBase }
}
}
}
MeterBar {
value: metric.value
segments: 9
segmentWidth: 3
spacing: 2
height: 5
}
}
SysPopout {
id: popout
anchorItem: root
triggerHovered: root.hovered
}
}
-45
View File
@@ -1,45 +0,0 @@
import QtQuick
import Quickshell
import "root:/config"
import "root:/components"
import "root:/services"
// The house mark, far left. Click launches the app menu; right click reloads
// the shell, which is handy while tweaking the config.
BarPill {
id: root
required property var screenRef
accent: Theme.accent
slash: true
padding: Theme.padS
lean: Theme.skew
implicitWidth: Theme.barHeight + contentPad
onClicked: Actions.launch("fuzzel")
onRightClicked: Actions.reloadShell()
Icon {
id: mark
anchors.centerIn: parent
text: "󰋠"
font.pixelSize: Theme.fsTitle
color: root.hovered ? Theme.accent : Theme.primary
}
// Spin the mark on click, then settle.
Connections {
target: root
function onClicked() { spin.restart(); }
}
SequentialAnimation {
id: spin
NumberAnimation {
target: mark; property: "rotation"
from: 0; to: 360; duration: Theme.durSlow
easing.type: Easing.OutExpo
}
}
}
-115
View File
@@ -1,115 +0,0 @@
import QtQuick
import Quickshell
import "root:/config"
import "root:/components"
import "root:/services"
import "root:/popouts"
// Network, bluetooth, audio, mic, backlight and battery, in one slab. Each
// glyph carries its own popout.
BarPill {
id: root
required property var screenRef
accent: Theme.primary
padding: Theme.padS
interactive: false
implicitWidth: layout.implicitWidth + contentPad * 2
Row {
id: layout
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
spacing: Theme.padM
StatusIcon {
id: netIcon
icon: Net.icon
label: Sys.netUp ? Sys.rate(Sys.netRx + Sys.netTx) : ""
labelWidth: 62
tint: Theme.primary
dim: !Sys.netUp
onClicked: netPopout.pinned = !netPopout.pinned
onRightClicked: Net.toggleWifi()
onMiddleClicked: Actions.openNetworkSettings()
}
StatusIcon {
id: btIcon
icon: Bt.icon
tint: Bt.connected.length > 0 ? Theme.blue : Theme.primary
dim: !Bt.enabled
onClicked: btPopout.pinned = !btPopout.pinned
onRightClicked: Bt.toggle()
}
StatusIcon {
id: volIcon
icon: Audio.icon
label: Audio.muted ? "" : Audio.volumePercent + "%"
labelWidth: Audio.muted ? 0 : 34
alert: Audio.muted
onClicked: Audio.toggleMute()
onRightClicked: audioPopout.pinned = !audioPopout.pinned
onMiddleClicked: Actions.openAudioSettings()
onScrolled: delta => Audio.changeVolume(delta > 0 ? 0.05 : -0.05)
}
StatusIcon {
id: micIcon
icon: Audio.micIcon
alert: Audio.micMuted
onClicked: Audio.toggleMicMute()
onRightClicked: audioPopout.pinned = !audioPopout.pinned
onScrolled: delta => Audio.setMicVolume(Audio.micVolume + (delta > 0 ? 0.05 : -0.05))
}
StatusIcon {
id: brightIcon
visible: Brightness.available
icon: Brightness.icon
label: Math.round(Brightness.percent) + "%"
labelWidth: 34
tint: Theme.warn
onScrolled: delta => Brightness.change(delta > 0 ? 5 : -5)
}
StatusIcon {
id: battIcon
visible: Battery.available
icon: Battery.icon
label: Math.round(Battery.percent) + "%"
labelWidth: 34
tint: Battery.tint
alert: Battery.critical
pulsing: Battery.critical
onClicked: battPopout.pinned = !battPopout.pinned
}
}
NetPopout {
id: netPopout
anchorItem: netIcon
triggerHovered: netIcon.hovered
}
BtPopout {
id: btPopout
anchorItem: btIcon
triggerHovered: btIcon.hovered
}
AudioPopout {
id: audioPopout
anchorItem: volIcon
triggerHovered: volIcon.hovered || micIcon.hovered
}
BatteryPopout {
id: battPopout
anchorItem: battIcon
triggerHovered: battIcon.hovered
visible: Battery.available && shown
}
}
-108
View File
@@ -1,108 +0,0 @@
import QtQuick
import "root:/config"
import "root:/components"
// One indicator inside the status cluster: a glyph, an optional readout, and a
// crimson underline that wipes in on hover.
Item {
id: root
property string icon: ""
property string label: ""
property color tint: Theme.primary
property bool alert: false
property bool dim: false
property bool pulsing: false
// Fixed label width. Readouts that change width constantly (throughput,
// percentages) would otherwise shove the whole cluster around.
property real labelWidth: 0
readonly property bool hovered: hover.hovered
signal clicked()
signal rightClicked()
signal middleClicked()
signal scrolled(real delta)
implicitWidth: layout.implicitWidth
implicitHeight: Theme.barHeight - Theme.padS * 2
Row {
id: layout
anchors.centerIn: parent
spacing: 5
Icon {
id: glyph
anchors.verticalCenter: parent.verticalCenter
text: root.icon
pulsing: root.pulsing
color: {
if (root.alert) return Theme.accent;
if (root.dim) return Theme.muted;
if (root.hovered) return Theme.glow;
return root.tint;
}
}
Text {
anchors.verticalCenter: parent.verticalCenter
visible: root.label !== ""
text: root.label
width: root.labelWidth > 0 ? root.labelWidth : implicitWidth
horizontalAlignment: Text.AlignRight
elide: Text.ElideRight
color: root.dim ? Theme.muted : Theme.subtext
font.family: Theme.fontMono
font.pixelSize: Theme.fsSmall
font.weight: Font.DemiBold
renderType: Text.NativeRendering
Behavior on color {
ColorAnimation { duration: Theme.durBase }
}
}
}
Rectangle {
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
height: 2
width: root.hovered ? layout.implicitWidth : 0
color: root.alert ? Theme.accent : root.tint
Behavior on width {
NumberAnimation { duration: Theme.durBase; easing.type: Easing.OutExpo }
}
}
scale: root.hovered ? 1.06 : 1.0
Behavior on scale {
NumberAnimation { duration: Theme.durBase; easing.type: Easing.OutBack }
}
onAlertChanged: if (alert) glyph.bump()
HoverHandler {
id: hover
cursorShape: Qt.PointingHandCursor
}
TapHandler {
acceptedButtons: Qt.LeftButton
onTapped: root.clicked()
}
TapHandler {
acceptedButtons: Qt.RightButton
onTapped: root.rightClicked()
}
TapHandler {
acceptedButtons: Qt.MiddleButton
onTapped: root.middleClicked()
}
WheelHandler {
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
onWheel: event => root.scrolled(event.angleDelta.y)
}
}
-93
View File
@@ -1,93 +0,0 @@
import QtQuick
import Quickshell
import Quickshell.Services.SystemTray
import Quickshell.Widgets
import "root:/config"
import "root:/components"
// StatusNotifier tray. Left click activates, right click opens the app's own
// menu, middle click is the secondary action.
BarPill {
id: root
required property var screenRef
accent: Theme.blue
padding: Theme.padS
interactive: false
visible: SystemTray.items.values.length > 0
implicitWidth: visible ? layout.implicitWidth + contentPad * 2 : 0
Row {
id: layout
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
spacing: Theme.padM
Repeater {
model: SystemTray.items
Item {
id: entry
required property SystemTrayItem modelData
width: 18
height: 18
anchors.verticalCenter: parent.verticalCenter
IconImage {
id: img
anchors.fill: parent
source: entry.modelData.icon
asynchronous: true
opacity: itemHover.hovered ? 1.0 : 0.82
Behavior on opacity {
NumberAnimation { duration: Theme.durFast }
}
}
scale: itemHover.hovered ? 1.18 : 1.0
Behavior on scale {
NumberAnimation { duration: Theme.durBase; easing.type: Easing.OutBack }
}
HoverHandler {
id: itemHover
cursorShape: Qt.PointingHandCursor
}
TapHandler {
acceptedButtons: Qt.LeftButton
onTapped: {
if (entry.modelData.onlyMenu) {
menuAnchor.open();
} else {
entry.modelData.activate();
}
}
}
TapHandler {
acceptedButtons: Qt.RightButton
onTapped: menuAnchor.open()
}
TapHandler {
acceptedButtons: Qt.MiddleButton
onTapped: entry.modelData.secondaryActivate()
}
QsMenuAnchor {
id: menuAnchor
menu: entry.modelData.menu
anchor.item: entry
anchor.edges: Edges.Bottom
anchor.gravity: Edges.Bottom
anchor.margins.top: Theme.popoutGap
}
}
}
}
}
-138
View File
@@ -1,138 +0,0 @@
import QtQuick
import Quickshell
import Quickshell.Hyprland
import "root:/config"
import "root:/components"
// Workspace indicator: leaning ticks that stretch open when focused. Occupied
// workspaces glow teal, urgent ones snap to crimson.
Item {
id: root
required property var screenRef
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(screenRef)
readonly property int focusedId: monitor?.activeWorkspace?.id ?? -1
// Live workspaces on this monitor, keyed by id, ignoring special workspaces.
readonly property var occupancy: {
const map = {};
for (const w of (Hyprland.workspaces?.values ?? [])) {
if (w.id < 1) continue;
if (root.monitor && w.monitor && w.monitor.id !== root.monitor.id) continue;
map[w.id] = {
count: w.toplevels?.values?.length ?? 0,
urgent: w.urgent,
fullscreen: w.hasFullscreen
};
}
return map;
}
// Always show 1..5, plus anything beyond that which is actually in use.
readonly property var slots: {
const ids = [1, 2, 3, 4, 5];
for (const key in root.occupancy) {
const id = parseInt(key);
if (ids.indexOf(id) === -1) ids.push(id);
}
return ids.sort((a, b) => a - b);
}
implicitWidth: row.implicitWidth
implicitHeight: 20
Row {
id: row
anchors.verticalCenter: parent.verticalCenter
spacing: 6
Repeater {
model: root.slots
Item {
id: pip
required property var modelData
readonly property int wsId: modelData
readonly property var info: root.occupancy[wsId]
readonly property bool occupied: info !== undefined && info.count > 0
readonly property bool urgent: info !== undefined && info.urgent
readonly property bool focused: root.focusedId === wsId
readonly property bool hovered: pipHover.hovered
width: focused ? 34 : (occupied ? 16 : 10)
height: 18
Behavior on width {
NumberAnimation {
duration: Theme.durSlow
easing.type: Easing.OutBack
easing.overshoot: 1.6
}
}
Rectangle {
id: tick
anchors.fill: parent
color: {
if (pip.urgent) return Theme.accent;
if (pip.focused) return Theme.primary;
if (pip.hovered) return Theme.glow;
if (pip.occupied) return Theme.alpha(Theme.primary, 0.55);
return Theme.alpha(Theme.outline, 0.75);
}
transform: Matrix4x4 {
matrix: Qt.matrix4x4(
1, -Theme.skew, 0, pip.height * Theme.skew,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1)
}
Behavior on color {
ColorAnimation { duration: Theme.durBase }
}
}
// The focused workspace wears its number.
Text {
anchors.centerIn: parent
opacity: pip.focused ? 1 : 0
visible: opacity > 0.01
text: pip.wsId
color: Theme.base
font.family: Theme.fontDisplay
font.pixelSize: Theme.fsSmall
font.weight: Theme.weightDisplay
font.italic: true
renderType: Text.NativeRendering
Behavior on opacity {
NumberAnimation { duration: Theme.durBase }
}
}
// Fullscreen marker.
Rectangle {
visible: pip.info !== undefined && pip.info.fullscreen && !pip.focused
width: 4; height: 4
color: Theme.accent
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.bottom
anchors.topMargin: 1
}
HoverHandler {
id: pipHover
cursorShape: Qt.PointingHandCursor
}
TapHandler {
onTapped: Hyprland.dispatch("workspace " + pip.wsId)
}
}
}
}
}
-120
View File
@@ -1,120 +0,0 @@
import QtQuick
import QtQuick.Shapes
import "root:/config"
// Radial gauge used across the resource popout. Sweeps a 270° arc with a
// tick-marked rail behind it and the reading set in the middle.
Item {
id: root
property real value: 0 // 0..100
property string label: ""
property string readout: Math.round(value) + "%"
property string sub: ""
property color arcColor: Theme.heat(value)
property real thickness: 7
property real startAngle: 135
property real sweep: 270
property int ticks: 24
implicitWidth: 96
implicitHeight: 96
readonly property real _r: Math.min(width, height) / 2 - thickness / 2 - 4
readonly property real _cx: width / 2
readonly property real _cy: height / 2
// Rail
Shape {
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
ShapePath {
fillColor: "transparent"
strokeColor: Theme.alpha(Theme.outline, 0.5)
strokeWidth: root.thickness
capStyle: ShapePath.FlatCap
PathAngleArc {
centerX: root._cx; centerY: root._cy
radiusX: root._r; radiusY: root._r
startAngle: root.startAngle
sweepAngle: root.sweep
}
}
}
// Tick marks around the rail.
Repeater {
model: root.ticks
Rectangle {
required property int index
readonly property real a: (root.startAngle + root.sweep * (index / (root.ticks - 1))) * Math.PI / 180
readonly property real rr: root._r + root.thickness / 2 + 3
width: 2
height: index % 4 === 0 ? 6 : 3
color: Theme.alpha(Theme.primary, index % 4 === 0 ? 0.55 : 0.25)
x: root._cx + Math.cos(a) * rr - width / 2
y: root._cy + Math.sin(a) * rr - height / 2
rotation: (root.startAngle + root.sweep * (index / (root.ticks - 1))) + 90
}
}
// Value arc
Shape {
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
ShapePath {
fillColor: "transparent"
strokeColor: root.arcColor
strokeWidth: root.thickness
capStyle: ShapePath.FlatCap
PathAngleArc {
id: valueArc
centerX: root._cx; centerY: root._cy
radiusX: root._r; radiusY: root._r
startAngle: root.startAngle
sweepAngle: root.sweep * Math.max(0, Math.min(100, root.value)) / 100
Behavior on sweepAngle {
NumberAnimation {
duration: Theme.durSlow
easing.type: Easing.OutExpo
}
}
}
}
}
Column {
anchors.centerIn: parent
spacing: -2
SplitText {
anchors.horizontalCenter: parent.horizontalCenter
text: root.readout
pixelSize: Theme.fsLarge
color: Theme.text
split: 1.2
splitOpacity: 0.6
}
Text {
anchors.horizontalCenter: parent.horizontalCenter
text: root.label
color: Theme.muted
font.family: Theme.fontMono
font.pixelSize: Theme.fsMicro
font.letterSpacing: 2
renderType: Text.NativeRendering
}
Text {
anchors.horizontalCenter: parent.horizontalCenter
visible: root.sub !== ""
text: root.sub
color: Theme.subtext
font.family: Theme.fontMono
font.pixelSize: Theme.fsMicro
renderType: Text.NativeRendering
}
}
}
-100
View File
@@ -1,100 +0,0 @@
pragma Singleton
import QtQuick
import Quickshell
// Polygon maths for the Persona 5 panel language: everything leans, and corners
// get chopped rather than rounded.
Singleton {
id: root
// A right-leaning parallelogram filling w x h. `lean` is the horizontal
// offset applied to the top edge, as a fraction of height.
function parallelogram(w: real, h: real, lean: real): var {
const off = h * lean;
return [
Qt.point(off, 0),
Qt.point(w, 0),
Qt.point(w - off, h),
Qt.point(0, h)
];
}
// Same, leaning the other way.
function parallelogramL(w: real, h: real, lean: real): var {
const off = h * lean;
return [
Qt.point(0, 0),
Qt.point(w - off, 0),
Qt.point(w, h),
Qt.point(off, h)
];
}
function rect(w: real, h: real): var {
return [Qt.point(0, 0), Qt.point(w, 0), Qt.point(w, h), Qt.point(0, h)];
}
// Move `dist` px from `p` toward `q`.
function toward(p: point, q: point, dist: real): point {
const dx = q.x - p.x;
const dy = q.y - p.y;
const len = Math.hypot(dx, dy);
if (len < 0.0001) return p;
const t = Math.min(dist, len / 2) / len;
return Qt.point(p.x + dx * t, p.y + dy * t);
}
// Chop the listed corners of a polygon. `corners` is an array of indices;
// pass null to chop every corner.
function chamfer(pts: var, size: real, corners: var): var {
if (size <= 0) return root.closed(pts);
const n = pts.length;
const out = [];
for (let i = 0; i < n; i++) {
const p = pts[i];
if (corners !== null && corners.indexOf(i) === -1) {
out.push(p);
continue;
}
out.push(root.toward(p, pts[(i - 1 + n) % n], size));
out.push(root.toward(p, pts[(i + 1) % n], size));
}
return root.closed(out);
}
function closed(pts: var): var {
if (pts.length === 0) return pts;
const out = pts.slice();
out.push(pts[0]);
return out;
}
// Shrink a polygon toward its centroid — used for inner strokes.
function inset(pts: var, amount: real): var {
let cx = 0, cy = 0;
for (const p of pts) { cx += p.x; cy += p.y; }
cx /= pts.length; cy /= pts.length;
return pts.map(p => {
const dx = cx - p.x, dy = cy - p.y;
const len = Math.hypot(dx, dy);
if (len < 0.0001) return p;
const t = amount / len;
return Qt.point(p.x + dx * t, p.y + dy * t);
});
}
// A jagged "torn paper" edge, the Persona 5 speech-bubble signature.
// Returns a polygon `w` x `h` whose bottom edge is serrated.
function torn(w: real, h: real, teeth: int, depth: real): var {
const out = [Qt.point(0, 0), Qt.point(w, 0)];
const step = w / teeth;
for (let i = 0; i < teeth; i++) {
const x1 = w - i * step - step / 2;
const x2 = w - (i + 1) * step;
out.push(Qt.point(x1, h));
out.push(Qt.point(x2, h - depth));
}
return out;
}
}
-45
View File
@@ -1,45 +0,0 @@
import QtQuick
import "root:/config"
// Nerd Font glyph with an optional pulse, used for every status indicator.
Text {
id: root
property bool pulsing: false
property real pulseScale: 1.18
font.family: Theme.fontIcon
font.pixelSize: Theme.fsLarge
color: Theme.primary
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
renderType: Text.NativeRendering
Behavior on color {
ColorAnimation { duration: Theme.durBase }
}
SequentialAnimation on scale {
running: root.pulsing
loops: Animation.Infinite
alwaysRunToEnd: true
NumberAnimation { to: root.pulseScale; duration: 620; easing.type: Easing.OutExpo }
NumberAnimation { to: 1.0; duration: 620; easing.type: Easing.InOutQuad }
}
function bump() {
bumpAnim.restart();
}
SequentialAnimation {
id: bumpAnim
NumberAnimation {
target: root; property: "scale"
to: 1.35; duration: Theme.durFast; easing.type: Easing.OutExpo
}
NumberAnimation {
target: root; property: "scale"
to: 1.0; duration: Theme.durSlow; easing.type: Easing.OutBack
}
}
}
-62
View File
@@ -1,62 +0,0 @@
import QtQuick
import "root:/config"
// Horizontally scrolling text that only moves when it actually overflows, and
// pauses at each end so titles stay readable.
Item {
id: root
property string text: ""
property int pixelSize: Theme.fsSmall
property string family: Theme.fontDisplay
property int weight: Theme.weightBody
property bool italic: false
property color color: Theme.text
property real speed: 26 // px per second
property int pause: 1400 // ms held at each end
property bool running: true
readonly property bool overflowing: label.implicitWidth > width + 1
clip: true
implicitHeight: label.implicitHeight
implicitWidth: label.implicitWidth
Text {
id: label
y: 0
height: root.height
text: root.text
color: root.color
verticalAlignment: Text.AlignVCenter
font.family: root.family
font.pixelSize: root.pixelSize
font.weight: root.weight
font.italic: root.italic
renderType: Text.NativeRendering
}
SequentialAnimation {
id: scroll
running: root.running && root.overflowing && root.visible
loops: Animation.Infinite
PauseAnimation { duration: root.pause }
NumberAnimation {
target: label; property: "x"
from: 0; to: Math.min(0, root.width - label.implicitWidth)
duration: Math.max(1, Math.abs(root.width - label.implicitWidth) / root.speed * 1000)
easing.type: Easing.Linear
}
PauseAnimation { duration: root.pause }
NumberAnimation {
target: label; property: "x"
to: 0
duration: Theme.durSlow
easing.type: Easing.OutExpo
}
}
onOverflowingChanged: if (!overflowing) label.x = 0
onTextChanged: { label.x = 0; scroll.restart(); }
}
-14
View File
@@ -1,14 +0,0 @@
import QtQuick
import QtQuick.Effects
// Layer effect that clips whatever it is applied to into the silhouette of
// `maskItem` — used to chop album art into the shell's panel shape.
MultiEffect {
property Item maskItem
maskEnabled: maskItem !== null
maskSource: maskItem
// Hard edge — the chopped corners should read as cuts, not fades.
maskThresholdMin: 0.5
maskSpreadAtMin: 0.0
}
-59
View File
@@ -1,59 +0,0 @@
import QtQuick
import "root:/config"
// A segmented load meter — slanted ticks that light up left to right. Reads as
// a gauge at a glance and keeps the panel language consistent.
Item {
id: root
property real value: 0 // 0..100
property int segments: 14
property real segmentWidth: 4
property real spacing: 3
property color activeColor: Theme.heat(value)
property color idleColor: Theme.alpha(Theme.outline, 0.55)
property real lean: Theme.skew
readonly property int litCount: Math.round(Math.max(0, Math.min(100, value)) / 100 * segments)
implicitWidth: segments * segmentWidth + (segments - 1) * spacing
implicitHeight: 14
Row {
anchors.fill: parent
spacing: root.spacing
Repeater {
model: root.segments
Item {
required property int index
width: root.segmentWidth
height: root.height
Rectangle {
width: root.segmentWidth
height: root.height
color: parent.index < root.litCount ? root.activeColor : root.idleColor
// Peak segments glow, so a pegged CPU is visible peripherally.
opacity: parent.index < root.litCount
? (parent.index >= root.segments - 2 ? 1.0 : 0.9)
: 1.0
transform: Matrix4x4 {
matrix: Qt.matrix4x4(
1, -root.lean, 0, root.height * root.lean,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1)
}
Behavior on color {
ColorAnimation { duration: Theme.durBase }
}
}
}
}
}
}
-191
View File
@@ -1,191 +0,0 @@
import QtQuick
import Quickshell
import Quickshell.Services.Notifications
import "root:/config"
import "root:/services"
// One notification, used both in the history list and as a floating toast.
Item {
id: root
required property var notif
property bool showActions: true
readonly property color tone: root.notif
? Notifs.urgencyColor(root.notif.urgency)
: Theme.primary
signal dismissed()
implicitHeight: panel.height
P5Panel {
id: panel
width: parent.width
height: layout.implicitHeight + Theme.padM * 2
lean: 0.05
chop: 12
fill: Theme.surface
fillOpacity: 0.97
border: Theme.alpha(root.tone, hover.hovered ? 0.95 : 0.5)
slash: true
slashColor: root.tone
slashWidth: 4
halftone: root.notif?.urgency === NotificationUrgency.Critical
halftoneColor: Theme.accent
halftoneOpacity: 0.12
padding: Theme.padM
Column {
id: layout
anchors.left: parent.left
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: 3
// App line
Row {
spacing: Theme.padS
Icon {
anchors.verticalCenter: parent.verticalCenter
text: Notifs.appIconFor(root.notif)
color: root.tone
font.pixelSize: Theme.fsBody
}
Text {
anchors.verticalCenter: parent.verticalCenter
text: (root.notif?.appName || "System").toUpperCase()
color: root.tone
font.family: Theme.fontMono
font.pixelSize: 8
font.letterSpacing: 2
renderType: Text.NativeRendering
}
}
Text {
width: parent.width
text: root.notif?.summary || ""
color: Theme.text
elide: Text.ElideRight
maximumLineCount: 2
wrapMode: Text.WordWrap
font.family: Theme.fontDisplay
font.pixelSize: Theme.fsBody
font.weight: Font.Black
font.italic: true
renderType: Text.NativeRendering
}
Text {
width: parent.width
visible: text !== ""
text: root.notif?.body || ""
color: Theme.subtext
elide: Text.ElideRight
maximumLineCount: 4
wrapMode: Text.WordWrap
textFormat: Text.StyledText
font.family: Theme.fontDisplay
font.pixelSize: Theme.fsSmall
renderType: Text.NativeRendering
}
// Inline image, when the sender supplied one.
Image {
visible: source != "" && status === Image.Ready
source: root.notif?.image || ""
sourceSize.height: 90
fillMode: Image.PreserveAspectFit
asynchronous: true
}
Row {
visible: root.showActions && (root.notif?.actions?.length ?? 0) > 0
spacing: Theme.padS
topPadding: Theme.padS
Repeater {
model: root.notif?.actions ?? []
Item {
id: actionChip
required property var modelData
implicitWidth: actionLabel.implicitWidth + Theme.padM
implicitHeight: 22
Rectangle {
anchors.fill: parent
color: actionHover.hovered
? Theme.alpha(root.tone, 0.3)
: Theme.alpha(root.tone, 0.1)
border.width: 1
border.color: Theme.alpha(root.tone, 0.6)
transform: Matrix4x4 {
matrix: Qt.matrix4x4(1, -Theme.skew, 0, 22 * Theme.skew,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
}
}
Text {
id: actionLabel
anchors.centerIn: parent
text: actionChip.modelData.text
color: Theme.text
font.family: Theme.fontDisplay
font.pixelSize: Theme.fsMicro
font.italic: true
font.weight: Font.DemiBold
renderType: Text.NativeRendering
}
HoverHandler {
id: actionHover
cursorShape: Qt.PointingHandCursor
}
TapHandler {
onTapped: {
actionChip.modelData.invoke();
root.dismissed();
}
}
}
}
}
}
// Close affordance.
Icon {
anchors.right: parent.right
anchors.top: parent.top
visible: hover.hovered
text: "󰅖"
color: closeHover.hovered ? Theme.accent : Theme.muted
font.pixelSize: Theme.fsBody
HoverHandler {
id: closeHover
cursorShape: Qt.PointingHandCursor
}
TapHandler {
onTapped: root.dismissed()
}
}
}
HoverHandler {
id: hover
}
// Middle click dismisses, matching the old dunst muscle memory.
TapHandler {
acceptedButtons: Qt.MiddleButton
onTapped: root.dismissed()
}
}
-106
View File
@@ -1,106 +0,0 @@
import QtQuick
import "root:/config"
// Chopped, leaning button. On hover it lunges toward the pointer and flips to
// crimson-on-white; on press it snaps flat.
Item {
id: root
property string text: ""
property string icon: ""
property color accent: Theme.primary
property color hoverFill: Theme.accent
property bool destructive: false
property real lean: Theme.skew
property real lunge: 6
property bool wide: false
signal clicked()
readonly property bool hovered: hover.hovered
readonly property bool pressed: tap.pressed
implicitWidth: wide ? 260 : (row.implicitWidth + panel.contentPad * 2)
implicitHeight: 44
P5Panel {
id: panel
anchors.fill: parent
lean: root.lean
padding: Theme.padS
fill: root.hovered ? (root.destructive ? root.hoverFill : Theme.text) : Theme.surface
fillOpacity: root.hovered ? 1.0 : 0.9
border: root.hovered ? "transparent" : Theme.alpha(root.accent, 0.55)
slash: !root.hovered
slashColor: root.destructive ? Theme.accent : root.accent
halftone: root.hovered
halftoneColor: root.destructive ? Theme.text : Theme.base
halftoneOpacity: 0.14
Behavior on fillOpacity {
NumberAnimation { duration: Theme.durFast }
}
Row {
id: row
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
spacing: Theme.padM
Icon {
anchors.verticalCenter: parent.verticalCenter
visible: root.icon !== ""
text: root.icon
font.pixelSize: Theme.fsTitle
color: root.hovered
? (root.destructive ? Theme.text : Theme.base)
: root.accent
}
Text {
anchors.verticalCenter: parent.verticalCenter
text: root.text
color: root.hovered
? (root.destructive ? Theme.text : Theme.base)
: Theme.text
font.family: Theme.fontDisplay
font.pixelSize: Theme.fsBody
font.weight: Theme.weightDisplay
font.italic: true
font.letterSpacing: 1.5
font.capitalization: Font.AllUppercase
renderType: Text.NativeRendering
Behavior on color {
ColorAnimation { duration: Theme.durFast }
}
}
}
}
transform: Translate {
x: root.pressed ? 0 : (root.hovered ? root.lunge : 0)
Behavior on x {
NumberAnimation {
duration: Theme.durBase
easing.type: Easing.OutBack
}
}
}
scale: root.pressed ? 0.97 : 1.0
Behavior on scale {
NumberAnimation { duration: Theme.durFast; easing.type: Easing.OutExpo }
}
HoverHandler {
id: hover
cursorShape: Qt.PointingHandCursor
}
TapHandler {
id: tap
onTapped: root.clicked()
}
}
-165
View File
@@ -1,165 +0,0 @@
import QtQuick
import QtQuick.Shapes
import QtQuick.Effects
import "root:/config"
import "root:/components"
// The base surface for everything in this shell: a leaning, corner-chopped slab
// with an optional halftone wash and a crimson slash along its leading edge.
Item {
id: root
property color fill: Theme.surface
property real fillOpacity: 0.94
property color border: Theme.outline
property real borderWidth: Theme.stroke
// Lean of the vertical edges, as a fraction of height. 0 = upright.
property real lean: Theme.skew
property bool leanLeft: false
// Corner chop size, and which corners get chopped (indices into the
// polygon, clockwise from the top-left). Default chops the two corners that
// read as "cut" against the lean.
property real chop: Theme.cut
property var chopCorners: [1, 3]
// Crimson slash down the leading edge — the Persona 5 tell.
property bool slash: false
property color slashColor: Theme.accent
property real slashWidth: 4
// Screen-printed dot wash.
property bool halftone: false
property color halftoneColor: Theme.primary
property real halftoneOpacity: 0.07
// Inner glow along the top edge, for panels that should feel backlit.
property bool sheen: false
readonly property real leanInset: height * Math.abs(lean)
readonly property var polygon: leanLeft
? Geom.parallelogramL(width, height, lean)
: Geom.parallelogram(width, height, lean)
// Child content lives inside `contentItem`, inset on both sides far enough
// to clear the slanted edges. Panels do not auto-size: callers set implicit
// sizes from their own layout (`row.implicitWidth + contentPad * 2`), which
// keeps the shape maths out of every binding loop.
default property alias content: contentHolder.data
readonly property alias contentItem: contentHolder
property real padding: Theme.padM
readonly property real contentPad: padding + leanInset
Shape {
id: body
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
asynchronous: false
ShapePath {
fillColor: Theme.alpha(root.fill, root.fillOpacity)
strokeColor: root.borderWidth > 0 ? root.border : "transparent"
strokeWidth: root.borderWidth
joinStyle: ShapePath.MiterJoin
capStyle: ShapePath.FlatCap
PathPolyline {
path: Geom.chamfer(root.polygon, root.chop, root.chopCorners)
}
}
}
// Halftone wash, masked to the panel silhouette.
Loader {
anchors.fill: parent
active: root.halftone
asynchronous: true
sourceComponent: Item {
Shape {
id: maskShape
anchors.fill: parent
visible: false
layer.enabled: true
layer.smooth: true
preferredRendererType: Shape.CurveRenderer
ShapePath {
fillColor: "white"
strokeColor: "transparent"
PathPolyline {
path: Geom.chamfer(root.polygon, root.chop, root.chopCorners)
}
}
}
Image {
anchors.fill: parent
source: Theme.texHalftone
fillMode: Image.Tile
opacity: root.halftoneOpacity
smooth: false
layer.enabled: true
layer.effect: MultiEffect {
colorization: 1.0
colorizationColor: root.halftoneColor
maskEnabled: true
maskSource: maskShape
}
}
}
}
// Backlit top edge.
Loader {
anchors.fill: parent
active: root.sheen
sourceComponent: Shape {
preferredRendererType: Shape.CurveRenderer
ShapePath {
strokeColor: "transparent"
fillGradient: LinearGradient {
x1: 0; y1: 0; x2: 0; y2: root.height
GradientStop { position: 0.0; color: Theme.alpha(Theme.primary, 0.16) }
GradientStop { position: 0.55; color: "transparent" }
}
PathPolyline {
path: Geom.chamfer(root.polygon, root.chop, root.chopCorners)
}
}
}
}
// Leading-edge slash.
Loader {
anchors.fill: parent
active: root.slash
sourceComponent: Shape {
preferredRendererType: Shape.CurveRenderer
ShapePath {
fillColor: root.slashColor
strokeColor: "transparent"
PathPolyline {
path: {
const off = root.height * root.lean;
const w = root.slashWidth;
return root.leanLeft
? Geom.closed([Qt.point(0, 0), Qt.point(w, 0),
Qt.point(off + w, root.height), Qt.point(off, root.height)])
: Geom.closed([Qt.point(off, 0), Qt.point(off + w, 0),
Qt.point(w, root.height), Qt.point(0, root.height)]);
}
}
}
}
}
Item {
id: contentHolder
anchors.fill: parent
anchors.leftMargin: root.contentPad
anchors.rightMargin: root.contentPad
anchors.topMargin: root.padding
anchors.bottomMargin: root.padding
}
}
-99
View File
@@ -1,99 +0,0 @@
import QtQuick
import "root:/config"
// Leaning slider with a chopped handle. Drag or click anywhere on the rail.
Item {
id: root
property real value: 0 // 0..1
property color accent: Theme.primary
property bool enabledControl: true
signal moved(real value)
implicitHeight: 18
implicitWidth: 200
readonly property real _lean: Theme.skew * height
// Rail
Rectangle {
id: rail
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.right: parent.right
height: 6
color: Theme.alpha(Theme.outline, 0.7)
transform: Matrix4x4 {
matrix: Qt.matrix4x4(1, -Theme.skew, 0, 6 * Theme.skew,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
}
}
// Fill
Rectangle {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
width: Math.max(0, Math.min(1, root.value)) * root.width
height: 6
color: root.enabledControl ? root.accent : Theme.muted
transform: Matrix4x4 {
matrix: Qt.matrix4x4(1, -Theme.skew, 0, 6 * Theme.skew,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
}
Behavior on width {
enabled: !drag.active
NumberAnimation { duration: Theme.durFast }
}
Behavior on color {
ColorAnimation { duration: Theme.durBase }
}
}
// Handle
Rectangle {
id: handle
width: 6
height: hover.hovered || drag.active ? 18 : 14
color: root.enabledControl ? Theme.text : Theme.muted
anchors.verticalCenter: parent.verticalCenter
x: Math.max(0, Math.min(1, root.value)) * root.width - width / 2
transform: Matrix4x4 {
matrix: Qt.matrix4x4(1, -Theme.skew, 0, height * Theme.skew,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
}
Behavior on height {
NumberAnimation { duration: Theme.durFast; easing.type: Easing.OutBack }
}
Behavior on x {
enabled: !drag.active
NumberAnimation { duration: Theme.durFast }
}
}
HoverHandler {
id: hover
cursorShape: Qt.PointingHandCursor
}
TapHandler {
onTapped: event => root.moved(Math.max(0, Math.min(1, event.position.x / root.width)))
}
DragHandler {
id: drag
target: null
xAxis.enabled: true
yAxis.enabled: false
onCentroidChanged: {
if (!active) return;
root.moved(Math.max(0, Math.min(1, centroid.position.x / root.width)));
}
}
}
-135
View File
@@ -1,135 +0,0 @@
import QtQuick
import Quickshell
import "root:/config"
// Hover-driven panel that hangs off a bar item. Opens on a short dwell, stays
// open while the pointer is over either the trigger or the panel itself, and
// can be pinned with a click. Slides in from behind the bar with an overshoot.
PopupWindow {
id: root
required property Item anchorItem
property bool triggerHovered: false
property bool pinned: false
property int showDelay: 140
property int hideDelay: 200
property int fromEdge: Edges.Bottom
property real contentWidth: Theme.popoutWidth
property real contentHeight: 200
// Extra surface around the content so the entry overshoot and glow are not
// clipped by the window edge.
readonly property int bleed: 24
default property alias body: contentHolder.data
readonly property bool wantsOpen: triggerHovered || panelHover.hovered || pinned
signal dismissedFully()
anchor.item: anchorItem
anchor.edges: fromEdge
anchor.gravity: fromEdge
anchor.adjustment: PopupAdjustment.SlideX
anchor.margins.top: Theme.popoutGap
anchor.margins.bottom: Theme.popoutGap
implicitWidth: contentWidth + bleed * 2
implicitHeight: contentHeight + bleed * 2
color: "transparent"
visible: shown
property bool shown: false
onWantsOpenChanged: {
if (wantsOpen) {
hideTimer.stop();
showTimer.restart();
} else {
showTimer.stop();
hideTimer.restart();
}
}
Timer {
id: showTimer
interval: root.showDelay
onTriggered: root.open()
}
Timer {
id: hideTimer
interval: root.hideDelay
onTriggered: root.dismiss()
}
function open() {
exitAnim.stop();
shown = true;
enterAnim.restart();
}
function dismiss() {
if (!shown) return;
enterAnim.stop();
exitAnim.restart();
}
Item {
id: contentHolder
x: root.bleed
y: root.bleed
width: root.contentWidth
height: root.contentHeight
opacity: 0
transformOrigin: Item.Top
scale: 0.94
// The handler has to live on the content item, not the window: a
// HoverHandler parented to the PopupWindow itself latches on and the
// panel never learns the pointer left.
HoverHandler {
id: panelHover
}
}
ParallelAnimation {
id: enterAnim
NumberAnimation {
target: contentHolder; property: "opacity"
to: 1.0; duration: Theme.durBase; easing.type: Easing.OutExpo
}
NumberAnimation {
target: contentHolder; property: "scale"
to: 1.0; duration: Theme.durSlow; easing.type: Easing.OutBack
}
NumberAnimation {
target: contentHolder; property: "y"
from: root.bleed - 14; to: root.bleed
duration: Theme.durSlow; easing.type: Easing.OutBack
}
}
ParallelAnimation {
id: exitAnim
NumberAnimation {
target: contentHolder; property: "opacity"
to: 0.0; duration: Theme.durFast; easing.type: Easing.InQuad
}
NumberAnimation {
target: contentHolder; property: "scale"
to: 0.96; duration: Theme.durFast; easing.type: Easing.InQuad
}
NumberAnimation {
target: contentHolder; property: "y"
to: root.bleed - 8; duration: Theme.durFast; easing.type: Easing.InQuad
}
onFinished: {
root.shown = false;
root.pinned = false;
contentHolder.y = root.bleed;
root.dismissedFully();
}
}
}
-96
View File
@@ -1,96 +0,0 @@
import QtQuick
import "root:/config"
// Display text with the wallpaper's RGB split baked in: a crimson and a cyan
// ghost sitting a pixel off the white body. Drives most headings in the shell.
Item {
id: root
property string text: ""
property int pixelSize: Theme.fsLarge
property int weight: Theme.weightDisplay
property string family: Theme.fontDisplay
property bool italic: true
property color color: Theme.text
property real split: 1.6
property real splitOpacity: 0.85
property int elide: Text.ElideNone
property int horizontalAlignment: Text.AlignLeft
property real letterSpacing: 0.5
implicitWidth: body.implicitWidth
implicitHeight: body.implicitHeight
Text {
id: ghostRed
anchors.fill: parent
anchors.leftMargin: -root.split
anchors.topMargin: root.split * 0.4
text: root.text
color: Theme.splitRed
opacity: root.splitOpacity
elide: root.elide
horizontalAlignment: root.horizontalAlignment
verticalAlignment: Text.AlignVCenter
font.family: root.family
font.pixelSize: root.pixelSize
font.weight: root.weight
font.italic: root.italic
font.letterSpacing: root.letterSpacing
renderType: Text.NativeRendering
}
Text {
id: ghostCyan
anchors.fill: parent
anchors.leftMargin: root.split
anchors.topMargin: -root.split * 0.4
text: root.text
color: Theme.splitCyan
opacity: root.splitOpacity
elide: root.elide
horizontalAlignment: root.horizontalAlignment
verticalAlignment: Text.AlignVCenter
font.family: root.family
font.pixelSize: root.pixelSize
font.weight: root.weight
font.italic: root.italic
font.letterSpacing: root.letterSpacing
renderType: Text.NativeRendering
}
Text {
id: body
anchors.fill: parent
text: root.text
color: root.color
elide: root.elide
horizontalAlignment: root.horizontalAlignment
verticalAlignment: Text.AlignVCenter
font.family: root.family
font.pixelSize: root.pixelSize
font.weight: root.weight
font.italic: root.italic
font.letterSpacing: root.letterSpacing
renderType: Text.NativeRendering
}
// Kick the ghosts outward briefly — used on track changes, mode flips, etc.
function glitch() {
glitchAnim.restart();
}
SequentialAnimation {
id: glitchAnim
NumberAnimation {
target: root; property: "split"
to: 5.5; duration: Theme.durFast
easing.type: Easing.OutExpo
}
NumberAnimation {
target: root; property: "split"
to: 1.6; duration: Theme.durSlow
easing.type: Easing.OutBack
}
}
}
-11
View File
@@ -1,11 +0,0 @@
import QtQuick
import QtQuick.Effects
// Layer effect that recolours whatever it is applied to — used to tint the
// white texture tiles without shipping a copy per colour.
MultiEffect {
property color tintColor: "white"
colorization: 1.0
colorizationColor: tintColor
}
-101
View File
@@ -1,101 +0,0 @@
pragma Singleton
import QtQuick
import Quickshell
// Takemi palette: cold teal/cyan over near-black, with Persona 5 crimson as the
// alert/accent voice. Derived from ~/.wallpapers/takemi_2.jpg.
Singleton {
id: root
// ---------------------------------------------------------------- colors
readonly property color base: "#04070a"
readonly property color mantle: "#080e14"
readonly property color surface: "#0d1922"
readonly property color surfaceAlt: "#14262f"
readonly property color overlay: "#1d3a47"
readonly property color outline: "#2b5567"
readonly property color text: "#e2f4f8"
readonly property color subtext: "#93b8c4"
readonly property color muted: "#587c8a"
readonly property color primary: "#34d3e6" // electric teal — the house colour
readonly property color primaryDim: "#17879b"
readonly property color glow: "#8ef2ff"
readonly property color blue: "#3b8fd6"
readonly property color deep: "#0d4b5e"
readonly property color accent: "#ff2d40" // P5 crimson
readonly property color accentDim: "#a8121f"
readonly property color warn: "#ffb03a"
readonly property color ok: "#35e08f"
// Chromatic aberration pair, straight off the wallpaper's RGB split.
readonly property color splitRed: "#ff2b4d"
readonly property color splitCyan: "#25e8ff"
function alpha(c: color, a: real): color {
return Qt.rgba(c.r, c.g, c.b, a);
}
// Heat ramp for load/usage readouts.
function heat(pct: real): color {
if (pct >= 90) return root.accent;
if (pct >= 75) return root.warn;
if (pct >= 45) return root.glow;
return root.primary;
}
// ----------------------------------------------------------------- fonts
readonly property string fontDisplay: "Archivo Black"
readonly property string fontMono: "JetBrainsMono Nerd Font"
readonly property string fontIcon: "JetBrainsMono Nerd Font"
readonly property int weightDisplay: Font.Black
readonly property int weightBody: Font.Medium
readonly property int fsMicro: 9
readonly property int fsSmall: 11
readonly property int fsBody: 12
readonly property int fsLarge: 15
readonly property int fsTitle: 20
readonly property int fsHuge: 34
readonly property int fsMega: 92
// -------------------------------------------------------------- geometry
readonly property int barHeight: 40
readonly property int barMargin: 8
readonly property int barGap: 8
// Horizontal offset per unit of height. tan(14deg) — every panel leans.
readonly property real skew: 0.249
readonly property int cut: 9 // corner chamfer, in px
readonly property int stroke: 2
readonly property int padS: 6
readonly property int padM: 12
readonly property int padL: 20
readonly property int padXL: 32
readonly property int popoutWidth: 380
readonly property int popoutGap: 10
// ------------------------------------------------------------ animation
// P5 motion is snappy and slightly overshooting — never soft.
readonly property int durFast: 110
readonly property int durBase: 190
readonly property int durSlow: 340
readonly property int durLazy: 620
readonly property var easeSnap: [0.16, 1.0, 0.3, 1.0, 1, 1] // outExpo-ish
readonly property var easeBack: [0.34, 1.56, 0.64, 1.0, 1, 1] // overshoot
readonly property var easeIn: [0.55, 0.0, 0.9, 0.35, 1, 1]
// -------------------------------------------------------------- textures
readonly property url texHalftone: "root:/assets/halftone.png"
readonly property url texStripes: "root:/assets/stripes.png"
readonly property url texScanline: "root:/assets/scanline.png"
readonly property url wallpaper: "file:///home/narl/.wallpapers/takemi_2.jpg"
}
-25
View File
@@ -1,25 +0,0 @@
import QtQuick
import Quickshell
import Quickshell.Wayland
import "root:/services"
import "root:/lock"
// Session lock. Replaces hyprlock; authenticates through the existing
// /etc/pam.d/hyprlock stack, which is just `auth include login`.
//
// The visuals live in LockFace so they can be exercised in an ordinary window
// (see lockpreview.qml) without locking the session to test a colour.
WlSessionLock {
id: lock
locked: Actions.lockRequested
WlSessionLockSurface {
color: "black"
LockFace {
anchors.fill: parent
onUnlocked: Actions.lockRequested = false
}
}
}

Some files were not shown because too many files have changed in this diff Show More