Route domain WallpaperTheme through render_wallpaper

The shell now reads snapshot.appearance.wallpaper and feeds the domain
WallpaperTheme directly into render_wallpaper. The chrome enum is
deleted; the four design themes (Dawn / Violet / Mint / Slate) all map
to base + upper-blob + lower-blob HSLA palettes that approximate the
design's radial gradients with GPUI's 2-stop linear gradient pair.

Switching themes via core.set_wallpaper_theme now propagates through
snapshots into the next render.
This commit is contained in:
2026-05-09 18:48:54 -04:00
parent 53dc40986a
commit 9780fdbc8c
3 changed files with 41 additions and 35 deletions
+1 -1
View File
@@ -20,4 +20,4 @@ pub(crate) use split_pane::{
render_split_pane_header,
};
pub(crate) use topbar::render_topbar;
pub(crate) use wallpaper::{WallpaperTheme, render_wallpaper};
pub(crate) use wallpaper::render_wallpaper;
+38 -32
View File
@@ -1,48 +1,23 @@
use ely_domain::WallpaperTheme;
use gpui::{
Hsla, IntoElement, ParentElement, Styled, div, hsla, linear_color_stop, linear_gradient, rgb,
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum WallpaperTheme {
Dawn,
}
impl WallpaperTheme {
fn base(self) -> u32 {
match self {
Self::Dawn => 0xefe8e1,
}
}
fn upper_blob(self) -> Hsla {
match self {
Self::Dawn => hsla(351.0 / 360.0, 1.0, 0.91, 0.85),
}
}
fn lower_blob(self) -> Hsla {
match self {
Self::Dawn => hsla(228.0 / 360.0, 1.0, 0.86, 0.65),
}
}
}
pub(crate) fn render_wallpaper(theme: WallpaperTheme) -> impl IntoElement {
let upper = theme.upper_blob();
let lower = theme.lower_blob();
let palette = palette_for(theme);
div()
.absolute()
.inset_0()
.bg(rgb(theme.base()))
.bg(rgb(palette.base))
.child(
div()
.absolute()
.inset_0()
.bg(linear_gradient(
225.0,
linear_color_stop(upper, 0.0),
linear_color_stop(transparent_like(upper), 0.55),
linear_color_stop(palette.upper, 0.0),
linear_color_stop(transparent_like(palette.upper), 0.55),
)),
)
.child(
@@ -51,12 +26,43 @@ pub(crate) fn render_wallpaper(theme: WallpaperTheme) -> impl IntoElement {
.inset_0()
.bg(linear_gradient(
45.0,
linear_color_stop(lower, 0.0),
linear_color_stop(transparent_like(lower), 0.62),
linear_color_stop(palette.lower, 0.0),
linear_color_stop(transparent_like(palette.lower), 0.62),
)),
)
}
struct WallpaperPalette {
base: u32,
upper: Hsla,
lower: Hsla,
}
fn palette_for(theme: WallpaperTheme) -> WallpaperPalette {
match theme {
WallpaperTheme::Dawn => WallpaperPalette {
base: 0xefe8e1,
upper: hsla(351.0 / 360.0, 1.0, 0.91, 0.85),
lower: hsla(228.0 / 360.0, 1.0, 0.86, 0.65),
},
WallpaperTheme::Violet => WallpaperPalette {
base: 0xe9e2ee,
upper: hsla(263.0 / 360.0, 1.0, 0.88, 0.78),
lower: hsla(33.0 / 360.0, 1.0, 0.87, 0.60),
},
WallpaperTheme::Mint => WallpaperPalette {
base: 0xe6ece2,
upper: hsla(146.0 / 360.0, 0.69, 0.85, 0.82),
lower: hsla(40.0 / 360.0, 1.0, 0.86, 0.65),
},
WallpaperTheme::Slate => WallpaperPalette {
base: 0xd6dae3,
upper: hsla(218.0 / 360.0, 0.20, 0.85, 0.75),
lower: hsla(20.0 / 360.0, 0.0, 0.10, 0.18),
},
}
}
fn transparent_like(color: Hsla) -> Hsla {
hsla(color.h, color.s, color.l, 0.0)
}
+2 -2
View File
@@ -7,7 +7,7 @@ use gpui::{
};
use super::chrome::{
PANEL_BG, WallpaperTheme, panel_shadow, render_command_overlay,
PANEL_BG, panel_shadow, render_command_overlay,
render_topbar as render_topbar_chrome, render_wallpaper,
};
use super::sidebar::collapsed_sidebar_active;
@@ -64,7 +64,7 @@ impl ElyShell {
.on_action(cx.listener(Self::on_zoom_in))
.on_action(cx.listener(Self::on_zoom_out))
.text_color(rgb(colors::INK))
.child(render_wallpaper(WallpaperTheme::Dawn))
.child(render_wallpaper(snapshot.appearance.wallpaper()))
.child(
div()
.absolute()