/* ==UserStyle== @name ListenBrainz Catppuccin @namespace github.com/catppuccin/userstyles/styles/listenbrainz @homepageURL https://github.com/catppuccin/userstyles/tree/main/styles/listenbrainz @version 2025.09.06 @updateURL https://github.com/catppuccin/userstyles/raw/main/styles/listenbrainz/catppuccin.user.less @supportURL https://github.com/catppuccin/userstyles/issues?q=is%3Aopen+is%3Aissue+label%3Alistenbrainz @description Soothing pastel theme for ListenBrainz @author Catppuccin @license MIT @preprocessor less @var select lightFlavor "Light Flavor" ["latte:Latte*", "frappe:Frappé", "macchiato:Macchiato", "mocha:Mocha"] @var select darkFlavor "Dark Flavor" ["latte:Latte", "frappe:Frappé", "macchiato:Macchiato", "mocha:Mocha*"] @var select accentColor "Accent" ["rosewater:Rosewater", "flamingo:Flamingo", "pink:Pink", "mauve:Mauve*", "red:Red", "maroon:Maroon", "peach:Peach", "yellow:Yellow", "green:Green", "teal:Teal", "blue:Blue", "sapphire:Sapphire", "sky:Sky", "lavender:Lavender", "subtext0:Gray"] ==/UserStyle== */ @import "https://userstyles.catppuccin.com/lib/lib.less"; @-moz-document domain("listenbrainz.org") { :root { @media (prefers-color-scheme: light) { #catppuccin(@lightFlavor); } @media (prefers-color-scheme: dark) { #catppuccin(@darkFlavor); } } #catppuccin(@flavor) { #lib.palette(); #lib.defaults(); // We can't control which theme is passed to Toastify's props from CSS, but // we can replace the default theme with whatever colours we want. --toastify-color-light: @overlay0; --toastify-text-color-light: @text; --toastify-color-info: @blue; --toastify-color-success: @green; --toastify-color-warning: @yellow; --toastify-color-error: @red; body { color: @text; background-color: @base; nav[role="navigation"] { .navbar-header .navbar-toggle { border-color: @accent; .icon-bar { background-color: @accent; } } .navbar-logo > img { @svg: escape( '' ); content: url("data:image/svg+xml,@{svg}"); } #side-nav { background-color: @mantle; a, a:visited { color: @blue; &:hover { color: @sky; } } .search-bar input { background-color: @surface0; color: @text; &:focus { box-shadow: inset 1px 2px 4px @surface1; ~ button { box-shadow: inset -3px 2px 4px @surface2; } } ~ button { background-color: @surface1; color: @text; } } .mobile-nav-fix { background-color: transparent; } } #side-nav-overlay { background-color: @crust; } } } a { color: @blue; &:hover { color: @sky; } &:visited:not(.btn) { color: @lavender; &:hover { color: @sky; } } } h2, h3, h4 { color: @text; } .text-muted, .help-block { color: @subtext0; } .text-success { color: @green; } .text-danger { color: @red; } a > svg.fa-link { color: @text; } .form-control { border-color: @base; background-color: @surface0; color: @text; } .panel { background-color: @surface0; color: @text; border-color: @surface1; .panel-heading { background-color: @surface1; outline-color: @surface2; } } .well { background-color: @surface0; border-color: @mantle; } .toggle-switch { background-color: @surface0; &::before { background-color: @overlay0; } } .toggle-checkbox:checked + .toggle-switch { background-color: @surface1; &::before { background-color: @accent; } } .table { tr { > td, > th { border-color: @surface1; } } &.table-striped > tbody > tr:nth-of-type(2n+1) { background-color: @surface0; } } .music-service-selection .music-service-option { label { background-color: @surface1; border-color: fade(@green, 50%); } input[type="radio"]:checked + label { background-color: fade(@green, 50%); &::after { color: @green; border-color: @green; background-color: @surface1; } } } .pill.secondary { color: @text; border-color: @subtext0; } .btn-primary, .btn-info, .btn-outline, .musicbrainz-profile-button, .lb-follow-button.block, .pill.secondary.active { color: @crust; background-color: @accent; border-color: transparent; &:hover { color: @crust; background-color: darken(@accent, 5%); } } .open > .dropdown-toggle.btn-info { color: @crust; background-color: darken(@accent, 10%); } .secondary-nav > ol.breadcrumb { background-color: @mantle; border-color: @crust; > li.active { color: @text; border-color: transparent; } } .secondary-nav .nav.nav-tabs { background-color: @mantle; border-color: @crust; > li { background-color: @mantle; border-color: @crust; > a { background-color: transparent; border-color: @crust; color: @subtext1; &.active { border-bottom-color: transparent; } } &:hover { background-color: @surface0; } &.active { background-color: @base; border-bottom-color: transparent; } } } @media (max-width: 991px) { .secondary-nav::after { background: linear-gradient(270deg, @crust, transparent); } } .listen-header h3 { color: @subtext0; &::after { border-top-color: @surface1; } } .webSocket-box { border-bottom-color: @mantle; .read-more { background-image: linear-gradient(to bottom, transparent, @base); } } .heart-actions() { .love { stroke: @text; &.loved { color: @red; stroke: transparent; } &:hover { color: transparent; stroke: @red; } } .hate { stroke: @text; &.hated { color: @mauve; stroke: transparent; } &:hover { color: transparent; stroke: @mauve; } } } .card { background-color: @surface0; border-color: transparent; box-shadow: fade(@surface0, 10%) 0 1px 1px, fade(@surface0, 15%) 0 2px 2px, fade(@surface0, 20%) 0 4px 4px; &#listen-count-card { margin-bottom: 5px; border-color: @surface1; } &.listen-card { .listen-thumbnail > div { color: @accent; background-color: @surface1; border-top-left-radius: 7px; border-bottom-left-radius: 7px; } .listen-time { color: @subtext0; } .listen-controls { .btn.dropdown-toggle, .btn.play-button, .btn-transparent[title="Reset"] { color: @text; &:hover, &.playing { color: @accent; } } .heart-actions(); } &.playing-now, &.current-listen { background-color: @surface1 !important; .listen-thumbnail > div { background-color: @surface2; height: 100%; } } } } hr, #listen-count-card hr, .card-user-sn hr { border-top-color: @surface1; } .follower-following-list, .similar-users-list { box-shadow: inset 0 11px 8px -10px @base; > :not(:first-child) { border-color: @surface1; } } .progress { background-color: @surface1; .progress-bar.purple { background-color: @mauve; } .progress-bar.orange { background-color: @peach; } .progress-bar.red { background-color: @red; } } .dropdown-menu { background-color: @overlay0; button, a { color: @text !important; &:visited { color: @text !important; } &:hover { background-color: fade(@accent, 30%) !important; } } } .pager li { > a, > a:focus, > a:visited, a:active, > span { background-color: @surface0; border-color: @surface1; &:hover { background-color: @surface1; } } > a, > a:focus, > a:visited, > a:active { color: @blue; &:hover { color: @sky; } } &.disabled { > a, > a:focus, > a:visited, > a:active, > span { color: @text; background-color: @surface0; &:hover { background-color: inherit; } } } } .react-datetime-picker { .react-datetime-picker__wrapper { border-color: @mantle; } .react-calendar { background-color: @surface0; border-color: @surface1; .react-calendar__navigation, .react-calendar__viewContainer { button:disabled { background-color: @surface2; } button:enabled:hover { background-color: @surface1; } button:enabled:focus { background-color: transparent; } .react-calendar__tile--now { background-color: @peach; color: @crust; &:enabled:hover { background-color: @yellow; } } .react-calendar__tile--hasActive, .react-calendar__tile--active { color: @text; background-color: fade(@accent, 40%); &:enabled:hover { background-color: fade(@accent, 50%); } } } .react-calendar__month-view__days__day--neighboringMonth { color: @subtext0; } .react-calendar__month-view__days__day--weekend { color: @red; } } } .stats-full-width-graph { line { stroke: @subtext0 !important; } text { fill: @text !important; } &.user-artist-map > div + div > div, svg + div > div { background-color: @overlay0 !important; color: @text !important; } } rect[fill="#353070"] { fill: @mauve; } rect[fill="#eb743b"] { fill: @peach; } .badge-info { background-color: @surface1; color: @text; } .modal-content { background-color: @mantle; button.close { color: @text; opacity: 1; text-shadow: none; } .track-search { #recording-mbid, .track-search-dropdown { background-color: @surface0; color: @text; border-color: @crust; } } .modal-header, .modal-footer { border-color: @crust; } } .explore-card { background-color: @surface0; filter: drop-shadow(0 4px 4px fade(@overlay0, 25%)); .explore-card-img { border-color: @surface0; } .explore-card-text { background-color: @surface0; } } .sidebar { background-color: @mantle; .sidebar-header { background-color: @crust; color: @text; } .sidenav-content-grid { background: transparent; } } .rc-slider-rail { background-color: @surface1; } .rc-slider-handle { background-color: @accent; &.rc-slider-handle-dragging { background-color: @accent; border-color: @accent; } } .rc-slider-mark-text { color: @subtext0; } .release-card-grid-title { background-color: transparent; &::before, &::after { border-color: @surface0; } } #homepage-container { @homepage-bg: linear-gradient(288deg, @peach 16.96%, @mauve 98.91%); @flipped-blue: if( @flavor = latte, @catppuccin[@mocha][@blue], @catppuccin[@latte][@blue] ); @flipped-sky: if( @flavor = latte, @catppuccin[@mocha][@sky], @catppuccin[@latte][@sky] ); .homepage-upper { background: @homepage-bg; h1 { color: @crust; } .homepage-info { h1 { color: @text; } .homepage-info-links > a { color: @blue; &:hover { color: @sky; } } } .homepage-upper-grey-box { background-color: @base; } } .homepage-lower { background: @homepage-bg; h1 { color: @text; } .homepage-info { color: @crust; h1 { color: @crust; } .homepage-info-links > a { color: @flipped-blue; &:hover { color: @flipped-sky; } } } .homepage-lower-grey-box { background-color: @base; } } .homepage-info { color: @text; .create-account-button { background-color: @accent; color: @crust; &:hover { background-color: darken(@accent, 5%); } } } } #brainz-player { background-color: @mantle; border-color: @crust; .progress { background-color: @surface1; > .progress-bar { background-color: @accent; } } .no-album-art { background-color: transparent; } .controls > .btn-link, .actions > a { color: @accent; } .actions { .heart-actions(); .fa-ellipsis-vertical { stroke: @accent; } } .dropup-content { .dropdown-menu(); } } .footer { background-color: @mantle; color: @text; border-color: @crust; .color-gray { color: @subtext0; } .section-line { border-color: @crust; } } } }