From 348f95484eef4254091696744a7762b793cd1029 Mon Sep 17 00:00:00 2001 From: matt1432 Date: Sun, 17 Sep 2023 17:27:23 -0400 Subject: [PATCH] feat(ags): modify player config to my liking --- config/ags/js/media-player/mpris.js | 384 ++++++++++++++------------- config/ags/js/media-player/player.js | 147 +++++----- config/ags/scss/widgets/player.scss | 278 +++++++------------ config/ags/style.css | 206 +++++--------- nixos/home/hyprland.nix | 2 +- 5 files changed, 444 insertions(+), 573 deletions(-) diff --git a/config/ags/js/media-player/mpris.js b/config/ags/js/media-player/mpris.js index bd9008b..20dd971 100644 --- a/config/ags/js/media-player/mpris.js +++ b/config/ags/js/media-player/mpris.js @@ -1,237 +1,261 @@ const { CACHE_DIR, execAsync, ensureDirectory, lookUpIcon } = ags.Utils; -const { Button, Icon, Label, Box, Stack, Slider } = ags.Widget; +const { Button, Icon, Label, Box, Stack, Slider, CenterBox } = ags.Widget; const { GLib } = imports.gi; const icons = { mpris: { fallback: 'audio-x-generic-symbolic', shuffle: { - enabled: '󰒟', - disabled: '󰒟', + enabled: '󰒝', + disabled: '󰒞', }, loop: { - none: '󰓦', - track: '󰓦', - playlist: '󰑐', + none: '󰑗', + track: '󰑘', + playlist: '󰑖', }, - playing: '󰏦', - paused: '󰐍', - stopped: '󰐍', + playing: ' ', + paused: ' ', + stopped: ' ', prev: '󰒮', next: '󰒭', }, } + +let coloryou = path => ['bash', '-c', `[[ -f "${path}" ]] && coloryou "${path}"`]; + const MEDIA_CACHE_PATH = CACHE_DIR + '/media'; -export const CoverArt = (player, props) => Box({ - ...props, - className: 'cover', - connections: [[player, box => { - box.setStyle(`background-image: url("${player.coverPath}")`); - }]], +export const CoverArt = (player, params) => CenterBox({ + ...params, + className: 'player', + vertical: true, + connections: [ + [player, box => { + execAsync(coloryou(player.coverPath)) + .then(out => { + let colors = JSON.parse(out); + + box.setStyle(`background: radial-gradient(circle, + rgba(0, 0, 0, 0.4) 30%, + ${colors.imageAccent}), + url("${player.coverPath}"); + background-size: cover; + background-position: center;`); + }).catch(err => { if (err !== "") print(err) }); + }], + ], }); -export const BlurredCoverArt = (player, props) => Box({ - ...props, - className: 'blurred-cover', - connections: [[player, box => { - const url = player.coverPath; - if (!url) - return; - - const blurredPath = MEDIA_CACHE_PATH + '/blurred'; - const blurred = blurredPath + - url.substring(MEDIA_CACHE_PATH.length); - - if (GLib.file_test(blurred, GLib.FileTest.EXISTS)) { - box.setStyle(`background-image: url("${blurred}")`); - return; - } - - ensureDirectory(blurredPath); - execAsync(['convert', url, '-blur', '0x22', blurred]) - .then(() => box.setStyle(`background-image: url("${blurred}")`)) - .catch(() => { }); - }]], +export const TitleLabel = (player, params) => Label({ + ...params, + xalign: 0, + maxWidthChars: 40, + truncate: 'end', + justification: 'left', + className: 'title', + binds: [['label', player, 'trackTitle']], }); -export const TitleLabel = (player, props) => Label({ - ...props, - className: 'title', - binds: [['label', player, 'trackTitle']], +export const ArtistLabel = (player, params) => Label({ + ...params, + xalign: 0, + maxWidthChars: 40, + truncate: 'end', + justification: 'left', + className: 'artist', + connections: [[player, label => { + label.label = player.trackArtists.join(', ') || ''; + }]], }); -export const ArtistLabel = (player, props) => Label({ - ...props, - className: 'artist', - connections: [[player, label => { - label.label = player.trackArtists.join(', ') || ''; - }]], +export const PlayerIcon = (player, { symbolic = true, ...params } = {}) => Icon({ + ...params, + className: 'player-icon', + tooltipText: player.indentity || '', + connections: [[player, icon => { + const name = `${player.entry}${symbolic ? '-symbolic' : ''}`; + lookUpIcon(name) ? icon.icon = name + : icon.icon = icons.mpris.fallback; + }]], }); -export const PlayerIcon = (player, { symbolic = true, ...props } = {}) => Icon({ - ...props, - className: 'player-icon', - tooltipText: player.indentity || '', - connections: [[player, icon => { - const name = `${player.entry}${symbolic ? '-symbolic' : ''}`; - lookUpIcon(name) - ? icon.icon = name - : icon.icon = icons.mpris.fallback; - }]], -}); +export const PositionSlider = (player, params) => Slider({ + ...params, + className: 'position-slider', + hexpand: true, + drawValue: false, + onChange: ({ value }) => { + player.position = player.length * value; + }, + properties: [ + ['update', slider => { + execAsync(coloryou(player.coverPath)) + .then(out => { + let colors = JSON.parse(out); -export const PositionSlider = (player, props) => Slider({ - ...props, - className: 'position-slider', - drawValue: false, - onChange: ({ value }) => { - player.position = player.length * value; - }, - properties: [['update', slider => { - if (slider.dragging) - return; + slider.setCss(`highlight { background-color: ${colors.buttonAccent}; } + slider { background-color: ${colors.buttonAccent}; } + slider:hover { background-color: #303240; } + trough { background-color: ${colors.buttonAccent}; }`); + }).catch(err => { if (err !== "") print(err) }); - slider.visible = player.length > 0; - if (player.length > 0) - slider.value = player.position / player.length; - }]], - connections: [ - [player, s => s._update(s), 'position'], - [1000, s => s._update(s)], - ], + if (slider.dragging) + return; + + slider.sensitive = player.length > 0; + if (player.length > 0) + slider.value = player.position / player.length; + }], + ], + connections: [ + [player, s => s._update(s), 'position'], + [1000, s => s._update(s)], + ], }); function lengthStr(length) { - const min = Math.floor(length / 60); - const sec0 = Math.floor(length % 60) < 10 ? '0' : ''; - const sec = Math.floor(length % 60); - return `${min}:${sec0}${sec}`; + const min = Math.floor(length / 60); + const sec0 = Math.floor(length % 60) < 10 ? '0' : ''; + const sec = Math.floor(length % 60); + return `${min}:${sec0}${sec}`; } export const PositionLabel = player => Label({ - properties: [['update', label => { - player.length > 0 - ? label.label = lengthStr(player.position) - : label.visible = !!player; - }]], - connections: [ - [player, l => l._update(l), 'position'], - [1000, l => l._update(l)], - ], + properties: [['update', label => { + player.length > 0 ? label.label = lengthStr(player.position) + : label.visible = !!player; + }]], + connections: [ + [player, l => l._update(l), 'position'], + [1000, l => l._update(l)], + ], }); export const LengthLabel = player => Label({ - connections: [[player, label => { - player.length > 0 - ? label.label = lengthStr(player.length) - : label.visible = !!player; - }]], + connections: [[player, label => { + player.length > 0 ? label.label = lengthStr(player.length) + : label.visible = !!player; + }]], }); export const Slash = player => Label({ - label: '/', - connections: [[player, label => { - label.visible = player.length > 0; - }]], + label: '/', + connections: [[player, label => { + label.visible = player.length > 0; + }]], }); -const PlayerButton = ({ player, items, onClick, prop, canProp, cantValue }) => Button({ - child: Stack({ items }), - onClicked: () => player[onClick](), - connections: [[player, button => { - button.visible = player[canProp] !== cantValue; - button.child.shown = `${player[prop]}`; - }]], +const PlayerButton = ({ player, items, onClick, prop }) => Button({ + child: Stack({ items }), + onPrimaryClickRelease: () => player[onClick](), + connections: [ + [player, button => { + button.child.shown = `${player[prop]}`; + + execAsync(coloryou(player.coverPath)) + .then(out => { + let colors = JSON.parse(out); + + if (prop == 'playBackStatus') { + items.forEach(item => { + item[1].setStyle(`background-color: ${colors.buttonAccent}; + color: ${colors.buttonText};`); + }) + } + else { + button.setStyle(`color: ${colors.buttonAccent};`); + } + }).catch(err => { if (err !== "") print(err) }); + }], + ], }); export const ShuffleButton = player => PlayerButton({ - player, - items: [ - ['true', Label({ - className: 'shuffle enabled', - label: icons.mpris.shuffle.enabled, - })], - ['false', Label({ - className: 'shuffle disabled', - label: icons.mpris.shuffle.disabled, - })], - ], - onClick: 'shuffle', - prop: 'shuffleStatus', - canProp: 'shuffleStatus', - cantValue: null, + player, + items: [ + ['true', Label({ + className: 'shuffle enabled', + label: icons.mpris.shuffle.enabled, + })], + ['false', Label({ + className: 'shuffle disabled', + label: icons.mpris.shuffle.disabled, + })], + ], + onClick: 'shuffle', + prop: 'shuffleStatus', }); export const LoopButton = player => PlayerButton({ - player, - items: [ - ['None', Label({ - className: 'loop none', - label: icons.mpris.loop.none, - })], - ['Track', Label({ - className: 'loop track', - label: icons.mpris.loop.track, - })], - ['Playlist', Label({ - className: 'loop playlist', - label: icons.mpris.loop.playlist, - })], - ], - onClick: 'loop', - prop: 'loopStatus', - canProp: 'loopStatus', - cantValue: null, + player, + items: [ + ['None', Label({ + className: 'loop none', + label: icons.mpris.loop.none, + })], + ['Track', Label({ + className: 'loop track', + label: icons.mpris.loop.track, + })], + ['Playlist', Label({ + className: 'loop playlist', + label: icons.mpris.loop.playlist, + })], + ], + onClick: 'loop', + prop: 'loopStatus', }); export const PlayPauseButton = player => PlayerButton({ - player, - items: [ - ['Playing', Label({ - className: 'playing', - label: icons.mpris.playing, - })], - ['Paused', Label({ - className: 'paused', - label: icons.mpris.paused, - })], - ['Stopped', Label({ - className: 'stopped', - label: icons.mpris.stopped, - })], - ], - onClick: 'playPause', - prop: 'playBackStatus', - canProp: 'canPlay', - cantValue: false, + player, + items: [ + ['Playing', Label({ + className: 'pausebutton playing', + label: icons.mpris.playing, + })], + ['Paused', Label({ + className: 'pausebutton paused', + label: icons.mpris.paused, + })], + ['Stopped', Label({ + className: 'pausebutton stopped paused', + label: icons.mpris.stopped, + })], + ], + onClick: 'playPause', + prop: 'playBackStatus', }); export const PreviousButton = player => PlayerButton({ - player, - items: [ - ['true', Label({ - className: 'previous', - label: icons.mpris.prev, - })], - ], - onClick: 'previous', - prop: 'canGoPrev', - canProp: 'canGoPrev', - cantValue: false, + player, + items: [ + ['true', Label({ + className: 'previous', + label: icons.mpris.prev, + })], + ['false', Label({ + className: 'previous', + label: icons.mpris.prev, + })], + ], + onClick: 'previous', + prop: 'canGoPrev', }); export const NextButton = player => PlayerButton({ - player, - items: [ - ['true', Label({ - className: 'next', - label: icons.mpris.next, - })], - ], - onClick: 'next', - prop: 'canGoNext', - canProp: 'canGoNext', - cantValue: false, + player, + items: [ + ['true', Label({ + className: 'next', + label: icons.mpris.next, + })], + ['false', Label({ + className: 'next', + label: icons.mpris.next, + })], + ], + onClick: 'next', + prop: 'canGoNext', }); diff --git a/config/ags/js/media-player/player.js b/config/ags/js/media-player/player.js index 56669a7..fd48d88 100644 --- a/config/ags/js/media-player/player.js +++ b/config/ags/js/media-player/player.js @@ -1,84 +1,85 @@ -import * as mpris from './mpris.js'; const { Mpris } = ags.Service; -const { Box, CenterBox } = ags.Widget; +const { Box, CenterBox, Label } = ags.Widget; -const Footer = player => CenterBox({ - className: 'footer-box', - children: [ - Box({ - className: 'position', - children: [ - mpris.PositionLabel(player), - mpris.Slash(player), - mpris.LengthLabel(player), - ], - }), - Box({ - className: 'controls', - children: [ - mpris.ShuffleButton(player), - mpris.PreviousButton(player), - mpris.PlayPauseButton(player), - mpris.NextButton(player), - mpris.LoopButton(player), - ], - }), - mpris.PlayerIcon(player, { - symbolic: false, - hexpand: true, - halign: 'end', - }), - ], +import * as mpris from './mpris.js'; +import { Separator } from '../misc/separator.js'; + +const Top = player => Box({ + className: 'top', + halign: 'start', + valign: 'start', + children: [ + mpris.PlayerIcon(player, { + symbolic: false, + }), + ], }); -const TextBox = player => Box({ - children: [ - mpris.CoverArt(player, { - halign: 'end', - hexpand: false, - child: Box({ - className: 'shader', - hexpand: true, - }), - }), +const Center = player => Box({ + className: 'center', + children: [ + + CenterBox({ + vertical: true, + children: [ + Box({ - hexpand: true, - vertical: true, - className: 'labels', - children: [ - mpris.TitleLabel(player, { - xalign: 0, - justification: 'left', - wrap: true, - }), - mpris.ArtistLabel(player, { - xalign: 0, - justification: 'left', - wrap: true, - }), - ], + className: 'metadata', + vertical: true, + halign: 'start', + valign: 'center', + hexpand: true, + children: [ + mpris.TitleLabel(player), + mpris.ArtistLabel(player), + ], }), - ], + + Label(), + Label(), + ], + }), + + CenterBox({ + vertical: true, + children: [ + Label(), + mpris.PlayPauseButton(player), + Label(), + ], + }), + + ], }); -const PlayerBox = player => Box({ - className: `player ${player.name}`, - children: [ - mpris.BlurredCoverArt(player, { - className: 'cover-art-bg', - hexpand: true, - children: [Box({ - className: 'shader', - hexpand: true, - vertical: true, - children: [ - TextBox(player), - mpris.PositionSlider(player), - Footer(player), - ], - })], - }), - ], +const Bottom = player => Box({ + className: 'bottom', + children: [ + + mpris.PreviousButton(player, { + valign: 'end', + halign: 'start', + }), + Separator(8), + mpris.PositionSlider(player), + Separator(8), + mpris.NextButton(player), + Separator(8), + mpris.ShuffleButton(player), + Separator(8), + mpris.LoopButton(player), + + ], +}); + +const PlayerBox = player => mpris.CoverArt(player, { + className: `player ${player.name}`, + hexpand: true, + children: [ + Top(player), + Center(player), + Bottom(player), + ], }); export default () => Box({ diff --git a/config/ags/scss/widgets/player.scss b/config/ags/scss/widgets/player.scss index da9c7b9..2dcd183 100644 --- a/config/ags/scss/widgets/player.scss +++ b/config/ags/scss/widgets/player.scss @@ -1,189 +1,101 @@ .arrow { transition: -gtk-icon-transform 0.3s ease-in-out; - margin-bottom: 5px; + margin-bottom: 12px; } -.media .player { - all: unset; - border-radius: 9px; - color: #eee; - background-color: rgba(238, 238, 238, 0.06); - border: 1px solid rgba(238, 238, 238, 0.03); - margin-top: 9px; - * { - font-size: 16px; - font-family: "Ubuntu Nerd Font", sans-serif; - } - label { - color: white; - text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6); - } - .shader { - all: unset; - box-shadow: inset 0 0 3em 1em rgba(23, 23, 23, 0.7); - * { - font-size: 16px; - font-family: "Ubuntu Nerd Font", sans-serif; - } - label { - color: white; - text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6); - } - } - .cover { - border-radius: 7.2px; - min-height: 100px; - min-width: 100px; - box-shadow: 2px 2px 2px 0 rgba(0, 0, 0, 0.6); - margin: 9px; - margin-bottom: 0; - .shader { - background-color: transparent; - border-radius: 6.2px; - box-shadow: inset 0 0 0 999px rgba(23, 23, 23, 0.2); - } - } - .blurred-cover, .cover { - background-size: cover; - background-position: center; - border-radius: 8px; - } - .labels { - margin-top: 9px; - label { - font-size: 1.1em; - text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6); - &.title { - font-weight: bold; - } - } - } - .position-slider { - all: unset; - margin: 9px 0; - * { - font-size: 16px; - font-family: "Ubuntu Nerd Font", sans-serif; - } - * { - all: unset; - } - trough { - transition: 200ms; - border-radius: 0; - border: 1px solid rgba(238, 238, 238, 0.03); - background-color: rgba(238, 238, 238, 0.06); - min-height: 0.4em; - min-width: 0.4em; - highlight, progress { - border-radius: 0; - background-image: linear-gradient(white, white); - min-height: 0.4em; - min-width: 0.4em; - } - &:focus { - background-color: rgba(238, 238, 238, 0.154); - box-shadow: inset 0 0 0 1px #51a4e7; - } - } - slider { - box-shadow: none; - background-color: transparent; - border: 1px solid transparent; - transition: 200ms; - border-radius: 0; - min-height: 0.4em; - min-width: 0.4em; - margin: -0.5em; - } - &:hover trough { - background-color: rgba(238, 238, 238, 0.154); - } - &:disabled highlight, &:disabled progress { - background-color: rgba(238, 238, 238, 0.6); - background-image: none; - } - trough { - border: none; - background-color: rgba(255, 255, 255, 0.3); - } - } - .footer-box { - margin: -4.5px 9px 4.5px; - image { - -gtk-icon-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6); - } - } - .controls button { - all: unset; - label { - font-size: 2em; - color: rgba(255, 255, 255, 0.8); - transition: 200ms; - &.shuffle, &.loop { - font-size: 1.4em; - } - } - &:hover label { - color: rgba(255, 255, 255, 0.9); - } - &:active label { - color: white; - } - } - &.spotify button .shuffle.enabled { - color: #43c383; - } - &.spotify button .loop.playlist, &.spotify button .loop.track { - color: #43c383; - } - &.spotify button:active label { - color: #43c383; - } - &.spotify .position-slider:hover trough { - background-color: rgba(67, 195, 131, 0.5); - } - &.spotify .player-icon { - color: #43c383; - } - &.firefox button .shuffle.enabled { - color: #E79E64; - } - &.firefox button .loop.playlist, &.firefox button .loop.track { - color: #E79E64; - } - &.firefox button:active label { - color: #E79E64; - } - &.firefox .position-slider:hover trough { - background-color: rgba(231, 158, 100, 0.5); - } - &.firefox .player-icon { - color: #E79E64; - } - &.mpv button .shuffle.enabled { - color: #9077e7; - } - &.mpv button .loop.playlist, &.mpv button .loop.track { - color: #9077e7; - } - &.mpv button:active label { - color: #9077e7; - } - &.mpv .position-slider:hover trough { - background-color: rgba(144, 119, 231, 0.5); - } - &.mpv .player-icon { - color: #9077e7; - } -} -.media.spotify image { - color: #43c383; -} -.media.firefox image { - color: #E79E64; -} -.media.mpv image { - color: #9077e7; +.media { + margin-top: 9px; +} + +.player { + all: unset; + padding: 10px; + min-width: 400px; + min-height: 200px; + border-radius: 30px; + border-top: 2px solid $contrastbg; + border-bottom: 2px solid $contrastbg; + transition: background 250ms; + .top { + font-size: 23px; + } + .metadata { + .title{ + font-weight: 500; + transition: text 250ms; + } + .artist{ + font-weight: 400; + font-size: 15px; + transition: text 250ms; + } + } + .bottom { + font-size: 30px; + } + + .pausebutton { + transition: background 250ms; + font-size: 15px; + min-height: 14px; + min-width: 14px; + padding: 14px 14px 14px 17px; + } + + .playing { + transition: all ease .2s; + border-radius: 15px; + } + + .stopped, + .paused { + border-radius: 26px; + transition: all ease .2s; + padding: 14px 14px 14px 20px; + } + button label { + min-width: 35px; + } +} + +.previous, +.next, +.shuffle, +.loop { + border-radius: 100%; + transition: background-color 200ms; + &:hover { + border-radius: 100%; + background-color: rgba(127, 132, 156, 0.4); + transition: background-color 200ms; + } +} + +.loop { + label { + padding-right: 8px; + } +} + +.position-slider { + highlight { + margin: 0px; + border-radius: 2em; + } + + trough { + border-radius: 2em; + } + + slider { + margin: -8px; + min-height: 20px; + border-radius: 10px; + box-shadow: rgba(0, 0, 0, 0.25) 0px 54px 55px, rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px, rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px; + transition: background-color 0.5s ease-in-out; + } + slider:hover { + transition: background-color 0.5s ease-in-out; + } } diff --git a/config/ags/style.css b/config/ags/style.css index a73cb15..f3ada8b 100644 --- a/config/ags/style.css +++ b/config/ags/style.css @@ -591,144 +591,78 @@ calendar:indeterminate { .arrow { transition: -gtk-icon-transform 0.3s ease-in-out; - margin-bottom: 5px; } + margin-bottom: 12px; } -.media .player { - all: unset; - border-radius: 9px; - color: #eee; - background-color: rgba(238, 238, 238, 0.06); - border: 1px solid rgba(238, 238, 238, 0.03); +.media { margin-top: 9px; } - .media .player * { - font-size: 16px; - font-family: "Ubuntu Nerd Font", sans-serif; } - .media .player label { - color: white; - text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6); } - .media .player .shader { - all: unset; - box-shadow: inset 0 0 3em 1em rgba(23, 23, 23, 0.7); } - .media .player .shader * { - font-size: 16px; - font-family: "Ubuntu Nerd Font", sans-serif; } - .media .player .shader label { - color: white; - text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6); } - .media .player .cover { - border-radius: 7.2px; - min-height: 100px; - min-width: 100px; - box-shadow: 2px 2px 2px 0 rgba(0, 0, 0, 0.6); - margin: 9px; - margin-bottom: 0; } - .media .player .cover .shader { - background-color: transparent; - border-radius: 6.2px; - box-shadow: inset 0 0 0 999px rgba(23, 23, 23, 0.2); } - .media .player .blurred-cover, .media .player .cover { - background-size: cover; - background-position: center; - border-radius: 8px; } - .media .player .labels { - margin-top: 9px; } - .media .player .labels label { - font-size: 1.1em; - text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6); } - .media .player .labels label.title { - font-weight: bold; } - .media .player .position-slider { - all: unset; - margin: 9px 0; } - .media .player .position-slider * { - font-size: 16px; - font-family: "Ubuntu Nerd Font", sans-serif; } - .media .player .position-slider * { - all: unset; } - .media .player .position-slider trough { - transition: 200ms; - border-radius: 0; - border: 1px solid rgba(238, 238, 238, 0.03); - background-color: rgba(238, 238, 238, 0.06); - min-height: 0.4em; - min-width: 0.4em; } - .media .player .position-slider trough highlight, .media .player .position-slider trough progress { - border-radius: 0; - background-image: linear-gradient(white, white); - min-height: 0.4em; - min-width: 0.4em; } - .media .player .position-slider trough:focus { - background-color: rgba(238, 238, 238, 0.154); - box-shadow: inset 0 0 0 1px #51a4e7; } - .media .player .position-slider slider { - box-shadow: none; - background-color: transparent; - border: 1px solid transparent; - transition: 200ms; - border-radius: 0; - min-height: 0.4em; - min-width: 0.4em; - margin: -0.5em; } - .media .player .position-slider:hover trough { - background-color: rgba(238, 238, 238, 0.154); } - .media .player .position-slider:disabled highlight, .media .player .position-slider:disabled progress { - background-color: rgba(238, 238, 238, 0.6); - background-image: none; } - .media .player .position-slider trough { - border: none; - background-color: rgba(255, 255, 255, 0.3); } - .media .player .footer-box { - margin: -4.5px 9px 4.5px; } - .media .player .footer-box image { - -gtk-icon-shadow: 2px 2px 2px rgba(0, 0, 0, 0.6); } - .media .player .controls button { - all: unset; } - .media .player .controls button label { - font-size: 2em; - color: rgba(255, 255, 255, 0.8); - transition: 200ms; } - .media .player .controls button label.shuffle, .media .player .controls button label.loop { - font-size: 1.4em; } - .media .player .controls button:hover label { - color: rgba(255, 255, 255, 0.9); } - .media .player .controls button:active label { - color: white; } - .media .player.spotify button .shuffle.enabled { - color: #43c383; } - .media .player.spotify button .loop.playlist, .media .player.spotify button .loop.track { - color: #43c383; } - .media .player.spotify button:active label { - color: #43c383; } - .media .player.spotify .position-slider:hover trough { - background-color: rgba(67, 195, 131, 0.5); } - .media .player.spotify .player-icon { - color: #43c383; } - .media .player.firefox button .shuffle.enabled { - color: #E79E64; } - .media .player.firefox button .loop.playlist, .media .player.firefox button .loop.track { - color: #E79E64; } - .media .player.firefox button:active label { - color: #E79E64; } - .media .player.firefox .position-slider:hover trough { - background-color: rgba(231, 158, 100, 0.5); } - .media .player.firefox .player-icon { - color: #E79E64; } - .media .player.mpv button .shuffle.enabled { - color: #9077e7; } - .media .player.mpv button .loop.playlist, .media .player.mpv button .loop.track { - color: #9077e7; } - .media .player.mpv button:active label { - color: #9077e7; } - .media .player.mpv .position-slider:hover trough { - background-color: rgba(144, 119, 231, 0.5); } - .media .player.mpv .player-icon { - color: #9077e7; } -.media.spotify image { - color: #43c383; } +.player { + all: unset; + padding: 10px; + min-width: 400px; + min-height: 200px; + border-radius: 30px; + border-top: 2px solid rgba(189, 147, 249, 0.8); + border-bottom: 2px solid rgba(189, 147, 249, 0.8); + transition: background 250ms; } + .player .top { + font-size: 23px; } + .player .metadata .title { + font-weight: 500; + transition: text 250ms; } + .player .metadata .artist { + font-weight: 400; + font-size: 15px; + transition: text 250ms; } + .player .bottom { + font-size: 30px; } + .player .pausebutton { + transition: background 250ms; + font-size: 15px; + min-height: 14px; + min-width: 14px; + padding: 14px 14px 14px 17px; } + .player .playing { + transition: all ease .2s; + border-radius: 15px; } + .player .stopped, + .player .paused { + border-radius: 26px; + transition: all ease .2s; + padding: 14px 14px 14px 20px; } + .player button label { + min-width: 35px; } -.media.firefox image { - color: #E79E64; } +.previous, +.next, +.shuffle, +.loop { + border-radius: 100%; + transition: background-color 200ms; } + .previous:hover, + .next:hover, + .shuffle:hover, + .loop:hover { + border-radius: 100%; + background-color: rgba(127, 132, 156, 0.4); + transition: background-color 200ms; } -.media.mpv image { - color: #9077e7; } +.loop label { + padding-right: 8px; } + +.position-slider highlight { + margin: 0px; + border-radius: 2em; } + +.position-slider trough { + border-radius: 2em; } + +.position-slider slider { + margin: -8px; + min-height: 20px; + border-radius: 10px; + box-shadow: rgba(0, 0, 0, 0.25) 0px 54px 55px, rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px, rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px; + transition: background-color 0.5s ease-in-out; } + +.position-slider slider:hover { + transition: background-color 0.5s ease-in-out; } diff --git a/nixos/home/hyprland.nix b/nixos/home/hyprland.nix index b5a31e2..e171f5f 100644 --- a/nixos/home/hyprland.nix +++ b/nixos/home/hyprland.nix @@ -11,7 +11,7 @@ in { home.packages = [ - (builtins.getFlake "github:Aylur/ags").packages.x86_64-linux.default + (builtins.getFlake "github:matt1432/ags").packages.x86_64-linux.default pkgs.sassc pkgs.kora-icon-theme pkgs.coloryou