commit 5d2ce0045594647343fd6026fdee98eccf80adf4 Author: nevaforget Date: Mon Mar 23 17:42:26 2026 +0100 Initial commit: Moonarch reproduzierbares Arch-Linux-Setup Niri-basierter Wayland-Desktop mit greetd/regreet, Catppuccin Mocha Theming, Rofi-Menus, Waybar und vollstaendiger Post-Install-Automatisierung. Archinstall-Config klont das Repo automatisch via custom-commands, danach genuegt ein einzelner Befehl fuer die komplette Einrichtung. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..034a576 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# ABOUTME: Gitignore für Moonarch. +# ABOUTME: Schließt temporäre Dateien und Build-Artefakte aus. + +*.pyc +__pycache__/ +*.swp +*.swo +*~ +.DS_Store diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..c372859 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,20 @@ +# Moonarch + +Reproduzierbares Arch-Linux-Setup basierend auf archinstall + Post-Install-Automatisierung. + +## Projektstruktur + +- `config/` — archinstall-Konfiguration (inkl. custom-commands die das Repo nach /opt/moonarch klonen) +- `scripts/` — Post-Install- und Helper-Scripts +- `packages/` — Paketlisten (offiziell + AUR), getrennt gepflegt +- `defaults/` — XDG-Configs, Shell-Config, Helper-Binaries, greetd-Config, Wallpaper + +## Konventionen + +- Paketlisten sind einfache Textdateien, ein Paket pro Zeile, Kommentare mit `#` +- Shell-Scripts müssen POSIX-kompatibel oder explizit bash/zsh sein +- Alle Pfade im archinstall-Config relativ zum Installationsziel + +## Ich bin Apollo + +Benannt nach dem Programm, das Menschen zum Mond gebracht hat — passend für ein Projekt namens Moonarch. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4a87cc --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# Moonarch + +Reproduzierbares Arch-Linux-Setup mit Niri (Wayland Compositor), greetd/regreet, Catppuccin Mocha Theming und durchgehender Automatisierung. + +## Schnellstart + +1. Arch ISO booten +2. `archinstall --config /pfad/zur/user_configuration.json` (Disk + Kernel interaktiv) +3. Reboot — das Repo liegt bereits in `/opt/moonarch` +4. Einloggen, dann: + +```bash +/opt/moonarch/scripts/post-install.sh +``` + +5. Nochmal rebooten — fertig + +## Struktur + +``` +config/ archinstall-Konfiguration +packages/ Paketlisten (official.txt + aur.txt) +scripts/ Bootstrap, Post-Install, Update, Theme-Installer +defaults/ + bin/ moonarch-* Helper-Scripts (/usr/local/bin/) + xdg/ XDG-Defaults (/etc/xdg/) + shell/ Zsh-Konfiguration + etc/ greetd/regreet Konfiguration + backgrounds/ Greeter-Wallpaper +``` + +## Update + +```bash +moonarch-update +``` + +Aktualisiert Repo, Systempakete, fehlende Pakete und Defaults — alles interaktiv mit Bestaetigungen. + +## Stack + +- **Compositor:** Niri (Scrollable Tiling Wayland) +- **Greeter:** greetd + regreet +- **Bar:** Waybar +- **Launcher:** Rofi (lbonn Wayland Fork) +- **Terminal:** Foot +- **Theme:** Catppuccin Mocha + Sweet Cursors + Newaita Icons +- **Shell:** Zsh diff --git a/config/user_configuration.json b/config/user_configuration.json new file mode 100644 index 0000000..2d00b21 --- /dev/null +++ b/config/user_configuration.json @@ -0,0 +1,77 @@ +{ + "__comment": "ABOUTME: archinstall-Konfiguration für Moonarch.", + "__comment2": "ABOUTME: Basis-Setup — Kernel, Disk und Filesystem werden interaktiv gewählt.", + + "audio_config": { + "audio": "pipewire" + }, + + "bootloader": "Systemd-boot", + + "hostname": "moonarch", + + "locale_config": { + "sys_lang": "de_DE.UTF-8", + "sys_enc": "UTF-8", + "kb_layout": "de" + }, + + "network_config": { + "type": "nm" + }, + + "ntp": true, + + "packages": [ + "base-devel", + "btrfs-progs", + "efibootmgr", + "man-db", + "git", + "neovim", + "zsh", + "networkmanager", + "pipewire", + "pipewire-alsa", + "pipewire-jack", + "pipewire-pulse", + "wireplumber", + "docker", + "docker-compose", + "fwupd", + "ufw", + "greetd", + "greetd-regreet", + "niri", + "waybar", + "foot", + "dunst", + "polkit-gnome", + "stow" + ], + + "profile_config": { + "gfx_driver": "All open-source", + "greeter": "greetd", + "profile": { + "main": "Desktop", + "details": [] + } + }, + + "services": [ + "NetworkManager", + "bluetooth", + "docker", + "greetd", + "systemd-timesyncd", + "ufw" + ], + + "timezone": "Europe/Berlin", + + "custom-commands": [ + "git clone https://gitea.moonarch.de/nevaforget/moonarch.git /opt/moonarch", + "chown -R 1000:1000 /opt/moonarch" + ] +} diff --git a/defaults/backgrounds/moonarch-greeter.jpg b/defaults/backgrounds/moonarch-greeter.jpg new file mode 100644 index 0000000..86371cd Binary files /dev/null and b/defaults/backgrounds/moonarch-greeter.jpg differ diff --git a/defaults/bin/moonarch-bangs b/defaults/bin/moonarch-bangs new file mode 100755 index 0000000..dda8cec --- /dev/null +++ b/defaults/bin/moonarch-bangs @@ -0,0 +1,142 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-based tool launcher that provides a searchable menu of system utilities. +# ABOUTME: Includes VPN, sound, bluetooth, shortcuts, and other system management tools. + +declare -A LABELS +declare -A COMMANDS + +### +# List of defined 'bangs' + +# launch programs +# COMMANDS["apps"]="rofi -combi-modi window,drun -show combi" +# LABELS["apps"]="" + +# open bookmarks +# COMMANDS["bookmarks"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-bookmarks.sh" +# LABELS["bookmarks"]="" + +# search local files +COMMANDS[""]="moonarch-locate" +LABELS[""]="Locate" + +COMMANDS[""]="wlogout -P 1 -s -r 10 -c 10" +LABELS[""]="Session Menu" + +# open custom web searches +# COMMANDS["websearch"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-websearch.sh" +# LABELS["websearch"]="" + +# show clipboard history +# source: https://bitbucket.org/pandozer/rofi-clipboard-manager/overview +# COMMANDS["clipboard"]='rofi -modi "clipboard:~/.bin/rofi-clipboard-manager/mclip.py menu" -show clipboard && ~/.bin/rofi-clipboard-manager/mclip.py paste' +# LABELS["clipboard"]="" + +# references -------------------------- +# COMMANDS[";sr2"]="chromium 'wikipedia.org/search-redirect.php?search=\" \${input}\"" +# LABELS[";sr2"]="" + +# COMMANDS[";piratebay"]="chromium --disk-cache-dir=/tmp/cache http://thepiratebay.org/search/\" \${input}\"" +# LABELS[";piratebay"]="" + +# COMMANDS[".bin"]="spacefm -r '/home/dka/bin'" +# LABELS[".bin"]=".bin" + +# COMMANDS["#screenshot"]='/home/dka/bin/screenshot-scripts/myscreenshot.sh' +# LABELS["#screenshot"]="screenshot" + +# greenclip clipboard history +# source: https://github.com/erebe/greenclip +COMMANDS[""]='rofi -modi "clipboard:greenclip print" -show Clipboard' +LABELS[""]="Clipboard" + +COMMANDS["󰖂"]='moonarch-vpn' +LABELS["󰖂"]='VPN Connection Manager' + +COMMANDS["󰗅"]='moonarch-volume' +LABELS["󰗅"]='Sound Manager' + +#COMMANDS[""]='shortcuts module was removed' +#LABELS[""]='Hotkey List' + +COMMANDS["󰍹"]='wdisplays' +LABELS["󰍹"]='Display Setup' + +COMMANDS[""]='nwg-look' +LABELS[""]='Appearance Settings' + +COMMANDS["󱘆"]='noisetorch' +LABELS["󱘆"]='Audio Noise Reduction' + +COMMANDS["󰋋"]='$HOME/.local/share/headset-charge-indicator/headset-charge-indicator.py &' +LABELS["󰋋"]='Headset Control' + +COMMANDS[""]='moonarch-bluetooth' +LABELS[""]='Bluetooth Control' + +COMMANDS["󰛳"]='nm-applet --indicator &' +LABELS["󰛳"]='Networker Manager' + +COMMANDS["󰴱"]='wl-color-picker' +LABELS["󰴱"]='Color Picker' + +COMMANDS["󰚞"]='font-manager' +LABELS["󰚞"]='Font Manager' + +COMMANDS["󱨑"]='gufw' +LABELS["󱨑"]='Firewall Settings' + +COMMANDS[""]='stacer' +LABELS[" "]='System Maintenance' + + +################################################################################ +# do not edit below +################################################################################ +## +# Generate menu +## +function print_menu() +{ + for key in ${!LABELS[@]} + do + # echo "$key ${LABELS}" + echo "$key ${LABELS[$key]}" + # my top version just shows the first field in labels row, not two words side by side + done +} +## +# Show rofi. +## +function start() +{ + # print_menu | rofi -dmenu -p "?=>" + print_menu | sort | rofi -show "Tools" -dmenu -mesg " Tools" -i -p "rofi-bangs: " +} + + +# Run it +value="$(start)" + +# Split input. +# grab upto first space. +choice=${value%%\ *} +# graph remainder, minus space. +input=${value:$((${#choice}+1))} + +## +# Cancelled? bail out +## +if test -z ${choice} +then + exit +fi + +# check if choice exists +if test ${COMMANDS[$choice]+isset} +then + # Execute the choice + ${COMMANDS[$choice]} +else + echo "Unknown command: ${choice}" | rofi -dmenu -p "error" +fi diff --git a/defaults/bin/moonarch-bluetooth b/defaults/bin/moonarch-bluetooth new file mode 100755 index 0000000..5571d93 --- /dev/null +++ b/defaults/bin/moonarch-bluetooth @@ -0,0 +1,314 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-based Bluetooth device manager using bluetoothctl. +# ABOUTME: Supports connecting, pairing, trusting devices, and toggling power/scan/discoverable. + +# Author: Nick Clyde (clydedroid) +# +# A script that generates a rofi menu that uses bluetoothctl to +# connect to bluetooth devices and display status info. +# +# Inspired by networkmanager-dmenu (https://github.com/firecat53/networkmanager-dmenu) +# Thanks to x70b1 (https://github.com/polybar/polybar-scripts/tree/master/polybar-scripts/system-bluetooth-bluetoothctl) +# +# Depends on: +# Arch repositories: rofi, bluez-utils (contains bluetoothctl) + +# Constants +divider="---------" +goback="Back" + +# Checks if bluetooth controller is powered on +power_on() { + if bluetoothctl show | grep -q "Powered: yes"; then + return 0 + else + return 1 + fi +} + +# Toggles power state +toggle_power() { + if power_on; then + bluetoothctl power off + show_menu + else + if rfkill list bluetooth | grep -q 'blocked: yes'; then + rfkill unblock bluetooth && sleep 3 + fi + bluetoothctl power on + show_menu + fi +} + +# Checks if controller is scanning for new devices +scan_on() { + if bluetoothctl show | grep -q "Discovering: yes"; then + echo "Scan: on" + return 0 + else + echo "Scan: off" + return 1 + fi +} + +# Toggles scanning state +toggle_scan() { + if scan_on; then + kill $(pgrep -f "bluetoothctl scan on") + bluetoothctl scan off + show_menu + else + bluetoothctl scan on & + echo "Scanning..." + sleep 5 + show_menu + fi +} + +# Checks if controller is able to pair to devices +pairable_on() { + if bluetoothctl show | grep -q "Pairable: yes"; then + echo "Pairable: on" + return 0 + else + echo "Pairable: off" + return 1 + fi +} + +# Toggles pairable state +toggle_pairable() { + if pairable_on; then + bluetoothctl pairable off + show_menu + else + bluetoothctl pairable on + show_menu + fi +} + +# Checks if controller is discoverable by other devices +discoverable_on() { + if bluetoothctl show | grep -q "Discoverable: yes"; then + echo "Discoverable: on" + return 0 + else + echo "Discoverable: off" + return 1 + fi +} + +# Toggles discoverable state +toggle_discoverable() { + if discoverable_on; then + bluetoothctl discoverable off + show_menu + else + bluetoothctl discoverable on + show_menu + fi +} + +# Checks if a device is connected +device_connected() { + device_info=$(bluetoothctl info "$1") + if echo "$device_info" | grep -q "Connected: yes"; then + return 0 + else + return 1 + fi +} + +# Toggles device connection +toggle_connection() { + if device_connected "$1"; then + bluetoothctl disconnect "$1" + device_menu "$device" + else + bluetoothctl connect "$1" + device_menu "$device" + fi +} + +# Checks if a device is paired +device_paired() { + device_info=$(bluetoothctl info "$1") + if echo "$device_info" | grep -q "Paired: yes"; then + echo "Paired: yes" + return 0 + else + echo "Paired: no" + return 1 + fi +} + +# Toggles device paired state +toggle_paired() { + if device_paired "$1"; then + bluetoothctl remove "$1" + device_menu "$device" + else + bluetoothctl pair "$1" + device_menu "$device" + fi +} + +# Checks if a device is trusted +device_trusted() { + device_info=$(bluetoothctl info "$1") + if echo "$device_info" | grep -q "Trusted: yes"; then + echo "Trusted: yes" + return 0 + else + echo "Trusted: no" + return 1 + fi +} + +# Toggles device connection +toggle_trust() { + if device_trusted "$1"; then + bluetoothctl untrust "$1" + device_menu "$device" + else + bluetoothctl trust "$1" + device_menu "$device" + fi +} + +# Prints a short string with the current bluetooth status +# Useful for status bars like polybar, etc. +print_status() { + if power_on; then + printf '' + + paired_devices_cmd="devices Paired" + # Check if an outdated version of bluetoothctl is used to preserve backwards compatibility + if (( $(echo "$(bluetoothctl version | cut -d ' ' -f 2) < 5.65" | bc -l) )); then + paired_devices_cmd="paired-devices" + fi + + mapfile -t paired_devices < <(bluetoothctl $paired_devices_cmd | grep Device | cut -d ' ' -f 2) + counter=0 + + for device in "${paired_devices[@]}"; do + if device_connected "$device"; then + device_alias=$(bluetoothctl info "$device" | grep "Alias" | cut -d ' ' -f 2-) + + if [ $counter -gt 0 ]; then + printf ", %s" "$device_alias" + else + printf " %s" "$device_alias" + fi + + ((counter++)) + fi + done + printf "\n" + else + echo "" + fi +} + +# A submenu for a specific device that allows connecting, pairing, and trusting +device_menu() { + device=$1 + + # Get device name and mac address + device_name=$(echo "$device" | cut -d ' ' -f 3-) + mac=$(echo "$device" | cut -d ' ' -f 2) + + # Build options + if device_connected "$mac"; then + connected="Connected: yes" + else + connected="Connected: no" + fi + paired=$(device_paired "$mac") + trusted=$(device_trusted "$mac") + options="$connected\n$paired\n$trusted\n$divider\n$goback\nExit" + + # Open rofi menu, read chosen option + chosen="$(echo -e "$options" | $rofi_command "$device_name")" + + # Match chosen option to command + case "$chosen" in + "" | "$divider") + echo "No option chosen." + ;; + "$connected") + toggle_connection "$mac" + ;; + "$paired") + toggle_paired "$mac" + ;; + "$trusted") + toggle_trust "$mac" + ;; + "$goback") + show_menu + ;; + esac +} + +# Opens a rofi menu with current bluetooth status and options to connect +show_menu() { + # Get menu options + if power_on; then + power="Power: on" + + # Human-readable names of devices, one per line + # If scan is off, will only list paired devices + devices=$(bluetoothctl devices | grep Device | cut -d ' ' -f 3-) + + # Get controller flags + scan=$(scan_on) + pairable=$(pairable_on) + discoverable=$(discoverable_on) + + # Options passed to rofi + options="$devices\n$divider\n$power\n$scan\n$pairable\n$discoverable\nExit" + else + power="Power: off" + options="$power\nExit" + fi + + # Open rofi menu, read chosen option + chosen="$(echo -e "$options" | $rofi_command "Bluetooth")" + + # Match chosen option to command + case "$chosen" in + "" | "$divider") + echo "No option chosen." + ;; + "$power") + toggle_power + ;; + "$scan") + toggle_scan + ;; + "$discoverable") + toggle_discoverable + ;; + "$pairable") + toggle_pairable + ;; + *) + device=$(bluetoothctl devices | grep "$chosen") + # Open a submenu if a device is selected + if [[ $device ]]; then device_menu "$device"; fi + ;; + esac +} + +# Rofi command to pipe into, can add any options here +rofi_command="rofi -dmenu $* -p -theme /etc/xdg/rofi/bluetooth/bluetooth.rasi -mesg -Bluetooth-Control" + +case "$1" in + --status) + print_status + ;; + *) + show_menu + ;; +esac diff --git a/defaults/bin/moonarch-btnote b/defaults/bin/moonarch-btnote new file mode 100755 index 0000000..5f85a3f --- /dev/null +++ b/defaults/bin/moonarch-btnote @@ -0,0 +1,19 @@ +#!/bin/bash +# ABOUTME: Prüft Bluetooth-Geräte auf niedrigen Akkustand und sendet Notification. +# ABOUTME: Kann per Timer oder Cron regelmäßig ausgeführt werden. + +NOTIFY_AT_PERCENTAGE=70 +ICON="/usr/share/icons/Newaita-reborn/status/symbolic/battery-empty-symbolic.svg" + +for d in $(upower -e); do + DEVICE_DATA=$(upower -i "$d") + PERCENTAGE=$(echo $DEVICE_DATA | grep -Po '(?<=(percentage: )).*(?= icon)') + PER_INT=$(echo "${PERCENTAGE//%}") + DEVICE_NAME=$(echo $DEVICE_DATA | grep -Po '(?<=(model: )).*(?= serial)') + + if [ ! -z "$DEVICE_NAME" ] && [ "$PER_INT" -lt "$NOTIFY_AT_PERCENTAGE" ]; then + notify-send -t 5000 -e "Low battery $DEVICE_NAME $PER_INT%" -i "$ICON" \ + -h string:x-canonical-private-synchronous:battery \ + -h int:value:"$PER_INT" -u critical + fi +done diff --git a/defaults/bin/moonarch-calendar b/defaults/bin/moonarch-calendar new file mode 100755 index 0000000..0cc6916 --- /dev/null +++ b/defaults/bin/moonarch-calendar @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-based calendar widget with month navigation. +# ABOUTME: Displays a calendar grid and highlights the current day. + +DIR=$(dirname $PWD) + +current_day=$(date +"%e") +current_month=$(date +"%m") +current_year=$(date +"%Y") + +month=$(date +"%-m") +year=$(date +"%Y") +previous_month="◀" +next_month="▶" +last_selected_option="" + +format_calendar () { + echo "$1" \ + | sed -E 's/([[:alpha:]])__/\1\n/g' \ + | sed -E 's/___([[:digit:]])/.\n\1/g' \ + | sed -e 's/___/\n./g' \ + | sed -e 's/__/\n/g' \ + | sed -e 's/_/\n/g' +} + +print_month() { + calendar="$(cal -v -- $1 $2 | tail -n +2 | sed -e 's/ /_/g')" + echo "$(format_calendar "$calendar")" +} + +find_day_index() { + index=0 + while IFS=' ' read -ra arr; do + for i in "${arr[@]}"; do + if [[ "$i" == "$2" ]]; then + echo "$index" + break + fi + ((index++)) + done + done <<< "$1" +} + +calendar_menu() { + calendar_header=$(cal -v -- $month $year | head -n 1) + + month_page="$(print_month $month $year)" + calendar_body="\n\n\n$previous_month\n\n\n\n$month_page\n\n\n\n$next_month\n\n\n" + + previous_month_index="3" + next_month_index="59" + calendar_body_column="7" + urgent="-u $previous_month_index,$next_month_index" + active="" + selected_row="" + + if [[ "$(echo $current_month | bc) $current_year" == "$(echo $month | bc) $year" ]]; then + current_day_index=$(($(find_day_index "$month_page" $current_day) + $calendar_body_column)) + active="-a $current_day_index" + selected_row="-selected-row $current_day_index" + fi + + if [[ $last_selected_option == $previous_month ]]; then + selected_row="-selected-row $previous_month_index" + fi + + if [[ $last_selected_option == $next_month ]]; then + selected_row="-selected-row $next_month_index" + fi + + echo -e "$calendar_body" | rofi -dmenu \ + -theme /etc/xdg/rofi/calendar/rofi-calendar.rasi \ + -p "$calendar_header" $urgent $active $selected_row +} + +while [[ true ]]; do + selected=$(calendar_menu) + last_selected_option="$selected" + case $selected in + $previous_month) + ((month--)) + if [[ $month -lt 1 ]]; then + month=12 + ((year--)) + fi + ;; + $next_month) + ((month++)) + if [[ $month -gt 12 ]]; then + month=1 + ((year++)) + fi + ;; + *) + break + ;; + esac +done diff --git a/defaults/bin/moonarch-capsnote b/defaults/bin/moonarch-capsnote new file mode 100755 index 0000000..1bfc2fd --- /dev/null +++ b/defaults/bin/moonarch-capsnote @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# ABOUTME: Zeigt eine Notification beim Umschalten von Caps Lock an. +# ABOUTME: Gedacht für Keybinding oder Input-Event-Trigger. + +sleep 0.2 + +value=($(cat /sys/class/leds/input*::capslock/brightness | cut -f1 -d,)) + +if [ ${value[2]} == 1 ]; then + icon_name="capslock-enabled-symbolic" + output="caps lock on" +else + icon_name="capslock-disabled-symbolic" + output="caps lock off" +fi + +notify-send -e "$output" -i "$icon_name" \ + -h string:x-canonical-private-synchronous:state \ + -h boolean:value:"${value[2]}" -r 555 diff --git a/defaults/bin/moonarch-cpugov b/defaults/bin/moonarch-cpugov new file mode 100755 index 0000000..d34ced0 --- /dev/null +++ b/defaults/bin/moonarch-cpugov @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-based CPU governor switcher using auto-cpufreq. +# ABOUTME: Allows switching between performance, powersave, and reset modes. + +declare -A LABELS +declare -A COMMANDS + +### +# List of defined 'bangs' + +COMMANDS["󰓅"]="pkexec auto-cpufreq --force=performance" +LABELS["󰓅"]="Performance" + +COMMANDS["󰌪"]='pkexec auto-cpufreq --force=powersave' +LABELS["󰌪"]="Powersave" + +COMMANDS[""]='pkexec auto-cpufreq --force=reset' +LABELS[""]="Reset" + + +################################################################################ +# do not edit below +################################################################################ +## +# Generate menu +## +function print_menu() +{ + for key in ${!LABELS[@]} + do + # echo "$key ${LABELS}" + echo "$key ${LABELS[$key]}" + # my top version just shows the first field in labels row, not two words side by side + done +} +## +# Show rofi. +## +function start() +{ + # print_menu | rofi -dmenu -p "?=>" + print_menu | sort | rofi -theme /etc/xdg/rofi/cpugov/rofi-cpugov.rasi -show "CPU Modes" -dmenu -mesg "󰓅 CPU Modes" -i -p "rofi-bangs: " +} + + +# Run it +value="$(start)" + +# Split input. +# grab upto first space. +choice=${value%%\ *} +# graph remainder, minus space. +input=${value:$((${#choice}+1))} + +## +# Cancelled? bail out +## +if test -z ${choice} +then + exit +fi + +# check if choice exists +if test ${COMMANDS[$choice]+isset} +then + # Execute the choice + ${COMMANDS[$choice]} + + dunstify --replace 553 -i "/usr/share/icons/zafiro-dark/devices/48/cpu.svg" "CPU Mode" "Set to $choice ${LABELS[$choice]}" +else + echo "Unknown command: ${choice}" | rofi -dmenu -p "error" +fi diff --git a/defaults/bin/moonarch-dnd b/defaults/bin/moonarch-dnd new file mode 100755 index 0000000..92248b2 --- /dev/null +++ b/defaults/bin/moonarch-dnd @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# ABOUTME: Waybar-Modul das den DND-Status von dunst als JSON ausgibt. +# ABOUTME: Wird von der Waybar custom/dnd Config referenziert. +set -euo pipefail + +readonly ENABLED='' +readonly DISABLED='' + +dbus-monitor path='/org/freedesktop/Notifications',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged' --profile | + while read -r _; do + PAUSED="$(dunstctl is-paused)" + if [ "$PAUSED" == 'false' ]; then + CLASS="enabled" + TEXT="$ENABLED" + TOOLTIP="Notifications are on" + else + CLASS="disabled" + TEXT="$DISABLED" + TOOLTIP="Notifications are off" + COUNT="$(dunstctl count waiting)" + if [ "$COUNT" != '0' ]; then + TEXT="$DISABLED ($COUNT)" + fi + fi + printf '{"text": "%s", "class": "%s", "tooltip": "%s"}\n' "$TEXT" "$CLASS" "$TOOLTIP" + done diff --git a/defaults/bin/moonarch-emojis b/defaults/bin/moonarch-emojis new file mode 100755 index 0000000..ebc930b --- /dev/null +++ b/defaults/bin/moonarch-emojis @@ -0,0 +1,14 @@ +#!/bin/sh +# ABOUTME: Rofi emoji picker that copies selected emoji to clipboard. +# ABOUTME: Reads emoji list from /etc/xdg/rofi/emojis/emojis.txt. + +FILE="/etc/xdg/rofi/emojis/emojis.txt" + +if [ "$@" ] +then + smiley=$(echo $@ | cut -d' ' -f1) + echo -n "$smiley" | xsel -bi + exit 0 +fi + +cat $FILE diff --git a/defaults/bin/moonarch-gtk-style b/defaults/bin/moonarch-gtk-style new file mode 100755 index 0000000..1f764d5 --- /dev/null +++ b/defaults/bin/moonarch-gtk-style @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +# ABOUTME: Converts GTK theme colors to rofi-compatible CSS color values. +# ABOUTME: Reads a template file and replaces {@theme_*_color} placeholders with hex values. + +# https://github.com/Git-Fal7/gtk-rofi/ +# Taken from MATE-HUD github.com/ubuntu-mate/mate-hud +# Used for rofi css + +# Usage +# ./moonarch-gtk-style [input file] > [output file] + +# examples +# background-color: {@theme_bg_color} + +# see the array below for list of style context to use + +import sys + +if len(sys.argv)<2: + sys.exit(1) + +import gi +gi.require_version("Gtk", "3.0") +from gi.repository import Gio, GLib, Gtk + +#Converts from rgba to hex #RRGGBB +def rgba_to_hex(color): + return "#{0:02x}{1:02x}{2:02x}".format( int(color.red * 255), int(color.green * 255), int(color.blue * 255)) + +window = Gtk.Window() +style_context = window.get_style_context() + +#List of style contexts +lists = [ + #Foreground + 'theme_fg_color', 'theme_selected_fg_color', 'theme_fg_color', + 'warning_fg_color', 'info_fg_color', + #Background + 'theme_bg_color', 'theme_selected_bg_color', 'error_bg_color', + 'warning_bg_color', 'info_bg_color', + #Others + 'theme_unfocused_fg_color', 'theme_text_color', + 'theme_unfocused_text_color', + 'theme_base_color', + 'theme_unfocused_fg_color', + 'theme_unfocused_text_color', + 'theme_unfocused_bg_color', + 'theme_unfocused_base_color', + 'theme_unfocused_selected_bg_color', + 'theme_unfocused_selected_fg_color', + 'unfocused_insensitive_color', + 'borders', + 'unfocused_borders', + 'warning_color', + 'error_color', + 'success_color' +] + +with open(sys.argv[1]) as f: + file=f.read() + for style in lists: + file=file.replace("{@" + style + "}", rgba_to_hex(style_context.lookup_color(style)[1])) + print(file) diff --git a/defaults/bin/moonarch-json b/defaults/bin/moonarch-json new file mode 100755 index 0000000..75ecb8f --- /dev/null +++ b/defaults/bin/moonarch-json @@ -0,0 +1,52 @@ +#!/bin/bash +# ABOUTME: Rofi helper that reads a JSON config file to build a dynamic menu. +# ABOUTME: Parses name/command/icon fields from JSON and launches selected entries. + +#https://github.com/luiscrjunior/rofi-json + +user_file="${1/#\~/$HOME}" + +if [[ "$user_file" = /* ]] +then + config_file="$user_file" +else + cwd=$(dirname $0) + config_file="${cwd}/${user_file}" +fi + +json=$(cat ${config_file}) + +if [ $# -eq 1 ]; then + echo $json | jq -cr '.[] | "\(.name)|\(.command)|\(.icon)"' | + while IFS="|" read -r name command icon + do + if [[ $name == "null" ]]; then + continue + fi + if [[ $icon == "null" ]]; then + icon="system-run" + fi + echo -en "${name}\0icon\x1f${icon}\n" + done + exit 1 +fi + +if [ $# -eq 2 ]; then + + selected=$2 + task=$(echo $json | jq ".[] | select(.name == \"$selected\")") + + if [[ $task == "" ]]; then + exit 1 + fi + + command=$(echo $task | jq -j ".command") + + if [[ $command == "null" ]]; then + command=$(echo $task | jq -j ".name") + fi + + coproc bash -c "$command" + exit + +fi diff --git a/defaults/bin/moonarch-launcher b/defaults/bin/moonarch-launcher new file mode 100755 index 0000000..6bff9f1 --- /dev/null +++ b/defaults/bin/moonarch-launcher @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# ABOUTME: Application launcher using rofi with GTK theme integration. +# ABOUTME: Supports window, files, run, and drun modes. + +SETTINGS=/etc/xdg/rofi/gtk-theme.ini + +#Gets the current gtk using gsettings and removes the quotes +CURRENT_GTK_THEME=$(gsettings get org.gnome.desktop.interface gtk-theme) +CURRENT_GTK_THEME="${CURRENT_GTK_THEME#?}" +CURRENT_GTK_THEME="${CURRENT_GTK_THEME%?}" + +#Gets the gtk theme that is in the settings.ini file +SETTINGS_GTK_THEME=$(grep "GTK_THEME" "${SETTINGS}" | cut -b 11-) + +#create new colors.rasi from template +if [ "${SETTINGS_GTK_THEME}" != "${CURRENT_GTK_THEME}" ]; then + sed -i "s:GTK_THEME=${SETTINGS_GTK_THEME}:GTK_THEME=${CURRENT_GTK_THEME}:g" "${SETTINGS}" + + python3 moonarch-gtk-style /etc/xdg/rofi/_template/colors.rasi > /etc/xdg/rofi/colors.rasi +fi + +case $1 in + window) + showmode="window" + ;; + files) + showmode="filebrowser" + ;; + run) + showmode="run" + ;; + *) + showmode="drun" + ;; +esac + +## Run +rofi \ + -show $showmode \ + -click-to-exit \ + -theme /etc/xdg/rofi/launcher/launcher.rasi diff --git a/defaults/bin/moonarch-locate b/defaults/bin/moonarch-locate new file mode 100755 index 0000000..e096135 --- /dev/null +++ b/defaults/bin/moonarch-locate @@ -0,0 +1,9 @@ +#!/bin/bash +# ABOUTME: Rofi-based file search using the locate/mlocate database. +# ABOUTME: Opens selected files with xdg-open. + +# info: rofi-locate is a script to search local files and folders on your computer using the locate command and the updatedb database +# requirements: rofi mlocate +# playlist: rofi https://www.youtube.com/playlist?list=PLqv94xWU9zZ0LVP1SEFQsLEYjZC_SUB3m + +xdg-open "$(locate home media | rofi -threads 0 -width 100 -dmenu -i -p "locate:")" diff --git a/defaults/bin/moonarch-powermenu b/defaults/bin/moonarch-powermenu new file mode 100755 index 0000000..a8d28f1 --- /dev/null +++ b/defaults/bin/moonarch-powermenu @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-basiertes Power-Menü für Moonarch (Niri). +# ABOUTME: Bietet Shutdown, Reboot, Lock, Suspend und Logout. + +# CMDs +uptime="`uptime -p | sed -e 's/up //g'`" +host="$USER@"`hostname` + +# Options +shutdown='󰤆' +reboot='' +lock='' +suspend='' +logout='󰗽' +yes='' +no='󰆢' + +# Rofi CMD +rofi_cmd() { + rofi -dmenu \ + -p "$host uptime: $uptime" \ + -mesg "$host uptime: $uptime" \ + -theme /etc/xdg/rofi/powermenu/powermenu.rasi +} + +# Confirmation CMD +confirm_cmd() { + rofi -dmenu \ + -p 'Confirmation' \ + -normal-window \ + -mesg 'Confirm '${chosen} \ + -theme /etc/xdg/rofi/powermenu/confirm.rasi +} + +# Ask for confirmation +confirm_exit() { + echo -e "$yes\n$no" | confirm_cmd ${chosen} +} + +# Pass variables to rofi dmenu +run_rofi() { + echo -e "$lock\n$suspend\n$logout\n$reboot\n$shutdown" | rofi_cmd +} + +# Execute Command +run_cmd() { + selected="$(confirm_exit)" + if [[ "$selected" == "$yes" ]]; then + if [[ $1 == '--shutdown' ]]; then + systemctl poweroff + elif [[ $1 == '--reboot' ]]; then + systemctl reboot + elif [[ $1 == '--suspend' ]]; then + mpc -q pause + amixer set Master mute + systemctl suspend + elif [[ $1 == '--logout' ]]; then + niri msg action quit + fi + else + exit 0 + fi +} + +# Actions +chosen="$(run_rofi)" +case ${chosen} in + $shutdown) + run_cmd --shutdown + ;; + $reboot) + run_cmd --reboot + ;; + $lock) + killall rofi + wlogout -P 1 -s -r 10 -c 10 + ;; + $suspend) + run_cmd --suspend + ;; + $logout) + run_cmd --logout + ;; +esac diff --git a/defaults/bin/moonarch-setmen b/defaults/bin/moonarch-setmen new file mode 100755 index 0000000..7a51847 --- /dev/null +++ b/defaults/bin/moonarch-setmen @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi script mode that lists desktop files from /usr/share/settings-menu/. +# ABOUTME: Used with rofi -show fb -modes "fb:moonarch-setmen" for a settings launcher. + +#### +# @author moonarch.de (nevaforget) +# script used with rofi to list desktop files of specific dir +# dir: /usr/share/settings-menu/ +# @example rofi -show fb -modes "fb:moonarch-setmen" -theme /etc/xdg/rofi/settings-menu/settings-menu.rasi +# @dependencies glib >= 2.67.2 +#### + +function get_name { + local lang=$(locale | grep LANG | cut -d= -f2 | cut -d_ -f1) + local find="Name\[$lang\]=" + + local name=$(grep "^$find" $1 | tail -1 | sed "s/^$find//" | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g') + + if [ "${name}" = "" ] + then + find="Name=" + name=$(grep "^$find" $1 | tail -1 | sed "s/^$find//" | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g') + fi + + echo "$name" +} + +if [ "$ROFI_RETV" = "1" ] +then + for deskfile in /usr/share/settings-menu/* + do + match=$(grep "^Name" $deskfile | grep "$@" ) + + if [ -n "$match" ] + then + #gio launch $deskfile + + # old way + app=$(grep '^Exec' $deskfile | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g') + coproc ( $app > /dev/null 2>&1 ) + + break + fi + + done + exit 0 +fi + +function init { + for file in /usr/share/settings-menu/* + do + local name=$(get_name "$file") + + local iconline=$(sed -n -e '/^Icon=/p' "$file") + local icon=${iconline/Icon=/""} + + if [ -n "$name" ] + then + echo -en "$name\0icon\x1f$icon\n" + + fi + + done +} + +init diff --git a/defaults/bin/moonarch-settings b/defaults/bin/moonarch-settings new file mode 100755 index 0000000..d6bc15f --- /dev/null +++ b/defaults/bin/moonarch-settings @@ -0,0 +1,135 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-based settings menu that launches various system tools and scripts. +# ABOUTME: Provides a searchable list of system utilities like VPN, sound, bluetooth, etc. + +declare -A LABELS +declare -A COMMANDS + +### +# List of defined 'bangs' + +# launch programs +# COMMANDS["apps"]="rofi -combi-modi window,drun -show combi" +# LABELS["apps"]="" + +# open bookmarks +# COMMANDS["bookmarks"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-bookmarks.sh" +# LABELS["bookmarks"]="" + +# search local files +# COMMANDS[""]="moonarch-locate" +# LABELS[""]="Locate" + +COMMANDS[""]="wlogout -P 1 -s -r 10 -c 10" +LABELS[""]="Session Menu" + +# greenclip clipboard history +# source: https://github.com/erebe/greenclip +COMMANDS[""]='cliphist -db-path /run/user/1000/cliphist/db list | rofi -dmenu | cliphist -db-path /run/user/1000/cliphist/db decode | wl-copy' +LABELS[""]="Clipboard" + +COMMANDS["󰖂"]='moonarch-vpn' +LABELS["󰖂"]='VPN Connection Manager' + +COMMANDS[""]='waypaper' +LABELS[""]='Wallpaper Settings' + +COMMANDS["󰗅"]='moonarch-volume' +LABELS["󰗅"]='Sound Manager' + +#COMMANDS[""]='shortcuts module was removed' +#LABELS[""]='Hotkey List' + +COMMANDS["󰍹"]='wdisplays' +LABELS["󰍹"]='Display Setup' + +COMMANDS[""]='nwg-look' +LABELS[""]='Appearance Settings' + +COMMANDS["󱘆"]='noisetorch' +LABELS["󱘆"]='Audio Noise Reduction' + +COMMANDS["󰋋"]='$HOME/.local/share/headset-charge-indicator/headset-charge-indicator.py &' +LABELS["󰋋"]='Headset Control' + +COMMANDS[""]='moonarch-bluetooth' +LABELS[""]='Bluetooth Control' + +COMMANDS["󰛳"]='nm-applet --indicator &' +LABELS["󰛳"]='Networker Manager' + +COMMANDS["󰴱"]='wl-color-picker' +LABELS["󰴱"]='Color Picker' + +COMMANDS["󰚞"]='font-manager' +LABELS["󰚞"]='Font Manager' + +COMMANDS["󱨑"]='gufw' +LABELS["󱨑"]='Firewall Settings' + +COMMANDS[""]='env GTK_THEME=Adwaita:dark resources' +LABELS[""]='System Resources' + +COMMANDS["󰓅"]='moonarch-cpugov' +LABELS["󰓅"]='CPU Modes' + +COMMANDS["󰓅"]='hardinfo' +LABELS["󰓅"]='System Profiler and Benchmark' + +COMMANDS["󰀠"]='alarm-clock-applet' +LABELS["󰀠"]='Alarm & Timer' + +COMMANDS["󱓞"]='moonarch-launcher' +LABELS["󱓞"]='App Launcher' + +################################################################################ +# do not edit below +################################################################################ +## +# Generate menu +## +function print_menu() +{ + for key in ${!LABELS[@]} + do + # echo "$key ${LABELS}" + echo "$key ${LABELS[$key]}" + # my top version just shows the first field in labels row, not two words side by side + done +} +## +# Show rofi. +## +function start() +{ + # print_menu | rofi -dmenu -p "?=>" + title="MoonArch \ $USER \ $(date +"%H:%M") \ $(uptime -p | sed 's/up //')" + print_menu | sort | rofi -theme /etc/xdg/rofi/settings-menu/settings-menu.rasi -show $title -dmenu -markup-rows -mesg "󰣇 $title" -i -p "rofi-bangs: " +} + + +# Run it +value="$(start)" + +# Split input. +# grab upto first space. +choice=${value%%\ *} +# graph remainder, minus space. +input=${value:$((${#choice}+1))} + +## +# Cancelled? bail out +## +if test -z ${choice} +then + exit +fi + +# check if choice exists +if test ${COMMANDS[$choice]+isset} +then + # Execute the choice + ${COMMANDS[$choice]} +else + echo "Unknown command: ${choice}" | rofi -dmenu -p "error" +fi diff --git a/defaults/bin/moonarch-sink-switcher b/defaults/bin/moonarch-sink-switcher new file mode 100755 index 0000000..7d7c4d6 --- /dev/null +++ b/defaults/bin/moonarch-sink-switcher @@ -0,0 +1,16 @@ +#!/usr/bin/bash +# ABOUTME: Rofi-based PulseAudio sink switcher using ponymix. +# ABOUTME: Changes the default sink and moves all active streams to it. + +# choose pulseaudio sink via rofi or dmenu +# changes default sink and moves all streams to that sink +#https://gist.github.com/Nervengift/844a597104631c36513c?permalink_comment_id=1826282 + +sink=$(ponymix -t sink list|awk '/^sink/ {s=$1" "$2;getline;gsub(/^ +/,"",$0);print s" "$0}'|rofi -dmenu -theme '/etc/xdg/rofi/volume/volume.rasi' -mesg '󱡫 Sink Switcher' -p 'pulseaudio sink:' -location 6 -width 100|grep -Po '[0-9]+(?=:)') && + + +ponymix set-default -d $sink && +for input in $(ponymix list -t sink-input|grep -Po '[0-9]+(?=:)');do + echo "$input -> $sink" + ponymix -t sink-input -d $input move $sink +done diff --git a/defaults/bin/moonarch-ssh b/defaults/bin/moonarch-ssh new file mode 100755 index 0000000..e5a82b6 --- /dev/null +++ b/defaults/bin/moonarch-ssh @@ -0,0 +1,142 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-based tool launcher with SSH and system utility shortcuts. +# ABOUTME: Provides a searchable menu of tools including VPN, sound, bluetooth, etc. + +declare -A LABELS +declare -A COMMANDS + +### +# List of defined 'bangs' + +# launch programs +# COMMANDS["apps"]="rofi -combi-modi window,drun -show combi" +# LABELS["apps"]="" + +# open bookmarks +# COMMANDS["bookmarks"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-bookmarks.sh" +# LABELS["bookmarks"]="" + +# search local files +COMMANDS[""]="moonarch-locate" +LABELS[""]="Locate" + +# open custom web searches +# COMMANDS["websearch"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-websearch.sh" +# LABELS["websearch"]="" + +# show clipboard history +# source: https://bitbucket.org/pandozer/rofi-clipboard-manager/overview +# COMMANDS["clipboard"]='rofi -modi "clipboard:~/.bin/rofi-clipboard-manager/mclip.py menu" -show clipboard && ~/.bin/rofi-clipboard-manager/mclip.py paste' +# LABELS["clipboard"]="" + +# references -------------------------- +# COMMANDS[";sr2"]="chromium 'wikipedia.org/search-redirect.php?search=\" \${input}\"" +# LABELS[";sr2"]="" + +# COMMANDS[";piratebay"]="chromium --disk-cache-dir=/tmp/cache http://thepiratebay.org/search/\" \${input}\"" +# LABELS[";piratebay"]="" + +# COMMANDS[".bin"]="spacefm -r '/home/dka/bin'" +# LABELS[".bin"]=".bin" + +# COMMANDS["#screenshot"]='/home/dka/bin/screenshot-scripts/myscreenshot.sh' +# LABELS["#screenshot"]="screenshot" + +# greenclip clipboard history +# source: https://github.com/erebe/greenclip +COMMANDS[""]='rofi -modi "clipboard:greenclip print" -show Clipboard' +LABELS[""]="Clipboard" + +COMMANDS["󰖂"]='moonarch-vpn' +LABELS["󰖂"]='VPN Connection Manager' + +COMMANDS["󰗅"]='moonarch-volume' +LABELS["󰗅"]='Sound Manager' + +#COMMANDS[""]='shortcuts module was removed' +#LABELS[""]='Hotkey List' + +COMMANDS[""]='wlogout' +LABELS[""]='Session Menu' + +COMMANDS["󰍹"]='wdisplays' +LABELS["󰍹"]='Display Setup' + +COMMANDS[""]='nwg-look' +LABELS[""]='Appearance Settings' + +COMMANDS["󱘆"]='noisetorch' +LABELS["󱘆"]='Audio Noise Reduction' + +COMMANDS["󰋋"]='$HOME/.local/share/headset-charge-indicator/headset-charge-indicator.py &' +LABELS["󰋋"]='Headset Control' + +COMMANDS[""]='moonarch-bluetooth' +LABELS[""]='Bluetooth Control' + +COMMANDS["󰛳"]='nm-applet --indicator &' +LABELS["󰛳"]='Networker Manager' + +COMMANDS["󰴱"]='wl-color-picker' +LABELS["󰴱"]='Color Picker' + +COMMANDS["󰚞"]='font-manager' +LABELS["󰚞"]='Font Manager' + +COMMANDS["󱨑"]='gufw' +LABELS["󱨑"]='Firewall Settings' + +COMMANDS[""]='stacer' +LABELS[" "]='System Maintenance' + + +################################################################################ +# do not edit below +################################################################################ +## +# Generate menu +## +function print_menu() +{ + for key in ${!LABELS[@]} + do + # echo "$key ${LABELS}" + echo "$key ${LABELS[$key]}" + # my top version just shows the first field in labels row, not two words side by side + done +} +## +# Show rofi. +## +function start() +{ + # print_menu | rofi -dmenu -p "?=>" + print_menu | sort | rofi -show "Tools" -dmenu -mesg " Tools" -i -p "rofi-bangs: " +} + + +# Run it +value="$(start)" + +# Split input. +# grab upto first space. +choice=${value%%\ *} +# graph remainder, minus space. +input=${value:$((${#choice}+1))} + +## +# Cancelled? bail out +## +if test -z ${choice} +then + exit +fi + +# check if choice exists +if test ${COMMANDS[$choice]+isset} +then + # Execute the choice + ${COMMANDS[$choice]} +else + echo "Unknown command: ${choice}" | rofi -dmenu -p "error" +fi diff --git a/defaults/bin/moonarch-volume b/defaults/bin/moonarch-volume new file mode 100755 index 0000000..7073fb1 --- /dev/null +++ b/defaults/bin/moonarch-volume @@ -0,0 +1,122 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-based volume control applet for managing speakers and microphone. +# ABOUTME: Provides mute toggles, sink switching, mixer access, and NoiseTorch. + +## Author : Aditya Shakya (adi1090x) +## Github : @adi1090x +# +## Applets : Volume + +theme="/etc/xdg/rofi/volume/volume.rasi" + +# Volume Info +mixer="`amixer info Master | grep 'Mixer name' | cut -d':' -f2 | tr -d \',' '`" +speaker="`amixer get Master | tail -n1 | awk -F ' ' '{print $5}' | tr -d '[]'`" +mic="`amixer get Capture | tail -n1 | awk -F ' ' '{print $5}' | tr -d '[]'`" + +active="" +urgent="" + +# Speaker Info +amixer get Master | grep '\[on\]' &>/dev/null +if [[ "$?" == 0 ]]; then + active="-a 1" + stext='Mute Speaker' + sicon='󰓃' +else + urgent="-u 1" + stext='Unmute Speaker' + sicon='󰓄' +fi + +# Microphone Info +amixer get Capture | grep '\[on\]' &>/dev/null +if [[ "$?" == 0 ]]; then + [ -n "$active" ] && active+=",3" || active="-a 3" + mtext='Mute Mic' + micon='' +else + [ -n "$urgent" ] && urgent+=",3" || urgent="-u 3" + mtext='Unmute Mic' + micon='' +fi + +currentsink=$(ponymix defaults|awk '/^sink/ {s=$1" "$2;getline;gsub(/^ +/,"",$0);print s" "$0}' | cut -d':' -f2) +currentsource=$(ponymix defaults|awk '/^source/ {s=$1" "$2;getline;gsub(/^ +/,"",$0);print s" "$0}' | cut -d':' -f2) + + +# Theme Elements +prompt="Speaker: $sicon Mic: $micon " +mesg="$mixer Speaker: $speaker Mic: $mic" + +list_col='6' +list_row='3' +win_width='670px' + +# Options +option_1="$micon $mtext ›$currentsource" +option_2="$sicon $stext ›$currentsink" +option_3="󱡫 Sink Switcher" +option_4="" +option_5=" Mixer" +option_6="󰍯 Noise Torch" + + +# Rofi CMD + #-theme-str "listview {columns: $list_col; lines: $list_row;}" \ +rofi_cmd() { + rofi -theme-str "window {width: $win_width;}" \ + -dmenu \ + -p "$prompt" \ + -mesg "$mesg" \ + ${active} ${urgent} \ + -markup-rows \ + -theme ${theme} +} + +# Pass variables to rofi dmenu +run_rofi() { + echo -e "$option_1\n$option_2\n$option_3\n$option_4\n$option_5\n$option_6" | rofi_cmd +} + +# Execute Command +run_cmd() { + if [[ "$1" == '--opt3' ]]; then + #amixer -Mq set Master,0 5%+ unmute + moonarch-sink-switcher + elif [[ "$1" == '--opt2' ]]; then + amixer set Master toggle + elif [[ "$1" == '--opt4' ]]; then + amixer -Mq set Master,0 5%- unmute + + elif [[ "$1" == '--opt1' ]]; then + amixer set Capture toggle + elif [[ "$1" == '--opt5' ]]; then + pavucontrol + elif [[ "$1" == '--opt6' ]]; then + noisetorch + fi +} + +# Actions +chosen="$(run_rofi)" +case ${chosen} in + $option_1) + run_cmd --opt1 + ;; + $option_2) + run_cmd --opt2 + ;; + $option_3) + run_cmd --opt3 + ;; + $option_4) + run_cmd --opt4 + ;; + $option_5) + run_cmd --opt5 + ;; + $option_6) + run_cmd --opt6 + ;; +esac diff --git a/defaults/bin/moonarch-vpn b/defaults/bin/moonarch-vpn new file mode 100755 index 0000000..a25190c --- /dev/null +++ b/defaults/bin/moonarch-vpn @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# ABOUTME: Rofi-based VPN connection manager using NetworkManager (nmcli). +# ABOUTME: Lists VPN connections and toggles them on/off. + +# Copyright (C) 2021 Damien Cassou + +# Author: Damien Cassou +# Url: https://gitlab.com/DamienCassou/rofi-vpn +# Version: 0.2.0 + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Commentary: + +# This program uses rofi and nmcli to let the user enable/disable VPN +# connections. + +# Code: + +# What to show in front of an active VPN connection: +ACTIVE_PREFIX="󰌘 " + +# What to show in front of an inactive VPN connection: +INACTIVE_PREFIX="󰌙 " + +# Display on standard output all VPN connections, one per line. An +# active VPN connection is prefixed with `ACTIVE_PREFIX` and an inactive +# one is prefixed with `INACTIVE_PREFIX`. +function list_vpn_connections() { + nmcli --get-values ACTIVE,NAME,TYPE connection show \ + | grep ':vpn$' \ + | sed \ + -e "s/^no:/${INACTIVE_PREFIX}/" \ + -e "s/^yes:/${ACTIVE_PREFIX}/" \ + -e 's/:vpn$//' +} + +# Take a line as displayed by `list_vpn_connections()` as argument and +# use nmcli to toggle the corresponding connection. +function toggle_vpn_connection() { + local result="$1" + local connection + + connection=$(extract_connection_name_from_result "${result}") + + if [[ $result = ${ACTIVE_PREFIX}* ]]; then + feedback=$(nmcli connection down "$connection") + notify-send "VPN Status '$connection'" "$feedback" + else + foot -a="vpn-prompt" -T="VPN Connection" nmcli connection --ask up "$connection" + #feedback=$(nmcli connection up "$connection") + notify-send "VPN Status '$connection'" "Trying to connect" + fi +} + +# Take a line as displayed by `list_vpn_connections()` as argument and +# remove `ACTIVE_PREFIX` or `INACTIVE_PREFIX` to only display the +# connection name. +function extract_connection_name_from_result() { + local result="$1" + + # I don't know how to use plain bash to remove the prefix so I'm + # using sed: + # shellcheck disable=SC2001 + sed -e 's/^.* \([^ ]\+\)$/\1/' <<< "$result" +} + +# Execute the `rofi` command. The first argument of the function is +# used as lines to select from. +function start_rofi() { + local content="$1" + echo -e "$content" | rofi -dmenu -theme /etc/xdg/rofi/nm-vpn/nm-vpn.rasi -mesg "󰖂 VPN Connection Manager" -icon "󰖂" +} + +# List the VPN connections and let the user toggle one using rofi. +function main() { + local connections + local result + + connections=$(list_vpn_connections) + result=$(start_rofi "$connections") + + if [ -n "$result" ]; then + toggle_vpn_connection "$result" + else + exit 1 + fi +} + +main diff --git a/defaults/bin/moonarch-waybar-cpugov b/defaults/bin/moonarch-waybar-cpugov new file mode 100755 index 0000000..1b04adf --- /dev/null +++ b/defaults/bin/moonarch-waybar-cpugov @@ -0,0 +1,48 @@ +#!/usr/bin/bash +# ABOUTME: Waybar-Modul das den CPU-Governor als JSON ausgibt. +# ABOUTME: Wird von der Waybar custom/cpugov Config referenziert. + +while : +do + CPU_GOV=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor) + + case $CPU_GOV in + performance) + CPU_GOV_SHORT=󰓅 + ;; + balanced) + CPU_GOV_SHORT=󰾅 + ;; + powersave) + CPU_GOV_SHORT=󰌪 + ;; + userspace) + CPU_GOV_SHORT=uspace + ;; + ondemand) + CPU_GOV_SHORT=ondmnd + ;; + conservative) + CPU_GOV_SHORT=cons + ;; + schedutil) + CPU_GOV_SHORT=sutil + ;; + *) + CPU_GOV_SHORT="?" + ;; + esac + + CPU_GOV_FULL="${CPU_GOV^}" + + s="text|alt|tooltip|class +$CPU_GOV_SHORT|$CPU_GOV_FULL|CPU Mode: $CPU_GOV_FULL|cpugov" + + jq --unbuffered --compact-output -Rn ' + ( input | split("|") ) as $keys | + ( inputs | split("|") ) as $vals | + [[$keys, $vals] | transpose[] | {key:.[0],value:.[1]}] | from_entries + ' <<<"$s" + + sleep 5 +done diff --git a/defaults/bin/moonarch-waybar-gpustat b/defaults/bin/moonarch-waybar-gpustat new file mode 100755 index 0000000..8793bd2 --- /dev/null +++ b/defaults/bin/moonarch-waybar-gpustat @@ -0,0 +1,38 @@ +#!/usr/bin/bash +# ABOUTME: Waybar-Modul das die GPU-Auslastung als JSON ausgibt. +# ABOUTME: Wird von der Waybar custom/gpu-usage Config referenziert. + +while : +do + GPU_STAT=$(cat /sys/class/hwmon/hwmon5/device/gpu_busy_percent 2>/dev/null || echo "0") + ICON="" + + if [ "$GPU_STAT" -lt 10 ]; then + ICON="" + elif [ "$GPU_STAT" -lt 20 ]; then + ICON="" + elif [ "$GPU_STAT" -lt 40 ]; then + ICON="" + elif [ "$GPU_STAT" -lt 50 ]; then + ICON="" + elif [ "$GPU_STAT" -lt 60 ]; then + ICON="" + elif [ "$GPU_STAT" -lt 70 ]; then + ICON="" + elif [ "$GPU_STAT" -lt 80 ]; then + ICON="" + elif [ "$GPU_STAT" -lt 100 ]; then + ICON="" + fi + + s="text|alt|tooltip|class|percentage +GPU $ICON|GPU $ICON $GPU_STAT%|GPU $ICON $GPU_STAT%|gpustat|$GPU_STAT" + + jq --unbuffered --compact-output -Rn ' + ( input | split("|") ) as $keys | + ( inputs | split("|") ) as $vals | + [[$keys, $vals] | transpose[] | {key:.[0],value:.[1]}] | from_entries + ' <<<"$s" + + sleep 5 +done diff --git a/defaults/etc/greetd/config.toml b/defaults/etc/greetd/config.toml new file mode 100644 index 0000000..fd56305 --- /dev/null +++ b/defaults/etc/greetd/config.toml @@ -0,0 +1,9 @@ +# ABOUTME: greetd-Konfiguration fuer Moonarch. +# ABOUTME: Startet regreet unter niri als Wayland-Compositor. + +[terminal] +vt = 1 + +[default_session] +command = "niri -c /etc/greetd/niri-greeter.kdl" +user = "greeter" diff --git a/defaults/etc/greetd/niri-greeter.kdl b/defaults/etc/greetd/niri-greeter.kdl new file mode 100644 index 0000000..788639b --- /dev/null +++ b/defaults/etc/greetd/niri-greeter.kdl @@ -0,0 +1,58 @@ +// ABOUTME: Minimale Niri-Konfiguration fuer den regreet Login-Greeter. +// ABOUTME: Wird von greetd gestartet statt cage, um Multi-Monitor korrekt zu handhaben. + +input { + keyboard { + xkb { + layout "de" + } + numlock + } + + touchpad { + tap + natural-scroll + } + + mouse { + accel-profile "flat" + } +} + +cursor { + xcursor-theme "Sweet-cursors" +} + +layout { + gaps 0 + + focus-ring { + off + } + + border { + off + } +} + +// regreet starten und niri beenden, sobald regreet sich schliesst +spawn-at-startup "sh" "-c" "regreet; niri msg action quit --skip-confirmation" + +// Greeter-Fenster maximiert darstellen +window-rule { + open-maximized true +} + +hotkey-overlay { + skip-at-startup +} + +prefer-no-csd + +animations { + off +} + +binds { + // Keine Keybinds noetig fuer den Greeter +} diff --git a/defaults/etc/greetd/regreet.css b/defaults/etc/greetd/regreet.css new file mode 100644 index 0000000..bd6eb6e --- /dev/null +++ b/defaults/etc/greetd/regreet.css @@ -0,0 +1,40 @@ +/* ABOUTME: Catppuccin Mocha CSS-Overrides fuer regreet. */ +/* ABOUTME: Ergaenzt das GTK-Theme mit greeter-spezifischem Styling. */ + +window { + background-color: #1e1e2e; +} + +entry { + border-radius: 8px; + padding: 8px 12px; + border: 1px solid #45475a; + background-color: #313244; + color: #cdd6f4; +} + +entry:focus { + border-color: #b4befe; +} + +button { + border-radius: 8px; + padding: 8px 16px; + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; +} + +button:hover { + background-color: #45475a; +} + +button.suggested-action { + background-color: #b4befe; + color: #1e1e2e; + border: none; +} + +button.suggested-action:hover { + background-color: #89b4fa; +} diff --git a/defaults/etc/greetd/regreet.toml b/defaults/etc/greetd/regreet.toml new file mode 100644 index 0000000..9c106d7 --- /dev/null +++ b/defaults/etc/greetd/regreet.toml @@ -0,0 +1,17 @@ +# ABOUTME: regreet-Konfiguration fuer Moonarch. +# ABOUTME: Definiert Aussehen und Verhalten des Login-Greeters. + +[background] +path = "/usr/share/backgrounds/moonarch-greeter.jpg" +fit = "Cover" + +[GTK] +application_prefer_dark_theme = true +cursor_theme_name = "Sweet-cursors" +font_name = "Hack Nerd Font 12" +icon_theme_name = "Newaita-reborn-gray-dark" +theme_name = "catppuccin-mocha-lavender-standard+default" + +[commands] +reboot = ["systemctl", "reboot"] +poweroff = ["systemctl", "poweroff"] diff --git a/defaults/shell/zshrc b/defaults/shell/zshrc new file mode 100644 index 0000000..6427dac --- /dev/null +++ b/defaults/shell/zshrc @@ -0,0 +1,130 @@ +# ABOUTME: Moonarch default zsh configuration with Catppuccin-themed prompt. +# ABOUTME: Sources user overrides from ~/.zshrc.d/ and ~/.zshrc.local + +# --- History --- +HISTFILE=~/.histfile +HISTSIZE=1000 +SAVEHIST=1000 +setopt autocd nomatch notify appendhistory sharehistory hist_ignore_space hist_ignore_all_dups hist_save_no_dups hist_find_no_dups +unsetopt beep extendedglob +bindkey -e + +# --- Completion --- +zstyle :compinstall filename "$HOME/.zshrc" +autoload -Uz compinit +compinit + +# --- Window title --- +autoload -Uz add-zsh-hook + +_precmd_title() { + print -Pn "\e]0;%~\a" +} + +_preexec_title() { + print -Pn "\e]0;$2\a" +} + +add-zsh-hook precmd _precmd_title +add-zsh-hook preexec _preexec_title + +# --- Prompt (Catppuccin Mocha) --- +parse_git_branch() { + local branch="" + branch=$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/') + local git_status=$(git status --porcelain 2>/dev/null) + local color=green + if echo "$git_status" | grep -q "^ M"; then + color=yellow + branch="${branch}*" + fi + if echo "$git_status" | grep -qE "^ A|^\?\?"; then + color=yellow + branch="${branch}+" + fi + if echo "$git_status" | grep -q "^ D"; then + color=yellow + branch="${branch}-" + fi + if [[ -n "$branch" ]]; then + branch=[%F{${color}}${branch}%F{reset}] + fi + echo " $branch" +} + +precmd() { + print "" + print -rP "%F{#b4befe}%B%n@%M%b %2~%F{#f5e0dc}$(parse_git_branch)%f" +} + +PROMPT="%B%F{#b4befe}$%f%b " +RPROMPT="%F{241}%B%T%b%f" + +# --- PATH --- +if [ -d "$HOME/.local/bin" ]; then + PATH="$HOME/.local/bin:$PATH" +fi + +# --- Key bindings --- +bindkey "^[[3~" delete-char +bindkey "^[[H" beginning-of-line +bindkey "^[[F" end-of-line +bindkey "^[[1;5C" forward-word +bindkey "^[[1;5D" backward-word + +# --- Aliases --- +alias ssh="TERM=xterm-256color ssh" +alias orphans='[[ -n $(pacman -Qdt) ]] && sudo pacman -Rs $(pacman -Qdtq) || echo "no orphans to remove"' +alias ls='eza --icons --color=always --group-directories-first' +alias ll='eza -lF --icons --color=always --group-directories-first' +alias la='eza -a --icons --color=always --group-directories-first' +alias l='eza -F --icons --color=always --group-directories-first' +alias vim='nvim' +alias uninstall='sudo pacman -Rsn' + +# --- FZF --- +if command -v fzf &>/dev/null; then + eval "$(fzf --zsh)" + export FZF_DEFAULT_COMMAND="fd --hidden --strip-cwd-prefix --exclude .git" + export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" + export FZF_ALT_C_COMMAND="fd --type=d --hidden --strip-cwd-prefix --exclude .git" + export FZF_DEFAULT_OPTS="--height 50% --layout=default --border --color=hl:#2dd4bf" + export FZF_CTRL_T_OPTS="--preview 'bat --color=always -n --line-range :500 {}'" + export FZF_ALT_C_OPTS="--preview 'eza --tree --color=always {} | head -200'" +fi + +# --- Plugins (oh-my-zsh) --- +if [[ -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" ]]; then + source "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" +fi +if [[ -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]]; then + source "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh" + ZSH_AUTOSUGGEST_STRATEGY=(history completion) +fi + +# --- Wayland environment --- +export TERMINAL="footclient" +export GDK_BACKEND="wayland,x11,*" +export QT_QPA_PLATFORM="wayland;xcb" +export QT_QPA_PLATFORMTHEME="qt6ct" +export QT_AUTO_SCREEN_SCALE_FACTOR="1" +export QT_WAYLAND_DISABLE_WINDOWDECORATION="1" +export SDL_VIDEODRIVER="wayland" +export CLUTTER_BACKEND="wayland" +export XDG_CURRENT_DESKTOP="niri" +export XDG_SESSION_DESKTOP="niri" +export XDG_SESSION_TYPE="wayland" +export EDITOR="nvim" +export SUDO_EDITOR="nvim" +export MOZ_ENABLE_WAYLAND="1" + +# --- User override scripts --- +# Drop custom config snippets into ~/.zshrc.d/*.zsh +if [[ -d "$HOME/.zshrc.d" ]]; then + for f in "$HOME/.zshrc.d"/*.zsh(N); do + source "$f" + done +fi + +# Single-file user override (for simple additions) +[[ -f "$HOME/.zshrc.local" ]] && source "$HOME/.zshrc.local" diff --git a/defaults/xdg/dunst/dunstrc b/defaults/xdg/dunst/dunstrc new file mode 100644 index 0000000..0b87722 --- /dev/null +++ b/defaults/xdg/dunst/dunstrc @@ -0,0 +1,460 @@ +# ABOUTME: Moonarch default dunst notification daemon config with Catppuccin Mocha colors. +# ABOUTME: User overrides go in ~/.config/dunst/dunstrc + +# See dunst(5) for all configuration options + +[global] + ### Display ### + + enable_posix_regex = true + + # Which monitor should the notifications be displayed on. + monitor = 0 + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a window manager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern window managers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = mouse + + ### Geometry ### + + # dynamic width from 0 to 300 + # width = (0, 300) + # constant width of 300 + width = 300 + + # The maximum height of a single notification, excluding the frame. + #height = 300 + + # Position the notification in the top right corner + origin = top-right + + # Offset from the origin + offset = 15x15 + + # Scale factor. It is auto-detected if value is 0. + scale = 0 + + # Maximum number of notification (0 means no limit) + notification_limit = 10 + + ### Progress bar ### + + # Turn on the progess bar. It appears when a progress hint is passed with + # for example dunstify -h int:value:12 + progress_bar = true + + # Set the progress bar height. This includes the frame, so make sure + # it's at least twice as big as the frame width. + progress_bar_height = 8 + + # Set the frame width of the progress bar + progress_bar_frame_width = 1 + + # Set the minimum width for the progress bar + progress_bar_min_width = 150 + + # Set the maximum width for the progress bar + progress_bar_max_width = 300 + + highlight = "#b4befe" + + # Show how many messages are currently hidden (because of + # notification_limit). + indicate_hidden = yes + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing window manager is + # present (e.g. xcompmgr, compiz, etc.). (X11 only) + transparency = 0 + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + # If gap_size is greater than 0, this setting will be ignored. + separator_height = 2 + + # Padding between text and separator. + padding = 16 + + # Horizontal padding. + horizontal_padding = 16 + + # Padding between text and icon. + text_icon_padding = 0 + + # Defines width in pixels of frame around the notification window. + # Set to 0 to disable. + frame_width = 2 + + # Defines color of the frame around the notification window. + frame_color = "#b4befe" + + # Size of gap to display between notifications - requires a compositor. + # If value is greater than 0, separator_height will be ignored and a border + # of size frame_width will be drawn around each notification instead. + # Click events on gaps do not currently propagate to applications below. + gap_size = 5 + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = frame + + # Sort messages by urgency. + sort = yes + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # A client can set the 'transient' hint to bypass this. See the rules + # section for how to disable this if necessary + # idle_threshold = 120 + + ### Text ### + + font = JetBrainsMono Nerd Font 10 + + # The spacing between lines. If the height is smaller than the + # font height, it will get raised to the font height. + line_height = 0 + + # Possible values are: + # full: Allow a small subset of html markup in notifications: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # + # strip: This setting is provided for compatibility with some broken + # clients that send markup even though it's not enabled on the + # server. Dunst will try to strip the markup but the parsing is + # simplistic so using this option outside of matching rules for + # specific applications *IS GREATLY DISCOURAGED*. + # + # no: Disable markup parsing, incoming notifications will be treated as + # plain text. Dunst will not advertise that it has the body-markup + # capability if this is set as a global setting. + # + # It's important to note that markup inside the format option will be parsed + # regardless of what this is set to. + markup = full + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # %n progress value if set without any extra characters + # %% Literal % + # Markup is allowed + format = "%s\n%b" + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = left + + # Vertical alignment of message text and icon. + # Possible values are "top", "center" and "bottom". + vertical_alignment = center + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60 + + # Specify where to make an ellipsis in long lines. + # Possible values are "start", "middle" and "end". + ellipsize = middle + + # Ignore newlines '\n' in notifications. + ignore_newline = no + + # Stack together notifications with the same content + stack_duplicates = true + + # Hide the count of stacked notifications with the same content + hide_duplicate_count = false + + # Display indicators for URLs (U) and actions (A). + show_indicators = yes + + ### Icons ### + + # Recursive icon lookup. You can set a single theme, instead of having to + # define all lookup paths. + enable_recursive_icon_lookup = true + + # Set icon theme (only used for recursive icon lookup) + icon_theme = "Tela-purple-dark" + # You can also set multiple icon themes, with the leftmost one being used first. + # icon_theme = "Adwaita, breeze" + + # Align icons left/right/top/off + icon_position = left + + # Scale small icons up to this size, set to 0 to disable. Helpful + # for e.g. small files or high-dpi screens. In case of conflict, + # max_icon_size takes precedence over this. + min_icon_size = 16 + + # Scale larger icons down to this size, set to 0 to disable + max_icon_size = 64 + + # Paths to default icons (only neccesary when not using recursive icon lookup) + #icon_path = /usr/share/icons/Tela-purple-dark/16x16/status/:/usr/share/icons/Tela-purple-dark/16x16/devices/ + + ### History ### + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = yes + + # Maximum amount of notifications kept in history + history_length = 20 + + ### Misc/Advanced ### + + # dmenu path. + dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + browser = /usr/bin/xdg-open + + # Always run rule-defined scripts, even if the notification is suppressed + always_run_script = true + + # Define the title of the windows spawned by dunst + title = Dunst + + # Define the class of the windows spawned by dunst + class = Dunst + + # Define the corner radius of the notification window + # in pixel size. If the radius is 0, you have no rounded + # corners. + # The radius will be automatically lowered if it exceeds half of the + # notification height to avoid clipping text and/or icons. + corner_radius = 10 + + # Ignore the dbus closeNotification message. + # Useful to enforce the timeout set by dunst configuration. Without this + # parameter, an application may close the notification sent before the + # user defined timeout. + ignore_dbusclose = false + + ### Wayland ### + # These settings are Wayland-specific. They have no effect when using X11 + + # Uncomment this if you want to let notications appear under fullscreen + # applications (default: overlay) + layer = overlay + + # Set this to true to use X11 output on Wayland. + force_xwayland = false + + ### Legacy + + # Use the Xinerama extension instead of RandR for multi-monitor support. + # This setting is provided for compatibility with older nVidia drivers that + # do not support RandR and using it on systems that support RandR is highly + # discouraged. + # + # By enabling this setting dunst will not be able to detect when a monitor + # is connected or disconnected which might break follow mode if the screen + # layout changes. + force_xinerama = false + + ### mouse + + # Defines list of actions for each mouse event + # Possible values are: + # * none: Don't do anything. + # * do_action: Invoke the action determined by the action_name rule. If there is no + # such action, open the context menu. + # * open_url: If the notification has exactly one url, open it. If there are multiple + # ones, open the context menu. + # * close_current: Close current notification. + # * close_all: Close all notifications. + # * context: Open context menu for the notification. + # * context_all: Open context menu for all notifications. + # These values can be strung together for each mouse event, and + # will be executed in sequence. + mouse_left_click = close_current + mouse_middle_click = do_action, close_current + mouse_right_click = close_all + +# Experimental features that may or may not work correctly. Do not expect them +# to have a consistent behaviour across releases. +[experimental] + # Calculate the dpi to use on a per-monitor basis. + # If this setting is enabled the Xft.dpi value will be ignored and instead + # dunst will attempt to calculate an appropriate dpi value for each monitor + # using the resolution and physical size. This might be useful in setups + # where there are multiple screens with very different dpi values. + per_monitor_dpi = true + + +[urgency_low] + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#1e1e2e" + foreground = "#eff1f5" + timeout = 10 + # Icon for notifications with low urgency, uncomment to enable + #default_icon = /path/to/icon + +[urgency_normal] + background = "#1e1e2e" + foreground = "#eff1f5" + timeout = 10 + # Icon for notifications with normal urgency, uncomment to enable + #default_icon = /path/to/icon + +[urgency_critical] + background = "#313244" + foreground = "#CDD6F4" + frame_color = "#eba0ac" + timeout = 60 + # Icon for notifications with critical urgency, uncomment to enable + #default_icon = /path/to/icon + +# Every section that isn't one of the above is interpreted as a rules to +# override settings for certain messages. +# +# Messages can be matched by +# appname (discouraged, see desktop_entry) +# body +# category +# desktop_entry +# icon +# match_transient +# msg_urgency +# stack_tag +# summary +# +# and you can override the +# background +# foreground +# format +# frame_color +# fullscreen +# new_icon +# set_stack_tag +# set_transient +# set_category +# timeout +# urgency +# icon_position +# skip_display +# history_ignore +# action_name +# word_wrap +# ellipsize +# alignment +# hide_text +# +# Shell-like globbing will get expanded. +# +# Instead of the appname filter, it's recommended to use the desktop_entry filter. +# GLib based applications export their desktop-entry name. In comparison to the appname, +# the desktop-entry won't get localized. +# +# SCRIPTING +# You can specify a script that gets run when the rule matches by +# setting the "script" option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# +# NOTE: It might be helpful to run dunst -print in a terminal in order +# to find fitting options for rules. + +# Disable the transient hint so that idle_threshold cannot be bypassed from the +# client +#[transient_disable] +# match_transient = yes +# set_transient = no +# +# Make the handling of transient notifications more strict by making them not +# be placed in history. +#[transient_history_ignore] +# match_transient = yes +# history_ignore = yes + +# fullscreen values +# show: show the notifications, regardless if there is a fullscreen window opened +# delay: displays the new notification, if there is no fullscreen window active +# If the notification is already drawn, it won't get undrawn. +# pushback: same as delay, but when switching into fullscreen, the notification will get +# withdrawn from screen again and will get delayed like a new notification +#[fullscreen_delay_everything] +# fullscreen = delay +[fullscreen_show_critical] + msg_urgency = critical + fullscreen = pushback + +#[espeak] +# summary = "*" +# script = dunst_espeak.sh + +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + +#[ignore] +# # This notification will not be displayed +# summary = "foobar" +# skip_display = true + +#[history-ignore] +# # This notification will not be saved in history +# summary = "foobar" +# history_ignore = yes + +#[skip-display] +# # This notification will not be displayed, but will be included in the history +# summary = "foobar" +# skip_display = yes + +#[signed_on] +# appname = Pidgin +# summary = "*signed on*" +# urgency = low +# +#[signed_off] +# appname = Pidgin +# summary = *signed off* +# urgency = low +# +#[says] +# appname = Pidgin +# summary = *says* +# urgency = critical +# +#[twitter] +# appname = Pidgin +# summary = *twitter.com* +# urgency = normal +# +#[stack-volumes] +# appname = "some_volume_notifiers" +# set_stack_tag = "volume" +# +# vim: ft=cfg diff --git a/defaults/xdg/fastfetch/config.jsonc b/defaults/xdg/fastfetch/config.jsonc new file mode 100644 index 0000000..c8b975a --- /dev/null +++ b/defaults/xdg/fastfetch/config.jsonc @@ -0,0 +1,136 @@ +// Load with --load-config examples/2.jsonc +// Note that you must replace the image path to an existing image to display it. + +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "type": "none" + }, + "display": { + "separator": " -> ", + "constants": [ + "──────────────────────────────" + ], + "key": { + "paddingLeft": 2 + } + }, + "modules": [ + { + "type": "custom", + "format": "┌{$1}{$1}┐", + "outputColor": "90" + + }, + { + "type": "title", + "keyWidth": 10 + }, + { + "type": "custom", + "format": "└{$1}{$1}┘", + "outputColor": "90" + }, + { + "type": "custom", + "format": " {#90} {#31} {#32} {#33} {#34} {#35} {#36} {#37} {#38} {#39}  {#38} {#37} {#36} {#35} {#34} {#33} {#32} {#31} {#90}" + }, + { + "type": "custom", + "format": "┌{$1}{$1}┐", + "outputColor": "90" + }, + { + "type": "os", + "key": "{icon} OS", + "keyColor": "yellow" + }, + { + "type": "kernel", + "key": "│ ├", + "keyColor": "yellow" + }, + { + "type": "packages", + "key": "│ ├󰏖", + "keyColor": "yellow" + }, + { + "type": "shell", + "key": "│ └", + "keyColor": "yellow" + }, + { + "type": "wm", + "key": " DE/WM", + "keyColor": "blue" + }, + { + "type": "wmtheme", + "key": "│ ├󰉼", + "keyColor": "blue" + }, + { + "type": "terminal", + "key": "│ ├", + "keyColor": "blue" + }, + { + "type": "wallpaper", + "key": "│ └󰸉", + "keyColor": "blue" + }, + { + "type": "host", + "key": "󰌢 PC", + "keyColor": "green" + }, + { + "type": "cpu", + "key": "│ ├󰻠", + "keyColor": "magenta" + }, + { + "type": "gpu", + "key": "│ ├󰍛", + "keyColor": "magenta" + }, + { + "type": "disk", + "key": "│ ├", + "keyColor": "green" + }, + { + "type": "memory", + "key": "│ ├󰑭", + "keyColor": "green" + }, + { + "type": "uptime", + "key": "│ ├󰅐", + "keyColor": "green" + }, + + { + "type": "sound", + "key": " SND", + "keyColor": "cyan" + }, + { + "type": "player", + "key": "│ ├󰥠", + "keyColor": "cyan" + }, + { + "type": "media", + "key": "│ └󰝚", + "keyColor": "cyan" + }, + { + "type": "custom", + "format": "└{$1}{$1}┘", + "outputColor": "90" + } + + ] +} \ No newline at end of file diff --git a/defaults/xdg/foot/foot.ini b/defaults/xdg/foot/foot.ini new file mode 100644 index 0000000..bd36abb --- /dev/null +++ b/defaults/xdg/foot/foot.ini @@ -0,0 +1,260 @@ +# ABOUTME: Moonarch default foot terminal configuration with Catppuccin Mocha colors. +# ABOUTME: User overrides go in ~/.config/foot/foot.ini +# -*- conf -*- + +# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd) +# term=foot (or xterm-256color if built with -Dterminfo=disabled) +# login-shell=no + +# app-id=foot # globally set wayland app-id. Default values are "foot" and "footclient" for desktop and server mode +# title=foot +# locked-title=no + +font=Hack Nerd Font:size=11 +# font-bold= +# font-italic= +# font-bold-italic= +# font-size-adjustment=0.5 +# line-height= +# letter-spacing=0 +# horizontal-letter-offset=0 +# vertical-letter-offset=0 +# underline-offset= +# underline-thickness= +# strikeout-thickness= +# box-drawings-uses-font-glyphs=no +# dpi-aware=no +# gamma-correct-blending=no + +# initial-color-theme=1 +# initial-window-size-pixels=700x500 # Or, +# initial-window-size-chars= +# initial-window-mode=windowed +# pad=0x0 center-when-maximized-and-fullscreen +# resize-by-cells=yes +# resize-keep-grid=yes +# resize-delay-ms=100 + +# bold-text-in-bright=no +# word-delimiters=,│`|:"'()[]{}<> +# selection-target=primary +# workers= +# utmp-helper=/usr/lib/utempter/utempter # When utmp backend is 'libutempter' (Linux) +# utmp-helper=/usr/libexec/ulog-helper # When utmp backend is 'ulog' (FreeBSD) + +# uppercase-regex-insert=yes + +[environment] +# name=value + +[security] +# osc52=enabled # disabled|copy-enabled|paste-enabled|enabled + +[bell] +# system=yes +# urgent=no +# notify=no +# visual=no +# command= +# command-focused=no + +[desktop-notifications] +# command=notify-send --wait --app-name ${app-id} --icon ${app-id} --category ${category} --urgency ${urgency} --expire-time ${expire-time} --hint STRING:image-path:${icon} --hint BOOLEAN:suppress-sound:${muted} --hint STRING:sound-name:${sound-name} --replace-id ${replace-id} ${action-argument} --print-id -- ${title} ${body} +# command-action-argument=--action ${action-name}=${action-label} +# close="" +# inhibit-when-focused=yes + + +[scrollback] +# lines=1000 +# multiplier=3.0 +# indicator-position=relative +# indicator-format="" + +[url] +# launch=xdg-open ${url} +# label-letters=sadfjklewcmpgh +# osc8-underline=url-mode +# regex=(((https?://|mailto:|ftp://|file:|ssh:|ssh://|git://|tel:|magnet:|ipfs://|ipns://|gemini://|gopher://|news:)|www\.)([0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]+|\([]\["0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\)|\[[\(\)"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\]|"[]\[\(\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*"|'[]\[\(\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]*')+([0-9a-zA-Z/#@$&*+=~_%^\-]|\([]\["0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\)|\[[\(\)"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\]|"[]\[\(\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*"|'[]\[\(\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]*')) + +# You can define your own regex's, by adding a section called +# 'regex:' with a 'regex' and 'launch' key. These can then be tied +# to a key-binding. See foot.ini(5) for details + +# [regex:your-fancy-name] +# regex= +# launch= ${match} +# +# [key-bindings] +# regex-launch=[your-fancy-name] Control+Shift+q +# regex-copy=[your-fancy-name] Control+Alt+Shift+q + +[cursor] +# style=block +# blink=no +# blink-rate=500 +# beam-thickness=1.5 +# underline-thickness= + +[mouse] +# hide-when-typing=no +# alternate-scroll-mode=yes + +[touch] +# long-press-delay=400 + +[colors-dark] +alpha=0.9 +# alpha-mode=default # Can be `default`, `matching` or `all` +cursor=11111b f5e0dc +foreground=cdd6f4 +background=1e1e2e + +regular0=45475a +regular1=f38ba8 +regular2=a6e3a1 +regular3=f9e2af +regular4=89b4fa +regular5=f5c2e7 +regular6=94e2d5 +regular7=bac2de + +bright0=585b70 +bright1=f38ba8 +bright2=a6e3a1 +bright3=f9e2af +bright4=89b4fa +bright5=f5c2e7 +bright6=94e2d5 +bright7=a6adc8 + +16=fab387 +17=f5e0dc + +selection-foreground=cdd6f4 +selection-background=414356 + +search-box-no-match=11111b f38ba8 +search-box-match=cdd6f4 313244 + +jump-labels=11111b fab387 +urls=89b4fa + +[colors2] +# Alternative color theme, see man page foot.ini(5) +# Same builtin defaults as [color], except for: +# dim-blend-towards=white + +[csd] +# preferred=server +# size=26 +# font= +# color= +# hide-when-maximized=no +# double-click-to-maximize=yes +# border-width=0 +# border-color= +# button-width=26 +# button-color= +# button-minimize-color= +# button-maximize-color= +# button-close-color= + +[key-bindings] +# scrollback-up-page=Shift+Page_Up Shift+KP_Page_Up +# scrollback-up-half-page=none +# scrollback-up-line=none +# scrollback-down-page=Shift+Page_Down Shift+KP_Page_Down +# scrollback-down-half-page=none +# scrollback-down-line=none +# scrollback-home=none +# scrollback-end=none +# clipboard-copy=Control+Shift+c XF86Copy +# clipboard-paste=Control+Shift+v XF86Paste +# primary-paste=Shift+Insert +# search-start=Control+Shift+r +# font-increase=Control+plus Control+equal Control+KP_Add +# font-decrease=Control+minus Control+KP_Subtract +# font-reset=Control+0 Control+KP_0 +# spawn-terminal=Control+Shift+n +# minimize=none +# maximize=none +# fullscreen=none +# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none +# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none +# pipe-selected=[xargs -r firefox] none +# pipe-command-output=[wl-copy] none # Copy last command's output to the clipboard +# show-urls-launch=Control+Shift+o +# show-urls-copy=none +# show-urls-persistent=none +# prompt-prev=Control+Shift+z +# prompt-next=Control+Shift+x +# unicode-input=Control+Shift+u +# color-theme-switch-1=none +# color-theme-switch-2=none +# color-theme-toggle=none +# noop=none +# quit=none + +[search-bindings] +# cancel=Control+g Control+c Escape +# commit=Return KP_Enter +# find-prev=Control+r +# find-next=Control+s +# cursor-left=Left Control+b +# cursor-left-word=Control+Left Mod1+b +# cursor-right=Right Control+f +# cursor-right-word=Control+Right Mod1+f +# cursor-home=Home Control+a +# cursor-end=End Control+e +# delete-prev=BackSpace +# delete-prev-word=Mod1+BackSpace Control+BackSpace +# delete-next=Delete +# delete-next-word=Mod1+d Control+Delete +# delete-to-start=Control+u +# delete-to-end=Control+k +# extend-char=Shift+Right +# extend-to-word-boundary=Control+w Control+Shift+Right +# extend-to-next-whitespace=Control+Shift+w +# extend-line-down=Shift+Down +# extend-backward-char=Shift+Left +# extend-backward-to-word-boundary=Control+Shift+Left +# extend-backward-to-next-whitespace=none +# extend-line-up=Shift+Up +# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste +# primary-paste=Shift+Insert +# unicode-input=none +# scrollback-up-page=Shift+Page_Up Shift+KP_Page_Up +# scrollback-up-half-page=none +# scrollback-up-line=none +# scrollback-down-page=Shift+Page_Down Shift+KP_Page_Down +# scrollback-down-half-page=none +# scrollback-down-line=none +# scrollback-home=none +# scrollback-end=none + +[url-bindings] +# cancel=Control+g Control+c Control+d Escape +# toggle-url-visible=t + +[text-bindings] +# \x03=Mod4+c # Map Super+c -> Ctrl+c +\x1b\x5b\x31\x33\x3b\x32\x75=Shift+Return + +[mouse-bindings] +# scrollback-up-mouse=BTN_WHEEL_BACK +# scrollback-down-mouse=BTN_WHEEL_FORWARD +# font-increase=Control+BTN_WHEEL_BACK +# font-decrease=Control+BTN_WHEEL_FORWARD +# selection-override-modifiers=Shift +# primary-paste=BTN_MIDDLE +# select-begin=BTN_LEFT +# select-begin-block=Control+BTN_LEFT +# select-extend=BTN_RIGHT +# select-extend-character-wise=Control+BTN_RIGHT +# select-word=BTN_LEFT-2 +# select-word-whitespace=Control+BTN_LEFT-2 +# select-quote = BTN_LEFT-3 +# select-row=BTN_LEFT-4 + +# vim: ft=dosini diff --git a/defaults/xdg/gtk-3.0/settings.ini b/defaults/xdg/gtk-3.0/settings.ini new file mode 100644 index 0000000..9340092 --- /dev/null +++ b/defaults/xdg/gtk-3.0/settings.ini @@ -0,0 +1,20 @@ +# ABOUTME: Moonarch default GTK3 settings. +# ABOUTME: User overrides go in ~/.config/gtk-3.0/settings.ini + +[Settings] +gtk-theme-name=catppuccin-mocha-lavender-standard+default +gtk-icon-theme-name=Newaita-reborn-gray-dark +gtk-font-name=Hack Nerd Font 11 +gtk-cursor-theme-name=Sweet-cursors +gtk-cursor-theme-size=24 +gtk-toolbar-style=GTK_TOOLBAR_BOTH +gtk-toolbar-icon-size=GTK_ICON_SIZE_SMALL_TOOLBAR +gtk-button-images=1 +gtk-menu-images=1 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=0 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle=hintslight +gtk-xft-rgba=rgb +gtk-application-prefer-dark-theme=1 diff --git a/defaults/xdg/gtk-4.0/settings.ini b/defaults/xdg/gtk-4.0/settings.ini new file mode 100644 index 0000000..ef62c07 --- /dev/null +++ b/defaults/xdg/gtk-4.0/settings.ini @@ -0,0 +1,5 @@ +# ABOUTME: Moonarch default GTK4 settings. +# ABOUTME: User overrides go in ~/.config/gtk-4.0/settings.ini + +[Settings] +gtk-application-prefer-dark-theme=1 diff --git a/defaults/xdg/gtklock/config.ini b/defaults/xdg/gtklock/config.ini new file mode 100644 index 0000000..7cd73d1 --- /dev/null +++ b/defaults/xdg/gtklock/config.ini @@ -0,0 +1,29 @@ +# ABOUTME: Moonarch default gtklock configuration. +# ABOUTME: User overrides go in ~/.config/gtklock/config.ini + +[main] +modules=powerbar-module;userinfo-module;playerctl-module;dpms +follow-focus=true +layout=/etc/xdg/gtklock/gtklock.ui + +[powerbar] +show-labels=false +linked-buttons=true +reboot-command=systemctl reboot +poweroff-command=systemctl -i poweroff +suspend-command=systemctl suspend +userswitch-command= +logout-command= + +[playerctl] +art-size=64 +position=under-clock + +[userinfo] +round-image=true +horizontal-layout=false +under-clock=false + +[dpms] +idle-hide=true +idle-timeout=10 diff --git a/defaults/xdg/gtklock/gtklock.ui b/defaults/xdg/gtklock/gtklock.ui new file mode 100644 index 0000000..4b89b3f --- /dev/null +++ b/defaults/xdg/gtklock/gtklock.ui @@ -0,0 +1,138 @@ + + + + + + window-box + 20 + center + center + vertical + 50 + + + info-box + center + vertical + 5 + + + time-box + center + vertical + + + clock-label + center + + + + + date-label + center + + + + + + + + + none + 0 + + + 5 + 5 + + + input-label + Password: + + + 0 + 0 + + + + + input-field + 380 + 0 + 0 + password + view-reveal-symbolic + + + + + 1 + 0 + 2 + + + + + none + 1 + + + never + 256 + 1 + + + + + vertical + 1 + + + + + + + + + 1 + 1 + 2 + + + + + end + 5 + + + warning-label + + + + + error-label + + + + + unlock-button + Unlock + + + + + + + 1 + 2 + 2 + + + + + + + + diff --git a/defaults/xdg/gtklock/style.css b/defaults/xdg/gtklock/style.css new file mode 100644 index 0000000..c26f3b3 --- /dev/null +++ b/defaults/xdg/gtklock/style.css @@ -0,0 +1,12 @@ +/* ABOUTME: Moonarch default gtklock stylesheet. */ +/* ABOUTME: User overrides go in ~/.config/gtklock/style.css */ + +window { + background-image: url("/usr/share/moonarch/wallpaper.jpg"); + background-size: cover; +} + +#powerbar { + padding-bottom: 100px; + background: red; +} diff --git a/defaults/xdg/niri/config.kdl b/defaults/xdg/niri/config.kdl new file mode 100644 index 0000000..7b6753c --- /dev/null +++ b/defaults/xdg/niri/config.kdl @@ -0,0 +1,280 @@ +// ABOUTME: Moonarch default Niri compositor configuration. +// ABOUTME: User overrides go in ~/.config/niri/config.kdl + +cursor { + xcursor-theme "Sweet-cursors" + hide-when-typing + hide-after-inactive-ms 1000 +} + +input { + mod-key "Super" + keyboard { + xkb { + layout "de" + } + numlock + } + + touchpad { + tap + natural-scroll + } + + mouse { + accel-profile "flat" + } + + trackpoint { + } + + warp-mouse-to-focus + focus-follows-mouse max-scroll-amount="0%" +} + +gestures { + hot-corners { + off + } +} + +layout { + gaps 8 + center-focused-column "never" + + preset-column-widths { + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + } + + default-column-width { proportion 0.5; } + + focus-ring { + width 2 + active-color "#7f849c80" + inactive-color "#1e1e2e80" + } + + border { + off + width 2 + active-color "#ffc87f" + inactive-color "#505050" + urgent-color "#9b0000" + } + + shadow { + off + softness 30 + spread 2 + offset x=0 y=5 + color "#0007" + } + + struts { + } +} + +spawn-at-startup "xwayland-satellite" +spawn-at-startup "waybar" +spawn-at-startup "dunst" +spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1" +spawn-sh-at-startup "waypaper --restore" +// spawn-sh-at-startup "nemo . &> /dev/null &" +spawn-sh-at-startup "foot --server" +spawn-sh-at-startup "mkdir -p /run/user/1000/cliphist && wl-paste --watch cliphist -db-path /run/user/1000/cliphist/db store" +spawn-sh-at-startup "mkdir -p /run/user/1000/cliphist && wl-paste --type image --watch cliphist -db-path /run/user/1000/cliphist/db store" + +hotkey-overlay { + hide-not-bound +} + +prefer-no-csd + +screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" + +animations { + on +} + +window-rule { + match app-id=r#"^org\.wezfurlong\.wezterm$"# + default-column-width {} +} + +window-rule { + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + open-floating true +} + +window-rule { + match app-id=r#"waterfox$"# title="^Picture-in-Picture$" + open-floating true +} + +window-rule { + geometry-corner-radius 4 + clip-to-geometry true +} + +binds { + Mod+Shift+Slash { show-hotkey-overlay; } + + Super+C hotkey-overlay-title=null { spawn-sh "cliphist -db-path /run/user/1000/cliphist/db list | rofi -dmenu | cliphist -db-path /run/user/1000/cliphist/db decode | wl-copy"; } + + Alt+W { spawn-sh "killall waybar && waybar &"; } + + Super+E { spawn-sh "xdg-open ~"; } + + Super+T { spawn-sh "pkill rofi || rofi -show fb -modes \"fb:moonarch-setmen\" -theme /etc/xdg/rofi/settings-menu/settings-menu.rasi"; } + + Super+N { spawn-sh "pkill rofi || moonarch-vpn"; } + + Mod+Return hotkey-overlay-title="Open a Terminal: foot" { spawn "foot"; } + Mod+Space hotkey-overlay-title="Run an Application: rofi" { spawn-sh "pkill rofi || moonarch-launcher"; } + Super+Alt+L hotkey-overlay-title="Lock/Logout: wlogout" { spawn-sh "wlogout -P 1 -s -r 10 -c 10"; } + + Mod+A { spawn-sh "pkill rofi || moonarch-volume"; } + + XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"; } + XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; } + XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; } + XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; } + + XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; } + XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; } + + Mod+O repeat=false { toggle-overview; } + Mod+Tab repeat=false { toggle-overview; } + + Mod+Q repeat=false { close-window; } + + Mod+Left { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + Mod+Ctrl+Left { move-column-left; } + Mod+Ctrl+Down { move-window-down; } + Mod+Ctrl+Up { move-window-up; } + Mod+Ctrl+Right { move-column-right; } + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down; } + Mod+Ctrl+K { move-window-up; } + Mod+Ctrl+L { move-column-right; } + + Mod+Home { focus-column-first; } + Mod+End { focus-column-last; } + Mod+Ctrl+Home { move-column-to-first; } + Mod+Ctrl+End { move-column-to-last; } + + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Down { focus-monitor-down; } + Mod+Shift+Up { focus-monitor-up; } + Mod+Shift+Right { focus-monitor-right; } + Mod+Shift+H { focus-monitor-left; } + Mod+Shift+J { focus-monitor-down; } + Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } + + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + + Mod+Page_Down { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + Mod+Ctrl+Page_Down { move-column-to-workspace-down; } + Mod+Ctrl+Page_Up { move-column-to-workspace-up; } + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { move-column-to-workspace-up; } + + Mod+Shift+Page_Down { move-workspace-down; } + Mod+Shift+Page_Up { move-workspace-up; } + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { move-workspace-up; } + + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + Mod+WheelScrollRight { focus-column-right; } + Mod+WheelScrollLeft { focus-column-left; } + Mod+Ctrl+WheelScrollRight { move-column-right; } + Mod+Ctrl+WheelScrollLeft { move-column-left; } + + Mod+Shift+WheelScrollDown { focus-column-right; } + Mod+Shift+WheelScrollUp { focus-column-left; } + Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } + Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } + + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { move-column-to-workspace 9; } + + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + + Mod+Comma { consume-window-into-column; } + Mod+Period { expel-window-from-column; } + + Mod+R { switch-preset-column-width; } + Mod+Shift+R { switch-preset-window-height; } + Mod+Ctrl+R { reset-window-height; } + Mod+F { maximize-column; } + Mod+Shift+F { fullscreen-window; } + + Mod+Ctrl+F { expand-column-to-available-width; } + + Mod+C { center-column; } + Mod+Ctrl+C { center-visible-columns; } + + Mod+Minus { set-column-width "-10%"; } + Mod+Equal { set-column-width "+10%"; } + + Mod+Shift+Minus { set-window-height "-10%"; } + Mod+Shift+Equal { set-window-height "+10%"; } + + Mod+V { toggle-window-floating; } + Mod+Shift+V { switch-focus-between-floating-and-tiling; } + + Mod+W { toggle-column-tabbed-display; } + + Print { screenshot; } + Ctrl+Print { screenshot-screen; } + Alt+Print { screenshot-window; } + + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + + Mod+Shift+E { quit; } + Ctrl+Alt+Delete { quit; } + + Mod+Shift+P { power-off-monitors; } +} diff --git a/defaults/xdg/pipewire/pipewire.conf.d/99-input-denoising.conf b/defaults/xdg/pipewire/pipewire.conf.d/99-input-denoising.conf new file mode 100644 index 0000000..4d42c60 --- /dev/null +++ b/defaults/xdg/pipewire/pipewire.conf.d/99-input-denoising.conf @@ -0,0 +1,36 @@ +# ABOUTME: Moonarch default PipeWire input denoising via RNNoise LADSPA plugin. +# ABOUTME: User overrides go in ~/.config/pipewire/pipewire.conf.d/ + +context.modules = [ +{ name = libpipewire-module-filter-chain + args = { + node.description = "Noise Canceling source" + media.name = "Noise Canceling source" + filter.graph = { + nodes = [ + { + type = ladspa + name = rnnoise + plugin = librnnoise_ladspa + label = noise_suppressor_mono + control = { + "VAD Threshold (%)" = 90.0 + "VAD Grace Period (ms)" = 150 + "Retroactive VAD Grace (ms)" = 0 + } + } + ] + } + capture.props = { + node.name = "capture.rnnoise_source" + node.passive = true + audio.rate = 48000 + } + playback.props = { + node.name = "rnnoise_source" + media.class = Audio/Source + audio.rate = 48000 + } + } +} +] diff --git a/defaults/xdg/rofi/_template/colors.rasi b/defaults/xdg/rofi/_template/colors.rasi new file mode 100644 index 0000000..5636506 --- /dev/null +++ b/defaults/xdg/rofi/_template/colors.rasi @@ -0,0 +1,82 @@ +/** + * @author Dominik Kressler + * @package rofi-archer + * @version 1.0.0 + **/ + +* { + background: {@theme_bg_color}; + background-alt: {@theme_unfocused_fg_color}80; + + + + foreground: {@theme_text_color}; + selected: #4c566a; + border: {@borders}; + active: #98C37988; + urgent: var(error-color); + + + + /*https://catppuccin.ryanccn.dev/palette*/ + rosewater: #f5e0dc; + flamingo: #f2cdcd; + pink: #f5c2e7; + mauve: #cba6f7; + red: #f38ba8; + maroon: #eba0ac; + peach: #fab387; + yellow: #f9e2af; + green: #a6e3a1; + teal: #94e2d5; + sky: #89dceb; + sapphire: #74c7ec; + blue: #89b4fa; + lavender: #b4befe; + + text: {@theme_text_color}; + subtext1: {@theme_text_color}80; + subtext0: #a6adc8; + + overlay0: #6c7086; + overlay1: #7f849c; + overlay2: #9399b2; + + surface0: #313244; + surface1: #45475a; + surface2: #585b70; + + base: #1e1e2e; + mantle: #181825; + crust: #11111b; + + + + /* GTK THEME VARS*/ + theme-fg-color: {@theme_fg_color}; + theme-text-color: {@theme_text_color}; + theme-bg-color: {@theme_bg_color}; + theme-base-color: {@theme_base_color}; + + theme-bg-color-shade-1: {@theme_bg_color}EF; + theme-bg-color-shade-2: {@theme_bg_color}D8; + theme-bg-color-shade-3: {@theme_bg_color}C9; + + theme-selected-bg-color: {@theme_selected_bg_color}; + theme-selected-fg-color: {@theme_selected_fg_color}; + + theme-unfocused-fg-color: {@theme_unfocused_fg_color}; + theme-unfocused-text-color: {@theme_unfocused_text_color}; + theme-unfocused-bg-color: {@theme_unfocused_bg_color}; + theme-unfocused-base-color: {@theme_unfocused_base_color}; + theme-unfocused-selected-bg-color: {@theme_unfocused_selected_bg_color}; + theme-unfocused-selected-fg-color: {@theme_unfocused_selected_fg_color}; + unfocused-insensitive-color: {@unfocused_insensitive_color}; + + borders: {@theme_selected_bg_color}30; + unfocused-borders: {@unfocused_borders}; + + warning-color: {@warning_color}; + error-color: {@error_color}; + success-color: {@success_color}; +} \ No newline at end of file diff --git a/defaults/xdg/rofi/bluetooth/bluetooth.rasi b/defaults/xdg/rofi/bluetooth/bluetooth.rasi new file mode 100644 index 0000000..919ab36 --- /dev/null +++ b/defaults/xdg/rofi/bluetooth/bluetooth.rasi @@ -0,0 +1,295 @@ +/** + * + * Author : Aditya Shakya (adi1090x) + * Github : @adi1090x + * + * Rofi Theme File + * Rofi Version: 1.7.3 + **/ + +/*****----- Configuration -----*****/ +configuration { + modi: ""; + show-icons: false; + drun-display-format: "{name}"; + window-format: "{w} · {c} · {t}"; +} + +/*****----- Global Properties -----*****/ +@import "../colors.rasi" +@import "../fonts.rasi" + +* { + border-colour: var(border); + handle-colour: var(selected); + background-colour: var(background); + foreground-colour: var(foreground); + alternate-background: var(background-alt); + normal-background: var(background); + normal-foreground: var(foreground); + urgent-background: var(urgent); + urgent-foreground: var(background); + active-background: var(active); + active-foreground: var(background); + selected-normal-background: var(selected); + selected-normal-foreground: var(background); + selected-urgent-background: var(active); + selected-urgent-foreground: var(background); + selected-active-background: var(urgent); + selected-active-foreground: var(background); + alternate-normal-background: var(background); + alternate-normal-foreground: var(foreground); + alternate-urgent-background: var(urgent); + alternate-urgent-foreground: var(background); + alternate-active-background: var(active); + alternate-active-foreground: var(background); +} + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 600px; + x-offset: 0px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + margin: 0px; + padding: 0px; + border: 1px solid; + border-radius: 10px; + border-color: @border-colour; + cursor: "default"; + /* Backgroud Colors */ + background-color: @background-colour; + /* Backgroud Image */ + //background-image: url("/path/to/image.png", none); + /* Simple Linear Gradient */ + //background-image: linear-gradient(red, orange, pink, purple); + /* Directional Linear Gradient */ + //background-image: linear-gradient(to bottom, pink, yellow, magenta); + /* Angle Linear Gradient */ + //background-image: linear-gradient(45, cyan, purple, indigo); +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 30px; + border: 0px solid; + border-radius: 0px 0px 0px 0px; + border-color: @border-colour; + background-color: transparent; + children: [ "message", "listview", "inputbar" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: false; + spacing: 10px; + margin: 0; + padding: 20px 0px 0; + border: 0px solid; + border-radius: 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; + children: [ "textbox-prompt-colon", "entry", "mode-switcher" ]; +} + +prompt { + enabled: true; + background-color: inherit; + text-color: inherit; +} +textbox-prompt-colon { + enabled: true; + padding: 5px 0px 0px 15px; + expand: false; + font: "MonarchOS 14"; + str: ""; + background-color: inherit; + text-color: inherit; +} +entry { + enabled: true; + padding: 5px 0px; + background-color: inherit; + text-color: inherit; + cursor: text; + placeholder: "..."; + placeholder-color: inherit; +} +num-filtered-rows { + enabled: true; + expand: false; + background-color: inherit; + text-color: inherit; +} +textbox-num-sep { + enabled: true; + expand: false; + str: "/"; + background-color: inherit; + text-color: inherit; +} +num-rows { + enabled: true; + expand: false; + background-color: inherit; + text-color: inherit; +} +case-indicator { + enabled: true; + background-color: inherit; + text-color: inherit; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 1; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 5px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; + cursor: "default"; +} +scrollbar { + handle-width: 5px; + handle-color: @handle-colour; + border-radius: 10px; + background-color: transparent; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 5px 10px; + border: 0px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; + cursor: pointer; +} +element normal.normal { + background-color: transparent; + text-color: var(normal-foreground); +} +element normal.urgent { + background-color: var(urgent-background); + text-color: var(urgent-foreground); +} +element normal.active { + background-color: var(normal-foreground); + text-color: var(normal-background); +} +element selected.normal { + background-color: var(selected-normal-background); + text-color: var(normal-foreground); +} +element selected.urgent { + background-color: var(selected-urgent-background); + text-color: var(normal-background); +} +element selected.active { + background-color: var(selected-active-background); + text-color: var(normal-background); +} + +element-icon { + background-color: transparent; + text-color: inherit; + size: 24px; + cursor: inherit; +} +element-text { + background-color: transparent; + text-color: inherit; + highlight: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Mode Switcher -----*****/ +mode-switcher{ + enabled: true; + spacing: 10px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; +} +button { + padding: 7px 15px 7px 10px; + border: 0px solid; + border-radius: 100%; + border-color: @border-colour; + background-color: @alternate-background; + text-color: inherit; + cursor: pointer; +} +button selected { + background-color: var(selected-normal-background); + text-color: var(selected-normal-foreground); +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px 0px 0px 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; +} +textbox { + padding: 8px 10px; + border: 0px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: @alternate-background; + text-color: @foreground-colour; + vertical-align: 0.5; + horizontal-align: 0.0; + highlight: none; + placeholder-color: @foreground-colour; + blink: true; + markup: true; +} +error-message { + padding: 10px; + border: 2px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: @background-colour; + text-color: @foreground-colour; +} diff --git a/defaults/xdg/rofi/calendar/rofi-calendar.rasi b/defaults/xdg/rofi/calendar/rofi-calendar.rasi new file mode 100644 index 0000000..d419f0b --- /dev/null +++ b/defaults/xdg/rofi/calendar/rofi-calendar.rasi @@ -0,0 +1,157 @@ +* { +on: #98B3C8; +off: #CC9498; +} + +/*****----- Global Properties -----*****/ +@import "../colors.rasi" +@import "../fonts.rasi" + +configuration { + show-icons: false; + icon-theme: "Papirus"; + display-drun: ":"; + drun-display-format: "{name}"; + threads: 0; + scroll-method: 0; + disable-history: false; + fullscreen: false; + hide-scrollbar: true; + sidebar-mode: false; +} + +window { + transparency: "real"; + background-color: @background; + text-color: @foreground; + border: 0px; + border-radius: 0px; + border-color: @selected; + width: 384px; + location: center; + anchor: center; + x-offset: 0; + y-offset: 0; +} + +prompt { + enabled: true; + padding: 4px 4px 6px 6px; + background-color: @background; + text-color: @foreground; +} + +textbox-prompt-colon { + expand: false; + str: ""; + background-color: @background; + text-color: @urgent; + padding: 5px 0px 0px 4px; +} + +inputbar { + children: [ textbox-prompt-colon, prompt ]; + background-color: @background; + text-color: @foreground; + expand: false; + border: 0px 0px 1px 0px; + border-radius: 0px; + border-color: @selected; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + position: center; +} + + +entry { + background-color: @background; + text-color: @foreground; + placeholder-color: @foreground; + expand: true; + horizontal-align: 0; + placeholder: "Search"; + blink: true; + padding: 4px 0px 0px 0px; +} + +case-indicator { + background-color: @background; + text-color: @foreground; + spacing: 0; +} + + +listview { + background-color: @background; + columns: 9; + lines: 7; + spacing: 5px; + cycle: true; + dynamic: true; + layout: vertical; +} + +mainbox { + background-color: @background; + children: [ inputbar, listview ]; + spacing: 5px; + padding: 5px 5px 5px 5px; +} + +element { + background-color: @background; + text-color: @foreground; + orientation: horizontal; + border: 0px; + border-radius: 0px; + border-color: @selected; + padding: 5px 5px 5px 5px; +} + +element-icon { + size: 24px; + border: 0px; +} + +element-text { + + expand: true; + horizontal-align: 0; + vertical-align: 0; + margin: 2px 0px 2px 2px; +} + +element selected { + background-color: @selected; + text-color: @background; + border: 0px; + border-radius: 0px; + border-color: @selected; +} + +element.active, +element.selected.urgent { + background-color: @background-alt; + text-color: @background; + border-color: @background-alt; +} + +element.selected.urgent { + border-color: @urgent; +} + +element.urgent, +element.selected.active { + background-color: @background; + text-color: @foreground; + border-color: @background; +} + +element.selected.active { + border-color: @selected; +} + +element-text, element-icon { + background-color: inherit; + text-color: inherit; +} \ No newline at end of file diff --git a/defaults/xdg/rofi/colors.rasi b/defaults/xdg/rofi/colors.rasi new file mode 100644 index 0000000..1dfb59f --- /dev/null +++ b/defaults/xdg/rofi/colors.rasi @@ -0,0 +1,82 @@ +/** + * @author Dominik Kressler + * @package rofi-archer + * @version 1.0.0 + **/ + +* { + background: #1e1e2e; + background-alt: #eff1f580; + + + + foreground: #eff1f5; + selected: #4c566a; + border: #eff1f5; + active: #98C37988; + urgent: var(error-color); + + + + /*https://catppuccin.ryanccn.dev/palette*/ + rosewater: #f5e0dc; + flamingo: #f2cdcd; + pink: #f5c2e7; + mauve: #cba6f7; + red: #f38ba8; + maroon: #eba0ac; + peach: #fab387; + yellow: #f9e2af; + green: #a6e3a1; + teal: #94e2d5; + sky: #89dceb; + sapphire: #74c7ec; + blue: #89b4fa; + lavender: #b4befe; + + text: #eff1f5; + subtext1: #eff1f580; + subtext0: #a6adc8; + + overlay0: #6c7086; + overlay1: #7f849c; + overlay2: #9399b2; + + surface0: #313244; + surface1: #45475a; + surface2: #585b70; + + base: #1e1e2e; + mantle: #181825; + crust: #11111b; + + + + /* GTK THEME VARS*/ + theme-fg-color: #eff1f5; + theme-text-color: #eff1f5; + theme-bg-color: #1e1e2e; + theme-base-color: #1e1e2e; + + theme-bg-color-shade-1: #1e1e2eEF; + theme-bg-color-shade-2: #1e1e2eD8; + theme-bg-color-shade-3: #1e1e2eC9; + + theme-selected-bg-color: #b4befe; + theme-selected-fg-color: #11111b; + + theme-unfocused-fg-color: #eff1f5; + theme-unfocused-text-color: #eff1f5; + theme-unfocused-bg-color: #1e1e2e; + theme-unfocused-base-color: #1e1e2e; + theme-unfocused-selected-bg-color: #b4befe; + theme-unfocused-selected-fg-color: #11111b; + unfocused-insensitive-color: #eff1f5; + + borders: #b4befe30; + unfocused-borders: #eff1f5; + + warning-color: #f9e2af; + error-color: #f38ba8; + success-color: #a6e3a1; +} diff --git a/defaults/xdg/rofi/config.rasi b/defaults/xdg/rofi/config.rasi new file mode 100644 index 0000000..dc914d9 --- /dev/null +++ b/defaults/xdg/rofi/config.rasi @@ -0,0 +1,305 @@ +/** + * + * Author : Aditya Shakya (adi1090x) + * Github : @adi1090x + * + * Rofi Theme File + * Rofi Version: 1.7.3 + **/ + +/*****----- Configuration -----*****/ +configuration { + modi: "drun,run,filebrowser,window"; + show-icons: true; + display-drun: ""; + display-run: ""; + display-filebrowser: ""; + display-window: ""; + display-combi: "練"; + drun-display-format: "{name}"; + window-format: "{w} · {c} · {t}"; + matching: "fuzzy"; + sidebar-mode: true; + threads: 0; + scroll-method: 0; + ssh-command: "sshfs_connect {host}"; +} + +/*****----- Global Properties -----*****/ +@import "colors.rasi" + + +* { + handle-colour: var(selected); + foreground-colour: var(foreground); + alternate-background: var(background-alt); + normal-background: var(background); + normal-foreground: var(foreground); + urgent-background: var(urgent); + urgent-foreground: var(background); + active-background: var(active); + active-foreground: var(background); + selected-normal-background: var(selected); + selected-normal-foreground: var(background); + selected-urgent-background: var(active); + selected-urgent-foreground: var(background); + selected-active-background: var(urgent); + selected-active-foreground: var(background); + alternate-normal-background: var(background); + alternate-normal-foreground: var(foreground); + alternate-urgent-background: var(urgent); + alternate-urgent-foreground: var(background); + alternate-active-background: var(active); + alternate-active-foreground: var(background); + + font: "JetBrainsMono Nerd Font 11"; + border-radius: 4px; + frame-border: 1px solid; +} + + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 600px; + x-offset: 0px; + y-offset: 60px; + + + /* properties for all widgets */ + enabled: true; + margin: 0px; + padding: 0px; + + border-radius: var(border-radius); + border: var(frame-border); + border-color: var(borders); + cursor: "default"; + + background-color: @theme-bg-color-shade-3; + +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + /*padding: 30px;*/ + background-color: transparent; + children: [ "message", "listview", "inputbar" ]; + padding: 0 0 30px 0; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + margin: 0; + padding: 20px 0 0 30px; + border: 0px solid; + border-radius: 0px; + border-color: @borders; + background-color: transparent; + text-color: var(theme-text-color); + children: [ "textbox-prompt-colon", "entry", "mode-switcher" ]; +} + +prompt { + enabled: true; + background-color: inherit; + text-color: inherit; +} +textbox-prompt-colon { + enabled: true; + padding: 5px 3px 0px 0; + expand: false; + //font: "MonarchOS 14"; + //str: ""; + str: "󰍉"; + background-color: inherit; + text-color: inherit; +} +entry { + enabled: true; + padding: 5px 0px; + background-color: inherit; + text-color: inherit; + cursor: text; + placeholder: "..."; + placeholder-color: inherit; +} +num-filtered-rows { + enabled: true; + expand: false; + background-color: inherit; + text-color: inherit; +} +textbox-num-sep { + enabled: true; + expand: false; + str: "/"; + background-color: inherit; + text-color: inherit; +} +num-rows { + enabled: true; + expand: false; + background-color: inherit; + text-color: inherit; +} +case-indicator { + enabled: true; + background-color: inherit; + text-color: inherit; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 1; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 10px; + margin: 0px; + padding: 30px 30px 0px 30px; + border: 0px solid; + border-radius: 0px; + border-color: @borders; + background-color: transparent; + text-color: var(theme-text-color); + cursor: "default"; +} +scrollbar { + handle-width: 5px; + handle-color: @handle-colour; + border-radius: var(border-radius); + background-color: transparent; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 5px 10px; + border: 0px solid; + border-radius: var(border-radius); + border-color: @borders; + background-color: transparent; + text-color: var(theme-text-color); + cursor: pointer; + orientation: horizontal; + children: ["element-text"]; +} +element normal.normal { + background-color: transparent; + text-color: var(normal-foreground); +} +element normal.urgent { + background-color: var(urgent-background); + text-color: var(urgent-foreground); +} +element normal.active { + background-color: var(normal-foreground); + text-color: var(theme-bg-color-shade-1); +} +element selected.normal { + background-color: var(theme-selected-fg-color); + text-color: var(theme-selected-bg-color); +} +element selected.urgent { + background-color: var(theme-bg-color-shade-1); + text-color: var(theme-text-color); +} +element selected.active { + background-color: var(error-color); + text-color: var(theme-text-color); +} + +element-icon { + background-color: transparent; + text-color: inherit; + size: 16px; + cursor: inherit; +} +element-text { + background-color: transparent; + text-color: inherit; + highlight: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Mode Switcher -----*****/ +mode-switcher{ + enabled: true; + spacing: 10px; + margin: 0px; + padding: 0px 30px 0px 0; + border: 0px solid; + border-radius: 0px; + border-color: @borders; + background-color: transparent; + text-color: var(theme-text-color); +} +button { + padding: 2px 14px 2px 9px; + border: 0px solid; + border-radius: var(border-radius); + border-color: @borders; + background-color: @theme-bg-color-shade-1; + text-color: var(theme-selected-bg-color); + cursor: pointer; +} +button selected { + background-color: var(theme-selected-fg-color); + text-color: var(theme-selected-bg-color); +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 0 0 0 0; + border: 0px solid; + border-radius: 0px 0px 0px 0px; + border-color: @borders; + background-color: transparent; + text-color: var(theme-text-color); +} +textbox { + padding: 30px 10px 0 10px; + border: 0px solid; + /*border-radius: 10px 10px 0 0;*/ + border-radius: 0 0 0 0; + border-color: @borders; + background-color: transparent; + font: "JetBrainsMono Nerd Font 12"; + text-color: var(theme-text-color); + horizontal-align: 0.5; + highlight: none; + placeholder-color: var(theme-text-color); + blink: true; + markup: true; +} +error-message { + padding: 10px; + border: 2px solid; + border-radius: var(border-radius); + border-color: @borders; + background-color: @background; + text-color: var(theme-text-color); +} diff --git a/defaults/xdg/rofi/cpugov/rofi-cpugov.rasi b/defaults/xdg/rofi/cpugov/rofi-cpugov.rasi new file mode 100644 index 0000000..82b16ec --- /dev/null +++ b/defaults/xdg/rofi/cpugov/rofi-cpugov.rasi @@ -0,0 +1,45 @@ +configuration { + modi: "drun"; + show-icons: false; + drun-display-format: "{name}"; +} + +@import "../config.rasi" +@import "../colors.rasi" + + +window { + enabled: true; + cursor: "default"; + width: 300px; + height: 300px; +} + + +mainbox { + children: [ "message", "listview", "inputbar" ]; +} + + +inputbar { + enabled: true; + + children: [ "textbox-prompt-colon", "entry", "mode-switcher" ]; +} + +listview { + enabled: true; + columns: 1; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; +} + +element-icon { + size: 0px; +} \ No newline at end of file diff --git a/defaults/xdg/rofi/emojis/emojis.rasi b/defaults/xdg/rofi/emojis/emojis.rasi new file mode 100644 index 0000000..b81d555 --- /dev/null +++ b/defaults/xdg/rofi/emojis/emojis.rasi @@ -0,0 +1,280 @@ +/** + * + * Author : Aditya Shakya (adi1090x) + * Github : @adi1090x + * + * Rofi Theme File + * Rofi Version: 1.7.3 + **/ + +@import "../config.rasi" +@import "../colors.rasi" +/*****----- Configuration -----*****/ +configuration { + + show-icons: true; + display-emoji: ""; +} + +/*****----- Global Properties -----*****/ + +* { + border-colour: var(border); + handle-colour: var(selected); + background-colour: var(background); + foreground-colour: var(foreground); + alternate-background: var(background-alt); + normal-background: var(background); + normal-foreground: var(foreground); + urgent-background: var(urgent); + urgent-foreground: var(background); + active-background: var(active); + active-foreground: var(background); + selected-normal-background: var(selected); + selected-normal-foreground: var(background); + selected-urgent-background: var(active); + selected-urgent-foreground: var(background); + selected-active-background: var(urgent); + selected-active-foreground: var(background); + alternate-normal-background: var(background); + alternate-normal-foreground: var(foreground); + alternate-urgent-background: var(urgent); + alternate-urgent-foreground: var(background); + alternate-active-background: var(active); + alternate-active-foreground: var(background); +} + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 600px; + x-offset: 0px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 30px; + border: 0px solid; + border-radius: 0px 0px 0px 0px; + border-color: @border-colour; + background-color: transparent; + children: [ "message", "listview", "inputbar" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + margin: 0; + padding: 20px 0px 0; + border: 0px solid; + border-radius: 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; + children: [ "textbox-prompt-colon", "entry" ]; +} + +prompt { + enabled: true; + background-color: inherit; + text-color: inherit; +} +textbox-prompt-colon { + enabled: true; + padding: 5px 0px 0px 15px; + expand: false; + font: "MonarchOS 14"; + str: ""; + background-color: inherit; + text-color: inherit; +} +entry { + enabled: true; + padding: 5px 0px; + background-color: inherit; + text-color: inherit; + cursor: text; + placeholder: "..."; + placeholder-color: inherit; +} +num-filtered-rows { + enabled: true; + expand: false; + background-color: inherit; + text-color: inherit; +} +textbox-num-sep { + enabled: true; + expand: false; + str: "/"; + background-color: inherit; + text-color: inherit; +} +num-rows { + enabled: true; + expand: false; + background-color: inherit; + text-color: inherit; +} +case-indicator { + enabled: true; + background-color: inherit; + text-color: inherit; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 4; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: true; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 5px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + + background-color: transparent; + text-color: @subtext1; + cursor: "default"; +} +scrollbar { + handle-width: 5px; + handle-color: @handle-colour; + border-radius: 10px; + background-color: transparent; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 0px; + margin: 0px; + padding: 5px; + border: 0px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: transparent; + text-color: @text; + cursor: pointer; + +} +element normal.normal { + background-color: transparent; + text-color: var(normal-foreground); +} +element normal.urgent { + background-color: var(urgent-background); + text-color: var(urgent-foreground); +} +element normal.active { + background-color: var(normal-foreground); + text-color: var(normal-background); +} +element selected.normal { + background-color: var(selected-normal-background); + text-color: var(normal-foreground); +} +element selected.urgent { + background-color: var(selected-urgent-background); + text-color: var(normal-background); +} +element selected.active { + background-color: var(selected-active-background); + text-color: var(normal-background); +} + +element-icon { + background-color: transparent; + text-color: inherit; + size: 0; + cursor: inherit; +} +element-text { + background-color: transparent; + text-color: inherit; + highlight: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Mode Switcher -----*****/ +mode-switcher{ + enabled: true; + spacing: 10px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; +} +button { + padding: 7px 15px 7px 10px; + border: 0px solid; + border-radius: 100%; + border-color: @border-colour; + background-color: @alternate-background; + text-color: inherit; + cursor: pointer; +} +button selected { + background-color: var(selected-normal-background); + text-color: var(selected-normal-foreground); +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px 0px 0px 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; +} +textbox { + padding: 8px 10px; + border: 0px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: @alternate-background; + text-color: @foreground-colour; + vertical-align: 0.5; + horizontal-align: 0.0; + highlight: none; + placeholder-color: @foreground-colour; + blink: true; + markup: true; +} +error-message { + padding: 10px; + border: 2px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: @background-colour; + text-color: @foreground-colour; +} diff --git a/defaults/xdg/rofi/emojis/emojis.txt b/defaults/xdg/rofi/emojis/emojis.txt new file mode 100644 index 0000000..47c3d35 --- /dev/null +++ b/defaults/xdg/rofi/emojis/emojis.txt @@ -0,0 +1,3512 @@ +😀 grinning face +😃 grinning face with big eyes +😄 grinning face with smiling eyes +😁 beaming face with smiling eyes +😆 grinning squinting face +😅 grinning face with sweat +🤣 rolling on the floor laughing +😂 face with tears of joy +🙂 slightly smiling face +🙃 upside-down face +😉 winking face +😊 smiling face with smiling eyes +😇 smiling face with halo +🥰 smiling face with hearts +😍 smiling face with heart-eyes +🤩 star-struck +😘 face blowing a kiss +😗 kissing face +☺️ smiling face +😚 kissing face with closed eyes +😙 kissing face with smiling eyes +🥲 smiling face with tear +😋 face savoring food +😛 face with tongue +😜 winking face with tongue +🤪 zany face +😝 squinting face with tongue +🤑 money-mouth face +🤗 hugging face +🤭 face with hand over mouth +🤫 shushing face +🤔 thinking face +🤐 zipper-mouth face +🤨 face with raised eyebrow +😐 neutral face +😑 expressionless face +😶 face without mouth +😶‍🌫️ face in clouds +😏 smirking face +😒 unamused face +🙄 face with rolling eyes +😬 grimacing face +😮‍💨 face exhaling +🤥 lying face +😌 relieved face +😔 pensive face +😪 sleepy face +🤤 drooling face +😴 sleeping face +😷 face with medical mask +🤒 face with thermometer +🤕 face with head-bandage +🤢 nauseated face +🤮 face vomiting +🤧 sneezing face +🥵 hot face +🥶 cold face +🥴 woozy face +😵 knocked-out face +😵‍💫 face with spiral eyes +🤯 exploding head +🤠 cowboy hat face +🥳 partying face +🥸 disguised face +😎 smiling face with sunglasses +🤓 nerd face +🧐 face with monocle +😕 confused face +😟 worried face +🙁 slightly frowning face +☹️ frowning face +😮 face with open mouth +😯 hushed face +😲 astonished face +😳 flushed face +🥺 pleading face +😦 frowning face with open mouth +😧 anguished face +😨 fearful face +😰 anxious face with sweat +😥 sad but relieved face +😢 crying face +😭 loudly crying face +😱 face screaming in fear +😖 confounded face +😣 persevering face +😞 disappointed face +😓 downcast face with sweat +😩 weary face +😫 tired face +🥱 yawning face +😤 face with steam from nose +😡 pouting face +😠 angry face +🤬 face with symbols on mouth +😈 smiling face with horns +👿 angry face with horns +💀 skull +☠️ skull and crossbones +💩 pile of poo +🤡 clown face +👹 ogre +👺 goblin +👻 ghost +👽 alien +👾 alien monster +🤖 robot +😺 grinning cat +😸 grinning cat with smiling eyes +😹 cat with tears of joy +😻 smiling cat with heart-eyes +😼 cat with wry smile +😽 kissing cat +🙀 weary cat +😿 crying cat +😾 pouting cat +🙈 see-no-evil monkey +🙉 hear-no-evil monkey +🙊 speak-no-evil monkey +💋 kiss mark +💌 love letter +💘 heart with arrow +💝 heart with ribbon +💖 sparkling heart +💗 growing heart +💓 beating heart +💞 revolving hearts +💕 two hearts +💟 heart decoration +❣️ heart exclamation +💔 broken heart +❤️‍🔥 heart on fire +❤️‍🩹 mending heart +❤️ red heart +🧡 orange heart +💛 yellow heart +💚 green heart +💙 blue heart +💜 purple heart +🤎 brown heart +🖤 black heart +🤍 white heart +💯 hundred points +💢 anger symbol +💥 collision +💫 dizzy +💦 sweat droplets +💨 dashing away +🕳️ hole +💣 bomb +💬 speech balloon +👁️‍🗨️ eye in speech bubble +🗨️ left speech bubble +🗯️ right anger bubble +💭 thought balloon +💤 zzz +👋 waving hand +👋🏻 waving hand: light skin tone +👋🏼 waving hand: medium-light skin tone +👋🏽 waving hand: medium skin tone +👋🏾 waving hand: medium-dark skin tone +👋🏿 waving hand: dark skin tone +🤚 raised back of hand +🤚🏻 raised back of hand: light skin tone +🤚🏼 raised back of hand: medium-light skin tone +🤚🏽 raised back of hand: medium skin tone +🤚🏾 raised back of hand: medium-dark skin tone +🤚🏿 raised back of hand: dark skin tone +🖐️ hand with fingers splayed +🖐🏻 hand with fingers splayed: light skin tone +🖐🏼 hand with fingers splayed: medium-light skin tone +🖐🏽 hand with fingers splayed: medium skin tone +🖐🏾 hand with fingers splayed: medium-dark skin tone +🖐🏿 hand with fingers splayed: dark skin tone +✋ raised hand +✋🏻 raised hand: light skin tone +✋🏼 raised hand: medium-light skin tone +✋🏽 raised hand: medium skin tone +✋🏾 raised hand: medium-dark skin tone +✋🏿 raised hand: dark skin tone +🖖 vulcan salute +🖖🏻 vulcan salute: light skin tone +🖖🏼 vulcan salute: medium-light skin tone +🖖🏽 vulcan salute: medium skin tone +🖖🏾 vulcan salute: medium-dark skin tone +🖖🏿 vulcan salute: dark skin tone +👌 OK hand +👌🏻 OK hand: light skin tone +👌🏼 OK hand: medium-light skin tone +👌🏽 OK hand: medium skin tone +👌🏾 OK hand: medium-dark skin tone +👌🏿 OK hand: dark skin tone +🤌 pinched fingers +🤌🏻 pinched fingers: light skin tone +🤌🏼 pinched fingers: medium-light skin tone +🤌🏽 pinched fingers: medium skin tone +🤌🏾 pinched fingers: medium-dark skin tone +🤌🏿 pinched fingers: dark skin tone +🤏 pinching hand +🤏🏻 pinching hand: light skin tone +🤏🏼 pinching hand: medium-light skin tone +🤏🏽 pinching hand: medium skin tone +🤏🏾 pinching hand: medium-dark skin tone +🤏🏿 pinching hand: dark skin tone +✌️ victory hand +✌🏻 victory hand: light skin tone +✌🏼 victory hand: medium-light skin tone +✌🏽 victory hand: medium skin tone +✌🏾 victory hand: medium-dark skin tone +✌🏿 victory hand: dark skin tone +🤞 crossed fingers +🤞🏻 crossed fingers: light skin tone +🤞🏼 crossed fingers: medium-light skin tone +🤞🏽 crossed fingers: medium skin tone +🤞🏾 crossed fingers: medium-dark skin tone +🤞🏿 crossed fingers: dark skin tone +🤟 love-you gesture +🤟🏻 love-you gesture: light skin tone +🤟🏼 love-you gesture: medium-light skin tone +🤟🏽 love-you gesture: medium skin tone +🤟🏾 love-you gesture: medium-dark skin tone +🤟🏿 love-you gesture: dark skin tone +🤘 sign of the horns +🤘🏻 sign of the horns: light skin tone +🤘🏼 sign of the horns: medium-light skin tone +🤘🏽 sign of the horns: medium skin tone +🤘🏾 sign of the horns: medium-dark skin tone +🤘🏿 sign of the horns: dark skin tone +🤙 call me hand +🤙🏻 call me hand: light skin tone +🤙🏼 call me hand: medium-light skin tone +🤙🏽 call me hand: medium skin tone +🤙🏾 call me hand: medium-dark skin tone +🤙🏿 call me hand: dark skin tone +👈 backhand index pointing left +👈🏻 backhand index pointing left: light skin tone +👈🏼 backhand index pointing left: medium-light skin tone +👈🏽 backhand index pointing left: medium skin tone +👈🏾 backhand index pointing left: medium-dark skin tone +👈🏿 backhand index pointing left: dark skin tone +👉 backhand index pointing right +👉🏻 backhand index pointing right: light skin tone +👉🏼 backhand index pointing right: medium-light skin tone +👉🏽 backhand index pointing right: medium skin tone +👉🏾 backhand index pointing right: medium-dark skin tone +👉🏿 backhand index pointing right: dark skin tone +👆 backhand index pointing up +👆🏻 backhand index pointing up: light skin tone +👆🏼 backhand index pointing up: medium-light skin tone +👆🏽 backhand index pointing up: medium skin tone +👆🏾 backhand index pointing up: medium-dark skin tone +👆🏿 backhand index pointing up: dark skin tone +🖕 middle finger +🖕🏻 middle finger: light skin tone +🖕🏼 middle finger: medium-light skin tone +🖕🏽 middle finger: medium skin tone +🖕🏾 middle finger: medium-dark skin tone +🖕🏿 middle finger: dark skin tone +👇 backhand index pointing down +👇🏻 backhand index pointing down: light skin tone +👇🏼 backhand index pointing down: medium-light skin tone +👇🏽 backhand index pointing down: medium skin tone +👇🏾 backhand index pointing down: medium-dark skin tone +👇🏿 backhand index pointing down: dark skin tone +☝️ index pointing up +☝🏻 index pointing up: light skin tone +☝🏼 index pointing up: medium-light skin tone +☝🏽 index pointing up: medium skin tone +☝🏾 index pointing up: medium-dark skin tone +☝🏿 index pointing up: dark skin tone +👍 thumbs up +👍🏻 thumbs up: light skin tone +👍🏼 thumbs up: medium-light skin tone +👍🏽 thumbs up: medium skin tone +👍🏾 thumbs up: medium-dark skin tone +👍🏿 thumbs up: dark skin tone +👎 thumbs down +👎🏻 thumbs down: light skin tone +👎🏼 thumbs down: medium-light skin tone +👎🏽 thumbs down: medium skin tone +👎🏾 thumbs down: medium-dark skin tone +👎🏿 thumbs down: dark skin tone +✊ raised fist +✊🏻 raised fist: light skin tone +✊🏼 raised fist: medium-light skin tone +✊🏽 raised fist: medium skin tone +✊🏾 raised fist: medium-dark skin tone +✊🏿 raised fist: dark skin tone +👊 oncoming fist +👊🏻 oncoming fist: light skin tone +👊🏼 oncoming fist: medium-light skin tone +👊🏽 oncoming fist: medium skin tone +👊🏾 oncoming fist: medium-dark skin tone +👊🏿 oncoming fist: dark skin tone +🤛 left-facing fist +🤛🏻 left-facing fist: light skin tone +🤛🏼 left-facing fist: medium-light skin tone +🤛🏽 left-facing fist: medium skin tone +🤛🏾 left-facing fist: medium-dark skin tone +🤛🏿 left-facing fist: dark skin tone +🤜 right-facing fist +🤜🏻 right-facing fist: light skin tone +🤜🏼 right-facing fist: medium-light skin tone +🤜🏽 right-facing fist: medium skin tone +🤜🏾 right-facing fist: medium-dark skin tone +🤜🏿 right-facing fist: dark skin tone +👏 clapping hands +👏🏻 clapping hands: light skin tone +👏🏼 clapping hands: medium-light skin tone +👏🏽 clapping hands: medium skin tone +👏🏾 clapping hands: medium-dark skin tone +👏🏿 clapping hands: dark skin tone +🙌 raising hands +🙌🏻 raising hands: light skin tone +🙌🏼 raising hands: medium-light skin tone +🙌🏽 raising hands: medium skin tone +🙌🏾 raising hands: medium-dark skin tone +🙌🏿 raising hands: dark skin tone +👐 open hands +👐🏻 open hands: light skin tone +👐🏼 open hands: medium-light skin tone +👐🏽 open hands: medium skin tone +👐🏾 open hands: medium-dark skin tone +👐🏿 open hands: dark skin tone +🤲 palms up together +🤲🏻 palms up together: light skin tone +🤲🏼 palms up together: medium-light skin tone +🤲🏽 palms up together: medium skin tone +🤲🏾 palms up together: medium-dark skin tone +🤲🏿 palms up together: dark skin tone +🤝 handshake +🙏 folded hands +🙏🏻 folded hands: light skin tone +🙏🏼 folded hands: medium-light skin tone +🙏🏽 folded hands: medium skin tone +🙏🏾 folded hands: medium-dark skin tone +🙏🏿 folded hands: dark skin tone +✍️ writing hand +✍🏻 writing hand: light skin tone +✍🏼 writing hand: medium-light skin tone +✍🏽 writing hand: medium skin tone +✍🏾 writing hand: medium-dark skin tone +✍🏿 writing hand: dark skin tone +💅 nail polish +💅🏻 nail polish: light skin tone +💅🏼 nail polish: medium-light skin tone +💅🏽 nail polish: medium skin tone +💅🏾 nail polish: medium-dark skin tone +💅🏿 nail polish: dark skin tone +🤳 selfie +🤳🏻 selfie: light skin tone +🤳🏼 selfie: medium-light skin tone +🤳🏽 selfie: medium skin tone +🤳🏾 selfie: medium-dark skin tone +🤳🏿 selfie: dark skin tone +💪 flexed biceps +💪🏻 flexed biceps: light skin tone +💪🏼 flexed biceps: medium-light skin tone +💪🏽 flexed biceps: medium skin tone +💪🏾 flexed biceps: medium-dark skin tone +💪🏿 flexed biceps: dark skin tone +🦾 mechanical arm +🦿 mechanical leg +🦵 leg +🦵🏻 leg: light skin tone +🦵🏼 leg: medium-light skin tone +🦵🏽 leg: medium skin tone +🦵🏾 leg: medium-dark skin tone +🦵🏿 leg: dark skin tone +🦶 foot +🦶🏻 foot: light skin tone +🦶🏼 foot: medium-light skin tone +🦶🏽 foot: medium skin tone +🦶🏾 foot: medium-dark skin tone +🦶🏿 foot: dark skin tone +👂 ear +👂🏻 ear: light skin tone +👂🏼 ear: medium-light skin tone +👂🏽 ear: medium skin tone +👂🏾 ear: medium-dark skin tone +👂🏿 ear: dark skin tone +🦻 ear with hearing aid +🦻🏻 ear with hearing aid: light skin tone +🦻🏼 ear with hearing aid: medium-light skin tone +🦻🏽 ear with hearing aid: medium skin tone +🦻🏾 ear with hearing aid: medium-dark skin tone +🦻🏿 ear with hearing aid: dark skin tone +👃 nose +👃🏻 nose: light skin tone +👃🏼 nose: medium-light skin tone +👃🏽 nose: medium skin tone +👃🏾 nose: medium-dark skin tone +👃🏿 nose: dark skin tone +🧠 brain +🫀 anatomical heart +🫁 lungs +🦷 tooth +🦴 bone +👀 eyes +👁️ eye +👅 tongue +👄 mouth +👶 baby +👶🏻 baby: light skin tone +👶🏼 baby: medium-light skin tone +👶🏽 baby: medium skin tone +👶🏾 baby: medium-dark skin tone +👶🏿 baby: dark skin tone +🧒 child +🧒🏻 child: light skin tone +🧒🏼 child: medium-light skin tone +🧒🏽 child: medium skin tone +🧒🏾 child: medium-dark skin tone +🧒🏿 child: dark skin tone +👦 boy +👦🏻 boy: light skin tone +👦🏼 boy: medium-light skin tone +👦🏽 boy: medium skin tone +👦🏾 boy: medium-dark skin tone +👦🏿 boy: dark skin tone +👧 girl +👧🏻 girl: light skin tone +👧🏼 girl: medium-light skin tone +👧🏽 girl: medium skin tone +👧🏾 girl: medium-dark skin tone +👧🏿 girl: dark skin tone +🧑 person +🧑🏻 person: light skin tone +🧑🏼 person: medium-light skin tone +🧑🏽 person: medium skin tone +🧑🏾 person: medium-dark skin tone +🧑🏿 person: dark skin tone +👱 person: blond hair +👱🏻 person: light skin tone, blond hair +👱🏼 person: medium-light skin tone, blond hair +👱🏽 person: medium skin tone, blond hair +👱🏾 person: medium-dark skin tone, blond hair +👱🏿 person: dark skin tone, blond hair +👨 man +👨🏻 man: light skin tone +👨🏼 man: medium-light skin tone +👨🏽 man: medium skin tone +👨🏾 man: medium-dark skin tone +👨🏿 man: dark skin tone +🧔 person: beard +🧔🏻 person: light skin tone, beard +🧔🏼 person: medium-light skin tone, beard +🧔🏽 person: medium skin tone, beard +🧔🏾 person: medium-dark skin tone, beard +🧔🏿 person: dark skin tone, beard +🧔‍♂️ man: beard +🧔🏻‍♂️ man: light skin tone, beard +🧔🏼‍♂️ man: medium-light skin tone, beard +🧔🏽‍♂️ man: medium skin tone, beard +🧔🏾‍♂️ man: medium-dark skin tone, beard +🧔🏿‍♂️ man: dark skin tone, beard +🧔‍♀️ woman: beard +🧔🏻‍♀️ woman: light skin tone, beard +🧔🏼‍♀️ woman: medium-light skin tone, beard +🧔🏽‍♀️ woman: medium skin tone, beard +🧔🏾‍♀️ woman: medium-dark skin tone, beard +🧔🏿‍♀️ woman: dark skin tone, beard +👨‍🦰 man: red hair +👨🏻‍🦰 man: light skin tone, red hair +👨🏼‍🦰 man: medium-light skin tone, red hair +👨🏽‍🦰 man: medium skin tone, red hair +👨🏾‍🦰 man: medium-dark skin tone, red hair +👨🏿‍🦰 man: dark skin tone, red hair +👨‍🦱 man: curly hair +👨🏻‍🦱 man: light skin tone, curly hair +👨🏼‍🦱 man: medium-light skin tone, curly hair +👨🏽‍🦱 man: medium skin tone, curly hair +👨🏾‍🦱 man: medium-dark skin tone, curly hair +👨🏿‍🦱 man: dark skin tone, curly hair +👨‍🦳 man: white hair +👨🏻‍🦳 man: light skin tone, white hair +👨🏼‍🦳 man: medium-light skin tone, white hair +👨🏽‍🦳 man: medium skin tone, white hair +👨🏾‍🦳 man: medium-dark skin tone, white hair +👨🏿‍🦳 man: dark skin tone, white hair +👨‍🦲 man: bald +👨🏻‍🦲 man: light skin tone, bald +👨🏼‍🦲 man: medium-light skin tone, bald +👨🏽‍🦲 man: medium skin tone, bald +👨🏾‍🦲 man: medium-dark skin tone, bald +👨🏿‍🦲 man: dark skin tone, bald +👩 woman +👩🏻 woman: light skin tone +👩🏼 woman: medium-light skin tone +👩🏽 woman: medium skin tone +👩🏾 woman: medium-dark skin tone +👩🏿 woman: dark skin tone +👩‍🦰 woman: red hair +👩🏻‍🦰 woman: light skin tone, red hair +👩🏼‍🦰 woman: medium-light skin tone, red hair +👩🏽‍🦰 woman: medium skin tone, red hair +👩🏾‍🦰 woman: medium-dark skin tone, red hair +👩🏿‍🦰 woman: dark skin tone, red hair +🧑‍🦰 person: red hair +🧑🏻‍🦰 person: light skin tone, red hair +🧑🏼‍🦰 person: medium-light skin tone, red hair +🧑🏽‍🦰 person: medium skin tone, red hair +🧑🏾‍🦰 person: medium-dark skin tone, red hair +🧑🏿‍🦰 person: dark skin tone, red hair +👩‍🦱 woman: curly hair +👩🏻‍🦱 woman: light skin tone, curly hair +👩🏼‍🦱 woman: medium-light skin tone, curly hair +👩🏽‍🦱 woman: medium skin tone, curly hair +👩🏾‍🦱 woman: medium-dark skin tone, curly hair +👩🏿‍🦱 woman: dark skin tone, curly hair +🧑‍🦱 person: curly hair +🧑🏻‍🦱 person: light skin tone, curly hair +🧑🏼‍🦱 person: medium-light skin tone, curly hair +🧑🏽‍🦱 person: medium skin tone, curly hair +🧑🏾‍🦱 person: medium-dark skin tone, curly hair +🧑🏿‍🦱 person: dark skin tone, curly hair +👩‍🦳 woman: white hair +👩🏻‍🦳 woman: light skin tone, white hair +👩🏼‍🦳 woman: medium-light skin tone, white hair +👩🏽‍🦳 woman: medium skin tone, white hair +👩🏾‍🦳 woman: medium-dark skin tone, white hair +👩🏿‍🦳 woman: dark skin tone, white hair +🧑‍🦳 person: white hair +🧑🏻‍🦳 person: light skin tone, white hair +🧑🏼‍🦳 person: medium-light skin tone, white hair +🧑🏽‍🦳 person: medium skin tone, white hair +🧑🏾‍🦳 person: medium-dark skin tone, white hair +🧑🏿‍🦳 person: dark skin tone, white hair +👩‍🦲 woman: bald +👩🏻‍🦲 woman: light skin tone, bald +👩🏼‍🦲 woman: medium-light skin tone, bald +👩🏽‍🦲 woman: medium skin tone, bald +👩🏾‍🦲 woman: medium-dark skin tone, bald +👩🏿‍🦲 woman: dark skin tone, bald +🧑‍🦲 person: bald +🧑🏻‍🦲 person: light skin tone, bald +🧑🏼‍🦲 person: medium-light skin tone, bald +🧑🏽‍🦲 person: medium skin tone, bald +🧑🏾‍🦲 person: medium-dark skin tone, bald +🧑🏿‍🦲 person: dark skin tone, bald +👱‍♀️ woman: blond hair +👱🏻‍♀️ woman: light skin tone, blond hair +👱🏼‍♀️ woman: medium-light skin tone, blond hair +👱🏽‍♀️ woman: medium skin tone, blond hair +👱🏾‍♀️ woman: medium-dark skin tone, blond hair +👱🏿‍♀️ woman: dark skin tone, blond hair +👱‍♂️ man: blond hair +👱🏻‍♂️ man: light skin tone, blond hair +👱🏼‍♂️ man: medium-light skin tone, blond hair +👱🏽‍♂️ man: medium skin tone, blond hair +👱🏾‍♂️ man: medium-dark skin tone, blond hair +👱🏿‍♂️ man: dark skin tone, blond hair +🧓 older person +🧓🏻 older person: light skin tone +🧓🏼 older person: medium-light skin tone +🧓🏽 older person: medium skin tone +🧓🏾 older person: medium-dark skin tone +🧓🏿 older person: dark skin tone +👴 old man +👴🏻 old man: light skin tone +👴🏼 old man: medium-light skin tone +👴🏽 old man: medium skin tone +👴🏾 old man: medium-dark skin tone +👴🏿 old man: dark skin tone +👵 old woman +👵🏻 old woman: light skin tone +👵🏼 old woman: medium-light skin tone +👵🏽 old woman: medium skin tone +👵🏾 old woman: medium-dark skin tone +👵🏿 old woman: dark skin tone +🙍 person frowning +🙍🏻 person frowning: light skin tone +🙍🏼 person frowning: medium-light skin tone +🙍🏽 person frowning: medium skin tone +🙍🏾 person frowning: medium-dark skin tone +🙍🏿 person frowning: dark skin tone +🙍‍♂️ man frowning +🙍🏻‍♂️ man frowning: light skin tone +🙍🏼‍♂️ man frowning: medium-light skin tone +🙍🏽‍♂️ man frowning: medium skin tone +🙍🏾‍♂️ man frowning: medium-dark skin tone +🙍🏿‍♂️ man frowning: dark skin tone +🙍‍♀️ woman frowning +🙍🏻‍♀️ woman frowning: light skin tone +🙍🏼‍♀️ woman frowning: medium-light skin tone +🙍🏽‍♀️ woman frowning: medium skin tone +🙍🏾‍♀️ woman frowning: medium-dark skin tone +🙍🏿‍♀️ woman frowning: dark skin tone +🙎 person pouting +🙎🏻 person pouting: light skin tone +🙎🏼 person pouting: medium-light skin tone +🙎🏽 person pouting: medium skin tone +🙎🏾 person pouting: medium-dark skin tone +🙎🏿 person pouting: dark skin tone +🙎‍♂️ man pouting +🙎🏻‍♂️ man pouting: light skin tone +🙎🏼‍♂️ man pouting: medium-light skin tone +🙎🏽‍♂️ man pouting: medium skin tone +🙎🏾‍♂️ man pouting: medium-dark skin tone +🙎🏿‍♂️ man pouting: dark skin tone +🙎‍♀️ woman pouting +🙎🏻‍♀️ woman pouting: light skin tone +🙎🏼‍♀️ woman pouting: medium-light skin tone +🙎🏽‍♀️ woman pouting: medium skin tone +🙎🏾‍♀️ woman pouting: medium-dark skin tone +🙎🏿‍♀️ woman pouting: dark skin tone +🙅 person gesturing NO +🙅🏻 person gesturing NO: light skin tone +🙅🏼 person gesturing NO: medium-light skin tone +🙅🏽 person gesturing NO: medium skin tone +🙅🏾 person gesturing NO: medium-dark skin tone +🙅🏿 person gesturing NO: dark skin tone +🙅‍♂️ man gesturing NO +🙅🏻‍♂️ man gesturing NO: light skin tone +🙅🏼‍♂️ man gesturing NO: medium-light skin tone +🙅🏽‍♂️ man gesturing NO: medium skin tone +🙅🏾‍♂️ man gesturing NO: medium-dark skin tone +🙅🏿‍♂️ man gesturing NO: dark skin tone +🙅‍♀️ woman gesturing NO +🙅🏻‍♀️ woman gesturing NO: light skin tone +🙅🏼‍♀️ woman gesturing NO: medium-light skin tone +🙅🏽‍♀️ woman gesturing NO: medium skin tone +🙅🏾‍♀️ woman gesturing NO: medium-dark skin tone +🙅🏿‍♀️ woman gesturing NO: dark skin tone +🙆 person gesturing OK +🙆🏻 person gesturing OK: light skin tone +🙆🏼 person gesturing OK: medium-light skin tone +🙆🏽 person gesturing OK: medium skin tone +🙆🏾 person gesturing OK: medium-dark skin tone +🙆🏿 person gesturing OK: dark skin tone +🙆‍♂️ man gesturing OK +🙆🏻‍♂️ man gesturing OK: light skin tone +🙆🏼‍♂️ man gesturing OK: medium-light skin tone +🙆🏽‍♂️ man gesturing OK: medium skin tone +🙆🏾‍♂️ man gesturing OK: medium-dark skin tone +🙆🏿‍♂️ man gesturing OK: dark skin tone +🙆‍♀️ woman gesturing OK +🙆🏻‍♀️ woman gesturing OK: light skin tone +🙆🏼‍♀️ woman gesturing OK: medium-light skin tone +🙆🏽‍♀️ woman gesturing OK: medium skin tone +🙆🏾‍♀️ woman gesturing OK: medium-dark skin tone +🙆🏿‍♀️ woman gesturing OK: dark skin tone +💁 person tipping hand +💁🏻 person tipping hand: light skin tone +💁🏼 person tipping hand: medium-light skin tone +💁🏽 person tipping hand: medium skin tone +💁🏾 person tipping hand: medium-dark skin tone +💁🏿 person tipping hand: dark skin tone +💁‍♂️ man tipping hand +💁🏻‍♂️ man tipping hand: light skin tone +💁🏼‍♂️ man tipping hand: medium-light skin tone +💁🏽‍♂️ man tipping hand: medium skin tone +💁🏾‍♂️ man tipping hand: medium-dark skin tone +💁🏿‍♂️ man tipping hand: dark skin tone +💁‍♀️ woman tipping hand +💁🏻‍♀️ woman tipping hand: light skin tone +💁🏼‍♀️ woman tipping hand: medium-light skin tone +💁🏽‍♀️ woman tipping hand: medium skin tone +💁🏾‍♀️ woman tipping hand: medium-dark skin tone +💁🏿‍♀️ woman tipping hand: dark skin tone +🙋 person raising hand +🙋🏻 person raising hand: light skin tone +🙋🏼 person raising hand: medium-light skin tone +🙋🏽 person raising hand: medium skin tone +🙋🏾 person raising hand: medium-dark skin tone +🙋🏿 person raising hand: dark skin tone +🙋‍♂️ man raising hand +🙋🏻‍♂️ man raising hand: light skin tone +🙋🏼‍♂️ man raising hand: medium-light skin tone +🙋🏽‍♂️ man raising hand: medium skin tone +🙋🏾‍♂️ man raising hand: medium-dark skin tone +🙋🏿‍♂️ man raising hand: dark skin tone +🙋‍♀️ woman raising hand +🙋🏻‍♀️ woman raising hand: light skin tone +🙋🏼‍♀️ woman raising hand: medium-light skin tone +🙋🏽‍♀️ woman raising hand: medium skin tone +🙋🏾‍♀️ woman raising hand: medium-dark skin tone +🙋🏿‍♀️ woman raising hand: dark skin tone +🧏 deaf person +🧏🏻 deaf person: light skin tone +🧏🏼 deaf person: medium-light skin tone +🧏🏽 deaf person: medium skin tone +🧏🏾 deaf person: medium-dark skin tone +🧏🏿 deaf person: dark skin tone +🧏‍♂️ deaf man +🧏🏻‍♂️ deaf man: light skin tone +🧏🏼‍♂️ deaf man: medium-light skin tone +🧏🏽‍♂️ deaf man: medium skin tone +🧏🏾‍♂️ deaf man: medium-dark skin tone +🧏🏿‍♂️ deaf man: dark skin tone +🧏‍♀️ deaf woman +🧏🏻‍♀️ deaf woman: light skin tone +🧏🏼‍♀️ deaf woman: medium-light skin tone +🧏🏽‍♀️ deaf woman: medium skin tone +🧏🏾‍♀️ deaf woman: medium-dark skin tone +🧏🏿‍♀️ deaf woman: dark skin tone +🙇 person bowing +🙇🏻 person bowing: light skin tone +🙇🏼 person bowing: medium-light skin tone +🙇🏽 person bowing: medium skin tone +🙇🏾 person bowing: medium-dark skin tone +🙇🏿 person bowing: dark skin tone +🙇‍♂️ man bowing +🙇🏻‍♂️ man bowing: light skin tone +🙇🏼‍♂️ man bowing: medium-light skin tone +🙇🏽‍♂️ man bowing: medium skin tone +🙇🏾‍♂️ man bowing: medium-dark skin tone +🙇🏿‍♂️ man bowing: dark skin tone +🙇‍♀️ woman bowing +🙇🏻‍♀️ woman bowing: light skin tone +🙇🏼‍♀️ woman bowing: medium-light skin tone +🙇🏽‍♀️ woman bowing: medium skin tone +🙇🏾‍♀️ woman bowing: medium-dark skin tone +🙇🏿‍♀️ woman bowing: dark skin tone +🤦 person facepalming +🤦🏻 person facepalming: light skin tone +🤦🏼 person facepalming: medium-light skin tone +🤦🏽 person facepalming: medium skin tone +🤦🏾 person facepalming: medium-dark skin tone +🤦🏿 person facepalming: dark skin tone +🤦‍♂️ man facepalming +🤦🏻‍♂️ man facepalming: light skin tone +🤦🏼‍♂️ man facepalming: medium-light skin tone +🤦🏽‍♂️ man facepalming: medium skin tone +🤦🏾‍♂️ man facepalming: medium-dark skin tone +🤦🏿‍♂️ man facepalming: dark skin tone +🤦‍♀️ woman facepalming +🤦🏻‍♀️ woman facepalming: light skin tone +🤦🏼‍♀️ woman facepalming: medium-light skin tone +🤦🏽‍♀️ woman facepalming: medium skin tone +🤦🏾‍♀️ woman facepalming: medium-dark skin tone +🤦🏿‍♀️ woman facepalming: dark skin tone +🤷 person shrugging +🤷🏻 person shrugging: light skin tone +🤷🏼 person shrugging: medium-light skin tone +🤷🏽 person shrugging: medium skin tone +🤷🏾 person shrugging: medium-dark skin tone +🤷🏿 person shrugging: dark skin tone +🤷‍♂️ man shrugging +🤷🏻‍♂️ man shrugging: light skin tone +🤷🏼‍♂️ man shrugging: medium-light skin tone +🤷🏽‍♂️ man shrugging: medium skin tone +🤷🏾‍♂️ man shrugging: medium-dark skin tone +🤷🏿‍♂️ man shrugging: dark skin tone +🤷‍♀️ woman shrugging +🤷🏻‍♀️ woman shrugging: light skin tone +🤷🏼‍♀️ woman shrugging: medium-light skin tone +🤷🏽‍♀️ woman shrugging: medium skin tone +🤷🏾‍♀️ woman shrugging: medium-dark skin tone +🤷🏿‍♀️ woman shrugging: dark skin tone +🧑‍⚕️ health worker +🧑🏻‍⚕️ health worker: light skin tone +🧑🏼‍⚕️ health worker: medium-light skin tone +🧑🏽‍⚕️ health worker: medium skin tone +🧑🏾‍⚕️ health worker: medium-dark skin tone +🧑🏿‍⚕️ health worker: dark skin tone +👨‍⚕️ man health worker +👨🏻‍⚕️ man health worker: light skin tone +👨🏼‍⚕️ man health worker: medium-light skin tone +👨🏽‍⚕️ man health worker: medium skin tone +👨🏾‍⚕️ man health worker: medium-dark skin tone +👨🏿‍⚕️ man health worker: dark skin tone +👩‍⚕️ woman health worker +👩🏻‍⚕️ woman health worker: light skin tone +👩🏼‍⚕️ woman health worker: medium-light skin tone +👩🏽‍⚕️ woman health worker: medium skin tone +👩🏾‍⚕️ woman health worker: medium-dark skin tone +👩🏿‍⚕️ woman health worker: dark skin tone +🧑‍🎓 student +🧑🏻‍🎓 student: light skin tone +🧑🏼‍🎓 student: medium-light skin tone +🧑🏽‍🎓 student: medium skin tone +🧑🏾‍🎓 student: medium-dark skin tone +🧑🏿‍🎓 student: dark skin tone +👨‍🎓 man student +👨🏻‍🎓 man student: light skin tone +👨🏼‍🎓 man student: medium-light skin tone +👨🏽‍🎓 man student: medium skin tone +👨🏾‍🎓 man student: medium-dark skin tone +👨🏿‍🎓 man student: dark skin tone +👩‍🎓 woman student +👩🏻‍🎓 woman student: light skin tone +👩🏼‍🎓 woman student: medium-light skin tone +👩🏽‍🎓 woman student: medium skin tone +👩🏾‍🎓 woman student: medium-dark skin tone +👩🏿‍🎓 woman student: dark skin tone +🧑‍🏫 teacher +🧑🏻‍🏫 teacher: light skin tone +🧑🏼‍🏫 teacher: medium-light skin tone +🧑🏽‍🏫 teacher: medium skin tone +🧑🏾‍🏫 teacher: medium-dark skin tone +🧑🏿‍🏫 teacher: dark skin tone +👨‍🏫 man teacher +👨🏻‍🏫 man teacher: light skin tone +👨🏼‍🏫 man teacher: medium-light skin tone +👨🏽‍🏫 man teacher: medium skin tone +👨🏾‍🏫 man teacher: medium-dark skin tone +👨🏿‍🏫 man teacher: dark skin tone +👩‍🏫 woman teacher +👩🏻‍🏫 woman teacher: light skin tone +👩🏼‍🏫 woman teacher: medium-light skin tone +👩🏽‍🏫 woman teacher: medium skin tone +👩🏾‍🏫 woman teacher: medium-dark skin tone +👩🏿‍🏫 woman teacher: dark skin tone +🧑‍⚖️ judge +🧑🏻‍⚖️ judge: light skin tone +🧑🏼‍⚖️ judge: medium-light skin tone +🧑🏽‍⚖️ judge: medium skin tone +🧑🏾‍⚖️ judge: medium-dark skin tone +🧑🏿‍⚖️ judge: dark skin tone +👨‍⚖️ man judge +👨🏻‍⚖️ man judge: light skin tone +👨🏼‍⚖️ man judge: medium-light skin tone +👨🏽‍⚖️ man judge: medium skin tone +👨🏾‍⚖️ man judge: medium-dark skin tone +👨🏿‍⚖️ man judge: dark skin tone +👩‍⚖️ woman judge +👩🏻‍⚖️ woman judge: light skin tone +👩🏼‍⚖️ woman judge: medium-light skin tone +👩🏽‍⚖️ woman judge: medium skin tone +👩🏾‍⚖️ woman judge: medium-dark skin tone +👩🏿‍⚖️ woman judge: dark skin tone +🧑‍🌾 farmer +🧑🏻‍🌾 farmer: light skin tone +🧑🏼‍🌾 farmer: medium-light skin tone +🧑🏽‍🌾 farmer: medium skin tone +🧑🏾‍🌾 farmer: medium-dark skin tone +🧑🏿‍🌾 farmer: dark skin tone +👨‍🌾 man farmer +👨🏻‍🌾 man farmer: light skin tone +👨🏼‍🌾 man farmer: medium-light skin tone +👨🏽‍🌾 man farmer: medium skin tone +👨🏾‍🌾 man farmer: medium-dark skin tone +👨🏿‍🌾 man farmer: dark skin tone +👩‍🌾 woman farmer +👩🏻‍🌾 woman farmer: light skin tone +👩🏼‍🌾 woman farmer: medium-light skin tone +👩🏽‍🌾 woman farmer: medium skin tone +👩🏾‍🌾 woman farmer: medium-dark skin tone +👩🏿‍🌾 woman farmer: dark skin tone +🧑‍🍳 cook +🧑🏻‍🍳 cook: light skin tone +🧑🏼‍🍳 cook: medium-light skin tone +🧑🏽‍🍳 cook: medium skin tone +🧑🏾‍🍳 cook: medium-dark skin tone +🧑🏿‍🍳 cook: dark skin tone +👨‍🍳 man cook +👨🏻‍🍳 man cook: light skin tone +👨🏼‍🍳 man cook: medium-light skin tone +👨🏽‍🍳 man cook: medium skin tone +👨🏾‍🍳 man cook: medium-dark skin tone +👨🏿‍🍳 man cook: dark skin tone +👩‍🍳 woman cook +👩🏻‍🍳 woman cook: light skin tone +👩🏼‍🍳 woman cook: medium-light skin tone +👩🏽‍🍳 woman cook: medium skin tone +👩🏾‍🍳 woman cook: medium-dark skin tone +👩🏿‍🍳 woman cook: dark skin tone +🧑‍🔧 mechanic +🧑🏻‍🔧 mechanic: light skin tone +🧑🏼‍🔧 mechanic: medium-light skin tone +🧑🏽‍🔧 mechanic: medium skin tone +🧑🏾‍🔧 mechanic: medium-dark skin tone +🧑🏿‍🔧 mechanic: dark skin tone +👨‍🔧 man mechanic +👨🏻‍🔧 man mechanic: light skin tone +👨🏼‍🔧 man mechanic: medium-light skin tone +👨🏽‍🔧 man mechanic: medium skin tone +👨🏾‍🔧 man mechanic: medium-dark skin tone +👨🏿‍🔧 man mechanic: dark skin tone +👩‍🔧 woman mechanic +👩🏻‍🔧 woman mechanic: light skin tone +👩🏼‍🔧 woman mechanic: medium-light skin tone +👩🏽‍🔧 woman mechanic: medium skin tone +👩🏾‍🔧 woman mechanic: medium-dark skin tone +👩🏿‍🔧 woman mechanic: dark skin tone +🧑‍🏭 factory worker +🧑🏻‍🏭 factory worker: light skin tone +🧑🏼‍🏭 factory worker: medium-light skin tone +🧑🏽‍🏭 factory worker: medium skin tone +🧑🏾‍🏭 factory worker: medium-dark skin tone +🧑🏿‍🏭 factory worker: dark skin tone +👨‍🏭 man factory worker +👨🏻‍🏭 man factory worker: light skin tone +👨🏼‍🏭 man factory worker: medium-light skin tone +👨🏽‍🏭 man factory worker: medium skin tone +👨🏾‍🏭 man factory worker: medium-dark skin tone +👨🏿‍🏭 man factory worker: dark skin tone +👩‍🏭 woman factory worker +👩🏻‍🏭 woman factory worker: light skin tone +👩🏼‍🏭 woman factory worker: medium-light skin tone +👩🏽‍🏭 woman factory worker: medium skin tone +👩🏾‍🏭 woman factory worker: medium-dark skin tone +👩🏿‍🏭 woman factory worker: dark skin tone +🧑‍💼 office worker +🧑🏻‍💼 office worker: light skin tone +🧑🏼‍💼 office worker: medium-light skin tone +🧑🏽‍💼 office worker: medium skin tone +🧑🏾‍💼 office worker: medium-dark skin tone +🧑🏿‍💼 office worker: dark skin tone +👨‍💼 man office worker +👨🏻‍💼 man office worker: light skin tone +👨🏼‍💼 man office worker: medium-light skin tone +👨🏽‍💼 man office worker: medium skin tone +👨🏾‍💼 man office worker: medium-dark skin tone +👨🏿‍💼 man office worker: dark skin tone +👩‍💼 woman office worker +👩🏻‍💼 woman office worker: light skin tone +👩🏼‍💼 woman office worker: medium-light skin tone +👩🏽‍💼 woman office worker: medium skin tone +👩🏾‍💼 woman office worker: medium-dark skin tone +👩🏿‍💼 woman office worker: dark skin tone +🧑‍🔬 scientist +🧑🏻‍🔬 scientist: light skin tone +🧑🏼‍🔬 scientist: medium-light skin tone +🧑🏽‍🔬 scientist: medium skin tone +🧑🏾‍🔬 scientist: medium-dark skin tone +🧑🏿‍🔬 scientist: dark skin tone +👨‍🔬 man scientist +👨🏻‍🔬 man scientist: light skin tone +👨🏼‍🔬 man scientist: medium-light skin tone +👨🏽‍🔬 man scientist: medium skin tone +👨🏾‍🔬 man scientist: medium-dark skin tone +👨🏿‍🔬 man scientist: dark skin tone +👩‍🔬 woman scientist +👩🏻‍🔬 woman scientist: light skin tone +👩🏼‍🔬 woman scientist: medium-light skin tone +👩🏽‍🔬 woman scientist: medium skin tone +👩🏾‍🔬 woman scientist: medium-dark skin tone +👩🏿‍🔬 woman scientist: dark skin tone +🧑‍💻 technologist +🧑🏻‍💻 technologist: light skin tone +🧑🏼‍💻 technologist: medium-light skin tone +🧑🏽‍💻 technologist: medium skin tone +🧑🏾‍💻 technologist: medium-dark skin tone +🧑🏿‍💻 technologist: dark skin tone +👨‍💻 man technologist +👨🏻‍💻 man technologist: light skin tone +👨🏼‍💻 man technologist: medium-light skin tone +👨🏽‍💻 man technologist: medium skin tone +👨🏾‍💻 man technologist: medium-dark skin tone +👨🏿‍💻 man technologist: dark skin tone +👩‍💻 woman technologist +👩🏻‍💻 woman technologist: light skin tone +👩🏼‍💻 woman technologist: medium-light skin tone +👩🏽‍💻 woman technologist: medium skin tone +👩🏾‍💻 woman technologist: medium-dark skin tone +👩🏿‍💻 woman technologist: dark skin tone +🧑‍🎤 singer +🧑🏻‍🎤 singer: light skin tone +🧑🏼‍🎤 singer: medium-light skin tone +🧑🏽‍🎤 singer: medium skin tone +🧑🏾‍🎤 singer: medium-dark skin tone +🧑🏿‍🎤 singer: dark skin tone +👨‍🎤 man singer +👨🏻‍🎤 man singer: light skin tone +👨🏼‍🎤 man singer: medium-light skin tone +👨🏽‍🎤 man singer: medium skin tone +👨🏾‍🎤 man singer: medium-dark skin tone +👨🏿‍🎤 man singer: dark skin tone +👩‍🎤 woman singer +👩🏻‍🎤 woman singer: light skin tone +👩🏼‍🎤 woman singer: medium-light skin tone +👩🏽‍🎤 woman singer: medium skin tone +👩🏾‍🎤 woman singer: medium-dark skin tone +👩🏿‍🎤 woman singer: dark skin tone +🧑‍🎨 artist +🧑🏻‍🎨 artist: light skin tone +🧑🏼‍🎨 artist: medium-light skin tone +🧑🏽‍🎨 artist: medium skin tone +🧑🏾‍🎨 artist: medium-dark skin tone +🧑🏿‍🎨 artist: dark skin tone +👨‍🎨 man artist +👨🏻‍🎨 man artist: light skin tone +👨🏼‍🎨 man artist: medium-light skin tone +👨🏽‍🎨 man artist: medium skin tone +👨🏾‍🎨 man artist: medium-dark skin tone +👨🏿‍🎨 man artist: dark skin tone +👩‍🎨 woman artist +👩🏻‍🎨 woman artist: light skin tone +👩🏼‍🎨 woman artist: medium-light skin tone +👩🏽‍🎨 woman artist: medium skin tone +👩🏾‍🎨 woman artist: medium-dark skin tone +👩🏿‍🎨 woman artist: dark skin tone +🧑‍✈️ pilot +🧑🏻‍✈️ pilot: light skin tone +🧑🏼‍✈️ pilot: medium-light skin tone +🧑🏽‍✈️ pilot: medium skin tone +🧑🏾‍✈️ pilot: medium-dark skin tone +🧑🏿‍✈️ pilot: dark skin tone +👨‍✈️ man pilot +👨🏻‍✈️ man pilot: light skin tone +👨🏼‍✈️ man pilot: medium-light skin tone +👨🏽‍✈️ man pilot: medium skin tone +👨🏾‍✈️ man pilot: medium-dark skin tone +👨🏿‍✈️ man pilot: dark skin tone +👩‍✈️ woman pilot +👩🏻‍✈️ woman pilot: light skin tone +👩🏼‍✈️ woman pilot: medium-light skin tone +👩🏽‍✈️ woman pilot: medium skin tone +👩🏾‍✈️ woman pilot: medium-dark skin tone +👩🏿‍✈️ woman pilot: dark skin tone +🧑‍🚀 astronaut +🧑🏻‍🚀 astronaut: light skin tone +🧑🏼‍🚀 astronaut: medium-light skin tone +🧑🏽‍🚀 astronaut: medium skin tone +🧑🏾‍🚀 astronaut: medium-dark skin tone +🧑🏿‍🚀 astronaut: dark skin tone +👨‍🚀 man astronaut +👨🏻‍🚀 man astronaut: light skin tone +👨🏼‍🚀 man astronaut: medium-light skin tone +👨🏽‍🚀 man astronaut: medium skin tone +👨🏾‍🚀 man astronaut: medium-dark skin tone +👨🏿‍🚀 man astronaut: dark skin tone +👩‍🚀 woman astronaut +👩🏻‍🚀 woman astronaut: light skin tone +👩🏼‍🚀 woman astronaut: medium-light skin tone +👩🏽‍🚀 woman astronaut: medium skin tone +👩🏾‍🚀 woman astronaut: medium-dark skin tone +👩🏿‍🚀 woman astronaut: dark skin tone +🧑‍🚒 firefighter +🧑🏻‍🚒 firefighter: light skin tone +🧑🏼‍🚒 firefighter: medium-light skin tone +🧑🏽‍🚒 firefighter: medium skin tone +🧑🏾‍🚒 firefighter: medium-dark skin tone +🧑🏿‍🚒 firefighter: dark skin tone +👨‍🚒 man firefighter +👨🏻‍🚒 man firefighter: light skin tone +👨🏼‍🚒 man firefighter: medium-light skin tone +👨🏽‍🚒 man firefighter: medium skin tone +👨🏾‍🚒 man firefighter: medium-dark skin tone +👨🏿‍🚒 man firefighter: dark skin tone +👩‍🚒 woman firefighter +👩🏻‍🚒 woman firefighter: light skin tone +👩🏼‍🚒 woman firefighter: medium-light skin tone +👩🏽‍🚒 woman firefighter: medium skin tone +👩🏾‍🚒 woman firefighter: medium-dark skin tone +👩🏿‍🚒 woman firefighter: dark skin tone +👮 police officer +👮🏻 police officer: light skin tone +👮🏼 police officer: medium-light skin tone +👮🏽 police officer: medium skin tone +👮🏾 police officer: medium-dark skin tone +👮🏿 police officer: dark skin tone +👮‍♂️ man police officer +👮🏻‍♂️ man police officer: light skin tone +👮🏼‍♂️ man police officer: medium-light skin tone +👮🏽‍♂️ man police officer: medium skin tone +👮🏾‍♂️ man police officer: medium-dark skin tone +👮🏿‍♂️ man police officer: dark skin tone +👮‍♀️ woman police officer +👮🏻‍♀️ woman police officer: light skin tone +👮🏼‍♀️ woman police officer: medium-light skin tone +👮🏽‍♀️ woman police officer: medium skin tone +👮🏾‍♀️ woman police officer: medium-dark skin tone +👮🏿‍♀️ woman police officer: dark skin tone +🕵️ detective +🕵🏻 detective: light skin tone +🕵🏼 detective: medium-light skin tone +🕵🏽 detective: medium skin tone +🕵🏾 detective: medium-dark skin tone +🕵🏿 detective: dark skin tone +🕵️‍♂️ man detective +🕵🏻‍♂️ man detective: light skin tone +🕵🏼‍♂️ man detective: medium-light skin tone +🕵🏽‍♂️ man detective: medium skin tone +🕵🏾‍♂️ man detective: medium-dark skin tone +🕵🏿‍♂️ man detective: dark skin tone +🕵️‍♀️ woman detective +🕵🏻‍♀️ woman detective: light skin tone +🕵🏼‍♀️ woman detective: medium-light skin tone +🕵🏽‍♀️ woman detective: medium skin tone +🕵🏾‍♀️ woman detective: medium-dark skin tone +🕵🏿‍♀️ woman detective: dark skin tone +💂 guard +💂🏻 guard: light skin tone +💂🏼 guard: medium-light skin tone +💂🏽 guard: medium skin tone +💂🏾 guard: medium-dark skin tone +💂🏿 guard: dark skin tone +💂‍♂️ man guard +💂🏻‍♂️ man guard: light skin tone +💂🏼‍♂️ man guard: medium-light skin tone +💂🏽‍♂️ man guard: medium skin tone +💂🏾‍♂️ man guard: medium-dark skin tone +💂🏿‍♂️ man guard: dark skin tone +💂‍♀️ woman guard +💂🏻‍♀️ woman guard: light skin tone +💂🏼‍♀️ woman guard: medium-light skin tone +💂🏽‍♀️ woman guard: medium skin tone +💂🏾‍♀️ woman guard: medium-dark skin tone +💂🏿‍♀️ woman guard: dark skin tone +🥷 ninja +🥷🏻 ninja: light skin tone +🥷🏼 ninja: medium-light skin tone +🥷🏽 ninja: medium skin tone +🥷🏾 ninja: medium-dark skin tone +🥷🏿 ninja: dark skin tone +👷 construction worker +👷🏻 construction worker: light skin tone +👷🏼 construction worker: medium-light skin tone +👷🏽 construction worker: medium skin tone +👷🏾 construction worker: medium-dark skin tone +👷🏿 construction worker: dark skin tone +👷‍♂️ man construction worker +👷🏻‍♂️ man construction worker: light skin tone +👷🏼‍♂️ man construction worker: medium-light skin tone +👷🏽‍♂️ man construction worker: medium skin tone +👷🏾‍♂️ man construction worker: medium-dark skin tone +👷🏿‍♂️ man construction worker: dark skin tone +👷‍♀️ woman construction worker +👷🏻‍♀️ woman construction worker: light skin tone +👷🏼‍♀️ woman construction worker: medium-light skin tone +👷🏽‍♀️ woman construction worker: medium skin tone +👷🏾‍♀️ woman construction worker: medium-dark skin tone +👷🏿‍♀️ woman construction worker: dark skin tone +🤴 prince +🤴🏻 prince: light skin tone +🤴🏼 prince: medium-light skin tone +🤴🏽 prince: medium skin tone +🤴🏾 prince: medium-dark skin tone +🤴🏿 prince: dark skin tone +👸 princess +👸🏻 princess: light skin tone +👸🏼 princess: medium-light skin tone +👸🏽 princess: medium skin tone +👸🏾 princess: medium-dark skin tone +👸🏿 princess: dark skin tone +👳 person wearing turban +👳🏻 person wearing turban: light skin tone +👳🏼 person wearing turban: medium-light skin tone +👳🏽 person wearing turban: medium skin tone +👳🏾 person wearing turban: medium-dark skin tone +👳🏿 person wearing turban: dark skin tone +👳‍♂️ man wearing turban +👳🏻‍♂️ man wearing turban: light skin tone +👳🏼‍♂️ man wearing turban: medium-light skin tone +👳🏽‍♂️ man wearing turban: medium skin tone +👳🏾‍♂️ man wearing turban: medium-dark skin tone +👳🏿‍♂️ man wearing turban: dark skin tone +👳‍♀️ woman wearing turban +👳🏻‍♀️ woman wearing turban: light skin tone +👳🏼‍♀️ woman wearing turban: medium-light skin tone +👳🏽‍♀️ woman wearing turban: medium skin tone +👳🏾‍♀️ woman wearing turban: medium-dark skin tone +👳🏿‍♀️ woman wearing turban: dark skin tone +👲 person with skullcap +👲🏻 person with skullcap: light skin tone +👲🏼 person with skullcap: medium-light skin tone +👲🏽 person with skullcap: medium skin tone +👲🏾 person with skullcap: medium-dark skin tone +👲🏿 person with skullcap: dark skin tone +🧕 woman with headscarf +🧕🏻 woman with headscarf: light skin tone +🧕🏼 woman with headscarf: medium-light skin tone +🧕🏽 woman with headscarf: medium skin tone +🧕🏾 woman with headscarf: medium-dark skin tone +🧕🏿 woman with headscarf: dark skin tone +🤵 person in tuxedo +🤵🏻 person in tuxedo: light skin tone +🤵🏼 person in tuxedo: medium-light skin tone +🤵🏽 person in tuxedo: medium skin tone +🤵🏾 person in tuxedo: medium-dark skin tone +🤵🏿 person in tuxedo: dark skin tone +🤵‍♂️ man in tuxedo +🤵🏻‍♂️ man in tuxedo: light skin tone +🤵🏼‍♂️ man in tuxedo: medium-light skin tone +🤵🏽‍♂️ man in tuxedo: medium skin tone +🤵🏾‍♂️ man in tuxedo: medium-dark skin tone +🤵🏿‍♂️ man in tuxedo: dark skin tone +🤵‍♀️ woman in tuxedo +🤵🏻‍♀️ woman in tuxedo: light skin tone +🤵🏼‍♀️ woman in tuxedo: medium-light skin tone +🤵🏽‍♀️ woman in tuxedo: medium skin tone +🤵🏾‍♀️ woman in tuxedo: medium-dark skin tone +🤵🏿‍♀️ woman in tuxedo: dark skin tone +👰 person with veil +👰🏻 person with veil: light skin tone +👰🏼 person with veil: medium-light skin tone +👰🏽 person with veil: medium skin tone +👰🏾 person with veil: medium-dark skin tone +👰🏿 person with veil: dark skin tone +👰‍♂️ man with veil +👰🏻‍♂️ man with veil: light skin tone +👰🏼‍♂️ man with veil: medium-light skin tone +👰🏽‍♂️ man with veil: medium skin tone +👰🏾‍♂️ man with veil: medium-dark skin tone +👰🏿‍♂️ man with veil: dark skin tone +👰‍♀️ woman with veil +👰🏻‍♀️ woman with veil: light skin tone +👰🏼‍♀️ woman with veil: medium-light skin tone +👰🏽‍♀️ woman with veil: medium skin tone +👰🏾‍♀️ woman with veil: medium-dark skin tone +👰🏿‍♀️ woman with veil: dark skin tone +🤰 pregnant woman +🤰🏻 pregnant woman: light skin tone +🤰🏼 pregnant woman: medium-light skin tone +🤰🏽 pregnant woman: medium skin tone +🤰🏾 pregnant woman: medium-dark skin tone +🤰🏿 pregnant woman: dark skin tone +🤱 breast-feeding +🤱🏻 breast-feeding: light skin tone +🤱🏼 breast-feeding: medium-light skin tone +🤱🏽 breast-feeding: medium skin tone +🤱🏾 breast-feeding: medium-dark skin tone +🤱🏿 breast-feeding: dark skin tone +👩‍🍼 woman feeding baby +👩🏻‍🍼 woman feeding baby: light skin tone +👩🏼‍🍼 woman feeding baby: medium-light skin tone +👩🏽‍🍼 woman feeding baby: medium skin tone +👩🏾‍🍼 woman feeding baby: medium-dark skin tone +👩🏿‍🍼 woman feeding baby: dark skin tone +👨‍🍼 man feeding baby +👨🏻‍🍼 man feeding baby: light skin tone +👨🏼‍🍼 man feeding baby: medium-light skin tone +👨🏽‍🍼 man feeding baby: medium skin tone +👨🏾‍🍼 man feeding baby: medium-dark skin tone +👨🏿‍🍼 man feeding baby: dark skin tone +🧑‍🍼 person feeding baby +🧑🏻‍🍼 person feeding baby: light skin tone +🧑🏼‍🍼 person feeding baby: medium-light skin tone +🧑🏽‍🍼 person feeding baby: medium skin tone +🧑🏾‍🍼 person feeding baby: medium-dark skin tone +🧑🏿‍🍼 person feeding baby: dark skin tone +👼 baby angel +👼🏻 baby angel: light skin tone +👼🏼 baby angel: medium-light skin tone +👼🏽 baby angel: medium skin tone +👼🏾 baby angel: medium-dark skin tone +👼🏿 baby angel: dark skin tone +🎅 Santa Claus +🎅🏻 Santa Claus: light skin tone +🎅🏼 Santa Claus: medium-light skin tone +🎅🏽 Santa Claus: medium skin tone +🎅🏾 Santa Claus: medium-dark skin tone +🎅🏿 Santa Claus: dark skin tone +🤶 Mrs. Claus +🤶🏻 Mrs. Claus: light skin tone +🤶🏼 Mrs. Claus: medium-light skin tone +🤶🏽 Mrs. Claus: medium skin tone +🤶🏾 Mrs. Claus: medium-dark skin tone +🤶🏿 Mrs. Claus: dark skin tone +🧑‍🎄 mx claus +🧑🏻‍🎄 mx claus: light skin tone +🧑🏼‍🎄 mx claus: medium-light skin tone +🧑🏽‍🎄 mx claus: medium skin tone +🧑🏾‍🎄 mx claus: medium-dark skin tone +🧑🏿‍🎄 mx claus: dark skin tone +🦸 superhero +🦸🏻 superhero: light skin tone +🦸🏼 superhero: medium-light skin tone +🦸🏽 superhero: medium skin tone +🦸🏾 superhero: medium-dark skin tone +🦸🏿 superhero: dark skin tone +🦸‍♂️ man superhero +🦸🏻‍♂️ man superhero: light skin tone +🦸🏼‍♂️ man superhero: medium-light skin tone +🦸🏽‍♂️ man superhero: medium skin tone +🦸🏾‍♂️ man superhero: medium-dark skin tone +🦸🏿‍♂️ man superhero: dark skin tone +🦸‍♀️ woman superhero +🦸🏻‍♀️ woman superhero: light skin tone +🦸🏼‍♀️ woman superhero: medium-light skin tone +🦸🏽‍♀️ woman superhero: medium skin tone +🦸🏾‍♀️ woman superhero: medium-dark skin tone +🦸🏿‍♀️ woman superhero: dark skin tone +🦹 supervillain +🦹🏻 supervillain: light skin tone +🦹🏼 supervillain: medium-light skin tone +🦹🏽 supervillain: medium skin tone +🦹🏾 supervillain: medium-dark skin tone +🦹🏿 supervillain: dark skin tone +🦹‍♂️ man supervillain +🦹🏻‍♂️ man supervillain: light skin tone +🦹🏼‍♂️ man supervillain: medium-light skin tone +🦹🏽‍♂️ man supervillain: medium skin tone +🦹🏾‍♂️ man supervillain: medium-dark skin tone +🦹🏿‍♂️ man supervillain: dark skin tone +🦹‍♀️ woman supervillain +🦹🏻‍♀️ woman supervillain: light skin tone +🦹🏼‍♀️ woman supervillain: medium-light skin tone +🦹🏽‍♀️ woman supervillain: medium skin tone +🦹🏾‍♀️ woman supervillain: medium-dark skin tone +🦹🏿‍♀️ woman supervillain: dark skin tone +🧙 mage +🧙🏻 mage: light skin tone +🧙🏼 mage: medium-light skin tone +🧙🏽 mage: medium skin tone +🧙🏾 mage: medium-dark skin tone +🧙🏿 mage: dark skin tone +🧙‍♂️ man mage +🧙🏻‍♂️ man mage: light skin tone +🧙🏼‍♂️ man mage: medium-light skin tone +🧙🏽‍♂️ man mage: medium skin tone +🧙🏾‍♂️ man mage: medium-dark skin tone +🧙🏿‍♂️ man mage: dark skin tone +🧙‍♀️ woman mage +🧙🏻‍♀️ woman mage: light skin tone +🧙🏼‍♀️ woman mage: medium-light skin tone +🧙🏽‍♀️ woman mage: medium skin tone +🧙🏾‍♀️ woman mage: medium-dark skin tone +🧙🏿‍♀️ woman mage: dark skin tone +🧚 fairy +🧚🏻 fairy: light skin tone +🧚🏼 fairy: medium-light skin tone +🧚🏽 fairy: medium skin tone +🧚🏾 fairy: medium-dark skin tone +🧚🏿 fairy: dark skin tone +🧚‍♂️ man fairy +🧚🏻‍♂️ man fairy: light skin tone +🧚🏼‍♂️ man fairy: medium-light skin tone +🧚🏽‍♂️ man fairy: medium skin tone +🧚🏾‍♂️ man fairy: medium-dark skin tone +🧚🏿‍♂️ man fairy: dark skin tone +🧚‍♀️ woman fairy +🧚🏻‍♀️ woman fairy: light skin tone +🧚🏼‍♀️ woman fairy: medium-light skin tone +🧚🏽‍♀️ woman fairy: medium skin tone +🧚🏾‍♀️ woman fairy: medium-dark skin tone +🧚🏿‍♀️ woman fairy: dark skin tone +🧛 vampire +🧛🏻 vampire: light skin tone +🧛🏼 vampire: medium-light skin tone +🧛🏽 vampire: medium skin tone +🧛🏾 vampire: medium-dark skin tone +🧛🏿 vampire: dark skin tone +🧛‍♂️ man vampire +🧛🏻‍♂️ man vampire: light skin tone +🧛🏼‍♂️ man vampire: medium-light skin tone +🧛🏽‍♂️ man vampire: medium skin tone +🧛🏾‍♂️ man vampire: medium-dark skin tone +🧛🏿‍♂️ man vampire: dark skin tone +🧛‍♀️ woman vampire +🧛🏻‍♀️ woman vampire: light skin tone +🧛🏼‍♀️ woman vampire: medium-light skin tone +🧛🏽‍♀️ woman vampire: medium skin tone +🧛🏾‍♀️ woman vampire: medium-dark skin tone +🧛🏿‍♀️ woman vampire: dark skin tone +🧜 merperson +🧜🏻 merperson: light skin tone +🧜🏼 merperson: medium-light skin tone +🧜🏽 merperson: medium skin tone +🧜🏾 merperson: medium-dark skin tone +🧜🏿 merperson: dark skin tone +🧜‍♂️ merman +🧜🏻‍♂️ merman: light skin tone +🧜🏼‍♂️ merman: medium-light skin tone +🧜🏽‍♂️ merman: medium skin tone +🧜🏾‍♂️ merman: medium-dark skin tone +🧜🏿‍♂️ merman: dark skin tone +🧜‍♀️ mermaid +🧜🏻‍♀️ mermaid: light skin tone +🧜🏼‍♀️ mermaid: medium-light skin tone +🧜🏽‍♀️ mermaid: medium skin tone +🧜🏾‍♀️ mermaid: medium-dark skin tone +🧜🏿‍♀️ mermaid: dark skin tone +🧝 elf +🧝🏻 elf: light skin tone +🧝🏼 elf: medium-light skin tone +🧝🏽 elf: medium skin tone +🧝🏾 elf: medium-dark skin tone +🧝🏿 elf: dark skin tone +🧝‍♂️ man elf +🧝🏻‍♂️ man elf: light skin tone +🧝🏼‍♂️ man elf: medium-light skin tone +🧝🏽‍♂️ man elf: medium skin tone +🧝🏾‍♂️ man elf: medium-dark skin tone +🧝🏿‍♂️ man elf: dark skin tone +🧝‍♀️ woman elf +🧝🏻‍♀️ woman elf: light skin tone +🧝🏼‍♀️ woman elf: medium-light skin tone +🧝🏽‍♀️ woman elf: medium skin tone +🧝🏾‍♀️ woman elf: medium-dark skin tone +🧝🏿‍♀️ woman elf: dark skin tone +🧞 genie +🧞‍♂️ man genie +🧞‍♀️ woman genie +🧟 zombie +🧟‍♂️ man zombie +🧟‍♀️ woman zombie +💆 person getting massage +💆🏻 person getting massage: light skin tone +💆🏼 person getting massage: medium-light skin tone +💆🏽 person getting massage: medium skin tone +💆🏾 person getting massage: medium-dark skin tone +💆🏿 person getting massage: dark skin tone +💆‍♂️ man getting massage +💆🏻‍♂️ man getting massage: light skin tone +💆🏼‍♂️ man getting massage: medium-light skin tone +💆🏽‍♂️ man getting massage: medium skin tone +💆🏾‍♂️ man getting massage: medium-dark skin tone +💆🏿‍♂️ man getting massage: dark skin tone +💆‍♀️ woman getting massage +💆🏻‍♀️ woman getting massage: light skin tone +💆🏼‍♀️ woman getting massage: medium-light skin tone +💆🏽‍♀️ woman getting massage: medium skin tone +💆🏾‍♀️ woman getting massage: medium-dark skin tone +💆🏿‍♀️ woman getting massage: dark skin tone +💇 person getting haircut +💇🏻 person getting haircut: light skin tone +💇🏼 person getting haircut: medium-light skin tone +💇🏽 person getting haircut: medium skin tone +💇🏾 person getting haircut: medium-dark skin tone +💇🏿 person getting haircut: dark skin tone +💇‍♂️ man getting haircut +💇🏻‍♂️ man getting haircut: light skin tone +💇🏼‍♂️ man getting haircut: medium-light skin tone +💇🏽‍♂️ man getting haircut: medium skin tone +💇🏾‍♂️ man getting haircut: medium-dark skin tone +💇🏿‍♂️ man getting haircut: dark skin tone +💇‍♀️ woman getting haircut +💇🏻‍♀️ woman getting haircut: light skin tone +💇🏼‍♀️ woman getting haircut: medium-light skin tone +💇🏽‍♀️ woman getting haircut: medium skin tone +💇🏾‍♀️ woman getting haircut: medium-dark skin tone +💇🏿‍♀️ woman getting haircut: dark skin tone +🚶 person walking +🚶🏻 person walking: light skin tone +🚶🏼 person walking: medium-light skin tone +🚶🏽 person walking: medium skin tone +🚶🏾 person walking: medium-dark skin tone +🚶🏿 person walking: dark skin tone +🚶‍♂️ man walking +🚶🏻‍♂️ man walking: light skin tone +🚶🏼‍♂️ man walking: medium-light skin tone +🚶🏽‍♂️ man walking: medium skin tone +🚶🏾‍♂️ man walking: medium-dark skin tone +🚶🏿‍♂️ man walking: dark skin tone +🚶‍♀️ woman walking +🚶🏻‍♀️ woman walking: light skin tone +🚶🏼‍♀️ woman walking: medium-light skin tone +🚶🏽‍♀️ woman walking: medium skin tone +🚶🏾‍♀️ woman walking: medium-dark skin tone +🚶🏿‍♀️ woman walking: dark skin tone +🧍 person standing +🧍🏻 person standing: light skin tone +🧍🏼 person standing: medium-light skin tone +🧍🏽 person standing: medium skin tone +🧍🏾 person standing: medium-dark skin tone +🧍🏿 person standing: dark skin tone +🧍‍♂️ man standing +🧍🏻‍♂️ man standing: light skin tone +🧍🏼‍♂️ man standing: medium-light skin tone +🧍🏽‍♂️ man standing: medium skin tone +🧍🏾‍♂️ man standing: medium-dark skin tone +🧍🏿‍♂️ man standing: dark skin tone +🧍‍♀️ woman standing +🧍🏻‍♀️ woman standing: light skin tone +🧍🏼‍♀️ woman standing: medium-light skin tone +🧍🏽‍♀️ woman standing: medium skin tone +🧍🏾‍♀️ woman standing: medium-dark skin tone +🧍🏿‍♀️ woman standing: dark skin tone +🧎 person kneeling +🧎🏻 person kneeling: light skin tone +🧎🏼 person kneeling: medium-light skin tone +🧎🏽 person kneeling: medium skin tone +🧎🏾 person kneeling: medium-dark skin tone +🧎🏿 person kneeling: dark skin tone +🧎‍♂️ man kneeling +🧎🏻‍♂️ man kneeling: light skin tone +🧎🏼‍♂️ man kneeling: medium-light skin tone +🧎🏽‍♂️ man kneeling: medium skin tone +🧎🏾‍♂️ man kneeling: medium-dark skin tone +🧎🏿‍♂️ man kneeling: dark skin tone +🧎‍♀️ woman kneeling +🧎🏻‍♀️ woman kneeling: light skin tone +🧎🏼‍♀️ woman kneeling: medium-light skin tone +🧎🏽‍♀️ woman kneeling: medium skin tone +🧎🏾‍♀️ woman kneeling: medium-dark skin tone +🧎🏿‍♀️ woman kneeling: dark skin tone +🧑‍🦯 person with white cane +🧑🏻‍🦯 person with white cane: light skin tone +🧑🏼‍🦯 person with white cane: medium-light skin tone +🧑🏽‍🦯 person with white cane: medium skin tone +🧑🏾‍🦯 person with white cane: medium-dark skin tone +🧑🏿‍🦯 person with white cane: dark skin tone +👨‍🦯 man with white cane +👨🏻‍🦯 man with white cane: light skin tone +👨🏼‍🦯 man with white cane: medium-light skin tone +👨🏽‍🦯 man with white cane: medium skin tone +👨🏾‍🦯 man with white cane: medium-dark skin tone +👨🏿‍🦯 man with white cane: dark skin tone +👩‍🦯 woman with white cane +👩🏻‍🦯 woman with white cane: light skin tone +👩🏼‍🦯 woman with white cane: medium-light skin tone +👩🏽‍🦯 woman with white cane: medium skin tone +👩🏾‍🦯 woman with white cane: medium-dark skin tone +👩🏿‍🦯 woman with white cane: dark skin tone +🧑‍🦼 person in motorized wheelchair +🧑🏻‍🦼 person in motorized wheelchair: light skin tone +🧑🏼‍🦼 person in motorized wheelchair: medium-light skin tone +🧑🏽‍🦼 person in motorized wheelchair: medium skin tone +🧑🏾‍🦼 person in motorized wheelchair: medium-dark skin tone +🧑🏿‍🦼 person in motorized wheelchair: dark skin tone +👨‍🦼 man in motorized wheelchair +👨🏻‍🦼 man in motorized wheelchair: light skin tone +👨🏼‍🦼 man in motorized wheelchair: medium-light skin tone +👨🏽‍🦼 man in motorized wheelchair: medium skin tone +👨🏾‍🦼 man in motorized wheelchair: medium-dark skin tone +👨🏿‍🦼 man in motorized wheelchair: dark skin tone +👩‍🦼 woman in motorized wheelchair +👩🏻‍🦼 woman in motorized wheelchair: light skin tone +👩🏼‍🦼 woman in motorized wheelchair: medium-light skin tone +👩🏽‍🦼 woman in motorized wheelchair: medium skin tone +👩🏾‍🦼 woman in motorized wheelchair: medium-dark skin tone +👩🏿‍🦼 woman in motorized wheelchair: dark skin tone +🧑‍🦽 person in manual wheelchair +🧑🏻‍🦽 person in manual wheelchair: light skin tone +🧑🏼‍🦽 person in manual wheelchair: medium-light skin tone +🧑🏽‍🦽 person in manual wheelchair: medium skin tone +🧑🏾‍🦽 person in manual wheelchair: medium-dark skin tone +🧑🏿‍🦽 person in manual wheelchair: dark skin tone +👨‍🦽 man in manual wheelchair +👨🏻‍🦽 man in manual wheelchair: light skin tone +👨🏼‍🦽 man in manual wheelchair: medium-light skin tone +👨🏽‍🦽 man in manual wheelchair: medium skin tone +👨🏾‍🦽 man in manual wheelchair: medium-dark skin tone +👨🏿‍🦽 man in manual wheelchair: dark skin tone +👩‍🦽 woman in manual wheelchair +👩🏻‍🦽 woman in manual wheelchair: light skin tone +👩🏼‍🦽 woman in manual wheelchair: medium-light skin tone +👩🏽‍🦽 woman in manual wheelchair: medium skin tone +👩🏾‍🦽 woman in manual wheelchair: medium-dark skin tone +👩🏿‍🦽 woman in manual wheelchair: dark skin tone +🏃 person running +🏃🏻 person running: light skin tone +🏃🏼 person running: medium-light skin tone +🏃🏽 person running: medium skin tone +🏃🏾 person running: medium-dark skin tone +🏃🏿 person running: dark skin tone +🏃‍♂️ man running +🏃🏻‍♂️ man running: light skin tone +🏃🏼‍♂️ man running: medium-light skin tone +🏃🏽‍♂️ man running: medium skin tone +🏃🏾‍♂️ man running: medium-dark skin tone +🏃🏿‍♂️ man running: dark skin tone +🏃‍♀️ woman running +🏃🏻‍♀️ woman running: light skin tone +🏃🏼‍♀️ woman running: medium-light skin tone +🏃🏽‍♀️ woman running: medium skin tone +🏃🏾‍♀️ woman running: medium-dark skin tone +🏃🏿‍♀️ woman running: dark skin tone +💃 woman dancing +💃🏻 woman dancing: light skin tone +💃🏼 woman dancing: medium-light skin tone +💃🏽 woman dancing: medium skin tone +💃🏾 woman dancing: medium-dark skin tone +💃🏿 woman dancing: dark skin tone +🕺 man dancing +🕺🏻 man dancing: light skin tone +🕺🏼 man dancing: medium-light skin tone +🕺🏽 man dancing: medium skin tone +🕺🏾 man dancing: medium-dark skin tone +🕺🏿 man dancing: dark skin tone +🕴️ person in suit levitating +🕴🏻 person in suit levitating: light skin tone +🕴🏼 person in suit levitating: medium-light skin tone +🕴🏽 person in suit levitating: medium skin tone +🕴🏾 person in suit levitating: medium-dark skin tone +🕴🏿 person in suit levitating: dark skin tone +👯 people with bunny ears +👯‍♂️ men with bunny ears +👯‍♀️ women with bunny ears +🧖 person in steamy room +🧖🏻 person in steamy room: light skin tone +🧖🏼 person in steamy room: medium-light skin tone +🧖🏽 person in steamy room: medium skin tone +🧖🏾 person in steamy room: medium-dark skin tone +🧖🏿 person in steamy room: dark skin tone +🧖‍♂️ man in steamy room +🧖🏻‍♂️ man in steamy room: light skin tone +🧖🏼‍♂️ man in steamy room: medium-light skin tone +🧖🏽‍♂️ man in steamy room: medium skin tone +🧖🏾‍♂️ man in steamy room: medium-dark skin tone +🧖🏿‍♂️ man in steamy room: dark skin tone +🧖‍♀️ woman in steamy room +🧖🏻‍♀️ woman in steamy room: light skin tone +🧖🏼‍♀️ woman in steamy room: medium-light skin tone +🧖🏽‍♀️ woman in steamy room: medium skin tone +🧖🏾‍♀️ woman in steamy room: medium-dark skin tone +🧖🏿‍♀️ woman in steamy room: dark skin tone +🧗 person climbing +🧗🏻 person climbing: light skin tone +🧗🏼 person climbing: medium-light skin tone +🧗🏽 person climbing: medium skin tone +🧗🏾 person climbing: medium-dark skin tone +🧗🏿 person climbing: dark skin tone +🧗‍♂️ man climbing +🧗🏻‍♂️ man climbing: light skin tone +🧗🏼‍♂️ man climbing: medium-light skin tone +🧗🏽‍♂️ man climbing: medium skin tone +🧗🏾‍♂️ man climbing: medium-dark skin tone +🧗🏿‍♂️ man climbing: dark skin tone +🧗‍♀️ woman climbing +🧗🏻‍♀️ woman climbing: light skin tone +🧗🏼‍♀️ woman climbing: medium-light skin tone +🧗🏽‍♀️ woman climbing: medium skin tone +🧗🏾‍♀️ woman climbing: medium-dark skin tone +🧗🏿‍♀️ woman climbing: dark skin tone +🤺 person fencing +🏇 horse racing +🏇🏻 horse racing: light skin tone +🏇🏼 horse racing: medium-light skin tone +🏇🏽 horse racing: medium skin tone +🏇🏾 horse racing: medium-dark skin tone +🏇🏿 horse racing: dark skin tone +⛷️ skier +🏂 snowboarder +🏂🏻 snowboarder: light skin tone +🏂🏼 snowboarder: medium-light skin tone +🏂🏽 snowboarder: medium skin tone +🏂🏾 snowboarder: medium-dark skin tone +🏂🏿 snowboarder: dark skin tone +🏌️ person golfing +🏌🏻 person golfing: light skin tone +🏌🏼 person golfing: medium-light skin tone +🏌🏽 person golfing: medium skin tone +🏌🏾 person golfing: medium-dark skin tone +🏌🏿 person golfing: dark skin tone +🏌️‍♂️ man golfing +🏌🏻‍♂️ man golfing: light skin tone +🏌🏼‍♂️ man golfing: medium-light skin tone +🏌🏽‍♂️ man golfing: medium skin tone +🏌🏾‍♂️ man golfing: medium-dark skin tone +🏌🏿‍♂️ man golfing: dark skin tone +🏌️‍♀️ woman golfing +🏌🏻‍♀️ woman golfing: light skin tone +🏌🏼‍♀️ woman golfing: medium-light skin tone +🏌🏽‍♀️ woman golfing: medium skin tone +🏌🏾‍♀️ woman golfing: medium-dark skin tone +🏌🏿‍♀️ woman golfing: dark skin tone +🏄 person surfing +🏄🏻 person surfing: light skin tone +🏄🏼 person surfing: medium-light skin tone +🏄🏽 person surfing: medium skin tone +🏄🏾 person surfing: medium-dark skin tone +🏄🏿 person surfing: dark skin tone +🏄‍♂️ man surfing +🏄🏻‍♂️ man surfing: light skin tone +🏄🏼‍♂️ man surfing: medium-light skin tone +🏄🏽‍♂️ man surfing: medium skin tone +🏄🏾‍♂️ man surfing: medium-dark skin tone +🏄🏿‍♂️ man surfing: dark skin tone +🏄‍♀️ woman surfing +🏄🏻‍♀️ woman surfing: light skin tone +🏄🏼‍♀️ woman surfing: medium-light skin tone +🏄🏽‍♀️ woman surfing: medium skin tone +🏄🏾‍♀️ woman surfing: medium-dark skin tone +🏄🏿‍♀️ woman surfing: dark skin tone +🚣 person rowing boat +🚣🏻 person rowing boat: light skin tone +🚣🏼 person rowing boat: medium-light skin tone +🚣🏽 person rowing boat: medium skin tone +🚣🏾 person rowing boat: medium-dark skin tone +🚣🏿 person rowing boat: dark skin tone +🚣‍♂️ man rowing boat +🚣🏻‍♂️ man rowing boat: light skin tone +🚣🏼‍♂️ man rowing boat: medium-light skin tone +🚣🏽‍♂️ man rowing boat: medium skin tone +🚣🏾‍♂️ man rowing boat: medium-dark skin tone +🚣🏿‍♂️ man rowing boat: dark skin tone +🚣‍♀️ woman rowing boat +🚣🏻‍♀️ woman rowing boat: light skin tone +🚣🏼‍♀️ woman rowing boat: medium-light skin tone +🚣🏽‍♀️ woman rowing boat: medium skin tone +🚣🏾‍♀️ woman rowing boat: medium-dark skin tone +🚣🏿‍♀️ woman rowing boat: dark skin tone +🏊 person swimming +🏊🏻 person swimming: light skin tone +🏊🏼 person swimming: medium-light skin tone +🏊🏽 person swimming: medium skin tone +🏊🏾 person swimming: medium-dark skin tone +🏊🏿 person swimming: dark skin tone +🏊‍♂️ man swimming +🏊🏻‍♂️ man swimming: light skin tone +🏊🏼‍♂️ man swimming: medium-light skin tone +🏊🏽‍♂️ man swimming: medium skin tone +🏊🏾‍♂️ man swimming: medium-dark skin tone +🏊🏿‍♂️ man swimming: dark skin tone +🏊‍♀️ woman swimming +🏊🏻‍♀️ woman swimming: light skin tone +🏊🏼‍♀️ woman swimming: medium-light skin tone +🏊🏽‍♀️ woman swimming: medium skin tone +🏊🏾‍♀️ woman swimming: medium-dark skin tone +🏊🏿‍♀️ woman swimming: dark skin tone +⛹️ person bouncing ball +⛹🏻 person bouncing ball: light skin tone +⛹🏼 person bouncing ball: medium-light skin tone +⛹🏽 person bouncing ball: medium skin tone +⛹🏾 person bouncing ball: medium-dark skin tone +⛹🏿 person bouncing ball: dark skin tone +⛹️‍♂️ man bouncing ball +⛹🏻‍♂️ man bouncing ball: light skin tone +⛹🏼‍♂️ man bouncing ball: medium-light skin tone +⛹🏽‍♂️ man bouncing ball: medium skin tone +⛹🏾‍♂️ man bouncing ball: medium-dark skin tone +⛹🏿‍♂️ man bouncing ball: dark skin tone +⛹️‍♀️ woman bouncing ball +⛹🏻‍♀️ woman bouncing ball: light skin tone +⛹🏼‍♀️ woman bouncing ball: medium-light skin tone +⛹🏽‍♀️ woman bouncing ball: medium skin tone +⛹🏾‍♀️ woman bouncing ball: medium-dark skin tone +⛹🏿‍♀️ woman bouncing ball: dark skin tone +🏋️ person lifting weights +🏋🏻 person lifting weights: light skin tone +🏋🏼 person lifting weights: medium-light skin tone +🏋🏽 person lifting weights: medium skin tone +🏋🏾 person lifting weights: medium-dark skin tone +🏋🏿 person lifting weights: dark skin tone +🏋️‍♂️ man lifting weights +🏋🏻‍♂️ man lifting weights: light skin tone +🏋🏼‍♂️ man lifting weights: medium-light skin tone +🏋🏽‍♂️ man lifting weights: medium skin tone +🏋🏾‍♂️ man lifting weights: medium-dark skin tone +🏋🏿‍♂️ man lifting weights: dark skin tone +🏋️‍♀️ woman lifting weights +🏋🏻‍♀️ woman lifting weights: light skin tone +🏋🏼‍♀️ woman lifting weights: medium-light skin tone +🏋🏽‍♀️ woman lifting weights: medium skin tone +🏋🏾‍♀️ woman lifting weights: medium-dark skin tone +🏋🏿‍♀️ woman lifting weights: dark skin tone +🚴 person biking +🚴🏻 person biking: light skin tone +🚴🏼 person biking: medium-light skin tone +🚴🏽 person biking: medium skin tone +🚴🏾 person biking: medium-dark skin tone +🚴🏿 person biking: dark skin tone +🚴‍♂️ man biking +🚴🏻‍♂️ man biking: light skin tone +🚴🏼‍♂️ man biking: medium-light skin tone +🚴🏽‍♂️ man biking: medium skin tone +🚴🏾‍♂️ man biking: medium-dark skin tone +🚴🏿‍♂️ man biking: dark skin tone +🚴‍♀️ woman biking +🚴🏻‍♀️ woman biking: light skin tone +🚴🏼‍♀️ woman biking: medium-light skin tone +🚴🏽‍♀️ woman biking: medium skin tone +🚴🏾‍♀️ woman biking: medium-dark skin tone +🚴🏿‍♀️ woman biking: dark skin tone +🚵 person mountain biking +🚵🏻 person mountain biking: light skin tone +🚵🏼 person mountain biking: medium-light skin tone +🚵🏽 person mountain biking: medium skin tone +🚵🏾 person mountain biking: medium-dark skin tone +🚵🏿 person mountain biking: dark skin tone +🚵‍♂️ man mountain biking +🚵🏻‍♂️ man mountain biking: light skin tone +🚵🏼‍♂️ man mountain biking: medium-light skin tone +🚵🏽‍♂️ man mountain biking: medium skin tone +🚵🏾‍♂️ man mountain biking: medium-dark skin tone +🚵🏿‍♂️ man mountain biking: dark skin tone +🚵‍♀️ woman mountain biking +🚵🏻‍♀️ woman mountain biking: light skin tone +🚵🏼‍♀️ woman mountain biking: medium-light skin tone +🚵🏽‍♀️ woman mountain biking: medium skin tone +🚵🏾‍♀️ woman mountain biking: medium-dark skin tone +🚵🏿‍♀️ woman mountain biking: dark skin tone +🤸 person cartwheeling +🤸🏻 person cartwheeling: light skin tone +🤸🏼 person cartwheeling: medium-light skin tone +🤸🏽 person cartwheeling: medium skin tone +🤸🏾 person cartwheeling: medium-dark skin tone +🤸🏿 person cartwheeling: dark skin tone +🤸‍♂️ man cartwheeling +🤸🏻‍♂️ man cartwheeling: light skin tone +🤸🏼‍♂️ man cartwheeling: medium-light skin tone +🤸🏽‍♂️ man cartwheeling: medium skin tone +🤸🏾‍♂️ man cartwheeling: medium-dark skin tone +🤸🏿‍♂️ man cartwheeling: dark skin tone +🤸‍♀️ woman cartwheeling +🤸🏻‍♀️ woman cartwheeling: light skin tone +🤸🏼‍♀️ woman cartwheeling: medium-light skin tone +🤸🏽‍♀️ woman cartwheeling: medium skin tone +🤸🏾‍♀️ woman cartwheeling: medium-dark skin tone +🤸🏿‍♀️ woman cartwheeling: dark skin tone +🤼 people wrestling +🤼‍♂️ men wrestling +🤼‍♀️ women wrestling +🤽 person playing water polo +🤽🏻 person playing water polo: light skin tone +🤽🏼 person playing water polo: medium-light skin tone +🤽🏽 person playing water polo: medium skin tone +🤽🏾 person playing water polo: medium-dark skin tone +🤽🏿 person playing water polo: dark skin tone +🤽‍♂️ man playing water polo +🤽🏻‍♂️ man playing water polo: light skin tone +🤽🏼‍♂️ man playing water polo: medium-light skin tone +🤽🏽‍♂️ man playing water polo: medium skin tone +🤽🏾‍♂️ man playing water polo: medium-dark skin tone +🤽🏿‍♂️ man playing water polo: dark skin tone +🤽‍♀️ woman playing water polo +🤽🏻‍♀️ woman playing water polo: light skin tone +🤽🏼‍♀️ woman playing water polo: medium-light skin tone +🤽🏽‍♀️ woman playing water polo: medium skin tone +🤽🏾‍♀️ woman playing water polo: medium-dark skin tone +🤽🏿‍♀️ woman playing water polo: dark skin tone +🤾 person playing handball +🤾🏻 person playing handball: light skin tone +🤾🏼 person playing handball: medium-light skin tone +🤾🏽 person playing handball: medium skin tone +🤾🏾 person playing handball: medium-dark skin tone +🤾🏿 person playing handball: dark skin tone +🤾‍♂️ man playing handball +🤾🏻‍♂️ man playing handball: light skin tone +🤾🏼‍♂️ man playing handball: medium-light skin tone +🤾🏽‍♂️ man playing handball: medium skin tone +🤾🏾‍♂️ man playing handball: medium-dark skin tone +🤾🏿‍♂️ man playing handball: dark skin tone +🤾‍♀️ woman playing handball +🤾🏻‍♀️ woman playing handball: light skin tone +🤾🏼‍♀️ woman playing handball: medium-light skin tone +🤾🏽‍♀️ woman playing handball: medium skin tone +🤾🏾‍♀️ woman playing handball: medium-dark skin tone +🤾🏿‍♀️ woman playing handball: dark skin tone +🤹 person juggling +🤹🏻 person juggling: light skin tone +🤹🏼 person juggling: medium-light skin tone +🤹🏽 person juggling: medium skin tone +🤹🏾 person juggling: medium-dark skin tone +🤹🏿 person juggling: dark skin tone +🤹‍♂️ man juggling +🤹🏻‍♂️ man juggling: light skin tone +🤹🏼‍♂️ man juggling: medium-light skin tone +🤹🏽‍♂️ man juggling: medium skin tone +🤹🏾‍♂️ man juggling: medium-dark skin tone +🤹🏿‍♂️ man juggling: dark skin tone +🤹‍♀️ woman juggling +🤹🏻‍♀️ woman juggling: light skin tone +🤹🏼‍♀️ woman juggling: medium-light skin tone +🤹🏽‍♀️ woman juggling: medium skin tone +🤹🏾‍♀️ woman juggling: medium-dark skin tone +🤹🏿‍♀️ woman juggling: dark skin tone +🧘 person in lotus position +🧘🏻 person in lotus position: light skin tone +🧘🏼 person in lotus position: medium-light skin tone +🧘🏽 person in lotus position: medium skin tone +🧘🏾 person in lotus position: medium-dark skin tone +🧘🏿 person in lotus position: dark skin tone +🧘‍♂️ man in lotus position +🧘🏻‍♂️ man in lotus position: light skin tone +🧘🏼‍♂️ man in lotus position: medium-light skin tone +🧘🏽‍♂️ man in lotus position: medium skin tone +🧘🏾‍♂️ man in lotus position: medium-dark skin tone +🧘🏿‍♂️ man in lotus position: dark skin tone +🧘‍♀️ woman in lotus position +🧘🏻‍♀️ woman in lotus position: light skin tone +🧘🏼‍♀️ woman in lotus position: medium-light skin tone +🧘🏽‍♀️ woman in lotus position: medium skin tone +🧘🏾‍♀️ woman in lotus position: medium-dark skin tone +🧘🏿‍♀️ woman in lotus position: dark skin tone +🛀 person taking bath +🛀🏻 person taking bath: light skin tone +🛀🏼 person taking bath: medium-light skin tone +🛀🏽 person taking bath: medium skin tone +🛀🏾 person taking bath: medium-dark skin tone +🛀🏿 person taking bath: dark skin tone +🛌 person in bed +🛌🏻 person in bed: light skin tone +🛌🏼 person in bed: medium-light skin tone +🛌🏽 person in bed: medium skin tone +🛌🏾 person in bed: medium-dark skin tone +🛌🏿 person in bed: dark skin tone +🧑‍🤝‍🧑 people holding hands +🧑🏻‍🤝‍🧑🏻 people holding hands: light skin tone +🧑🏻‍🤝‍🧑🏼 people holding hands: light skin tone, medium-light skin tone +🧑🏻‍🤝‍🧑🏽 people holding hands: light skin tone, medium skin tone +🧑🏻‍🤝‍🧑🏾 people holding hands: light skin tone, medium-dark skin tone +🧑🏻‍🤝‍🧑🏿 people holding hands: light skin tone, dark skin tone +🧑🏼‍🤝‍🧑🏻 people holding hands: medium-light skin tone, light skin tone +🧑🏼‍🤝‍🧑🏼 people holding hands: medium-light skin tone +🧑🏼‍🤝‍🧑🏽 people holding hands: medium-light skin tone, medium skin tone +🧑🏼‍🤝‍🧑🏾 people holding hands: medium-light skin tone, medium-dark skin tone +🧑🏼‍🤝‍🧑🏿 people holding hands: medium-light skin tone, dark skin tone +🧑🏽‍🤝‍🧑🏻 people holding hands: medium skin tone, light skin tone +🧑🏽‍🤝‍🧑🏼 people holding hands: medium skin tone, medium-light skin tone +🧑🏽‍🤝‍🧑🏽 people holding hands: medium skin tone +🧑🏽‍🤝‍🧑🏾 people holding hands: medium skin tone, medium-dark skin tone +🧑🏽‍🤝‍🧑🏿 people holding hands: medium skin tone, dark skin tone +🧑🏾‍🤝‍🧑🏻 people holding hands: medium-dark skin tone, light skin tone +🧑🏾‍🤝‍🧑🏼 people holding hands: medium-dark skin tone, medium-light skin tone +🧑🏾‍🤝‍🧑🏽 people holding hands: medium-dark skin tone, medium skin tone +🧑🏾‍🤝‍🧑🏾 people holding hands: medium-dark skin tone +🧑🏾‍🤝‍🧑🏿 people holding hands: medium-dark skin tone, dark skin tone +🧑🏿‍🤝‍🧑🏻 people holding hands: dark skin tone, light skin tone +🧑🏿‍🤝‍🧑🏼 people holding hands: dark skin tone, medium-light skin tone +🧑🏿‍🤝‍🧑🏽 people holding hands: dark skin tone, medium skin tone +🧑🏿‍🤝‍🧑🏾 people holding hands: dark skin tone, medium-dark skin tone +🧑🏿‍🤝‍🧑🏿 people holding hands: dark skin tone +👭 women holding hands +👭🏻 women holding hands: light skin tone +👩🏻‍🤝‍👩🏼 women holding hands: light skin tone, medium-light skin tone +👩🏻‍🤝‍👩🏽 women holding hands: light skin tone, medium skin tone +👩🏻‍🤝‍👩🏾 women holding hands: light skin tone, medium-dark skin tone +👩🏻‍🤝‍👩🏿 women holding hands: light skin tone, dark skin tone +👩🏼‍🤝‍👩🏻 women holding hands: medium-light skin tone, light skin tone +👭🏼 women holding hands: medium-light skin tone +👩🏼‍🤝‍👩🏽 women holding hands: medium-light skin tone, medium skin tone +👩🏼‍🤝‍👩🏾 women holding hands: medium-light skin tone, medium-dark skin tone +👩🏼‍🤝‍👩🏿 women holding hands: medium-light skin tone, dark skin tone +👩🏽‍🤝‍👩🏻 women holding hands: medium skin tone, light skin tone +👩🏽‍🤝‍👩🏼 women holding hands: medium skin tone, medium-light skin tone +👭🏽 women holding hands: medium skin tone +👩🏽‍🤝‍👩🏾 women holding hands: medium skin tone, medium-dark skin tone +👩🏽‍🤝‍👩🏿 women holding hands: medium skin tone, dark skin tone +👩🏾‍🤝‍👩🏻 women holding hands: medium-dark skin tone, light skin tone +👩🏾‍🤝‍👩🏼 women holding hands: medium-dark skin tone, medium-light skin tone +👩🏾‍🤝‍👩🏽 women holding hands: medium-dark skin tone, medium skin tone +👭🏾 women holding hands: medium-dark skin tone +👩🏾‍🤝‍👩🏿 women holding hands: medium-dark skin tone, dark skin tone +👩🏿‍🤝‍👩🏻 women holding hands: dark skin tone, light skin tone +👩🏿‍🤝‍👩🏼 women holding hands: dark skin tone, medium-light skin tone +👩🏿‍🤝‍👩🏽 women holding hands: dark skin tone, medium skin tone +👩🏿‍🤝‍👩🏾 women holding hands: dark skin tone, medium-dark skin tone +👭🏿 women holding hands: dark skin tone +👫 woman and man holding hands +👫🏻 woman and man holding hands: light skin tone +👩🏻‍🤝‍👨🏼 woman and man holding hands: light skin tone, medium-light skin tone +👩🏻‍🤝‍👨🏽 woman and man holding hands: light skin tone, medium skin tone +👩🏻‍🤝‍👨🏾 woman and man holding hands: light skin tone, medium-dark skin tone +👩🏻‍🤝‍👨🏿 woman and man holding hands: light skin tone, dark skin tone +👩🏼‍🤝‍👨🏻 woman and man holding hands: medium-light skin tone, light skin tone +👫🏼 woman and man holding hands: medium-light skin tone +👩🏼‍🤝‍👨🏽 woman and man holding hands: medium-light skin tone, medium skin tone +👩🏼‍🤝‍👨🏾 woman and man holding hands: medium-light skin tone, medium-dark skin tone +👩🏼‍🤝‍👨🏿 woman and man holding hands: medium-light skin tone, dark skin tone +👩🏽‍🤝‍👨🏻 woman and man holding hands: medium skin tone, light skin tone +👩🏽‍🤝‍👨🏼 woman and man holding hands: medium skin tone, medium-light skin tone +👫🏽 woman and man holding hands: medium skin tone +👩🏽‍🤝‍👨🏾 woman and man holding hands: medium skin tone, medium-dark skin tone +👩🏽‍🤝‍👨🏿 woman and man holding hands: medium skin tone, dark skin tone +👩🏾‍🤝‍👨🏻 woman and man holding hands: medium-dark skin tone, light skin tone +👩🏾‍🤝‍👨🏼 woman and man holding hands: medium-dark skin tone, medium-light skin tone +👩🏾‍🤝‍👨🏽 woman and man holding hands: medium-dark skin tone, medium skin tone +👫🏾 woman and man holding hands: medium-dark skin tone +👩🏾‍🤝‍👨🏿 woman and man holding hands: medium-dark skin tone, dark skin tone +👩🏿‍🤝‍👨🏻 woman and man holding hands: dark skin tone, light skin tone +👩🏿‍🤝‍👨🏼 woman and man holding hands: dark skin tone, medium-light skin tone +👩🏿‍🤝‍👨🏽 woman and man holding hands: dark skin tone, medium skin tone +👩🏿‍🤝‍👨🏾 woman and man holding hands: dark skin tone, medium-dark skin tone +👫🏿 woman and man holding hands: dark skin tone +👬 men holding hands +👬🏻 men holding hands: light skin tone +👨🏻‍🤝‍👨🏼 men holding hands: light skin tone, medium-light skin tone +👨🏻‍🤝‍👨🏽 men holding hands: light skin tone, medium skin tone +👨🏻‍🤝‍👨🏾 men holding hands: light skin tone, medium-dark skin tone +👨🏻‍🤝‍👨🏿 men holding hands: light skin tone, dark skin tone +👨🏼‍🤝‍👨🏻 men holding hands: medium-light skin tone, light skin tone +👬🏼 men holding hands: medium-light skin tone +👨🏼‍🤝‍👨🏽 men holding hands: medium-light skin tone, medium skin tone +👨🏼‍🤝‍👨🏾 men holding hands: medium-light skin tone, medium-dark skin tone +👨🏼‍🤝‍👨🏿 men holding hands: medium-light skin tone, dark skin tone +👨🏽‍🤝‍👨🏻 men holding hands: medium skin tone, light skin tone +👨🏽‍🤝‍👨🏼 men holding hands: medium skin tone, medium-light skin tone +👬🏽 men holding hands: medium skin tone +👨🏽‍🤝‍👨🏾 men holding hands: medium skin tone, medium-dark skin tone +👨🏽‍🤝‍👨🏿 men holding hands: medium skin tone, dark skin tone +👨🏾‍🤝‍👨🏻 men holding hands: medium-dark skin tone, light skin tone +👨🏾‍🤝‍👨🏼 men holding hands: medium-dark skin tone, medium-light skin tone +👨🏾‍🤝‍👨🏽 men holding hands: medium-dark skin tone, medium skin tone +👬🏾 men holding hands: medium-dark skin tone +👨🏾‍🤝‍👨🏿 men holding hands: medium-dark skin tone, dark skin tone +👨🏿‍🤝‍👨🏻 men holding hands: dark skin tone, light skin tone +👨🏿‍🤝‍👨🏼 men holding hands: dark skin tone, medium-light skin tone +👨🏿‍🤝‍👨🏽 men holding hands: dark skin tone, medium skin tone +👨🏿‍🤝‍👨🏾 men holding hands: dark skin tone, medium-dark skin tone +👬🏿 men holding hands: dark skin tone +💏 kiss +💏🏻 kiss: light skin tone +💏🏼 kiss: medium-light skin tone +💏🏽 kiss: medium skin tone +💏🏾 kiss: medium-dark skin tone +💏🏿 kiss: dark skin tone +🧑🏻‍❤️‍💋‍🧑🏼 kiss: person, person, light skin tone, medium-light skin tone +🧑🏻‍❤️‍💋‍🧑🏽 kiss: person, person, light skin tone, medium skin tone +🧑🏻‍❤️‍💋‍🧑🏾 kiss: person, person, light skin tone, medium-dark skin tone +🧑🏻‍❤️‍💋‍🧑🏿 kiss: person, person, light skin tone, dark skin tone +🧑🏼‍❤️‍💋‍🧑🏻 kiss: person, person, medium-light skin tone, light skin tone +🧑🏼‍❤️‍💋‍🧑🏽 kiss: person, person, medium-light skin tone, medium skin tone +🧑🏼‍❤️‍💋‍🧑🏾 kiss: person, person, medium-light skin tone, medium-dark skin tone +🧑🏼‍❤️‍💋‍🧑🏿 kiss: person, person, medium-light skin tone, dark skin tone +🧑🏽‍❤️‍💋‍🧑🏻 kiss: person, person, medium skin tone, light skin tone +🧑🏽‍❤️‍💋‍🧑🏼 kiss: person, person, medium skin tone, medium-light skin tone +🧑🏽‍❤️‍💋‍🧑🏾 kiss: person, person, medium skin tone, medium-dark skin tone +🧑🏽‍❤️‍💋‍🧑🏿 kiss: person, person, medium skin tone, dark skin tone +🧑🏾‍❤️‍💋‍🧑🏻 kiss: person, person, medium-dark skin tone, light skin tone +🧑🏾‍❤️‍💋‍🧑🏼 kiss: person, person, medium-dark skin tone, medium-light skin tone +🧑🏾‍❤️‍💋‍🧑🏽 kiss: person, person, medium-dark skin tone, medium skin tone +🧑🏾‍❤️‍💋‍🧑🏿 kiss: person, person, medium-dark skin tone, dark skin tone +🧑🏿‍❤️‍💋‍🧑🏻 kiss: person, person, dark skin tone, light skin tone +🧑🏿‍❤️‍💋‍🧑🏼 kiss: person, person, dark skin tone, medium-light skin tone +🧑🏿‍❤️‍💋‍🧑🏽 kiss: person, person, dark skin tone, medium skin tone +🧑🏿‍❤️‍💋‍🧑🏾 kiss: person, person, dark skin tone, medium-dark skin tone +👩‍❤️‍💋‍👨 kiss: woman, man +👩🏻‍❤️‍💋‍👨🏻 kiss: woman, man, light skin tone +👩🏻‍❤️‍💋‍👨🏼 kiss: woman, man, light skin tone, medium-light skin tone +👩🏻‍❤️‍💋‍👨🏽 kiss: woman, man, light skin tone, medium skin tone +👩🏻‍❤️‍💋‍👨🏾 kiss: woman, man, light skin tone, medium-dark skin tone +👩🏻‍❤️‍💋‍👨🏿 kiss: woman, man, light skin tone, dark skin tone +👩🏼‍❤️‍💋‍👨🏻 kiss: woman, man, medium-light skin tone, light skin tone +👩🏼‍❤️‍💋‍👨🏼 kiss: woman, man, medium-light skin tone +👩🏼‍❤️‍💋‍👨🏽 kiss: woman, man, medium-light skin tone, medium skin tone +👩🏼‍❤️‍💋‍👨🏾 kiss: woman, man, medium-light skin tone, medium-dark skin tone +👩🏼‍❤️‍💋‍👨🏿 kiss: woman, man, medium-light skin tone, dark skin tone +👩🏽‍❤️‍💋‍👨🏻 kiss: woman, man, medium skin tone, light skin tone +👩🏽‍❤️‍💋‍👨🏼 kiss: woman, man, medium skin tone, medium-light skin tone +👩🏽‍❤️‍💋‍👨🏽 kiss: woman, man, medium skin tone +👩🏽‍❤️‍💋‍👨🏾 kiss: woman, man, medium skin tone, medium-dark skin tone +👩🏽‍❤️‍💋‍👨🏿 kiss: woman, man, medium skin tone, dark skin tone +👩🏾‍❤️‍💋‍👨🏻 kiss: woman, man, medium-dark skin tone, light skin tone +👩🏾‍❤️‍💋‍👨🏼 kiss: woman, man, medium-dark skin tone, medium-light skin tone +👩🏾‍❤️‍💋‍👨🏽 kiss: woman, man, medium-dark skin tone, medium skin tone +👩🏾‍❤️‍💋‍👨🏾 kiss: woman, man, medium-dark skin tone +👩🏾‍❤️‍💋‍👨🏿 kiss: woman, man, medium-dark skin tone, dark skin tone +👩🏿‍❤️‍💋‍👨🏻 kiss: woman, man, dark skin tone, light skin tone +👩🏿‍❤️‍💋‍👨🏼 kiss: woman, man, dark skin tone, medium-light skin tone +👩🏿‍❤️‍💋‍👨🏽 kiss: woman, man, dark skin tone, medium skin tone +👩🏿‍❤️‍💋‍👨🏾 kiss: woman, man, dark skin tone, medium-dark skin tone +👩🏿‍❤️‍💋‍👨🏿 kiss: woman, man, dark skin tone +👨‍❤️‍💋‍👨 kiss: man, man +👨🏻‍❤️‍💋‍👨🏻 kiss: man, man, light skin tone +👨🏻‍❤️‍💋‍👨🏼 kiss: man, man, light skin tone, medium-light skin tone +👨🏻‍❤️‍💋‍👨🏽 kiss: man, man, light skin tone, medium skin tone +👨🏻‍❤️‍💋‍👨🏾 kiss: man, man, light skin tone, medium-dark skin tone +👨🏻‍❤️‍💋‍👨🏿 kiss: man, man, light skin tone, dark skin tone +👨🏼‍❤️‍💋‍👨🏻 kiss: man, man, medium-light skin tone, light skin tone +👨🏼‍❤️‍💋‍👨🏼 kiss: man, man, medium-light skin tone +👨🏼‍❤️‍💋‍👨🏽 kiss: man, man, medium-light skin tone, medium skin tone +👨🏼‍❤️‍💋‍👨🏾 kiss: man, man, medium-light skin tone, medium-dark skin tone +👨🏼‍❤️‍💋‍👨🏿 kiss: man, man, medium-light skin tone, dark skin tone +👨🏽‍❤️‍💋‍👨🏻 kiss: man, man, medium skin tone, light skin tone +👨🏽‍❤️‍💋‍👨🏼 kiss: man, man, medium skin tone, medium-light skin tone +👨🏽‍❤️‍💋‍👨🏽 kiss: man, man, medium skin tone +👨🏽‍❤️‍💋‍👨🏾 kiss: man, man, medium skin tone, medium-dark skin tone +👨🏽‍❤️‍💋‍👨🏿 kiss: man, man, medium skin tone, dark skin tone +👨🏾‍❤️‍💋‍👨🏻 kiss: man, man, medium-dark skin tone, light skin tone +👨🏾‍❤️‍💋‍👨🏼 kiss: man, man, medium-dark skin tone, medium-light skin tone +👨🏾‍❤️‍💋‍👨🏽 kiss: man, man, medium-dark skin tone, medium skin tone +👨🏾‍❤️‍💋‍👨🏾 kiss: man, man, medium-dark skin tone +👨🏾‍❤️‍💋‍👨🏿 kiss: man, man, medium-dark skin tone, dark skin tone +👨🏿‍❤️‍💋‍👨🏻 kiss: man, man, dark skin tone, light skin tone +👨🏿‍❤️‍💋‍👨🏼 kiss: man, man, dark skin tone, medium-light skin tone +👨🏿‍❤️‍💋‍👨🏽 kiss: man, man, dark skin tone, medium skin tone +👨🏿‍❤️‍💋‍👨🏾 kiss: man, man, dark skin tone, medium-dark skin tone +👨🏿‍❤️‍💋‍👨🏿 kiss: man, man, dark skin tone +👩‍❤️‍💋‍👩 kiss: woman, woman +👩🏻‍❤️‍💋‍👩🏻 kiss: woman, woman, light skin tone +👩🏻‍❤️‍💋‍👩🏼 kiss: woman, woman, light skin tone, medium-light skin tone +👩🏻‍❤️‍💋‍👩🏽 kiss: woman, woman, light skin tone, medium skin tone +👩🏻‍❤️‍💋‍👩🏾 kiss: woman, woman, light skin tone, medium-dark skin tone +👩🏻‍❤️‍💋‍👩🏿 kiss: woman, woman, light skin tone, dark skin tone +👩🏼‍❤️‍💋‍👩🏻 kiss: woman, woman, medium-light skin tone, light skin tone +👩🏼‍❤️‍💋‍👩🏼 kiss: woman, woman, medium-light skin tone +👩🏼‍❤️‍💋‍👩🏽 kiss: woman, woman, medium-light skin tone, medium skin tone +👩🏼‍❤️‍💋‍👩🏾 kiss: woman, woman, medium-light skin tone, medium-dark skin tone +👩🏼‍❤️‍💋‍👩🏿 kiss: woman, woman, medium-light skin tone, dark skin tone +👩🏽‍❤️‍💋‍👩🏻 kiss: woman, woman, medium skin tone, light skin tone +👩🏽‍❤️‍💋‍👩🏼 kiss: woman, woman, medium skin tone, medium-light skin tone +👩🏽‍❤️‍💋‍👩🏽 kiss: woman, woman, medium skin tone +👩🏽‍❤️‍💋‍👩🏾 kiss: woman, woman, medium skin tone, medium-dark skin tone +👩🏽‍❤️‍💋‍👩🏿 kiss: woman, woman, medium skin tone, dark skin tone +👩🏾‍❤️‍💋‍👩🏻 kiss: woman, woman, medium-dark skin tone, light skin tone +👩🏾‍❤️‍💋‍👩🏼 kiss: woman, woman, medium-dark skin tone, medium-light skin tone +👩🏾‍❤️‍💋‍👩🏽 kiss: woman, woman, medium-dark skin tone, medium skin tone +👩🏾‍❤️‍💋‍👩🏾 kiss: woman, woman, medium-dark skin tone +👩🏾‍❤️‍💋‍👩🏿 kiss: woman, woman, medium-dark skin tone, dark skin tone +👩🏿‍❤️‍💋‍👩🏻 kiss: woman, woman, dark skin tone, light skin tone +👩🏿‍❤️‍💋‍👩🏼 kiss: woman, woman, dark skin tone, medium-light skin tone +👩🏿‍❤️‍💋‍👩🏽 kiss: woman, woman, dark skin tone, medium skin tone +👩🏿‍❤️‍💋‍👩🏾 kiss: woman, woman, dark skin tone, medium-dark skin tone +👩🏿‍❤️‍💋‍👩🏿 kiss: woman, woman, dark skin tone +💑 couple with heart +💑🏻 couple with heart: light skin tone +💑🏼 couple with heart: medium-light skin tone +💑🏽 couple with heart: medium skin tone +💑🏾 couple with heart: medium-dark skin tone +💑🏿 couple with heart: dark skin tone +🧑🏻‍❤️‍🧑🏼 couple with heart: person, person, light skin tone, medium-light skin tone +🧑🏻‍❤️‍🧑🏽 couple with heart: person, person, light skin tone, medium skin tone +🧑🏻‍❤️‍🧑🏾 couple with heart: person, person, light skin tone, medium-dark skin tone +🧑🏻‍❤️‍🧑🏿 couple with heart: person, person, light skin tone, dark skin tone +🧑🏼‍❤️‍🧑🏻 couple with heart: person, person, medium-light skin tone, light skin tone +🧑🏼‍❤️‍🧑🏽 couple with heart: person, person, medium-light skin tone, medium skin tone +🧑🏼‍❤️‍🧑🏾 couple with heart: person, person, medium-light skin tone, medium-dark skin tone +🧑🏼‍❤️‍🧑🏿 couple with heart: person, person, medium-light skin tone, dark skin tone +🧑🏽‍❤️‍🧑🏻 couple with heart: person, person, medium skin tone, light skin tone +🧑🏽‍❤️‍🧑🏼 couple with heart: person, person, medium skin tone, medium-light skin tone +🧑🏽‍❤️‍🧑🏾 couple with heart: person, person, medium skin tone, medium-dark skin tone +🧑🏽‍❤️‍🧑🏿 couple with heart: person, person, medium skin tone, dark skin tone +🧑🏾‍❤️‍🧑🏻 couple with heart: person, person, medium-dark skin tone, light skin tone +🧑🏾‍❤️‍🧑🏼 couple with heart: person, person, medium-dark skin tone, medium-light skin tone +🧑🏾‍❤️‍🧑🏽 couple with heart: person, person, medium-dark skin tone, medium skin tone +🧑🏾‍❤️‍🧑🏿 couple with heart: person, person, medium-dark skin tone, dark skin tone +🧑🏿‍❤️‍🧑🏻 couple with heart: person, person, dark skin tone, light skin tone +🧑🏿‍❤️‍🧑🏼 couple with heart: person, person, dark skin tone, medium-light skin tone +🧑🏿‍❤️‍🧑🏽 couple with heart: person, person, dark skin tone, medium skin tone +🧑🏿‍❤️‍🧑🏾 couple with heart: person, person, dark skin tone, medium-dark skin tone +👩‍❤️‍👨 couple with heart: woman, man +👩🏻‍❤️‍👨🏻 couple with heart: woman, man, light skin tone +👩🏻‍❤️‍👨🏼 couple with heart: woman, man, light skin tone, medium-light skin tone +👩🏻‍❤️‍👨🏽 couple with heart: woman, man, light skin tone, medium skin tone +👩🏻‍❤️‍👨🏾 couple with heart: woman, man, light skin tone, medium-dark skin tone +👩🏻‍❤️‍👨🏿 couple with heart: woman, man, light skin tone, dark skin tone +👩🏼‍❤️‍👨🏻 couple with heart: woman, man, medium-light skin tone, light skin tone +👩🏼‍❤️‍👨🏼 couple with heart: woman, man, medium-light skin tone +👩🏼‍❤️‍👨🏽 couple with heart: woman, man, medium-light skin tone, medium skin tone +👩🏼‍❤️‍👨🏾 couple with heart: woman, man, medium-light skin tone, medium-dark skin tone +👩🏼‍❤️‍👨🏿 couple with heart: woman, man, medium-light skin tone, dark skin tone +👩🏽‍❤️‍👨🏻 couple with heart: woman, man, medium skin tone, light skin tone +👩🏽‍❤️‍👨🏼 couple with heart: woman, man, medium skin tone, medium-light skin tone +👩🏽‍❤️‍👨🏽 couple with heart: woman, man, medium skin tone +👩🏽‍❤️‍👨🏾 couple with heart: woman, man, medium skin tone, medium-dark skin tone +👩🏽‍❤️‍👨🏿 couple with heart: woman, man, medium skin tone, dark skin tone +👩🏾‍❤️‍👨🏻 couple with heart: woman, man, medium-dark skin tone, light skin tone +👩🏾‍❤️‍👨🏼 couple with heart: woman, man, medium-dark skin tone, medium-light skin tone +👩🏾‍❤️‍👨🏽 couple with heart: woman, man, medium-dark skin tone, medium skin tone +👩🏾‍❤️‍👨🏾 couple with heart: woman, man, medium-dark skin tone +👩🏾‍❤️‍👨🏿 couple with heart: woman, man, medium-dark skin tone, dark skin tone +👩🏿‍❤️‍👨🏻 couple with heart: woman, man, dark skin tone, light skin tone +👩🏿‍❤️‍👨🏼 couple with heart: woman, man, dark skin tone, medium-light skin tone +👩🏿‍❤️‍👨🏽 couple with heart: woman, man, dark skin tone, medium skin tone +👩🏿‍❤️‍👨🏾 couple with heart: woman, man, dark skin tone, medium-dark skin tone +👩🏿‍❤️‍👨🏿 couple with heart: woman, man, dark skin tone +👨‍❤️‍👨 couple with heart: man, man +👨🏻‍❤️‍👨🏻 couple with heart: man, man, light skin tone +👨🏻‍❤️‍👨🏼 couple with heart: man, man, light skin tone, medium-light skin tone +👨🏻‍❤️‍👨🏽 couple with heart: man, man, light skin tone, medium skin tone +👨🏻‍❤️‍👨🏾 couple with heart: man, man, light skin tone, medium-dark skin tone +👨🏻‍❤️‍👨🏿 couple with heart: man, man, light skin tone, dark skin tone +👨🏼‍❤️‍👨🏻 couple with heart: man, man, medium-light skin tone, light skin tone +👨🏼‍❤️‍👨🏼 couple with heart: man, man, medium-light skin tone +👨🏼‍❤️‍👨🏽 couple with heart: man, man, medium-light skin tone, medium skin tone +👨🏼‍❤️‍👨🏾 couple with heart: man, man, medium-light skin tone, medium-dark skin tone +👨🏼‍❤️‍👨🏿 couple with heart: man, man, medium-light skin tone, dark skin tone +👨🏽‍❤️‍👨🏻 couple with heart: man, man, medium skin tone, light skin tone +👨🏽‍❤️‍👨🏼 couple with heart: man, man, medium skin tone, medium-light skin tone +👨🏽‍❤️‍👨🏽 couple with heart: man, man, medium skin tone +👨🏽‍❤️‍👨🏾 couple with heart: man, man, medium skin tone, medium-dark skin tone +👨🏽‍❤️‍👨🏿 couple with heart: man, man, medium skin tone, dark skin tone +👨🏾‍❤️‍👨🏻 couple with heart: man, man, medium-dark skin tone, light skin tone +👨🏾‍❤️‍👨🏼 couple with heart: man, man, medium-dark skin tone, medium-light skin tone +👨🏾‍❤️‍👨🏽 couple with heart: man, man, medium-dark skin tone, medium skin tone +👨🏾‍❤️‍👨🏾 couple with heart: man, man, medium-dark skin tone +👨🏾‍❤️‍👨🏿 couple with heart: man, man, medium-dark skin tone, dark skin tone +👨🏿‍❤️‍👨🏻 couple with heart: man, man, dark skin tone, light skin tone +👨🏿‍❤️‍👨🏼 couple with heart: man, man, dark skin tone, medium-light skin tone +👨🏿‍❤️‍👨🏽 couple with heart: man, man, dark skin tone, medium skin tone +👨🏿‍❤️‍👨🏾 couple with heart: man, man, dark skin tone, medium-dark skin tone +👨🏿‍❤️‍👨🏿 couple with heart: man, man, dark skin tone +👩‍❤️‍👩 couple with heart: woman, woman +👩🏻‍❤️‍👩🏻 couple with heart: woman, woman, light skin tone +👩🏻‍❤️‍👩🏼 couple with heart: woman, woman, light skin tone, medium-light skin tone +👩🏻‍❤️‍👩🏽 couple with heart: woman, woman, light skin tone, medium skin tone +👩🏻‍❤️‍👩🏾 couple with heart: woman, woman, light skin tone, medium-dark skin tone +👩🏻‍❤️‍👩🏿 couple with heart: woman, woman, light skin tone, dark skin tone +👩🏼‍❤️‍👩🏻 couple with heart: woman, woman, medium-light skin tone, light skin tone +👩🏼‍❤️‍👩🏼 couple with heart: woman, woman, medium-light skin tone +👩🏼‍❤️‍👩🏽 couple with heart: woman, woman, medium-light skin tone, medium skin tone +👩🏼‍❤️‍👩🏾 couple with heart: woman, woman, medium-light skin tone, medium-dark skin tone +👩🏼‍❤️‍👩🏿 couple with heart: woman, woman, medium-light skin tone, dark skin tone +👩🏽‍❤️‍👩🏻 couple with heart: woman, woman, medium skin tone, light skin tone +👩🏽‍❤️‍👩🏼 couple with heart: woman, woman, medium skin tone, medium-light skin tone +👩🏽‍❤️‍👩🏽 couple with heart: woman, woman, medium skin tone +👩🏽‍❤️‍👩🏾 couple with heart: woman, woman, medium skin tone, medium-dark skin tone +👩🏽‍❤️‍👩🏿 couple with heart: woman, woman, medium skin tone, dark skin tone +👩🏾‍❤️‍👩🏻 couple with heart: woman, woman, medium-dark skin tone, light skin tone +👩🏾‍❤️‍👩🏼 couple with heart: woman, woman, medium-dark skin tone, medium-light skin tone +👩🏾‍❤️‍👩🏽 couple with heart: woman, woman, medium-dark skin tone, medium skin tone +👩🏾‍❤️‍👩🏾 couple with heart: woman, woman, medium-dark skin tone +👩🏾‍❤️‍👩🏿 couple with heart: woman, woman, medium-dark skin tone, dark skin tone +👩🏿‍❤️‍👩🏻 couple with heart: woman, woman, dark skin tone, light skin tone +👩🏿‍❤️‍👩🏼 couple with heart: woman, woman, dark skin tone, medium-light skin tone +👩🏿‍❤️‍👩🏽 couple with heart: woman, woman, dark skin tone, medium skin tone +👩🏿‍❤️‍👩🏾 couple with heart: woman, woman, dark skin tone, medium-dark skin tone +👩🏿‍❤️‍👩🏿 couple with heart: woman, woman, dark skin tone +👪 family +👨‍👩‍👦 family: man, woman, boy +👨‍👩‍👧 family: man, woman, girl +👨‍👩‍👧‍👦 family: man, woman, girl, boy +👨‍👩‍👦‍👦 family: man, woman, boy, boy +👨‍👩‍👧‍👧 family: man, woman, girl, girl +👨‍👨‍👦 family: man, man, boy +👨‍👨‍👧 family: man, man, girl +👨‍👨‍👧‍👦 family: man, man, girl, boy +👨‍👨‍👦‍👦 family: man, man, boy, boy +👨‍👨‍👧‍👧 family: man, man, girl, girl +👩‍👩‍👦 family: woman, woman, boy +👩‍👩‍👧 family: woman, woman, girl +👩‍👩‍👧‍👦 family: woman, woman, girl, boy +👩‍👩‍👦‍👦 family: woman, woman, boy, boy +👩‍👩‍👧‍👧 family: woman, woman, girl, girl +👨‍👦 family: man, boy +👨‍👦‍👦 family: man, boy, boy +👨‍👧 family: man, girl +👨‍👧‍👦 family: man, girl, boy +👨‍👧‍👧 family: man, girl, girl +👩‍👦 family: woman, boy +👩‍👦‍👦 family: woman, boy, boy +👩‍👧 family: woman, girl +👩‍👧‍👦 family: woman, girl, boy +👩‍👧‍👧 family: woman, girl, girl +🗣️ speaking head +👤 bust in silhouette +👥 busts in silhouette +🫂 people hugging +👣 footprints +🐵 monkey face +🐒 monkey +🦍 gorilla +🦧 orangutan +🐶 dog face +🐕 dog +🦮 guide dog +🐕‍🦺 service dog +🐩 poodle +🐺 wolf +🦊 fox +🦝 raccoon +🐱 cat face +🐈 cat +🐈‍⬛ black cat +🦁 lion +🐯 tiger face +🐅 tiger +🐆 leopard +🐴 horse face +🐎 horse +🦄 unicorn +🦓 zebra +🦌 deer +🦬 bison +🐮 cow face +🐂 ox +🐃 water buffalo +🐄 cow +🐷 pig face +🐖 pig +🐗 boar +🐽 pig nose +🐏 ram +🐑 ewe +🐐 goat +🐪 camel +🐫 two-hump camel +🦙 llama +🦒 giraffe +🐘 elephant +🦣 mammoth +🦏 rhinoceros +🦛 hippopotamus +🐭 mouse face +🐁 mouse +🐀 rat +🐹 hamster +🐰 rabbit face +🐇 rabbit +🐿️ chipmunk +🦫 beaver +🦔 hedgehog +🦇 bat +🐻 bear +🐻‍❄️ polar bear +🐨 koala +🐼 panda +🦥 sloth +🦦 otter +🦨 skunk +🦘 kangaroo +🦡 badger +🐾 paw prints +🦃 turkey +🐔 chicken +🐓 rooster +🐣 hatching chick +🐤 baby chick +🐥 front-facing baby chick +🐦 bird +🐧 penguin +🕊️ dove +🦅 eagle +🦆 duck +🦢 swan +🦉 owl +🦤 dodo +🪶 feather +🦩 flamingo +🦚 peacock +🦜 parrot +🐸 frog +🐊 crocodile +🐢 turtle +🦎 lizard +🐍 snake +🐲 dragon face +🐉 dragon +🦕 sauropod +🦖 T-Rex +🐳 spouting whale +🐋 whale +🐬 dolphin +🦭 seal +🐟 fish +🐠 tropical fish +🐡 blowfish +🦈 shark +🐙 octopus +🐚 spiral shell +🐌 snail +🦋 butterfly +🐛 bug +🐜 ant +🐝 honeybee +🪲 beetle +🐞 lady beetle +🦗 cricket +🪳 cockroach +🕷️ spider +🕸️ spider web +🦂 scorpion +🦟 mosquito +🪰 fly +🪱 worm +🦠 microbe +💐 bouquet +🌸 cherry blossom +💮 white flower +🏵️ rosette +🌹 rose +🥀 wilted flower +🌺 hibiscus +🌻 sunflower +🌼 blossom +🌷 tulip +🌱 seedling +🪴 potted plant +🌲 evergreen tree +🌳 deciduous tree +🌴 palm tree +🌵 cactus +🌾 sheaf of rice +🌿 herb +☘️ shamrock +🍀 four leaf clover +🍁 maple leaf +🍂 fallen leaf +🍃 leaf fluttering in wind +🍇 grapes +🍈 melon +🍉 watermelon +🍊 tangerine +🍋 lemon +🍌 banana +🍍 pineapple +🥭 mango +🍎 red apple +🍏 green apple +🍐 pear +🍑 peach +🍒 cherries +🍓 strawberry +🫐 blueberries +🥝 kiwi fruit +🍅 tomato +🫒 olive +🥥 coconut +🥑 avocado +🍆 eggplant +🥔 potato +🥕 carrot +🌽 ear of corn +🌶️ hot pepper +🫑 bell pepper +🥒 cucumber +🥬 leafy green +🥦 broccoli +🧄 garlic +🧅 onion +🍄 mushroom +🥜 peanuts +🌰 chestnut +🍞 bread +🥐 croissant +🥖 baguette bread +🫓 flatbread +🥨 pretzel +🥯 bagel +🥞 pancakes +🧇 waffle +🧀 cheese wedge +🍖 meat on bone +🍗 poultry leg +🥩 cut of meat +🥓 bacon +🍔 hamburger +🍟 french fries +🍕 pizza +🌭 hot dog +🥪 sandwich +🌮 taco +🌯 burrito +🫔 tamale +🥙 stuffed flatbread +🧆 falafel +🥚 egg +🍳 cooking +🥘 shallow pan of food +🍲 pot of food +🫕 fondue +🥣 bowl with spoon +🥗 green salad +🍿 popcorn +🧈 butter +🧂 salt +🥫 canned food +🍱 bento box +🍘 rice cracker +🍙 rice ball +🍚 cooked rice +🍛 curry rice +🍜 steaming bowl +🍝 spaghetti +🍠 roasted sweet potato +🍢 oden +🍣 sushi +🍤 fried shrimp +🍥 fish cake with swirl +🥮 moon cake +🍡 dango +🥟 dumpling +🥠 fortune cookie +🥡 takeout box +🦀 crab +🦞 lobster +🦐 shrimp +🦑 squid +🦪 oyster +🍦 soft ice cream +🍧 shaved ice +🍨 ice cream +🍩 doughnut +🍪 cookie +🎂 birthday cake +🍰 shortcake +🧁 cupcake +🥧 pie +🍫 chocolate bar +🍬 candy +🍭 lollipop +🍮 custard +🍯 honey pot +🍼 baby bottle +🥛 glass of milk +☕ hot beverage +🫖 teapot +🍵 teacup without handle +🍶 sake +🍾 bottle with popping cork +🍷 wine glass +🍸 cocktail glass +🍹 tropical drink +🍺 beer mug +🍻 clinking beer mugs +🥂 clinking glasses +🥃 tumbler glass +🥤 cup with straw +🧋 bubble tea +🧃 beverage box +🧉 mate +🧊 ice +🥢 chopsticks +🍽️ fork and knife with plate +🍴 fork and knife +🥄 spoon +🔪 kitchen knife +🏺 amphora +🌍 globe showing Europe-Africa +🌎 globe showing Americas +🌏 globe showing Asia-Australia +🌐 globe with meridians +🗺️ world map +🗾 map of Japan +🧭 compass +🏔️ snow-capped mountain +⛰️ mountain +🌋 volcano +🗻 mount fuji +🏕️ camping +🏖️ beach with umbrella +🏜️ desert +🏝️ desert island +🏞️ national park +🏟️ stadium +🏛️ classical building +🏗️ building construction +🧱 brick +🪨 rock +🪵 wood +🛖 hut +🏘️ houses +🏚️ derelict house +🏠 house +🏡 house with garden +🏢 office building +🏣 Japanese post office +🏤 post office +🏥 hospital +🏦 bank +🏨 hotel +🏩 love hotel +🏪 convenience store +🏫 school +🏬 department store +🏭 factory +🏯 Japanese castle +🏰 castle +💒 wedding +🗼 Tokyo tower +🗽 Statue of Liberty +⛪ church +🕌 mosque +🛕 hindu temple +🕍 synagogue +⛩️ shinto shrine +🕋 kaaba +⛲ fountain +⛺ tent +🌁 foggy +🌃 night with stars +🏙️ cityscape +🌄 sunrise over mountains +🌅 sunrise +🌆 cityscape at dusk +🌇 sunset +🌉 bridge at night +♨️ hot springs +🎠 carousel horse +🎡 ferris wheel +🎢 roller coaster +💈 barber pole +🎪 circus tent +🚂 locomotive +🚃 railway car +🚄 high-speed train +🚅 bullet train +🚆 train +🚇 metro +🚈 light rail +🚉 station +🚊 tram +🚝 monorail +🚞 mountain railway +🚋 tram car +🚌 bus +🚍 oncoming bus +🚎 trolleybus +🚐 minibus +🚑 ambulance +🚒 fire engine +🚓 police car +🚔 oncoming police car +🚕 taxi +🚖 oncoming taxi +🚗 automobile +🚘 oncoming automobile +🚙 sport utility vehicle +🛻 pickup truck +🚚 delivery truck +🚛 articulated lorry +🚜 tractor +🏎️ racing car +🏍️ motorcycle +🛵 motor scooter +🦽 manual wheelchair +🦼 motorized wheelchair +🛺 auto rickshaw +🚲 bicycle +🛴 kick scooter +🛹 skateboard +🛼 roller skate +🚏 bus stop +🛣️ motorway +🛤️ railway track +🛢️ oil drum +⛽ fuel pump +🚨 police car light +🚥 horizontal traffic light +🚦 vertical traffic light +🛑 stop sign +🚧 construction +⚓ anchor +⛵ sailboat +🛶 canoe +🚤 speedboat +🛳️ passenger ship +⛴️ ferry +🛥️ motor boat +🚢 ship +✈️ airplane +🛩️ small airplane +🛫 airplane departure +🛬 airplane arrival +🪂 parachute +💺 seat +🚁 helicopter +🚟 suspension railway +🚠 mountain cableway +🚡 aerial tramway +🛰️ satellite +🚀 rocket +🛸 flying saucer +🛎️ bellhop bell +🧳 luggage +⌛ hourglass done +⏳ hourglass not done +⌚ watch +⏰ alarm clock +⏱️ stopwatch +⏲️ timer clock +🕰️ mantelpiece clock +🕛 twelve o’clock +🕧 twelve-thirty +🕐 one o’clock +🕜 one-thirty +🕑 two o’clock +🕝 two-thirty +🕒 three o’clock +🕞 three-thirty +🕓 four o’clock +🕟 four-thirty +🕔 five o’clock +🕠 five-thirty +🕕 six o’clock +🕡 six-thirty +🕖 seven o’clock +🕢 seven-thirty +🕗 eight o’clock +🕣 eight-thirty +🕘 nine o’clock +🕤 nine-thirty +🕙 ten o’clock +🕥 ten-thirty +🕚 eleven o’clock +🕦 eleven-thirty +🌑 new moon +🌒 waxing crescent moon +🌓 first quarter moon +🌔 waxing gibbous moon +🌕 full moon +🌖 waning gibbous moon +🌗 last quarter moon +🌘 waning crescent moon +🌙 crescent moon +🌚 new moon face +🌛 first quarter moon face +🌜 last quarter moon face +🌡️ thermometer +☀️ sun +🌝 full moon face +🌞 sun with face +🪐 ringed planet +⭐ star +🌟 glowing star +🌠 shooting star +🌌 milky way +☁️ cloud +⛅ sun behind cloud +⛈️ cloud with lightning and rain +🌤️ sun behind small cloud +🌥️ sun behind large cloud +🌦️ sun behind rain cloud +🌧️ cloud with rain +🌨️ cloud with snow +🌩️ cloud with lightning +🌪️ tornado +🌫️ fog +🌬️ wind face +🌀 cyclone +🌈 rainbow +🌂 closed umbrella +☂️ umbrella +☔ umbrella with rain drops +⛱️ umbrella on ground +⚡ high voltage +❄️ snowflake +☃️ snowman +⛄ snowman without snow +☄️ comet +🔥 fire +💧 droplet +🌊 water wave +🎃 jack-o-lantern +🎄 Christmas tree +🎆 fireworks +🎇 sparkler +🧨 firecracker +✨ sparkles +🎈 balloon +🎉 party popper +🎊 confetti ball +🎋 tanabata tree +🎍 pine decoration +🎎 Japanese dolls +🎏 carp streamer +🎐 wind chime +🎑 moon viewing ceremony +🧧 red envelope +🎀 ribbon +🎁 wrapped gift +🎗️ reminder ribbon +🎟️ admission tickets +🎫 ticket +🎖️ military medal +🏆 trophy +🏅 sports medal +🥇 1st place medal +🥈 2nd place medal +🥉 3rd place medal +⚽ soccer ball +⚾ baseball +🥎 softball +🏀 basketball +🏐 volleyball +🏈 american football +🏉 rugby football +🎾 tennis +🥏 flying disc +🎳 bowling +🏏 cricket game +🏑 field hockey +🏒 ice hockey +🥍 lacrosse +🏓 ping pong +🏸 badminton +🥊 boxing glove +🥋 martial arts uniform +🥅 goal net +⛳ flag in hole +⛸️ ice skate +🎣 fishing pole +🤿 diving mask +🎽 running shirt +🎿 skis +🛷 sled +🥌 curling stone +🎯 bullseye +🪀 yo-yo +🪁 kite +🎱 pool 8 ball +🔮 crystal ball +🪄 magic wand +🧿 nazar amulet +🎮 video game +🕹️ joystick +🎰 slot machine +🎲 game die +🧩 puzzle piece +🧸 teddy bear +🪅 piñata +🪆 nesting dolls +♠️ spade suit +♥️ heart suit +♦️ diamond suit +♣️ club suit +♟️ chess pawn +🃏 joker +🀄 mahjong red dragon +🎴 flower playing cards +🎭 performing arts +🖼️ framed picture +🎨 artist palette +🧵 thread +🪡 sewing needle +🧶 yarn +🪢 knot +👓 glasses +🕶️ sunglasses +🥽 goggles +🥼 lab coat +🦺 safety vest +👔 necktie +👕 t-shirt +👖 jeans +🧣 scarf +🧤 gloves +🧥 coat +🧦 socks +👗 dress +👘 kimono +🥻 sari +🩱 one-piece swimsuit +🩲 briefs +🩳 shorts +👙 bikini +👚 woman’s clothes +👛 purse +👜 handbag +👝 clutch bag +🛍️ shopping bags +🎒 backpack +🩴 thong sandal +👞 man’s shoe +👟 running shoe +🥾 hiking boot +🥿 flat shoe +👠 high-heeled shoe +👡 woman’s sandal +🩰 ballet shoes +👢 woman’s boot +👑 crown +👒 woman’s hat +🎩 top hat +🎓 graduation cap +🧢 billed cap +🪖 military helmet +⛑️ rescue worker’s helmet +📿 prayer beads +💄 lipstick +💍 ring +💎 gem stone +🔇 muted speaker +🔈 speaker low volume +🔉 speaker medium volume +🔊 speaker high volume +📢 loudspeaker +📣 megaphone +📯 postal horn +🔔 bell +🔕 bell with slash +🎼 musical score +🎵 musical note +🎶 musical notes +🎙️ studio microphone +🎚️ level slider +🎛️ control knobs +🎤 microphone +🎧 headphone +📻 radio +🎷 saxophone +🪗 accordion +🎸 guitar +🎹 musical keyboard +🎺 trumpet +🎻 violin +🪕 banjo +🥁 drum +🪘 long drum +📱 mobile phone +📲 mobile phone with arrow +☎️ telephone +📞 telephone receiver +📟 pager +📠 fax machine +🔋 battery +🔌 electric plug +💻 laptop +🖥️ desktop computer +🖨️ printer +⌨️ keyboard +🖱️ computer mouse +🖲️ trackball +💽 computer disk +💾 floppy disk +💿 optical disk +📀 dvd +🧮 abacus +🎥 movie camera +🎞️ film frames +📽️ film projector +🎬 clapper board +📺 television +📷 camera +📸 camera with flash +📹 video camera +📼 videocassette +🔍 magnifying glass tilted left +🔎 magnifying glass tilted right +🕯️ candle +💡 light bulb +🔦 flashlight +🏮 red paper lantern +🪔 diya lamp +📔 notebook with decorative cover +📕 closed book +📖 open book +📗 green book +📘 blue book +📙 orange book +📚 books +📓 notebook +📒 ledger +📃 page with curl +📜 scroll +📄 page facing up +📰 newspaper +🗞️ rolled-up newspaper +📑 bookmark tabs +🔖 bookmark +🏷️ label +💰 money bag +🪙 coin +💴 yen banknote +💵 dollar banknote +💶 euro banknote +💷 pound banknote +💸 money with wings +💳 credit card +🧾 receipt +💹 chart increasing with yen +✉️ envelope +📧 e-mail +📨 incoming envelope +📩 envelope with arrow +📤 outbox tray +📥 inbox tray +📦 package +📫 closed mailbox with raised flag +📪 closed mailbox with lowered flag +📬 open mailbox with raised flag +📭 open mailbox with lowered flag +📮 postbox +🗳️ ballot box with ballot +✏️ pencil +✒️ black nib +🖋️ fountain pen +🖊️ pen +🖌️ paintbrush +🖍️ crayon +📝 memo +💼 briefcase +📁 file folder +📂 open file folder +🗂️ card index dividers +📅 calendar +📆 tear-off calendar +🗒️ spiral notepad +🗓️ spiral calendar +📇 card index +📈 chart increasing +📉 chart decreasing +📊 bar chart +📋 clipboard +📌 pushpin +📍 round pushpin +📎 paperclip +🖇️ linked paperclips +📏 straight ruler +📐 triangular ruler +✂️ scissors +🗃️ card file box +🗄️ file cabinet +🗑️ wastebasket +🔒 locked +🔓 unlocked +🔏 locked with pen +🔐 locked with key +🔑 key +🗝️ old key +🔨 hammer +🪓 axe +⛏️ pick +⚒️ hammer and pick +🛠️ hammer and wrench +🗡️ dagger +⚔️ crossed swords +🔫 water pistol +🪃 boomerang +🏹 bow and arrow +🛡️ shield +🪚 carpentry saw +🔧 wrench +🪛 screwdriver +🔩 nut and bolt +⚙️ gear +🗜️ clamp +⚖️ balance scale +🦯 white cane +🔗 link +⛓️ chains +🪝 hook +🧰 toolbox +🧲 magnet +🪜 ladder +⚗️ alembic +🧪 test tube +🧫 petri dish +🧬 dna +🔬 microscope +🔭 telescope +📡 satellite antenna +💉 syringe +🩸 drop of blood +💊 pill +🩹 adhesive bandage +🩺 stethoscope +🚪 door +🛗 elevator +🪞 mirror +🪟 window +🛏️ bed +🛋️ couch and lamp +🪑 chair +🚽 toilet +🪠 plunger +🚿 shower +🛁 bathtub +🪤 mouse trap +🪒 razor +🧴 lotion bottle +🧷 safety pin +🧹 broom +🧺 basket +🧻 roll of paper +🪣 bucket +🧼 soap +🪥 toothbrush +🧽 sponge +🧯 fire extinguisher +🛒 shopping cart +🚬 cigarette +⚰️ coffin +🪦 headstone +⚱️ funeral urn +🗿 moai +🪧 placard +🏧 ATM sign +🚮 litter in bin sign +🚰 potable water +♿ wheelchair symbol +🚹 men’s room +🚺 women’s room +🚻 restroom +🚼 baby symbol +🚾 water closet +🛂 passport control +🛃 customs +🛄 baggage claim +🛅 left luggage +⚠️ warning +🚸 children crossing +⛔ no entry +🚫 prohibited +🚳 no bicycles +🚭 no smoking +🚯 no littering +🚱 non-potable water +🚷 no pedestrians +📵 no mobile phones +🔞 no one under eighteen +☢️ radioactive +☣️ biohazard +⬆️ up arrow +↗️ up-right arrow +➡️ right arrow +↘️ down-right arrow +⬇️ down arrow +↙️ down-left arrow +⬅️ left arrow +↖️ up-left arrow +↕️ up-down arrow +↔️ left-right arrow +↩️ right arrow curving left +↪️ left arrow curving right +⤴️ right arrow curving up +⤵️ right arrow curving down +🔃 clockwise vertical arrows +🔄 counterclockwise arrows button +🔙 BACK arrow +🔚 END arrow +🔛 ON! arrow +🔜 SOON arrow +🔝 TOP arrow +🛐 place of worship +⚛️ atom symbol +🕉️ om +✡️ star of David +☸️ wheel of dharma +☯️ yin yang +✝️ latin cross +☦️ orthodox cross +☪️ star and crescent +☮️ peace symbol +🕎 menorah +🔯 dotted six-pointed star +♈ Aries +♉ Taurus +♊ Gemini +♋ Cancer +♌ Leo +♍ Virgo +♎ Libra +♏ Scorpio +♐ Sagittarius +♑ Capricorn +♒ Aquarius +♓ Pisces +⛎ Ophiuchus +🔀 shuffle tracks button +🔁 repeat button +🔂 repeat single button +▶️ play button +⏩ fast-forward button +⏭️ next track button +⏯️ play or pause button +◀️ reverse button +⏪ fast reverse button +⏮️ last track button +🔼 upwards button +⏫ fast up button +🔽 downwards button +⏬ fast down button +⏸️ pause button +⏹️ stop button +⏺️ record button +⏏️ eject button +🎦 cinema +🔅 dim button +🔆 bright button +📶 antenna bars +📳 vibration mode +📴 mobile phone off +♀️ female sign +♂️ male sign +⚧️ transgender symbol +✖️ multiply +➕ plus +➖ minus +➗ divide +♾️ infinity +‼️ double exclamation mark +⁉️ exclamation question mark +❓ red question mark +❔ white question mark +❕ white exclamation mark +❗ red exclamation mark +〰️ wavy dash +💱 currency exchange +💲 heavy dollar sign +⚕️ medical symbol +♻️ recycling symbol +⚜️ fleur-de-lis +🔱 trident emblem +📛 name badge +🔰 Japanese symbol for beginner +⭕ hollow red circle +✅ check mark button +☑️ check box with check +✔️ check mark +❌ cross mark +❎ cross mark button +➰ curly loop +➿ double curly loop +〽️ part alternation mark +✳️ eight-spoked asterisk +✴️ eight-pointed star +❇️ sparkle +©️ copyright +®️ registered +™️ trade mark +#️⃣ keycap: # +*️⃣ keycap: * +0️⃣ keycap: 0 +1️⃣ keycap: 1 +2️⃣ keycap: 2 +3️⃣ keycap: 3 +4️⃣ keycap: 4 +5️⃣ keycap: 5 +6️⃣ keycap: 6 +7️⃣ keycap: 7 +8️⃣ keycap: 8 +9️⃣ keycap: 9 +🔟 keycap: 10 +🔠 input latin uppercase +🔡 input latin lowercase +🔢 input numbers +🔣 input symbols +🔤 input latin letters +🅰️ A button (blood type) +🆎 AB button (blood type) +🅱️ B button (blood type) +🆑 CL button +🆒 COOL button +🆓 FREE button +ℹ️ information +🆔 ID button +Ⓜ️ circled M +🆕 NEW button +🆖 NG button +🅾️ O button (blood type) +🆗 OK button +🅿️ P button +🆘 SOS button +🆙 UP! button +🆚 VS button +🈁 Japanese “here” button +🈂️ Japanese “service charge” button +🈷️ Japanese “monthly amount” button +🈶 Japanese “not free of charge” button +🈯 Japanese “reserved” button +🉐 Japanese “bargain” button +🈹 Japanese “discount” button +🈚 Japanese “free of charge” button +🈲 Japanese “prohibited” button +🉑 Japanese “acceptable” button +🈸 Japanese “application” button +🈴 Japanese “passing grade” button +🈳 Japanese “vacancy” button +㊗️ Japanese “congratulations” button +㊙️ Japanese “secret” button +🈺 Japanese “open for business” button +🈵 Japanese “no vacancy” button +🔴 red circle +🟠 orange circle +🟡 yellow circle +🟢 green circle +🔵 blue circle +🟣 purple circle +🟤 brown circle +⚫ black circle +⚪ white circle +🟥 red square +🟧 orange square +🟨 yellow square +🟩 green square +🟦 blue square +🟪 purple square +🟫 brown square +⬛ black large square +⬜ white large square +◼️ black medium square +◻️ white medium square +◾ black medium-small square +◽ white medium-small square +▪️ black small square +▫️ white small square +🔶 large orange diamond +🔷 large blue diamond +🔸 small orange diamond +🔹 small blue diamond +🔺 red triangle pointed up +🔻 red triangle pointed down +💠 diamond with a dot +🔘 radio button +🔳 white square button +🔲 black square button +🏁 chequered flag +🚩 triangular flag +🎌 crossed flags +🏴 black flag +🏳️ white flag +🏳️‍🌈 rainbow flag +🏳️‍⚧️ transgender flag +🏴‍☠️ pirate flag +🇦🇨 flag: Ascension Island +🇦🇩 flag: Andorra +🇦🇪 flag: United Arab Emirates +🇦🇫 flag: Afghanistan +🇦🇬 flag: Antigua & Barbuda +🇦🇮 flag: Anguilla +🇦🇱 flag: Albania +🇦🇲 flag: Armenia +🇦🇴 flag: Angola +🇦🇶 flag: Antarctica +🇦🇷 flag: Argentina +🇦🇸 flag: American Samoa +🇦🇹 flag: Austria +🇦🇺 flag: Australia +🇦🇼 flag: Aruba +🇦🇽 flag: Åland Islands +🇦🇿 flag: Azerbaijan +🇧🇦 flag: Bosnia & Herzegovina +🇧🇧 flag: Barbados +🇧🇩 flag: Bangladesh +🇧🇪 flag: Belgium +🇧🇫 flag: Burkina Faso +🇧🇬 flag: Bulgaria +🇧🇭 flag: Bahrain +🇧🇮 flag: Burundi +🇧🇯 flag: Benin +🇧🇱 flag: St. Barthélemy +🇧🇲 flag: Bermuda +🇧🇳 flag: Brunei +🇧🇴 flag: Bolivia +🇧🇶 flag: Caribbean Netherlands +🇧🇷 flag: Brazil +🇧🇸 flag: Bahamas +🇧🇹 flag: Bhutan +🇧🇻 flag: Bouvet Island +🇧🇼 flag: Botswana +🇧🇾 flag: Belarus +🇧🇿 flag: Belize +🇨🇦 flag: Canada +🇨🇨 flag: Cocos (Keeling) Islands +🇨🇩 flag: Congo - Kinshasa +🇨🇫 flag: Central African Republic +🇨🇬 flag: Congo - Brazzaville +🇨🇭 flag: Switzerland +🇨🇮 flag: Côte d’Ivoire +🇨🇰 flag: Cook Islands +🇨🇱 flag: Chile +🇨🇲 flag: Cameroon +🇨🇳 flag: China +🇨🇴 flag: Colombia +🇨🇵 flag: Clipperton Island +🇨🇷 flag: Costa Rica +🇨🇺 flag: Cuba +🇨🇻 flag: Cape Verde +🇨🇼 flag: Curaçao +🇨🇽 flag: Christmas Island +🇨🇾 flag: Cyprus +🇨🇿 flag: Czechia +🇩🇪 flag: Germany +🇩🇬 flag: Diego Garcia +🇩🇯 flag: Djibouti +🇩🇰 flag: Denmark +🇩🇲 flag: Dominica +🇩🇴 flag: Dominican Republic +🇩🇿 flag: Algeria +🇪🇦 flag: Ceuta & Melilla +🇪🇨 flag: Ecuador +🇪🇪 flag: Estonia +🇪🇬 flag: Egypt +🇪🇭 flag: Western Sahara +🇪🇷 flag: Eritrea +🇪🇸 flag: Spain +🇪🇹 flag: Ethiopia +🇪🇺 flag: European Union +🇫🇮 flag: Finland +🇫🇯 flag: Fiji +🇫🇰 flag: Falkland Islands +🇫🇲 flag: Micronesia +🇫🇴 flag: Faroe Islands +🇫🇷 flag: France +🇬🇦 flag: Gabon +🇬🇧 flag: United Kingdom +🇬🇩 flag: Grenada +🇬🇪 flag: Georgia +🇬🇫 flag: French Guiana +🇬🇬 flag: Guernsey +🇬🇭 flag: Ghana +🇬🇮 flag: Gibraltar +🇬🇱 flag: Greenland +🇬🇲 flag: Gambia +🇬🇳 flag: Guinea +🇬🇵 flag: Guadeloupe +🇬🇶 flag: Equatorial Guinea +🇬🇷 flag: Greece +🇬🇸 flag: South Georgia & South Sandwich Islands +🇬🇹 flag: Guatemala +🇬🇺 flag: Guam +🇬🇼 flag: Guinea-Bissau +🇬🇾 flag: Guyana +🇭🇰 flag: Hong Kong SAR China +🇭🇲 flag: Heard & McDonald Islands +🇭🇳 flag: Honduras +🇭🇷 flag: Croatia +🇭🇹 flag: Haiti +🇭🇺 flag: Hungary +🇮🇨 flag: Canary Islands +🇮🇩 flag: Indonesia +🇮🇪 flag: Ireland +🇮🇱 flag: Israel +🇮🇲 flag: Isle of Man +🇮🇳 flag: India +🇮🇴 flag: British Indian Ocean Territory +🇮🇶 flag: Iraq +🇮🇷 flag: Iran +🇮🇸 flag: Iceland +🇮🇹 flag: Italy +🇯🇪 flag: Jersey +🇯🇲 flag: Jamaica +🇯🇴 flag: Jordan +🇯🇵 flag: Japan +🇰🇪 flag: Kenya +🇰🇬 flag: Kyrgyzstan +🇰🇭 flag: Cambodia +🇰🇮 flag: Kiribati +🇰🇲 flag: Comoros +🇰🇳 flag: St. Kitts & Nevis +🇰🇵 flag: North Korea +🇰🇷 flag: South Korea +🇰🇼 flag: Kuwait +🇰🇾 flag: Cayman Islands +🇰🇿 flag: Kazakhstan +🇱🇦 flag: Laos +🇱🇧 flag: Lebanon +🇱🇨 flag: St. Lucia +🇱🇮 flag: Liechtenstein +🇱🇰 flag: Sri Lanka +🇱🇷 flag: Liberia +🇱🇸 flag: Lesotho +🇱🇹 flag: Lithuania +🇱🇺 flag: Luxembourg +🇱🇻 flag: Latvia +🇱🇾 flag: Libya +🇲🇦 flag: Morocco +🇲🇨 flag: Monaco +🇲🇩 flag: Moldova +🇲🇪 flag: Montenegro +🇲🇫 flag: St. Martin +🇲🇬 flag: Madagascar +🇲🇭 flag: Marshall Islands +🇲🇰 flag: North Macedonia +🇲🇱 flag: Mali +🇲🇲 flag: Myanmar (Burma) +🇲🇳 flag: Mongolia +🇲🇴 flag: Macao SAR China +🇲🇵 flag: Northern Mariana Islands +🇲🇶 flag: Martinique +🇲🇷 flag: Mauritania +🇲🇸 flag: Montserrat +🇲🇹 flag: Malta +🇲🇺 flag: Mauritius +🇲🇻 flag: Maldives +🇲🇼 flag: Malawi +🇲🇽 flag: Mexico +🇲🇾 flag: Malaysia +🇲🇿 flag: Mozambique +🇳🇦 flag: Namibia +🇳🇨 flag: New Caledonia +🇳🇪 flag: Niger +🇳🇫 flag: Norfolk Island +🇳🇬 flag: Nigeria +🇳🇮 flag: Nicaragua +🇳🇱 flag: Netherlands +🇳🇴 flag: Norway +🇳🇵 flag: Nepal +🇳🇷 flag: Nauru +🇳🇺 flag: Niue +🇳🇿 flag: New Zealand +🇴🇲 flag: Oman +🇵🇦 flag: Panama +🇵🇪 flag: Peru +🇵🇫 flag: French Polynesia +🇵🇬 flag: Papua New Guinea +🇵🇭 flag: Philippines +🇵🇰 flag: Pakistan +🇵🇱 flag: Poland +🇵🇲 flag: St. Pierre & Miquelon +🇵🇳 flag: Pitcairn Islands +🇵🇷 flag: Puerto Rico +🇵🇸 flag: Palestinian Territories +🇵🇹 flag: Portugal +🇵🇼 flag: Palau +🇵🇾 flag: Paraguay +🇶🇦 flag: Qatar +🇷🇪 flag: Réunion +🇷🇴 flag: Romania +🇷🇸 flag: Serbia +🇷🇺 flag: Russia +🇷🇼 flag: Rwanda +🇸🇦 flag: Saudi Arabia +🇸🇧 flag: Solomon Islands +🇸🇨 flag: Seychelles +🇸🇩 flag: Sudan +🇸🇪 flag: Sweden +🇸🇬 flag: Singapore +🇸🇭 flag: St. Helena +🇸🇮 flag: Slovenia +🇸🇯 flag: Svalbard & Jan Mayen +🇸🇰 flag: Slovakia +🇸🇱 flag: Sierra Leone +🇸🇲 flag: San Marino +🇸🇳 flag: Senegal +🇸🇴 flag: Somalia +🇸🇷 flag: Suriname +🇸🇸 flag: South Sudan +🇸🇹 flag: São Tomé & Príncipe +🇸🇻 flag: El Salvador +🇸🇽 flag: Sint Maarten +🇸🇾 flag: Syria +🇸🇿 flag: Eswatini +🇹🇦 flag: Tristan da Cunha +🇹🇨 flag: Turks & Caicos Islands +🇹🇩 flag: Chad +🇹🇫 flag: French Southern Territories +🇹🇬 flag: Togo +🇹🇭 flag: Thailand +🇹🇯 flag: Tajikistan +🇹🇰 flag: Tokelau +🇹🇱 flag: Timor-Leste +🇹🇲 flag: Turkmenistan +🇹🇳 flag: Tunisia +🇹🇴 flag: Tonga +🇹🇷 flag: Turkey +🇹🇹 flag: Trinidad & Tobago +🇹🇻 flag: Tuvalu +🇹🇼 flag: Taiwan +🇹🇿 flag: Tanzania +🇺🇦 flag: Ukraine +🇺🇬 flag: Uganda +🇺🇲 flag: U.S. Outlying Islands +🇺🇳 flag: United Nations +🇺🇸 flag: United States +🇺🇾 flag: Uruguay +🇺🇿 flag: Uzbekistan +🇻🇦 flag: Vatican City +🇻🇨 flag: St. Vincent & Grenadines +🇻🇪 flag: Venezuela +🇻🇬 flag: British Virgin Islands +🇻🇮 flag: U.S. Virgin Islands +🇻🇳 flag: Vietnam +🇻🇺 flag: Vanuatu +🇼🇫 flag: Wallis & Futuna +🇼🇸 flag: Samoa +🇽🇰 flag: Kosovo +🇾🇪 flag: Yemen +🇾🇹 flag: Mayotte +🇿🇦 flag: South Africa +🇿🇲 flag: Zambia +🇿🇼 flag: Zimbabwe +🏴󠁧󠁢󠁥󠁮󠁧󠁿 flag: England +🏴󠁧󠁢󠁳󠁣󠁴󠁿 flag: Scotland +🏴󠁧󠁢󠁷󠁬󠁳󠁿 flag: Wales \ No newline at end of file diff --git a/defaults/xdg/rofi/gtk-theme.ini b/defaults/xdg/rofi/gtk-theme.ini new file mode 100644 index 0000000..5784c98 --- /dev/null +++ b/defaults/xdg/rofi/gtk-theme.ini @@ -0,0 +1 @@ +GTK_THEME=catppuccin-mocha-lavender-standard+default diff --git a/defaults/xdg/rofi/helper/rofi-bangs.rasi b/defaults/xdg/rofi/helper/rofi-bangs.rasi new file mode 100644 index 0000000..96fa1b1 --- /dev/null +++ b/defaults/xdg/rofi/helper/rofi-bangs.rasi @@ -0,0 +1,291 @@ +/** + * + * Author : Aditya Shakya (adi1090x) + * Github : @adi1090x + * + * Rofi Theme File + * Rofi Version: 1.7.3 + **/ + +/*****----- Configuration -----*****/ +configuration { + modi: "drun,run,filebrowser,window"; + show-icons: true; + drun-display-format: "{name}"; +} + +/*****----- Global Properties -----*****/ +@import "../config.rasi" +@import "../colors.rasi" +@import "../fonts.rasi" + +* { + border-colour: var(border); + handle-colour: var(selected); + background-colour: var(background); + foreground-colour: var(foreground); + alternate-background: var(background-alt); + normal-background: var(background); + normal-foreground: var(foreground); + urgent-background: var(urgent); + urgent-foreground: var(background); + active-background: var(active); + active-foreground: var(background); + selected-normal-background: var(selected); + selected-normal-foreground: var(background); + selected-urgent-background: var(active); + selected-urgent-foreground: var(background); + selected-active-background: var(urgent); + selected-active-foreground: var(background); + alternate-normal-background: var(background); + alternate-normal-foreground: var(foreground); + alternate-urgent-background: var(urgent); + alternate-urgent-foreground: var(background); + alternate-active-background: var(active); + alternate-active-foreground: var(background); +} + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 600px; + x-offset: 0px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + + cursor: "default"; + /* Backgroud Colors */ + background-color: @background-colour; + /* Backgroud Image */ + //background-image: url("/path/to/image.png", none); + /* Simple Linear Gradient */ + //background-image: linear-gradient(red, orange, pink, purple); + /* Directional Linear Gradient */ + //background-image: linear-gradient(to bottom, pink, yellow, magenta); + /* Angle Linear Gradient */ + //background-image: linear-gradient(45, cyan, purple, indigo); +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 30px; + border: 0px solid; + border-radius: 0px 0px 0px 0px; + border-color: @border-colour; + background-color: transparent; + children: [ "message", "listview", "inputbar" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + margin: 0; + padding: 20px 0px 0; + border: 0px solid; + border-radius: 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; + children: [ "textbox-prompt-colon", "entry", "mode-switcher" ]; +} + +prompt { + enabled: true; + background-color: inherit; + text-color: inherit; +} +textbox-prompt-colon { + enabled: true; + padding: 5px 0px 0px 15px; + expand: false; + font: "MonarchOS 14"; + str: ""; + background-color: inherit; + text-color: inherit; +} +entry { + enabled: true; + padding: 5px 0px; + background-color: inherit; + text-color: inherit; + cursor: text; + placeholder: "..."; + placeholder-color: inherit; +} +num-filtered-rows { + enabled: true; + expand: false; + background-color: inherit; + text-color: inherit; +} +textbox-num-sep { + enabled: true; + expand: false; + str: "/"; + background-color: inherit; + text-color: inherit; +} +num-rows { + enabled: true; + expand: false; + background-color: inherit; + text-color: inherit; +} +case-indicator { + enabled: true; + background-color: inherit; + text-color: inherit; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 2; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 5px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; + cursor: "default"; +} +scrollbar { + handle-width: 5px; + handle-color: @handle-colour; + border-radius: 10px; + background-color: transparent; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 0; + margin: 0px; + padding: 5px 10px; + border: 0px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; + cursor: pointer; +} +element normal.normal { + background-color: transparent; + text-color: var(normal-foreground); +} +element normal.urgent { + background-color: var(urgent-background); + text-color: var(urgent-foreground); +} +element normal.active { + background-color: var(normal-foreground); + text-color: var(normal-background); +} +element selected.normal { + background-color: var(selected-normal-background); + text-color: var(normal-foreground); +} +element selected.urgent { + background-color: var(selected-urgent-background); + text-color: var(normal-background); +} +element selected.active { + background-color: var(selected-active-background); + text-color: var(normal-background); +} + +element-icon { + background-color: transparent; + text-color: inherit; + size: 0; + cursor: inherit; +} +element-text { + background-color: transparent; + text-color: inherit; + highlight: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Mode Switcher -----*****/ +mode-switcher{ + enabled: true; + spacing: 10px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; +} +button { + padding: 7px 15px 7px 10px; + border: 0px solid; + border-radius: 100%; + border-color: @border-colour; + background-color: @alternate-background; + text-color: inherit; + cursor: pointer; +} +button selected { + background-color: var(selected-normal-background); + text-color: var(selected-normal-foreground); +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px 0px 0px 0px; + border-color: @border-colour; + background-color: transparent; + text-color: @foreground-colour; +} +textbox { + padding: 8px 10px; + border: 0px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: @alternate-background; + text-color: @foreground-colour; + vertical-align: 0.5; + horizontal-align: 0.0; + highlight: none; + placeholder-color: @foreground-colour; + blink: true; + markup: true; +} +error-message { + padding: 10px; + border: 2px solid; + border-radius: 10px; + border-color: @border-colour; + background-color: @background-colour; + text-color: @foreground-colour; +} diff --git a/defaults/xdg/rofi/launcher/launcher.rasi b/defaults/xdg/rofi/launcher/launcher.rasi new file mode 100644 index 0000000..b0baf74 --- /dev/null +++ b/defaults/xdg/rofi/launcher/launcher.rasi @@ -0,0 +1,16 @@ +@import "../config.rasi" +@import "../colors.rasi" + + + +element { + children: ["element-icon", "element-text"]; +} +element-icon { + size: 32px; +} + +element-text { + vertical-align: 0.5; + horizontal-align: 0.0; +} diff --git a/defaults/xdg/rofi/nm-vpn/nm-vpn.rasi b/defaults/xdg/rofi/nm-vpn/nm-vpn.rasi new file mode 100644 index 0000000..82b16ec --- /dev/null +++ b/defaults/xdg/rofi/nm-vpn/nm-vpn.rasi @@ -0,0 +1,45 @@ +configuration { + modi: "drun"; + show-icons: false; + drun-display-format: "{name}"; +} + +@import "../config.rasi" +@import "../colors.rasi" + + +window { + enabled: true; + cursor: "default"; + width: 300px; + height: 300px; +} + + +mainbox { + children: [ "message", "listview", "inputbar" ]; +} + + +inputbar { + enabled: true; + + children: [ "textbox-prompt-colon", "entry", "mode-switcher" ]; +} + +listview { + enabled: true; + columns: 1; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; +} + +element-icon { + size: 0px; +} \ No newline at end of file diff --git a/defaults/xdg/rofi/powermenu/confirm.rasi b/defaults/xdg/rofi/powermenu/confirm.rasi new file mode 100644 index 0000000..89f2670 --- /dev/null +++ b/defaults/xdg/rofi/powermenu/confirm.rasi @@ -0,0 +1,76 @@ +@import "config.rasi" +@import "colors.rasi" + +configuration { + show-icons: false; +} + +window { + + width:200px; +} + +mainbox { + children: [ "message", "listview"]; +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 8px; + border: 0px solid; + border-radius: 100%; + background-color: transparent; + text-color: var(theme-text-color); +} +textbox { + background-color: inherit; + text-color: inherit; + + placeholder-color: var(theme-text-color); + + font: "JetBrainsMono Nerd Font Bold 12"; +} +error-message { + padding: 12px; + border: 0px solid; + border-radius: 0px; + background-color: var(theme-bg-color); + text-color: var(theme-text-color); +} + +listview { + columns: 2; + lines: 1; + layout:vertical; +} + + +element { + enabled: true; + spacing: 0px; + margin: 0px; + + border: 0px solid; + border-radius: 100%; + background-color: transparent; + + cursor: "pointer"; +} +element-text { + background-color: transparent; + text-color: var(theme-text-color); + cursor: inherit; + horizontal-align: 0.5; + vertical-align:0; + font: "JetBrainsMono Nerd Font 18"; + +} +element selected.normal { + background-color: var(theme-selected-bg-color); + text-color: var(theme-selected-fg-color); +} +element-text selected.normal { + text-color: var(mantle); +} diff --git a/defaults/xdg/rofi/powermenu/powermenu.rasi b/defaults/xdg/rofi/powermenu/powermenu.rasi new file mode 100644 index 0000000..c75bcd7 --- /dev/null +++ b/defaults/xdg/rofi/powermenu/powermenu.rasi @@ -0,0 +1,102 @@ +configuration { + show-icons: false; +} + +@import "../config.rasi" + + +window { + fullscreen: true; + border: none; + border-radius: 0; +} + +mainbox { + enabled: true; + spacing: 15px; + margin: 0px; + padding: 200px; + background-color: transparent; + children: ["inputbar", "listview" ]; + expand: true; +} + + +inputbar { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 12px 19px 12px 16px; + border-radius: 10px; + text-color: var(theme-selected-bg-color); + children: ["textbox-prompt-colon", "prompt"]; + background-color: var(theme-selected-fg-color); + expand: false; +} + + +textbox-prompt-colon { + enabled: true; + expand: false; + str: "󰣇"; + margin: 0; + padding: 0 4px 0 0; + font: "JetBrainsMono Nerd Font 16"; +} +prompt { + padding: 4px 0 0 0; +} + +dummy { + background-color: inherit; +} + + +listview { + enabled: true; + layout: horizontal; + columns: 2; + lines: 5; + cycle: true; + dynamic: false; + scrollbar: false; + reverse: false; + fixed-height: true; + fixed-columns: true; + vertical-align: 0.5; + horizontal-align: 0.5; + spacing: 15px; + background-color: transparent; + text-color: var(theme-text-color); + cursor: "default"; + padding: 0; + margin:0 ; +} + +element { + enabled: true; + spacing: 0px; + margin: 0px; + + border: 0px solid; + border-radius: 10px; + + background-color: transparent; + + cursor: "pointer"; +} +element-text { + font: "JetBrainsMono Nerd Font 28"; + background-color: transparent; + text-color: var(text); + cursor: inherit; + vertical-align: 0; + horizontal-align: 1; + padding: 0 10px; +} +element selected.normal { + background-color: var(theme-selected-bg-color); +} +element-text selected.normal { + text-color: var(theme-bg-color); +} \ No newline at end of file diff --git a/defaults/xdg/rofi/settings-menu/settings-menu.rasi b/defaults/xdg/rofi/settings-menu/settings-menu.rasi new file mode 100644 index 0000000..95d1e03 --- /dev/null +++ b/defaults/xdg/rofi/settings-menu/settings-menu.rasi @@ -0,0 +1,26 @@ +@import "../config.rasi" +@import "../colors.rasi" + + +listview { + columns: 4; + lines: 4; +} + +inputbar { + children: [ "textbox-prompt-colon", "entry"]; +} + +element { + orientation:vertical; + children: ["element-icon", "element-text"]; +} +element-icon { + size: 32px; +} + +element-text { + vertical-align: 0.5; + horizontal-align: 0.5; + font: "JetBrainsMono Nerd Font 9"; +} diff --git a/defaults/xdg/rofi/volume/-volume.rasi b/defaults/xdg/rofi/volume/-volume.rasi new file mode 100644 index 0000000..7c543f5 --- /dev/null +++ b/defaults/xdg/rofi/volume/-volume.rasi @@ -0,0 +1,176 @@ +/** + * + * Author : Aditya Shakya (adi1090x) + * Github : @adi1090x + * + * Rofi Theme File + * Rofi Version: 1.7.3 + * --- + * + * @Modification Dominik Kressler + * @package rofi-archer + * @version 1.0.0 + **/ + +/*****----- Configuration -----*****/ +configuration { + show-icons: false; +} + +/*****----- Global Properties -----*****/ +@import "../colors.rasi" +@import "../fonts.rasi" + +/* +USE_BUTTONS=YES +*/ + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 800px; + x-offset: 0px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 15px; + margin: 0px; + padding: 30px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + children: [ "inputbar", "listview" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 15px; + margin: 0px; + padding: 0px; + border: 0px; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + children: [ "textbox-prompt-colon", "prompt"]; +} + +dummy { + background-color: transparent; +} + +textbox-prompt-colon { + enabled: true; + expand: false; + str: ""; + padding: 12px 20px 12px 16px; + border-radius: 100%; + background-color: @urgent; + text-color: @background; +} +prompt { + enabled: true; + padding: 12px; + border-radius: 100%; + background-color: @active; + text-color: @background; +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 12px; + border: 0px solid; + border-radius: 100%; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + font-weight: bold; +} +textbox { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; + placeholder-color: @foreground; + blink: true; + markup: true; +} +error-message { + padding: 12px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: @background; + text-color: @foreground; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 5; + lines: 1; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 15px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + cursor: "default"; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 0px; + margin: 0px; + padding: 40px 10px; + border: 0px solid; + border-radius: 100%; + border-color: @selected; + background-color: @selected; + text-color: var(background-alt); + cursor: pointer; +} +element-text { + font: "JetBrainsMono Nerd Font bold 32"; + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; +} +element selected.normal { + background-color: var(background-alt); + text-color: @foreground; +} diff --git a/defaults/xdg/rofi/volume/volume.rasi b/defaults/xdg/rofi/volume/volume.rasi new file mode 100644 index 0000000..ed6f979 --- /dev/null +++ b/defaults/xdg/rofi/volume/volume.rasi @@ -0,0 +1,43 @@ +configuration { + modi: "drun"; + show-icons: false; + drun-display-format: "{name}"; +} + +@import "../config.rasi" +@import "../colors.rasi" + + +window { + enabled: true; + cursor: "default"; +} + + +mainbox { + children: [ "message", "listview", "inputbar" ]; +} + + +inputbar { + enabled: true; + + children: [ "textbox-prompt-colon", "entry", "mode-switcher" ]; +} + +listview { + enabled: true; + columns: 1; + lines: 8; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; +} + +element-icon { + size: 0px; +} \ No newline at end of file diff --git a/defaults/xdg/waybar/config b/defaults/xdg/waybar/config new file mode 100644 index 0000000..499e1e3 --- /dev/null +++ b/defaults/xdg/waybar/config @@ -0,0 +1,559 @@ +{ + "__aboutme1": "Moonarch default waybar configuration for Niri.", + "__aboutme2": "User overrides go in ~/.config/waybar/config", + "layer": "top", + "margin-top": 0, + "spacing": 5, + "fixed-center": true, + "modules-left": [ + "group/sys", + "niri/workspaces", + "tray", + "wlr/taskbar", + "niri/window" + ], + "modules-center": [ + + ], + "modules-right": [ + "mpris", + "custom/cpugov", + "group/net", + "group/sound", + "backlight", + "battery", + "group/indicators" + ], + "group/indicators": { + "orientation": "inherit", + "modules": [ + "gamemode", + //"custom/updates", + "idle_inhibitor", + "custom/dnd", + "privacy" + ] + }, + "group/net": { + "orientation": "inherit", + "modules": [ + "custom/vpn", + "network", + "bluetooth" + ] + }, + "group/stats": { + "orientation": "inherit", + "modules": [ + "custom/cpugov", + "cpu", + "memory", + "custom/gpu-usage" + ], + "drawer": { + "transition-duration": 500, + "transition-left-to-right": false + } + }, + "group/sound": { + "orientation": "inherit", + "modules": [ + "pulseaudio", + "pulseaudio/slider" + ], + "drawer": { + "transition-duration": 500, + "transition-left-to-right": true + } + }, + "group/sys": { + "orientation": "inherit", + "modules": [ + "custom/power", + "clock" + ] + }, + "network": { + "format-wifi": "{icon}", + "format-ethernet": " {ifname}", + "format-disconnected": "󰱟 Offline", + "tooltip-format": "󰊗 {ifname} via {gwaddr}", + "tooltip-format-wifi": " WiFi {essid} ({signalStrength}%)", + "tooltip-format-ethernet": "󰱔 {ifname}", + "tooltip-format-disconnected": "Disconnected", + "on-click": "nm-connection-editor", + "format-icons": [ + "󱛅", + "󱛂", + "󱛃", + "󱚽" + ], + "max-length": 5 + }, + "tray": { + "icon-size": 15, + "spacing": 10 + }, + "clock": { + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%d.%m.%Y %H:%M}", + "format": "{:%d.%m. %H:%M}", + "timezone": "DE", + "calendar": { + "mode": "month", + "mode-mon-col": 3, + "weeks-pos": "right", + "on-scroll": 1, + "on-click-right": "mode", + "format": { + "months": "{}", + "days": "{}", + "weeks": "W{}", + "weekdays": "{}", + "today": "{}" + } + }, + "actions": { + "on-click-right": "mode", + "on-click-forward": "tz_up", + "on-click-backward": "tz_down", + "on-scroll-up": "shift_up", + "on-scroll-down": "shift_down", + "on-click-middle": "alarm-clock-applet" + } + // "on-click": "evolution" + }, + "user": { + "format": "{user}", + "interval": 240, + "icon": false, + "height": 16, + "width": 16, + "open-on-click": false + }, + "pulseaudio": { + "format": "{format_source} {icon} {volume}%", + "format-bluetooth": "{icon} {volume}% {format_source}", + "format-bluetooth-muted": "{icon} {format_source}", + "format-muted": "{icon} 0%", + "format-source": "", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": [ + "", + "", + "󰕾" + ] + }, + "on-click": "moonarch-sink-switcher &", + "on-click-right": "pavucontrol", + "scroll-step": 5.0, + "max-volume": 99 + }, + "pulseaudio/slider": { + "min": 0, + "max": 99, + "orientation": "horizontal" + }, + "mpris": { + "format": "⏸ {title:.10}", + "format-paused": "▶ {player}", + "player-icons": { + "default": "⏸", + "mpv": "🎵", + "spotify": "", + "firefox": "󰈹", + "mercury": "󰈹" + }, + "status-icons": { + "paused": "⏸" + } + }, + "custom/power": { + "format": "󰣇", + "menu": "on-click", + "menu-file": "~/.config/waybar/session_menu.xml", + "menu-actions": { + "lock": "gtklock", + "logout": "niri msg action quit", + "hibernate": "systemctl hibernate", + "reboot": "systemctl reboot", + "suspend": "systemctl suspend", + "shutdown": "systemctl poweroff" + } + }, + "gamemode": { + "format": "{glyph}{count}", + "format-alt": "{glyph}", + "glyph": "", + "hide-not-running": true, + "use-icon": true, + "icon-name": "input-gaming-symbolic", + "icon-spacing": 1, + "icon-size": 12, + "tooltip": true, + "tooltip-format": "Games running: {count}" + }, + "wlr/taskbar": { + "markup": true, + "format": "{icon}", + "icon-size": 16, + "tooltip-format": "{title:.100}", + // "sort-by-app-id": true, + "on-click": "activate", + "on-click-middle": "close", + "on-right-middle": "minimize-raise", + "ignore-list": ["title<>"], + "app_ids-mapping": { + "firefoxdeveloperedition": "firefox-developer-edition" + }, + "rewrite": { + "Mozilla Firefox": "Firefox", + "firefox": "Firefox", + "VSCodium": "Code", + "codium": "Code", + "Alacritty": "Terminal", + }, + "squash-list": [ + "firefox" + ] + }, + "custom/updates": { + "format": "{icon}", + "return-type": "json", + "format-icons": { + "has-updates": "󱍷", + "updated": "󰂪" + }, + "exec-if": "which waybar-module-pacman-updates", + "exec": "waybar-module-pacman-updates", + "on-click": "alacritty paru" + }, + "custom/dnd": { + "format": " {} ", + "exec": "moonarch-dnd", + "return-type": "json", + "on-click": "dunstctl set-paused toggle", + "restart-interval": 1, + }, + "custom/notification": { + "tooltip": false, + "format": "{icon} {}", + "format-icons": { + "notification": "󰂞", + "none": "󰂜", + "dnd-notification": "󰂛", + "dnd-none": "󰂛", + "inhibited-notification": "󰂜", + "inhibited-none": "󰂜", + "dnd-inhibited-notification": "󰂛", + "dnd-inhibited-none": "󰂛" + }, + "return-type": "json", + "exec-if": "which swaync-client", + "exec": "swaync-client -swb", + "on-click": "sh -c 'sleep 0.1s; swaync-client -t -sw; sleep 0.1s'", + "on-click-right": "swaync-client -d -sw", + "escape": true + }, + "cava": { + // "cava_config": "$XDG_CONFIG_HOME/cava/cava.conf", + "framerate": 30, + "autosens": 1, + //"sensitivity": 50, + "bars": 2, + "lower_cutoff_freq": 50, + "higher_cutoff_freq": 10000, + "method": "pipewire", + "source": "auto", + "stereo": true, + "reverse": false, + "bar_delimiter": 0, + "monstercat": true, + "hide_on_silence": true, + "waves": true, + "noise_reduction": 0.77, + "input_delay": 2, + "sleep_timer": 5, + "format-icons": [ + "▁", + "▂", + "▃", + "▄", + "▅", + "▆", + "▇", + "█" + ], + "actions": { + "on-click-right": "mode" + } + }, + "cpu": { + "interval": 10, + "format": "CPU {icon}", + "max-length": 10, + "format-icons": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "memory": { + "interval": 30, + "format": "MEM {icon}", + "max-length": 10, + "tooltip": true, + "format-icons": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "custom/cpugov": { + "exec": "moonarch-waybar-cpugov", + "return-type": "json", + "restart-interval": 10, + "on-click": "moonarch-cpugov" + }, + "custom/gpu-usage": { + "exec": "moonarch-waybar-gpustat", + "return-type": "json", + "restart-interval": 10 + }, + "battery": { + "interval": 60, + "states": { + "warning": 30, + "critical": 15 + }, + "format": "{capacity}% {icon}", + "format-icons": [ + "", + "", + "", + "", + "" + ], + "max-length": 25 + }, + "bluetooth": { + // "controller": "controller1", // specify the alias of the controller if there are more than 1 on the system + "format": " {status}", + "format-disabled": "󰂲", // an empty format will hide the module + "format-connected": "{num_connections}", + "tooltip-format": "{controller_alias}\t{controller_address}", + "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{device_enumerate}\t{device_battery_percentage}%", + "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}", + "on-click": "blueberry" + }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "󱎴", + "deactivated": "󰷛" + }, + "tooltip-format-activated": "󱎴 No Lockscreen on idle", + "tooltip-format-deactivated": "󰷛 Lockscreen on idle" + }, + "custom/vpn": { + "format": "󰖂", + "exec": "echo '{\"class\": \"connected\", \"tooltip\": \"VPN Connected\"}'", + "exec-if": "test -d /proc/sys/net/ipv4/conf/tun0", + "return-type": "json", + "interval": 5 + }, + "power-profiles-daemon": { + "format": "{icon}", + "tooltip-format": "Power profile: {profile}\nDriver: {driver}", + "tooltip": true, + "format-icons": { + "default": "󰓅", + "performance": "󰓅", + "balanced": "󰾅", + "power-saver": "󰌪" + } + }, + "privacy": { + "icon-spacing": 4, + "icon-size": 12, + "transition-duration": 250, + "modules": [ + { + "type": "screenshare", + "tooltip": true, + "tooltip-icon-size": 12 + }, + { + "type": "audio-out", + "tooltip": true, + "tooltip-icon-size": 12 + }, + { + "type": "audio-in", + "tooltip": true, + "tooltip-icon-size": 12 + } + ] + }, + "niri/workspaces": { + "format": "{icon}", + "format-icons": { + // Named workspaces + // (you need to configure them in niri) + "browser": "", + "discord": "", + "chat": "", + + // Icons by state + "active": "", + "default": "" + } + }, + "niri/window": { + "format": "{}", + "rewrite": { + "(.*) - Mozilla Firefox": "🌎 $1", + "(.*) - zsh": "> [$1]" + } + }, + "backlight": { + "device": "intel_backlight", + "format": "{percent}% {icon}", + "format-icons": ["", ""] + }, + "backlight/slider": { + "min": 10, + "max": 100, + "orientation": "horizontal", + "device": "intel_backlight" + }, + "cffi/niri-workspaces-enhanced": { + // Make sure to set the path to the install location on your system + // "module_path": "~/.config/waybar/niri-workspaces-enhanced.so", + "module_path": "/usr/lib/waybar/libwaybar_niri_workspaces_enhanced.so", + // Format string for workspace labels. Available placeholders: + // {index} - Workspace index number + // {name} - Workspace name (might be empty) + // {index-and-name} - Index followed by name if present (e.g., "1 Work") + // {value} - Name if present, otherwise index + // {separator} - ": " when icons are present, "" when empty + // {window-icons} - Formatted icons for windows in workspace + "format": "{window-icons}", + // Apply separate styles to icons depending on current state + "window-icon-format": { + "default": "{icon}", + "urgent": "{icon}", + "focused": "{icon}", + }, + // A mapping from window app_id to icon. Note that this module does + // case-insensitive matching of app_ids, so capitalization doesn't matter. + "window-icons": { + "com.mitchellh.ghostty": "", + "darktable": "", + "foot": "", + "google-chrome": "", + "spotify": "", + "steam": "", + }, + // If no icon is found for a window, the default is used instead + "window-icon-default": "*", + }, + "height": 40, + }, + "cffi/niri-windows": { + // path where you placed the .so file + "module_path": "/usr/lib/waybar-niri-windows.so", + // configure the module's behavior + "options": { + // set the module mode + // "graphical" (default): draw a minimap of windows in the current workspace + // "text": draws symbols and a focus indicator for each column (mirrors v1 behavior) + "mode": "graphical", + + // ======= graphical mode options ======= + // when to show floating windows + // - "always": always show floating window view, even if there are no floating windows + // - "auto" (default): show floating window view if there are floating windows on the current workspace + // - "never": never show floating windows + "show-floating": "auto", + // pick where the floating windows be shown relative to tiled windows + // - "left": show floating windows on the left + // - "right" (default): show floating windows on the right + "floating-position": "right", + // set minimum size of windows, in pixels (default: 1, minimum: 1) + // if this value is too large to fit all windows (e.g. in a column with many windows), + // it will be reduced + "minimum-size": 1, + // set spacing between windows/columns, in pixels (default: 1, minimum: 0) + // if this value is too large, it will be reduced + "spacing": 1, + // set minimum size of windows, in pixels, to draw icons for (default: 0, minimum: 0) + // if unset or 0, icons will only be drawn for tiled windows that are the only one in their column + // if 1+, icons will be drawn for all windows where w >= icon-minimum-size and h >= icon-minimum-size + // icons must be set in the "rules" section below for this to have any effect + "icon-minimum-size": 0, + // account for borders when calculating window sizes; see note below (default: 0, minimum: 0) + "column-borders": 0, // border on .column + "floating-borders": 0, // border on .floating + // trigger actions on tile click (see https://yalter.github.io/niri/niri_ipc/enum.Action.html for available actions) + // only actions that take a single window ID are supported + // set to an empty string to disable + "on-tile-click": "FocusWindow", // (default: FocusWindow) + "on-tile-middle-click": "CloseWindow", // (default: CloseWindow) + "on-tile-right-click": "", // (default: none) + // add CSS classes/icons to windows based on their App ID/Title (see `niri msg windows`) + // Go regular expression syntax is supported for app-id and title (see https://pkg.go.dev/regexp/syntax) + // rules are checked in the order they are defined - first match wins and checking stops + // set "continue" to true to also check and apply subsequent rules even if this rule matches + // if multiple rules with icons are applied, the first one will be used + // *icons are not drawn for floating windows by default*; set "icon-minimum-size" to enable (see above) + "rules": [ + // .alacritty will be added to all windows with the App ID "Alacritty" + // will be drawn in windows that match + { "app-id": "Alacritty", "class": "alacritty", "icon": "" }, + // .firefox will be added to all windows with the App ID "firefox" + // subsequent rules are also checked and applied for firefox windows + { "app-id": "firefox", "class": "firefox", "continue": true }, + // .youtube-music will be added to all windows that have "YouTube Music" at the end of their title + // will be drawn in windows that match + { "title": "YouTube Music$", "class": "youtube-music", "icon": "" } + ], + + // ======= text mode options ======= + // customize the symbols used to draw the columns/windows + "symbols": { + "unfocused": "⋅", + "focused": "⊙", + "unfocused-floating": "∗", + "focused-floating": "⊛", + // text to display when there are no windows on the current workspace + // if this is an empty string (default), the module will be hidden when there are no windows + "empty": "" + } + }, + "actions": { + // use niri IPC action names to trigger them (see https://yalter.github.io/niri/niri_ipc/enum.Action.html for available actions) + // any action that has no fields is supported + "on-scroll-up": "FocusColumnLeft", + "on-scroll-down": "FocusColumnRight" + // in graphical mode, don't configure click actions here—they're handled by the module above + } + } +} \ No newline at end of file diff --git a/defaults/xdg/waybar/power_menu.xml b/defaults/xdg/waybar/power_menu.xml new file mode 100644 index 0000000..3d021f5 --- /dev/null +++ b/defaults/xdg/waybar/power_menu.xml @@ -0,0 +1,28 @@ + + + + + + Suspend + + + + + Hibernate + + + + + Shutdown + + + + + + + + Reboot + + + + \ No newline at end of file diff --git a/defaults/xdg/waybar/session_menu.xml b/defaults/xdg/waybar/session_menu.xml new file mode 100644 index 0000000..b6a6f79 --- /dev/null +++ b/defaults/xdg/waybar/session_menu.xml @@ -0,0 +1,36 @@ + + + + + +  Lock + + + + + 󰗽 Logout + + + + + 󰤄 Hibernate + + + + + 󰑐 Reboot + + + + + + + + + + +  Shutdown + + + + \ No newline at end of file diff --git a/defaults/xdg/waybar/style.css b/defaults/xdg/waybar/style.css new file mode 100644 index 0000000..6429bb1 --- /dev/null +++ b/defaults/xdg/waybar/style.css @@ -0,0 +1,351 @@ +/* ABOUTME: Moonarch default waybar stylesheet with Catppuccin Mocha inspired styling. */ +/* ABOUTME: User overrides go in ~/.config/waybar/style.css */ + +* { + border: none; + font-family: "Ubuntu Nerd Font", sans-serif; + font-size: 13px; + color: alpha(@theme_text_color, 0.8); +} + +window#waybar { + /*background: transparent;*/ + background: alpha(@theme_selected_fg_color, 0.2); +} + +/*-----main groups----*/ +.modules-right { + margin: 0; + padding-left: 5px; + padding-right: 0; + border-radius: 0; + +} + +.modules-center { + margin: 0; + border-radius: 0; +} + +.modules-left { + margin: 0 0 0 5px; + /* background-color:alpha(@theme_selected_bg_color, 0.15); + background: @theme_bg_color */ + border-radius: 0; + margin-left: 5px; +} + +/** +## ALL MODULES +**/ +#clock, +#battery, +#backlight, +#cpu, +#memory, +#bluetooth, +#temperature, +#network, +#pulseaudio, +#tray, +#mode, +#idle_inhibitor, +#workspaces, +#custom-power, +#custom-menu, +#custom-media, +#custom-notification, +#custom-updates, +#custom-pacman, +#user, +#cava, +#custom-gpu-usage, +#custom-cpugov, +#custom-vpn.connected, +#power-profiles-daemon, +#privacy, +#gamemode, +#taskbar, +#window { + padding: 0px 10px; +} + +/** +* GROUPS +**/ +#sys, +#stats, +#net, +#sound { + margin: 0; + color: alpha(@theme_text_color, 0.5); +} + + +/** +* SYS +**/ +#sys { + padding: 0 0px 0 10px; +} + +#custom-power { + margin-left: 0; + margin-right: 0; + padding-left: 0; +} + +#user { + padding-left: 0; + font-weight: bold; +} + +#custom-weather { + padding-left: 5px; +} + + +#stats .drawer-child { + padding-left: 10px; + padding-right: 10px; +} + +#tray { + border-radius: 4px; + padding: 0px 8px 0px 8px; + margin: 8px 0px 8px 0px; + background-color: alpha(@theme_selected_bg_color, 0.1); +} + +#custom-notification { + padding-right: 0 +} + +/** +* SOUND +**/ + +#cava { + background-color: transparent; + padding-left: 0; +} + +#pulseaudio-slider { + padding-left: 10px; + padding-right: 10px; +} + +#pulseaudio-slider slider { + min-height: 0px; + min-width: 0px; + opacity: 0; + background-image: none; + border: none; + box-shadow: none; + background-color: @insensitive_bg_color; + border: 1px solid alpha(@theme_selected_bg_color, 0.1); +} + +#pulseaudio-slider trough { + min-height: 4px; + min-width: 80px; + border-radius: 5px; + background-color: alpha(@theme_selected_bg_color, 0.3); +} + +#pulseaudio-slider highlight { + + min-width: 5px; + border-radius: 5px; + background-color: #6c7086; +} + +#custom-updates { + padding-right: 5px; + padding-left: 5px; +} + + +/** +* MISC +**/ +#mpris { + border-radius: 0; + margin: 8px 10px 8px 0px; + padding: 0 10px; +} + +/** +* WORKSPACES +**/ +/*#workspaces { + padding: 0; + border-radius: 0 +} + +#workspaces button { + padding: 0px 10px 0px 8px; + margin: 8px 2px 8px 0px; + outline: none; + border-radius: 4px; + background-color: alpha(@theme_selected_bg_color, 0.05); +} + +#workspaces button:last-child { + margin-right: 0; +} + +#workspaces button.empty, +#workspaces button.active.empty { + color: inherit; + padding: 0px 0px 0px 8px; +} + +#workspaces button.active { + background-color: transparent; + padding: 0px 10px 0px 8px; +} + +#workspaces button.visible { + background-color: alpha(@theme_selected_bg_color, 0.1); +} + +#workspaces button.urgent { + color: #cc3436; +} + +#workspaces button:hover { + background-color: alpha(@theme_selected_bg_color, 0.05); + box-shadow: inherit; + text-shadow: inherit; +}*/ + +#workspaces { + padding: 0; + border-radius: 0; + +} + +#workspaces button { + margin: 8px 2px 8px 0px; + padding: 0; + outline: none; + border-radius: 4px; + background-color: alpha(@theme_selected_bg_color, 0.05); +} + +#workspaces button:last-child { + margin-right: 0; +} + +#workspaces button.empty, +#workspaces button.active.empty { + color: inherit; +} + +#workspaces button.active {} + +#workspaces button.visible { + background-color: alpha(@theme_selected_bg_color, 0.1); +} + +#workspaces button.urgent { + color: #cc3436; +} + +#workspaces button:hover { + background-color: alpha(@theme_selected_bg_color, 0.05); + box-shadow: inherit; + text-shadow: inherit; +} + + +/** +## INDICATORS +**/ +#pulseaudio.muted { + color: #cc3436; +} + +#battery.charging { + color: #2dcc36; +} + +#battery.warning:not(.charging) { + color: #e6e600; +} + +#battery.critical:not(.charging) { + color: #cc3436; +} + +#temperature.critical { + color: #cc3436; +} + +#idle_inhibitor.activated { + color: alpha(@theme_selected_bg_color, 0.9); +} + +#indicators { + padding-right: 5px; + padding-left: 5px; + border-radius: 0; +} + + +/** +* TASKBAR +**/ +#taskbar { + font-size: 8px; + margin: 0 0 0 5px; + opacity: 1; + padding: 0; + border-radius: 0; +} + +#taskbar.empty { + opacity: 0; +} + +#taskbar button { + padding: 3px 10px 3px 10px; + transition: 100ms border ease-in-out; + border-radius: 0; + font-size: 8px; +} + +#taskbar button:not(:first-child) { + border-radius: 0px; +} + +#taskbar button:first-child {} + +#taskbar button:last-child {} + +#taskbar button:last-child:first-child {} + +#taskbar button.empty { + opacity: 0; +} + +#taskbar button:hover { + + background-color: alpha(@theme_selected_bg_color, 0.1); +} + +#taskbar button.active { + background-color: alpha(@theme_selected_bg_color, 0.05); + opacity: 1; +} + + +menu { + border-radius: 4px; +} + +menuitem { + border-radius: 4px; + +} diff --git a/defaults/xdg/waypaper/config.ini b/defaults/xdg/waypaper/config.ini new file mode 100644 index 0000000..dd26f65 --- /dev/null +++ b/defaults/xdg/waypaper/config.ini @@ -0,0 +1,29 @@ +# ABOUTME: Moonarch default waypaper configuration. +# ABOUTME: User overrides go in ~/.config/waypaper/config.ini + +[Settings] +language = en +folder = ~/Pictures/Wallpaper +monitors = All +wallpaper = /usr/share/moonarch/wallpaper.jpg +backend = swww +fill = fill +sort = name +color = #ffffff +subfolders = False +show_hidden = False +show_gifs_only = False +show_transition_options = True +post_command = +number_of_columns = 3 +swww_transition_type = any +swww_transition_step = 90 +swww_transition_angle = 0 +swww_transition_duration = 2 +swww_transition_fps = 60 +use_xdg_state = False +show_path_in_tooltip = True +all_subfolders = False +mpvpaper_sound = False +mpvpaper_options = +zen_mode = False diff --git a/defaults/xdg/wlogout/layout b/defaults/xdg/wlogout/layout new file mode 100644 index 0000000..9eb7a3f --- /dev/null +++ b/defaults/xdg/wlogout/layout @@ -0,0 +1,38 @@ +// ABOUTME: Moonarch default wlogout layout. +// ABOUTME: User overrides go in ~/.config/wlogout/layout +{ + "label" : "lock", + "action" : "gtklock", + "text" : "Lock", + "keybind" : "l" +} +{ + "label" : "hibernate", + "action" : "systemctl hibernate", + "text" : "Hibernate", + "keybind" : "h" +} +{ + "label" : "logout", + "action" : "niri msg action quit", + "text" : "Logout", + "keybind" : "e" +} +{ + "label" : "shutdown", + "action" : "systemctl poweroff", + "text" : "Shutdown", + "keybind" : "s" +} +{ + "label" : "suspend", + "action" : "systemctl suspend", + "text" : "Suspend", + "keybind" : "u" +} +{ + "label" : "reboot", + "action" : "systemctl reboot", + "text" : "Reboot", + "keybind" : "r" +} diff --git a/packages/aur.txt b/packages/aur.txt new file mode 100644 index 0000000..18952e0 --- /dev/null +++ b/packages/aur.txt @@ -0,0 +1,28 @@ +# ABOUTME: Liste der AUR-Pakete, die nach der Basisinstallation via paru installiert werden. +# ABOUTME: Wird von post-install.sh verwendet. + +# AUR Helper (wird zuerst manuell gebaut) +# paru + +# Theming +catppuccin-gtk-theme-mocha +newaita-reborn-icons-git + +# Niri / Wayland Extras +rofi-lbonn-wayland-git +waybar-niri-windows-bin +waybar-niri-workspaces-enhanced-git +waypaper +wdisplays-git +wl-color-picker +wlogout +gtklock-dpms-module + +# Anwendungen +blueberry +waterfox-bin + +# System & Tools +auto-cpufreq +stasis +timeshift-autosnap diff --git a/packages/official.txt b/packages/official.txt new file mode 100644 index 0000000..c8d7357 --- /dev/null +++ b/packages/official.txt @@ -0,0 +1,101 @@ +# ABOUTME: Liste der offiziell installierten Pakete aus den Arch-Repos. +# ABOUTME: Wird von archinstall und post-install.sh verwendet. + +# Base +base +base-devel +linux-firmware +efibootmgr +btrfs-progs +man-db +cpio +unzip +zip + +# Shell & Terminal +zsh +foot +foot-terminfo +bat +btop +eza +fastfetch +fd +fzf +jq +ripgrep +lazygit + +# Netzwerk +networkmanager +network-manager-applet +networkmanager-openvpn +openvpn +smbclient +sshfs +nmap +wget + +# Audio (PipeWire) +pipewire +pipewire-alsa +pipewire-jack +pipewire-pulse +wireplumber +libpulse +gst-plugin-pipewire +alsa-utils +pavucontrol + +# Wayland / Niri +niri +xwayland-satellite + +# Desktop-Utilities +waybar +dunst +cliphist +swww +brightnessctl +gtklock +gtklock-playerctl-module +gtklock-powerbar-module +gtklock-userinfo-module +nwg-look +greetd +greetd-regreet +polkit-gnome + +# Dateimanager / XDG +gvfs +gvfs-dnssd +gvfs-mtp +gvfs-smb +udisks2 +ntfs-3g +xdg-desktop-portal-gnome +xdg-desktop-portal-gtk +qt6-5compat + +# Themes & Fonts +ttf-hack-nerd + +# Anwendungen +viewnior + +# Entwicklung +git +glab +go +neovim +npm +rustup +stow + +# System +docker +docker-compose +fwupd +plocate +timeshift +ufw diff --git a/scripts/install-themes.sh b/scripts/install-themes.sh new file mode 100755 index 0000000..29d9312 --- /dev/null +++ b/scripts/install-themes.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# ABOUTME: Installiert Themes die nicht via Pakete verfügbar sind (Cursor-Theme). +# ABOUTME: Wird von post-install.sh aufgerufen. + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +log() { + echo -e "\e[1;34m[Moonarch]\e[0m $*" +} + +# --- Sweet-cursors --- +CURSOR_DEST="/usr/share/icons/Sweet-cursors" + +if [[ -d "$CURSOR_DEST" ]]; then + log "Sweet-cursors bereits installiert." +else + log "Installiere Sweet-cursors..." + TMPDIR=$(mktemp -d) + git clone --depth 1 https://github.com/EliverLara/Sweet.git "$TMPDIR/sweet" + + if [[ -d "$TMPDIR/sweet/kde/cursors/Sweet-cursors" ]]; then + sudo cp -r "$TMPDIR/sweet/kde/cursors/Sweet-cursors" "$CURSOR_DEST" + log "Sweet-cursors nach $CURSOR_DEST installiert." + else + echo "Cursor-Verzeichnis nicht gefunden im Repository." >&2 + echo "Bitte manuell installieren: https://github.com/EliverLara/Sweet" >&2 + fi + + rm -rf "$TMPDIR" +fi diff --git a/scripts/post-install.sh b/scripts/post-install.sh new file mode 100755 index 0000000..7f71442 --- /dev/null +++ b/scripts/post-install.sh @@ -0,0 +1,190 @@ +#!/bin/bash +# ABOUTME: Post-Install-Script für Moonarch — installiert Pakete, Defaults und konfiguriert das System. +# ABOUTME: Wird nach der archinstall-Basisinstallation als normaler User ausgeführt. + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" +OFFICIAL_PACKAGES="$PROJECT_DIR/packages/official.txt" +AUR_PACKAGES="$PROJECT_DIR/packages/aur.txt" +DEFAULTS_DIR="$PROJECT_DIR/defaults" + +# --- Hilfsfunktionen --- + +log() { + echo -e "\e[1;34m[Moonarch]\e[0m $*" +} + +err() { + echo -e "\e[1;31m[Moonarch FEHLER]\e[0m $*" >&2 +} + +read_packages() { + grep -v '^\s*#' "$1" | grep -v '^\s*$' +} + +# --- Voraussetzungen prüfen --- + +if [[ $EUID -eq 0 ]]; then + err "Bitte NICHT als root ausführen. Das Script nutzt sudo wo nötig." + exit 1 +fi + +if ! command -v pacman &>/dev/null; then + err "pacman nicht gefunden — ist das wirklich Arch Linux?" + exit 1 +fi + +# --- Offizielle Pakete installieren --- + +log "Installiere offizielle Pakete..." +if [[ -f "$OFFICIAL_PACKAGES" ]]; then + # shellcheck disable=SC2046 + sudo pacman -S --needed --noconfirm $(read_packages "$OFFICIAL_PACKAGES") +else + err "Paketliste nicht gefunden: $OFFICIAL_PACKAGES" + exit 1 +fi + +# --- paru installieren (AUR Helper) --- + +if ! command -v paru &>/dev/null; then + log "Installiere paru..." + PARU_TMPDIR=$(mktemp -d) + git clone https://aur.archlinux.org/paru.git "$PARU_TMPDIR/paru" + (cd "$PARU_TMPDIR/paru" && makepkg -si --noconfirm) + rm -rf "$PARU_TMPDIR" +else + log "paru bereits installiert." +fi + +# --- AUR-Pakete installieren --- + +log "Installiere AUR-Pakete..." +if [[ -f "$AUR_PACKAGES" ]]; then + # shellcheck disable=SC2046 + paru -S --needed --noconfirm $(read_packages "$AUR_PACKAGES") +else + err "AUR-Paketliste nicht gefunden: $AUR_PACKAGES" + exit 1 +fi + +# --- Themes installieren (Cursor etc.) --- + +log "Installiere Themes..." +"$SCRIPT_DIR/install-themes.sh" + +# --- XDG Defaults installieren --- + +log "Installiere XDG-Defaults nach /etc/xdg/..." +sudo cp -r "$DEFAULTS_DIR/xdg/"* /etc/xdg/ + +# Sicherstellen dass Rofi-Scripts ausführbar sind +sudo find /etc/xdg/rofi -name "*.sh" -exec chmod +x {} \; + +# --- Helper-Scripts installieren --- + +log "Installiere Moonarch Helper-Scripts nach /usr/local/bin/..." +sudo install -m 755 "$DEFAULTS_DIR/bin/moonarch-"* /usr/local/bin/ + +# --- Zsh-Konfiguration --- + +log "Installiere Zsh-Default-Config..." +sudo cp "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch + +# Eintrag in /etc/zsh/zshrc damit Moonarch-Defaults geladen werden, +# sofern der User keine eigene ~/.zshrc hat +if ! grep -q "zshrc.moonarch" /etc/zsh/zshrc 2>/dev/null; then + echo '# Moonarch defaults (wird durch ~/.zshrc überschrieben)' | sudo tee -a /etc/zsh/zshrc > /dev/null + echo '[[ ! -f "$HOME/.zshrc" ]] && source /etc/zsh/zshrc.moonarch' | sudo tee -a /etc/zsh/zshrc > /dev/null +fi + +# Falls der User noch keine .zshrc hat, Moonarch-Default verlinken +if [[ ! -f "$HOME/.zshrc" ]]; then + log "Keine ~/.zshrc gefunden — sourcing Moonarch-Defaults." + mkdir -p "$HOME/.zshrc.d" + echo "# Moonarch-Defaults laden, eigene Overrides in ~/.zshrc.d/ oder hier unten" > "$HOME/.zshrc" + echo "source /etc/zsh/zshrc.moonarch" >> "$HOME/.zshrc" +fi + +# --- greetd / regreet Konfiguration --- + +log "Konfiguriere greetd + regreet..." +sudo mkdir -p /etc/greetd +sudo cp "$DEFAULTS_DIR/etc/greetd/config.toml" /etc/greetd/config.toml +sudo cp "$DEFAULTS_DIR/etc/greetd/niri-greeter.kdl" /etc/greetd/niri-greeter.kdl +sudo cp "$DEFAULTS_DIR/etc/greetd/regreet.toml" /etc/greetd/regreet.toml +sudo cp "$DEFAULTS_DIR/etc/greetd/regreet.css" /etc/greetd/regreet.css + +# Greeter-Wallpaper installieren +log "Installiere Greeter-Wallpaper..." +sudo mkdir -p /usr/share/backgrounds +sudo cp "$DEFAULTS_DIR/backgrounds/moonarch-greeter.jpg" /usr/share/backgrounds/moonarch-greeter.jpg + +# --- Systemd-Services aktivieren --- + +log "Aktiviere Services..." +SERVICES=( + "NetworkManager" + "bluetooth" + "docker" + "greetd" + "systemd-timesyncd" + "ufw" + "auto-cpufreq" +) + +for service in "${SERVICES[@]}"; do + if systemctl list-unit-files "${service}.service" &>/dev/null; then + sudo systemctl enable "$service" + log " + $service" + else + log " ~ $service nicht gefunden, uebersprungen." + fi +done + +# --- Shell auf zsh setzen --- + +if [[ "$SHELL" != */zsh ]]; then + log "Setze Standard-Shell auf zsh..." + chsh -s "$(which zsh)" +fi + +# --- Firewall aktivieren --- + +log "Konfiguriere UFW..." +sudo ufw default deny incoming +sudo ufw default allow outgoing +sudo ufw --force enable + +# --- Docker-Gruppe --- + +if ! groups | grep -q docker; then + log "Fuege User zur docker-Gruppe hinzu..." + sudo usermod -aG docker "$USER" +fi + +# --- Screenshots-Verzeichnis --- + +mkdir -p "$HOME/Pictures/Screenshots" +mkdir -p "$HOME/Pictures/Wallpaper" + +# --- moonarch-update Symlink --- + +log "Erstelle moonarch-update Kommando..." +sudo ln -sf "$PROJECT_DIR/scripts/update.sh" /usr/local/bin/moonarch-update + +# --- Fertig --- + +log "" +log "============================================" +log " Moonarch Installation abgeschlossen!" +log "============================================" +log "" +log "Naechste Schritte:" +log " 1. Reboot" +log " 2. Wallpaper in ~/Pictures/Wallpaper/ ablegen" +log " 3. rustup default stable" +log " 4. User-Overrides in ~/.config/ oder ~/.zshrc.d/" +log "" diff --git a/scripts/update.sh b/scripts/update.sh new file mode 100755 index 0000000..9ab5df6 --- /dev/null +++ b/scripts/update.sh @@ -0,0 +1,196 @@ +#!/bin/bash +# ABOUTME: Moonarch System-Updater — aktualisiert System, Repo und Defaults. +# ABOUTME: Sollte regelmäßig ausgeführt werden um das System synchron zu halten. + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" +OFFICIAL_PACKAGES="$PROJECT_DIR/packages/official.txt" +AUR_PACKAGES="$PROJECT_DIR/packages/aur.txt" +DEFAULTS_DIR="$PROJECT_DIR/defaults" + +# --- Hilfsfunktionen --- + +log() { + echo -e "\e[1;34m[Moonarch]\e[0m $*" +} + +err() { + echo -e "\e[1;31m[Moonarch FEHLER]\e[0m $*" >&2 +} + +read_packages() { + grep -v '^\s*#' "$1" | grep -v '^\s*$' +} + +confirm() { + read -r -p "$1 [j/N] " response + [[ "$response" =~ ^[jJyY]$ ]] +} + +# --- Voraussetzungen --- + +if [[ $EUID -eq 0 ]]; then + err "Bitte NICHT als root ausfuehren." + exit 1 +fi + +# --- 1. Moonarch-Repo aktualisieren --- + +log "=== Moonarch Repo aktualisieren ===" + +cd "$PROJECT_DIR" +if git rev-parse --is-inside-work-tree &>/dev/null; then + LOCAL=$(git rev-parse HEAD) + git fetch origin + REMOTE=$(git rev-parse @{u} 2>/dev/null || echo "$LOCAL") + + if [[ "$LOCAL" != "$REMOTE" ]]; then + log "Updates verfuegbar." + git --no-pager log --oneline "$LOCAL".."$REMOTE" + echo "" + if confirm "Repo aktualisieren?"; then + git pull --ff-only + log "Repo aktualisiert." + else + log "Repo-Update uebersprungen." + fi + else + log "Repo ist aktuell." + fi +else + log "Kein Git-Repo — Repo-Update uebersprungen." +fi + +# --- 2. System-Pakete aktualisieren --- + +log "=== System-Pakete aktualisieren ===" + +if confirm "pacman -Syu ausfuehren?"; then + sudo pacman -Syu +else + log "System-Update uebersprungen." +fi + +if command -v paru &>/dev/null; then + if confirm "AUR-Pakete aktualisieren (paru -Sua)?"; then + paru -Sua + else + log "AUR-Update uebersprungen." + fi +fi + +# --- 3. Fehlende Pakete nachinstallieren --- + +log "=== Paketlisten abgleichen ===" + +if [[ -f "$OFFICIAL_PACKAGES" ]]; then + MISSING_OFFICIAL=$(comm -23 <(read_packages "$OFFICIAL_PACKAGES" | sort) <(pacman -Qqe | sort) || true) + if [[ -n "$MISSING_OFFICIAL" ]]; then + log "Fehlende offizielle Pakete:" + echo "$MISSING_OFFICIAL" + if confirm "Installieren?"; then + # shellcheck disable=SC2086 + sudo pacman -S --needed --noconfirm $MISSING_OFFICIAL + fi + else + log "Alle offiziellen Pakete installiert." + fi +fi + +if [[ -f "$AUR_PACKAGES" ]] && command -v paru &>/dev/null; then + MISSING_AUR=$(comm -23 <(read_packages "$AUR_PACKAGES" | sort) <(pacman -Qqe | sort) || true) + if [[ -n "$MISSING_AUR" ]]; then + log "Fehlende AUR-Pakete:" + echo "$MISSING_AUR" + if confirm "Installieren?"; then + # shellcheck disable=SC2086 + paru -S --needed --noconfirm $MISSING_AUR + fi + else + log "Alle AUR-Pakete installiert." + fi +fi + +# --- 4. Defaults aktualisieren --- + +log "=== Defaults aktualisieren ===" + +# XDG Defaults +CHANGED_XDG=false +if ! diff -rq "$DEFAULTS_DIR/xdg/" /etc/xdg/ --exclude='*.pyc' &>/dev/null 2>&1; then + CHANGED_XDG=true +fi + +if $CHANGED_XDG; then + log "XDG-Defaults haben sich geaendert." + diff -rq "$DEFAULTS_DIR/xdg/" /etc/xdg/ --exclude='*.pyc' 2>/dev/null | head -20 || true + echo "" + if confirm "XDG-Defaults nach /etc/xdg/ deployen?"; then + sudo cp -r "$DEFAULTS_DIR/xdg/"* /etc/xdg/ + log "XDG-Defaults aktualisiert." + fi +else + log "XDG-Defaults sind aktuell." +fi + +# Binaries +CHANGED_BIN=false +for bin in "$DEFAULTS_DIR/bin/moonarch-"*; do + name=$(basename "$bin") + if ! cmp -s "$bin" "/usr/local/bin/$name" 2>/dev/null; then + CHANGED_BIN=true + break + fi +done + +if $CHANGED_BIN; then + log "Moonarch-Binaries haben sich geaendert." + for bin in "$DEFAULTS_DIR/bin/moonarch-"*; do + name=$(basename "$bin") + if ! cmp -s "$bin" "/usr/local/bin/$name" 2>/dev/null; then + log " ~ $name" + fi + done + if confirm "Binaries nach /usr/local/bin/ deployen?"; then + sudo install -m 755 "$DEFAULTS_DIR/bin/moonarch-"* /usr/local/bin/ + log "Binaries aktualisiert." + fi +else + log "Binaries sind aktuell." +fi + +# Zsh +if ! cmp -s "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch 2>/dev/null; then + log "Zsh-Defaults haben sich geaendert." + if confirm "Zsh-Defaults aktualisieren?"; then + sudo cp "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch + log "Zsh-Defaults aktualisiert." + fi +else + log "Zsh-Defaults sind aktuell." +fi + +# --- 5. Verwaiste Pakete --- + +log "=== Verwaiste Pakete ===" + +ORPHANS=$(pacman -Qdtq 2>/dev/null || true) +if [[ -n "$ORPHANS" ]]; then + log "Verwaiste Pakete gefunden:" + echo "$ORPHANS" + if confirm "Entfernen?"; then + # shellcheck disable=SC2086 + sudo pacman -Rsn --noconfirm $ORPHANS + fi +else + log "Keine verwaisten Pakete." +fi + +# --- Fertig --- + +log "" +log "============================================" +log " Moonarch Update abgeschlossen!" +log "============================================"