diff --git a/crates/gpui/examples/shadow.rs b/crates/gpui/examples/shadow.rs index c4f379325c418..5519b4b83944d 100644 --- a/crates/gpui/examples/shadow.rs +++ b/crates/gpui/examples/shadow.rs @@ -1,25 +1,574 @@ use gpui::{ - div, prelude::*, px, rgb, size, App, AppContext, Bounds, ViewContext, WindowBounds, - WindowOptions, + div, hsla, point, prelude::*, px, relative, rgb, size, App, AppContext, Bounds, BoxShadow, Div, + SharedString, ViewContext, WindowBounds, WindowOptions, }; +use smallvec::smallvec; + struct Shadow {} +impl Shadow { + fn base() -> Div { + div() + .size_16() + .bg(rgb(0xffffff)) + .rounded_full() + .border_1() + .border_color(hsla(0.0, 0.0, 0.0, 0.1)) + } + + fn square() -> Div { + div() + .size_16() + .bg(rgb(0xffffff)) + .border_1() + .border_color(hsla(0.0, 0.0, 0.0, 0.1)) + } + + fn rounded_small() -> Div { + div() + .size_16() + .bg(rgb(0xffffff)) + .rounded(px(4.)) + .border_1() + .border_color(hsla(0.0, 0.0, 0.0, 0.1)) + } + + fn rounded_medium() -> Div { + div() + .size_16() + .bg(rgb(0xffffff)) + .rounded(px(8.)) + .border_1() + .border_color(hsla(0.0, 0.0, 0.0, 0.1)) + } + + fn rounded_large() -> Div { + div() + .size_16() + .bg(rgb(0xffffff)) + .rounded(px(12.)) + .border_1() + .border_color(hsla(0.0, 0.0, 0.0, 0.1)) + } +} + +fn example(label: impl Into, example: impl IntoElement) -> impl IntoElement { + let label = label.into(); + + div() + .flex() + .flex_col() + .justify_center() + .items_center() + .w(relative(1. / 6.)) + .border_r_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .child( + div() + .flex() + .items_center() + .justify_center() + .flex_1() + .py_12() + .child(example), + ) + .child( + div() + .w_full() + .border_t_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .p_1() + .flex() + .items_center() + .child(label), + ) +} + impl Render for Shadow { fn render(&mut self, _cx: &mut ViewContext) -> impl IntoElement { div() - .flex() + .id("shadow-example") + .overflow_y_scroll() .bg(rgb(0xffffff)) .size_full() - .justify_center() - .items_center() - .child(div().size_8().shadow_sm()) + .text_xs() + .child(div().flex().flex_col().w_full().children(vec![ + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .flex_row() + .children(vec![ + example( + "Square", + Shadow::square() + .shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Rounded 4", + Shadow::rounded_small() + .shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Rounded 8", + Shadow::rounded_medium() + .shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Rounded 16", + Shadow::rounded_large() + .shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Circle", + Shadow::base() + .shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + ]), + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .w_full() + .children(vec![ + example("None", Shadow::base()), + // Small shadow + example("Small", Shadow::base().shadow_sm()), + // Medium shadow + example("Medium", Shadow::base().shadow_md()), + // Large shadow + example("Large", Shadow::base().shadow_lg()), + example("Extra Large", Shadow::base().shadow_xl()), + example("2X Large", Shadow::base().shadow_2xl()), + ]), + // Horizontal list of increasing blur radii + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .children(vec![ + example( + "Blur 0", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(0.), + spread_radius: px(0.), + }]), + ), + example( + "Blur 2", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(2.), + spread_radius: px(0.), + }]), + ), + example( + "Blur 4", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(4.), + spread_radius: px(0.), + }]), + ), + example( + "Blur 8", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Blur 16", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(16.), + spread_radius: px(0.), + }]), + ), + ]), + // Horizontal list of increasing spread radii + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .children(vec![ + example( + "Spread 0", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Spread 2", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(2.), + }]), + ), + example( + "Spread 4", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(4.), + }]), + ), + example( + "Spread 8", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(8.), + }]), + ), + example( + "Spread 16", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(16.), + }]), + ), + ]), + // Square spread examples + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .children(vec![ + example( + "Square Spread 0", + Shadow::square().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Square Spread 8", + Shadow::square().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(8.), + }]), + ), + example( + "Square Spread 16", + Shadow::square().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(16.), + }]), + ), + ]), + // Rounded large spread examples + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .children(vec![ + example( + "Rounded Large Spread 0", + Shadow::rounded_large().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Rounded Large Spread 8", + Shadow::rounded_large().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(8.), + }]), + ), + example( + "Rounded Large Spread 16", + Shadow::rounded_large().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.0, 0.0, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(16.), + }]), + ), + ]), + // Directional shadows + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .children(vec![ + example( + "Left", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(-8.), px(0.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Right", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(8.), px(0.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Top", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(-8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Bottom", + Shadow::base().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + ]), + // Square directional shadows + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .children(vec![ + example( + "Square Left", + Shadow::square().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(-8.), px(0.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Square Right", + Shadow::square().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(8.), px(0.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Square Top", + Shadow::square().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(-8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Square Bottom", + Shadow::square().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + ]), + // Rounded large directional shadows + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .children(vec![ + example( + "Rounded Large Left", + Shadow::rounded_large().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(-8.), px(0.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Rounded Large Right", + Shadow::rounded_large().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(8.), px(0.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Rounded Large Top", + Shadow::rounded_large().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(-8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + example( + "Rounded Large Bottom", + Shadow::rounded_large().shadow(smallvec![BoxShadow { + color: hsla(0.0, 0.5, 0.5, 0.3), + offset: point(px(0.), px(8.)), + blur_radius: px(8.), + spread_radius: px(0.), + }]), + ), + ]), + // Multiple shadows for different shapes + div() + .border_b_1() + .border_color(hsla(0.0, 0.0, 0.0, 1.0)) + .flex() + .children(vec![ + example( + "Circle Multiple", + Shadow::base().shadow(smallvec![ + BoxShadow { + color: hsla(0.0 / 360., 1.0, 0.5, 0.3), // Red + offset: point(px(0.), px(-12.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(60.0 / 360., 1.0, 0.5, 0.3), // Yellow + offset: point(px(12.), px(0.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(120.0 / 360., 1.0, 0.5, 0.3), // Green + offset: point(px(0.), px(12.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(240.0 / 360., 1.0, 0.5, 0.3), // Blue + offset: point(px(-12.), px(0.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + ]), + ), + example( + "Square Multiple", + Shadow::square().shadow(smallvec![ + BoxShadow { + color: hsla(0.0 / 360., 1.0, 0.5, 0.3), // Red + offset: point(px(0.), px(-12.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(60.0 / 360., 1.0, 0.5, 0.3), // Yellow + offset: point(px(12.), px(0.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(120.0 / 360., 1.0, 0.5, 0.3), // Green + offset: point(px(0.), px(12.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(240.0 / 360., 1.0, 0.5, 0.3), // Blue + offset: point(px(-12.), px(0.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + ]), + ), + example( + "Rounded Large Multiple", + Shadow::rounded_large().shadow(smallvec![ + BoxShadow { + color: hsla(0.0 / 360., 1.0, 0.5, 0.3), // Red + offset: point(px(0.), px(-12.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(60.0 / 360., 1.0, 0.5, 0.3), // Yellow + offset: point(px(12.), px(0.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(120.0 / 360., 1.0, 0.5, 0.3), // Green + offset: point(px(0.), px(12.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + BoxShadow { + color: hsla(240.0 / 360., 1.0, 0.5, 0.3), // Blue + offset: point(px(-12.), px(0.)), + blur_radius: px(8.), + spread_radius: px(2.), + }, + ]), + ), + ]), + ])) } } fn main() { App::new().run(|cx: &mut AppContext| { - let bounds = Bounds::centered(None, size(px(300.0), px(300.0)), cx); + let bounds = Bounds::centered(None, size(px(1000.0), px(800.0)), cx); cx.open_window( WindowOptions { window_bounds: Some(WindowBounds::Windowed(bounds)), @@ -28,5 +577,7 @@ fn main() { |cx| cx.new_view(|_cx| Shadow {}), ) .unwrap(); + + cx.activate(true); }); }