/* ==UserStyle== @name Proton Catppuccin @namespace github.com/Sebagabones/userstyles/styles/proton @homepageURL https://github.com/Sebagabones/userstyles/tree/main/styles/proton @version 2025.12.05 @updateURL https://github.com/Sebagabones/userstyles/raw/main/styles/proton/catppuccin.user.less @supportURL https://github.com/Sebagabones/userstyles/issues?q=is%3Aopen+is%3Aissue+label%3Aproton @description Soothing pastel theme for Proton @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://raw.githubusercontent.com/Sebagabones/userstyles/refs/heads/main/lib/lib.less"; @-moz-document regexp( "https://(account|mail|drive|calendar|lumo).proton.me/.*$" ) { :root { @media (prefers-color-scheme: light) { #catppuccin(@lightFlavor); } @media (prefers-color-scheme: dark) { #catppuccin(@darkFlavor); } } #catppuccin(@flavor) { #lib.palette(); #lib.defaults(); svg.logo { @accentH: hue(@accent); @protonH: hue(#6d4aff); .replaceColor(@org, @property) { &[@{property}="@{org}"] { @hDiff: @protonH - hue(@org); @{property}: hsl( @accentH - @hDiff, saturation(@org) - 30%, lightness(@org) ); } } /* deno-fmt-ignore */ path { .replaceColor(#B8D7FF, fill); .replaceColor(#8F69FF, fill); .replaceColor(#6D4AFF, fill); .replaceColor(#FFBB93, fill); .replaceColor(#85D4F5, fill); .replaceColor(#D6F1FC, fill); } /* deno-fmt-ignore */ defs stop { .replaceColor(#E3D9FF, stop-color); .replaceColor(#7341FF, stop-color); .replaceColor(#6D4AFF, stop-color); .replaceColor(#AA8EFF, stop-color); .replaceColor(#06B8FF, stop-color); .replaceColor(#BFE8FF, stop-color); .replaceColor(#BFABFF, stop-color); .replaceColor(#FF50C3, stop-color); .replaceColor(#B487FF, stop-color); .replaceColor(#FFC8FF, stop-color); .replaceColor(#8EFFEE, stop-color); .replaceColor(#C9C7FF, stop-color); .replaceColor(#00F0C3, stop-color); .replaceColor(#FFD580, stop-color); .replaceColor(#F6C592, stop-color); .replaceColor(#EBB6A2, stop-color); .replaceColor(#DFA5AF, stop-color); .replaceColor(#D397BE, stop-color); .replaceColor(#C486CB, stop-color); .replaceColor(#B578D9, stop-color); .replaceColor(#A166E5, stop-color); .replaceColor(#8B57F2, stop-color); .replaceColor(#704CFF, stop-color); .replaceColor(#B39FFB, stop-color); .replaceColor(#FFE8DB, stop-color); .replaceColor(#957AFD, stop-color); .replaceColor(#FFC6C6, stop-color); .replaceColor(#FA528E, stop-color); .replaceColor(#FF8065, stop-color); .replaceColor(#FFA51F, stop-color); .replaceColor(#34B8EE, stop-color); } } &, .ui-prominent, .ui-standard { #lightenOrDarken(@color, @value) { @result: if( @flavor = latte, lighten(@color, @value), darken(@color, @value) ); } #darkenOrLighten(@color, @value) { @result: if( @flavor = latte, darken(@color, @value), lighten(@color, @value) ); } --primary-minor-2: #lightenOrDarken(@accent, 60%)[]; --primary-minor-1: #lightenOrDarken(@accent, 50%)[]; --primary: @accent; --primary-major-1: #darkenOrLighten(@accent, 4%)[]; --primary-major-2: #darkenOrLighten(@accent, 8%)[]; --primary-major-3: #darkenOrLighten(@accent, 12%)[]; --primary-contrast: @mantle; --signal-danger-minor-2: #lightenOrDarken(@maroon, 40%)[]; --signal-danger-minor-1: #lightenOrDarken(@maroon, 30%)[]; --signal-danger: @maroon; --signal-danger-major-1: #darkenOrLighten(@maroon, 4%)[]; --signal-danger-major-2: #darkenOrLighten(@maroon, 8%)[]; --signal-danger-major-3: #darkenOrLighten(@maroon, 12%)[]; --signal-danger-contrast: @mantle; --signal-warning-minor-2: #lightenOrDarken(@peach, 40%)[]; --signal-warning-minor-1: #lightenOrDarken(@peach, 30%)[]; --signal-warning: @peach; --signal-warning-major-1: #darkenOrLighten(@peach, 4%)[]; --signal-warning-major-2: #darkenOrLighten(@peach, 8%)[]; --signal-warning-major-3: #darkenOrLighten(@peach, 12%)[]; --signal-warning-contrast: @mantle; --signal-success-minor-2: #lightenOrDarken(@green, 40%)[]; --signal-success-minor-1: #lightenOrDarken(@green, 30%)[]; --signal-success: @green; --signal-success-major-1: #darkenOrLighten(@green, 4%)[]; --signal-success-major-2: #darkenOrLighten(@green, 8%)[]; --signal-success-major-3: #darkenOrLighten(@green, 12%)[]; --signal-success-contrast: @mantle; --signal-info-minor-2: #lightenOrDarken(@blue, 40%)[]; --signal-info-minor-1: #lightenOrDarken(@blue, 30%)[]; --signal-info: @blue; --signal-info-major-1: #darkenOrLighten(@blue, 4%)[]; --signal-info-major-2: #darkenOrLighten(@blue, 8%)[]; --signal-info-major-3: #darkenOrLighten(@blue, 12%)[]; --signal-info-contrast: @mantle; --interaction-norm-minor-2: #lightenOrDarken(@accent, 40%)[]; --interaction-norm-minor-1: #lightenOrDarken(@accent, 30%)[]; --interaction-norm: @accent; --interaction-norm-major-1: #darkenOrLighten(@accent, 4%)[]; --interaction-norm-major-2: #darkenOrLighten(@accent, 8%)[]; --interaction-norm-major-3: #darkenOrLighten(@accent, 12%)[]; --interaction-norm-contrast: @mantle; --interaction-weak-minor-2: #lightenOrDarken(@surface0, 20%)[]; --interaction-weak-minor-1: #lightenOrDarken(@surface0, 10%)[]; --interaction-weak: @surface0; --interaction-weak-major-1: #darkenOrLighten(@surface0, 4%)[]; --interaction-weak-major-2: #darkenOrLighten(@surface0, 8%)[]; --interaction-weak-major-3: #darkenOrLighten(@surface0, 12%)[]; --interaction-weak-contrast: @text; --text-norm: @text; --text-weak: @subtext0; --text-hint: @subtext1; --text-disabled: @overlay1; --text-invert: @crust; --text-markdown: @text; --field-norm: @overlay2; --field-hover: @overlay1; --field-disabled: @overlay0; --field-focus: @accent; --field-highlight: fade(@accent, 70%); --focus-outline: @accent; --focus-ring: fade(@accent, 40%); --link-norm: @blue; --link-hover: @lavender; --link-active: @sky; --markdown-pre-background: @mantle; --border-norm: @overlay0; --border-weak: @surface1; --background-norm: @base; --background-weak: @mantle; --background-strong: @crust; --background-invert: @text; --interaction-default: transparent; --interaction-default-hover: fade(@overlay1, 20%); --interaction-default-active: fade(@overlay1, 40%); --shadow-primary-color: red(@accent) green(@accent) blue(@accent); --shadow-norm-opacity: 0.5; --shadow-raised-opacity: 1; --shadow-lifted-opacity: 0.75; --backdrop-norm: fade(@crust, 50%); --optional-scrollbar-thumb-color: @surface0; --optional-scrollbar-thumb-hover-color: @surface2; --optional-link-norm: var(--interaction-norm-major-1); --optional-link-hover: var(--interaction-norm-major-2); --optional-link-active: var(--interaction-norm-major-3); --optional-background-elevated: @surface0; --optional-background-lowered: var(--background-norm); --optional-email-item-unread-background-color: var(--background-weak); --optional-email-item-read-background-color: var(--background-norm); --optional-email-item-read-text-color: var(--text-weak); --optional-mini-calendar-today-color: @text; --optional-logo-text-proton-color: @text; --optional-logo-text-product-color: @text; --favorite-icon-color: @peach; } .ui-prominent { --background-norm: @mantle; --background-weak: @base; --background-strong: @crust; } .button-promotion { --upgrade-color-stop-1: @red; --upgrade-color-stop-2: @blue; } .item-container-row:not(.item-is-selected):hover, .item-container:not(.item-is-selected):hover { box-shadow: none; background-color: var(--navigation-current-item-background-color); color: var(--email-item-unread-text-color); } .message-content:not(.plain) .message-iframe iframe { color-scheme: light; } @media (min-width: 28.135em) { .sign-layout-bg { background: linear-gradient( 68.66deg, desaturate(@mantle, 5%) 1.3%, desaturate(@base, 5%) 50% ); } } /* Proton Lumo */ header { a[aria-label="Go to Lumo homepage"] img { filter: @accent-filter; } } .whats-new-section { background: @accent; } .new-label { background-color: @accent; color: @crust; } .lumo-sidebar { background: @mantle; a.lumo-plus-button svg path { fill: @accent; } } .lumo-input-container.ghost-mode { background-color: @crust; --ghost-text: @text; --ghost-text-weak: @subtext0; .lumo-input { background-color: @mantle; } } div[style*="background: rgb(40, 44, 52);"], div[style*="background: rgb(250, 250, 250);"] { background: @mantle !important; span { color: @text !important; } span.token[style*="color: rgb(92, 99, 112);"], span.token[style*="color: rgb(160, 161, 167);"] { color: @overlay2 !important; } span.token[style*="color: rgb(97, 175, 239);"], span.token[style*="color: rgb(64, 120, 242);"] { color: @blue !important; } span.token[style*="color: rgb(152, 195, 121);"], span.token[style*="color: rgb(80, 161, 79);"] { color: @green !important; } span.token[style*="color: rgb(209, 154, 102);"], span.token[style*="color: rgb(183, 107, 1);"] { color: @peach !important; } span.token[style*="color: rgb(198, 120, 221);"], span.token[style*="color: rgb(166, 38, 164);"] { color: @mauve !important; } span.token[style*="color: rgb(224, 108, 117);"], span.token[style*="color: rgb(228, 86, 73);"] { color: @red !important; } } } }