Proton Mail Carbon Editor Theme + customizations

Carbon theme in Proton Mail is beautiful but not complete, so i fix this.

Ajankohdalta 16.9.2025. Katso uusin versio.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

/* ==UserStyle==
@name           Proton Mail Carbon Editor Theme + customizations
@description    Carbon theme in Proton Mail is beautiful but not complete, so i fix this.
@version        2.1.0
@author         BreatFR
@namespace      https://gitlab.com/breatfr
@homepageURL    https://gitlab.com/breatfr/proton-mail
@supportURL     https://discord.gg/Q8KSHzdBxs
@license        AGPL-3.0-or-later; https://www.gnu.org/licenses/agpl-3.0.txt
@preprocessor   stylus

@var    checkbox    avatar      "Avatar instead initials"                   1
@var    text        avatarurl   "Avatar URL"                                "URL between quotes"
@var    checkbox    carbontheme "Fix Carbon Theme"                          1
@var    checkbox    meterbar    "Fix Meter bar colors"                      1
@var    checkbox    fixtop      "Fix Space Top"                             1
@var    checkbox    folders1st  "Folders 1st"                               1
@var    checkbox    hidelabels  "Hide Labels"                               1
@var    checkbox    hideleftnav "Hide Left Nav Icon"                        1
@var    checkbox    hideless    "Hide Less Toggle"                          1
@var    checkbox    hideoffer   "Hide Special Offer"                        1
@var    checkbox    hidetips    "Hide Tips"                                 1
@var    checkbox    hideview	"Hide View"                               	0
@var    checkbox    nospace     "No space between all messages and folders" 1
==/UserStyle== */

/* === Credits ===
Website        https://breat.fr
facebook       https://www.facebook.com/breatfroff
mastodon       https://mastodon.social/@breat_fr
telegram       https://t.me/breatfr
vk             https://vk.com/breatfroff
X (twitter)    https://x.com/breatfroff
=== Credits === */

@-moz-document domain("account.proton.me"), domain("calendar.proton.me"), domain("docs.proton.me"), domain("drive.proton.me"), domain("mail.proton.me") {
    /* Proton */
    if avatar {
        [data-testid="heading:userdropdown"] > span:nth-of-type(2) > span,
        .user-initials-active > span {
            display: none;
        }
        [data-testid="heading:userdropdown"] > span:nth-of-type(2) {
            border: 0;
            padding: 0;
        }
        [data-testid="heading:userdropdown"] > span:nth-of-type(2)::before {
            aspect-ratio: 1 / 1;
            background: url(avatarurl) center center / cover no-repeat;
            border-radius: .5em;
            content: "";
            height: auto;
            margin: auto;
            padding: 0;
            width: 48px;
        }
        .user-initials-active {
            aspect-ratio: 1 / 1;
            background: url(avatarurl) center center / cover no-repeat;
            border-radius: .5em;
            content: "";
            height: auto;
            margin: auto;
            padding: 0;
            width: 3.4rem;
        }
    }
    
    if meterbar {
        .meter-bar-thumb--success {
            --meter-bar-thumb-color-success: var(--signal-success);
        }
        .meter-bar-thumb--warning {
            --meter-bar-thumb-color-warning: var(--signal-warning);
        }
        .meter-bar-thumb--danger {
            --meter-bar-thumb-color-danger: var(--signal-danger);
        }
    }
    
    if hideoffer {
        [data-testid="cta:special-offer"] {
            display: none;
        }
    }
}

@-moz-document url-prefix("https://docs.proton.me/u/0/") {
    /* Proton Docs home */
    if carbontheme {
        .homepage-header,
        .homepage-header > header,
        main.main-area--with-toolbar.main-area-border,
        .content,
        .sidebar {
            background: #16151a !important;
            background-color: #16151a !important;
        }
        main > div > div > div > div,
        [class="flex h-[2.75rem] items-center text-left"],
        .bg-norm {
            background: rgb(52, 49, 64) !important;
            background-color: rgb(52, 49, 64) !important;
            border-color: #16141c !important;
            border-radius: 0;
        }
        main > div > div > div > div,
        [class="flex h-[2.75rem] items-center text-left"],
        [class="divide-weak divide-y"] *,
        .bg-norm {
            color: white;
        }
        [class="divide-weak divide-y"]:hover * {
            background: grey !important;
            background-color: grey !important;
        }
        .homepage-header *,
        .sidebar * {
            color: white;
        }
        
        svg path {
            fill: white;
        }
    }
}

@-moz-document url-prefix("https://docs.proton.me/doc"), url("https://docs-editor.proton.me/?type=doc&mode=edit") {
    /* Proton Docs doc */
    if carbontheme {
        [data-testid="table-button-group"],
        .main {
            background: #16151a !important;
            background-color: #16151a !important;
        }
        div[style="display: contents;"] > div:nth-of-type(1),
        .DocumentEditor {
            background: rgb(52, 49, 64) !important;
            background-color: rgb(52, 49, 64) !important;
            color: white;
        }
        .main *:not([data-testid="status-container"] *) {
            color: white !important;
        }
        [data-testid="status-container"] span {
            color: #16151a !important;
        }
    }
}

@-moz-document domain("mail.proton.me") {
    /* Proton Mail */
    if fixtop {
        .app-root {
            margin-bottom: 0 !important;
        }
    }
    
    if hideleftnav {
        .sidebar-collapse-button-container--above-scroll {
            display: none;
        }
    }
    
	/* Labels */
	ul.unstyled.navigation-list:last-child {
		padding-bottom: 0;
	}
    if hidelabels {
        ul.unstyled.navigation-list > li:has([data-shortcut-target="toggle-labels"]) {
            display: none;
        }
    }
	li.navigation-item--label,
 	ul.unstyled.navigation-list > div.py-2.ml-7.text-sm.color-weak {
		padding-left: 1.75em;
	}
    
    if hideless {
        ul.unstyled.navigation-list > div:nth-of-type(5) {
            display: none;
        }
    }
    
    if hidetips {
        .tip-box {
            display: none;
        }
    }
	
	if folders1st {
		ul.unstyled.navigation-list {
			display: flex;
			flex-direction: column;
		}
		ul.unstyled.navigation-list > li:nth-of-type(2) {
			order: 0;
		}
		ul.unstyled.navigation-list > li:nth-of-type(1) {
			order: 1;
		}
		ul.unstyled.navigation-list > div:nth-of-type(10) {
			order: 2;
		}
	}
	
	/* View */
	ul.unstyled.navigation-list > div:nth-of-type(10) {
		padding-left: 1.75em;
	}
	if hideview {
		ul.unstyled.navigation-list > li:nth-of-type(1) {
			display: none;
		}
	}
    
    if nospace {
		ul.unstyled.navigation-list {
			padding-bottom: 0 !important;
		}
        ul.unstyled.navigation-list > li:nth-of-type(1),
 		ul.unstyled.navigation-list > li:nth-of-type(2),
 		ul.unstyled.navigation-list > li:has([data-shortcut-target="toggle-labels"]) {
            margin-top: 0;
        }
    }
    
    if carbontheme {
        #proton-editor-container,
        #proton-editor-toggle-container,
        #proton-root,
        #proton-root *,
        #rooster-editor,
        #rooster-editor div,
        #rooster-editor p,
        .composer-content--rich-edition,
        .message-content,
        .message-iframe *,
        .protonmail_quote,
        blockquote div,
        blockquote *,
        iframe {
            background-color: var(--email-message-view-background-color) !important;
            color: var(--text-norm) !important;
        }

        blockquote {
            border-bottom-color: #444444 !important;
            border-left: 3px solid #444444 !important;
            border-right-color: #444444 !important;
            border-top-color: #444444 !important;
        }

        #ellipsis > svg {
            stroke: var(--text-norm) !important;
        }

        /* Signature color */
        .protonmail_signature_block-user,
        .protonmail_signature_block-user table div,
        .protonmail_signature_block-proton {
            color: var(--text-norm) !important;
        }

        /* Link color */
        #rooster-editor a,
        .protonmail_signature_block-user a,
        .protonmail_signature_block-proton a {
            color: #657ee4 !important;
        }
        
        /* Message list */
        .items-column-list-inner--mail {
            background-color: var(--email-message-view-background-color) !important;
        }
        .item-container:hover {
            box-shadow: var(--shadow-raised);
        }
        .item-container.read {
            background-color: var(--email-message-view-background-color) !important;
            color: var(--email-item-read-text-color) !important;
        }
        .item-container.unread {
            background-color: var(--email-item-unread-background-color) !important;
            color: var(--email-item-unread-text-color) !important;
        }
        .item-container.item-is-selected {
            background-color: var(--email-item-selected-background-color) !important;
            color: var(--email-item-selected-text-color) !important;
        }
        
        /* Settings */
        .quickSettings,
        .quickSettings .footer,
        .quickSettings .header--drawer {
            background-color: var(--email-message-view-background-color) !important;
        }
        
        /* Apps dropdown menu */
        ul[style="--apps-dropdown-repeat: 3;"] {
            display: flex !important;
            flex-flow: wrap;
            justify-content: space-evenly;
        }
    }
    
    /* Images in emails */
    .rio-asin-container-image img {
        mix-blend-mode: normal !important;
    }
    
    .sidebar {
        inline-size: 260px !important;
    }
}

@-moz-document domain("pass.proton.me") {
    /* Proton Pass */
    if avatar {
        .avatar {
            aspect-ratio: 1 / 1;
            background: url(avatarurl) center center / cover no-repeat;
            border-radius: .5em;
            content: "";
            height: auto;
            margin: auto;
            padding: 0;
            width: 32px;
        }
    }
}

@-moz-document domain("wallet.proton.me") {
    /* Proton Wallet */
    if avatar {
        [data-testid="heading:userdropdown"]::before {
            aspect-ratio: 1 / 1;
            background: url(avatarurl) center center / cover no-repeat;
            border-radius: .5em;
            content: "";
            display: inline-flex;
            height: 38.19px;
            order: 1;
            width: auto;
        }
        .user-initials-active {
            aspect-ratio: 1 / 1;
            background: url(avatarurl) center center / cover no-repeat;
            border-radius: .5em;
            content: "";
            height: auto;
            margin: auto;
            padding: 0;
            width: 3.4rem;
        }
    }
    
    .sidebar {
        width: auto;
    }
}