├── .cache └── eww │ └── colors │ ├── colors-foot.ini │ ├── colors-gradience.json │ ├── colors-hyprland.conf │ ├── colors.css │ ├── colors.scss │ ├── current.json │ ├── templates │ ├── colors-foot.ini │ ├── colors-gradience.json │ ├── colors-hyprland.conf │ ├── colors.css │ └── colors.scss │ └── wall.png ├── .config ├── Thunar │ └── uca.xml ├── eww │ ├── eww.scss │ ├── eww.yuck │ ├── scripts │ │ ├── apps │ │ ├── hyprland │ │ ├── network │ │ ├── nightlight │ │ ├── notifications │ │ ├── pacman │ │ ├── powerprofile │ │ ├── python │ │ │ ├── apps.py │ │ │ ├── hyprland.py │ │ │ ├── material-colors.py │ │ │ ├── mpris.py │ │ │ ├── notifications.py │ │ │ ├── utils.py │ │ │ └── weather.py │ │ ├── theme │ │ └── volume │ ├── scss │ │ ├── common │ │ │ ├── button.scss │ │ │ ├── floating-widget.scss │ │ │ ├── icon-image.scss │ │ │ ├── scrollbar.scss │ │ │ ├── slider.scss │ │ │ ├── tooltip.scss │ │ │ ├── unset.scss │ │ │ └── widget.scss │ │ ├── variables.scss │ │ ├── widgets │ │ │ ├── application.scss │ │ │ ├── calendar.scss │ │ │ ├── date.scss │ │ │ ├── media.scss │ │ │ ├── notification-center.scss │ │ │ ├── notification.scss │ │ │ └── separator.scss │ │ └── windows │ │ │ ├── bar.scss │ │ │ ├── corners.scss │ │ │ ├── desktop.scss │ │ │ ├── dock.scss │ │ │ ├── info-center.scss │ │ │ ├── launcher.scss │ │ │ ├── menu.scss │ │ │ ├── notifications.scss │ │ │ ├── overview.scss │ │ │ ├── powermenu.scss │ │ │ └── volume.scss │ └── yuck │ │ ├── setup.yuck │ │ ├── widgets.yuck │ │ ├── widgets │ │ ├── application.yuck │ │ ├── bar.yuck │ │ ├── clock.yuck │ │ ├── info-center.yuck │ │ ├── media.yuck │ │ ├── menu.yuck │ │ ├── notification-center.yuck │ │ ├── notification.yuck │ │ ├── overview.yuck │ │ └── separator.yuck │ │ ├── windows.yuck │ │ └── windows │ │ ├── bar.yuck │ │ ├── desktop.yuck │ │ ├── dock.yuck │ │ ├── info-center.yuck │ │ ├── launcher.yuck │ │ ├── menu.yuck │ │ ├── notifications.yuck │ │ ├── overview.yuck │ │ ├── powermenu.yuck │ │ └── volume.yuck ├── fontconfig │ └── fonts.conf ├── foot │ └── foot.ini ├── hypr │ ├── animations.conf │ ├── autostart.conf │ ├── binds.conf │ ├── hyprland.conf │ ├── rules.conf │ ├── settings.conf │ └── theme.conf ├── lsd │ ├── config.yaml │ └── icons.yaml └── starship │ └── starship.toml ├── .local └── bin │ ├── actions │ ├── checkoverview │ ├── checkvolume │ ├── color │ ├── colorpicker │ ├── dripshot │ ├── eww │ ├── fetch │ ├── init │ ├── lsd │ ├── volume │ ├── wallpaper │ └── ytmp3 ├── .zshenv ├── .zshrc ├── README.md └── assets ├── desktop.png ├── launcher.png ├── main.png ├── overview.png └── powermenu.png /.cache/eww/colors/colors-foot.ini: -------------------------------------------------------------------------------- 1 | [colors] 2 | alpha=0.9 3 | foreground=1e1a1d 4 | background=fcfcfc 5 | 6 | regular0=fcfcfc 7 | regular1=ba1b1b 8 | regular2=85468d 9 | regular3=82524a 10 | regular4=350040 11 | regular5=251626 12 | regular6=85468d 13 | regular7=1e1a1d 14 | 15 | bright0=4d444c 16 | bright1=ba1b1b 17 | bright2=85468d 18 | bright3=82524a 19 | bright4=350040 20 | bright5=251626 21 | bright6=85468d 22 | bright7=1e1a1d -------------------------------------------------------------------------------- /.cache/eww/colors/colors-gradience.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "material", 3 | "variables": { 4 | "accent_color": "#85468d", 5 | "accent_bg_color": "#85468d", 6 | "accent_fg_color": "#fcfcfc", 7 | "destructive_color": "#ffdad4", 8 | "destructive_bg_color": "#ffdad4", 9 | "destructive_fg_color": "#1e1a1d", 10 | "success_color": "#82524a", 11 | "success_bg_color": "#82524a", 12 | "success_fg_color": "#1e1a1d", 13 | "warning_color": "#6b586b", 14 | "warning_bg_color": "#6b586b", 15 | "warning_fg_color": "#1e1a1d", 16 | "error_color": "#ffdad4", 17 | "error_bg_color": "#ffdad4", 18 | "error_fg_color": "#1e1a1d", 19 | "window_bg_color": "#fcfcfc", 20 | "window_fg_color": "#1e1a1d", 21 | "view_bg_color": "#fcfcfc", 22 | "view_fg_color": "#1e1a1d", 23 | "headerbar_bg_color": "#fcfcfc", 24 | "headerbar_fg_color": "#1e1a1d", 25 | "headerbar_border_color": "rgba(236, 224, 225, 0.8)", 26 | "headerbar_backdrop_color": "#fcfcfc", 27 | "headerbar_shade_color": "rgba(236, 224, 225, 0.07)", 28 | "sidebar_bg_color": "#fcfcfc", 29 | "sidebar_fg_color": "#1e1a1d", 30 | "sidebar_backdrop_color": "#fcfcfc", 31 | "card_bg_color": "#ecdee8", 32 | "card_fg_color": "#1e1a1d", 33 | "card_shade_color": "rgba(0, 0, 0, 0.07)", 34 | "thumbnail_bg_color": "#fcfcfc", 35 | "thumbnail_fg_color": "#1e1a1d", 36 | "dialog_bg_color": "#fcfcfc", 37 | "dialog_fg_color": "#1e1a1d", 38 | "popover_bg_color": "#fcfcfc", 39 | "popover_fg_color": "#1e1a1d", 40 | "shade_color": "rgba(0, 0, 0, 0.36)", 41 | "scrollbar_outline_color": "rgba(158, 140, 143, 0.5)" 42 | }, 43 | "palette": { 44 | "blue_": { 45 | "1": "#99c1f1", 46 | "2": "#62a0ea", 47 | "3": "#3584e4", 48 | "4": "#1c71d8", 49 | "5": "#1a5fb4" 50 | }, 51 | "green_": { 52 | "1": "#8ff0a4", 53 | "2": "#57e389", 54 | "3": "#33d17a", 55 | "4": "#2ec27e", 56 | "5": "#26a269" 57 | }, 58 | "yellow_": { 59 | "1": "#f9f06b", 60 | "2": "#f8e45c", 61 | "3": "#f6d32d", 62 | "4": "#f5c211", 63 | "5": "#e5a50a" 64 | }, 65 | "orange_": { 66 | "1": "#ffbe6f", 67 | "2": "#ffa348", 68 | "3": "#ff7800", 69 | "4": "#e66100", 70 | "5": "#c64600" 71 | }, 72 | "red_": { 73 | "1": "#f66151", 74 | "2": "#ed333b", 75 | "3": "#e01b24", 76 | "4": "#c01c28", 77 | "5": "#a51d2d" 78 | }, 79 | "purple_": { 80 | "1": "#dc8add", 81 | "2": "#c061cb", 82 | "3": "#9141ac", 83 | "4": "#813d9c", 84 | "5": "#613583" 85 | }, 86 | "brown_": { 87 | "1": "#cdab8f", 88 | "2": "#b5835a", 89 | "3": "#986a44", 90 | "4": "#865e3c", 91 | "5": "#63452c" 92 | }, 93 | "light_": { 94 | "1": "#ffffff", 95 | "2": "#f6f5f4", 96 | "3": "#deddda", 97 | "4": "#c0bfbc", 98 | "5": "#9a9996" 99 | }, 100 | "dark_": { 101 | "1": "#77767b", 102 | "2": "#5e5c64", 103 | "3": "#3d3846", 104 | "4": "#241f31", 105 | "5": "#000000" 106 | } 107 | }, 108 | "custom_css": { 109 | "gtk4": "", 110 | "gtk3": "" 111 | }, 112 | "plugins": {} 113 | } -------------------------------------------------------------------------------- /.cache/eww/colors/colors-hyprland.conf: -------------------------------------------------------------------------------- 1 | $surface = rgb(ecdee8) 2 | $primary = rgb(85468d) -------------------------------------------------------------------------------- /.cache/eww/colors/colors.css: -------------------------------------------------------------------------------- 1 | @define-color primary #85468d; 2 | @define-color onPrimary #ffffff; 3 | @define-color primaryContainer #ffd5ff; 4 | @define-color onPrimaryContainer #350040; 5 | @define-color secondary #6b586b; 6 | @define-color onSecondary #ffffff; 7 | @define-color secondaryContainer #f4dbf1; 8 | @define-color onSecondaryContainer #251626; 9 | @define-color tertiary #82524a; 10 | @define-color onTertiary #ffffff; 11 | @define-color tertiaryContainer #ffdad2; 12 | @define-color onTertiaryContainer #33110c; 13 | @define-color error #ba1b1b; 14 | @define-color onError #ffffff; 15 | @define-color errorContainer #ffdad4; 16 | @define-color onErrorContainer #410001; 17 | @define-color background #fcfcfc; 18 | @define-color onBackground #1e1a1d; 19 | @define-color surface #fcfcfc; 20 | @define-color onSurface #1e1a1d; 21 | @define-color surfaceVariant #ecdee8; 22 | @define-color onSurfaceVariant #4d444c; 23 | @define-color outline #7e747c; 24 | @define-color shadow #000000; 25 | @define-color inverseSurface #332f32; 26 | @define-color inverseOnSurface #f7eef3; 27 | @define-color inversePrimary #f7adfc; -------------------------------------------------------------------------------- /.cache/eww/colors/colors.scss: -------------------------------------------------------------------------------- 1 | $primary: #85468d; 2 | $onPrimary: #ffffff; 3 | $primaryContainer: #ffd5ff; 4 | $onPrimaryContainer: #350040; 5 | $secondary: #6b586b; 6 | $onSecondary: #ffffff; 7 | $secondaryContainer: #f4dbf1; 8 | $onSecondaryContainer: #251626; 9 | $tertiary: #82524a; 10 | $onTertiary: #ffffff; 11 | $tertiaryContainer: #ffdad2; 12 | $onTertiaryContainer: #33110c; 13 | $error: #ba1b1b; 14 | $onError: #ffffff; 15 | $errorContainer: #ffdad4; 16 | $onErrorContainer: #410001; 17 | $background: #fcfcfc; 18 | $onBackground: #1e1a1d; 19 | $surface: #fcfcfc; 20 | $onSurface: #1e1a1d; 21 | $surfaceVariant: #ecdee8; 22 | $onSurfaceVariant: #4d444c; 23 | $outline: #7e747c; 24 | $shadow: #000000; 25 | $inverseSurface: #332f32; 26 | $inverseOnSurface: #f7eef3; 27 | $inversePrimary: #f7adfc; -------------------------------------------------------------------------------- /.cache/eww/colors/current.json: -------------------------------------------------------------------------------- 1 | { 2 | "scheme": "light", 3 | "type": "color", 4 | "base_color": "#C49EC4" 5 | } -------------------------------------------------------------------------------- /.cache/eww/colors/templates/colors-foot.ini: -------------------------------------------------------------------------------- 1 | [colors] 2 | alpha=0.9 3 | foreground={{ onSurface }} 4 | background={{ surface }} 5 | 6 | regular0={{ surface }} 7 | regular1={{ error }} 8 | regular2={{ primary}} 9 | regular3={{ tertiary }} 10 | regular4={{ onPrimaryContainer }} 11 | regular5={{ onSecondaryContainer }} 12 | regular6={{ primary }} 13 | regular7={{ onSurface }} 14 | 15 | bright0={{ onSurfaceVariant }} 16 | bright1={{ error }} 17 | bright2={{ primary}} 18 | bright3={{ tertiary }} 19 | bright4={{ onPrimaryContainer }} 20 | bright5={{ onSecondaryContainer }} 21 | bright6={{ primary }} 22 | bright7={{ onSurface }} -------------------------------------------------------------------------------- /.cache/eww/colors/templates/colors-gradience.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "material", 3 | "variables": { 4 | "accent_color": "{{ primary }}", 5 | "accent_bg_color": "{{ primary }}", 6 | "accent_fg_color": "{{ surface }}", 7 | "destructive_color": "{{ errorContainer }}", 8 | "destructive_bg_color": "{{ errorContainer }}", 9 | "destructive_fg_color": "{{ onSurface }}", 10 | "success_color": "{{ tertiary }}", 11 | "success_bg_color": "{{ tertiary }}", 12 | "success_fg_color": "{{ onSurface }}", 13 | "warning_color": "{{ secondary }}", 14 | "warning_bg_color": "{{ secondary }}", 15 | "warning_fg_color": "{{ onSurface }}", 16 | "error_color": "{{ errorContainer }}", 17 | "error_bg_color": "{{ errorContainer }}", 18 | "error_fg_color": "{{ onSurface }}", 19 | "window_bg_color": "{{ surface }}", 20 | "window_fg_color": "{{ onSurface }}", 21 | "view_bg_color": "{{ surface }}", 22 | "view_fg_color": "{{ onSurface }}", 23 | "headerbar_bg_color": "{{ surface }}", 24 | "headerbar_fg_color": "{{ onSurface }}", 25 | "headerbar_border_color": "rgba(236, 224, 225, 0.8)", 26 | "headerbar_backdrop_color": "{{ surface }}", 27 | "headerbar_shade_color": "rgba(236, 224, 225, 0.07)", 28 | "sidebar_bg_color": "{{ surface }}", 29 | "sidebar_fg_color": "{{ onSurface }}", 30 | "sidebar_backdrop_color": "{{ surface }}", 31 | "card_bg_color": "{{ surfaceVariant }}", 32 | "card_fg_color": "{{ onSurface }}", 33 | "card_shade_color": "rgba(0, 0, 0, 0.07)", 34 | "thumbnail_bg_color": "{{ surface }}", 35 | "thumbnail_fg_color": "{{ onSurface }}", 36 | "dialog_bg_color": "{{ surface }}", 37 | "dialog_fg_color": "{{ onSurface }}", 38 | "popover_bg_color": "{{ surface }}", 39 | "popover_fg_color": "{{ onSurface }}", 40 | "shade_color": "rgba(0, 0, 0, 0.36)", 41 | "scrollbar_outline_color": "rgba(158, 140, 143, 0.5)" 42 | }, 43 | "palette": { 44 | "blue_": { 45 | "1": "#99c1f1", 46 | "2": "#62a0ea", 47 | "3": "#3584e4", 48 | "4": "#1c71d8", 49 | "5": "#1a5fb4" 50 | }, 51 | "green_": { 52 | "1": "#8ff0a4", 53 | "2": "#57e389", 54 | "3": "#33d17a", 55 | "4": "#2ec27e", 56 | "5": "#26a269" 57 | }, 58 | "yellow_": { 59 | "1": "#f9f06b", 60 | "2": "#f8e45c", 61 | "3": "#f6d32d", 62 | "4": "#f5c211", 63 | "5": "#e5a50a" 64 | }, 65 | "orange_": { 66 | "1": "#ffbe6f", 67 | "2": "#ffa348", 68 | "3": "#ff7800", 69 | "4": "#e66100", 70 | "5": "#c64600" 71 | }, 72 | "red_": { 73 | "1": "#f66151", 74 | "2": "#ed333b", 75 | "3": "#e01b24", 76 | "4": "#c01c28", 77 | "5": "#a51d2d" 78 | }, 79 | "purple_": { 80 | "1": "#dc8add", 81 | "2": "#c061cb", 82 | "3": "#9141ac", 83 | "4": "#813d9c", 84 | "5": "#613583" 85 | }, 86 | "brown_": { 87 | "1": "#cdab8f", 88 | "2": "#b5835a", 89 | "3": "#986a44", 90 | "4": "#865e3c", 91 | "5": "#63452c" 92 | }, 93 | "light_": { 94 | "1": "#ffffff", 95 | "2": "#f6f5f4", 96 | "3": "#deddda", 97 | "4": "#c0bfbc", 98 | "5": "#9a9996" 99 | }, 100 | "dark_": { 101 | "1": "#77767b", 102 | "2": "#5e5c64", 103 | "3": "#3d3846", 104 | "4": "#241f31", 105 | "5": "#000000" 106 | } 107 | }, 108 | "custom_css": { 109 | "gtk4": "", 110 | "gtk3": "" 111 | }, 112 | "plugins": {} 113 | } -------------------------------------------------------------------------------- /.cache/eww/colors/templates/colors-hyprland.conf: -------------------------------------------------------------------------------- 1 | $surface = rgb({{ surfaceVariant }}) 2 | $primary = rgb({{ primary }}) -------------------------------------------------------------------------------- /.cache/eww/colors/templates/colors.css: -------------------------------------------------------------------------------- 1 | @define-color primary {{ primary }}; 2 | @define-color onPrimary {{ onPrimary }}; 3 | @define-color primaryContainer {{ primaryContainer }}; 4 | @define-color onPrimaryContainer {{ onPrimaryContainer }}; 5 | @define-color secondary {{ secondary }}; 6 | @define-color onSecondary {{ onSecondary }}; 7 | @define-color secondaryContainer {{ secondaryContainer }}; 8 | @define-color onSecondaryContainer {{ onSecondaryContainer }}; 9 | @define-color tertiary {{ tertiary }}; 10 | @define-color onTertiary {{ onTertiary }}; 11 | @define-color tertiaryContainer {{ tertiaryContainer }}; 12 | @define-color onTertiaryContainer {{ onTertiaryContainer }}; 13 | @define-color error {{ error }}; 14 | @define-color onError {{ onError }}; 15 | @define-color errorContainer {{ errorContainer }}; 16 | @define-color onErrorContainer {{ onErrorContainer }}; 17 | @define-color background {{ background }}; 18 | @define-color onBackground {{ onBackground }}; 19 | @define-color surface {{ surface }}; 20 | @define-color onSurface {{ onSurface }}; 21 | @define-color surfaceVariant {{ surfaceVariant }}; 22 | @define-color onSurfaceVariant {{ onSurfaceVariant }}; 23 | @define-color outline {{ outline }}; 24 | @define-color shadow {{ shadow }}; 25 | @define-color inverseSurface {{ inverseSurface }}; 26 | @define-color inverseOnSurface {{ inverseOnSurface }}; 27 | @define-color inversePrimary {{ inversePrimary }}; 28 | -------------------------------------------------------------------------------- /.cache/eww/colors/templates/colors.scss: -------------------------------------------------------------------------------- 1 | $primary: {{ primary }}; 2 | $onPrimary: {{ onPrimary }}; 3 | $primaryContainer: {{ primaryContainer }}; 4 | $onPrimaryContainer: {{ onPrimaryContainer }}; 5 | $secondary: {{ secondary }}; 6 | $onSecondary: {{ onSecondary }}; 7 | $secondaryContainer: {{ secondaryContainer }}; 8 | $onSecondaryContainer: {{ onSecondaryContainer }}; 9 | $tertiary: {{ tertiary }}; 10 | $onTertiary: {{ onTertiary }}; 11 | $tertiaryContainer: {{ tertiaryContainer }}; 12 | $onTertiaryContainer: {{ onTertiaryContainer }}; 13 | $error: {{ error }}; 14 | $onError: {{ onError }}; 15 | $errorContainer: {{ errorContainer }}; 16 | $onErrorContainer: {{ onErrorContainer }}; 17 | $background: {{ background }}; 18 | $onBackground: {{ onBackground }}; 19 | $surface: {{ surface }}; 20 | $onSurface: {{ onSurface }}; 21 | $surfaceVariant: {{ surfaceVariant }}; 22 | $onSurfaceVariant: {{ onSurfaceVariant }}; 23 | $outline: {{ outline }}; 24 | $shadow: {{ shadow }}; 25 | $inverseSurface: {{ inverseSurface }}; 26 | $inverseOnSurface: {{ inverseOnSurface }}; 27 | $inversePrimary: {{ inversePrimary }}; -------------------------------------------------------------------------------- /.cache/eww/colors/wall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/.cache/eww/colors/wall.png -------------------------------------------------------------------------------- /.config/Thunar/uca.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | utilities-terminal 5 | Open Terminal Here 6 | 7 | 1653152521049373-1 8 | foot -T flooat 9 | 10 | 11 | * 12 | 13 | 14 | 15 | 16 | com.github.maoschanz.DynamicWallpaperEditor 17 | Set Wallpaper 18 | 19 | 1653152845925747-1 20 | swww img %n --transition-fps 75 --transition-type wipe --transition-duration 2 21 | sww 22 | 23 | * 24 | 25 | 26 | 27 | 28 | nvim 29 | Open with Nvim 30 | 31 | 1653154187810667-1 32 | foot -T flooat -e nvim %n 33 | 34 | 35 | * 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /.config/eww/eww.scss: -------------------------------------------------------------------------------- 1 | @import "/home/klyn/.cache/eww/colors/colors.scss"; 2 | @import "scss/variables.scss"; 3 | 4 | @import "scss/common/button.scss"; 5 | @import "scss/common/floating-widget.scss"; 6 | @import "scss/common/icon-image.scss"; 7 | @import "scss/common/scrollbar.scss"; 8 | @import "scss/common/slider.scss"; 9 | @import "scss/common/tooltip.scss"; 10 | @import "scss/common/unset.scss"; 11 | @import "scss/common/widget.scss"; 12 | 13 | @import "scss/widgets/application.scss"; 14 | @import "scss/widgets/calendar.scss"; 15 | @import "scss/widgets/date.scss"; 16 | @import "scss/widgets/media.scss"; 17 | @import "scss/widgets/notification.scss"; 18 | @import "scss/widgets/notification-center.scss"; 19 | @import "scss/widgets/separator.scss"; 20 | 21 | @import "scss/windows/powermenu.scss"; 22 | @import "scss/windows/bar.scss"; 23 | @import "scss/windows/corners.scss"; 24 | @import "scss/windows/desktop.scss"; 25 | @import "scss/windows/dock.scss"; 26 | @import "scss/windows/info-center.scss"; 27 | @import "scss/windows/launcher.scss"; 28 | @import "scss/windows/menu.scss"; 29 | @import "scss/windows/notifications.scss"; 30 | @import "scss/windows/overview.scss"; 31 | @import "scss/windows/volume.scss"; 32 | -------------------------------------------------------------------------------- /.config/eww/eww.yuck: -------------------------------------------------------------------------------- 1 | (include "yuck/widgets.yuck") 2 | (include "yuck/windows.yuck") 3 | (include "yuck/setup.yuck") 4 | 5 | (defpoll nightlight :interval "10h" `scripts/nightlight get`) 6 | (defpoll powerprofile :interval "10h" `scripts/powerprofile get`) 7 | (defpoll theme :interval "10h" `scripts/theme get`) 8 | (defpoll date :interval "5m" `date +'{"day": "%d", "month": "%m", "year": "%Y"}'`) 9 | (defpoll uptime :interval "1m" `awk '{print $1 / 60}' /proc/uptime`) 10 | (defpoll colors :interval "10h" `scripts/python/material-colors.py --type`) 11 | 12 | (deflisten audio :initial "{}" `scripts/volume`) 13 | (deflisten pacman :initial "{}" `scripts/pacman`) 14 | (deflisten network :initial "{}" `scripts/network`) 15 | (deflisten workspaces :initial "{}" `scripts/python/hyprland.py`) 16 | (deflisten weather :initial "{}" `scripts/python/weather.py`) 17 | (deflisten notifications :initial "{}" `scripts/python/notifications.py`) 18 | (deflisten mpris :initial "{}" `scripts/python/mpris.py`) 19 | (deflisten apps :initial "{}" `scripts/python/apps.py`) 20 | 21 | (defvar user "klyn@arch") 22 | (defvar active "{}") 23 | (defvar dock "{}") 24 | (defvar positions "{}") 25 | (defvar selected "") 26 | (defvar popup "") 27 | (defvar duration "250ms") 28 | (defvar interval "hourly") 29 | (defvar dock_rev true) 30 | (defvar music_rev false) 31 | (defvar media-bar_rev false) 32 | (defvar utils-bar_rev false) 33 | (defvar volume-bar_rev false) 34 | (defvar volume_rev false) 35 | (defvar menu_rev false) 36 | (defvar info-center_rev false) 37 | (defvar notification_rev false) 38 | (defvar themes_rev false) 39 | (defvar icons '{ 40 | "volume": { 41 | "true": "", 42 | "false": "" 43 | }, 44 | "microphone": { 45 | "true": "", 46 | "false": "" 47 | }, 48 | "network": { 49 | "up": "", 50 | "down": "" 51 | }, 52 | "power": { 53 | "poweroff": "", 54 | "reboot": "", 55 | "suspend": "", 56 | "exit": "" 57 | }, 58 | "bell": { 59 | "true": "", 60 | "false": "" 61 | }, 62 | "light": { 63 | "true": "", 64 | "false": "" 65 | }, 66 | "power-profile": { 67 | "performance": "", 68 | "balanced": "", 69 | "power-saver": "" 70 | }, 71 | "media": { 72 | "true": "", 73 | "false": "" 74 | } 75 | }' 76 | ) 77 | -------------------------------------------------------------------------------- /.config/eww/scripts/apps: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | queryApp() { 4 | dbus-send --session --type=method_call \ 5 | --dest=com.juminai.Apps \ 6 | /com/juminai/Apps \ 7 | com.juminai.Apps.Query \ 8 | string:$1 9 | } 10 | 11 | updateFreq() { 12 | dbus-send --session --type=method_call \ 13 | --dest=com.juminai.Apps \ 14 | /com/juminai/Apps \ 15 | com.juminai.Apps.UpdateFreq \ 16 | string:$1 17 | } 18 | 19 | add() { 20 | dbus-send --session --type=method_call \ 21 | --dest=com.juminai.Apps \ 22 | /com/juminai/Apps \ 23 | com.juminai.Apps.Add\ 24 | string:$1 25 | } 26 | 27 | if [[ $1 == 'query' ]]; then queryApp $2; fi 28 | if [[ $1 == 'freq' ]]; then updateFreq $2; fi 29 | if [[ $1 == 'add' ]]; then add $2; fi 30 | -------------------------------------------------------------------------------- /.config/eww/scripts/hyprland: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ $1 == 'window' ]]; then hyprctl dispatch focuswindow address:$2; fi 4 | if [[ $1 == 'workspace' ]]; then hyprctl dispatch workspace $2; fi 5 | if [[ $1 == 'move' ]]; then hyprctl dispatch movetoworkspacesilent $2,address:$3 && eww update selected=""; fi 6 | if [[ $1 == 'special' ]]; then hyprctl dispatch movetoworkspacesilent special,address:$2; fi 7 | if [[ $1 == 'close' ]]; then hyprctl dispatch closewindow address:$2; fi 8 | if [[ $1 == 'update' ]]; then eww update selected=$2; fi -------------------------------------------------------------------------------- /.config/eww/scripts/network: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | INTERFACE=$(ip -o route show to default | awk '{print $5}') 4 | OPERSTATE=$(cat /sys/class/net/$INTERFACE/operstate) 5 | echo '{"name": "'$INTERFACE'", "status": "'$OPERSTATE'"}' 6 | 7 | ip monitor link | while read -r line; do 8 | INTERFACE=$(ip -o -4 route show to default | awk '{print $5}') 9 | OPERSTATE=$(cat /sys/class/net/$INTERFACE/operstate) 10 | echo '{"name": "'$INTERFACE'", "status": "'$OPERSTATE'"}' 11 | done 12 | -------------------------------------------------------------------------------- /.config/eww/scripts/nightlight: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | state() { 4 | if [[ -z $(pgrep wlsunset) ]]; then 5 | echo false 6 | else 7 | echo true 8 | fi 9 | } 10 | 11 | toggle() { 12 | if [[ $(state) == true ]]; then 13 | eww update nightlight=false 14 | pkill wlsunset 15 | else 16 | eww update nightlight=true 17 | wlsunset -t 3400 & 18 | fi 19 | } 20 | 21 | 22 | if [[ $1 == 'toggle' ]]; then toggle; fi 23 | if [[ $1 == 'get' ]]; then state; fi 24 | -------------------------------------------------------------------------------- /.config/eww/scripts/notifications: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | dismiss() { 4 | dbus-send --session --type=method_call \ 5 | --dest=org.freedesktop.Notifications \ 6 | /org/freedesktop/Notifications \ 7 | org.freedesktop.Notifications.DismissPopup \ 8 | uint32:$1 9 | } 10 | 11 | close() { 12 | dbus-send --session --type=method_call \ 13 | --dest=org.freedesktop.Notifications \ 14 | /org/freedesktop/Notifications \ 15 | org.freedesktop.Notifications.CloseNotification \ 16 | uint32:$1 17 | } 18 | 19 | action() { 20 | dbus-send --session --type=method_call \ 21 | --dest=org.freedesktop.Notifications \ 22 | /org/freedesktop/Notifications \ 23 | org.freedesktop.Notifications.InvokeAction \ 24 | uint32:$1 string:$2 25 | 26 | eww update info-center_rev=false 27 | } 28 | 29 | clear_all() { 30 | dbus-send --session --type=method_call \ 31 | --dest=org.freedesktop.Notifications \ 32 | /org/freedesktop/Notifications \ 33 | org.freedesktop.Notifications.ClearAll 34 | } 35 | 36 | toggle_dnd() { 37 | dbus-send --session --type=method_call \ 38 | --dest=org.freedesktop.Notifications \ 39 | /org/freedesktop/Notifications \ 40 | org.freedesktop.Notifications.ToggleDND 41 | } 42 | 43 | remove_id() { 44 | dbus-send --session --type=method_call \ 45 | --dest=org.freedesktop.Notifications \ 46 | /org/freedesktop/Notifications \ 47 | org.freedesktop.Notifications.RemovePopupID \ 48 | uint32:$1 49 | } 50 | 51 | if [[ $1 == 'dismiss' ]]; then dismiss $2 $3; fi 52 | if [[ $1 == 'close' ]]; then close $2; fi 53 | if [[ $1 == 'action' ]]; then action $2 $3; fi 54 | if [[ $1 == 'clear' ]]; then clear_all; fi 55 | if [[ $1 == 'toggle' ]]; then toggle_dnd; fi 56 | if [[ $1 == 'pop' ]]; then remove_id $2; fi 57 | -------------------------------------------------------------------------------- /.config/eww/scripts/pacman: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | while true; do 4 | pkgs="$(yay -Q | wc -l)" 5 | 6 | updates_arch=$(checkupdates 2>/dev/null | wc -l) 7 | updates_arch=${updates_arch:-0} 8 | 9 | updates_aur=$(yay -Qum 2>/dev/null | wc -l) 10 | updates_aur=${updates_aur:-0} 11 | 12 | updates=$((updates_arch + updates_aur)) 13 | 14 | echo '{"packages": '$pkgs', "updates": '$updates'}' 15 | sleep 600 16 | done 17 | -------------------------------------------------------------------------------- /.config/eww/scripts/powerprofile: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PROFILE=$(powerprofilesctl get) 4 | 5 | toggle() { 6 | if [[ $PROFILE == 'balanced' ]]; then 7 | eww update powerprofile=power-saver 8 | powerprofilesctl set power-saver 9 | else 10 | eww update powerprofile=balanced 11 | powerprofilesctl set balanced 12 | fi 13 | } 14 | 15 | if [[ $1 == 'toggle' ]]; then toggle; fi 16 | if [[ $1 == 'get' ]]; then echo $PROFILE; fi 17 | -------------------------------------------------------------------------------- /.config/eww/scripts/python/apps.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # juminai @ github 3 | 4 | import gi 5 | import dbus 6 | import dbus.service 7 | 8 | gi.require_version("Gtk", "3.0") 9 | 10 | from dbus.mainloop.glib import DBusGMainLoop 11 | from gi.repository import Gio, GLib 12 | from hyprland import update_dock 13 | from utils import load, get_themed_icon, update_eww, write_file 14 | 15 | class Apps(dbus.service.Object): 16 | def __init__(self): 17 | super().__init__( 18 | dbus.service.BusName( 19 | "com.juminai.Apps", 20 | bus=dbus.SessionBus() 21 | ), "/com/juminai/Apps" 22 | ) 23 | 24 | self.populate() 25 | 26 | 27 | def installed_apps(self): 28 | app_info = Gio.AppInfo 29 | app_infos = app_info.get_all() 30 | 31 | app_list = [] 32 | 33 | for app_info in app_infos: 34 | if app_info.should_show(): 35 | get_icon = app_info.get_icon() 36 | app_icon = None 37 | 38 | if get_icon: 39 | if get_icon.get_names(): 40 | icon_name = get_icon.get_names()[0] 41 | app_icon = get_themed_icon(icon_name) 42 | 43 | app_id = app_info.get_id() 44 | 45 | app = { 46 | "name": app_info.get_name(), 47 | "executable": app_info.get_executable(), 48 | "icon": app_icon, 49 | "description": app_info.get_description(), 50 | "id": app_id, 51 | "frequency": load("frequency").get(app_id, 0), 52 | } 53 | 54 | app_list.append(app) 55 | 56 | app_list.sort( 57 | key=lambda x: x["frequency"], 58 | reverse=True 59 | ) 60 | return app_list 61 | 62 | 63 | def populate(self): 64 | self.apps = self.installed_apps() 65 | update_eww("apps", self.apps) 66 | write_file("apps", self.apps) 67 | 68 | 69 | @dbus.service.method("com.juminai.Apps", in_signature="s", out_signature="") 70 | def Query(self, query): 71 | filtered = [] 72 | 73 | for app in self.apps: 74 | if query.lower() in app["name"].lower(): 75 | filtered.append(app) 76 | 77 | update_eww("apps", filtered) 78 | 79 | 80 | @dbus.service.method("com.juminai.Apps", in_signature="s", out_signature="") 81 | def UpdateFreq(self, app): 82 | frequencies = load("frequency") 83 | 84 | if app not in frequencies: 85 | frequencies[app] = 1 86 | else: 87 | frequencies[app] += 1 88 | 89 | write_file("frequency", frequencies) 90 | self.populate() 91 | 92 | 93 | @dbus.service.method("com.juminai.Apps", in_signature="s", out_signature="") 94 | def Add(self, app): 95 | dock_apps = load("dock") 96 | 97 | if app not in dock_apps: 98 | dock_apps.append(app) 99 | else: 100 | dock_apps.remove(app) 101 | 102 | write_file("dock", dock_apps) 103 | update_dock() 104 | 105 | 106 | if __name__ == "__main__": 107 | DBusGMainLoop(set_as_default=True) 108 | loop = GLib.MainLoop() 109 | Apps() 110 | try: 111 | loop.run() 112 | except KeyboardInterrupt: 113 | loop.quit() 114 | -------------------------------------------------------------------------------- /.config/eww/scripts/python/hyprland.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # juminai @ github 3 | 4 | import json 5 | import os 6 | import subprocess 7 | import sys 8 | 9 | from utils import load, update_eww, generate 10 | 11 | SIGNATURE = os.environ.get("HYPRLAND_INSTANCE_SIGNATURE") 12 | RUNTIME = os.environ.get("XDG_RUNTIME_DIR") 13 | 14 | apps = load("apps") 15 | 16 | 17 | def run_command(command): 18 | result = subprocess.check_output(command, text=True) 19 | return json.loads(result) 20 | 21 | 22 | def fix_name(window_class): 23 | classes = { 24 | "brave": "brave", 25 | "telegram": "telegram", 26 | "inkscape": "inkscape", 27 | "nautilus": "nautilus", 28 | "transmissionbt": "transmission", 29 | } 30 | 31 | window_class = window_class.lower() 32 | 33 | for key, value in classes.items(): 34 | if key in window_class: 35 | return value 36 | return window_class 37 | 38 | return window_class 39 | 40 | 41 | def get_app_info(window_class): 42 | app_name = fix_name(window_class) 43 | app_icon = None 44 | app_id = None 45 | 46 | for app in apps: 47 | if app_name in app["executable"].lower(): 48 | app_id = app["id"] 49 | app_name = app["name"] 50 | app_icon = app["icon"] 51 | break 52 | 53 | return { 54 | "id": app_id, 55 | "class": app_name, 56 | "icon": app_icon 57 | } 58 | 59 | 60 | def get_workspaces(): 61 | clients = run_command(["hyprctl", "clients", "-j"]) 62 | data = {i: [] for i in range(1, 8)} 63 | 64 | for client in clients: 65 | workspace_id = client["workspace"]["id"] 66 | mapped = client["mapped"] 67 | window_class = client["class"] 68 | 69 | if window_class == "" or not mapped: 70 | continue 71 | 72 | app = get_app_info(window_class) 73 | 74 | window = { 75 | "id": app["id"], 76 | "class": app["class"], 77 | "icon": app["icon"], 78 | "address": client["address"], 79 | "at": client["at"], 80 | "size": client["size"], 81 | } 82 | 83 | data[workspace_id].append(window) 84 | 85 | workspaces = [ 86 | { 87 | "id": workspace_id, 88 | "windows": windows 89 | } for workspace_id, windows in data.items() 90 | ] 91 | 92 | return workspaces 93 | 94 | 95 | def get_active(): 96 | active_workspace = run_command(["hyprctl", "activeworkspace", "-j"]) 97 | active_window = run_command(["hyprctl", "activewindow", "-j"]) 98 | 99 | active = { 100 | "workspace": active_workspace["id"], 101 | "address": None, 102 | "id": None, 103 | "class": None, 104 | "icon": None 105 | } 106 | 107 | if active_window: 108 | active_class = active_window["class"] 109 | active["address"] = active_window["address"] 110 | active.update(get_app_info(active_class)) 111 | 112 | return active 113 | 114 | 115 | def get_dock_apps(workspaces): 116 | dock = load("dock") 117 | dock_apps = { 118 | "favorite": [], 119 | "impostor": [] 120 | } 121 | 122 | for workspace in workspaces: 123 | if workspace["windows"]: 124 | for window in workspace["windows"]: 125 | if window["id"]: 126 | 127 | app = { 128 | "name": window["class"], 129 | "icon": window["icon"], 130 | "id": window["id"], 131 | "address": window["address"] 132 | } 133 | 134 | if window["id"] in dock: 135 | dock_apps["favorite"].append(app) 136 | else: 137 | dock_apps["impostor"].append(app) 138 | 139 | for app in apps: 140 | if app["id"] in dock: 141 | if not any(i["id"] == app["id"] for i in dock_apps["favorite"]): 142 | dock_apps["favorite"].append( 143 | { 144 | "name": app["name"], 145 | "icon": app["icon"], 146 | "id": app["id"], 147 | "address": None 148 | } 149 | ) 150 | 151 | dock_apps["favorite"] = sorted( 152 | dock_apps["favorite"], 153 | key=lambda x: x["name"] 154 | ) 155 | 156 | return dock_apps 157 | 158 | 159 | def update_dock(): 160 | update_eww("dock", get_dock_apps(get_workspaces())) 161 | 162 | 163 | def monitor_socat(): 164 | socat = ["socat", "-u", f"UNIX-CONNECT:{RUNTIME}/hypr/{SIGNATURE}/.socket2.sock", "-"] 165 | with subprocess.Popen(socat, stdout=subprocess.PIPE, text=True) as process: 166 | for line in process.stdout: 167 | workspaces = get_workspaces() 168 | 169 | if line.startswith(( 170 | "activewindow>>", 171 | "closewindow>>", 172 | "openwindow>>" 173 | )): 174 | generate(workspaces) 175 | update_eww("dock", get_dock_apps(workspaces)) 176 | update_eww("active", get_active()) 177 | 178 | elif line.startswith(( 179 | "movewindow>>", 180 | "changefloatingmode>>", 181 | "fullscreen>>" 182 | )): 183 | generate(workspaces) 184 | 185 | elif line.startswith("workspace>>"): 186 | update_eww("active", get_active()) 187 | 188 | if __name__ == "__main__": 189 | try: 190 | workspaces = get_workspaces() 191 | generate(workspaces) 192 | update_eww("dock", get_dock_apps(workspaces)) 193 | update_eww("active", get_active()) 194 | monitor_socat() 195 | except KeyboardInterrupt: 196 | pass -------------------------------------------------------------------------------- /.config/eww/scripts/python/material-colors.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import sys 4 | import os 5 | import shutil 6 | import argparse 7 | 8 | from jinja2 import Template 9 | from material_color_utilities_python import * 10 | from PIL import Image 11 | from utils import COLORS_DIR, TEMPLATES_DIR, CURRENT_JSON, WALLPAPER_PATH 12 | 13 | 14 | def get_colors(colorscheme): 15 | return { 16 | "primary": hexFromArgb(colorscheme.get_primary()), 17 | "onPrimary": hexFromArgb(colorscheme.get_onPrimary()), 18 | "primaryContainer": hexFromArgb(colorscheme.get_primaryContainer()), 19 | "onPrimaryContainer": hexFromArgb(colorscheme.get_onPrimaryContainer()), 20 | "secondary": hexFromArgb(colorscheme.get_secondary()), 21 | "onSecondary": hexFromArgb(colorscheme.get_onSecondary()), 22 | "secondaryContainer": hexFromArgb(colorscheme.get_secondaryContainer()), 23 | "onSecondaryContainer": hexFromArgb(colorscheme.get_onSecondaryContainer()), 24 | "tertiary": hexFromArgb(colorscheme.get_tertiary()), 25 | "onTertiary": hexFromArgb(colorscheme.get_onTertiary()), 26 | "tertiaryContainer": hexFromArgb(colorscheme.get_tertiaryContainer()), 27 | "onTertiaryContainer": hexFromArgb(colorscheme.get_onTertiaryContainer()), 28 | "error": hexFromArgb(colorscheme.get_error()), 29 | "onError": hexFromArgb(colorscheme.get_onError()), 30 | "errorContainer": hexFromArgb(colorscheme.get_errorContainer()), 31 | "onErrorContainer": hexFromArgb(colorscheme.get_onErrorContainer()), 32 | "background": hexFromArgb(colorscheme.get_background()), 33 | "onBackground": hexFromArgb(colorscheme.get_onBackground()), 34 | "surface": hexFromArgb(colorscheme.get_surface()), 35 | "onSurface": hexFromArgb(colorscheme.get_onSurface()), 36 | "surfaceVariant": hexFromArgb(colorscheme.get_surfaceVariant()), 37 | "onSurfaceVariant": hexFromArgb(colorscheme.get_onSurfaceVariant()), 38 | "outline": hexFromArgb(colorscheme.get_outline()), 39 | "shadow": hexFromArgb(colorscheme.get_shadow()), 40 | "inverseSurface": hexFromArgb(colorscheme.get_inverseSurface()), 41 | "inverseOnSurface": hexFromArgb(colorscheme.get_inverseOnSurface()), 42 | "inversePrimary": hexFromArgb(colorscheme.get_inversePrimary()) 43 | } 44 | 45 | 46 | def get_colors_from_img(image, scheme): 47 | img = Image.open(image) 48 | basewidth = 64 49 | wpercent = (basewidth/float(img.size[0])) 50 | hsize = int((float(img.size[1])*float(wpercent))) 51 | img = img.resize((basewidth,hsize),Image.Resampling.LANCZOS) 52 | theme = themeFromImage(img) 53 | colorscheme = theme.get('schemes').get(scheme) 54 | 55 | return get_colors(colorscheme) 56 | 57 | 58 | def get_colors_from_color(color, scheme): 59 | theme = themeFromSourceColor(argbFromHex(color)) 60 | colorscheme = theme.get('schemes').get(scheme) 61 | 62 | return get_colors(colorscheme) 63 | 64 | 65 | def generate_wallpaper(color): 66 | img = Image.new('RGB', (1920, 1080), color) 67 | img.save(WALLPAPER_PATH) 68 | 69 | 70 | def read_config(): 71 | empty = { 72 | "scheme": "dark", 73 | "type": "image", 74 | "base_color": None 75 | } 76 | 77 | try: 78 | with open(CURRENT_JSON, "r") as config: 79 | return json.load(config) 80 | except FileNotFoundError: 81 | with open(CURRENT_JSON, "w") as config: 82 | json.dump(empty, config) 83 | return empty 84 | 85 | 86 | def write_config(data): 87 | output_json = json.dumps(data, indent=2) 88 | with open(CURRENT_JSON, "w") as config: 89 | config.write(output_json) 90 | 91 | 92 | def render_templates(colors_list): 93 | for template in os.listdir(TEMPLATES_DIR): 94 | 95 | with open(f"{TEMPLATES_DIR}/{template}", "r") as file: 96 | template_rendered = Template(file.read()).render(colors_list) 97 | 98 | with open(f"{COLORS_DIR}/{template}", "w") as output_file: 99 | 100 | if 'foot' in template or 'hyprland' in template: 101 | output_file.write(template_rendered.replace('#', '')) 102 | else: 103 | output_file.write(template_rendered) 104 | 105 | def setup(img): 106 | try: 107 | shutil.copyfile(img, WALLPAPER_PATH) 108 | except shutil.SameFileError: 109 | pass 110 | os.system("eww reload") 111 | os.system("pkill -SIGUSR1 foot") 112 | os.system(f"gradience-cli apply -p '{COLORS_DIR}/colors-gradience.json' --gtk both") 113 | os.system(f"swww img {WALLPAPER_PATH} --transition-fps 75 --transition-type wipe --transition-duration 2") 114 | 115 | 116 | def main(colors, image, scheme, type, base_color): 117 | render_templates(colors) 118 | 119 | write_config({ 120 | "scheme": scheme, 121 | "type": type, 122 | "base_color": base_color 123 | }) 124 | 125 | setup(image) 126 | 127 | 128 | if __name__ == "__main__": 129 | current = read_config() 130 | scheme = current['scheme'] 131 | type = current['type'] 132 | base_color = current['base_color'] 133 | 134 | parser = argparse.ArgumentParser(description="Generate material colors on fly") 135 | 136 | parser.add_argument("--image", type=str, help="Generate color scheme based on an image file.") 137 | parser.add_argument("--toggle", action="store_true", help="Toggle between light and dark color schemes.") 138 | parser.add_argument("--current", action="store_true", help="Print current colors scheme(light/dark)") 139 | parser.add_argument("--type", action="store_true", help="Print current colors type(image/color)") 140 | parser.add_argument("--color", type=str, help="Generate color scheme based on a color and simple plain wallpaper") 141 | 142 | args = parser.parse_args() 143 | 144 | if args.image: 145 | colors = get_colors_from_img(args.image, scheme) 146 | main(colors, args.image, scheme, "image", None) 147 | 148 | elif args.toggle: 149 | match scheme: 150 | case "dark": 151 | scheme = "light" 152 | case "light": 153 | scheme = "dark" 154 | case _: 155 | scheme = "dark" 156 | 157 | match type: 158 | case "image": 159 | colors = get_colors_from_img(WALLPAPER_PATH, scheme) 160 | main(colors, WALLPAPER_PATH, scheme, "image", None) 161 | os.system("eww update current_theme=image") 162 | 163 | case "color": 164 | colors = get_colors_from_color(base_color, scheme) 165 | generate_wallpaper(colors['surfaceVariant']) 166 | main(colors, WALLPAPER_PATH, scheme, "color", base_color) 167 | os.system("eww update current_theme=color") 168 | 169 | elif args.current: 170 | sys.stdout.write(scheme + "\n") 171 | sys.stdout.flush() 172 | 173 | elif args.type: 174 | sys.stdout.write(type + "\n") 175 | sys.stdout.flush() 176 | 177 | elif args.color: 178 | colors = get_colors_from_color(args.color, scheme) 179 | generate_wallpaper(colors['secondaryContainer']) 180 | main(colors, WALLPAPER_PATH, scheme, "color", args.color) 181 | os.system("eww update current_theme=color") 182 | 183 | else: 184 | print("No valid argument specified. Use --help for usage information.") 185 | -------------------------------------------------------------------------------- /.config/eww/scripts/python/mpris.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # juminai @ github 3 | 4 | import dbus 5 | import gi 6 | import os 7 | import requests 8 | import time 9 | import cairosvg 10 | import hashlib 11 | 12 | from io import BytesIO 13 | from PIL import Image 14 | from gi.repository import GLib 15 | from dbus.mainloop.glib import DBusGMainLoop 16 | from utils import get_themed_icon, MPRIS_DIR, update_eww 17 | 18 | def get_property(interface, prop): 19 | try: 20 | return interface.Get("org.mpris.MediaPlayer2.Player", prop) 21 | except dbus.exceptions.DBusException: 22 | return None 23 | 24 | 25 | def format_time(seconds): 26 | if seconds < 3600: 27 | minutes = seconds // 60 28 | remaining_seconds = seconds % 60 29 | return f"{minutes:02d}:{remaining_seconds:02d}" 30 | else: 31 | hours = seconds // 3600 32 | minutes = (seconds % 3600) // 60 33 | remaining_seconds = seconds % 60 34 | return f"{hours:02d}:{minutes:02d}:{remaining_seconds:02d}" 35 | 36 | 37 | def clean_name(name): 38 | name = name.split(".instance")[0] 39 | name = name.replace("org.mpris.MediaPlayer2.", "") 40 | return name 41 | 42 | 43 | def get_icon(name): 44 | player_name = clean_name(name) 45 | icon = get_themed_icon(player_name) 46 | return icon 47 | 48 | 49 | def get_artwork(artwork, title, player): 50 | file_name = hashlib.sha1(f"{title}_{player}".encode()).hexdigest() 51 | save_path = f"{MPRIS_DIR}/{file_name}" 52 | 53 | if not artwork or len(artwork) > 200: 54 | save_path = f"{MPRIS_DIR}/{player}" 55 | artwork = svg_to_png(get_icon(player), save_path) 56 | 57 | if not os.path.exists(save_path): 58 | if artwork.startswith("https://"): 59 | link = requests.get(artwork) 60 | artwork = BytesIO(link.content) 61 | else: 62 | artwork = artwork.replace("file://", "") 63 | 64 | save_img(artwork, save_path) 65 | 66 | return save_path 67 | 68 | 69 | def save_img(artwork, save_path): 70 | try: 71 | image = Image.open(artwork) 72 | image.save(save_path, format="PNG") 73 | except FileNotFoundError: 74 | pass 75 | 76 | 77 | def svg_to_png(svg_path, png_path): 78 | if not os.path.exists(png_path): 79 | cairosvg.svg2png(url=svg_path, write_to=png_path) 80 | save_img(png_path, png_path) 81 | 82 | return png_path 83 | 84 | 85 | def get_players(): 86 | bus_names = bus.list_names() 87 | 88 | mpris_players = [] 89 | for name in bus_names: 90 | if "org.mpris.MediaPlayer2" in name: 91 | mpris_players.append(name) 92 | 93 | return mpris_players 94 | 95 | 96 | def mpris_data(): 97 | player_names = get_players() 98 | 99 | players = [] 100 | 101 | for name in player_names: 102 | player = bus.get_object(name, "/org/mpris/MediaPlayer2") 103 | interface = dbus.Interface(player, "org.freedesktop.DBus.Properties") 104 | metadata = get_property(interface, "Metadata") 105 | playback_status = get_property(interface, "PlaybackStatus") 106 | 107 | if playback_status == "Stopped" or metadata is None: 108 | continue 109 | 110 | player_name = clean_name(name) 111 | title = metadata.get("xesam:title", "Unknown") 112 | artist = metadata.get("xesam:artist", ["Unknown"])[0] 113 | album = metadata.get("xesam:album", "Unknown") 114 | artwork = metadata.get("mpris:artUrl", None) 115 | length = metadata.get("mpris:length", -1) // 1000000 or -1 116 | volume = get_property(interface, "Volume") 117 | loop_status = get_property(interface, "LoopStatus") 118 | shuffle = bool(get_property(interface, "Shuffle")) 119 | can_go_next = bool(get_property(interface, "CanGoNext")) 120 | can_go_previous = bool(get_property(interface, "CanGoPrevious")) 121 | can_play = bool(get_property(interface, "CanPlay")) 122 | can_pause = bool(get_property(interface, "CanPause")) 123 | 124 | player_data = { 125 | "name": player_name, 126 | "title": title, 127 | "artist": artist, 128 | "album": album, 129 | "artUrl": get_artwork(artwork, title, player_name), 130 | "status": playback_status, 131 | "length": length, 132 | "lengthStr": format_time(length) if length != -1 else -1, 133 | "volume": int(volume * 100) if volume is not None else -1, 134 | "loop": loop_status, 135 | "shuffle": shuffle, 136 | "canGoNext": can_go_next, 137 | "canGoPrevious": can_go_previous, 138 | "canPlay": can_play, 139 | "canPause": can_pause, 140 | "icon": get_icon(player_name), 141 | } 142 | 143 | players.append(player_data) 144 | 145 | return players 146 | 147 | 148 | def get_positions(): 149 | player_names = get_players() 150 | 151 | positions = {} 152 | 153 | for name in player_names: 154 | player = bus.get_object(name, "/org/mpris/MediaPlayer2") 155 | interface = dbus.Interface(player, "org.freedesktop.DBus.Properties") 156 | 157 | position = get_property(interface, "Position") 158 | position = position // 1000000 if position is not None else -1 159 | 160 | positions[clean_name(name)] = { 161 | "position": position, 162 | "positionStr": format_time(position) if position != -1 else -1 163 | } 164 | 165 | return positions 166 | 167 | 168 | def properties_changed(): 169 | bus.add_signal_receiver( 170 | emit, 171 | dbus_interface="org.freedesktop.DBus.Properties", 172 | signal_name="PropertiesChanged", 173 | path="/org/mpris/MediaPlayer2" 174 | ) 175 | 176 | 177 | def player_changed(): 178 | bus.add_signal_receiver( 179 | emit, 180 | dbus_interface="org.freedesktop.DBus", 181 | signal_name="NameOwnerChanged", 182 | path="/org/freedesktop/DBus" 183 | ) 184 | 185 | 186 | def update_positions(): 187 | update_eww("positions", get_positions()) 188 | return True 189 | 190 | 191 | def emit(interface, changed_properties, invalidated_properties): 192 | if "org.mpris.MediaPlayer2" in interface: 193 | if "Rate" not in changed_properties: 194 | update_eww("mpris", mpris_data()) 195 | 196 | 197 | if __name__ == "__main__": 198 | DBusGMainLoop(set_as_default=True) 199 | bus = dbus.SessionBus() 200 | loop = GLib.MainLoop() 201 | 202 | try: 203 | update_eww("mpris", mpris_data()) 204 | properties_changed() 205 | player_changed() 206 | GLib.timeout_add(1000, update_positions) 207 | loop.run() 208 | except KeyboardInterrupt: 209 | loop.quit() -------------------------------------------------------------------------------- /.config/eww/scripts/python/notifications.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # juminai @ github 3 | 4 | import gi 5 | import datetime 6 | import os 7 | import dbus 8 | import dbus.service 9 | 10 | gi.require_version("GdkPixbuf", "2.0") 11 | 12 | from dbus.mainloop.glib import DBusGMainLoop 13 | from gi.repository import GLib, GdkPixbuf 14 | from bs4 import BeautifulSoup 15 | from utils import get_themed_icon, NOTIFICATIONS_DIR, load, update_eww, write_file 16 | 17 | class Notifications(dbus.service.Object): 18 | def __init__(self): 19 | bus_name = dbus.service.BusName("org.freedesktop.Notifications", dbus.SessionBus()) 20 | dbus.service.Object.__init__(self, bus_name, "/org/freedesktop/Notifications") 21 | 22 | self.list = load("notifications") 23 | self.dnd = self.list["dnd"] 24 | self.active_popups = {} 25 | update_eww("notifications", self.list) 26 | 27 | @dbus.service.method("org.freedesktop.Notifications", in_signature="susssasa{sv}i", out_signature="u") 28 | def Notify( 29 | self, 30 | app_name, 31 | replaces_id, 32 | app_image, 33 | summary, 34 | body, 35 | actions, 36 | hints, 37 | expire_timeout, 38 | ): 39 | 40 | notification_id = self.get_id(replaces_id) 41 | 42 | details = { 43 | "id": notification_id, 44 | "appName": app_name or None, 45 | "appIcon": get_themed_icon(app_name), 46 | "summary": self.clean_text(summary) or None, 47 | "body": self.clean_text(body) or None, 48 | "actions": self.get_actions(actions), 49 | "urgency": self.get_urgency(hints), 50 | "time": int(datetime.datetime.now().timestamp()), 51 | "image": self.get_app_image(app_image, hints, notification_id), 52 | } 53 | 54 | self.save_notification(details) 55 | 56 | if not self.dnd: 57 | self.save_popup(details) 58 | 59 | return notification_id 60 | 61 | 62 | @dbus.service.method("org.freedesktop.Notifications", in_signature="", out_signature="ssss") 63 | def GetServerInformation(self): 64 | return ( 65 | "dbus notifications", 66 | "klyn", 67 | "1.0", 68 | "1.2" 69 | ) 70 | 71 | 72 | @dbus.service.method("org.freedesktop.Notifications", in_signature="", out_signature="as") 73 | def GetCapabilities(self): 74 | return ( 75 | "actions", 76 | "body", 77 | "icon-static", 78 | "persistence" 79 | ) 80 | 81 | 82 | @dbus.service.signal("org.freedesktop.Notifications", signature="us") 83 | def ActionInvoked(self, notification_id, action): 84 | return (notification_id, action) 85 | 86 | 87 | @dbus.service.method("org.freedesktop.Notifications", in_signature="us", out_signature="") 88 | def InvokeAction(self, notification_id, action): 89 | self.ActionInvoked(notification_id, action) 90 | 91 | 92 | @dbus.service.signal("org.freedesktop.Notifications", signature="uu") 93 | def NotificationClosed(self, notification_id, reason): 94 | return (notification_id, reason) 95 | 96 | 97 | @dbus.service.method("org.freedesktop.Notifications", in_signature="", out_signature="") 98 | def ToggleDND(self): 99 | self.dnd = not self.dnd 100 | self.list["dnd"] = self.dnd 101 | self.update() 102 | 103 | 104 | @dbus.service.method("org.freedesktop.Notifications", in_signature="u", out_signature="") 105 | def CloseNotification(self, notification_id): 106 | for i in self.list["notifications"]: 107 | if i["id"] == notification_id: 108 | self.list["notifications"].remove(i) 109 | break 110 | 111 | self.NotificationClosed(notification_id, 2) 112 | self.DismissPopup(notification_id) 113 | self.update() 114 | 115 | 116 | @dbus.service.method("org.freedesktop.Notifications", in_signature="u", out_signature="") 117 | def DismissPopup(self, notification_id): 118 | for i in self.list["popups"]: 119 | if i["id"] == notification_id: 120 | self.list["popups"].remove(i) 121 | break 122 | 123 | self.RemovePopupID(notification_id) 124 | self.update() 125 | 126 | 127 | @dbus.service.method("org.freedesktop.Notifications", in_signature="u", out_signature="") 128 | def RemovePopupID(self , notification_id): 129 | if notification_id in self.active_popups: 130 | GLib.source_remove(self.active_popups[notification_id]) 131 | self.active_popups.pop(notification_id, None) 132 | 133 | 134 | @dbus.service.method("org.freedesktop.Notifications", in_signature="", out_signature="") 135 | def ClearAll(self): 136 | for i in self.list["notifications"]: 137 | self.NotificationClosed(i["id"], 2) 138 | 139 | self.list = { 140 | "dnd": self.dnd, 141 | "notifications": [], 142 | "popups": [] 143 | } 144 | 145 | for i in self.active_popups.keys(): 146 | GLib.source_remove(self.active_popups[i]) 147 | self.active_popups = {} 148 | self.update() 149 | 150 | 151 | def save_notification(self, notification): 152 | for i in self.list["notifications"]: 153 | if i["id"] == notification["id"]: 154 | self.list["notifications"].remove(i) 155 | break 156 | 157 | self.list["notifications"].insert(0, notification) 158 | self.update() 159 | 160 | 161 | def save_popup(self, notification): 162 | for i in self.list["popups"]: 163 | if i["id"] == notification["id"]: 164 | self.list["popups"].remove(i) 165 | GLib.source_remove(self.active_popups[i["id"]]) 166 | break 167 | 168 | if len(self.list["popups"]) >= 3: 169 | oldest_popup = self.list["popups"].pop(0) 170 | self.DismissPopup(oldest_popup["id"]) 171 | 172 | self.list["popups"].append(notification) 173 | 174 | popup_id = notification["id"] 175 | self.active_popups[popup_id] = GLib.timeout_add_seconds( 176 | 5, 177 | self.DismissPopup, 178 | popup_id 179 | ) 180 | self.update() 181 | 182 | 183 | def clean_text(self, text): 184 | soup = BeautifulSoup(text, 'html.parser') 185 | cleaned_text = soup.get_text(separator=' ', strip=True) 186 | 187 | return cleaned_text 188 | 189 | 190 | def get_app_image(self, app_image, hints, notification_id): 191 | image = None 192 | 193 | if app_image: 194 | if os.path.isfile(app_image) or app_image.startswith("file://"): 195 | image = app_image 196 | else: 197 | image = get_themed_icon(app_image) 198 | 199 | if "image-data" in hints: 200 | image_data = hints["image-data"] 201 | image_path = f"{NOTIFICATIONS_DIR}/{notification_id}" 202 | self.save_img_byte(image_data, image_path) 203 | image = image_path 204 | 205 | return image 206 | 207 | 208 | def save_img_byte(self, px_args, save_path: str): 209 | GdkPixbuf.Pixbuf.new_from_bytes( 210 | width=px_args[0], 211 | height=px_args[1], 212 | has_alpha=px_args[3], 213 | data=GLib.Bytes(px_args[6]), 214 | colorspace=GdkPixbuf.Colorspace.RGB, 215 | rowstride=px_args[2], 216 | bits_per_sample=px_args[4], 217 | ).savev(save_path, "png") 218 | 219 | 220 | def get_urgency(self, hints): 221 | urgency = None 222 | 223 | if "urgency" in hints: 224 | urgency = hints["urgency"] 225 | if urgency == 0: 226 | urgency = "low" 227 | elif urgency == 1: 228 | urgency = "normal" 229 | elif urgency == 2: 230 | urgency = "critical" 231 | 232 | return urgency 233 | 234 | 235 | def get_id(self, replaces_id): 236 | if replaces_id != 0: 237 | notification_id = replaces_id 238 | else: 239 | if self.list.get("notifications", []): 240 | notification_id = self.list.get("notifications", [])[0]["id"] + 1 241 | else: 242 | notification_id = 1 243 | 244 | return notification_id 245 | 246 | 247 | def get_actions(self, actions): 248 | actions = list(actions) 249 | pairs = [] 250 | 251 | for i in range(0, len(actions), 2): 252 | if actions[i + 1] != "": 253 | pairs.append({ 254 | "label": actions[i + 1], 255 | "id": actions[i] 256 | }) 257 | 258 | return pairs 259 | 260 | 261 | def update(self): 262 | update_eww("notifications", self.list) 263 | write_file("notifications", 264 | { 265 | "dnd": self.list["dnd"], 266 | "notifications": self.list["notifications"], 267 | "popups": [] 268 | } 269 | ) 270 | 271 | 272 | if __name__ == "__main__": 273 | DBusGMainLoop(set_as_default=True) 274 | loop = GLib.MainLoop() 275 | Notifications() 276 | try: 277 | loop.run() 278 | except KeyboardInterrupt: 279 | loop.quit() 280 | -------------------------------------------------------------------------------- /.config/eww/scripts/python/utils.py: -------------------------------------------------------------------------------- 1 | # juminai @ github 2 | 3 | import json 4 | import os 5 | import gi 6 | import subprocess 7 | import sys 8 | 9 | gi.require_version("Gtk", "3.0") 10 | 11 | from gi.repository import Gtk 12 | 13 | CACHE = os.path.expandvars("$XDG_CACHE_HOME/eww") 14 | 15 | APPS_DIR = os.path.join(CACHE, "apps") 16 | NOTIFICATIONS_DIR = os.path.join(CACHE, "notifications") 17 | MPRIS_DIR = os.path.join(CACHE, "mpris") 18 | WEATHER_DIR = os.path.join(CACHE, "weather") 19 | COLORS_DIR = os.path.join(CACHE, "colors") 20 | TEMPLATES_DIR = os.path.join(COLORS_DIR, "templates") 21 | 22 | APPS_JSON = os.path.join(APPS_DIR, "apps.json") 23 | DOCK_JSON = os.path.join(APPS_DIR, "dock.json") 24 | FREQUENCY_JSON = os.path.join(APPS_DIR, "frequency.json") 25 | NOTIFICATIONS_JSON = os.path.join(NOTIFICATIONS_DIR, "notifications.json") 26 | CURRENT_JSON = os.path.join(COLORS_DIR, "current.json") 27 | WALLPAPER_PATH = os.path.join(COLORS_DIR, "wall.png") 28 | 29 | for file in [ 30 | CACHE, 31 | APPS_DIR, 32 | NOTIFICATIONS_DIR, 33 | MPRIS_DIR, 34 | WEATHER_DIR, 35 | ]: 36 | os.makedirs(file, exist_ok=True) 37 | 38 | def get_themed_icon(icon_name): 39 | theme = Gtk.IconTheme.get_default() 40 | 41 | if "Screenshot" in icon_name: 42 | icon_name = "com.github.maoschanz.DynamicWallpaperEditor" 43 | 44 | if "Color Picker" in icon_name: 45 | icon_name = "gcolor3" 46 | 47 | icon_name = [icon_name, icon_name.lower(), icon_name.capitalize()] 48 | 49 | for name in icon_name: 50 | icon = theme.lookup_icon(name.split()[0], 128, 0) 51 | if icon: 52 | return icon.get_filename() 53 | return None 54 | 55 | 56 | def get_file(name): 57 | file_paths = { 58 | "apps": APPS_JSON, 59 | "dock": DOCK_JSON, 60 | "frequency": FREQUENCY_JSON, 61 | "notifications": NOTIFICATIONS_JSON 62 | } 63 | 64 | return file_paths.get(name, None) 65 | 66 | 67 | def load(file): 68 | file = get_file(file) 69 | 70 | try: 71 | with open(file, "r") as log: 72 | return json.load(log) 73 | except (FileNotFoundError, json.JSONDecodeError): 74 | if file == NOTIFICATIONS_JSON: 75 | return { 76 | "dnd": False, 77 | "notifications": [], 78 | "popups": [] 79 | } 80 | 81 | if file == FREQUENCY_JSON: 82 | return {} 83 | 84 | if file in [DOCK_JSON, APPS_JSON]: 85 | return [] 86 | 87 | 88 | def update_eww(var, content): 89 | subprocess.run([ 90 | "eww", "update", f"{var}={json.dumps(content)}" 91 | ]) 92 | 93 | 94 | def write_file(file, content): 95 | file = get_file(file) 96 | 97 | with open(file, "w") as log: 98 | json.dump(content, log, indent=2) 99 | 100 | 101 | def generate(content): 102 | sys.stdout.write(json.dumps(content) + "\n") 103 | sys.stdout.flush() -------------------------------------------------------------------------------- /.config/eww/scripts/python/weather.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # juminai @ github 3 | 4 | import requests 5 | import json 6 | import time 7 | import os 8 | from utils import update_eww, WEATHER_DIR 9 | 10 | api_key = '56bfec39d45f284396f7e099cf4d150e' 11 | city_id = '3466537' 12 | units = 'metric' 13 | exclude = 'minute' 14 | 15 | 16 | def get_weather(city_id, api_key, units): 17 | url = f"http://api.openweathermap.org/data/2.5/weather?id={city_id}&appid={api_key}&units={units}" 18 | 19 | req = requests.get(url) 20 | data = req.json() 21 | 22 | city = data["name"] 23 | lon = data["coord"]["lon"] 24 | lat = data["coord"]["lat"] 25 | 26 | current = { 27 | "temp": data["main"]["temp"], 28 | "feels_like": data["main"]["feels_like"], 29 | "temp_min": data["main"]["temp_min"], 30 | "temp_max": data["main"]["temp_max"], 31 | "humidity": data["main"]["humidity"], 32 | "description": data["weather"][0]["description"], 33 | "icon": get_icon(data["weather"][0]["icon"]), 34 | "icon_image": get_icon_image(data["weather"][0]["icon"]), 35 | } 36 | 37 | url2 = f"https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&exclude={exclude}&appid={api_key}&units={units}" 38 | 39 | req2 = requests.get(url2) 40 | data2 = req2.json() 41 | 42 | daily_data = [] 43 | 44 | for i in data2["daily"][1:8]: 45 | min_temp = i["temp"]["min"] 46 | max_temp = i["temp"]["max"] 47 | description = i['weather'][0]['description'] 48 | icon = get_icon(i['weather'][0]['icon']) 49 | icon_image = get_icon_image(i['weather'][0]['icon']) 50 | 51 | dt = i['dt'] 52 | 53 | day = { 54 | "dt": dt, 55 | "temp_min": min_temp, 56 | "temp_max": max_temp, 57 | "description": description, 58 | "icon": icon, 59 | "icon_image": icon_image, 60 | } 61 | 62 | daily_data.append(day) 63 | 64 | hourly_data = [] 65 | 66 | for i in data2["hourly"][1:8]: 67 | temp = i["temp"] 68 | description = i['weather'][0]['description'] 69 | icon = get_icon(i['weather'][0]['icon']) 70 | icon_image = get_icon_image(i['weather'][0]['icon']) 71 | dt = i['dt'] 72 | 73 | hour = { 74 | "dt": dt, 75 | "temp": temp, 76 | "description": description, 77 | "icon": icon, 78 | "icon_image": icon_image, 79 | } 80 | 81 | hourly_data.append(hour) 82 | 83 | return { 84 | "city": city, 85 | "current": current, 86 | "daily": daily_data, 87 | "hourly": hourly_data 88 | } 89 | 90 | 91 | def get_icon_image(icon_code): 92 | icon_path = f"{WEATHER_DIR}/{icon_code}.png" 93 | 94 | if not os.path.exists(icon_path): 95 | base_url = "http://openweathermap.org/img/wn/" 96 | icon_url = f"{base_url}{icon_code}@4x.png" 97 | 98 | response = requests.get(icon_url) 99 | with open(icon_path, 'wb') as icon: 100 | icon.write(response.content) 101 | 102 | return icon_path 103 | 104 | 105 | def get_icon(icon_code): 106 | icon_map = { 107 | "01d": "", 108 | "01n": "", 109 | "02d": "", 110 | "02n": "", 111 | "03d": "", 112 | "03n": "", 113 | "04d": "", 114 | "04n": "", 115 | "09d": "", 116 | "09n": "", 117 | "10d": "", 118 | "10n": "", 119 | "11d": "", 120 | "11n": "", 121 | "13d": "", 122 | "13n": "", 123 | "40d": "", 124 | "40n": "", 125 | } 126 | return icon_map.get(icon_code, "") 127 | 128 | 129 | if __name__ == "__main__": 130 | while True: 131 | weather = get_weather(city_id, api_key, units) 132 | 133 | if weather: 134 | update_eww("weather", weather) 135 | time.sleep(1800) -------------------------------------------------------------------------------- /.config/eww/scripts/theme: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | INTERFACE="org.gnome.desktop.interface" 4 | THEME=$(gsettings get $INTERFACE color-scheme | tr -d "'") 5 | SCSS="$XDG_CONFIG_HOME/eww/scss/variables.scss" 6 | 7 | set_dark() { 8 | gsettings set $INTERFACE gtk-theme 'adw-gtk3-dark' 9 | gsettings set $INTERFACE color-scheme 'prefer-dark' 10 | gsettings set $INTERFACE icon-theme 'Papirus-Dark' 11 | } 12 | 13 | set_light() { 14 | gsettings set $INTERFACE gtk-theme 'adw-gtk3' 15 | gsettings set $INTERFACE color-scheme 'default' 16 | gsettings set $INTERFACE icon-theme 'Papirus-Light' 17 | } 18 | 19 | toggle() { 20 | if [[ $THEME == 'prefer-dark' ]]; then 21 | sed '1s/dark/light/' -i $SCSS 22 | eww update theme=light 23 | set_light 24 | else 25 | sed '1s/light/dark/' -i $SCSS 26 | eww update theme=dark 27 | set_dark 28 | fi 29 | python $XDG_CONFIG_HOME/eww/scripts/python/material-colors.py --toggle 30 | } 31 | 32 | get() { 33 | if [[ $THEME == prefer-dark ]]; then 34 | echo dark 35 | else 36 | echo light 37 | fi 38 | } 39 | 40 | if [[ $1 == 'toggle' ]]; then toggle; fi 41 | if [[ $1 == 'get' ]]; then get; fi 42 | -------------------------------------------------------------------------------- /.config/eww/scripts/volume: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | input_source=$(volume source | jq .input) 4 | 5 | output=$(pamixer --get-volume) 6 | output_mute=$(pamixer --get-mute) 7 | input=$(pamixer --source $input_source --get-volume) 8 | input_mute=$(pamixer --source $input_source --get-mute) 9 | 10 | echo '{"output": {"volume": '$output', "muted": "'$output_mute'"}, "input": {"volume": '$input', "muted": "'$input_mute'"}}' 11 | 12 | pactl subscribe | rg --line-buffered "on sink|on source" | while read -r _; do 13 | output=$(pamixer --get-volume) 14 | output_mute=$(pamixer --get-mute) 15 | input=$(pamixer --source $input_source --get-volume) 16 | input_mute=$(pamixer --source $input_source --get-mute) 17 | 18 | echo '{"output": {"volume": '$output', "muted": "'$output_mute'"}, "input": {"volume": '$input', "muted": "'$input_mute'"}}' 19 | done 20 | -------------------------------------------------------------------------------- /.config/eww/scss/common/button.scss: -------------------------------------------------------------------------------- 1 | @mixin button-active { 2 | box-shadow: inset 0 0 0 $border-width $border-color; 3 | background-image: $accent-gradient; 4 | 5 | label { 6 | color: $accent-fg; 7 | } 8 | } 9 | 10 | @mixin button($flat: false, $reactive: true, $focusable: true, $radius: $radius) { 11 | border-radius: $radius; 12 | color: $fg-color; 13 | 14 | @if $flat { 15 | background-color: transparent; 16 | background-image: none; 17 | box-shadow: none; 18 | } 19 | 20 | @else { 21 | background-color: $button-bg; 22 | box-shadow: inset 0 0 0 $border-width $border-color; 23 | } 24 | 25 | @if $reactive { 26 | @if $focusable { 27 | &:focus { 28 | box-shadow: inset 0 0 0 $border-width $accent; 29 | background-color: $hover; 30 | } 31 | } 32 | 33 | &:hover { 34 | box-shadow: inset 0 0 0 $border-width $border-color; 35 | background-color: $hover; 36 | } 37 | 38 | &:active, 39 | &.active { 40 | @include button-active; 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /.config/eww/scss/common/floating-widget.scss: -------------------------------------------------------------------------------- 1 | @mixin floating-widget($drop-shadow: true, $padding: 1rem) { 2 | @if $drop-shadow { 3 | box-shadow: 0 0 5px 0 $shadow, 4 | inset 0 0 0 $border-width $border-color; 5 | } @else { 6 | border: $border; 7 | } 8 | 9 | margin: $gaps; 10 | border-radius: $radius; 11 | background-color: $bg-color; 12 | padding: $padding; 13 | color: $fg-color; 14 | } -------------------------------------------------------------------------------- /.config/eww/scss/common/icon-image.scss: -------------------------------------------------------------------------------- 1 | @mixin image($size: 1.5rem, $cover: false) { 2 | min-width: $size; 3 | min-height: $size; 4 | background-repeat: no-repeat; 5 | background-position: center; 6 | 7 | @if $cover { 8 | background-size: cover; 9 | } 10 | 11 | @else { 12 | background-size: contain; 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /.config/eww/scss/common/scrollbar.scss: -------------------------------------------------------------------------------- 1 | @mixin scrollbar { 2 | scrollbar.vertical { 3 | transition: $transition; 4 | background: transparentize($fg-color, 0.95); 5 | border-radius: $radius; 6 | 7 | &:hover { 8 | background: transparentize($fg-color, 0.92); 9 | 10 | slider { 11 | background: transparentize($fg-color, 0.3); 12 | min-width: 0.5rem; 13 | } 14 | } 15 | } 16 | 17 | scrollbar.vertical slider { 18 | background-color: transparentize($fg-color, 0.5); 19 | border-radius: $radius; 20 | min-width: .4rem; 21 | min-height: 2rem; 22 | transition: $transition; 23 | } 24 | 25 | overshoot { 26 | &.top { 27 | background: transparentize($accent, 0.8); 28 | border-radius: 0 0 100% 100%; 29 | } 30 | 31 | &.bottom { 32 | background: transparentize($accent, 0.8); 33 | border-radius: 100% 100% 0 0; 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /.config/eww/scss/common/slider.scss: -------------------------------------------------------------------------------- 1 | @mixin slider($drop-shadow: true, $width: 0.4rem, $color: $accent, $gradient: $accent-gradient, $slider: true, $focusable: true, $radius: $radius) { 2 | trough { 3 | transition: $transition; 4 | border-radius: $radius; 5 | border: $border; 6 | background-color: $button-bg; 7 | min-height: $width; 8 | min-width: $width; 9 | 10 | highlight, 11 | progress { 12 | border-radius: $radius; 13 | background-image: $gradient; 14 | min-height: $width; 15 | min-width: $width; 16 | } 17 | } 18 | 19 | slider { 20 | box-shadow: none; 21 | background-color: transparent; 22 | border: $border-width solid transparent; 23 | transition: $transition; 24 | border-radius: $radius; 25 | min-height: $width; 26 | min-width: $width; 27 | margin: -$width; 28 | } 29 | 30 | &:hover trough { 31 | background-color: $hover; 32 | 33 | slider { 34 | @if $slider { 35 | background-color: $fg-color; 36 | @if $theme == 'light' { 37 | background-color: $bg-color; 38 | } 39 | border-color: $border-color; 40 | 41 | @if $drop-shadow { 42 | box-shadow: 0 0 3px 0 $shadow; 43 | } 44 | } 45 | } 46 | } 47 | 48 | @if $focusable { 49 | trough:focus { 50 | background-color: $hover; 51 | box-shadow: inset 0 0 0 $border-width $color; 52 | 53 | highlight, 54 | progress { 55 | background-color: transparentize($color, 0.3); 56 | } 57 | 58 | slider { 59 | @if $slider { 60 | background-color: darken($color, 10); 61 | box-shadow: inset 0 0 0 $border-width $accent; 62 | } 63 | } 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /.config/eww/scss/common/tooltip.scss: -------------------------------------------------------------------------------- 1 | tooltip { 2 | >*>* { 3 | background-color: $bg-color; 4 | border-radius: $button-radius; 5 | border: $border; 6 | color: $fg-color; 7 | padding: 5px; 8 | margin: 4px; 9 | box-shadow: 0 0 3px 0 $shadow; 10 | } 11 | } -------------------------------------------------------------------------------- /.config/eww/scss/common/unset.scss: -------------------------------------------------------------------------------- 1 | * { 2 | all: unset; 3 | transition: $transition; 4 | font-family: "SF Pro", "Font Awesome 6 Pro Solid"; 5 | } -------------------------------------------------------------------------------- /.config/eww/scss/common/widget.scss: -------------------------------------------------------------------------------- 1 | @mixin widget($padding: 1rem) { 2 | border-radius: $radius; 3 | background-color: $widget-bg; 4 | padding: $padding; 5 | color: $fg-color; 6 | border: $border; 7 | } -------------------------------------------------------------------------------- /.config/eww/scss/variables.scss: -------------------------------------------------------------------------------- 1 | $theme: dark; 2 | 3 | $fg-color: $onSurface; 4 | $bg-color: $surface; 5 | $accent: $primary; 6 | $accent-gradient: linear-gradient(to right, $accent, lighten($accent, 15%)); 7 | $accent-fg: $bg-color; 8 | 9 | $gaps: 8px; 10 | $transition: 250ms; 11 | $radius: 1rem; 12 | 13 | $hover: if($theme=='light', transparentize($accent, 0.6), transparentize($accent, 0.8)); 14 | 15 | $widget-bg: if($theme=='light', transparentize($accent, 0.8), transparentize($accent, 0.9)); 16 | 17 | $border-width: 1px; 18 | $border-color: if($theme=='light', rgba(black, 0.03), rgba(white, 0.03)); 19 | $border: $border-width solid $border-color; 20 | 21 | $shadow: rgba($shadow, 0.5); 22 | $text-shadow: 2px 2px 2px $shadow; 23 | 24 | $button-radius: $radius*0.6; 25 | $button-bg: $widget-bg; 26 | -------------------------------------------------------------------------------- /.config/eww/scss/widgets/application.scss: -------------------------------------------------------------------------------- 1 | @mixin application($dock: false) { 2 | button { 3 | @include button; 4 | 5 | @if $dock { 6 | @include button($flat: true); 7 | padding: .5rem; 8 | } 9 | 10 | .icon { 11 | @include image($size: 4rem); 12 | 13 | @if $dock { 14 | @include image($size: 3.5rem); 15 | } 16 | } 17 | 18 | .name { 19 | font-size: 1.1rem; 20 | font-weight: 500; 21 | } 22 | 23 | .description { 24 | color: transparentize($fg-color, 0.2); 25 | } 26 | 27 | } 28 | } -------------------------------------------------------------------------------- /.config/eww/scss/widgets/calendar.scss: -------------------------------------------------------------------------------- 1 | @mixin calendar { 2 | font-size: 1.1rem; 3 | font-weight: 500; 4 | @include widget($padding: 1rem 1rem 0 1rem); 5 | 6 | calendar { 7 | padding: 0.4rem; 8 | 9 | &:selected { 10 | box-shadow: inset 0 -8px 0 0 transparentize($accent, 0.5), 11 | inset 0 0 0 1px $accent; 12 | border-radius: $button-radius; 13 | } 14 | 15 | &.highlight, 16 | &.header { 17 | color: $accent; 18 | } 19 | 20 | &.button { 21 | @include button($flat: true); 22 | color: $accent; 23 | } 24 | 25 | &:indeterminate { 26 | color: transparentize($fg-color, 0.75); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /.config/eww/scss/widgets/date.scss: -------------------------------------------------------------------------------- 1 | @mixin date($size, $tiny: false) { 2 | color: $fg-color; 3 | 4 | .clock { 5 | .time { 6 | font-size: $size; 7 | font-weight: bold; 8 | } 9 | 10 | .timebox { 11 | margin: $size*0.1; 12 | min-width: $size*0.15; 13 | min-height: $size*0.15; 14 | border-radius: 100%; 15 | 16 | box { 17 | box-shadow: $text-shadow; 18 | background-color: $fg-color; 19 | } 20 | 21 | @if $tiny { 22 | margin: $size*0.1 $size*0.15; 23 | 24 | box { 25 | box-shadow: none; 26 | } 27 | } 28 | } 29 | } 30 | 31 | &.active { 32 | .clock { 33 | .timebox { 34 | box { 35 | background-color: $bg-color; 36 | } 37 | } 38 | } 39 | } 40 | 41 | .today { 42 | font-size: $size * 0.25; 43 | font-weight: 500; 44 | 45 | @if $tiny { 46 | font-size: $size * 0.85; 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /.config/eww/scss/widgets/media.scss: -------------------------------------------------------------------------------- 1 | @mixin player { 2 | .artwork { 3 | @include image($cover: true); 4 | border-radius: $radius; 5 | min-width: 6rem; 6 | min-height: 6rem; 7 | } 8 | 9 | .metadata { 10 | .title { 11 | font-size: 1.1rem; 12 | font-weight: bold; 13 | } 14 | 15 | .artist, 16 | .album { 17 | font-size: 1rem; 18 | } 19 | } 20 | 21 | .progress { 22 | @include slider; 23 | margin: .5rem 0; 24 | } 25 | 26 | .position { 27 | font-size: 1rem; 28 | font-weight: 500; 29 | } 30 | 31 | .icon { 32 | @include image; 33 | margin-right: -.5rem; 34 | } 35 | 36 | .time { 37 | font-size: .9rem; 38 | font-weight: 500; 39 | } 40 | 41 | .controls { 42 | .loop, 43 | .shuffle { 44 | font-size: 1.1rem; 45 | } 46 | 47 | .toggle { 48 | font-size: 1.5rem; 49 | } 50 | 51 | .previous, 52 | .next{ 53 | font-size: 1.3rem; 54 | } 55 | 56 | .disabled { 57 | color: transparentize($fg-color, 0.5); 58 | } 59 | } 60 | 61 | .volume { 62 | padding: 1rem; 63 | 64 | .volume-scale { 65 | @include slider; 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /.config/eww/scss/widgets/notification-center.scss: -------------------------------------------------------------------------------- 1 | @mixin notification-center { 2 | min-width: 30rem; 3 | 4 | .header { 5 | font-size: 1.5rem; 6 | margin: 0 .5rem .5rem; 7 | 8 | .label { 9 | font-weight: bold; 10 | } 11 | 12 | .clear { 13 | @include button($flat: true); 14 | padding: .6rem .8rem; 15 | border-radius: 100%; 16 | font-size: 1.2rem; 17 | } 18 | } 19 | 20 | .notification-list { 21 | @include scrollbar; 22 | 23 | .notification { 24 | @include notification; 25 | 26 | .content { 27 | @include widget; 28 | } 29 | } 30 | 31 | .empty { 32 | .icon { 33 | font-family: 'Font Awesome 6 Duotone Solid'; 34 | font-size: 8rem; 35 | color: $accent; 36 | } 37 | 38 | .label { 39 | font-size: 1.5rem; 40 | font-weight: bold; 41 | } 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /.config/eww/scss/widgets/notification.scss: -------------------------------------------------------------------------------- 1 | @mixin notification { 2 | .content { 3 | &.critical { 4 | background-color: $tertiaryContainer; 5 | } 6 | box { 7 | .image { 8 | @include image($size: 4rem); 9 | border-radius: $radius; 10 | 11 | &.Screenshot { 12 | @include image($size: 8rem, $cover: true); 13 | } 14 | 15 | &.Spotify, 16 | &.Color, 17 | &.Cider { 18 | @include image($size: 6rem); 19 | } 20 | } 21 | 22 | .summary { 23 | font-weight: bold; 24 | } 25 | 26 | .app-icon { 27 | @include image($size: 1.3rem); 28 | } 29 | 30 | .time { 31 | font-size: .9rem; 32 | font-weight: 400; 33 | color: transparentize($fg-color, 0.1); 34 | margin-top: 2px; 35 | } 36 | 37 | .close { 38 | min-width: 1.4em; 39 | min-height: 1.4em; 40 | border-radius: $radius/2; 41 | } 42 | } 43 | 44 | .actions { 45 | margin-top: .5rem; 46 | 47 | .action { 48 | @include button($radius: $button-radius); 49 | font-weight: 500; 50 | padding: 0.4rem; 51 | } 52 | } 53 | } 54 | 55 | &:hover { 56 | .content { 57 | .close { 58 | @include button($radius: $radius/2); 59 | transition: 0ms; 60 | background-color: transparentize($accent, 0.6); 61 | 62 | &:hover { 63 | background-color: transparentize($accent, 0.1); 64 | 65 | @if $theme=='dark' { 66 | color: $bg-color; 67 | } 68 | } 69 | 70 | &:active { 71 | background-color: $accent; 72 | } 73 | } 74 | } 75 | } 76 | } -------------------------------------------------------------------------------- /.config/eww/scss/widgets/separator.scss: -------------------------------------------------------------------------------- 1 | @mixin separator($spacing: 5px) { 2 | background-color: transparentize($fg-color, 0.8); 3 | min-width: 4px; 4 | min-height: 4px; 5 | border-radius: $radius; 6 | margin: 0 $spacing; 7 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/bar.scss: -------------------------------------------------------------------------------- 1 | @mixin bar-button { 2 | @include button($flat: true); 3 | padding: 0 6px; 4 | border-radius: $button-radius; 5 | } 6 | 7 | .bar { 8 | .widget { 9 | background-color: $bg-color; 10 | padding: 5px 10px; 11 | margin-bottom: $gaps; 12 | box-shadow: 0 0 5px 0 $shadow; 13 | font-weight: 500; 14 | 15 | .separator { 16 | @include separator; 17 | } 18 | 19 | .workspaces { 20 | @include bar-button; 21 | &:active { 22 | background-image: none; 23 | } 24 | 25 | .indicator { 26 | transition: $transition/2; 27 | border-radius: $radius; 28 | 29 | &.occupied { 30 | background: lighten($bg-color, 50); 31 | min-width: 10px; 32 | min-height: 10px; 33 | 34 | @if $theme =='light' { 35 | background: transparentize($fg-color, 0.3); 36 | } 37 | } 38 | 39 | &.active { 40 | background: $accent; 41 | min-width: 24px; 42 | min-height: 14px; 43 | border-radius: $radius/3; 44 | } 45 | 46 | &.empty { 47 | background: transparentize($fg-color, 0.8); 48 | min-width: 8px; 49 | min-height: 8px; 50 | } 51 | 52 | &:hover { 53 | &.empty { 54 | background: transparentize($fg-color, 0.6); 55 | } 56 | } 57 | } 58 | } 59 | 60 | .active-client { 61 | @include bar-button; 62 | 63 | .icon { 64 | @include image($size: 20px); 65 | } 66 | 67 | .name { 68 | font-size: 1rem; 69 | } 70 | } 71 | 72 | .notification-bar { 73 | @include bar-button; 74 | 75 | .icon { 76 | font-family: 'Font Awesome 6 Duotone Solid'; 77 | font-size: 1.2rem; 78 | } 79 | 80 | .summary { 81 | margin-right: 5px 82 | } 83 | } 84 | 85 | .date-bar { 86 | @include bar-button; 87 | @include date($size: 1.2rem, $tiny: true); 88 | } 89 | 90 | .media-bar { 91 | @include bar-button; 92 | 93 | .icon { 94 | @include image($size: 20px); 95 | } 96 | 97 | .title { 98 | margin-right: 5px; 99 | } 100 | } 101 | 102 | .utils-bar { 103 | .caret { 104 | @include bar-button; 105 | } 106 | 107 | .buttons { 108 | margin-right: 5px; 109 | 110 | button { 111 | @include bar-button; 112 | } 113 | } 114 | } 115 | 116 | .system-indicators { 117 | @include bar-button; 118 | font-size: 1.1rem; 119 | } 120 | 121 | .power-button { 122 | @include bar-button; 123 | font-size: 1.2rem; 124 | color: $error; 125 | } 126 | } 127 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/corners.scss: -------------------------------------------------------------------------------- 1 | .corner { 2 | background-color: transparent; 3 | padding: 15px; 4 | border-radius: 100%; 5 | 6 | &.left { 7 | box-shadow: -15px -15px 0 0 $bg-color; 8 | } 9 | 10 | &.right { 11 | box-shadow: 15px -15px 0 0 $bg-color; 12 | } 13 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/desktop.scss: -------------------------------------------------------------------------------- 1 | .desktop { 2 | .info { 3 | text-shadow: $text-shadow; 4 | @include date($size: 10rem); 5 | 6 | label { 7 | color: $fg-color; 8 | } 9 | 10 | .clock { 11 | .timebox { 12 | 13 | box { 14 | background-color: $fg-color; 15 | } 16 | } 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/dock.scss: -------------------------------------------------------------------------------- 1 | .dock { 2 | .widget { 3 | @include floating-widget($padding: 0.5rem); 4 | 5 | .launcher-button { 6 | @include button($flat: true); 7 | 8 | label { 9 | font-size: 2rem; 10 | text-shadow: $text-shadow; 11 | padding: 1rem; 12 | } 13 | } 14 | 15 | .indicator { 16 | padding: 2px; 17 | border-radius: $radius; 18 | 19 | &.open { 20 | background-color: transparentize($fg-color, 0.75); 21 | margin: 2px 25px; 22 | } 23 | 24 | &.active { 25 | background-color: $accent; 26 | margin: 2px 20px; 27 | } 28 | } 29 | 30 | .div { 31 | background: transparentize($fg-color, 0.8); 32 | padding: 1px; 33 | border-radius: $radius; 34 | margin: .5rem; 35 | } 36 | 37 | .favorite, 38 | .impostor { 39 | .application { 40 | @include application($dock: true); 41 | } 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/info-center.scss: -------------------------------------------------------------------------------- 1 | .info-center { 2 | .widget { 3 | @include floating-widget; 4 | 5 | .notification-center { 6 | @include notification-center; 7 | } 8 | 9 | .calendar { 10 | @include calendar; 11 | } 12 | 13 | .date { 14 | @include date($size: 5rem); 15 | margin-bottom: 5px; 16 | } 17 | 18 | .separator { 19 | background-color: transparentize($fg-color, 0.92); 20 | min-width: 2px; 21 | margin: 0 10px 0 2px; 22 | } 23 | 24 | .weather { 25 | @include widget; 26 | 27 | .current { 28 | .icon { 29 | font-size: 3rem; 30 | text-shadow: $text-shadow; 31 | margin-right: 10px; 32 | 33 | .clouds { 34 | color: white; 35 | } 36 | @include image($size: 6rem); 37 | margin-right: 5rem; 38 | } 39 | 40 | .temp { 41 | font-size: 3rem; 42 | font-weight: bold; 43 | 44 | &.celcius { 45 | font-size: 2rem; 46 | } 47 | 48 | } 49 | 50 | .description { 51 | font-size: 1.2rem; 52 | font-weight: bold; 53 | } 54 | 55 | .feels-like, 56 | .humidity { 57 | color: transparentize($fg-color, 0.25); 58 | font-size: 13px; 59 | font-weight: 500; 60 | } 61 | } 62 | 63 | .forecast { 64 | .i { 65 | .dt { 66 | color: transparentize($fg-color, 0.25); 67 | font-size: 13px; 68 | font-weight: 500; 69 | margin-bottom: -3px; 70 | } 71 | 72 | .icon { 73 | @include image($size: 2.5rem); 74 | } 75 | 76 | .temp { 77 | font-weight: 500; 78 | } 79 | } 80 | } 81 | } 82 | } 83 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/launcher.scss: -------------------------------------------------------------------------------- 1 | .launcher { 2 | min-width: 38rem; 3 | min-height: 42rem; 4 | 5 | .widget { 6 | @include floating-widget; 7 | 8 | .search { 9 | margin: .5rem 1rem 1rem; 10 | @include button; 11 | 12 | .icon { 13 | font-size: 1.2rem; 14 | margin-left: 15px; 15 | } 16 | 17 | .input { 18 | padding: 1rem; 19 | font-weight: 500; 20 | caret-color: $fg-color; 21 | } 22 | } 23 | 24 | .app-list { 25 | @include scrollbar; 26 | margin: 0 .5rem; 27 | .application { 28 | @include application($dock: true); 29 | } 30 | .div { 31 | padding: 1px; 32 | border-radius: $radius; 33 | background-color: transparentize($fg-color, 0.94); 34 | } 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/menu.scss: -------------------------------------------------------------------------------- 1 | .menu { 2 | .widget { 3 | @include floating-widget(); 4 | 5 | .profile { 6 | &.picture { 7 | background-image: url('https://github.com/juminai.png'); 8 | @include image($size: 6rem); 9 | border-radius: $radius; 10 | } 11 | 12 | &.info { 13 | // @include widget; 14 | 15 | .name { 16 | font-size: 1.5rem; 17 | font-weight: bold; 18 | } 19 | 20 | .uptime { 21 | font-size: 1.1rem; 22 | } 23 | 24 | .power { 25 | @include powermenu-button($size: 1.5rem); 26 | } 27 | } 28 | } 29 | 30 | .utils { 31 | @include widget; 32 | 33 | button { 34 | @include button($radius: 100%); 35 | font-size: 1.6rem; 36 | } 37 | 38 | .theme, 39 | .nightlight, 40 | .powerprofile, 41 | .dnd { 42 | 43 | &.dark, 44 | &.true, 45 | &.power-saver { 46 | @include button-active; 47 | } 48 | } 49 | } 50 | 51 | .system-info { 52 | .progress { 53 | @include widget; 54 | padding: 0.5rem; 55 | 56 | circular-progress { 57 | background-color: transparentize($fg-color, 0.9); 58 | 59 | &.ram, 60 | &.disk, 61 | &.temp, 62 | &.cpu { 63 | color: $accent; 64 | } 65 | 66 | &.cpu { 67 | label { 68 | margin-left: 1px; 69 | } 70 | } 71 | 72 | &.temp { 73 | 74 | label { 75 | margin-left: 1px; 76 | } 77 | } 78 | } 79 | } 80 | 81 | .icon { 82 | font-size: 1.5rem; 83 | padding: 1.5rem; 84 | } 85 | } 86 | 87 | .network { 88 | font-weight: 500; 89 | 90 | .indicator { 91 | @include widget; 92 | 93 | .icon { 94 | font-size: 1.2rem; 95 | 96 | &.down { 97 | color: transparentize($fg-color, 0.5) 98 | } 99 | } 100 | } 101 | 102 | .metric { 103 | min-width: 6rem; 104 | @include widget; 105 | 106 | .icon { 107 | font-size: 1.1rem; 108 | } 109 | } 110 | } 111 | 112 | .theme-selector { 113 | @include button; 114 | padding: 0 1rem; 115 | font-weight: 500; 116 | 117 | .icon { 118 | font-size: 1.2rem 119 | } 120 | 121 | .caret { 122 | min-width: 1rem; 123 | } 124 | } 125 | 126 | .themes { 127 | @include widget; 128 | font-size: 1.1rem; 129 | margin-top: 1rem; 130 | 131 | .separator { 132 | min-width: 1px; 133 | background-color: $hover; 134 | } 135 | 136 | button { 137 | @include button($flat: true, $radius: $button-radius); 138 | padding: .5rem; 139 | } 140 | 141 | .icon { 142 | font-size: 1.2rem; 143 | } 144 | } 145 | 146 | .sliders { 147 | @include widget($padding: .5rem); 148 | 149 | .icon { 150 | font-size: 1.3rem; 151 | min-width: 2rem; 152 | padding: 0.5rem; 153 | } 154 | 155 | .true { 156 | color: transparentize($fg-color, 0.5); 157 | } 158 | 159 | .scale { 160 | @include slider($width: 0.8rem); 161 | margin-left: 5px; 162 | } 163 | 164 | .launch { 165 | @include button($flat: true); 166 | font-size: 1.1rem; 167 | margin: 0 .5rem; 168 | padding: .5rem; 169 | } 170 | } 171 | 172 | .media-list { 173 | @include scrollbar; 174 | .player { 175 | @include player; 176 | @include widget($padding: .5rem 1rem .5rem .5rem); 177 | } 178 | } 179 | } 180 | } 181 | 182 | .media-volume { 183 | @include widget($padding: .5rem .4rem .5rem 1rem); 184 | margin: .5rem; 185 | 186 | .player-scale { 187 | @include slider($width: 0.4rem); 188 | margin-left: 5px; 189 | } 190 | 191 | .player-icon { 192 | @include image 193 | } 194 | 195 | .top { 196 | font-size: 1.1rem; 197 | .separator { 198 | min-width: 1px; 199 | background-color: $hover; 200 | } 201 | } 202 | 203 | .percent { 204 | font-weight: 500; 205 | 206 | } 207 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/notifications.scss: -------------------------------------------------------------------------------- 1 | .notifications { 2 | .notification { 3 | @include notification; 4 | .content { 5 | @include floating-widget; 6 | min-width: 28rem; 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/overview.scss: -------------------------------------------------------------------------------- 1 | .overview { 2 | .widget { 3 | @include floating-widget; 4 | 5 | .workspace { 6 | @include button($radius: $button-radius); 7 | 8 | .indicator { 9 | padding: 2px; 10 | margin: .4rem 3rem; 11 | background-color: $accent; 12 | border-radius: $radius; 13 | } 14 | 15 | .window { 16 | @include button($radius: $button-radius); 17 | } 18 | 19 | .icon { 20 | @include image($size: 2.2rem) 21 | } 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/powermenu.scss: -------------------------------------------------------------------------------- 1 | @mixin powermenu-button($size: 5rem) { 2 | 3 | button{ 4 | @include button; 5 | color: $accent; 6 | padding: $size/2; 7 | font-size: $size; 8 | } 9 | 10 | .poweroff { 11 | color: $error; 12 | } 13 | } 14 | 15 | .powermenu { 16 | background-color: transparentize($bg-color, 0.7); 17 | 18 | .widget { 19 | @include floating-widget; 20 | @include powermenu-button; 21 | } 22 | } -------------------------------------------------------------------------------- /.config/eww/scss/windows/volume.scss: -------------------------------------------------------------------------------- 1 | .vol { 2 | @include floating-widget; 3 | border-radius: $radius*1.15; 4 | padding: .2rem; 5 | 6 | label { 7 | color: lighten($bg-color, 10%); 8 | 9 | @if $theme =="light" { 10 | color: darken($bg-color, 10%); 11 | } 12 | 13 | font-size: 1.6rem; 14 | margin: 0 .25rem 1rem 0; 15 | text-shadow: $text-shadow; 16 | } 17 | 18 | .scale { 19 | @include slider($width: 3rem, $slider: false); 20 | min-height: 15rem; 21 | } 22 | } -------------------------------------------------------------------------------- /.config/eww/yuck/setup.yuck: -------------------------------------------------------------------------------- 1 | (defwindow bar 2 | :monitor 0 3 | :stacking "bg" 4 | :exclusive false 5 | :geometry (geometry 6 | :width "100%" 7 | :height "50px" 8 | :anchor "top center") 9 | (bar) 10 | ) 11 | 12 | (defwindow corner-left 13 | :stacking "fg" 14 | :monitor 0 15 | :geometry (geometry 16 | :y "42px" 17 | :anchor "top left") 18 | (box :class "corner left") 19 | ) 20 | 21 | (defwindow corner-right 22 | :stacking "fg" 23 | :monitor 0 24 | :geometry (geometry 25 | :y "42px" 26 | :anchor "top right") 27 | (box :class "corner right") 28 | ) 29 | 30 | (defwindow notifications 31 | :monitor 0 32 | :stacking "fg" 33 | :geometry (geometry 34 | :y "42px" 35 | :height "5px" 36 | :anchor "top center") 37 | (notifications) 38 | ) 39 | 40 | (defwindow menu 41 | :monitor 0 42 | :stacking "fg" 43 | :namespace "eww_menu" 44 | :geometry (geometry 45 | :y "42px" 46 | :height "5px" 47 | :anchor "top right") 48 | (menu) 49 | ) 50 | 51 | (defwindow info-center 52 | :monitor 0 53 | :stacking "fg" 54 | :geometry (geometry 55 | :y "42px" 56 | :height "5px" 57 | :anchor "top center") 58 | (info-center) 59 | ) 60 | 61 | (defwindow launcher 62 | :monitor 0 63 | :stacking "overlay" 64 | :focusable true 65 | :geometry (geometry 66 | :anchor "center") 67 | (box 68 | (eventbox 69 | :onclick "actions launcher" 70 | (launcher) 71 | ) 72 | ) 73 | ) 74 | 75 | (defwindow volume 76 | :monitor 0 77 | :stacking "overlay" 78 | :geometry (geometry 79 | :width "5px" 80 | :anchor "right center") 81 | (volume) 82 | ) 83 | 84 | (defwindow overview 85 | :monitor 0 86 | :stacking "overlay" 87 | :geometry (geometry 88 | :anchor "center") 89 | (overview) 90 | ) 91 | 92 | (defwindow dock 93 | :monitor 0 94 | :stacking "fg" 95 | :geometry (geometry 96 | :height "5px" 97 | :anchor "bottom center") 98 | (dock) 99 | ) 100 | 101 | (defwindow powermenu 102 | :monitor 0 103 | :stacking "overlay" 104 | :namespace "eww_powermenu" 105 | :focusable true 106 | :geometry (geometry 107 | :width "100%" 108 | :height "100%" 109 | :anchor "center") 110 | (box 111 | (eventbox 112 | :onclick "eww open --toggle powermenu" 113 | (powermenu) 114 | ) 115 | ) 116 | ) 117 | 118 | (defwindow desktop 119 | :monitor 0 120 | :stacking "bg" 121 | :geometry (geometry 122 | :anchor "center") 123 | (desktop) 124 | ) 125 | -------------------------------------------------------------------------------- /.config/eww/yuck/widgets.yuck: -------------------------------------------------------------------------------- 1 | (include "yuck/widgets/application.yuck") 2 | (include "yuck/widgets/bar.yuck") 3 | (include "yuck/widgets/clock.yuck") 4 | (include "yuck/widgets/info-center.yuck") 5 | (include "yuck/widgets/media.yuck") 6 | (include "yuck/widgets/menu.yuck") 7 | (include "yuck/widgets/notification-center.yuck") 8 | (include "yuck/widgets/notification.yuck") 9 | (include "yuck/widgets/overview.yuck") 10 | (include "yuck/widgets/separator.yuck") -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/application.yuck: -------------------------------------------------------------------------------- 1 | (defwidget application [app simple] 2 | (eventbox 3 | :class "application" 4 | :cursor "pointer" 5 | :tooltip {simple ? app.name : ""} 6 | (overlay 7 | (button 8 | :onclick { 9 | app.address != "null" && simple ? 10 | "scripts/hyprland window ${app.address}" : 11 | !simple ? "actions launcher open ${app.id}" : "actions launch-app ${app.id}" 12 | } 13 | :onrightclick "scripts/apps add ${app.id}" 14 | :onmiddleclick "scripts/hyprland close ${app.address}" 15 | (box 16 | :space-evenly false 17 | :spacing 10 18 | (box 19 | :class "icon" 20 | :style "background-image: url('${app.icon}');" 21 | :halign "center" 22 | :valign "center" 23 | ) 24 | (box 25 | :visible {!simple} 26 | :orientation "v" 27 | :space-evenly false 28 | :spacing 5 29 | :valign {app.description != "null" ? "start" : "center"} 30 | :halign "start" 31 | (label :class "name" :text {app.name} :halign "start") 32 | (label 33 | :visible {app.description != "null"} 34 | :class "description" 35 | :text {app.description} 36 | :halign "start" 37 | :wrap true 38 | :xalign 0 39 | ) 40 | ) 41 | ) 42 | ) 43 | (box 44 | :class "indicator ${app.address == active.address ? "active" : app.address != "null" ? "open" : ""}" 45 | :valign "end" 46 | :visible {app.address != "null" && simple} 47 | ) 48 | ) 49 | ) 50 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/bar.yuck: -------------------------------------------------------------------------------- 1 | (defwidget workspaces [] 2 | (button 3 | :class "workspaces" 4 | (box 5 | :space-evenly false 6 | :spacing 7 7 | (for workspace in workspaces 8 | (eventbox 9 | :cursor "pointer" 10 | :halign "center" 11 | :valign "center" 12 | (button 13 | :onclick "scripts/hyprland workspace ${workspace.id}" 14 | :class "indicator ${workspace.id == active.workspace ? "active" : arraylength(workspace.windows) > 0 ? "occupied" : "empty"}" 15 | ) 16 | ) 17 | ) 18 | ) 19 | ) 20 | ) 21 | 22 | (defwidget active-client [] 23 | (button 24 | :class "active-client" 25 | :onclick "eww open --toggle overview" 26 | (box 27 | :class "app" 28 | :space-evenly false 29 | :spacing 5 30 | (box 31 | :class "icon ${active.class}" 32 | :style "background-image: url('${active.icon}')" 33 | :visible {active.icon != "null"} 34 | :halign "start" 35 | ) 36 | (label 37 | :class "name" 38 | :text {active.class != "null" ? active.class : "Desktop ${active.workspace}"} 39 | :limit-width 20 40 | ) 41 | (label :text {apps[0].id} :visible false) 42 | ) 43 | ) 44 | ) 45 | 46 | (defwidget notification-bar [] 47 | (eventbox 48 | :onhover "eww update notification_rev=true" 49 | :onhoverlost "eww update notification_rev=false" 50 | (button 51 | :class "notification-bar" 52 | :onclick "actions info-center" 53 | :tooltip "${arraylength(notifications.notifications)} ${arraylength(notifications.notifications) == 1 ? "notification" : "notifications"}" 54 | :visible {arraylength(notifications.notifications) > 0} 55 | (box 56 | :space-evenly false 57 | (revealer 58 | :transition "slideright" 59 | :reveal {notification_rev || arraylength(notifications.popups) > 0} 60 | :duration duration 61 | (label 62 | :class "summary" 63 | :visible {arraylength(notifications.notifications) > 0} 64 | :text {notifications.notifications[0].summary} 65 | :limit-width 25 66 | ) 67 | ) 68 | (label 69 | :class "icon" 70 | :text "" 71 | ) 72 | ) 73 | ) 74 | ) 75 | ) 76 | 77 | (defwidget date-bar [] 78 | (button 79 | :class "date-bar ${info-center_rev ? "active" : ""}" 80 | :onclick "actions info-center" 81 | (box 82 | :space-evenly false 83 | :spacing 5 84 | (clock :name "clock-bar") 85 | (label :text "-") 86 | (label 87 | :class "today" 88 | :text {formattime(EWW_TIME, "%a, %b %d", "America/Sao_Paulo")} 89 | ) 90 | ) 91 | ) 92 | ) 93 | 94 | (defwidget media-bar [] 95 | (eventbox 96 | :onhover "eww update media-bar_rev=true" 97 | :onhoverlost "eww update media-bar_rev=false" 98 | :onscroll "echo {} | sed -e 's/up/next/g' -e 's/down/previous/g' | xargs playerctl -p ${mpris[0].name}" 99 | (button 100 | :class "media-bar" 101 | :onclick "playerctl -p ${mpris[0].name} play-pause" 102 | :visible {arraylength(mpris) > 0} 103 | (box 104 | :space-evenly false 105 | (label 106 | :text {positions[mpris[0].name].position} 107 | :visible false 108 | ) 109 | (revealer 110 | :transition "slideleft" 111 | :duration duration 112 | :reveal media-bar_rev 113 | (label 114 | :class "title" 115 | :text "${mpris[0].artist} - ${mpris[0].title}" 116 | :limit-width 40 117 | ) 118 | ) 119 | (box 120 | :class "icon ${mpris[0].name}" 121 | :style "background-image: url('${mpris[0].icon}')" 122 | ) 123 | ) 124 | ) 125 | ) 126 | ) 127 | 128 | (defwidget utils-bar [] 129 | (box 130 | :class "utils-bar" 131 | (box 132 | :space-evenly false 133 | (revealer 134 | :transition "slideleft" 135 | :duration duration 136 | :reveal utils-bar_rev 137 | (box 138 | :class "buttons" 139 | :spacing 5 140 | (systray 141 | :spacing 10 142 | :icon-size 20 143 | :prepend-new true 144 | ) 145 | (utils-button 146 | :css "colorpicker" 147 | :icon "" 148 | :action "actions colorpicker" 149 | :wait "300ms" 150 | :tip "Color Picker" 151 | ) 152 | (utils-button 153 | :css "screenshot" 154 | :icon "" 155 | :action "actions screenshot full" 156 | :wait "300ms" 157 | :tip "Screenshot Full" 158 | ) 159 | (utils-button 160 | :css "screenshot" 161 | :icon "" 162 | :action "actions screenshot crop" 163 | :wait "300ms" 164 | :tip "Screenshot Crop" 165 | ) 166 | (utils-button 167 | :css "update" 168 | :icon "" 169 | :action "actions update" 170 | :wait "300ms" 171 | :tip "Update" 172 | ) 173 | ) 174 | ) 175 | (button 176 | :class "caret" 177 | :onclick "eww update utils-bar_rev=${!utils-bar_rev}" 178 | {utils-bar_rev ? "" : ""} 179 | ) 180 | ) 181 | ) 182 | ) 183 | 184 | (defwidget dnd-indicator [] 185 | (box 186 | :class "dnd-indicator" 187 | :visible {notifications.dnd} 188 | {icons.bell[notifications.dnd]} 189 | ) 190 | ) 191 | 192 | (defwidget nightlight-indicator [] 193 | (box 194 | :class "nightlight-indicator" 195 | :visible {nightlight} 196 | {icons.light[nightlight]} 197 | ) 198 | ) 199 | 200 | (defwidget network-indicator [] 201 | (box 202 | :class "network-indicator" 203 | {icons.network[network.status]} 204 | ) 205 | ) 206 | 207 | (defwidget volume-indicator [] 208 | (eventbox 209 | :onscroll "volume {}" 210 | :cursor "pointer" 211 | :valign "center" 212 | (button 213 | :class "volume-indicator ${audio.output.muted}" 214 | :onclick "volume toggle" 215 | :tooltip "${audio.output.volume}%" 216 | {icons.volume[audio.output.muted]} 217 | ) 218 | ) 219 | ) 220 | 221 | (defwidget mic-indicator [] 222 | (box 223 | :class "mic-indicator" 224 | :visible {audio.input.muted} 225 | {icons.microphone[audio.input.muted]} 226 | ) 227 | ) 228 | 229 | (defwidget power-button [] 230 | (eventbox 231 | :cursor "pointer" 232 | (button 233 | :class "power-button" 234 | :onclick "eww open --toggle powermenu" 235 | "" 236 | ) 237 | ) 238 | ) 239 | -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/clock.yuck: -------------------------------------------------------------------------------- 1 | (defwidget clock [] 2 | (box 3 | :class "clock" 4 | :space-evenly false 5 | :halign "center" 6 | (label 7 | :class "time" 8 | :text {formattime(EWW_TIME, "%H", "America/Sao_Paulo")} 9 | ) 10 | (box 11 | :class "timebox" 12 | :valign "center" 13 | :orientation "v" 14 | (box :class "timebox purple" :halign "center" :valign "center") 15 | (box :class "timebox green" :halign "center" :valign "center") 16 | (box :class "timebox yellow" :halign "center" :valign "center") 17 | ) 18 | (label 19 | :class "time" 20 | :text {formattime(EWW_TIME, "%M", "America/Sao_Paulo")} 21 | ) 22 | ) 23 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/info-center.yuck: -------------------------------------------------------------------------------- 1 | (defwidget calendar-info-center [] 2 | (box 3 | :class "calendar" 4 | (calendar 5 | :day {date.day} 6 | :month {date.month} 7 | :year {date.year} 8 | ) 9 | ) 10 | ) 11 | 12 | (defwidget clock-info-center [] 13 | (box 14 | :class "date" 15 | :space-evenly false 16 | :orientation "v" 17 | (clock) 18 | (label :class "today" 19 | :text {formattime(EWW_TIME, "%A, %B %d", "America/Sao_Paulo")} 20 | ) 21 | ) 22 | ) 23 | 24 | (defwidget grau [] 25 | (label :class "celcius" :text "°") 26 | ) 27 | 28 | (defwidget weather [] 29 | (box 30 | :class "weather" 31 | :space-evenly false 32 | :orientation "v" 33 | :spacing 8 34 | :hexpand true 35 | (box 36 | :class "current" 37 | :space-evenly false 38 | :spacing 10 39 | (box 40 | :class "temp" 41 | :space-evenly false 42 | :valign "end" 43 | (label :text {round(weather.current.temp, 0)}) 44 | (label 45 | :class "temp celcius" 46 | :text "°" 47 | :valign "start" 48 | ) 49 | ) 50 | (box 51 | :orientation "v" 52 | :space-evenly false 53 | (label 54 | :class "description" 55 | :text {weather.current.description} 56 | :xalign 0 57 | ) 58 | (box 59 | :space-evenly false 60 | (label 61 | :class "feels-like" 62 | :text "Feels like ${round(weather.current.feels_like, 0)}" 63 | :xalign 0 64 | ) 65 | (grau) 66 | ) 67 | (box 68 | :space-evenly false 69 | (label 70 | :class "humidity" 71 | :text "Humidity ${round(weather.current.humidity, 0)}%" 72 | :xalign 0 73 | ) 74 | ) 75 | ) 76 | (overlay 77 | :hexpand true 78 | :vexpand true 79 | :halign "end" 80 | (box :width 0) 81 | (button 82 | :class "current icon" 83 | :style "background-image: url('${weather.current.icon_image}');" 84 | :halign "center" 85 | :valign "center" 86 | :onclick "eww update forecast_rev=${!forecast_rev}" 87 | ) 88 | ) 89 | ) 90 | (box :class "separator" :visible forecast_rev) 91 | (box 92 | :class "forecast" 93 | :visible forecast_rev 94 | (for i in {weather[interval]} 95 | (box 96 | :class "i" 97 | :orientation "v" 98 | :space-evenly false 99 | (label 100 | :class "dt" 101 | :text "${formattime(i.dt, interval == "daily" ? "%a" : "%I%p", "America/Sao_Paulo")}" 102 | ) 103 | (button 104 | :class "icon" 105 | :style "background-image: url('${i.icon_image}')" 106 | :tooltip {i.description} 107 | :onclick {interval == "daily" ? "eww update interval=hourly" : "eww update interval=daily"} 108 | ) 109 | (box 110 | :space-evenly false 111 | :halign "center" 112 | (label :class "temp" :text {round(interval == "daily" ? i.temp_max : i.temp, 0)}) 113 | (grau) 114 | ) 115 | ) 116 | ) 117 | ) 118 | ) 119 | ) 120 | 121 | (defvar forecast_rev false) -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/media.yuck: -------------------------------------------------------------------------------- 1 | (defwidget player [player] 2 | (box 3 | :class "player ${player.name}" 4 | :space-evenly false 5 | :spacing 10 6 | (box 7 | :class "artwork" 8 | :style "background-image: url('${player.artUrl}');" 9 | :valign "center" 10 | :halign "center" 11 | ) 12 | (box 13 | :class "info" 14 | :orientation "v" 15 | :space-evenly false 16 | :hexpand true 17 | (box 18 | :class "metadata" 19 | :orientation "v" 20 | :space-evenly false 21 | :spacing 2 22 | :vexpand true 23 | (box 24 | :space-evenly false 25 | :hexpand true 26 | (label 27 | :class "title" 28 | :text {player.title} 29 | :limit-width 40 30 | :wrap true 31 | :xalign 0 32 | :hexpand true 33 | ) 34 | (button 35 | :class "icon ${player.name}" 36 | :style "background-image: url('${player.icon}')" 37 | :tooltip {player.name} 38 | :vexpand true 39 | :valign "start" 40 | ) 41 | ) 42 | (label 43 | :class "artist" 44 | :text {player.artist} 45 | :visible {player.artist != ""} 46 | :limit-width 30 47 | :wrap true 48 | :xalign 0 49 | ) 50 | (label 51 | :class "album" 52 | :text {player.album} 53 | :visible {player.album != ""} 54 | :limit-width 30 55 | :wrap true 56 | :xalign 0 57 | ) 58 | ) 59 | (box 60 | :space-evenly false 61 | :orientation "v" 62 | (scale 63 | :visible {player.length > 0} 64 | :class "progress ${player.name}" 65 | :value {positions[player.name].position} 66 | :min 0 67 | :max {player.length} 68 | :onchange "playerctl -p ${player.name} position {}" 69 | ) 70 | ) 71 | (centerbox 72 | :hexpand true 73 | (label 74 | :class "time" 75 | :text {positions[player.name].positionStr} 76 | :visible {player.length > 0} 77 | :halign "start" 78 | :hexpand true 79 | ) 80 | (box 81 | :class "controls" 82 | :halign "center" 83 | :hexpand true 84 | :spacing 10 85 | (eventbox 86 | :cursor "pointer" 87 | :visible {player.loop != "null"} 88 | (button 89 | :onclick "playerctl -p ${player.name} shuffle toggle" 90 | :class "shuffle ${player.shuffle ? "" : "disabled"}" 91 | :tooltip {player.shuffle ? "On" : "Off"} 92 | "" 93 | ) 94 | ) 95 | (eventbox 96 | :cursor {player.canGoPrevious ? "pointer" : "not-allowed"} 97 | (button 98 | :class "previous ${player.canGoPrevious ? "" : "disabled"}" 99 | :onclick "playerctl -p ${player.name} previous" 100 | "" 101 | ) 102 | ) 103 | (eventbox 104 | :cursor "pointer" 105 | (button 106 | :class "toggle ${player.canPlay ? "" : player.canPause ? "" : "disabled"}" 107 | :width 20 108 | :onclick "playerctl -p ${player.name} play-pause" 109 | { 110 | player.status == "Playing" ? "" : 111 | player.status == "Paused" ? "" : 112 | "" 113 | } 114 | ) 115 | ) 116 | (eventbox 117 | :cursor {player.canGoNext ? "pointer" : "not-allowed"} 118 | (button 119 | :class "next ${player.canGoNext ? "" : "disabled"}" 120 | :onclick "playerctl -p ${player.name} next" 121 | "" 122 | ) 123 | ) 124 | (eventbox 125 | :cursor "pointer" 126 | :visible {player.loop != "null"} 127 | (button 128 | :onclick { 129 | player.loop == "None" ? 130 | "playerctl -p ${player.name} loop playlist" : 131 | player.loop == "Playlist" ? 132 | "playerctl -p ${player.name} loop track" : 133 | "playerctl -p ${player.name} loop none" 134 | } 135 | :class "loop ${player.loop == 'None' ? "disabled" : ""}" 136 | :tooltip {player.loop} 137 | { 138 | player.loop == "Track" ? "" : 139 | player.loop == "Playlist" ? "" : 140 | "" 141 | } 142 | ) 143 | ) 144 | ) 145 | (label 146 | :class "time" 147 | :text {player.lengthStr} 148 | :visible {player.length > 0} 149 | :halign "end" 150 | :hexpand true 151 | ) 152 | ) 153 | ) 154 | ) 155 | ) 156 | 157 | ; (box 158 | ; ; :space-evenly false 159 | ; :class "bottom" 160 | ; ;:spacing 6 161 | ; ; (button 162 | ; ; :class "icon ${player.name}" 163 | ; ; :style "background-image: url('${player.icon}')" 164 | ; ; :tooltip {player.name} 165 | ; ; ) 166 | ; ; (box 167 | ; ; :class "position" 168 | ; ; :visible {player.length > 0} 169 | ; ; :space-evenly false 170 | ; ; :spacing 3 171 | ; ; (label :class "time" :text {positions[player.name].positionStr}) 172 | ; ; ; (label :text "/" :class "time") 173 | ; ; ; (label :class "time" :text {player.lengthStr}) 174 | ; ; ) 175 | ; ) 176 | 177 | ; (box 178 | ; :class "volume" 179 | ; :visible {player.volume != -1} 180 | ; :orientation "v" 181 | ; (scale 182 | ; :class "volume-scale ${player.name}" 183 | ; :flipped true 184 | ; :orientation "v" 185 | ; :min 0 186 | ; :max 101 187 | ; :value {player.volume} 188 | ; :tooltip "${player.volume}%" 189 | ; :onchange "echo 'scale=2; {}/100' | bc | xargs playerctl -p ${player.name} volume" 190 | ; ) 191 | ; ) 192 | 193 | -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/menu.yuck: -------------------------------------------------------------------------------- 1 | (defwidget profile [] 2 | (box 3 | :class "profile" 4 | :space-evenly false 5 | :spacing 15 6 | (box :class "profile picture" ) 7 | (box 8 | :class "profile info" 9 | :space-evenly false 10 | :hexpand true 11 | (box 12 | :space-evenly false 13 | :orientation "v" 14 | :hexpand true 15 | :spacing 5 16 | (label :class "name" :text user :xalign 0) 17 | (box 18 | :class "uptime" 19 | :spacing 10 20 | :space-evenly false 21 | (label :text "") 22 | (label :text "${round(uptime, 0)} min") 23 | ) 24 | (box 25 | :class "uptime" 26 | :spacing 10 27 | :space-evenly false 28 | (label :text "") 29 | (label :text "${pacman.updates} updates" :xalign 0) 30 | ) 31 | ) 32 | (box 33 | :class "power" 34 | :halign "end" 35 | :valign "center" 36 | :spacing 10 37 | (powermenu-button :command "poweroff") 38 | (powermenu-button :command "exit") 39 | ) 40 | ) 41 | ) 42 | ) 43 | 44 | (defwidget theme-selector [] 45 | (button 46 | :class "theme-selector ${themes_rev ? "active" : ""}" 47 | :onclick "eww update themes_rev=${!themes_rev}" 48 | (box 49 | :space-evenly false 50 | (box 51 | :space-evenly false 52 | :spacing 8 53 | :hexpand true 54 | (label 55 | :class "icon" 56 | :text "" 57 | ) 58 | (label :class "label" :text "Theme") 59 | ) 60 | (box 61 | :class "caret" 62 | :halign "end" :hexpand true 63 | (label :text {themes_rev ? "" : ""}) 64 | ) 65 | ) 66 | ) 67 | ) 68 | 69 | (defwidget themes [] 70 | (revealer 71 | :reveal themes_rev 72 | :transition "slidedown" 73 | :duration duration 74 | (box 75 | :class "themes" 76 | :orientation "v" 77 | :space-evenly false 78 | :spacing 10 79 | (label :text "Theme Selector" :halign "start") 80 | (box :class "separator") 81 | (box 82 | :orientation "v" 83 | :spacing 5 84 | (button 85 | :onclick "actions image" 86 | :timeout "300ms" 87 | (box 88 | (box 89 | :space-evenly false 90 | :spacing 10 91 | (label :text "" :class "icon") 92 | (label :text "From Image") 93 | ) 94 | (label 95 | :text "" 96 | :hexpand true 97 | :halign "end" 98 | :visible {colors != "color"} 99 | ) 100 | ) 101 | ) 102 | (button 103 | :onclick "actions color" 104 | :timeout "300ms" 105 | (box 106 | (box 107 | :space-evenly false 108 | :spacing 10 109 | (label :text "" :class "icon") 110 | (label :text "From Color") 111 | ) 112 | (label 113 | :text "" 114 | :hexpand true 115 | :halign "end" 116 | :visible {colors != "image"} 117 | ) 118 | ) 119 | ) 120 | ) 121 | ) 122 | ) 123 | ) 124 | 125 | (defwidget utils-button [icon action css wait ?tip] 126 | (eventbox 127 | :cursor "pointer" 128 | (button 129 | :class css 130 | :onclick action 131 | :timeout wait 132 | :tooltip tip 133 | icon 134 | ) 135 | ) 136 | ) 137 | 138 | (defwidget utils [] 139 | (box 140 | :class "utils" 141 | :orientation "v" 142 | :spacing 15 143 | (box 144 | :spacing 15 145 | (utils-button 146 | :css "dnd ${notifications.dnd}" 147 | :icon {icons.bell[notifications.dnd]} 148 | :action "scripts/notifications toggle" 149 | :wait "200ms" 150 | ) 151 | (utils-button 152 | :css "nightlight ${nightlight}" 153 | :icon {icons.light[nightlight]} 154 | :action "scripts/nightlight toggle" 155 | :wait "200ms" 156 | ) 157 | ) 158 | (box 159 | :spacing 15 160 | (utils-button 161 | :css "theme ${theme}" 162 | :icon "" 163 | :action "scripts/theme toggle" 164 | :wait "400ms" 165 | ) 166 | (utils-button 167 | :css "powerprofile ${powerprofile}" 168 | :icon {icons.power-profile[powerprofile]} 169 | :action "scripts/powerprofile toggle" 170 | :wait "200ms" 171 | ) 172 | ) 173 | ) 174 | ) 175 | 176 | (defwidget slider [class value action icon launch ?muted] 177 | (box 178 | :class class 179 | :space-evenly false 180 | :hexpand true 181 | (eventbox 182 | :cursor "pointer" 183 | :valign "center" 184 | (button 185 | :class "icon ${muted}" 186 | :onclick "${action} toggle" 187 | icon 188 | ) 189 | ) 190 | (scale 191 | :class "scale" 192 | :hexpand true 193 | :tooltip {muted ? "Muted" : "${value}%"} 194 | :value value 195 | :min 0 196 | :max 101 197 | :onchange "${action} set {}" 198 | ) 199 | (eventbox 200 | :cursor "pointer" 201 | :valign "center" 202 | (button 203 | :class "launch" 204 | :onclick launch 205 | "" 206 | ) 207 | ) 208 | ) 209 | ) 210 | 211 | (defwidget system-sliders [] 212 | (box 213 | :class "sliders" 214 | :orientation "v" 215 | :space-evenly false 216 | (box 217 | :space-evenly false 218 | :hexpand true 219 | (slider 220 | :class "menu-volume" 221 | :value {audio.output.volume} 222 | :icon {icons.media[audio.output.muted]} 223 | :action "volume" 224 | :launch "pavucontrol &" 225 | :muted {audio.output.muted} 226 | ) 227 | (eventbox 228 | :cursor "pointer" 229 | :valign "center" 230 | :visible {arraylength(mpris) > 0} 231 | (button 232 | :class "launch ${media-volume_rev ? "active" : ""}" 233 | :onclick "eww update media-volume_rev=${!media-volume_rev}" 234 | "" 235 | ) 236 | ) 237 | ) 238 | (mpris-volume) 239 | (slider 240 | :class "menu-mic" 241 | :value {audio.input.volume} 242 | :icon {icons.microphone[audio.input.muted]} 243 | :action "volume mic" 244 | :launch "pavucontrol &" 245 | :muted {audio.input.muted} 246 | ) 247 | ) 248 | ) 249 | 250 | (defvar media-volume_rev false) 251 | 252 | (defwidget mpris-volume [] 253 | (revealer 254 | :reveal media-volume_rev 255 | :transition "slidedown" 256 | :duration duration 257 | (box 258 | :class "media-volume" 259 | :orientation "v" 260 | :spacing 10 261 | (for player in mpris 262 | (box 263 | :space-evenly false 264 | :spacing 5 265 | (box 266 | :class "player-icon" 267 | :style "background-image: url('${player.icon}')" 268 | ) 269 | (scale 270 | :class "player-scale" 271 | :hexpand true 272 | :value {player.volume} 273 | :min 0 274 | :max 101 275 | :onchange "echo 'scale=2; {}/100' | bc | xargs playerctl -p ${player.name} volume" 276 | ) 277 | (label :class "percent" :text "${player.volume}%" :width 50) 278 | ) 279 | ) 280 | ) 281 | ) 282 | ) 283 | 284 | (defwidget system-progress [data icon css tip] 285 | (box 286 | :class "progress" 287 | (circular-progress 288 | :class css 289 | :value data 290 | :thickness 8 291 | :tooltip tip 292 | (overlay 293 | :valign "center" 294 | (label 295 | :class "icon" 296 | :text icon 297 | ) 298 | ) 299 | ) 300 | ) 301 | ) 302 | 303 | (defwidget system-info [] 304 | (box 305 | :class "system-info" 306 | :orientation "v" 307 | :spacing 15 308 | (box 309 | :spacing 15 310 | (system-progress 311 | :css "cpu" 312 | :tip "CPU ${round(EWW_CPU.avg,0)}%" 313 | :data {round(EWW_CPU.avg, 0)} 314 | :icon "" 315 | ) 316 | (system-progress 317 | :css "ram" 318 | :tip "RAM ${round(EWW_RAM.used_mem / 1000000, 2)}MB" 319 | :data {round(EWW_RAM.used_mem_perc, 0)} 320 | :icon "" 321 | ) 322 | ) 323 | (box 324 | :spacing 15 325 | (system-progress 326 | :css "temp" 327 | :tip "Temperature ${EWW_TEMPS["AMDGPU_EDGE"]}°C" 328 | :data {round(EWW_TEMPS.AMDGPU_EDGE, 0)} 329 | :icon "" 330 | ) 331 | (system-progress 332 | :css "disk" 333 | ;:tip "SSD ${round(EWW_DISK["/"].used_perc, 2)}%" 334 | :tip "${round(EWW_DISK["/"].used / 1000000000, 1)}GB / ${round(EWW_DISK["/"].total / 1000000000, 1)}GB" 335 | :data {round(EWW_DISK["/"].used_perc, 0)} 336 | :icon "" 337 | ) 338 | ) 339 | ) 340 | ) 341 | 342 | (defwidget menu-network [] 343 | (box 344 | :class "network" 345 | :space-evenly false 346 | :spacing 10 347 | :hexpand true 348 | (box 349 | :class "indicator" 350 | :space-evenly false 351 | :spacing 8 352 | :hexpand true 353 | (label 354 | :class "icon ${network.status}" 355 | :text {icons.network[network.status]} 356 | ) 357 | (label :class "name" :text {network.status == "up" ? "Connected" : "Disconnected"}) 358 | ) 359 | ; (box 360 | ; :space-evenly false 361 | ; :spacing 10 362 | ; (box 363 | ; :class "metric" 364 | ; (box 365 | ; :space-evenly false 366 | ; :spacing 8 367 | ; (label :text "" :class "icon") 368 | ; (label 369 | ; :text "${round(EWW_NET[network.name].NET_DOWN / 1000000, 2)}MB" 370 | ; :xalign 1 :hexpand true 371 | ; ) 372 | ; ) 373 | ; ) 374 | ; (box 375 | ; :class "metric" 376 | ; (box 377 | ; :space-evenly false 378 | ; :spacing 8 379 | ; (label :text "" :class "icon") 380 | ; (label 381 | ; :text "${round(EWW_NET[network.name].NET_UP / 1000000, 2)}MB" 382 | ; :xalign 1 :hexpand true 383 | ; ) 384 | ; ) 385 | ; ) 386 | ; ) 387 | ) 388 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/notification-center.yuck: -------------------------------------------------------------------------------- 1 | (defwidget notification-center [] 2 | (box 3 | :class "notification-center" 4 | :orientation "v" 5 | :space-evenly false 6 | (box 7 | :class "header" 8 | :space-evenly false 9 | :hexpand true 10 | (label 11 | :class "label" 12 | :text "Notification Center" 13 | ) 14 | (revealer 15 | :reveal {arraylength(notifications.notifications) > 0} 16 | :transition "crossfade" 17 | :halign "end" 18 | :hexpand true 19 | (eventbox 20 | :cursor "pointer" 21 | :halign "center" 22 | :valign "center" 23 | (button 24 | :onclick "scripts/notifications clear" 25 | :class "clear" 26 | "" 27 | ) 28 | ) 29 | ) 30 | ) 31 | (scroll 32 | :class "notification-list" 33 | :vscroll true 34 | :vexpand true 35 | (box 36 | :space-evenly false 37 | (box 38 | :orientation "v" 39 | :space-evenly "false" 40 | :spacing 10 41 | :hexpand true 42 | (box 43 | :visible {arraylength(notifications.notifications) == 0} 44 | :class "empty" 45 | :valign "center" 46 | :vexpand true 47 | :orientation "v" 48 | :space-evenly "false" 49 | :spacing 25 50 | (label :class "icon" :text "") 51 | (label :class "label" :text "No Notifications") 52 | ) 53 | (for i in {notifications.notifications} 54 | (notification 55 | :notification i 56 | :floating false 57 | ) 58 | ) 59 | ) 60 | (box :width 10 :visible {arraylength(notifications.notifications) != 0}) 61 | ) 62 | ) 63 | ) 64 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/notification.yuck: -------------------------------------------------------------------------------- 1 | (defwidget notification [notification floating] 2 | (eventbox 3 | :class "notification" 4 | :onmiddleclick "scripts/notifications close ${notification.id}" 5 | :onhover { 6 | floating ? 7 | "eww update popup=_'${notification.id}' && scripts/notifications pop ${notification.id}" : 8 | "eww update popup='${notification.id}'" 9 | } 10 | :onhoverlost { 11 | floating ? 12 | "scripts/notifications dismiss ${notification.id}" : 13 | "eww update popup=''" 14 | } 15 | (box 16 | :class "content ${notification.urgency}" 17 | :space-evenly false 18 | :orientation "v" 19 | (box 20 | :space-evenly false 21 | :spacing 10 22 | (overlay 23 | :valign "center" 24 | (box 25 | :class "image ${notification.appName}" 26 | :style "background-image: url('${notification.image}')" 27 | :valign "center" 28 | :halign "start" 29 | :visible {notification.image != "null"} 30 | ) 31 | (box 32 | :class "app-icon" 33 | :style "background-image: url('${notification.appIcon}');" 34 | :valign "end" 35 | :halign "end" 36 | :visible {notification.appIcon != "null"} 37 | ) 38 | ) 39 | (box 40 | :orientation "v" 41 | :space-evenly false 42 | :hexpand true 43 | (box 44 | :space-evenly false 45 | :spacing 5 46 | (label 47 | :class "summary" 48 | :limit-width 40 49 | :wrap true 50 | :xalign 0 51 | :visible {notification.summary != "null"} 52 | :text {notification.summary} 53 | ) 54 | (box :hexpand true) 55 | (label 56 | :class "time" 57 | :xalign 1 58 | :valign "start" 59 | :visible {!floating} 60 | :text { 61 | ;EWW_TIME - notification.time < 82000 ? 62 | formattime(notification.time, "%R", "America/Sao_Paulo") ;: 63 | ;formattime(notification.time, "%a, %R", "America/Sao_Paulo") 64 | } 65 | 66 | ) 67 | (eventbox 68 | :cursor "pointer" 69 | (button 70 | :class "close" 71 | :valign "start" 72 | :onclick "scripts/notifications close ${notification.id}" 73 | "" 74 | ) 75 | ) 76 | ) 77 | (label 78 | :class "body" 79 | :limit-width 120 80 | :wrap true 81 | :xalign 0 82 | :justify "left" 83 | :text {notification.body} 84 | :visible {notification.body != "null"} 85 | ) 86 | ) 87 | ) 88 | (revealer 89 | :transition "slidedown" 90 | :duration duration 91 | :reveal { 92 | arraylength(notification.actions) != 0 && 93 | (floating ? 94 | (popup == "_${notification.id}") : (popup == notification.id) 95 | ) 96 | } 97 | (box 98 | :class "actions" 99 | :spacing 10 100 | (for action in {notification.actions} 101 | (eventbox 102 | :cursor "pointer" 103 | (button 104 | :class "action" 105 | :onclick "scripts/notifications action ${notification.id} ${action.id}" 106 | {action.label} 107 | ) 108 | ) 109 | ) 110 | ) 111 | ) 112 | ) 113 | ) 114 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/overview.yuck: -------------------------------------------------------------------------------- 1 | (defwidget client [workspace] 2 | (eventbox 3 | :class "workspace" 4 | :onclick "scripts/hyprland workspace ${workspace.id}" 5 | :onrightclick { 6 | selected != "" ? 7 | "scripts/hyprland move ${workspace.id} ${selected}" : 8 | "" 9 | } 10 | :tooltip "Workspace ${workspace.id}" 11 | (overlay 12 | (box 13 | :space-evenly false 14 | :style " 15 | min-width: ${round(1920 * 0.12, 0)}px; 16 | min-height: ${round(1080 * 0.12, 0)}px; 17 | " 18 | (for window in {workspace.windows} 19 | (box 20 | :class "window ${window.address == "" ? "empty" : ""}" 21 | :style " 22 | margin-left: ${round(window.at[0] * 0.12, 0)}px; 23 | margin-top: ${round(window.at[1] * 0.12, 0)}px; 24 | margin-right: -${round((window.at[0] + window.size[0]) * 0.12, 0)}px; 25 | margin-bottom: ${round(1080 * 0.12 - ((window.at[1] + window.size[1]) * 0.12), 0)}px; 26 | " 27 | (eventbox 28 | :class "window button" 29 | :cursor "cell" 30 | :onrightclick { 31 | selected == "" ? 32 | "scripts/hyprland update ${window.address}" : 33 | "scripts/hyprland move ${workspace.id} ${selected}" 34 | } 35 | :onmiddleclick "scripts/hyprland close ${window.address}" 36 | :tooltip {window.class} 37 | (box 38 | :class "icon ${window.icon}" 39 | :style "background-image: url('${window.icon}');" 40 | :halign "center" :valign "center" 41 | ) 42 | ) 43 | ) 44 | ) 45 | ) 46 | (box 47 | :class "indicator" 48 | :valign "start" 49 | :visible {workspace.id == active.workspace} 50 | ) 51 | ) 52 | ) 53 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/widgets/separator.yuck: -------------------------------------------------------------------------------- 1 | (defwidget separator [?visible] 2 | (box 3 | :class "separator" 4 | :visible visible 5 | :halign "center" 6 | :valign "center" 7 | ) 8 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows.yuck: -------------------------------------------------------------------------------- 1 | (include "yuck/windows/bar.yuck") 2 | (include "yuck/windows/desktop.yuck") 3 | (include "yuck/windows/dock.yuck") 4 | (include "yuck/windows/info-center.yuck") 5 | (include "yuck/windows/launcher.yuck") 6 | (include "yuck/windows/menu.yuck") 7 | (include "yuck/windows/notifications.yuck") 8 | (include "yuck/windows/overview.yuck") 9 | (include "yuck/windows/powermenu.yuck") 10 | (include "yuck/windows/volume.yuck") -------------------------------------------------------------------------------- /.config/eww/yuck/windows/bar.yuck: -------------------------------------------------------------------------------- 1 | (defwidget bar [] 2 | (box 3 | :class "bar" 4 | (box 5 | :class "widget" 6 | (box 7 | :class "start" 8 | :halign "start" 9 | :space-evenly false 10 | (workspaces) 11 | (separator) 12 | (active-client) 13 | ) 14 | (box 15 | :class "center" 16 | :halign "center" 17 | :space-evenly false 18 | (notification-bar) 19 | (separator :visible {arraylength(notifications.notifications) > 0}) 20 | (date-bar) 21 | ) 22 | (box 23 | :class "end" 24 | :halign "end" 25 | :space-evenly false 26 | (media-bar) 27 | (separator :visible {arraylength(mpris) > 0}) 28 | (utils-bar) 29 | (separator) 30 | (eventbox 31 | :class "system-indicators" 32 | :onclick "actions menu" 33 | (box 34 | :class "system-indicators ${menu_rev ? "active" : ""}" 35 | :spacing 10 36 | (dnd-indicator) 37 | (nightlight-indicator) 38 | (network-indicator) 39 | (volume-indicator) 40 | (mic-indicator) 41 | ) 42 | ) 43 | (separator) 44 | (power-button) 45 | ) 46 | ) 47 | ) 48 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/desktop.yuck: -------------------------------------------------------------------------------- 1 | (defwidget desktop [] 2 | (box 3 | :class "desktop" 4 | (box 5 | :class "desktop info" 6 | :orientation "v" 7 | :space-evenly false 8 | :halign "center" 9 | :valign "center" 10 | (clock) 11 | (label 12 | :class "today" 13 | :text {formattime(EWW_TIME, "%A, %B %d", "America/Sao_Paulo")} 14 | ) 15 | ) 16 | ) 17 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/dock.yuck: -------------------------------------------------------------------------------- 1 | (defwidget dock [] 2 | (eventbox 3 | :class "dock" 4 | :onhover "eww update dock_rev=true" 5 | :onhoverlost "eww update dock_rev=false" 6 | (revealer 7 | :reveal {dock_rev || active.class == "null"} 8 | :transition "slideup" 9 | :duration duration 10 | (box 11 | :class "widget" 12 | :halign "center" 13 | :space-evenly false 14 | (eventbox 15 | :cursor "pointer" 16 | (button 17 | :class "launcher-button" 18 | :onclick "actions launcher" 19 | "" 20 | ) 21 | ) 22 | (box :width 5) 23 | (box 24 | :class "favorite" 25 | :spacing 5 26 | (for i in {dock.favorite} 27 | (application 28 | :app i 29 | :simple true 30 | ) 31 | ) 32 | ) 33 | (box 34 | :class "div" 35 | :visible {arraylength(dock.impostor) > 0 && arraylength(dock.favorite) > 0} 36 | ) 37 | (box 38 | :class "impostor" 39 | :spacing 5 40 | (for i in {dock.impostor} 41 | (application 42 | :app i 43 | :simple true 44 | ) 45 | ) 46 | ) 47 | ) 48 | ) 49 | ) 50 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/info-center.yuck: -------------------------------------------------------------------------------- 1 | (defwidget info-center [] 2 | (revealer 3 | :transition "slidedown" 4 | :reveal info-center_rev 5 | :duration duration 6 | (box 7 | :class "info-center" 8 | :space-evenly false 9 | (box 10 | :class "widget" 11 | :space-evenly false 12 | (notification-center) 13 | (box :class "separator") 14 | (box 15 | :class "left" 16 | :orientation "v" 17 | :space-evenly false 18 | :spacing 10 19 | (clock-info-center) 20 | (calendar-info-center) 21 | (weather) 22 | ) 23 | ) 24 | ) 25 | ) 26 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/launcher.yuck: -------------------------------------------------------------------------------- 1 | (defwidget launcher [] 2 | (box 3 | :class "launcher" 4 | (box 5 | :class "widget" 6 | :orientation "v" 7 | :space-evenly false 8 | (box 9 | :class "search" 10 | :space-evenly false 11 | (label 12 | :text "" 13 | :class "icon" 14 | ) 15 | (input 16 | :class "input" 17 | :hexpand true 18 | :onchange "scripts/apps query {}" 19 | :onaccept "actions launcher open ${apps[0].id}" 20 | ) 21 | ) 22 | (scroll 23 | :class "app-list" 24 | :vscroll true 25 | :vexpand true 26 | (box 27 | :space-evenly false 28 | (box 29 | :orientation "v" 30 | :space-evenly false 31 | :spacing 5 32 | :hexpand true 33 | (box :class "div" :hexpand true) 34 | (for i in apps 35 | (box 36 | :orientation "v" 37 | :space-evenly false 38 | :spacing 5 39 | (application 40 | :app i 41 | :simple false 42 | ) 43 | (box :class "div" :hexpand true) 44 | ) 45 | ) 46 | ) 47 | (box :width 10) 48 | ) 49 | ) 50 | ) 51 | ) 52 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/menu.yuck: -------------------------------------------------------------------------------- 1 | (defwidget menu [] 2 | (revealer 3 | :transition "slidedown" 4 | :reveal menu_rev 5 | :duration duration 6 | (box 7 | :class "menu" 8 | (box 9 | :class "widget" 10 | :space-evenly false 11 | :orientation "v" 12 | :spacing 15 13 | (profile) 14 | (system-sliders) 15 | (box 16 | :orientation "v" 17 | :space-evenly false 18 | (box 19 | :spacing 15 20 | (menu-network) 21 | (theme-selector) 22 | ) 23 | (themes) 24 | ) 25 | (box 26 | :spacing 15 27 | (utils) 28 | (system-info) 29 | ) 30 | ; (scroll 31 | ; :class "media-list" 32 | ; :vscroll true 33 | ; :vexpand true 34 | ; :visible {arraylength(mpris) > 0} 35 | ; :height {round(arraylength(mpris) * 114, 0)} 36 | (box 37 | :class "media-list" 38 | :orientation "v" 39 | :space-evenly false 40 | :spacing 10 41 | :visible {mpris[0] != "{}" && arraylength(mpris) > 0} 42 | (for i in mpris 43 | (player :player i) 44 | ) 45 | ) 46 | ;) 47 | ) 48 | ) 49 | ) 50 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/notifications.yuck: -------------------------------------------------------------------------------- 1 | (defwidget notifications [] 2 | (box 3 | :class "notifications" 4 | :space-evenly false 5 | :orientation "v" 6 | (for i in "[2, 1, 0]" 7 | (revealer 8 | :reveal {notifications.popups[i] != "null" && !info-center_rev} 9 | :transition "slidedown" 10 | :duration duration 11 | (notification 12 | :notification {notifications.popups[i]} 13 | :floating true 14 | ) 15 | ) 16 | ) 17 | ) 18 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/overview.yuck: -------------------------------------------------------------------------------- 1 | (defwidget overview [] 2 | (box 3 | :class "overview" 4 | (box 5 | :class "widget" 6 | :spacing 15 7 | (for workspace in {workspaces} 8 | (client :workspace workspace) 9 | ) 10 | ) 11 | ) 12 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/powermenu.yuck: -------------------------------------------------------------------------------- 1 | (defwidget powermenu [] 2 | (box 3 | :class "powermenu" 4 | (box 5 | :class "widget" 6 | :halign "center" 7 | :valign "center" 8 | :spacing 20 9 | (powermenu-button :command "poweroff") 10 | (powermenu-button :command "reboot") 11 | (powermenu-button :command "suspend") 12 | (powermenu-button :command "exit") 13 | ) 14 | ) 15 | ) 16 | 17 | (defwidget powermenu-button [command] 18 | (eventbox 19 | :cursor "pointer" 20 | :halign "center" 21 | :valign "center" 22 | (button 23 | :class command 24 | :onclick {command == "exit" ? "hyprctl dispatch exit" : "systemctl ${command} -i"} 25 | {icons.power[command]} 26 | ) 27 | ) 28 | ) -------------------------------------------------------------------------------- /.config/eww/yuck/windows/volume.yuck: -------------------------------------------------------------------------------- 1 | (defwidget volume [] 2 | (revealer 3 | :transition "slideleft" 4 | :reveal {volume_rev && !menu_rev} 5 | :duration duration 6 | (box 7 | :class "vol" 8 | (overlay 9 | (box 10 | :class "scale ${audio.output.volume}" 11 | (scale 12 | :min 0 13 | :max 101 14 | :value {audio.output.volume} 15 | :orientation "v" 16 | :flipped true 17 | :onchange "volume set {}" 18 | ) 19 | ) 20 | (label 21 | :halign "center" 22 | :valign "end" 23 | :text {icons.media[audio.output.muted]} 24 | ) 25 | ) 26 | ) 27 | ) 28 | ) 29 | 30 | -------------------------------------------------------------------------------- /.config/fontconfig/fonts.conf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Juminai 8 | 9 | Symbols Nerd Font 10 | 11 | 12 | 13 | 14 | 15 | serif 16 | 17 | Roboto Serif 18 | 19 | 20 | 21 | 22 | 23 | sans-serif 24 | 25 | Roboto 26 | 27 | 28 | 29 | 30 | 31 | monospace 32 | 33 | Roboto Mono 34 | 35 | 36 | 37 | 38 | 39 | true 40 | 41 | 42 | true 43 | 44 | 45 | false 46 | 47 | 48 | hintslight 49 | 50 | 51 | rgb 52 | 53 | 54 | lcddefault 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /.config/foot/foot.ini: -------------------------------------------------------------------------------- 1 | # -*- conf -*- 2 | 3 | # shell=$SHELL (if set, otherwise user's default shell from /etc/passwd) 4 | # term=foot (or xterm-256color if built with -Dterminfo=disabled) 5 | # login-shell=no 6 | 7 | # app-id=foot # globally set wayland app-id. Default values are "foot" and "footclient" for desktop and server mode 8 | # title=foot 9 | # locked-title=no 10 | 11 | [main] 12 | include=~/.cache/eww/colors/colors-foot.ini 13 | 14 | font=Juminai:style=Regular:size=15 15 | font-bold=Juminai:style=Bold:size=15 16 | font-italic=Juminai:style=Italic:size=15 17 | font-bold-italic=Juminai:style=Bold Italic:size=15 18 | # font-size-adjustment=0.5 19 | # line-height= 20 | # letter-spacing=0 21 | # horizontal-letter-offset=0 22 | # vertical-letter-offset=0 23 | # underline-offset= 24 | # underline-thickness= 25 | # box-drawings-uses-font-glyphs=no 26 | # dpi-aware=no 27 | 28 | initial-window-size-pixels=800x600 # Or, 29 | # initial-window-size-chars= 30 | # initial-window-mode=windowed 31 | pad=20x20 # optionally append 'center' 32 | # resize-delay-ms=100 33 | 34 | # notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body} 35 | 36 | # bold-text-in-bright=no 37 | # word-delimiters=,│`|:"'()[]{}<> 38 | # selection-target=primary 39 | # workers= 40 | # utmp-helper=/usr/lib/utempter/utempter # When utmp backend is ‘libutempter’ (Linux) 41 | # utmp-helper=/usr/libexec/ulog-helper # When utmp backend is ‘ulog’ (FreeBSD) 42 | 43 | [environment] 44 | # name=value 45 | 46 | [bell] 47 | # urgent=no 48 | # notify=no 49 | # command= 50 | # command-focused=no 51 | 52 | [scrollback] 53 | lines=10000 54 | # multiplier=3.0 55 | # indicator-position=relative 56 | # indicator-format="" 57 | 58 | [url] 59 | # launch=xdg-open ${url} 60 | # label-letters=sadfjklewcmpgh 61 | # osc8-underline=url-mode 62 | # protocols=http, https, ftp, ftps, file, gemini, gopher 63 | # uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[] 64 | 65 | [cursor] 66 | style=beam 67 | # color= 68 | blink=yes 69 | # beam-thickness=1.5 70 | # underline-thickness= 71 | 72 | [mouse] 73 | # hide-when-typing=no 74 | # alternate-scroll-mode=yes 75 | 76 | [touch] 77 | # long-press-delay=400 78 | 79 | ## dimmed colors (see foot.ini(5) man page) 80 | # dim0= 81 | # ... 82 | # dim7= 83 | 84 | ## The remaining 256-color palette 85 | # 16 = <256-color palette #16> 86 | # ... 87 | # 255 = <256-color palette #255> 88 | 89 | ## Misc colors 90 | # selection-foreground= 91 | # selection-background= 92 | # jump-labels= # black-on-yellow 93 | # scrollback-indicator= # black-on-bright-blue 94 | # search-box-no-match= # black-on-red 95 | # search-box-match= # black-on-yellow 96 | # urls= 97 | 98 | [csd] 99 | # preferred=server 100 | # size=26 101 | # font= 102 | # color= 103 | # hide-when-maximized=no 104 | # double-click-to-maximize=yes 105 | # border-width=0 106 | # border-color= 107 | # button-width=26 108 | # button-color= 109 | # button-minimize-color= 110 | # button-maximize-color= 111 | # button-close-color= 112 | 113 | [key-bindings] 114 | # scrollback-up-page=Shift+Page_Up 115 | # scrollback-up-half-page=none 116 | # scrollback-up-line=none 117 | # scrollback-down-page=Shift+Page_Down 118 | # scrollback-down-half-page=none 119 | # scrollback-down-line=none 120 | # clipboard-copy=Control+Shift+c XF86Copy 121 | # clipboard-paste=Control+Shift+v XF86Paste 122 | # primary-paste=Shift+Insert 123 | # search-start=Control+Shift+r 124 | # font-increase=Control+plus Control+equal Control+KP_Add 125 | # font-decrease=Control+minus Control+KP_Subtract 126 | # font-reset=Control+0 Control+KP_0 127 | # spawn-terminal=Control+Shift+n 128 | # minimize=none 129 | # maximize=none 130 | # fullscreen=none 131 | # pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none 132 | # pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none 133 | # pipe-selected=[xargs -r firefox] none 134 | show-urls-launch=Control+Shift+u 135 | # show-urls-copy=none 136 | # show-urls-persistent=none 137 | # prompt-prev=Control+Shift+z 138 | # prompt-next=Control+Shift+x 139 | unicode-input=Control+Shift+o 140 | # noop=none 141 | 142 | [search-bindings] 143 | # cancel=Control+g Control+c Escape 144 | # commit=Return 145 | # find-prev=Control+r 146 | # find-next=Control+s 147 | # cursor-left=Left Control+b 148 | # cursor-left-word=Control+Left Mod1+b 149 | # cursor-right=Right Control+f 150 | # cursor-right-word=Control+Right Mod1+f 151 | # cursor-home=Home Control+a 152 | # cursor-end=End Control+e 153 | # delete-prev=BackSpace 154 | # delete-prev-word=Mod1+BackSpace Control+BackSpace 155 | # delete-next=Delete 156 | # delete-next-word=Mod1+d Control+Delete 157 | # extend-to-word-boundary=Control+w 158 | # extend-to-next-whitespace=Control+Shift+w 159 | # clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste 160 | # primary-paste=Shift+Insert 161 | # unicode-input=none 162 | 163 | [url-bindings] 164 | # cancel=Control+g Control+c Control+d Escape 165 | # toggle-url-visible=t 166 | 167 | [text-bindings] 168 | # \x03=Mod4+c # Map Super+c -> Ctrl+c 169 | 170 | [mouse-bindings] 171 | # selection-override-modifiers=Shift 172 | # primary-paste=BTN_MIDDLE 173 | # select-begin=BTN_LEFT 174 | # select-begin-block=Control+BTN_LEFT 175 | # select-extend=BTN_RIGHT 176 | # select-extend-character-wise=Control+BTN_RIGHT 177 | # select-word=BTN_LEFT-2 178 | # select-word-whitespace=Control+BTN_LEFT-2 179 | # select-row=BTN_LEFT-3 180 | 181 | # vim: ft=dosini 182 | -------------------------------------------------------------------------------- /.config/hypr/animations.conf: -------------------------------------------------------------------------------- 1 | animations { 2 | enabled = true 3 | # Animation curves 4 | 5 | bezier = linear, 0, 0, 1, 1 6 | bezier = md3_standard, 0.2, 0, 0, 1 7 | bezier = md3_decel, 0.05, 0.7, 0.1, 1 8 | bezier = md3_accel, 0.3, 0, 0.8, 0.15 9 | bezier = overshot, 0.05, 0.9, 0.1, 1.1 10 | bezier = crazyshot, 0.1, 1.5, 0.76, 0.92 11 | bezier = hyprnostretch, 0.05, 0.9, 0.1, 1.0 12 | bezier = menu_decel, 0.1, 1, 0, 1 13 | bezier = menu_accel, 0.38, 0.04, 1, 0.07 14 | bezier = easeInOutCirc, 0.85, 0, 0.15, 1 15 | bezier = easeOutCirc, 0, 0.55, 0.45, 1 16 | bezier = easeOutExpo, 0.16, 1, 0.3, 1 17 | bezier = softAcDecel, 0.26, 0.26, 0.15, 1 18 | bezier = md2, 0.4, 0, 0.2, 1 # use with .2s duration 19 | # Animation configs 20 | animation = windows, 1, 3, md3_decel, popin 60% 21 | animation = windowsIn, 1, 3, md3_decel, popin 60% 22 | animation = windowsOut, 1, 3, md3_accel, popin 60% 23 | animation = border, 1, 10, default 24 | animation = fade, 1, 3, md3_decel 25 | animation = layers, 0 26 | #animation = layersIn, 1, 3, menu_decel, slide 27 | #animation = layersOut, 1, 1.6, menu_accel 28 | animation = fadeLayersIn, 1, 2, menu_decel 29 | animation = fadeLayersOut, 1, 4.5, menu_accel 30 | animation = workspaces, 1, 7, menu_decel, slide 31 | # animation = workspaces, 1, 2.5, softAcDecel, slide 32 | # animation = workspaces, 1, 7, menu_decel, slidefade 15% 33 | # animation = specialWorkspace, 1, 3, md3_decel, slidefadevert 15% 34 | animation = specialWorkspace, 1, 3, md3_decel, slidevert 35 | 36 | } 37 | -------------------------------------------------------------------------------- /.config/hypr/autostart.conf: -------------------------------------------------------------------------------- 1 | exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP 2 | exec-once = systemctl --user start xdg-desktop-portal-hyprland 3 | exec-once = wl-paste --type text --watch cliphist store --no-newline 4 | exec-once = wl-paste --type image --watch cliphist store 5 | exec-once = swww init 6 | exec-once = init 7 | -------------------------------------------------------------------------------- /.config/hypr/binds.conf: -------------------------------------------------------------------------------- 1 | $mainMod = SUPER 2 | 3 | bind = $mainMod SHIFT, P, exec, colorpicker 4 | bind = $mainMod SHIFT, T, exec, thunar 5 | bind = $mainMod SHIFT, Return, exec, [float]foot 6 | bind = $mainMod, Return, exec, foot 7 | bind = $mainMod, M, exec, actions menu 8 | bind = $mainMod, C, exec, actions info-center 9 | bind = $mainMod, D, exec, actions launcher 10 | bind = ALT, Tab, exec, actions overview 11 | bind = $mainMod, E, exec, eww open --toggle powermenu 12 | bind = $mainMod, z, exec, notify-send -i dialog-warning 'Test Notification' `date +%F_%T` -A action='Action 1' -A action='Action 2' 13 | 14 | # Screenshot 15 | bind = ,Print, exec, dripshot full 16 | bind = SHIFT, Print, exec, dripshot crop 17 | 18 | # Media control 19 | bind = ,XF86AudioPrev, exec, playerctl previous 20 | bind = ,XF86AudioPlay, exec, playerctl play-pause 21 | bind = ,XF86AudioNext, exec, playerctl next 22 | 23 | # Volume control 24 | bind = ,XF86AudioMute, exec, volume toggle 25 | bind = ,XF86AudioLowerVolume, exec, volume down 26 | bind = ,XF86AudioRaiseVolume, exec, volume up 27 | 28 | # Hypr 29 | bind = $mainMod, Tab, workspace, previous 30 | bind = $mainMod SHIFT, Q, exit 31 | bind = $mainMod, Q, killactive 32 | bind = $mainMod, space, togglefloating 33 | bind = $mainMod, F, fullscreen 34 | bind = $mainMod, P, pseudo 35 | 36 | # Move focus with mainMod + arrow keys 37 | bind = $mainMod, left, movefocus, l 38 | bind = $mainMod, right, movefocus, r 39 | bind = $mainMod, up, movefocus, u 40 | bind = $mainMod, down, movefocus, d 41 | 42 | # Switch workspaces with mainMod + [1-7] 43 | bind = $mainMod, 1, workspace, 1 44 | bind = $mainMod, 2, workspace, 2 45 | bind = $mainMod, 3, workspace, 3 46 | bind = $mainMod, 4, workspace, 4 47 | bind = $mainMod, 5, workspace, 5 48 | bind = $mainMod, 6, workspace, 6 49 | bind = $mainMod, 7, workspace, 7 50 | 51 | # Move active window to a workspace with mainMod + SHIFT + [1-7] 52 | bind = $mainMod SHIFT, 1, movetoworkspace, 1 53 | bind = $mainMod SHIFT, 2, movetoworkspace, 2 54 | bind = $mainMod SHIFT, 3, movetoworkspace, 3 55 | bind = $mainMod SHIFT, 4, movetoworkspace, 4 56 | bind = $mainMod SHIFT, 5, movetoworkspace, 5 57 | bind = $mainMod SHIFT, 6, movetoworkspace, 6 58 | bind = $mainMod SHIFT, 7, movetoworkspace, 7 59 | 60 | # Scroll through existing workspaces with mainMod + scroll 61 | bind = $mainMod, mouse_down, workspace, e+1 62 | bind = $mainMod, mouse_up, workspace, e-1 63 | 64 | # Move/resize windows with mainMod + LMB/RMB and dragging 65 | bindm = $mainMod, mouse:272, movewindow 66 | bindm = $mainMod, mouse:273, resizewindow 67 | -------------------------------------------------------------------------------- /.config/hypr/hyprland.conf: -------------------------------------------------------------------------------- 1 | source = ~/.config/hypr/settings.conf 2 | source = ~/.config/hypr/rules.conf 3 | source = ~/.config/hypr/binds.conf 4 | source = ~/.config/hypr/theme.conf 5 | source = ~/.config/hypr/autostart.conf 6 | source = ~/.config/hypr/animations.conf 7 | -------------------------------------------------------------------------------- /.config/hypr/rules.conf: -------------------------------------------------------------------------------- 1 | windowrule = workspace 2, ^(.*Brave-browser.*)$ 2 | windowrule = workspace 3, title:^(.*Kotatogram.*)$ 3 | windowrule = workspace 3, title:^(.*Telegram.*)$ 4 | windowrule = workspace 4 silent, ^(Spotify)$ 5 | windowrule = workspace 4 silent, ^(Cider)$ 6 | windowrule = workspace 5, ^(discord)$ 7 | windowrule = workspace 6, ^(.*ransmission-gtk.*)$ 8 | windowrule = workspace 7, ^(mpv)$ 9 | windowrule = float, ^(.*ransmission-gtk.*)$ 10 | windowrule = float, ^(thunar)$ 11 | windowrule = float, ^(org.gnome.Nautilus)$ 12 | windowrule = float, ^(zenity)$ 13 | windowrule = float, ^(mpv)$ 14 | windowrule = float, ^(Viewnior)$ 15 | windowrule = float, title:^(flooat)$ 16 | windowrule = float, ^(engrampa)$ 17 | windowrule = float, title:^(.*Abrir.*)$ 18 | windowrule = float, title:^(.*Fechar.*)$ 19 | windowrule = float, title:^(.*Open.*)$ 20 | windowrule = float, title:^(.*Close.*)$ 21 | windowrule = size 360 140, title:^(.*Rename.*)$ 22 | windowrule = size 900 550, ^(thunar)$ 23 | windowrule = size 900 550, ^(org.gnome.Nautilus)$ 24 | layerrule = blur,^(eww_powermenu)$ 25 | layerrule = noanim, ^(eww_menu)$ 26 | -------------------------------------------------------------------------------- /.config/hypr/settings.conf: -------------------------------------------------------------------------------- 1 | monitor = HDMI-A-1, 1920x1080@75, 0x0, 1 2 | monitor = HDMI-A-1, addreserved, 40, 0, 0, 0 3 | 4 | input { 5 | kb_layout = us 6 | kb_variant = 7 | kb_model = 8 | kb_options = 9 | kb_rules = 10 | 11 | follow_mouse = 1 12 | } 13 | 14 | dwindle { 15 | pseudotile = yes 16 | preserve_split = yes 17 | } 18 | 19 | gestures { 20 | workspace_swipe = off 21 | } 22 | 23 | binds { 24 | allow_workspace_cycles = true 25 | } 26 | 27 | misc { 28 | disable_hyprland_logo = true 29 | disable_splash_rendering = true 30 | animate_manual_resizes = false 31 | animate_mouse_windowdragging = false 32 | vfr = true 33 | vrr = 0 34 | } 35 | -------------------------------------------------------------------------------- /.config/hypr/theme.conf: -------------------------------------------------------------------------------- 1 | source = ~/.cache/eww/colors/colors-hyprland.conf 2 | 3 | general { 4 | gaps_in = 10 5 | gaps_out = 30 6 | border_size = 3 7 | col.active_border = $primary 8 | col.inactive_border = $surface 9 | 10 | resize_on_border = false 11 | extend_border_grab_area = false 12 | hover_icon_on_border = true 13 | 14 | layout = dwindle 15 | } 16 | 17 | decoration { 18 | rounding = 14 19 | 20 | drop_shadow = true 21 | shadow_range = 16 22 | shadow_render_power = 4 23 | shadow_ignore_window = true 24 | col.shadow = 0x90000000 25 | 26 | blur { 27 | enabled = yes 28 | size = 8 29 | passes = 2 30 | new_optimizations = on 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /.config/lsd/config.yaml: -------------------------------------------------------------------------------- 1 | # == Classic == 2 | # This is a shorthand to override some of the options to be backwards compatible 3 | # with `ls`. It affects the "color"->"when", "sorting"->"dir-grouping", "date" 4 | # and "icons"->"when" options. 5 | # Possible values: false, true 6 | classic: false 7 | 8 | # == Blocks == 9 | # This specifies the columns and their order when using the long and the tree 10 | # layout. 11 | # Possible values: permission, user, group, context, size, date, name, inode, links, git 12 | blocks: 13 | - permission 14 | - user 15 | - group 16 | - size 17 | - date 18 | - name 19 | 20 | # == Color == 21 | # This has various color options. (Will be expanded in the future.) 22 | color: 23 | # When to colorize the output. 24 | # When "classic" is set, this is set to "never". 25 | # Possible values: never, auto, always 26 | when: auto 27 | # How to colorize the output. 28 | # When "classic" is set, this is set to "no-color". 29 | # Possible values: default, 30 | # when specifying , lsd will look up theme file 31 | # XDG Base Directory if relative, e.g. ~/.config/lsd/themes/.yaml, 32 | # The file path if absolute 33 | theme: default 34 | 35 | # == Date == 36 | # This specifies the date format for the date column. The freeform format 37 | # accepts a strftime like string. 38 | # When "classic" is set, this is set to "date". 39 | # Possible values: date, relative, '+' 40 | # `date_format` will be a `strftime` formatted value. e.g. `date: '+%d %b %y %X'` will give you a date like this: 17 Jun 21 20:14:55 41 | date: date 42 | 43 | # == Dereference == 44 | # Whether to dereference symbolic links. 45 | # Possible values: false, true 46 | dereference: false 47 | 48 | # == Display == 49 | # What items to display. Do not specify this for the default behavior. 50 | # Possible values: all, almost-all, directory-only 51 | # display: all 52 | 53 | # == Icons == 54 | icons: 55 | # When to use icons. 56 | # When "classic" is set, this is set to "never". 57 | # Possible values: always, auto, never 58 | when: auto 59 | # Which icon theme to use. 60 | # Possible values: fancy, unicode 61 | theme: fancy 62 | # Separator between icon and the name 63 | # Default to 1 space 64 | separator: " " 65 | 66 | # == Ignore Globs == 67 | # A list of globs to ignore when listing. 68 | # ignore-globs: 69 | # - .git 70 | 71 | # == Indicators == 72 | # Whether to add indicator characters to certain listed files. 73 | # Possible values: false, true 74 | indicators: false 75 | 76 | # == Layout == 77 | # Which layout to use. "oneline" might be a bit confusing here and should be 78 | # called "one-per-line". It might be changed in the future. 79 | # Possible values: grid, tree, oneline 80 | layout: grid 81 | 82 | # == Recursion == 83 | recursion: 84 | # Whether to enable recursion. 85 | # Possible values: false, true 86 | enabled: false 87 | # How deep the recursion should go. This has to be a positive integer. Leave 88 | # it unspecified for (virtually) infinite. 89 | # depth: 3 90 | 91 | # == Size == 92 | # Specifies the format of the size column. 93 | # Possible values: default, short, bytes 94 | size: default 95 | 96 | # == Permission == 97 | # Specify the format of the permission column 98 | # Possible value: rwx, octal 99 | permission: rwx 100 | 101 | # == Sorting == 102 | sorting: 103 | # Specify what to sort by. 104 | # Possible values: extension, name, time, size, version 105 | column: name 106 | # Whether to reverse the sorting. 107 | # Possible values: false, true 108 | reverse: false 109 | # Whether to group directories together and where. 110 | # When "classic" is set, this is set to "none". 111 | # Possible values: first, last, none 112 | dir-grouping: none 113 | 114 | # == No Symlink == 115 | # Whether to omit showing symlink targets 116 | # Possible values: false, true 117 | no-symlink: false 118 | 119 | # == Total size == 120 | # Whether to display the total size of directories. 121 | # Possible values: false, true 122 | total-size: false 123 | 124 | # == Hyperlink == 125 | # Attach hyperlink to filenames 126 | # Possible values: always, auto, never 127 | hyperlink: never 128 | 129 | # == Symlink arrow == 130 | # Specifies how the symlink arrow display, chars in both ascii and utf8 131 | symlink-arrow: 󰶻 132 | 133 | # == Header == 134 | # Whether to display block headers. 135 | # Possible values: false, true 136 | header: false 137 | -------------------------------------------------------------------------------- /.config/lsd/icons.yaml: -------------------------------------------------------------------------------- 1 | name: 2 | desktop: 󰟀 3 | downloads: 󰉍 4 | videos: 󰕧 5 | music: 󰝚 6 | documents: 󰈙 7 | pictures: 󰋫 8 | templates: 󰝰 9 | public: 󰀎 10 | doc: 󰈙 11 | node_modules:  12 | .trash: 󰩹 13 | .github: 󰊤 14 | .gitmodules: 󰊢 15 | .gitignore: 󰊢 16 | .editorconfig: 󰒓 17 | .cargo: 󱘗 18 | a.out: 󰆍 19 | license.txt: 󱕴 20 | .zshrc: 󰆍 21 | package-lock.json: 󰌞 22 | package.json: 󰌞 23 | user-dirs.dirs: 󱁿 24 | nvim: 󰕷 25 | share: 󰒗 26 | bin: 󱁿 27 | config: 󱁿 28 | extension: 29 | md: 󰋼 30 | json: 󰌞 31 | go:  32 | hs: 󰲒 33 | rs: 🦀 34 | tar: 󰛫 35 | gz: 󰛫 36 | zip: 󰛫 37 | rar: 󰛫 38 | png: 󰋩 39 | jpg: 󰋩 40 | jpeg: 󰋩 41 | svg: 󰜡 42 | gif: 󰵸 43 | xlsx: 󰈛 44 | yml: 󰅩 45 | toml: 󰅩 46 | otf: 󰉿 47 | ttf: 󰉿 48 | list: 󰉹 49 | conf: 󰒓 50 | xml: 󰗀 51 | txt: 󰈚 52 | csv: 󰈮 53 | lua: 󰢱 54 | log: 󰆈 55 | desktop: 󰐱 56 | filetype: 57 | dir: 󰝰 58 | file: 󰈔 59 | pipe: 󰇮 60 | socket: 󰆨 61 | executable: 󰆍 62 | symlink-dir: 󱧮 63 | symlink-file: 󱪓 64 | device-char:  65 | device-block: 󰜫 66 | special:  67 | -------------------------------------------------------------------------------- /.config/starship/starship.toml: -------------------------------------------------------------------------------- 1 | format = '($character)' 2 | right_format = '''$git_branch$git_status$directory''' 3 | 4 | # Disable the blank line at the start of the prompt 5 | add_newline = false 6 | command_timeout = 5000 7 | 8 | [line_break] 9 | disabled = true 10 | 11 | [character] 12 | success_symbol = "[](bold blue)" 13 | error_symbol = "[](bold red)" 14 | vicmd_symbol = "[](bold yellow)" 15 | 16 | 17 | [directory] 18 | format = " [$path](blue)" 19 | truncation_length = 3 20 | truncate_to_repo=false 21 | disabled = false 22 | 23 | [git_branch] 24 | format = "[󰘬 ](yellow)[$branch](yellow) " 25 | 26 | [git_status] 27 | format= "[ 󰊤 ](green)[$all_status$ahead_behind](green) " 28 | conflicted = "=" 29 | ahead = " 󰄿 ${count}" 30 | behind = " 󰄼 ${count}" 31 | diverged = " 󰄿 ${ahead_count} 󰄼 ${behind_count}" 32 | up_to_date = " 󰄬" 33 | untracked = "?${count}" 34 | stashed = "󰏖" 35 | modified = "!${count}" 36 | staged = "+${count}" 37 | renamed = "*${count}" 38 | deleted = "-${count}" 39 | -------------------------------------------------------------------------------- /.local/bin/actions: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | screenshot() { 4 | sleep 0.2 5 | if [[ $1 == "full" ]]; then 6 | dripshot full 7 | else 8 | dripshot crop & 9 | fi 10 | } 11 | 12 | picker() { 13 | sleep 0.2 14 | colorpicker & 15 | } 16 | 17 | update() { 18 | foot -T flooat -e $SHELL -c 'yay -Syu' & 19 | } 20 | 21 | menu() { 22 | MENU=$(eww get menu_rev) 23 | if [[ $MENU == false ]]; then 24 | eww update menu_rev=true 25 | else 26 | eww update menu_rev=false 27 | fi 28 | } 29 | 30 | info-center() { 31 | STATE=$(eww get info-center_rev) 32 | if [[ $STATE == false ]]; then 33 | eww update info-center_rev=true 34 | else 35 | eww update info-center_rev=false 36 | fi 37 | } 38 | 39 | launcher() { 40 | $XDG_CONFIG_HOME/eww/scripts/apps query 41 | eww open --toggle launcher 42 | if [[ $1 == "open" ]]; then launch-app $2; fi 43 | } 44 | 45 | launch-app() { 46 | $XDG_CONFIG_HOME/eww/scripts/apps freq $1 47 | cd $HOME 48 | gtk-launch $1 49 | } 50 | 51 | overview() { 52 | ID=$(hyprctl activeworkspace -j | jq .id) 53 | 54 | if [[ -z $(pgrep checkoverview) ]]; then 55 | checkoverview & 56 | fi 57 | if [[ $ID < 7 ]]; then 58 | hyprctl dispatch workspace +1 59 | else 60 | hyprctl dispatch workspace 1 61 | fi 62 | } 63 | 64 | image() { 65 | wallpaper & disown 66 | } 67 | 68 | from_color() { 69 | color & disown 70 | } 71 | 72 | if [[ $1 == 'image' ]]; then image; fi 73 | if [[ $1 == 'color' ]]; then from_color; fi 74 | if [[ $1 == "colorpicker" ]]; then picker; fi 75 | if [[ $1 == "screenshot" ]]; then screenshot $2; fi 76 | if [[ $1 == "update" ]]; then update; fi 77 | if [[ $1 == "menu" ]]; then menu; fi 78 | if [[ $1 == "launcher" ]]; then launcher $2 $3; fi 79 | if [[ $1 == "info-center" ]]; then info-center; fi 80 | if [[ $1 == "overview" ]]; then overview; fi 81 | if [[ $1 == "launch-app" ]]; then launch-app $2; fi 82 | -------------------------------------------------------------------------------- /.local/bin/checkoverview: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ -z $(eww active-windows | grep overview) ]]; then 4 | eww open overview 5 | fi 6 | 7 | id=$(hyprctl activeworkspace -j | jq .id) 8 | 9 | while true; do 10 | sleep 1 11 | new_id=$(hyprctl activeworkspace -j | jq .id) 12 | 13 | if [[ $id != $new_id ]]; then 14 | id="$new_id" 15 | else 16 | if [[ $id == $(hyprctl activeworkspace -j | jq .id) ]]; then 17 | if [[ -n $(eww active-windows | grep overview) ]]; then 18 | eww close overview 19 | exit 20 | fi 21 | fi 22 | fi 23 | done 24 | -------------------------------------------------------------------------------- /.local/bin/checkvolume: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ $(eww get volume_rev) == false ]]; then 4 | eww update volume_rev=true 5 | fi 6 | 7 | vol=$(eww get audio | jq .output) 8 | 9 | while true; do 10 | sleep 3 11 | new_vol=$(eww get audio | jq .output) 12 | 13 | if [[ $vol != $new_vol ]]; then 14 | vol=$new_vol 15 | else 16 | if [[ $vol == $(eww get audio | jq .output) ]]; then 17 | if [[ $(eww get volume_rev) == true ]]; then 18 | eww update volume_rev=false 19 | exit 20 | fi 21 | fi 22 | fi 23 | done 24 | -------------------------------------------------------------------------------- /.local/bin/color: -------------------------------------------------------------------------------- 1 | color() { 2 | selected_color=$(zenity --color-selection --show-palette) 3 | 4 | if [ $? -eq 1 ]; then 5 | echo "Color selection canceled." 6 | exit 1 7 | fi 8 | 9 | rgb_color=$(echo "$selected_color" | sed 's/[^0-9,]*\([0-9]*,[0-9]*,[0-9]*\).*/\1/') 10 | 11 | IFS=',' read -ra rgb_array <<<"$rgb_color" 12 | 13 | hex_color="#" 14 | for component in "${rgb_array[@]}"; do 15 | hex_component=$(printf "%02X" "$component") 16 | hex_color="${hex_color}${hex_component}" 17 | done 18 | python $XDG_CONFIG_HOME/eww/scripts/python/material-colors.py --color $hex_color 19 | } 20 | 21 | color 22 | -------------------------------------------------------------------------------- /.local/bin/colorpicker: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # requires hyprpicker imagemagick wl-clipboard 3 | 4 | TEMP_DIR=$HOME/.cache/colorpicker 5 | 6 | [ ! -d $TEMP_DIR ] && mkdir -p $TEMP_DIR 7 | 8 | pick() { 9 | HEX_COLOR=$(hyprpicker) 10 | 11 | [[ -z $HEX_COLOR ]] && exit 1 12 | 13 | HEX="${HEX_COLOR#\#}" 14 | FNAME="$TEMP_DIR/$HEX.png" 15 | 16 | convert -size 100x100 xc:"$HEX_COLOR" "$FNAME" 17 | 18 | COLOR_CODE="$HEX_COLOR" 19 | 20 | echo "$COLOR_CODE" | wl-copy -n 21 | 22 | notify-send -u low -a "Color Picker" -i "$FNAME" $COLOR_CODE "Copied to clipboard" 23 | } 24 | 25 | pick 26 | -------------------------------------------------------------------------------- /.local/bin/dripshot: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DATE="$(date +'%d-%m-%y_%H:%M:%S')" 4 | DIR="$HOME/Pictures/screenshots" 5 | PIC="$DIR/$DATE.png" 6 | 7 | [ ! -d "$DIR" ] && mkdir -pv "$DIR" 8 | 9 | abort() { 10 | notify-send -a "Warn" -i dialog-error "Screenshot" "aborted" 11 | exit 1 12 | } 13 | 14 | notification() { 15 | NOTIFY=$(notify-send -A open=Open -A delete=Delete -a Screenshot -i "$PIC" "Screenshot" "$PIC") 16 | if [[ $NOTIFY == "open" ]]; then 17 | viewnior $PIC 18 | elif [[ $NOTIFY == "delete" ]]; then 19 | rm -rf $PIC 20 | else 21 | exit 0 22 | fi 23 | } 24 | 25 | case "$1" in 26 | full) 27 | grim "$PIC" || exit 1 28 | wl-copy <"$PIC" 29 | notification 30 | ;; 31 | crop) 32 | grim -g "$(slurp)" "$PIC" || exit 1 33 | wl-copy <"$PIC" 34 | notification 35 | ;; 36 | esac 37 | -------------------------------------------------------------------------------- /.local/bin/eww: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/.local/bin/eww -------------------------------------------------------------------------------- /.local/bin/fetch: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Tiny colored fetch script 3 | # elenapan @ github 4 | 5 | f=3 b=4 6 | for j in f b; do 7 | for i in {0..7}; do 8 | printf -v $j$i %b "\e[${!j}${i}m" 9 | done 10 | done 11 | d=$'\e[1m' 12 | t=$'\e[0m' 13 | v=$'\e[7m' 14 | 15 | # Items 16 | sep= 17 | s=$d$f0$sep$t 18 | 19 | ds=󰠄 20 | distro="$(uname -o | awk -F '"' '/PRETTY_NAME/ { print $2 }' /etc/os-release)" 21 | 22 | h=󰕮 23 | wmname="$(echo $XDG_CURRENT_DESKTOP)" 24 | 25 | k=󰻀 26 | kernel="$(uname -r | cut -d '-' -f1)" 27 | 28 | p=󰮯 29 | packages="$(pacman -Q | wc -l)" 30 | 31 | sh=󰨊 32 | shell=$(basename $SHELL) 33 | 34 | colors=$(for i in {0..7}; do echo -en "\e[${1}$((30 + $i))m▅▅"; done) 35 | 36 | tput clear 37 | cat << EOF 38 | $f6$ds $t$distro 39 | (\ /) $f4$k $t$kernel 40 | ( $d. .$t) $f3$p $t$packages 41 | c($f1"$t)($f1"$t) $d$f2$h $t$wmname 42 | $f1$sh $t$shell 43 | EOF 44 | -------------------------------------------------------------------------------- /.local/bin/init: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | pkill eww 4 | pkill python 5 | 6 | eww daemon 7 | eww open desktop 8 | eww open bar 9 | eww open corner-left 10 | eww open corner-right 11 | eww open dock 12 | eww open volume 13 | eww open info-center 14 | eww open menu 15 | eww open notifications 16 | -------------------------------------------------------------------------------- /.local/bin/lsd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/.local/bin/lsd -------------------------------------------------------------------------------- /.local/bin/volume: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # requires pamixer 3 | 4 | input="alsa_input.pci-0000_06_00.6.analog-stereo" 5 | output="alsa_output.pci-0000_06_00.6.analog-stereo.monitor" 6 | 7 | input_source=$(pamixer --list-sources | awk '/"'$input'"/ {print $1}') 8 | output_source=$(pamixer --list-sources | awk '/"'$output'"/ {print $1}') 9 | 10 | get_source() { 11 | echo '{"output": '$output_source', "input": '$input_source'}' 12 | } 13 | 14 | check() { 15 | if [[ -z $(pgrep checkvolume) ]]; then 16 | checkvolume & 17 | fi 18 | } 19 | 20 | mic() { 21 | source="pamixer --source $input_source" 22 | unmute="$source -u &&" 23 | if [[ $1 == 'toggle' ]]; then $source -t; fi 24 | if [[ $1 == 'set' ]]; then $unmute $source --set-volume $2; fi 25 | if [[ $1 == 'up' ]]; then $unmute $source -i 1; fi 26 | if [[ $1 == 'down' ]]; then $unmute $source -d 2; fi 27 | } 28 | 29 | set() { 30 | check 31 | pamixer -u 32 | pamixer --set-volume $1 33 | } 34 | 35 | up() { 36 | check 37 | pamixer -u 38 | pamixer -i 2 39 | } 40 | 41 | down() { 42 | check 43 | pamixer -u 44 | pamixer -d 2 45 | } 46 | 47 | if [[ $1 == 'toggle' ]]; then check && pamixer -t; fi 48 | if [[ $1 == 'set' ]]; then set $2; fi 49 | if [[ $1 == 'up' ]]; then up; fi 50 | if [[ $1 == 'down' ]]; then down; fi 51 | if [[ $1 == 'mic' ]]; then mic $2 $3; fi 52 | if [[ $1 == 'source' ]]; then get_source; fi 53 | -------------------------------------------------------------------------------- /.local/bin/wallpaper: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | wallpaper() { 4 | image=$(zenity --file-selection '~/Pictures/wallpapers') 5 | 6 | if [[ $image == "" ]]; then 7 | exit 0 8 | fi 9 | 10 | python $XDG_CONFIG_HOME/eww/scripts/python/material-colors.py --image "$image" 11 | } 12 | 13 | wallpaper 14 | -------------------------------------------------------------------------------- /.local/bin/ytmp3: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for i in "$@"; do 4 | yt-dlp -x \ 5 | --audio-format mp3 \ 6 | --audio-quality 0 \ 7 | -P ~/Music \ 8 | -o "%(title)s.%(ext)s" \ 9 | "$i" 10 | done 11 | -------------------------------------------------------------------------------- /.zshenv: -------------------------------------------------------------------------------- 1 | export PATH="$HOME/.local/bin:$PATH" 2 | export EDITOR=nvim 3 | export XDG_CONFIG_HOME="$HOME/.config" 4 | export XDG_CACHE_HOME="$HOME/.cache" 5 | export XDG_MUSIC_DIR="$HOME/Music" 6 | export XDG_PICTURES_DIR="$HOME/Pictures" 7 | -------------------------------------------------------------------------------- /.zshrc: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | SHELL=$(which zsh || echo '/bin/zsh') 3 | 4 | fpath=(usr/share/zsh/site-functions $fpath) 5 | 6 | setopt autocd # change directory just by typing its name 7 | setopt interactivecomments # allow comments in interactive mode 8 | setopt magicequalsubst # enable filename expansion for arguments of the form ‘anything=expression’ 9 | setopt nonomatch # hide error message if there is no match for the pattern 10 | setopt notify # report the status of background jobs immediately 11 | setopt numericglobsort # sort filenames numerically when it makes sense 12 | setopt promptsubst # enable command substitution in prompt 13 | setopt MENU_COMPLETE # Automatically highlight first element of completion menu 14 | setopt AUTO_LIST # Automatically list choices on ambiguous completion. 15 | setopt COMPLETE_IN_WORD # Complete from both ends of a word. 16 | 17 | # enable completion features 18 | autoload -Uz compinit 19 | compinit -i 20 | 21 | zstyle ':completion:*:*:*:*:*' menu select 22 | zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' # case insensitive tab completion 23 | 24 | zstyle ':completion:*' use-cache on 25 | zstyle ':completion:*' cache-path "$HOME/.cache/.zcompcache" 26 | 27 | # Define completers 28 | zstyle ':completion:*' completer _extensions _complete _approximate 29 | 30 | zstyle ':completion:*:*:*:*:corrections' format '%F{yellow}!- %d (errors: %e) -!%f' 31 | zstyle ':completion:*:*:*:*:descriptions' format '%F{blue}-- %D %d --%f' 32 | zstyle ':completion:*:*:*:*:messages' format ' %F{purple} -- %d --%f' 33 | zstyle ':completion:*:*:*:*:warnings' format ' %F{red}-- no matches found --%f' 34 | 35 | zstyle ':completion:*' group-name '' 36 | zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} 37 | 38 | # Only display some tags for the command cd 39 | zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories 40 | 41 | # History configurations 42 | HISTFILE="$HOME/.cache/.zsh_history" 43 | HISTSIZE=10000 44 | SAVEHIST=20000 45 | setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE 46 | setopt hist_ignore_dups # ignore duplicated commands history list 47 | setopt hist_ignore_space # ignore commands that start with space 48 | setopt hist_verify # show command with history expansion to user before running it 49 | setopt share_history # share command history data 50 | 51 | # source plugins 52 | source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 53 | source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh 54 | 55 | cd() { 56 | builtin cd "$@" && command lsd -A 57 | } 58 | 59 | # init starship 60 | eval "$(starship init zsh)" 61 | # setup starship custom prompt 62 | export STARSHIP_CONFIG=$HOME/.config/starship/starship.toml 63 | 64 | # alias 65 | alias ..='cd ..' 66 | alias mkdir='mkdir -pv' 67 | alias ls='lsd' 68 | alias l='lsd -a' 69 | alias cat='bat --color always --theme base16 --plain' 70 | alias grep='grep --color=auto' 71 | alias v='nvim' 72 | alias vim='nvim' 73 | alias mv='mv -v' 74 | alias cp='cp -rv' 75 | alias rm='rm -rfv' 76 | alias gc='git clone' 77 | alias q='exit' 78 | alias fetch='clear ; fetch' 79 | alias footrc='nvim $HOME/.config/foot/foot.ini' 80 | 81 | # pacman install 82 | alias paci="yay -Slq | fzf --prompt=' ' --color=bw -m --preview 'cat <(yay -Si {1}) <(yay -Fl {1} | awk \"{print \$2}\")' | xargs -ro yay -S --needed" 83 | 84 | # pacman remove 85 | alias pacr="yay -Qq | fzf --prompt=' ' --color=bw -m --preview 'yay -Qi {1}' | xargs -ro yay -Rns" 86 | 87 | # pacman view 88 | alias pac="yay -Qq | fzf --prompt=' ' --color=bw -m --preview 'yay -Qi {1}'" 89 | 90 | # pacman clear 91 | alias pacc='yay -Qtdq | yay -Rns -' 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Details 2 | 3 | - **OS:** Arch Linux 4 | - **Compositor:** Hyprland 5 | - **Terminal:** foot 6 | - **Widgets:** eww 7 | - **Colors:** [Material You](https://github.com/avanisubbiah/material-color-utilities-python) 8 | - **Fonts:** 9 | * **Icons:** Font Awesome 6 Pro 10 | * **UI:** San Francisco 11 | * **Terminal:** custom Iosevka 12 | 13 | ## 14 | 15 | ![1](assets/main.png) 16 | ![2](assets/launcher.png) 17 | ![3](assets/overview.png) 18 | ![3](assets/powermenu.png) 19 | ![3](assets/desktop.png) 20 | 21 | #### thanks 22 | * [Aylur](https://github.com/Aylur/dotfiles) 23 | -------------------------------------------------------------------------------- /assets/desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/desktop.png -------------------------------------------------------------------------------- /assets/launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/launcher.png -------------------------------------------------------------------------------- /assets/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/main.png -------------------------------------------------------------------------------- /assets/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/overview.png -------------------------------------------------------------------------------- /assets/powermenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/powermenu.png --------------------------------------------------------------------------------