diff --git a/awesome/.idea/.gitignore b/awesome/.idea/.gitignore
new file mode 100644
index 0000000..73f69e0
--- /dev/null
+++ b/awesome/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/awesome/.idea/awesome.iml b/awesome/.idea/awesome.iml
new file mode 100644
index 0000000..bc2cd87
--- /dev/null
+++ b/awesome/.idea/awesome.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/awesome/.idea/modules.xml b/awesome/.idea/modules.xml
new file mode 100644
index 0000000..98b28f5
--- /dev/null
+++ b/awesome/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/awesome/bindings/globalkeys.lua b/awesome/bindings/globalkeys.lua
index 72f6daf..2ded8f2 100644
--- a/awesome/bindings/globalkeys.lua
+++ b/awesome/bindings/globalkeys.lua
@@ -260,7 +260,7 @@ function _M.get()
{ modkey },
"d",
function ()
- awful.spawn("rofi -show run")
+ awful.spawn("rofi -show drun -theme ~/.config/rofi/appmenu/rofi.rasi")
end,
{ descripton = "Start a Application", group = "Application" }
),
@@ -268,7 +268,7 @@ function _M.get()
{ modkey },
"Tab",
function ()
- awful.spawn("rofi -show window")
+ awful.spawn("rofi -show window -theme ~/.config/rofi/appmenu/rofi.rasi")
end,
{ descripton = "Start a Application", group = "Application" }
),
diff --git a/awesome/deco/statusbar.lua b/awesome/deco/statusbar.lua
index 0eb0153..f10e80f 100644
--- a/awesome/deco/statusbar.lua
+++ b/awesome/deco/statusbar.lua
@@ -115,6 +115,7 @@ awful.screen.connect_for_each_screen(
s.calendar_osd = require("theme.crylia.modules.calendar_osd")()
s.addtag = require("theme.crylia.widgets.addtag")()
s.layoutlist = require("theme.crylia.widgets.layout_list")()
+ s.powerbutton = require("theme.crylia.widgets.power")()
s.top_left:setup {
@@ -204,6 +205,13 @@ awful.screen.connect_for_each_screen(
{
s.clock,
left = dpi(3),
+ right = dpi(3),
+ top = dpi(6),
+ bottom = dpi(6),
+ widget = wibox.container.margin
+ },{
+ s.powerbutton,
+ left = dpi(3),
right = dpi(6),
top = dpi(6),
bottom = dpi(6),
diff --git a/awesome/main/menu.lua b/awesome/main/menu.lua
index 2e2b8fd..5deb118 100644
--- a/awesome/main/menu.lua
+++ b/awesome/main/menu.lua
@@ -13,7 +13,7 @@ local _M = { }
local terminal = RC.vars.terminal
M.session = {
- { "Logout", function () awful.spawn.with_shell('logout') end },
+ { "Logout", function () awesome.quit() end },
{ "Shutdown", function () awful.spawn.with_shell('shutdown now') end },
{ "Reboot", function () awful.spawn.with_shell('reboot') end },
}
diff --git a/awesome/rc.lua b/awesome/rc.lua
index d28fcac..bbb25d5 100644
--- a/awesome/rc.lua
+++ b/awesome/rc.lua
@@ -88,6 +88,6 @@ awful.rules.rules = main.rules(
require("main.signals")
-- Autostart programs
-awful.spawn.with_shell("~/.screenlayout/screen.sh")
+awful.spawn.with_shell("~/.screenlayout/single_screen.sh")
awful.spawn.with_shell("picom --experimental-backends")
awful.spawn.with_shell("xfce4-power-manager")
\ No newline at end of file
diff --git a/awesome/theme/crylia/assets/icons/power/power.svg b/awesome/theme/crylia/assets/icons/power/power.svg
new file mode 100644
index 0000000..343d1ba
--- /dev/null
+++ b/awesome/theme/crylia/assets/icons/power/power.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/awesome/theme/crylia/modules/power_menu.lua b/awesome/theme/crylia/modules/power_menu.lua
new file mode 100644
index 0000000..cdc3a8e
--- /dev/null
+++ b/awesome/theme/crylia/modules/power_menu.lua
@@ -0,0 +1,19 @@
+-----------------------------------
+-- This is the volume_old module --
+-----------------------------------
+
+-- Awesome Libs
+local awful = require("awful")
+local color = require("theme.crylia.colors")
+local dpi = require("beautiful").xresources.apply_dpi
+local gears = require("gears")
+local wibox = require("wibox")
+
+-- Icon directory path
+local icondir = awful.util.getdir("config") .. "theme/crylia/assets/icons/audio/"
+
+return function ()
+
+
+
+end
\ No newline at end of file
diff --git a/awesome/theme/crylia/widgets/network.lua b/awesome/theme/crylia/widgets/network.lua
index f828d84..cdc4dd1 100644
--- a/awesome/theme/crylia/widgets/network.lua
+++ b/awesome/theme/crylia/widgets/network.lua
@@ -90,7 +90,7 @@ return function ()
echo "Connected but no internet"
fi
]=]
-
+
local update_startup = function ()
if startup then
startup = false
diff --git a/awesome/theme/crylia/widgets/power.lua b/awesome/theme/crylia/widgets/power.lua
new file mode 100644
index 0000000..4708ff9
--- /dev/null
+++ b/awesome/theme/crylia/widgets/power.lua
@@ -0,0 +1,93 @@
+--------------------------------
+-- This is the power widget --
+--------------------------------
+
+-- Awesome Libs
+local awful = require("awful")
+local color = require("theme.crylia.colors")
+local dpi = require("beautiful").xresources.apply_dpi
+local gears = require("gears")
+local naughty = require("naughty")
+local wibox = require("wibox")
+
+-- Icon directory path
+local icondir = awful.util.getdir("config") .. "theme/crylia/assets/icons/power/"
+
+return function ()
+
+ local power_widget = wibox.widget{
+ {
+ {
+ {
+ {
+ {
+ id = "icon",
+ image = gears.color.recolor_image(icondir .. "power.svg", color.color["Grey900"]),
+ widget = wibox.widget.imagebox,
+ resize = false
+ },
+ id = "icon_layout",
+ widget = wibox.container.place
+ },
+ id = "icon_margin",
+ top = dpi(2),
+ widget = wibox.container.margin
+ },
+ id = "power_layout",
+ layout = wibox.layout.fixed.horizontal
+ },
+ id = "container",
+ left = dpi(5),
+ right = dpi(5),
+ widget = wibox.container.margin
+ },
+ bg = color.color["Red200"],
+ fg = color.color["Grey800"],
+ shape = function (cr, width, height)
+ gears.shape.rounded_rect(cr, height, width, 5)
+ end,
+ widget = wibox.widget.background
+ }
+
+ -- Signals
+ local old_wibox, old_cursor, old_bg
+ power_widget:connect_signal(
+ "mouse::enter",
+ function ()
+ old_bg = power_widget.bg
+ power_widget.bg = color.color["Red200"] .. "dd"
+ local w = mouse.current_wibox
+ if w then
+ old_cursor, old_wibox = w.cursor, w
+ w.cursor = "hand1"
+ end
+ end
+ )
+
+ power_widget:connect_signal(
+ "button::press",
+ function ()
+ power_widget.bg = color.color["Red200"] .. "bb"
+ end
+ )
+
+ power_widget:connect_signal(
+ "button::release",
+ function ()
+ power_widget.bg = color.color["Red200"] .. "dd"
+ end
+ )
+
+ power_widget:connect_signal(
+ "mouse::leave",
+ function ()
+ power_widget.bg = old_bg
+ if old_wibox then
+ old_wibox.cursor = old_cursor
+ old_wibox = nil
+ end
+ end
+ )
+
+ return power_widget
+end
\ No newline at end of file
diff --git a/rofi/appmenu/rofi.rasi b/rofi/appmenu/rofi.rasi
new file mode 100644
index 0000000..c289934
--- /dev/null
+++ b/rofi/appmenu/rofi.rasi
@@ -0,0 +1,149 @@
+configuration {
+ font: "Inter Regular 10";
+ show-icons: true;
+ drun-display-format: "{name}";
+ fullscreen: false;
+ threads: 0;
+ matching: "fuzzy";
+ scroll-method: 0;
+ disable-history: false;
+ fullscreen: true;
+ window-thumbnail: true;
+}
+
+* {
+ transparent: #00000000;
+ foreground: #F2F2F2EE;
+ background-selected: #F2F2F245;
+ background-active: #F2F2F230;
+ background-white: #F2F2F211;
+ background-black: #00000066;
+ urgent: #E91E6366;
+ urgent-selected: #E91E6377;
+}
+
+window {
+ transparency: "real";
+ background-color: @transparent;
+ text-color: @foreground;
+ location: northwest;
+ anchor: northwest;
+}
+
+prompt {
+ enabled: false;
+}
+
+button {
+ action: "ok";
+ str: " ";
+ font: "FantasqueSansMono Nerd Font 11";
+ expand: false;
+ text-color: @foreground;
+ background-color: @transparent;
+ vertical-align: 0.7;
+ horizontal-align: 0.5;
+}
+
+entry {
+ font: "Inter Regular 11";
+ background-color: @transparent;
+ text-color: @foreground;
+ expand: true;
+ vertical-align: 0.5;
+ horizontal-align: 0.5;
+ placeholder: "Type to search";
+ placeholder-color: @foreground;
+ blink: true;
+}
+
+case-indicator {
+ background-color: @transparent;
+ text-color: @foreground;
+ vertical-align: 0.5;
+ horizontal-align: 0.5;
+}
+
+entry-wrapper {
+ orientation: horizontal;
+ vertical-align: 0.5;
+ spacing: 4px;
+ background-color: @transparent;
+ children: [ button, entry, case-indicator ];
+}
+
+inputbar {
+ background-color: @background-white;
+ text-color: @foreground;
+ expand: false;
+ border-radius: 6px;
+ margin: 0px calc((80% - 640px) / 2) 0px calc((80% - 640px) / 2);
+ padding: 10px 10px 10px 10px;
+ position: north;
+ children: [ entry-wrapper ];
+}
+
+listview {
+ background-color: @transparent;
+ columns: 6;
+ spacing: 5px;
+ cycle: false;
+ dynamic: true;
+ layout: vertical;
+}
+
+mainbox {
+ background-color: @background-black;
+ children: [ inputbar, listview ];
+ spacing: 25px;
+ padding: 70px 15% 0 15%;
+ /*padding: 70px 135px 0 135px;*/
+}
+
+element {
+ background-color: @transparent;
+ text-color: @foreground;
+ orientation: vertical;
+ border-radius: 12px;
+ padding: 25px 0 25px 0;
+}
+
+element-icon {
+ size: 72px;
+ border: 0;
+}
+
+element-text {
+ expand: true;
+ horizontal-align: 0.5;
+ vertical-align: 0.5;
+ margin: 0 10px 0 10px;
+}
+
+element normal.urgent,
+element alternate.urgent {
+ background-color: @urgent;
+ text-color: @foreground;
+ border-radius: 9px;
+}
+
+element normal.active,
+element alternate.active {
+ background-color: @background-active;
+ text-color: @foreground;
+}
+
+element selected {
+ background-color: @background-selected;
+ text-color: @foreground;
+}
+
+element selected.urgent {
+ background-color: @urgent-selected;
+ text-color: @foreground;
+}
+
+element selected.active {
+ background-color: @background-active;
+ color: @foreground-selected;
+}
diff --git a/rofi/global/icons/ddg.svg b/rofi/global/icons/ddg.svg
new file mode 100644
index 0000000..20ea387
--- /dev/null
+++ b/rofi/global/icons/ddg.svg
@@ -0,0 +1,615 @@
+
+
+
+
diff --git a/rofi/global/icons/google.svg b/rofi/global/icons/google.svg
new file mode 100644
index 0000000..21e5bf3
--- /dev/null
+++ b/rofi/global/icons/google.svg
@@ -0,0 +1,365 @@
+
+
+
+
diff --git a/rofi/global/icons/history.svg b/rofi/global/icons/history.svg
new file mode 100644
index 0000000..872bac8
--- /dev/null
+++ b/rofi/global/icons/history.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/rofi/global/icons/result.svg b/rofi/global/icons/result.svg
new file mode 100644
index 0000000..0f4d883
--- /dev/null
+++ b/rofi/global/icons/result.svg
@@ -0,0 +1,57 @@
+
+
diff --git a/rofi/global/icons/suggestion.svg b/rofi/global/icons/suggestion.svg
new file mode 100644
index 0000000..bf67346
--- /dev/null
+++ b/rofi/global/icons/suggestion.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/rofi/global/rofi-spotlight.sh b/rofi/global/rofi-spotlight.sh
new file mode 100755
index 0000000..d5c4a23
--- /dev/null
+++ b/rofi/global/rofi-spotlight.sh
@@ -0,0 +1,692 @@
+#!/usr/bin/env bash
+
+TMP_DIR="/tmp/rofi/${USER}/"
+
+PREV_LOC_FILE="${TMP_DIR}rofi_fb_prevloc"
+CURRENT_FILE="${TMP_DIR}rofi_fb_current_file"
+
+MY_PATH="$(realpath "$0" | xargs dirname)"
+HIST_FILE="${MY_PATH}/history.txt"
+
+OPENER=xdg-open
+TERM_EMU=kitty
+TEXT_EDITOR=$EDITOR
+FILE_MANAGER=xdg-open
+BLUETOOTH_SEND=blueman-sendto
+
+CUR_DIR=$PWD
+NEXT_DIR=""
+FD_INSTALLED=$(command -v fd)
+
+SHOW_HIDDEN=false
+
+# Setup menu options
+declare -a OPEN_FILE_LOCATION=(
+ "Open file location in ${TERM_EMU}"
+ "Open file location in ${FILE_MANAGER}"
+)
+declare -a RUN_COMMANDS=(
+ "Run"
+ "Execute in ${TERM_EMU}"
+)
+declare -a STANDARD_CONTROLS=(
+ "Move to trash"
+ "Delete"
+ "Back"
+)
+declare -a SHELL_NO_X_OPTIONS=(
+ "Edit"
+ "${OPEN_FILE_LOCATION[@]}"
+ "${STANDARD_CONTROLS[@]}"
+)
+declare -a SHELL_OPTIONS=(
+ "${RUN_COMMANDS[@]}"
+ "${SHELL_NO_X_OPTIONS[@]}"
+)
+declare -a BIN_NO_X_OPTIONS=(
+ "${OPEN_FILE_LOCATION[@]}"
+ "Back"
+)
+declare -a BIN_OPTIONS=(
+ "${RUN_COMMANDS[@]}"
+ "${BIN_NO_X_OPTIONS[@]}"
+)
+declare -a TEXT_OPTIONS=("${SHELL_NO_X_OPTIONS[@]}")
+declare -a HTML_OPTIONS=(
+ "Open"
+ "Edit"
+ "${OPEN_FILE_LOCATION[@]}"
+ "${STANDARD_CONTROLS[@]}"
+)
+declare -a XCF_SVG_OPTIONS=(
+ "Open"
+ "${OPEN_FILE_LOCATION[@]}"
+ "${STANDARD_CONTROLS[@]}"
+)
+declare -a IMAGE_OPTIONS=(
+ "Open"
+ "Send via Bluetooth"
+ "${OPEN_FILE_LOCATION[@]}"
+ "${STANDARD_CONTROLS[@]}"
+)
+
+declare -a ALL_OPTIONS=()
+
+# Combine all context menu
+COMBINED_OPTIONS=(
+ "${SHELL_OPTIONS[@]}"
+ "${IMAGE_OPTIONS[@]}"
+)
+
+# Remove duplicates
+ALL_OPTIONS=("$(printf '%s\n' "${COMBINED_OPTIONS[@]}" | sort -u)")
+
+# Create tmp dir for rofi
+[ ! -d "${TMP_DIR}" ] && mkdir -p "${TMP_DIR}";
+
+# Create hist file if it doesn't exist
+[ ! -f "${HIST_FILE}" ] && touch "${HIST_FILE}"
+
+# Help message
+if [ -n "$*" ] && [[ "$*" = ":help" ]]
+then
+ echo -en "Rofi Spotlight
+A Rofi with file and web searching functionality
+
+Commands:
+:help to print this help message
+:h or :hidden to show hidden files/dirs
+:sh or :show_hist to show search history
+:ch or :clear_hist to clear search history
+:xdg to jump to an xdg directory
+Examples:
+ :xdg DOCUMENTS
+ :xdg DOWNLOADS
+Also supports incomplete path:
+Examples:
+ :xdg doc
+ :xdg down
+For more info about XDG dirs, see:
+\`man xdg-user-dir\`
+
+File search syntaxes:
+! to search for a file and web suggestions
+? to search parent directories
+Examples:
+ !half-life 3
+ ?portal 3
+
+Web search syntaxes:
+! to gets search suggestions
+:web/:w to also to gets search suggestions
+:webbro/:wb to search directly from your browser
+Examples:
+ !how to install archlinux
+ :web how to install gentoo
+ :w how to make a nuclear fission
+ :webbro how to install wine in windowsxp
+Back\0icon\x1fdraw-arrow-back\n"
+
+ exit
+fi
+
+# Return the icon string
+function icon_file_type(){
+ icon_name=""
+ mime_type=$(file --mime-type -b "${1}")
+
+ case "${mime_type}" in
+ "inode/directory")
+ case "${1}" in
+ "Desktop/" )
+ icon_name='folder-blue-desktop'
+ ;;
+ "Documents/" )
+ icon_name='folder-blue-documents'
+ ;;
+ "Downloads/" )
+ icon_name='folder-blue-downloads'
+ ;;
+ "Music/" )
+ icon_name='folder-blue-music'
+ ;;
+ "Pictures/" )
+ icon_name='folder-blue-pictures'
+ ;;
+ "Public/" )
+ icon_name='folder-blue-public'
+ ;;
+ "Templates/" )
+ icon_name='folder-blue-templates'
+ ;;
+ "Videos/" )
+ icon_name='folder-blue-videos'
+ ;;
+ "root/" )
+ icon_name='folder-root'
+ ;;
+ "home/" | "${USER}/")
+ icon_name='folder-home'
+ ;;
+ *"$" )
+ icon_name='folder-blue'
+ ;;
+ *)
+ icon_name='folder-blue'
+ ;;
+ esac
+ ;;
+ "inode/symlink" )
+ icon_name='inode-symlink'
+ ;;
+ "audio/flac" | "audio/mpeg" )
+ icon_name='music'
+ ;;
+ "video/mp4" )
+ icon_name='video-mp4'
+ ;;
+ "video/x-matroska" )
+ icon_name=video-x-matroska
+ ;;
+ "image/x-xcf" )
+ # notify-send '123'
+ icon_name='image-x-xcf'
+ ;;
+ "image/jpeg" | "image/png" | "image/svg+xml")
+ icon_name="${CUR_DIR}/${1}"
+ ;;
+ "image/gif" )
+ icon_name='gif'
+ ;;
+ "image/vnd.adobe.photoshop" )
+ icon_name='image-vnd.adobe.photoshop'
+ ;;
+ "image/webp" )
+ icon_name='gif'
+ ;;
+ "application/x-pie-executable" )
+ icon_name='binary'
+ ;;
+ "application/pdf" )
+ icon_name='pdf'
+ ;;
+ "application/zip" )
+ icon_name='application-zip'
+ ;;
+ "application/x-xz" )
+ icon_name='application-x-xz-compressed-tar'
+ ;;
+ "application/x-7z-compressed" )
+ icon_name='application-x-7zip'
+ ;;
+ "application/x-rar" )
+ icon_name='application-x-rar'
+ ;;
+ "application/octet-stream" | "application/x-iso9660-image" )
+ icon_name='application-x-iso'
+ ;;
+ "application/x-dosexec" )
+ icon_name='application-x-ms-dos-executable'
+ ;;
+ "text/plain" )
+ icon_name='application-text'
+ ;;
+ "text/x-shellscript" )
+ icon_name='application-x-shellscript'
+ ;;
+ "text/html" )
+ icon_name='text-html'
+ ;;
+ "font/sfnt" | "application/vnd.ms-opentype" )
+ icon_name='application-x-font-ttf'
+ ;;
+ * )
+ case "${1}" in
+ *."docx" | *".doc" )
+ icon_name='application-msword'
+ ;;
+ *."apk" )
+ icon_name='android-package-archive'
+ ;;
+ * )
+ icon_name='unknown'
+ ;;
+ esac
+ ;;
+ esac
+
+ echo -en "$1\0icon\x1f$icon_name\n"
+}
+
+export -f icon_file_type
+
+# Pass the argument to python script
+function web_search() {
+ # Pass the search query to web-search script
+ "${MY_PATH}/web-search.py" "${1}"
+ exit;
+}
+
+# Handles the web search method
+if [ ! -z "$@" ] && ([[ "$@" == ":webbro"* ]] || [[ "$@" == ":wb"* ]])
+then
+ remove=''
+ [[ "$*" = ":webbro"* ]] && remove=":webbro" || remove=":wb"
+
+ # Search directly from your web browser
+ web_search "$(printf '%s\n' "${1//$remove/}")"
+ exit;
+
+elif [ ! -z "$@" ] && ([[ "$@" == ":web"* ]] || [[ "$@" == ":w"* ]])
+then
+ remove=''
+ [[ "$*" = ":web"* ]] && remove=":web" || remove=":w"
+
+ # Get search suggestions
+ web_search "!$(printf '%s\n' "${1//$remove/}")"
+ exit;
+fi
+
+function find_query() {
+ QUERY=${1}
+ if [[ ! "${QUERY}" =~ ( |\') ]]
+ then
+ if [ -z "$FD_INSTALLED" ];
+ then
+ find "${HOME}" -iname *"${QUERY}"* | sed "s/\/home\/$USER/\~/" |
+ awk -v MY_PATH="${MY_PATH}" '{print $0"\0icon\x1f"MY_PATH"/icons/result.svg\n"}'
+ else
+ fd -H ${QUERY} ${HOME} | sed "s/\/home\/$USER/\~/" |
+ awk -v MY_PATH="${MY_PATH}" '{print $0"\0icon\x1f"MY_PATH"/icons/result.svg\n"}'
+ fi
+ fi
+}
+
+# File and calls to the web search
+if [ ! -z "$@" ] && ([[ "$@" == ?(\~)/* ]] || [[ "$@" == \?* ]] || [[ "$@" == \!* ]])
+then
+ QUERY=$@
+
+ echo "${QUERY}" >> "${HIST_FILE}"
+
+ if [[ "$@" == ?(\~)/* ]]
+ then
+ [[ "$*" = \~* ]] && QUERY="${QUERY//"~"/"$HOME"}"
+
+ coproc ${OPENER} "${QUERY}" > /dev/null 2>&1
+ exec 1>&-
+ exit
+
+ elif [[ "$@" == \?* ]]
+ then
+ find_query ${QUERY#\?}
+
+ else
+ # Find the file
+ find_query ${QUERY#!}
+
+ # Web search
+ web_search "! ${QUERY#!}"
+ fi
+ exit;
+fi
+
+# Create notification if there's an error
+function create_notification() {
+ case "${1}" in
+ "denied" )
+ notify-send -a "Global Search" "Permission denied!" \
+ 'You have no permission to access '"${CUR_DIR}!"
+ ;;
+ "deleted" )
+ notify-send -a "Global Search" "Success!" \
+ 'File deleted!'
+ ;;
+ "trashed" )
+ notify-send -a "Global Search" "Success!" \
+ 'The file has been moved to trash!'
+ ;;
+ "cleared" )
+ notify-send -a "Global Search" "Success!" \
+ 'Search history has been successfully cleared!'
+ ;;
+ * )
+ notify-send -a "Global Search" "Somethings wrong I can feel it!" \
+ 'This incident will be reported!'
+ ;;
+ esac
+}
+
+# Show the files in the current directory
+function navigate_to() {
+ # process current dir.
+ if [ -n "${CUR_DIR}" ]
+ then
+ CUR_DIR=$(readlink -e "${CUR_DIR}")
+ if [ ! -d "${CUR_DIR}" ] || [ ! -r "${CUR_DIR}" ]
+ then
+ create_notification "denied"
+ CUR_DIR=$(realpath ${CUR_DIR} | xargs dirname)
+ echo "${CUR_DIR}" > "${PREV_LOC_FILE}"
+ else
+ echo "${CUR_DIR}/" > "${PREV_LOC_FILE}"
+ fi
+ pushd "${CUR_DIR}" >/dev/null || exit
+ fi
+
+ printf "..\0icon\x1fup\n"
+
+ if [[ -z "$FD_INSTALLED" ]]
+ then
+ #Group directories
+ if [[ ${SHOW_HIDDEN} == true ]]
+ then
+ for i in .*/
+ do
+ [[ -d "${i}" ]] && ([[ "${i}" != "./" ]] && [[ "${i}" != "../"* ]]) && icon_file_type "${i}"
+ done
+ fi
+ for i in */
+ do
+ [[ -d "${i}" ]] && icon_file_type "${i}"
+ done
+ #Group files
+ if [[ ${SHOW_HIDDEN} = true ]]
+ then
+ for i in .*
+ do
+ [[ -f "${i}" ]] && icon_file_type "${i}"
+ done
+ fi
+ for i in *
+ do
+ [[ -f "${i}" ]] && icon_file_type "${i}"
+ done
+ else
+ THREADS=$(getconf _NPROCESSORS_ONLN)
+ export CUR_DIR
+ if [[ ${SHOW_HIDDEN} == true ]]
+ then
+ fd -Ht d -d 1 -x bash -c 'icon_file_type "$1/"' _ {} \ | sort -V --parallel=$THREADS
+ fd -Ht f -d 1 -x bash -c 'icon_file_type "$1"' _ {} \ | sort -V --parallel=$THREADS
+ else
+ fd -t d -d 1 -x bash -c 'icon_file_type "$1/"' _ {} \ | sort -V --parallel=$THREADS
+ fd -t f -d 1 -x bash -c 'icon_file_type "$1"' _ {} \ | sort -V --parallel=$THREADS
+ fi
+ fi
+}
+
+# Set XDG dir
+function return_xdg_dir() {
+ target_dir=${1^^}
+
+ if [[ "HOME" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir)
+
+ elif [[ "DESKTOP" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir DESKTOP)
+
+ elif [[ "DOCUMENTS" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir DOCUMENTS)
+
+ elif [[ "DOWNLOADS" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir DOWNLOAD)
+
+ elif [[ "MUSIC" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir MUSIC)
+
+ elif [[ "PICTURES" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir PICTURES)
+
+ elif [[ "PUBLICSHARE" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir PUBLICSHARE)
+
+ elif [[ "TEMPLATES" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir TEMPLATES)
+
+ elif [[ "VIDEOS" == *"${target_dir}"* ]]
+ then
+ CUR_DIR=$(xdg-user-dir VIDEOS)
+
+ elif [[ "ROOT" == *"${target_dir}"* ]]
+ then
+ CUR_DIR="/"
+
+ else
+ CUR_DIR="${HOME}"
+ fi
+ navigate_to
+ exit;
+}
+
+# Show and Clear History
+if [ ! -z "$@" ] && ([[ "$@" == ":sh" ]] || [[ "$@" == ":show_hist" ]])
+then
+ hist=$(tac "${HIST_FILE}")
+
+ echo -en "Back\0icon\x1fdraw-arrow-back\n"
+ [ -z "${hist}" ] && echo -en "No History Yet\0icon\x1ftext-plain\n"
+
+ while IFS= read -r line;
+ do
+ echo -en "${line}\0icon\x1f${MY_PATH}/icons/history.svg\n";
+ done <<< "${hist}"
+
+ exit;
+elif [ ! -z "$@" ] && ([[ "$@" == ":ch" ]] || [[ "$@" == ":clear_hist" ]])
+then
+ :> "${HIST_FILE}"
+ create_notification "cleared"
+
+ CUR_DIR="${HOME}"
+ navigate_to
+ exit;
+fi
+
+# Accepts XDG command
+if [[ ! -z "$@" ]] && [[ "$@" == ":xdg"* ]]
+then
+ NEXT_DIR=${*//":xdg "/}
+
+ [[ -n "$NEXT_DIR" ]] && return_xdg_dir "${NEXT_DIR}" || return_xdg_dir "${HOME}"
+fi
+
+# Read last location, otherwise we default to PWD.
+[ -f "${PREV_LOC_FILE}" ] && CUR_DIR=$(< "${PREV_LOC_FILE}")
+
+if [[ ! -z "$@" ]] && ([[ "$@" == ":h" ]] || [[ "$@" == ":hidden" ]])
+then
+ SHOW_HIDDEN=true
+ navigate_to
+ exit;
+fi
+
+# Handle argument.
+[ -n "$*" ] && CUR_DIR="${CUR_DIR}/$*"
+
+# Context Menu
+if [ -n "$*" ] && [[ "${ALL_OPTIONS[*]} " = *"$*"* ]]
+then
+ case "${1}" in
+ "Run" )
+ coproc ( eval "$(< ${CURRENT_FILE})" & > /dev/null 2>&1 )
+ kill -9 $(pgrep rofi)
+ ;;
+ "Execute in ${TERM_EMU}" )
+ coproc ( eval "${TERM_EMU} \"$(< ${CURRENT_FILE})\"" & > /dev/null 2>&1 )
+ kill -9 $(pgrep rofi)
+ ;;
+ "Open" )
+ coproc ( eval "${OPENER} \"$(< ${CURRENT_FILE})\"" & > /dev/null 2>&1 )
+ kill -9 $(pgrep rofi)
+ ;;
+ "Open file location in ${TERM_EMU}" )
+ file_path="$(< ${CURRENT_FILE})"
+ coproc ( ${TERM_EMU} bash -c "cd ${file_path%/*} ; ${SHELL}" & > /dev/null 2>&1 )
+ kill -9 $(pgrep rofi)
+ ;;
+ "Open file location in ${FILE_MANAGER}" )
+ file_path="$(< "${CURRENT_FILE}")"
+ coproc ( eval "${FILE_MANAGER} "${file_path%/*}"" & > /dev/null 2>&1 )
+ kill -9 $(pgrep rofi)
+ ;;
+ "Edit" )
+ coproc ( eval "${TERM_EMU} ${TEXT_EDITOR} \"$(< ${CURRENT_FILE})\"" & > /dev/null 2>&1 )
+ kill -9 $(pgrep rofi)
+ ;;
+ "Move to trash" )
+ coproc( gio trash "$(< ${CURRENT_FILE})" & > /dev/null 2>&1 )
+ create_notification "trashed"
+ CUR_DIR="$(dirname "$(< ${CURRENT_FILE})")"
+ navigate_to
+ ;;
+ "Delete" )
+ shred "$(< ${CURRENT_FILE})"
+ rm "$(< ${CURRENT_FILE})"
+ create_notification "deleted"
+ CUR_DIR="$(dirname "$(< ${CURRENT_FILE})")"
+ navigate_to
+ ;;
+ "Send via Bluetooth" )
+ rfkill unblock bluetooth && bluetoothctl power on
+ sleep 1
+ blueman-sendto "$(< ${CURRENT_FILE})" & > /dev/null 2>&1
+ kill -9 $(pgrep rofi)
+ ;;
+ "Back" )
+ CUR_DIR="$(< ${PREV_LOC_FILE})"
+ navigate_to
+ ;;
+ esac
+ exit;
+fi
+
+function context_menu_icons() {
+
+ if [[ "${1}" == "Run" ]]
+ then
+ echo '\0icon\x1fsystem-run\n'
+
+ elif [[ "${1}" == "Execute in ${TERM_EMU}" ]]
+ then
+ echo "\0icon\x1f${TERM_EMU}\n"
+
+ elif [[ "${1}" == "Open" ]]
+ then
+ echo "\0icon\x1futilities-x-terminal\n"
+
+ elif [[ "${1}" == "Open file location in ${TERM_EMU}" ]]
+ then
+ echo "\0icon\x1f${TERM_EMU}\n"
+
+ elif [[ "${1}" == "Open file location in ${FILE_MANAGER}" ]]
+ then
+ echo "\0icon\x1fblue-folder-open\n"
+
+ elif [[ "${1}" == "Edit" ]]
+ then
+ echo "\0icon\x1faccessories-text-editor\n"
+
+ elif [[ "${1}" == "Move to trash" ]]
+ then
+ echo "\0icon\x1fapplication-x-trash\n"
+
+ elif [[ "${1}" == "Delete" ]]
+ then
+ echo "\0icon\x1findicator-trashindicator\n"
+
+ elif [[ "${1}" == "Send via Bluetooth" ]]
+ then
+ echo "\0icon\x1fbluetooth\n"
+
+ elif [[ "${1}" == "Back" ]]
+ then
+ echo "\0icon\x1fback\n"
+ fi
+}
+
+function print_context_menu() {
+ declare -a arg_arr=("${!1}")
+
+ for menu in "${arg_arr[@]}"
+ do
+ printf "$menu$(context_menu_icons "${menu}")\n"
+ done
+}
+
+function context_menu() {
+
+ type="$(file --mime-type -b "${CUR_DIR}")"
+
+ if [ -w "${CUR_DIR}" ] && [[ "${type}" == "text/x-shellscript" ]]
+ then
+ if [ -x "${CUR_DIR}" ];
+ then
+ print_context_menu SHELL_OPTIONS[@]
+ else
+ print_context_menu SHELL_NO_X_OPTIONS[@]
+ fi
+
+ elif [[ "${type}" == "application/x-executable" ]] || [[ "${type}" == "application/x-pie-executable" ]]
+ then
+ if [ -x "${CUR_DIR}" ]
+ then
+ print_context_menu BIN_OPTIONS[@]
+ else
+ print_context_menu BIN_NO_X_OPTIONS[@]
+ fi
+
+ elif [[ "${type}" == "text/plain" ]]
+ then
+ print_context_menu TEXT_OPTIONS[@]
+
+ elif [[ "${type}" == "text/html" ]]
+ then
+ print_context_menu HTML_OPTIONS[@]
+
+ elif [[ "${type}" == "image/jpeg" ]] || [[ "${type}" == "image/png" ]]
+ then
+ print_context_menu IMAGE_OPTIONS[@]
+
+ elif [[ "${type}" == "image/x-xcf" ]] || [[ "${type}" == "image/svg+xml" ]]
+ then
+ print_context_menu XCF_SVG_OPTIONS[@]
+
+ elif [ ! -w "${CUR_DIR}" ] && [[ "${type}" == "text/x-shellscript" ]]
+ then
+ coproc ( exec "${CUR_DIR}" & > /dev/null 2>&1 )
+
+ else
+ if [ ! -d "${CUR_DIR}" ] && [ ! -f "${CUR_DIR}" ]
+ then
+ QUERY="${CUR_DIR//*\/\//}"
+
+ echo "${QUERY}" >> "${HIST_FILE}"
+
+ find_query "${QUERY#!}"
+
+ web_search "!${QUERY}"
+ else
+ coproc ( ${OPENER} "${CUR_DIR}" & > /dev/null 2>&1 )
+ fi
+ fi
+ exit;
+}
+
+# If argument is not a directory/folder
+if [ ! -d "${CUR_DIR}" ]
+then
+ echo "${CUR_DIR}" > "${CURRENT_FILE}"
+ context_menu
+ exit;
+fi
+
+navigate_to
diff --git a/rofi/global/rofi.rasi b/rofi/global/rofi.rasi
new file mode 100644
index 0000000..d14ecd2
--- /dev/null
+++ b/rofi/global/rofi.rasi
@@ -0,0 +1,157 @@
+configuration {
+ font: "Inter Regular 10";
+ sidebar-mode: true;
+ show-icons: true;
+ fullscreen: false;
+ threads: 0;
+ matching: "fuzzy";
+ scroll-method: 0;
+ monitor: "primary";
+}
+
+* {
+ transparent: #00000000;
+ foreground: #F2F2F2EE;
+ background-selected: #F2F2F245;
+ background-active: #F2F2F230;
+ background-white: #F2F2F211;
+ background-black: #00000000;
+ urgent: #E91E6366;
+ urgent-selected: #E91E6377;
+}
+
+window {
+ transparency: "real";
+ background-color: @transparent;
+ text-color: @foreground;
+ location: west;
+ anchor: west;
+ x-offset: 0;
+ height: 100%;
+ width: 350px;
+ orientation: vertical;
+}
+
+prompt {
+ enabled: false;
+}
+
+button {
+ action: "ok";
+ str: " ";
+ font: "FantasqueSansMono Nerd Font 16";
+ expand: false;
+ text-color: @foreground;
+ background-color: @transparent;
+ vertical-align: 0.5;
+ horizontal-align: 0.5;
+}
+
+entry {
+ font: "Inter Regular 12";
+ background-color: @transparent;
+ text-color: @foreground;
+ expand: true;
+ vertical-align: 0.5;
+ horizontal-align: 0;
+ placeholder: "Global Search";
+ placeholder-color: @foreground;
+ blink: true;
+}
+
+entry-wrapper {
+ orientation: horizontal;
+ margin: 0 12px 0 12px;
+ spacing: 24px;
+ vertical-align: 0.5;
+ background-color: @transparent;
+ children: [ button, entry ];
+}
+
+inputbar {
+ padding: 14px;
+ margin: 10px 10px 14px 10px;
+ background-color: @background-white;
+ text-color: @foreground;
+ expand: false;
+ border-radius: 9px;
+ position: north;
+ children: [ entry-wrapper ];
+}
+
+listview {
+ background-color: @transparent;
+ spacing: 0;
+ cycle: true;
+ dynamic: true;
+ scrollbar: true;
+}
+
+mainbox {
+ width: 200px;
+ expand: true;
+ spacing: 12px;
+ padding: 5px;
+ background-color: @background-black;
+ children: [ inputbar, listview ];
+}
+
+scrollbar {
+ background-color: @background-white;
+ handle-width: 0;
+ margin: 0 0 5px 0;
+ border-radius: 9px;
+}
+
+element {
+ background-color: @transparent;
+ text-color: @foreground;
+ orientation: horizontal;
+ border: 0;
+ border-color: @background-white;
+ border-radius: 6px;
+ spacing: 24px;
+ margin: 0px 12px 0px 12px;
+ padding: 10px 24px 10px 24px;
+}
+
+element-icon {
+ size: 24px;
+ border: 0;
+ border-color: @transparent;
+}
+
+element-text {
+ font: "Inter Regular 11";
+ expand: true;
+ horizontal-align: 0;
+ vertical-align: 0.5;
+}
+
+element normal.urgent,
+element alternate.urgent {
+ background-color: @urgent;
+ text-color: @foreground;
+ border-radius: 9px;
+}
+
+element normal.active,
+element alternate.active {
+ background-color: @background-active;
+ text-color: @foreground;
+}
+
+element selected {
+ background-color: @background-selected;
+ text-color: @foreground;
+}
+
+element selected.urgent {
+ background-color: @urgent-selected;
+ text-color: @foreground;
+}
+
+element selected.active {
+ background-color: @background-active;
+ color: @foreground-selected;
+}
diff --git a/rofi/global/web-search.py b/rofi/global/web-search.py
new file mode 100755
index 0000000..ba314d5
--- /dev/null
+++ b/rofi/global/web-search.py
@@ -0,0 +1,167 @@
+#!/usr/bin/env python3
+
+# MIT License
+
+# Copyright (c) 2019 Paolo Donadeo
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+
+import json
+import re
+import urllib.parse
+import urllib.request
+import sys
+import os
+import datetime
+import gzip
+
+import subprocess as sp
+
+import html
+
+
+################################################################################
+##### C O N F I G U R A T I O N ######
+################################################################################
+SEARCH_ENGINE = 'google' # or 'duckduckgo'
+BROWSER = 'firefox' # or 'firefox', 'chromium', 'brave', 'lynx'
+TERMINAL = ['kitty', '--'] # or ['st', '-e'] or something like that
+################################################################################
+
+CONFIG = {
+ 'BROWSER_PATH' : {
+ 'chrome' : ['google-chrome-stable'],
+ 'firefox' : ['firefox'],
+ 'chromium' : ['chromium-browser'],
+ 'brave' : ['brave-browser'],
+ 'lynx' : TERMINAL + ['lynx']
+ },
+ 'USER_AGENT' : {
+ 'chrome' : 'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
+ 'firefox' : 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',
+ 'chromium' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/76.0.3809.100 Chrome/76.0.3809.100 Safari/537.36',
+ 'brave' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
+ 'lynx' : 'Lynx/2.8.9rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/1.1.1d'
+ },
+ 'SEARCH_ENGINE_NAME' : {
+ 'google' : 'Google',
+ 'duckduckgo' : 'DuckDuckGo'
+ },
+ 'SEARCH_URL' : {
+ 'google' : 'https://www.google.com/search?q=',
+ 'duckduckgo' : 'https://duckduckgo.com/?q='
+ },
+ 'SUGGESTION_URL' : {
+ 'google' : 'https://www.google.com/complete/search?',
+ 'duckduckgo' : 'https://duckduckgo.com/ac/?'
+ }
+}
+
+def cleanhtml(txt):
+ return re.sub(r'<.*?>', '', txt)
+
+def fetch_suggestions(search_string):
+ if SEARCH_ENGINE == 'google':
+ r = {
+ 'q' : search_string,
+ 'cp' : '11',
+ 'client' : 'psy-ab',
+ 'xssi' : 't',
+ 'gs_ri' : 'gws-wiz',
+ 'hl' : 'en-IT',
+ 'authuser' : '0'
+ }
+ url = CONFIG['SUGGESTION_URL'][SEARCH_ENGINE] + urllib.parse.urlencode(r)
+ headers = {
+ 'sec-fetch-mode' : 'cors',
+ 'dnt' : '1',
+ 'accept-encoding' : 'gzip',
+ 'accept-language' : 'en-US;q=0.9,en;q=0.8',
+ 'pragma' : 'no-cache',
+ 'user-agent' : CONFIG['USER_AGENT'][BROWSER],
+ 'accept' : '*/*',
+ 'cache-control' : 'no-cache',
+ 'authority' : 'www.google.com',
+ 'referer' : 'https://www.google.com/',
+ 'sec-fetch-site' : 'same-origin'
+ }
+ req = urllib.request.Request(url, headers=headers, method='GET')
+
+ reply_data = gzip.decompress(urllib.request.urlopen(req).read()).split(b'\n')[1]
+ reply_data = json.loads(reply_data)
+ return [ cleanhtml(res[0]).strip() for res in reply_data[0] ]
+ else: # 'duckduckgo'
+ if search_string.startswith('!'):
+ bang_search = True
+ search_string = search_string.lstrip('!')
+ else:
+ bang_search = False
+ r = {
+ 'q' : search_string,
+ 'callback' : 'autocompleteCallback',
+ 'kl' : 'wt-wt',
+ '_' : str(int((datetime.datetime.now().timestamp())*1000))
+ }
+ url = CONFIG['SUGGESTION_URL'][SEARCH_ENGINE] + urllib.parse.urlencode(r)
+ if bang_search:
+ url = url.replace('?q=', '?q=!')
+ headers = {
+ 'pragma' : 'no-cache',
+ 'dnt' : '1',
+ 'accept-encoding' : 'gzip',
+ 'accept-language' : 'en-US;q=0.9,en;q=0.8',
+ 'user-agent' : CONFIG['USER_AGENT'][BROWSER],
+ 'sec-fetch-mode' : 'no-cors',
+ 'accept' : '*/*',
+ 'cache-control' : 'no-cache',
+ 'authority' : 'duckduckgo.com',
+ 'referer' : 'https://duckduckgo.com/',
+ 'sec-fetch-site' : 'same-origin',
+ }
+ req = urllib.request.Request(url, headers=headers, method='GET')
+ reply_data = gzip.decompress(urllib.request.urlopen(req).read()).decode('utf8')
+ reply_data = json.loads(re.match(r'autocompleteCallback\((.*)\);', reply_data).group(1))
+ return [ cleanhtml(res['phrase']).strip() for res in reply_data ]
+
+def main():
+ search_string = html.unescape((' '.join(sys.argv[1:])).strip())
+
+ path_str = os.path.dirname(os.path.realpath(__file__)) + '/'
+ icon_path_str = path_str + 'icons/'
+ icon_name = icon_path_str
+
+ if SEARCH_ENGINE == 'google':
+ icon_name += 'google.svg'
+ else:
+ icon_name += 'ddg.svg'
+
+ if search_string.startswith('!'):
+ search_string = search_string.rstrip('!').strip()
+ results = fetch_suggestions(search_string)
+ for r in results:
+ print(":wb " + html.unescape(r) + "\0icon\x1f"+icon_name+"\n")
+ else:
+ url = CONFIG['SEARCH_URL'][SEARCH_ENGINE] + urllib.parse.quote_plus(search_string)
+ sp.Popen(CONFIG['BROWSER_PATH'][BROWSER] + [url], stdout=sp.DEVNULL, stderr=sp.DEVNULL, shell=False)
+
+if __name__ == "__main__":
+ try:
+ main()
+ except Exception as e:
+ if e:
+ sys.exit(1)
diff --git a/rofi/rofi.rasi b/rofi/rofi.rasi
new file mode 100644
index 0000000..1ab875f
--- /dev/null
+++ b/rofi/rofi.rasi
@@ -0,0 +1,149 @@
+configuration {
+ font: "Inter Regular 10";
+ show-icons: true;
+ drun-display-format: "{name}";
+ fullscreen: false;
+ threads: 0;
+ matching: "fuzzy";
+ scroll-method: 0;
+ disable-history: false;
+ fullscreen: true;
+ window-thumbnail: true;
+}
+
+* {
+ transparent: #00000000;
+ foreground: #F2F2F2EE;
+ background-selected: #F2F2F245;
+ background-active: #F2F2F230;
+ background-white: #F2F2F211;
+ background-black: #00000066;
+ urgent: #E91E6366;
+ urgent-selected: #E91E6377;
+}
+
+window {
+ transparency: "real";
+ background-color: @transparent;
+ text-color: @foreground;
+ location: northwest;
+ anchor: northwest;
+}
+
+prompt {
+ enabled: false;
+}
+
+button {
+ action: "ok";
+ str: " ";
+ font: "FantasqueSansMono Nerd Font 11";
+ expand: false;
+ text-color: @foreground;
+ background-color: @transparent;
+ vertical-align: 0.7;
+ horizontal-align: 0.5;
+}
+
+entry {
+ font: "Inter Regular 11";
+ background-color: @transparent;
+ text-color: @foreground;
+ expand: true;
+ vertical-align: 0.5;
+ horizontal-align: 0.5;
+ placeholder: "Type to search";
+ placeholder-color: @foreground;
+ blink: true;
+}
+
+case-indicator {
+ background-color: @transparent;
+ text-color: @foreground;
+ vertical-align: 0.5;
+ horizontal-align: 0.5;
+}
+
+entry-wrapper {
+ orientation: horizontal;
+ vertical-align: 0.5;
+ spacing: 4px;
+ background-color: @transparent;
+ children: [ button, entry, case-indicator ];
+}
+
+inputbar {
+ background-color: @background-white;
+ text-color: @foreground;
+ expand: false;
+ border-radius: 6px;
+ margin: 0px calc((100% - 640px) / 2) 0px calc((100% - 640px) / 2);
+ padding: 10px 10px 10px 10px;
+ position: north;
+ children: [ entry-wrapper ];
+}
+
+listview {
+ background-color: @transparent;
+ columns: 6;
+ spacing: 5px;
+ cycle: false;
+ dynamic: true;
+ layout: vertical;
+}
+
+mainbox {
+ background-color: @background-black;
+ children: [ inputbar, listview ];
+ spacing: 25px;
+ padding: 70px 15% 0 15%;
+ /*padding: 70px 135px 0 135px;*/
+}
+
+element {
+ background-color: @transparent;
+ text-color: @foreground;
+ orientation: vertical;
+ border-radius: 12px;
+ padding: 25px 0 25px 0;
+}
+
+element-icon {
+ size: 72px;
+ border: 0;
+}
+
+element-text {
+ expand: true;
+ horizontal-align: 0.5;
+ vertical-align: 0.5;
+ margin: 0 10px 0 10px;
+}
+
+element normal.urgent,
+element alternate.urgent {
+ background-color: @urgent;
+ text-color: @foreground;
+ border-radius: 9px;
+}
+
+element normal.active,
+element alternate.active {
+ background-color: @background-active;
+ text-color: @foreground;
+}
+
+element selected {
+ background-color: @background-selected;
+ text-color: @foreground;
+}
+
+element selected.urgent {
+ background-color: @urgent-selected;
+ text-color: @foreground;
+}
+
+element selected.active {
+ background-color: @background-active;
+ color: @foreground-selected;
+}