use std::rc::Rc;
use gpui::{
div, point, px, rgb, rgb_to_hsla, AnyElement, App, BoxShadow, Div, ElementId,
InteractiveElement as _, IntoElement as _, ParentElement as _, Rgba, ScrollHandle,
SharedString, Stateful, Styled as _,
};
use fluidattacks_designs_domain::button::{spacing, Variant};
use fluidattacks_designs_domain::color::{SHADOW_ALPHA, SHADOW_COLOR};
use crate::icon::Icon;
use crate::scrollbar::Scrollbar;
use crate::theme::ActiveTheme as _;
pub fn text(value: &SharedString) -> &str {
value
}
pub type ValueHandler = Rc<dyn Fn(&str, &mut App) + 'static>;
pub fn report(chosen: Option<SharedString>, handler: Option<&ValueHandler>, app: &mut App) {
if let (Some(value), Some(handler)) = (chosen, handler) {
handler(&value, app);
}
}
pub fn ghost_icon_button(
id: impl Into<ElementId>,
glyph: Icon,
padding: f32,
cx: &App,
) -> Stateful<Div> {
let hover = cx.theme().colors.surface_muted;
div()
.id(id)
.p(px(padding))
.rounded(px(spacing(Variant::Ghost)))
.cursor_pointer()
.hover(move |style| style.bg(rgb(hover)))
.child(glyph)
}
pub fn scrolling(id: &'static str, list: AnyElement, handle: &ScrollHandle) -> AnyElement {
div()
.relative()
.flex_grow(1.0)
.min_h_0()
.child(list)
.child(Scrollbar::vertical(id, handle).track_transparent())
.into_any_element()
}
pub fn elevation(shadow: (f32, f32)) -> Vec<BoxShadow> {
vec![BoxShadow {
color: rgb_to_hsla(Rgba {
alpha: SHADOW_ALPHA,
..rgb(SHADOW_COLOR)
}),
offset: point(px(0.0), px(shadow.0)),
blur_radius: px(shadow.1),
spread_radius: px(0.0),
inset: false,
}]
}