Skip to content

fix(youtube): support color-version v2_0 redesign#2266

Open
KenanSalar wants to merge 32 commits into
catppuccin:mainfrom
KenanSalar:fix/youtube-color-version-v2
Open

fix(youtube): support color-version v2_0 redesign#2266
KenanSalar wants to merge 32 commits into
catppuccin:mainfrom
KenanSalar:fix/youtube-color-version-v2

Conversation

@KenanSalar

@KenanSalar KenanSalar commented Jun 30, 2026

Copy link
Copy Markdown

🗒 Checklist 🗒

  • I used AI (or AI-assistance) for this change.

🔧 What does this fix? 🔧

YouTube's color-version="v2_0" redesign removed the --yt-spec-* variables the theme relied on and replaced them with two new sets (--yt-sys-color-baseline-* and --yt-deprecated-*). That left a lot of the UI sitting on default greys: the masthead and search, the watch page, Shorts, comments, channel pages and most of the feed shelves.

I remapped the new variables onto the Catppuccin palette and added fallbacks for the surfaces that don't read from those variables (they paint from inline per-build values instead) like the search box and chips, Shorts overlays, popups and dialogs, the guide drawer and the scrollbars. The old --yt-spec-* block is kept so Studio and m.youtube.com aren't affected.

Closes #2219 (also #2222).

🔍 Reproduction Steps 🔍

Before After
Screenshot_20260630_103542 Screenshot_20260630_103559
Screenshot_20260630_103751 Screenshot_20260630_103807
Screenshot_20260630_103852 Screenshot_20260630_103902
Screenshot_20260630_103945 Screenshot_20260630_103958
Screenshot_20260630_104754-1 Screenshot_20260630_104829-1

YouTube replaced the --yt-spec-* variables with --yt-sys-color-baseline--
and --yt-deprecated-, and now paints a lot of surfaces from per-build hashed
vars that those variables can't reach anymore. Mapped the full new token set
to the palette and added class-level overrides for the surfaces that went
hashed (page background, masthead, search box, chips, menus/popups).
The black bars beside a non-16:9 video in theater/fullscreen weren't themed.
Depending on whether ambient mode is on they come from either the player
itself or the full-bleed container behind it, so this colors the whole stack
to match the page. The #page-manager prefix outranks YouTube's own forced
player background, and it's skipped when the "black bars" option is on.
- Theme the slide-in guide overlay drawer on watch pages / narrow
  viewports: set the --app-drawer-content-container-background-color
  token and force the hashed-var #guide-content surface to @base, so the
  overlay matches the docked homepage guide.
- Recolor the white inner glyph of the Premium/Music/Kids product logos
  in the guide to @crust, so they read like the masthead logo (accent
  badge + dark glyph). Scoped to guide entries, leaving the monochrome
  nav icons untouched.
The color-version v2_0 popups paint their surfaces from per-build hashed
atomic vars, so the semantic-token overrides never reached them and they
stayed on YouTube's default grays:

- var(--t08a7c6c176cbc5c2) = #282828 — the masthead overflow / account /
  notifications menus (ytd-multi-page-menu-renderer) and their sticky panel
  header (ytd-simple-menu-header-renderer, a separate element).
- var(--t518e925f61bdcb91) = #212121 — the menu caret tip and the form /
  backstage-post creation dialogs (host + inner renderer).

Add these stable renderer selectors to the existing popup override block so
they fill from @Mantle like the already-covered ytd-menu-popup-renderer.
Color-only; YT's rules aren't !important, so the !important override wins.
Continue the color-version v2_0 fix with color-only overrides on stable
selectors for surfaces that paint from per-build hashed atomic vars:

- Buttons: add the camelCase .ytSpecButtonShapeNext* block (Share/Save/
  Join/Subscribe/like/dislike) mirroring the legacy kebab rules.
- Menu: set --ytd-menu-renderer-button-color so 3-dot triggers recolor.
- Watch page: title + metadata, description prose and "...more" toggle,
  info line, and channel lockup.
- Engagement panels: transcript (both impls), AI video summary, chapter
  list, panel and section headers.
- Comments: author handle, body, timestamp, placeholder, and the channel
  subscriber count.
Replace v2_0 translucent-white hashed atomic vars on the description
area with solid Catppuccin surfaces:

- Force #description.ytd-watch-metadata to @surface0
- Force ytd-expandable-metadata-renderer (AI-summary card) to @Surface1
- Step social-link highlight pills down to @Surface1 (was @surface2)
- Align collapsed-card header and expand chevron hover to @surface2
…sidebar

On color-version=v2_0 the masthead paints from a single full-width #frosted-glass
layer (search row + chip bar) over a backdrop blur, while the row containers and
the docked guide stay transparent.

- Tint the frosted-glass tokens and legacy --yt(-spec)-frosted-glass-* vars to
  fade(@base, 80%) so the blur survives instead of being flattened by a solid fill.
- Force the masthead row containers transparent and paint only the #frosted-glass
  / #background.ytd-masthead layer; re-tint the blurred scrolled / without-chipbar
  states with translucent @base.
- Keep #start transparent and leave the docked guide ([persistent]) transparent so
  the chip-bar frost stays continuous over the sidebar instead of being cut off by
  a solid panel; scope the solid @base drawer surface to the overlay drawer
  (:not([persistent])) only.
- Theme the engagement-panel card surfaces (#header/#subheader/#content) to @surface0.
Default YouTube paints the masthead chips and the search/voice buttons with a
translucent wash so the frosted glass shows through them; our theme forced them
to solid fills, which read as flat opaque surfaces on the frost.

- Inactive category chips → translucent fade(@text, 10%) (was solid @surface0);
  the active chip stays opaque @accent.
- Search button and the 'Search with your voice' button → fade(@text, 8%); the
  voice button previously kept YouTube's hardcoded white wash, so re-tint it to
  the same flavor-aware value. The search input box stays opaque @Mantle.
- Masthead mono/tonal pill buttons (Create, etc.) → fade(@text, 10%) + hover,
  scoped to #masthead so watch-page Share/Save/Join buttons keep solid @surface0.
Add color-only overrides on stable selectors for surfaces the v2_0
redesign paints from per-build hashed atomic vars (which the semantic
token remap can't reach):

- guide toggle ("hamburger") yt-icon -> @text and the YouTube wordmark
  svg fill -> @white (its glyphs lack a fill attribute so the global
  [fill="white"] rule misses them)
- sidebar/mini-guide entry labels, section headers, icons and chevrons
  -> @text; active-page row and hover highlight -> @surface0
- guide footer link rows -> @subtext0, copyright -> @overlay1, and the
  signed-out promo message -> @text
…try code

Color-only overrides on stable selectors for surfaces that paint from
per-build hashed atomic vars, which the semantic token remap can't reach:

- Chapter timestamp pill connector (#items::before) -> @Surface1
- Comment vote count -> @subtext0, brightened to @text when liked (new
  + legacy renderers)
- Translate button and comment-filter context banner -> @subtext0
- Comment continuation threadline -> @Surface1 resting / @overlay0 hover
- Logo country-code superscript -> @subtext0
…panel

Retarget --reel-metadata-color to the flavor-aware @white on
ytd-reel-video-renderer so the in-player channel handle and video title
follow the over-media text convention instead of a hashed #f1f1f1.

Theme the shorts player overlay controls: the v2_0 camelCase class
rename broke the legacy .yt-spec-button-shape-next--overlay-dark rule,
leaving the play button with a hardcoded rgba(0,0,0,0.3) scrim mismatched
against the themed volume scrim. Match play and the CC/3-dot/maximize
pill to fade(@black, 60%) and keep every glyph @white, in line with the
normal-video player controls.
Recolor the Shorts ⋮ (more options) menu surfaces the existing rules
missed: the trailing selection value (.ytListItemViewModelSelectionText)
to @subtext0, and the legacy Ambient-mode row's label/icon
(ytd-toggle-menu-service-item-renderer) to @text since they paint a
hashed atomic var instead of the usual list-item title class. Also
recolor the legacy paper-toggle switch (tp-yt-paper-toggle-button) that
the .ytSwitchShape* rules don't reach: track @surface2 / knob @overlay2
when off, both @accent when on.
Map the comments sort dropdown (yt-dropdown-menu) onto the palette: the
listbox surface to @Mantle, item titles to @text, subtitles to @subtext0,
the selected row to @surface0 and hovered rows to @Surface1. Color the
sort-button trigger icon @text and the anchored/floating comments header
@surface0 so the panel reads as one surface.

Theme secondary comment text painting hashed atomic vars: the
"Pinned by @…" badge, the Read more/Show less expander, and the comment
count by the engagement-panel title to @subtext0.
The center play button (shown when autoplay is off / video cued) has a
classless path[fill="#fff"] triangle that was inheriting the light @white
fill, washing out against the accent-tinted button. Recolor it to dark
@crust like the masthead logo so it reads in both the translucent (idle)
and opaque (hover) states. Color-only; @Version untouched.
The 2026 color-version=v2_0 channel/profile page paints many surfaces and
text from per-build hashed atomic vars (and the new --yt-lightsource-*
token family), which the existing token remap couldn't reach, leaving the
default #0f0f0f/#f1f1f1/#aaa instead of the palette. Add color-only,
stable-selector overrides:

- Channel header: remap --yt-lightsource-* (headline/tabs bg, title,
  secondary text) and force the hashed-var #page-header-container /
  #tabs-container backgrounds to @base so the whole header blends in.
- Channel empty state: title/description #f1f1f1 -> @text.
- Channel-tab search: magnifier icon, and the expanded field's typed text
  (@text), label (@subtext0), resting underline (@subtext0) and focused
  underline (@accent).
- 'Sort by' dropdown trigger label (#icon-label) -> @text.
- Notifications bell glyph -> @text; popup header/section/message text ->
  @text, timestamps -> @subtext0, row hover -> @surface0.
- Legacy context-menu items (ytd-menu-service-item-renderer): label/icon
  -> @text, hover -> @surface0.
- About '...more' dialog: wrapper --paper-dialog-background-color ->
  @surface0 (seamless card) and #about-container body text -> @text.
- Posts tab: 'Connect with your Community' banner text/surface, post
  composer fields, image-attach prompts, char counter, Published/
  Scheduled/Archived sub-tabs + the active-tab indicator line, and the
  empty-state title/subtitle/icon + its circle.
The masthead avatar menu (ytd-multi-page-menu-renderer) painted all its
text from the #f1f1f1 hashed atomic var, bypassing the semantic tokens:
the identity header (name/handle/email), every compact-link row label and
its leading icon, and the theme-toggle row — with subtitles/secondary
values reading their own hashed vars (#secondary-text even fell back to
the light-mode #0f0f0f, near-black on the dark popup). Force the stable
renderer selectors to @text, muted trailing values to @subtext0, and
re-tint the translucent-white row hover to a solid @surface0.

Also re-tint the masthead icon-button hover wash (the notification bell
and yt-icon-button siblings), a hardcoded rgba(255,255,255,.2), to the
flavor-aware fade(@text,20%) the Create pill already uses. Exclude the
:last-of-type topbar-menu-button-renderer so the account avatar keeps
YT's deliberately hover-less treatment instead of an !important-induced
oval.
…shelf logo

On the watch-history page several v2_0 surfaces still painted from per-build
hashed atomic vars (#f1f1f1 / #aaa) that the semantic-token remap can't reach,
so they stayed unthemed. Force the palette on stable selectors (color-only):

- Search watch history field (ytd-search-box-renderer paper-input): text -> text,
  label -> subtext0, resting underline -> subtext0, focused underline -> accent.
- Comments / Posts / Live chat links (#label.ytd-compact-link-renderer): -> text.
- "Today" date dividers and "Shorts" shelf titles
  (#title.ytd-item-section-header-renderer, #title.ytd-reel-shelf-renderer): -> text.
- Shorts shelf logo inner play glyph (#icon.ytd-reel-shelf-renderer white fills):
  -> crust, matching the masthead logo and Premium/Music/Kids guide logos.
The playlist queue beside the player (ytd-playlist-panel-renderer) painted
several surfaces from per-build hashed atomic vars the semantic-token remap
can't reach. Force the palette on stable selectors (color-only):

- List body (.playlist-items) and header band (.header): #0f0f0f / #212121 -> base.
- Playlist title, video titles (h4 / #video-title) and the collapse/close
  icon (#trailing-icon): #f1f1f1 -> text.
- Owner + index message (#publisher-container, .index-message), channel byline
  (#byline), and the index number / drag-reorder handle shown on hover
  (#index, #index-container, #reorder): #aaa -> subtext0.

Also extend the legacy context-menu rule to the sibling renderer types in the
video overflow popup whose labels lack the .title class, so their label + icon
+ hover get themed like the rest: ytd-menu-navigation-item-renderer ("Save to
playlist") and ytd-menu-service-item-download-renderer ("Download").
Two more watch-page surfaces painted from per-build hashed atomic vars the
semantic-token remap can't reach. Force the palette on stable selectors
(color-only):

- Miniplayer (ytd-miniplayer): the floating card body + info strip between the
  video and the queue (.ytdMiniplayerComponentContent / .ytdMiniplayerInfoBarHost)
  #212121 -> base; the video title (.ytdMiniplayerInfoBarTitle) #f1f1f1 -> text;
  the playlist subtitle + "1 / 21" count (.ytdMiniplayerInfoBarSubtitle) #aaa ->
  subtext0. The card keeps its drop shadow over the page.
- Video description hashtags / endpoint links (#description a.yt-simple-endpoint):
  #aaa -> accent. They read --yt-endpoint-color (unset) and fall back to the hashed
  var instead of the call-to-action token, so scope to the description and theme
  them as links.
Color-only structural overrides for v2_0 surfaces that paint from per-build
hashed atomic vars the token remap can't reach:

- Rich-grid shelf cards (Live Now / Recent Live Streams): title -> text,
  byline + watching count -> subtext0
- Multi-creator bylines (#attributed-channel-name, e.g. "iBlali and VIK"):
  names + inline verified-check icons -> subtext0
- Top live games cards + shelf subtitle ("Based on your Subscriptions...")
- Game/topic interactive tabbed-header: title/metadata, tab labels (incl.
  hover) + selection bar, and the #tabs-inner-container black bar -> base
- "My region" sort/filter dropdown; "Top chat" view selector (chat-scoped)
- Hero/carousel LIVE badge (.ytBadgeShapeLive) -> accent badge + base glyph
- Watch-page sponsored panel ad: card surface -> base, option cards ->
  surface0, text -> text/subtext0
- In-player ad overlay info (Sponsored / pod index / advertiser link) ->
  flavor-aware white
- Like button's Lottie thumbs-up (baked fill=rgb(255,255,255)) -> text
Default metadata badges (.ytBadgeShapeDefault — genre/platform tags such as
"Video game", "Windows", "PlayStation 5" on game/topic headers) were painted
an opaque @Surface1, losing YouTube's translucent look. Use fade(@surface2, 60%)
so they stay see-through. Color-only; the blur (backdrop-filter) is left to YT.
…faces

Add color-only structural overrides for surfaces that v2_0 paints from
per-build hashed atomic vars or hardcoded literals (unreachable via the
semantic-token remap):

- Show grid cards (ytd-grid-show-renderer): title -> @text, byline ->
  @subtext0; stacked-thumbnail season overlay -> fade(@crust, 80%) bg +
  @white text/icon.
- Community/backstage posts (ytd-backstage-post-renderer): author + body
  -> @text, @mentions/links -> @accent, timestamp + Read more/Show less
  -> @subtext0; video attachment bg -> @base, title -> @text, byline /
  metadata / description -> @subtext0.
- Learning page: View full course CTA -> @accent, topic subtitle
  (ytd-rich-shelf-renderer) -> @subtext0.
- Sports carousel: hero description inline-styled spans -> fade(@white, 70%).
@github-actions github-actions Bot added the youtube YouTube label Jun 30, 2026
@KenanSalar KenanSalar marked this pull request as ready for review June 30, 2026 09:00
@WalkQuackBack WalkQuackBack added 0.kind: bug Bug (i.e. unthemed components) 5.needs: maintainer-review Needs a review from the maintainer of this userstyle labels Jul 3, 2026
…aces

- search results: video titles + metadata and the artist/channel card (name, @handle, songs, albums)
- search filters dialog: surface → @Mantle, title/headers/close → @text, options → @subtext0, selected → @accent
- live-chat welcome-message logo: white play glyph → @crust
- members-only comments notice: card → @surface0, message text → @text
@KenanSalar

Copy link
Copy Markdown
Author

pushed the final fixes, should be good to review now whenever someone has time

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

0.kind: bug Bug (i.e. unthemed components) 5.needs: maintainer-review Needs a review from the maintainer of this userstyle youtube YouTube

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Youtube Unthemed

2 participants