diff --git a/hypridle/.config/hypr/hypridle.conf b/hypridle/.config/hypr/hypridle.conf
new file mode 100644
index 0000000..9353723
--- /dev/null
+++ b/hypridle/.config/hypr/hypridle.conf
@@ -0,0 +1,27 @@
+general {
+ lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
+ before_sleep_cmd = loginctl lock-session # lock before suspend.
+ after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
+}
+
+listener {
+ timeout = 150 # 2.5min.
+ on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
+ on-resume = brightnessctl -r # monitor backlight restore.
+}
+
+listener {
+ timeout = 300 # 5min
+ on-timeout = loginctl lock-session # lock screen when timeout has passed
+}
+
+listener {
+ timeout = 330 # 5.5min
+ on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
+ on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired.
+}
+
+listener {
+ timeout = 1800 # 30min
+ on-timeout = systemctl suspend # suspend pc
+}
\ No newline at end of file
diff --git a/hyprland/.config/hypr/hyprland.conf b/hyprland/.config/hypr/hyprland.conf
index 6de2486..42dd9aa 100644
--- a/hyprland/.config/hypr/hyprland.conf
+++ b/hyprland/.config/hypr/hyprland.conf
@@ -35,6 +35,8 @@ monitor= DP-1, 5120x1440@120, 0x0, 1
$terminal = kitty
$fileManager = comsic-files
$menu = rofi -show drun -theme rounded-purple-dark
+$windowSwitcher = rofi -show window -theme rounded-purple-dark
+$powerMenu = rofi -show power-menu -modi power-menu:rofi-power-menu -theme rounded-purple-dark
#################
@@ -44,9 +46,14 @@ $menu = rofi -show drun -theme rounded-purple-dark
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
-exec-once = waybar & hyprpaper
+exec-once = waybar
+exec-once = hyprpaper
+exec-once = hypridle
exec-once = systemctl --user start polkit-gnome
+exec-once = [workspace 3] steam
+exec-once = [workspace 4] flatpak run com.discordapp.Discord
+
#############################
### ENVIRONMENT VARIABLES ###
@@ -56,7 +63,7 @@ exec-once = systemctl --user start polkit-gnome
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
-
+env = PATH,$PATH:$HOME/.local/bin
#####################
### LOOK AND FEEL ###
@@ -181,7 +188,7 @@ input {
kb_options =
kb_rules =
- follow_mouse = 2
+ follow_mouse = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
@@ -197,6 +204,12 @@ device {
sensitivity = -0.5
}
+device {
+ name = bastard-keyboards-charybdis-(4x6)-splinky-mouse
+ sensitivity = -0.80
+ accel_profile = adaptive
+}
+
###################
### KEYBINDINGS ###
diff --git a/hyprland/.config/hypr/hyprland.conf.save b/hyprland/.config/hypr/hyprland.conf.save
new file mode 100644
index 0000000..d9d525c
--- /dev/null
+++ b/hyprland/.config/hypr/hyprland.conf.save
@@ -0,0 +1,223 @@
+
+# #######################################################################################
+# AUTOGENERATED HYPRLAND CONFIG.
+# PLEASE USE THE CONFIG PROVIDED IN THE GIT REPO /examples/hyprland.conf AND EDIT IT,
+# OR EDIT THIS ONE ACCORDING TO THE WIKI INSTRUCTIONS.
+# #######################################################################################
+
+# This is an example Hyprland config file.
+# Refer to the wiki for more information.
+# https://wiki.hyprland.org/Configuring/
+
+# Please note not all available settings / options are set here.
+# For a full list, see the wiki
+
+# You can split this configuration into multiple files
+# Create your files separately and then link them to this file like this:
+# source = ~/.config/hypr/myColors.conf
+
+
+################
+### MONITORS ###
+################
+
+# See https://wiki.hyprland.org/Configuring/Monitors/
+monitor= DP-1, 5120x1440@120, 0x0, 1
+
+
+###################
+### MY PROGRAMS ###
+###################
+
+# See https://wiki.hyprland.org/Configuring/Keywords/
+
+# Set programs that you use
+$terminal = kitty
+$fileManager = comsic-files
+$menu = rofi -show drun -theme rounded-purple-dark
+$windowSwitcher = rofi -show window -theme rounded-purple-dark
+$powerMenu = rofi -show power-menu -modi power-menu:rofi-power-menu -theme rounded-purple-dark
+
+
+#################
+### AUTOSTART ###
+#################
+
+# Autostart necessary processes (like notifications daemons, status bars, etc.)
+# Or execute your favorite apps at launch like this:
+
+exec-once = waybar
+exec-once = hyprpaper
+exec-once = hypridle
+exec-once = systemctl --user start polkit-gnome
+
+
+#############################
+### ENVIRONMENT VARIABLES ###
+#############################
+
+# See https://wiki.hyprland.org/Configuring/Environment-variables/
+
+env = XCURSOR_SIZE,24
+env = HYPRCURSOR_SIZE,24
+env = PATH,$PATH:$HOME/.local/bin
+
+#####################
+### LOOK AND FEEL ###
+#####################
+
+# Refer to https://wiki.hyprland.org/Configuring/Variables/
+
+# https://wiki.hyprland.org/Configuring/Variables/#general
+general {
+ gaps_in = 5
+ gaps_out = 20
+
+ border_size = 2
+
+ # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
+ col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
+ col.inactive_border = rgba(595959aa)
+
+ # Set to true enable resizing windows by clicking and dragging on borders and gaps
+ resize_on_border = false
+
+ # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
+ allow_tearing = false
+
+ layout = dwindle
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#decoration
+decoration {
+ rounding = 10
+
+ # Change transparency of focused and unfocused windows
+ active_opacity = 1.0
+ inactive_opacity = 1.0
+
+ shadow {
+ enabled = true
+ range = 4
+ render_power = 3
+ color = rgba(1a1a1aee)
+ }
+
+ # https://wiki.hyprland.org/Configuring/Variables/#blur
+ blur {
+ enabled = true
+ size = 3
+ passes = 1
+
+ vibrancy = 0.1696
+ }
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#animations
+animations {
+ enabled = yes, please :)
+
+ # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+
+ bezier = easeOutQuint,0.23,1,0.32,1
+ bezier = easeInOutCubic,0.65,0.05,0.36,1
+ bezier = linear,0,0,1,1
+ bezier = almostLinear,0.5,0.5,0.75,1.0
+ bezier = quick,0.15,0,0.1,1
+
+ animation = global, 1, 10, default
+ animation = border, 1, 5.39, easeOutQuint
+ animation = windows, 1, 4.79, easeOutQuint
+ animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
+ animation = windowsOut, 1, 1.49, linear, popin 87%
+ animation = fadeIn, 1, 1.73, almostLinear
+ animation = fadeOut, 1, 1.46, almostLinear
+ animation = fade, 1, 3.03, quick
+ animation = layers, 1, 3.81, easeOutQuint
+ animation = layersIn, 1, 4, easeOutQuint, fade
+ animation = layersOut, 1, 1.5, linear, fade
+ animation = fadeLayersIn, 1, 1.79, almostLinear
+ animation = fadeLayersOut, 1, 1.39, almostLinear
+ animation = workspaces, 1, 1.94, almostLinear, fade
+ animation = workspacesIn, 1, 1.21, almostLinear, fade
+ animation = workspacesOut, 1, 1.94, almostLinear, fade
+}
+
+# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/
+# "Smart gaps" / "No gaps when only"
+# uncomment all if you wish to use that.
+# workspace = w[tv1], gapsout:0, gapsin:0
+# workspace = f[1], gapsout:0, gapsin:0
+# windowrulev2 = bordersize 0, floating:0, onworkspace:w[tv1]
+# windowrulev2 = rounding 0, floating:0, onworkspace:w[tv1]
+# windowrulev2 = bordersize 0, floating:0, onworkspace:f[1]
+# windowrulev2 = rounding 0, floating:0, onworkspace:f[1]
+
+# windowrulev2 = opacity 1 .9, title:(Jellyfin Media Player)
+
+# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
+dwindle {
+ pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = true # You probably want this
+}
+
+# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
+master {
+ new_status = master
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#misc
+misc {
+ force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
+ disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
+}
+
+
+#############
+### INPUT ###
+#############
+
+# https://wiki.hyprland.org/Configuring/Variables/#input
+input {
+ kb_layout = us
+ kb_variant =
+ kb_model =
+ kb_options =
+ kb_rules =
+
+ follow_mouse = 1
+
+ sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
+
+ touchpad {
+ natural_scroll = false
+ }
+}
+
+# Example per-device config
+# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
+device {
+ name = epic-mouse-v1
+ sensitivity = -0.5
+}
+
+
+###################
+### KEYBINDINGS ###
+###################
+
+source = ~/.config/hypr/keybinds.conf
+
+##############################
+### WINDOWS AND WORKSPACES ###
+##############################
+
+# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
+# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
+
+# Ignore maximize requests from apps. You'll probably like this.
+windowrulev2 = suppressevent maximize, class:.*
+
+# Fix some dragging issues with XWayland
+windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
+
diff --git a/hyprland/.config/hypr/keybinds.conf b/hyprland/.config/hypr/keybinds.conf
index 8149df9..17800c4 100644
--- a/hyprland/.config/hypr/keybinds.conf
+++ b/hyprland/.config/hypr/keybinds.conf
@@ -12,6 +12,8 @@ bind = $mainMod, V, togglefloating,
bind = $mainMod, R, exec, $menu
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, togglesplit, # dwindle
+bind = ALT, TAB, exec, $windowSwitcher
+bind = $mainMod, F12, exec, $powerMenu
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
diff --git a/hyprlock/.config/hypr/hyprlock.conf b/hyprlock/.config/hypr/hyprlock.conf
new file mode 100644
index 0000000..ebaa446
--- /dev/null
+++ b/hyprlock/.config/hypr/hyprlock.conf
@@ -0,0 +1,24 @@
+background {
+ monitor = DP-1
+ path = $HOME/.config/hypr/backgrounds/mask.jpg
+ blur_passes = 0
+}
+
+input-field {
+ monitor = DP-1
+ size = 20%, 5%
+ outline_thickness = 3
+ inner_color = rgba(0, 0, 0, 1.0) # no fill
+
+ outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg
+ check_color=rgba(00ff99ee) rgba(ff6633ee) 120deg
+ fail_color=rgba(ff6633ee) rgba(ff0066ee) 40deg
+
+ font_color = rgb(143, 143, 143)
+ fade_on_empty = false
+ rounding = 15
+
+ position = 0, -150
+ halign = center
+ valign = center
+}
\ No newline at end of file
diff --git a/hyprpaper/.config/hypr/backgrounds/mask.jpg b/hyprpaper/.config/hypr/backgrounds/mask.jpg
index d8a347f..a48acac 100644
Binary files a/hyprpaper/.config/hypr/backgrounds/mask.jpg and b/hyprpaper/.config/hypr/backgrounds/mask.jpg differ
diff --git a/rofi/.config/rofi/themes/rounded-common.rasi b/rofi/.config/rofi/themes/rounded-common.rasi
index 63aada3..3a926a7 100644
--- a/rofi/.config/rofi/themes/rounded-common.rasi
+++ b/rofi/.config/rofi/themes/rounded-common.rasi
@@ -71,6 +71,7 @@ element {
padding: 8px 16px;
spacing: 8px;
border-radius: 16px;
+ children: [element-icon, element-text];
}
element normal active {
diff --git a/rofi/.local/bin/dmenu-power-menu b/rofi/.local/bin/dmenu-power-menu
new file mode 100755
index 0000000..89a810a
--- /dev/null
+++ b/rofi/.local/bin/dmenu-power-menu
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+# Simple stand-alone wrapper for rofi-power-menu.
+#
+# This script takes the same CLI arguments as rofi-power-menu.
+#
+# rofi-script-to-dmenu needs to be installed
+
+# Use local rofi-power-menu if present. This makes developing easier.
+command -v ./rofi-power-menu >/dev/null
+powermenu_exists=$?
+if [ $powermenu_exists -eq 0 ]
+then
+ powermenu="./rofi-power-menu"
+else
+ powermenu="rofi-power-menu"
+fi
+
+cmd="$powermenu $@"
+rofi-script-to-dmenu "$cmd"
diff --git a/rofi/.local/bin/rofi-power-menu b/rofi/.local/bin/rofi-power-menu
new file mode 100755
index 0000000..13e17e3
--- /dev/null
+++ b/rofi/.local/bin/rofi-power-menu
@@ -0,0 +1,280 @@
+#!/usr/bin/env bash
+
+# This script defines just a mode for rofi instead of being a self-contained
+# executable that launches rofi by itself. This makes it more flexible than
+# running rofi inside this script as now the user can call rofi as one pleases.
+# For instance:
+#
+# rofi -show powermenu -modi powermenu:./rofi-power-menu
+#
+# See README.md for more information.
+
+set -e
+set -u
+
+# All supported choices
+all=(shutdown reboot suspend hibernate logout lockscreen)
+
+# By default, show all (i.e., just copy the array)
+show=("${all[@]}")
+
+declare -A texts
+texts[lockscreen]="lock screen"
+texts[switchuser]="switch user"
+texts[logout]="log out"
+texts[suspend]="suspend"
+texts[hibernate]="hibernate"
+texts[reboot]="reboot"
+texts[shutdown]="shut down"
+
+declare -A icons
+icons[lockscreen]="\Uf033e"
+icons[switchuser]="\Uf0019"
+icons[logout]="\Uf0343"
+icons[suspend]="\Uf04b2"
+icons[hibernate]="\Uf02ca"
+icons[reboot]="\Uf0709"
+icons[shutdown]="\Uf0425"
+icons[cancel]="\Uf0156"
+
+declare -A actions
+actions[lockscreen]="loginctl lock-session ${XDG_SESSION_ID-}"
+#actions[switchuser]="???"
+actions[logout]="loginctl terminate-session ${XDG_SESSION_ID-}"
+actions[suspend]="systemctl suspend"
+actions[hibernate]="systemctl hibernate"
+actions[reboot]="systemctl reboot"
+actions[shutdown]="systemctl poweroff"
+
+# By default, ask for confirmation for actions that are irreversible
+confirmations=(reboot shutdown logout)
+
+# By default, no dry run
+dryrun=false
+showsymbols=true
+showtext=true
+
+function check_valid {
+ option="$1"
+ shift 1
+ for entry in "${@}"
+ do
+ if [ -z "${actions[$entry]+x}" ]
+ then
+ echo "Invalid choice in $1: $entry" >&2
+ exit 1
+ fi
+ done
+}
+
+# Parse command-line options
+parsed=$(getopt --options=h --longoptions=help,dry-run,confirm:,choices:,choose:,symbols,no-symbols,text,no-text,symbols-font: --name "$0" -- "$@")
+if [ $? -ne 0 ]; then
+ echo 'Terminating...' >&2
+ exit 1
+fi
+eval set -- "$parsed"
+unset parsed
+while true; do
+ case "$1" in
+ "-h"|"--help")
+ echo "rofi-power-menu - a power menu mode for Rofi"
+ echo
+ echo "Usage: rofi-power-menu [--choices CHOICES] [--confirm CHOICES]"
+ echo " [--choose CHOICE] [--dry-run] [--symbols|--no-symbols]"
+ echo
+ echo "Use with Rofi in script mode. For instance, to ask for shutdown or reboot:"
+ echo
+ echo " rofi -show menu -modi \"menu:rofi-power-menu --choices=shutdown/reboot\""
+ echo
+ echo "Available options:"
+ echo " --dry-run Don't perform the selected action but print it to stderr."
+ echo " --choices CHOICES Show only the selected choices in the given order. Use /"
+ echo " as the separator. Available choices are lockscreen,"
+ echo " logout,suspend, hibernate, reboot and shutdown. By"
+ echo " default, all available choices are shown."
+ echo " --confirm CHOICES Require confirmation for the gives choices only. Use / as"
+ echo " the separator. Available choices are lockscreen, logout,"
+ echo " suspend, hibernate, reboot and shutdown. By default, only"
+ echo " irreversible actions logout, reboot and shutdown require"
+ echo " confirmation."
+ echo " --choose CHOICE Preselect the given choice and only ask for a"
+ echo " confirmation (if confirmation is set to be requested). It"
+ echo " is strongly recommended to combine this option with"
+ echo " --confirm=CHOICE if the choice wouldn't require"
+ echo " confirmation by default. Available choices are"
+ echo " lockscreen, logout, suspend, hibernate, reboot and"
+ echo " shutdown."
+ echo " --[no-]symbols Show Unicode symbols or not. Requires a font with support"
+ echo " for the symbols. Use, for instance, fonts from the"
+ echo " Nerdfonts collection. By default, they are shown"
+ echo " --[no-]text Show text description or not."
+ echo " --symbols-font FONT Use the given font for symbols. By default, the symbols"
+ echo " use the same font as the text. That font is configured"
+ echo " with rofi."
+ echo " -h,--help Show this help text."
+ exit 0
+ ;;
+ "--dry-run")
+ dryrun=true
+ shift 1
+ ;;
+ "--confirm")
+ IFS='/' read -ra confirmations <<< "$2"
+ check_valid "$1" "${confirmations[@]}"
+ shift 2
+ ;;
+ "--choices")
+ IFS='/' read -ra show <<< "$2"
+ check_valid "$1" "${show[@]}"
+ shift 2
+ ;;
+ "--choose")
+ # Check that the choice is valid
+ check_valid "$1" "$2"
+ selectionID="$2"
+ shift 2
+ ;;
+ "--symbols")
+ showsymbols=true
+ shift 1
+ ;;
+ "--no-symbols")
+ showsymbols=false
+ shift 1
+ ;;
+ "--text")
+ showtext=true
+ shift 1
+ ;;
+ "--no-text")
+ showtext=false
+ shift 1
+ ;;
+ "--symbols-font")
+ symbols_font="$2"
+ shift 2
+ ;;
+ "--")
+ shift
+ break
+ ;;
+ *)
+ echo "Internal error" >&2
+ exit 1
+ ;;
+ esac
+done
+
+if [ "$showsymbols" = "false" -a "$showtext" = "false" ]
+then
+ echo "Invalid options: cannot have --no-symbols and --no-text enabled at the same time." >&2
+ exit 1
+fi
+
+# Define the messages after parsing the CLI options so that it is possible to
+# configure them in the future.
+
+function write_message {
+ if [ -z ${symbols_font+x} ];
+ then
+ icon="$1"
+ else
+ icon="$1"
+ fi
+ text="$2"
+ if [ "$showsymbols" = "true" ]
+ then
+ if [ "$showtext" = "true" ]
+ then
+ echo -n "\u200e$icon \u2068$text\u2069"
+ else
+ echo -n "\u200e$icon"
+ fi
+ else
+ echo -n "$text"
+ fi
+}
+
+function print_selection {
+ echo -e "$1" | $(read -r -d '' entry; echo "echo $entry")
+}
+
+declare -A messages
+declare -A confirmationMessages
+for entry in "${all[@]}"
+do
+ messages[$entry]=$(write_message "${icons[$entry]}" "${texts[$entry]^}")
+done
+for entry in "${all[@]}"
+do
+ confirmationMessages[$entry]=$(write_message "${icons[$entry]}" "Yes, ${texts[$entry]}")
+done
+confirmationMessages[cancel]=$(write_message "${icons[cancel]}" "No, cancel")
+
+if [ $# -gt 0 ]
+then
+ # If arguments given, use those as the selection
+ selection="${@}"
+else
+ # Otherwise, use the CLI passed choice if given
+ if [ -n "${selectionID+x}" ]
+ then
+ selection="${messages[$selectionID]}"
+ fi
+fi
+
+# Don't allow custom entries
+echo -e "\0no-custom\x1ftrue"
+# Use markup
+echo -e "\0markup-rows\x1ftrue"
+
+if [ -z "${selection+x}" ]
+then
+ echo -e "\0prompt\x1fPower menu"
+ for entry in "${show[@]}"
+ do
+ echo -e "${messages[$entry]}\0icon\x1f${icons[$entry]}"
+ done
+else
+ for entry in "${show[@]}"
+ do
+ if [ "$selection" = "$(print_selection "${messages[$entry]}")" ]
+ then
+ # Check if the selected entry is listed in confirmation requirements
+ for confirmation in "${confirmations[@]}"
+ do
+ if [ "$entry" = "$confirmation" ]
+ then
+ # Ask for confirmation
+ echo -e "\0prompt\x1fAre you sure"
+ echo -e "${confirmationMessages[$entry]}\0icon\x1f${icons[$entry]}"
+ echo -e "${confirmationMessages[cancel]}\0icon\x1f${icons[cancel]}"
+ exit 0
+ fi
+ done
+ # If not, then no confirmation is required, so mark confirmed
+ selection=$(print_selection "${confirmationMessages[$entry]}")
+ fi
+ if [ "$selection" = "$(print_selection "${confirmationMessages[$entry]}")" ]
+ then
+ if [ $dryrun = true ]
+ then
+ # Tell what would have been done
+ echo "Selected: $entry" >&2
+ else
+ # Perform the action
+ ${actions[$entry]}
+ fi
+ exit 0
+ fi
+ if [ "$selection" = "$(print_selection "${confirmationMessages[cancel]}")" ]
+ then
+ # Do nothing
+ exit 0
+ fi
+ done
+ # The selection didn't match anything, so raise an error
+ echo "Invalid selection: $selection" >&2
+ exit 1
+fi
diff --git a/waybar/.config/waybar/config b/waybar/.config/waybar/config
index 8feb2d7..50eb2da 100644
--- a/waybar/.config/waybar/config
+++ b/waybar/.config/waybar/config
@@ -16,7 +16,8 @@
"cpu",
"memory",
"temperature",
- "clock"
+ "clock",
+ "custom/power",
],
"hyprland/window": {
"format": "{}",
@@ -80,5 +81,9 @@
},
"tray": {
"spacing": 10
+ },
+ "custom/power": {
+ "format": "⏻",
+ "on-click": "rofi -show power-menu -modi power-menu:rofi-power-menu -theme rounded-purple-dark",
}
}
diff --git a/waybar/.config/waybar/style.css b/waybar/.config/waybar/style.css
index 1a8322f..fc44605 100644
--- a/waybar/.config/waybar/style.css
+++ b/waybar/.config/waybar/style.css
@@ -120,6 +120,12 @@ button:hover {
color: @sapphire;
}
+#custom-power {
+ color: @green;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
@keyframes blink {
to {
color: #000000;