88 lines · 2.5 KB · Rust
RawDownload
use gpui::{Hsla, Pixels, SharedString, linear_color_stop, linear_gradient, px}; use crate::prelude::*; /// A gradient overlay that fades from a solid color to transparent.#[derive(IntoElement)]pub struct GradientFade {    base_bg: Hsla,    hover_bg: Hsla,    active_bg: Hsla,    width: Pixels,    right: Pixels,    gradient_stop: f32,    group_name: Option<SharedString>,} impl GradientFade {    pub fn new(base_bg: Hsla, hover_bg: Hsla, active_bg: Hsla) -> Self {        Self {            base_bg,            hover_bg,            active_bg,            width: px(48.0),            right: px(0.0),            gradient_stop: 0.6,            group_name: None,        }    }     pub fn width(mut self, width: Pixels) -> Self {        self.width = width;        self    }     pub fn right(mut self, right: Pixels) -> Self {        self.right = right;        self    }     pub fn gradient_stop(mut self, stop: f32) -> Self {        self.gradient_stop = stop;        self    }     pub fn group_name(mut self, name: impl Into<SharedString>) -> Self {        self.group_name = Some(name.into());        self    }} impl RenderOnce for GradientFade {    fn render(self, _window: &mut Window, _cx: &mut App) -> impl IntoElement {        let stop = self.gradient_stop;        let hover_bg = self.hover_bg;        let active_bg = self.active_bg;         div()            .id("gradient_fade")            .absolute()            .top_0()            .right(self.right)            .w(self.width)            .h_full()            .bg(linear_gradient(                90.,                linear_color_stop(self.base_bg, stop),                linear_color_stop(self.base_bg.opacity(0.0), 0.),            ))            .when_some(self.group_name.clone(), |element, group_name| {                element.group_hover(group_name, move |s| {                    s.bg(linear_gradient(                        90.,                        linear_color_stop(hover_bg, stop),                        linear_color_stop(hover_bg.opacity(0.0), 0.),                    ))                })            })            .when_some(self.group_name, |element, group_name| {                element.group_active(group_name, move |s| {                    s.bg(linear_gradient(                        90.,                        linear_color_stop(active_bg, stop),                        linear_color_stop(active_bg.opacity(0.0), 0.),                    ))                })            })    }}