(defwidget switch [ value ] (box :halign "end" :space-evenly false :class "switch-bg-${value}" :style " min-width: 40px; min-height: 20px; " (box :valign "center" :class "switch-fg-${value}" :style " ${ANIM_ENTER[1]} ${(value == true || value > 0) ? 'margin-left: 20px;' : 'margin-left: 4px;'} min-width: ${(value == true || value > 0) ? 20 : 12}px; min-height: ${(value == true || value > 0) ? 20 : 12}px; " (label :class "switch-fg-icon bar-txt-norm" :text {(value == true || value > 0) ? 'check' : ''}) ) ) ) (defwidget settings_button [ text onclick ] (button :onclick {onclick} :class "dashboard-settings-button" (label :text {text}) ) ) (defwidget settings-title [ name ] (box :space-evenly false :style "margin-bottom: 5px;" (label :class "dashboard-settings-title-txt" :text {name}) ) ) (defwidget settings-title-small [ name ] (box :space-evenly false :style "margin: 2px 0px;" (label :class "dashboard-settings-title-txtsmall" :text {name}) ) ) (defwidget settings-option-binary [ name value ] (box :space-evenly false :hexpand true :valign "center" (label :xalign 0 :hexpand true :class "dashboard-settings-txt" :text {name}) (switch :value value) ) ) (defwidget settings_option_mousesens [] (box :orientation "h" :space-evenly false :spacing 3 :hexpand true (eventbox :cursor "pointer" :onclick "hyprctl keyword input:force_no_accel ${1 - hyprjson.force_no_accel} &" (box :orientation "v" :space-evenly false :class "dashboard-settings-option-group-left dashboard-settings-option-group-minsize" (label :vexpand true :class "dashboard-settings-option-toggle-icon" :text "arrow_selector_tool") (label :style "margin-bottom: 10px;" :class "dashboard-settings-option-toggle-txt" :text {hyprjson.force_no_accel == 1 ? 'Raw input' : ('Accel: ' + hyprjson.input_sensitivity)}) ) ) (box :hexpand true :class "dashboard-settings-option-group-right" (scale :class "dashboard-settings-scale" :value {hyprjson.input_sensitivity * 50 + 50} :onchange "hyprctl keyword input:sensitivity $(echo - | awk '{print {} / 50 - 1}') && scripts/hyprsettings tickle &" ) ) ) ) (defwidget settings_option_blursize [] (box :orientation "h" :space-evenly false :spacing 3 (eventbox :cursor "pointer" :onclick "hyprctl keyword decoration:blur:enabled ${1 - hyprjson.blur} && scripts/hyprsettings tickle &" (box :orientation "v" :space-evenly false :class "dashboard-settings-option-group-left dashboard-settings-option-group-minsize" (label :vexpand true :class "dashboard-settings-option-toggle-icon" :text "straighten") (label :style "margin-bottom: 10px;" :class "dashboard-settings-option-toggle-txt" :text "Size") ) ) (box :hexpand true :class "dashboard-settings-option-group-right" (scale :class "dashboard-settings-scale" :tooltip {hyprjson.blur_size} :value {hyprjson.blur_size} :onchange "hyprctl keyword decoration:blur:size {} && scripts/hyprsettings tickle &" ) ) ) ) (defwidget settings_option_blurpasses [] (box :orientation "h" :space-evenly false :spacing 3 (eventbox :cursor "pointer" :onclick "hyprctl keyword decoration:blur:enabled ${1 - hyprjson.blur} && scripts/hyprsettings tickle &" (box :orientation "v" :space-evenly false :class "dashboard-settings-option-group-left dashboard-settings-option-group-minsize" (label :vexpand true :class "dashboard-settings-option-toggle-icon" :text "control_point_duplicate") (label :style "margin-bottom: 10px;" :class "dashboard-settings-option-toggle-txt" :text "Passes") ) ) (box :hexpand true :class "dashboard-settings-option-group-right" (scale :class "dashboard-settings-scale" :tooltip {hyprjson.blur_passes} :value {hyprjson.blur_passes} :onchange "hyprctl keyword decoration:blur:passes {} && scripts/hyprsettings tickle &" ) ) ) ) (defwidget settings_option_gapsin [] (box :orientation "h" :space-evenly false :spacing 3 (box :orientation "v" :space-evenly false :class "dashboard-settings-option-group-left dashboard-settings-option-group-minsize" (label :vexpand true :class "dashboard-settings-option-toggle-icon" :text "fullscreen_exit") (label :style "margin-bottom: 10px;" :class "dashboard-settings-option-toggle-txt" :text "Inner") ) (box :hexpand true :class "dashboard-settings-option-group-right" (scale :class "dashboard-settings-scale" :tooltip {hyprjson.gaps_in} :value {hyprjson.gaps_in} :onchange "hyprctl keyword general:gaps_in {} && scripts/hyprsettings tickle &" ) ) ) ) (defwidget settings_option_gapsout [] (box :orientation "h" :space-evenly false :spacing 3 (box :orientation "v" :space-evenly false :class "dashboard-settings-option-group-left dashboard-settings-option-group-minsize" (label :vexpand true :class "dashboard-settings-option-toggle-icon" :text "fullscreen") (label :style "margin-bottom: 10px;" :class "dashboard-settings-option-toggle-txt" :text "Outer") ) (box :hexpand true :class "dashboard-settings-option-group-right" (scale :class "dashboard-settings-scale" :tooltip {hyprjson.gaps_out} :value {hyprjson.gaps_out} :onchange "hyprctl keyword general:gaps_out {} && scripts/hyprsettings tickle &" ) ) ) ) (defwidget settings_option_bordersize [] (box :orientation "h" :space-evenly false :spacing 3 (box :orientation "v" :space-evenly false :class "dashboard-settings-option-group-left dashboard-settings-option-group-minsize" (label :vexpand true :class "dashboard-settings-option-toggle-icon" :text "line_weight") (label :style "margin-bottom: 10px;" :class "dashboard-settings-option-toggle-txt" :text "Thickness") ) (box :hexpand true :class "dashboard-settings-option-group-right" (scale :class "dashboard-settings-scale" :tooltip {hyprjson.border_size} :value {hyprjson.border_size} :onchange "hyprctl keyword general:border_size {} && scripts/hyprsettings tickle &" ) ) ) ) (defwidget settings_option_rounding [] (box :orientation "h" :space-evenly false :spacing 3 (box :orientation "v" :space-evenly false :class "dashboard-settings-option-group-left dashboard-settings-option-group-minsize" (label :vexpand true :class "dashboard-settings-option-toggle-icon" :text "rounded_corner") (label :style "margin-bottom: 10px;" :class "dashboard-settings-option-toggle-txt" :text "Rounding") ) (box :hexpand true :class "dashboard-settings-option-group-right" (scale :class "dashboard-settings-scale" :tooltip {hyprjson.rounding} :value {hyprjson.rounding} :onchange "hyprctl keyword decoration:rounding {} && scripts/hyprsettings tickle &" ) ) ) ) (defwidget settings_option_touchpad [] (box :orientation "h" :spacing 3 (eventbox :cursor "pointer" :onclick "hyprctl keyword input:touchpad:disable_while_typing ${1 - hyprjson.touchpad_disable_while_typing} &" (box :class "dashboard-settings-option-group-left dashboard-settings-option-group-pad" (settings-option-binary :name "Disable while typing" :value {hyprjson.touchpad_disable_while_typing}) ) ) (eventbox :cursor "pointer" :onclick "hyprctl keyword input:touchpad:clickfinger_behavior ${1 - hyprjson.touchpad_clickfinger_behavior} &" (box :class "dashboard-settings-option-group-right dashboard-settings-option-group-pad" (settings-option-binary :name "Tap to click" :value {hyprjson.touchpad_clickfinger_behavior}) ) ) ) ) (defwidget settings_option_blurtoggles [] (box :orientation "h" :spacing 3 (eventbox :cursor "pointer" :onclick "hyprctl keyword decoration:blur:enabled ${1 - hyprjson.blur} && scripts/hyprsettings tickle &" (box :class "dashboard-settings-option-group-left dashboard-settings-option-group-pad" (settings-option-binary :name "Enable blur" :value {hyprjson.blur}) ) ) (eventbox :cursor "pointer" :onclick "hyprctl keyword decoration:blur:xray ${1 - hyprjson.blur_xray} && scripts/hyprsettings tickle &" (box :class "dashboard-settings-option-group-right dashboard-settings-option-group-pad" (settings-option-binary :name "Blur xray" :value {hyprjson.blur_xray}) ) ) ) ) (defwidget settings_option_language [] (box :vexpand true (scroll :hscroll true :vscroll false :hexpand true (box :spacing 5 (for language in langs (button :class "dashboard-option-lang${language.name_ibus == lang_ibus.name_ibus ? '-true' : '-false'}" :onclick "ibus engine ${language.name_ibus} && eww update lang_ibus='${language}' &" (box :space-evenly false :orientation "h" :spacing 5 (box :valign "center" :class "dashboard-lang-indicator-${language.name_ibus == lang_ibus.name_ibus}" ) (box :space-evenly false :orientation "v" :valign "center" (label :xalign 0 :limit-width 24 :text {language.name} ) (label :xalign 0 :limit-width 24 :wrap true :text "${language.name_method}" ) ) ) ) ) ) ) ) ) (defwidget settings_option_debuggingtoggles [] (box :orientation "h" :spacing 3 (eventbox :cursor "pointer" :onclick "hyprctl keyword debug:damage_tracking ${2 - hyprjson.damage_tracking} && scripts/hyprsettings tickle &" (box :class "dashboard-settings-option-group-left dashboard-settings-option-group-pad" (settings-option-binary :name "Damage tracking" :value {hyprjson.damage_tracking}) ) ) (eventbox :cursor "pointer" :onclick "hyprctl keyword debug:overlay ${1 - hyprjson.overlay} && scripts/hyprsettings tickle &" (box :class "dashboard-settings-option-group-right dashboard-settings-option-group-pad" (settings-option-binary :name "Show FPS" :value {hyprjson.overlay}) ) ) ) ) (defwidget settings_mouse_widget [] (box :orientation "v" :space-evenly false :spacing 10 :class "dashboard-setting-section-pad" (settings-title :name "Devices") (settings-title-small :name "Mouse") (settings_option_mousesens) (settings-title-small :name "Touchpad") (settings_option_touchpad) (settings-title-small :name "Keyboard") (settings_option_language) ) ) (defwidget settings_blur_widget [] (box :orientation "v" :space-evenly false :spacing 10 :class "dashboard-setting-section-pad" (settings-title :name "Blur") (settings-title-small :name "Modes") (settings_option_blurtoggles) (settings-title-small :name "Strength") (settings_option_blursize) (settings_option_blurpasses) ) ) (defwidget settings_gaps_widget [] (box :orientation "v" :space-evenly false :spacing 10 :class "dashboard-setting-section-pad" (settings-title :name "Window settings") (settings-title-small :name "Gaps") (box :spacing 5 (settings_option_gapsin) (settings_option_gapsout) ) (settings-title-small :name "Borders") (box :spacing 5 (settings_option_bordersize) (settings_option_rounding) ) ) ) (defwidget settings_hyprland_widget [] (box :orientation "v" :space-evenly false :spacing 10 :class "dashboard-setting-section-pad" (settings-title :name "Hyprland") (settings_button :text "Reload config" :onclick "hyprctl reload &") (settings-title-small :name "Debugging stuff") (settings_option_debuggingtoggles) (settings-title-small :name "Help & Support") (box :spacing 5 (settings_button :text "Open Hyprland Wiki" :onclick "scripts/toggle-dashboard.sh --close && xdg-open https://wiki.hyprland.org/ &") (settings_button :text "Hypr Dev. Discord server" :onclick "scripts/toggle-dashboard.sh --close && xdg-open https://discord.com/invite/hQ9XvMUjjr &") ) ) ) (defwidget dashboard_widget [] (box :space-evenly false :orientation "h" (overlay (box :class "dashboard-bg" :height RES_HEIGHT :width RES_WIDTH ) (box :valign "end" (revealer ; Audio visualizer (cava) :reveal {open_dashboard >= 3} :duration "100ms" :transition "crossfade" (box :orientation "h" :spacing 17 (for colheight in cavajson (box :class "dashboard-cavacol" :valign "end" :style " min-height: ${round(colheight[0] / 2.5, 0)}px; " ) ) ) ) ) (image :path "images/menus/corner_topleft.svg" :halign "start" :valign "start" :image-width BG_ROUNDING :image-height BG_ROUNDING ) (image :path "images/menus/corner_topright.svg" :halign "end" :valign "start" :image-width BG_ROUNDING :image-height BG_ROUNDING ) (image :path "images/menus/corner_bottomleft.svg" :halign "start" :valign "end" :image-width BG_ROUNDING :image-height BG_ROUNDING ) (image :path "images/menus/corner_bottomright.svg" :halign "end" :valign "end" :image-width BG_ROUNDING :image-height BG_ROUNDING ) (box :halign "center" :valign "start" :style " ${open_dashboard >= 1 ? ANIM_ENTER[anim_set] : ANIM_EXIT[anim_set]}; margin-top: ${open_dashboard >= 1 ? 40 : 90}px; " (revealer ; Time and date :reveal {open_dashboard >= 1} :duration "100ms" :transition "crossfade" (box :orientation "v" :space-evenly false (label :class "dashboard-clock-time" :text "${time.hour}:${time.minute}" ) (label :class "dashboard-clock-date" :text "${time.day}, ${day_only} ${time.monthname} ${time.year}" ) ) ) ) (box :halign "start" :valign "start" :style " ${open_dashboard >= 1 ? ANIM_ENTER[anim_set] : ANIM_EXIT[anim_set]}; margin-top: ${open_dashboard >= 1 ? 50 : 100}px; margin-left: 50px; " (revealer ; User :reveal {open_dashboard >= 1} :duration "100ms" :transition "crossfade" (box :orientation "h" :space-evenly false :spacing 15 (box :halign "center" :valign "center" :class "dashbaord-user-pic" :style "background-image: url('/var/lib/AccountsService/icons/${username}');" ) (box :orientation "v" :space-evenly false (label :xalign 0 :class "dashboard-user-realname" :text "${realname}" ) (label :xalign 0 :class "dashboard-user-username" :text "${username}" ) ) ) ) ) (box :halign "end" :valign "start" (revealer ; Close button :reveal {open_dashboard >= 1} :duration "100ms" :transition "crossfade" (eventbox :onclick "scripts/toggle-dashboard.sh --close &" :cursor "pointer" (box :style " ${open_dashboard >= 1 ? ANIM_ENTER[anim_set] : ANIM_EXIT[anim_set]}; ${open_dashboard >= 1 ? '' : 'margin-top: 100px;'} padding: 50px; " (box :orientation "v" :space-evenly false :spacing -5 (label :class "dashboard-close-btn-icon" :text "close" ) (label :class "dashboard-close-btn-txt" :text "Close" ) ) ) ) ) ) (box ; Session control :halign "end" :valign "center" (revealer :reveal {open_dashboard >= 2} :duration "100ms" :transition "crossfade" (box :orientation "v" :space-evenly false :spacing 30 :style " ${open_dashboard >= 2 ? ANIM_ENTER[anim_set] : ANIM_EXIT[anim_set]}; ${open_dashboard >= 2 ? '' : 'margin-bottom: -100px;'} " (eventbox :halign "end" :cursor "pointer" :onclick "gtklock &" (box :space-evenly false :orientation "v" :class "dashboard-session-btn" (label :class "dashboard-session-btn-icon" :text "lock") (label :class "dashboard-close-btn-txt" :text "Lock") ) ) (box :orientation "h" :space-evenly false :spacing 10 :halign "end" :style " ${ANIM_ENTER[anim_set]} ${rev_session_1 ? '' : 'margin-right: -210px;'} " (eventbox :cursor "pointer" :onclick "${EWW_CMD} update rev_session_1=${!rev_session_1} &" (box :space-evenly false :orientation "v" :class "dashboard-session-btn" (label :class "dashboard-session-btn-icon" :text "bedtime") (label :class "dashboard-close-btn-txt" :text "Sleep") ) ) (eventbox :cursor "e-resize" :onclick "${EWW_CMD} update rev_session_1=false && systemctl suspend &" (label :width 200 :class "dashboard-session-btn-txt" :text "Click to confirm") ) ) (box :orientation "h" :space-evenly false :spacing 10 :halign "end" :style " ${ANIM_ENTER[anim_set]} ${rev_session_2 ? '' : 'margin-right: -210px;'} " (eventbox :cursor "pointer" :onclick "${EWW_CMD} update rev_session_2=${!rev_session_2} &" (box :space-evenly false :orientation "v" :class "dashboard-session-btn" (label :class "dashboard-session-btn-icon" :text "power_settings_new") (label :class "dashboard-close-btn-txt" :text "Shutdown") ) ) (eventbox :cursor "e-resize" :onclick "${EWW_CMD} update rev_session_2=false && systemctl poweroff &" (label :width 200 :class "dashboard-session-btn-txt" :text "Click to confirm") ) ) (box :orientation "h" :space-evenly false :spacing 10 :halign "end" :style " ${ANIM_ENTER[anim_set]} ${rev_session_3 ? '' : 'margin-right: -210px;'} " (eventbox :cursor "pointer" :onclick "${EWW_CMD} update rev_session_3=${!rev_session_3} &" (box :space-evenly false :orientation "v" :class "dashboard-session-btn" (label :class "dashboard-session-btn-icon" :text "restart_alt") (label :class "dashboard-close-btn-txt" :text "Restart") ) ) (eventbox :cursor "e-resize" :onclick "${EWW_CMD} update rev_session_3=false && reboot &" (label :width 200 :class "dashboard-session-btn-txt" :text "Click to confirm") ) ) ) ) ) (box :halign "start" :valign "center" (revealer ; Settings sections :reveal {open_dashboard >= 2} :duration "100ms" :transition "crossfade" (box :orientation "h" :space-evenly false :width 700 :style " ${open_dashboard >= 2 ? ANIM_ENTER[anim_set] : ANIM_EXIT[anim_set]}; ${open_dashboard >= 2 ? '' : 'margin-bottom: -100px;'} " (eventbox :onscroll "scripts/scroll-settings {} &" (box :class "dashboard-settings-highlight${scroll_offset_settings == -1 ? '-hide' : ''}" :halign "start" :valign "start" :style " ${ANIM_ENTER[1]} margin-right: -4px; margin-top: ${20+117*scroll_offset_settings}px; " ) ) (eventbox :onscroll "scripts/scroll-settings {} &" (box :orientation "v" :space-evenly false :spacing 30 (eventbox :halign "start" :cursor "pointer" :onclick {scroll_offset_settings == 0 ? '${EWW_CMD} update scroll_offset_settings=-1 &' : '${EWW_CMD} update scroll_offset_settings=0 &'} (box :space-evenly false :orientation "v" :class "dashboard-session-btn" (label :class "dashboard-session-btn-icon" :text "keyboard_alt") (label :class "dashboard-close-btn-txt" :text "Devices") ) ) (eventbox :halign "start" :cursor "pointer" :onclick {scroll_offset_settings == 1 ? '${EWW_CMD} update scroll_offset_settings=-1 &' : '${EWW_CMD} update scroll_offset_settings=1 &'} (box :space-evenly false :orientation "v" :class "dashboard-session-btn" (label :class "dashboard-session-btn-icon" :text "lens_blur") (label :class "dashboard-close-btn-txt" :text "Blur") ) ) (eventbox :halign "start" :cursor "pointer" :onclick {scroll_offset_settings == 2 ? '${EWW_CMD} update scroll_offset_settings=-1 &' : '${EWW_CMD} update scroll_offset_settings=2 &'} (box :space-evenly false :orientation "v" :class "dashboard-session-btn" (label :class "dashboard-session-btn-icon" :text "wysiwyg") (label :class "dashboard-close-btn-txt" :text "Window") ) ) (eventbox :halign "start" :cursor "pointer" :onclick {scroll_offset_settings == 3 ? '${EWW_CMD} update scroll_offset_settings=-1 &' : '${EWW_CMD} update scroll_offset_settings=3 &'} (box :space-evenly false :orientation "v" :class "dashboard-session-btn" (label :class "dashboard-session-btn-icon" :text "water_drop") (label :class "dashboard-close-btn-txt" :text " Hyprland") ) ) ) ) (revealer :reveal {scroll_offset_settings != -1} :duration "100ms" :transition "slideright" (eventbox :hexpand true (scroll :hexpand true :hscroll false :vscroll true :class "dashboard-settings-panel" :width 560 (box :orientation "v" :style " margin-top: -${scroll_offset_settings * SCROLL_MULTIPLIER_SETTINGS}px; ${ANIM_ENTER[1]} " ; :space-evenly false (settings_mouse_widget) (settings_blur_widget) (settings_gaps_widget) (settings_hyprland_widget) ) ) ) ) ) ) ) ) (box :valign "center" :style " margin-left: -${RES_WIDTH / 2 + 200}px; " :orientation "h" :space-evenly false :spacing 70 (box (revealer ; Directories :reveal {open_dashboard >= 2} :duration "100ms" :transition "crossfade" (box :orientation "v" :space-evenly false :spacing 15 :style " ${open_dashboard >= 2 ? ANIM_ENTER[anim_set] : ANIM_EXIT[anim_set]}; ${open_dashboard >= 2 ? '' : 'margin-bottom: -100px;'} " (box :orientation "h" :space-evenly false :spacing 15 (label :text "Directories" :class "dashboard-section-txt") ) (box :orientation "v" :spacing 5 (for dir in directories (eventbox :cursor "pointer" :onclick "scripts/toggle-dashboard.sh --close && xdg-open ${dir.path} &" (box :orientation "h" :space-evenly false :spacing 15 (label :text {dir.icon} :class "dashboard-section-icon") (label :text {dir.name} :class "dashboard-section-txt") ) ) ) ) ) ) ) (box (revealer ; Websites :reveal {open_dashboard >= 2} :duration "100ms" :transition "crossfade" (box :orientation "v" :space-evenly false :spacing 15 :style " ${open_dashboard >= 2 ? ANIM_ENTER[anim_set] : ANIM_EXIT[anim_set]}; ${open_dashboard >= 2 ? '' : 'margin-bottom: -100px;'} " (box :orientation "h" :space-evenly false :spacing 15 (label :text "Websites" :class "dashboard-section-txt") ) (box :orientation "v" :spacing 5 (for site in websites (eventbox :cursor "pointer" :onclick "scripts/toggle-dashboard.sh --close && xdg-open ${site.url} &" (box :orientation "h" :space-evenly false :spacing 15 (label :text {site.icon} :class "dashboard-section-icon-nerd") (label :text {site.name} :class "dashboard-section-txt") ) ) ) ) ) ) ) ) ) ) (defwindow dashboard :stacking "overlay" :focusable true :monitor 0 :namespace "eww" :geometry (geometry :anchor "center center" :height "100%" :width "100%" ) (dashboard_widget) )