From 2d4b03425f0b3f8beef69e099fc8170d460e6ebd Mon Sep 17 00:00:00 2001 From: coja Date: Sat, 11 Oct 2025 00:54:02 +0200 Subject: [PATCH] [Cava] music visualizer config --- .config/cava/config | 188 +++++++++++++-------------- .config/cava/shaders/eye_of_phi.frag | 117 +++++++++++++++++ .config/cava/themes/solarized_dark | 15 +++ .config/cava/themes/tricolor | 10 ++ 4 files changed, 229 insertions(+), 101 deletions(-) create mode 100644 .config/cava/shaders/eye_of_phi.frag create mode 100644 .config/cava/themes/solarized_dark create mode 100644 .config/cava/themes/tricolor diff --git a/.config/cava/config b/.config/cava/config index 1cc9868..eb2df03 100644 --- a/.config/cava/config +++ b/.config/cava/config @@ -1,33 +1,33 @@ -## Configuration file for CAVA. -# Remove the ; to change parameters. +## configuration file for cava. +# remove the ; to change parameters. [general] -# Smoothing mode. Can be 'normal', 'scientific' or 'waves'. DEPRECATED as of 0.6.0 +# smoothing mode. can be 'normal', 'scientific' or 'waves'. deprecated as of 0.6.0 mode = scientific -# Accepts only non-negative values. +# accepts only non-negative values. framerate = 60 # 'autosens' will attempt to decrease sensitivity if the bars peak. 1 = on, 0 = off # new as of 0.6.0 autosens of low values (dynamic range) -# 'overshoot' allows bars to overshoot (in % of terminal height) without initiating autosens. DEPRECATED as of 0.6.0 +# 'overshoot' allows bars to overshoot (in % of terminal height) without initiating autosens. deprecated as of 0.6.0 autosens = 1 ; overshoot = 20 -# Manual sensitivity in %. If autosens is enabled, this will only be the initial value. -# 200 means double height. Accepts only non-negative values. +# manual sensitivity in %. if autosens is enabled, this will only be the initial value. +# 200 means double height. accepts only non-negative values. ; sensitivity = 100 -# The number of bars (0-512). 0 sets it to auto (fill up console). -# Bars' width and space between bars in number of characters. +# the number of bars (0-512). 0 sets it to auto (fill up console). +# bars' width and space between bars in number of characters. ; bars = 0 ; bar_width = 2 ; bar_spacing = 1 # bar_height is only used for output in "noritake" format ; bar_height = 32 -# For SDL width and space between bars is in pixels, defaults are: +# for sdl width and space between bars is in pixels, defaults are: ; bar_width = 20 ; bar_spacing = 5 @@ -42,47 +42,47 @@ autosens = 1 ; max_height = 100 -# Lower and higher cutoff frequencies for lowest and highest bars +# lower and higher cutoff frequencies for lowest and highest bars # the bandwidth of the visualizer. -# Note: there is a minimum total bandwidth of 43Mhz x number of bars. -# Cava will automatically increase the higher cutoff if a too low band is specified. +# note: there is a minimum total bandwidth of 43mhz x number of bars. +# cava will automatically increase the higher cutoff if a too low band is specified. ; lower_cutoff_freq = 50 ; higher_cutoff_freq = 10000 -# Seconds with no input before cava goes to sleep mode. Cava will not perform FFT or drawing and -# only check for input once per second. Cava will wake up once input is detected. 0 = disable. +# seconds with no input before cava goes to sleep mode. cava will not perform fft or drawing and +# only check for input once per second. cava will wake up once input is detected. 0 = disable. ; sleep_timer = 0 [input] -# Audio capturing method. Possible methods are: 'fifo', 'portaudio', 'pipewire', 'alsa', 'pulse', 'sndio', 'oss', 'jack' or 'shmem' -# Defaults to 'oss', 'pipewire', 'sndio', 'jack', 'pulse', 'alsa', 'portaudio' or 'fifo', in that order, dependent on what support cava was built with. -# On Mac it defaults to 'portaudio' or 'fifo' -# On windows this is automatic and no input settings are needed. +# audio capturing method. possible methods are: 'fifo', 'portaudio', 'pipewire', 'alsa', 'pulse', 'sndio', 'oss', 'jack' or 'shmem' +# defaults to 'oss', 'pipewire', 'sndio', 'jack', 'pulse', 'alsa', 'portaudio' or 'fifo', in that order, dependent on what support cava was built with. +# on mac it defaults to 'portaudio' or 'fifo' +# on windows this is automatic and no input settings are needed. # -# All input methods uses the same config variable 'source' +# all input methods uses the same config variable 'source' # to define where it should get the audio. # -# For pulseaudio and pipewire 'source' will be the source. Default: 'auto', which uses the monitor source of the default sink +# for pulseaudio and pipewire 'source' will be the source. default: 'auto', which uses the monitor source of the default sink # (all pulseaudio sinks(outputs) have 'monitor' sources(inputs) associated with them). # -# For pipewire 'source' will be the object name or object.serial of the device to capture from. -# Both input and output devices are supported. To capture the monitor source of a sink node, append '.monitor' to the sink's object name. +# for pipewire 'source' will be the object name or object.serial of the device to capture from. +# both input and output devices are supported. to capture the monitor source of a sink node, append '.monitor' to the sink's object name. # -# For alsa 'source' will be the capture device. -# For fifo 'source' will be the path to fifo-file. -# For shmem 'source' will be /squeezelite-AA:BB:CC:DD:EE:FF where 'AA:BB:CC:DD:EE:FF' will be squeezelite's MAC address +# for alsa 'source' will be the capture device. +# for fifo 'source' will be the path to fifo-file. +# for shmem 'source' will be /squeezelite-aa:bb:cc:dd:ee:ff where 'aa:bb:cc:dd:ee:ff' will be squeezelite's mac address # -# For sndio 'source' will be a raw recording audio descriptor or a monitoring sub-device, e.g. 'rsnd/2' or 'snd/1'. Default: 'default'. -# README.md contains further information on how to setup CAVA for sndio. +# for sndio 'source' will be a raw recording audio descriptor or a monitoring sub-device, e.g. 'rsnd/2' or 'snd/1'. default: 'default'. +# readme.md contains further information on how to setup cava for sndio. # -# For oss 'source' will be the path to a audio device, e.g. '/dev/dsp2'. Default: '/dev/dsp', i.e. the default audio device. -# README.md contains further information on how to setup CAVA for OSS on FreeBSD. +# for oss 'source' will be the path to a audio device, e.g. '/dev/dsp2'. default: '/dev/dsp', i.e. the default audio device. +# readme.md contains further information on how to setup cava for oss on freebsd. # -# For jack 'source' will be the name of the JACK server to connect to, e.g. 'foobar'. Default: 'default'. -# README.md contains further information on how to setup CAVA for JACK. +# for jack 'source' will be the name of the jack server to connect to, e.g. 'foobar'. default: 'default'. +# readme.md contains further information on how to setup cava for jack. # ; method = pulse ; source = auto @@ -91,13 +91,13 @@ autosens = 1 ; source = auto ; method = alsa -; source = hw:Loopback,1 +; source = hw:loopback,1 ; method = fifo ; source = /tmp/mpd.fifo ; method = shmem -; source = /squeezelite-AA:BB:CC:DD:EE:FF +; source = /squeezelite-aa:bb:cc:dd:ee:ff ; method = portaudio ; source = auto @@ -111,16 +111,16 @@ autosens = 1 ; method = jack ; source = default -# The options 'sample_rate', 'sample_bits', 'channels' and 'autoconnect' can be configured for some input methods: +# the options 'sample_rate', 'sample_bits', 'channels' and 'autoconnect' can be configured for some input methods: # sample_rate: fifo, pipewire, sndio, oss # sample_bits: fifo, pipewire, sndio, oss # channels: sndio, oss, jack # autoconnect: jack -# Other methods ignore these settings. +# other methods ignore these settings. # -# For 'sndio' and 'oss' they are only preferred values, i.e. if the values are not supported +# for 'sndio' and 'oss' they are only preferred values, i.e. if the values are not supported # by the chosen audio device, the device will use other supported values instead. -# Example: 48000, 32 and 2, but the device only supports 44100, 16 and 1, then it +# example: 48000, 32 and 2, but the device only supports 44100, 16 and 1, then it # will use 44100, 16 and 1. # ; sample_rate = 44100 @@ -131,33 +131,33 @@ autosens = 1 [output] -# Output method. Can be 'ncurses', 'noncurses', 'raw', 'noritake', 'sdl' +# output method. can be 'ncurses', 'noncurses', 'raw', 'noritake', 'sdl' # or 'sdl_glsl'. # 'noncurses' (default) uses a buffer and cursor movements to only print -# changes from frame to frame in the terminal. Uses less resources and is less +# changes from frame to frame in the terminal. uses less resources and is less # prone to tearing (vsync issues) than 'ncurses'. # # 'raw' is an 8 or 16 bit (configurable via the 'bit_format' option) data # stream of the bar heights that can be used to send to other applications. # 'raw' defaults to 1024 bars stereo (512 bars mono), which can be adjusted in the 'bars' option above. # -# 'noritake' outputs a bitmap in the format expected by a Noritake VFD display -# in graphic mode. It only support the 3000 series graphical VFDs for now. +# 'noritake' outputs a bitmap in the format expected by a noritake vfd display +# in graphic mode. it only support the 3000 series graphical vfds for now. # -# 'sdl' uses the Simple DirectMedia Layer to render in a graphical context. -# 'sdl_glsl' uses SDL to create an OpenGL context. Write your own shaders or +# 'sdl' uses the simple directmedia layer to render in a graphical context. +# 'sdl_glsl' uses sdl to create an opengl context. write your own shaders or # use one of the predefined ones. ; method = noncurses -# Orientation of the visualization. Can be 'bottom', 'top', 'left', 'right' or -# 'horizontal'. Default is 'bottom'. 'left and 'right' are only supported on sdl +# orientation of the visualization. can be 'bottom', 'top', 'left', 'right' or +# 'horizontal'. default is 'bottom'. 'left and 'right' are only supported on sdl # and ncruses output. 'horizontal' (bars go up and down from center) is only supported # on noncurses output. -# Note: many fonts have weird or missing glyphs for characters used in orientations +# note: many fonts have weird or missing glyphs for characters used in orientations # other than 'bottom', which can make output not look right. ; orientation = bottom -# Visual channels. Can be 'stereo' or 'mono'. +# visual channels. can be 'stereo' or 'mono'. # 'stereo' mirrors both channels with low frequencies in center. # 'mono' outputs left to right lowest to highest frequencies. # 'mono_option' set mono to either take input from 'left', 'right' or 'average'. @@ -166,22 +166,22 @@ autosens = 1 ; mono_option = average ; reverse = 0 -# Raw output target. -# On Linux, a fifo will be created if target does not exist. -# On Windows, a named pipe will be created if target does not exist. +# raw output target. +# on linux, a fifo will be created if target does not exist. +# on windows, a named pipe will be created if target does not exist. ; raw_target = /dev/stdout -# Raw data format. Can be 'binary' or 'ascii'. +# raw data format. can be 'binary' or 'ascii'. ; data_format = binary -# Binary bit format, can be '8bit' (0-255) or '16bit' (0-65530). +# binary bit format, can be '8bit' (0-255) or '16bit' (0-65530). ; bit_format = 16bit -# Ascii max value. In 'ascii' mode range will run from 0 to value specified here +# ascii max value. in 'ascii' mode range will run from 0 to value specified here ; ascii_max_range = 1000 -# Ascii delimiters. In ascii format each bar and frame is separated by a delimiters. -# Use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)). +# ascii delimiters. in ascii format each bar and frame is separated by a delimiters. +# use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)). ; bar_delimiter = 59 ; frame_delimiter = 10 @@ -192,9 +192,9 @@ autosens = 1 ; sdl_y= -1 ; sdl_full_screen = 0 -# set label on bars on the x-axis. Can be 'frequency' or 'none'. Default: 'none' +# set label on bars on the x-axis. can be 'frequency' or 'none'. default: 'none' # 'frequency' displays the lower cut off frequency of the bar above. -# Only supported on ncurses and noncurses output. +# only supported on ncurses and noncurses output. ; xaxis = none # enable synchronized sync. 1 = on, 0 = off @@ -202,7 +202,7 @@ autosens = 1 # defaults to off since the behaviour in other terminal emulators is unknown ; synchronized_sync = 0 -# Shaders for sdl_glsl, located in $HOME/.config/cava/shaders +# shaders for sdl_glsl, located in $home/.config/cava/shaders ; vertex_shader = pass_through.vert ; fragment_shader = bar_spectrum.frag @@ -210,7 +210,7 @@ autosens = 1 ; continuous_rendering = 0 # disable console blank (screen saver) in tty -# (Not supported on FreeBSD) +# (not supported on freebsd) ; disable_blanking = 0 # show a flat bar at the bottom of the screen when idle, 1 = on, 0 = off @@ -221,21 +221,21 @@ autosens = 1 [color] -# Colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow. -# Or defined by hex code '#xxxxxx' (hex code must be within ''). User defined colors requires -# a terminal that can change color definitions such as Gnome-terminal or rxvt. +# colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow. +# or defined by hex code '#xxxxxx' (hex code must be within ''). user defined colors requires +# a terminal that can change color definitions such as gnome-terminal or rxvt. # default is to keep current terminal color ; background = default ; foreground = default -# SDL and sdl_glsl only support hex code colors, these are the default: +# sdl and sdl_glsl only support hex code colors, these are the default: ; background = '#111111' -; foreground = '#D34b11' -# ; foreground = '#D34b11' +; foreground = '#d34b11' +# ; foreground = '#d34b11' -# Gradient mode, only hex defined colors are supported, +# gradient mode, only hex defined colors are supported, # background must also be defined in hex or remain commented out. 1 = on, 0 = off. -# You can define as many as 8 different colors. They range from bottom to top of screen +# you can define as many as 8 different colors. they range from bottom to top of screen gradient = 1 gradient_color_1 = '#d34b11' gradient_color_2 = '#cc5933' @@ -246,8 +246,8 @@ gradient_color_6 = '#a6cc33' gradient_color_7 = '#80cc33' gradient_color_8 = '#59cc33' -# Horizontal is only supported on noncurses output. -# Only one color will be calculated per bar. +# horizontal is only supported on noncurses output. +# only one color will be calculated per bar. ; horizontal_gradient = 1 ; horizontal_gradient_color_1 = '#c45161' ; horizontal_gradient_color_2 = '#e094a0' @@ -259,39 +259,39 @@ gradient_color_8 = '#59cc33' ; horizontal_gradient_color_8 = '#434279' -# If both vertical and horizontal gradient is enabled, vertical will be blended in this direction. -# Can be 'up', 'down', 'left' or 'right'. 'up' means the vertical gradient will be blended in from -# bottom to top. I.e. the bottom will be only the horizontal +# if both vertical and horizontal gradient is enabled, vertical will be blended in this direction. +# can be 'up', 'down', 'left' or 'right'. 'up' means the vertical gradient will be blended in from +# bottom to top. i.e. the bottom will be only the horizontal # and top will be only the color of the vertical gradient. ; blend_direction = 'up' # use theme file instead of defining colors in this file -# themes are located in $HOME/.config/cava/themes +# themes are located in $home/.config/cava/themes ; theme = 'none' [smoothing] -# Percentage value for integral smoothing. Takes values from 0 - 100. -# Higher values means smoother, but less precise. 0 to disable. -# DEPRECATED as of 0.8.0, use noise_reduction instead +# percentage value for integral smoothing. takes values from 0 - 100. +# higher values means smoother, but less precise. 0 to disable. +# deprecated as of 0.8.0, use noise_reduction instead ; integral = 77 -# Disables or enables the so-called "Monstercat smoothing" with or without "waves". Set to 0 to disable. +# disables or enables the so-called "monstercat smoothing" with or without "waves". set to 0 to disable. ; monstercat = 0 ; waves = 0 -# Set gravity percentage for "drop off". Higher values means bars will drop faster. -# Accepts only non-negative values. 50 means half gravity, 200 means double. Set to 0 to disable "drop off". -# DEPRECATED as of 0.8.0, use noise_reduction instead +# set gravity percentage for "drop off". higher values means bars will drop faster. +# accepts only non-negative values. 50 means half gravity, 200 means double. set to 0 to disable "drop off". +# deprecated as of 0.8.0, use noise_reduction instead ; gravity = 100 -# In bar height, bars that would have been lower that this will not be drawn. -# DEPRECATED as of 0.8.0 +# in bar height, bars that would have been lower that this will not be drawn. +# deprecated as of 0.8.0 ; ignore = 0 -# Noise reduction, int 0 - 100. default 77 +# noise reduction, int 0 - 100. default 77 # the raw visualization is very noisy, this factor adjusts the integral and gravity filters to keep the signal smooth # 100 will be very slow and smooth, 0 will be fast but noisy. ; noise_reduction = 77 @@ -299,25 +299,11 @@ gradient_color_8 = '#59cc33' [eq] -# This one is tricky. You can have as much keys as you want. -# Remember to uncomment more than one key! More keys = more precision. -# Look at readme.md on github for further explanations and examples. +# this one is tricky. you can have as much keys as you want. +# remember to uncomment more than one key! more keys = more precision. +# look at readme.md on github for further explanations and examples. ; 1 = 1 # bass ; 2 = 1 ; 3 = 1 # midtone ; 4 = 1 ; 5 = 1 # treble -### HYPRDOTS CAVA: Autogenerated line below for wallbash### - -[color] - - gradient = 1 - gradient_count = 8 - gradient_color_1 = '#332952' - gradient_color_2 = '#463A6B' - gradient_color_3 = '#7D4B5F' - gradient_color_4 = '#8F576D' - gradient_color_5 = '#A36578' - gradient_color_6 = '#C27A90' - gradient_color_7 = '#E69A9D' - gradient_color_8 = '#F0AAAD' diff --git a/.config/cava/shaders/eye_of_phi.frag b/.config/cava/shaders/eye_of_phi.frag new file mode 100644 index 0000000..99a7f30 --- /dev/null +++ b/.config/cava/shaders/eye_of_phi.frag @@ -0,0 +1,117 @@ +#version 330 + +// this shader was stolen from shadertoy user ChunderFPV + +#define SCALE 8.0 +#define PI radians(180.0) +#define TAU (PI * 2.0) +#define CS(a) vec2(cos(a), sin(a)) +#define PT(u, r) smoothstep(0.0, r, r - length(u)) + +in vec2 fragCoord; +out vec4 fragColor; + +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform float shader_time; // shader execution time s +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +// colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +// gradient map ( color, equation, time, width, shadow, reciprocal ) +vec3 gm(vec3 c, float n, float t, float w, float d, bool i) { + float g = min(abs(n), 1.0 / abs(n)); + float s = abs(sin(n * PI - t)); + if (i) + s = min(s, abs(sin(PI / n + t))); + return (1.0 - pow(abs(s), w)) * c * pow(g, d) * 6.0; +} + +// denominator spiral, use 1/n for numerator +// ( screen xy, spiral exponent, decimal, line width, hardness, rotation ) +float ds(vec2 u, float e, float n, float w, float h, float ro) { + float ur = length(u); // unit radius + float sr = pow(ur, e); // spiral radius + float a = round(sr) * n * TAU; // arc + vec2 xy = CS(a + ro) * ur; // xy coords + float l = PT(u - xy, w); // line + float s = mod(sr + 0.5, 1.0); // gradient smooth + s = min(s, 1.0 - s); // darken filter + return l * s * h; +} + +void main() { + float t = shader_time / PI * 2.0; + vec4 m = vec4(0, 0, 0, 0); // iMouse; + m.xy = m.xy * 2.0 / u_resolution.xy - 1.0; // ±1x, ±1y + if (m.z > 0.0) + t += m.y * SCALE; // move time with mouse y + float z = (m.z > 0.0) ? pow(1.0 - abs(m.y), sign(m.y)) : 1.0; // zoom (+) + float e = (m.z > 0.0) ? pow(1.0 - abs(m.x), -sign(m.x)) + : 1.0; // screen exponent (+) + float se = (m.z > 0.0) ? e * -sign(m.y) : 1.0; // spiral exponent + vec3 bg = vec3(0); // black background + + float aa = 3.0; // anti-aliasing + + for (float j = 0.0; j < aa; j++) + for (float k = 0.0; k < aa; k++) { + vec3 c = vec3(0); + vec2 o = vec2(j, k) / aa; + vec2 uv = (fragCoord * u_resolution.xy - 0.5 * u_resolution.xy + o) / + u_resolution.y * SCALE * z; // apply cartesian, scale and zoom + if (m.z > 0.0) + uv = + exp(log(abs(uv)) * e) * sign(uv); // warp screen space with exponent + + float px = length(fwidth(uv)); // pixel width + float x = uv.x; // every pixel on x + float y = uv.y; // every pixel on y + float l = length(uv); // hypot of xy: sqrt(x*x+y*y) + + float mc = (x * x + y * y - 1.0) / y; // metallic circle at xy + float g = min(abs(mc), 1.0 / abs(mc)); // gradient + vec3 gold = vec3(1.0, 0.6, 0.0) * g * l; + vec3 blue = vec3(0.3, 0.5, 0.9) * (1.0 - g); + vec3 rgb = max(gold, blue); + + float w = 0.1; // line width + float d = 0.4; // shadow depth + c = max(c, gm(rgb, mc, -t, w * bars[0], d, false)); // metallic + c = max(c, gm(rgb, abs(y / x) * sign(y), -t, w * bars[1], d, + false)); // tangent + c = max(c, gm(rgb, (x * x) / (y * y) * sign(y), -t, w * bars[2], d, + false)); // sqrt cotangent + c = max(c, gm(rgb, (x * x) + (y * y), t, w * bars[3], d, + true)); // sqrt circles + + c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[4], 2.0, 0.0); // spiral 1a + c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[5], 2.0, PI); // spiral 1b + c += + rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[6], 2.0, 0.0); // spiral 2a + c += rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[7], 2.0, PI); // spiral 2b + c = max(c, 0.0); // clear negative color + + c += pow(max(1.0 - l, 0.0), 3.0 / z); // center glow + + if (m.z > 0.0) // display grid on click + { + vec2 xyg = abs(fract(uv + 0.5) - 0.5) / px; // xy grid + c.gb += 0.2 * (1.0 - min(min(xyg.x, xyg.y), 1.0)); + } + bg += c; + } + bg /= aa * aa; + bg *= sqrt(bg) * 1.5; + + fragColor = vec4(bg, 1.0); +} diff --git a/.config/cava/themes/solarized_dark b/.config/cava/themes/solarized_dark new file mode 100644 index 0000000..200057c --- /dev/null +++ b/.config/cava/themes/solarized_dark @@ -0,0 +1,15 @@ +[color] +background = '#001e26' +foreground = '#708183' + +gradient = 1 +gradient_color_1 = '#268bd2' +gradient_color_2 = '#6c71c4' +gradient_color_3 = '#cb4b16' + +horizontal_gradient = 1 +horizontal_gradient_color_1 = '#586e75' +horizontal_gradient_color_2 = '#b58900' +horizontal_gradient_color_3 = '#839496' + +blend_direction = 'up' \ No newline at end of file diff --git a/.config/cava/themes/tricolor b/.config/cava/themes/tricolor new file mode 100644 index 0000000..b908137 --- /dev/null +++ b/.config/cava/themes/tricolor @@ -0,0 +1,10 @@ +[color] +horizontal_gradient = 1 +horizontal_gradient_color_1 = '#c45161' +horizontal_gradient_color_2 = '#e094a0' +horizontal_gradient_color_3 = '#f2b6c0' +horizontal_gradient_color_4 = '#f2dde1' +horizontal_gradient_color_5 = '#cbc7d8' +horizontal_gradient_color_6 = '#8db7d2' +horizontal_gradient_color_7 = '#5e62a9' +horizontal_gradient_color_8 = '#434279' \ No newline at end of file