liora-components 0.1.0

Enterprise-style native GPUI component library for Liora applications.
Documentation
use gpui::{App, Component, IntoElement, RenderOnce, Window, prelude::*, px};

pub struct Divider {
    vertical: bool,
    label: Option<String>,
}

impl Divider {
    pub fn new() -> Self {
        Self {
            vertical: false,
            label: None,
        }
    }

    pub fn vertical(mut self) -> Self {
        self.vertical = true;
        self
    }

    pub fn label(mut self, text: impl Into<String>) -> Self {
        self.label = Some(text.into());
        self
    }
}

impl RenderOnce for Divider {
    fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement {
        let theme = &cx.global::<liora_core::Config>().theme;

        if self.vertical {
            gpui::div().w(px(1.0)).h_full().bg(theme.neutral.border)
        } else if let Some(text) = self.label {
            gpui::div()
                .flex()
                .flex_row()
                .items_center()
                .gap_2()
                .w_full()
                .child(gpui::div().flex_1().h(px(1.0)).bg(theme.neutral.border))
                .child(
                    gpui::div()
                        .text_size(px(theme.font_size.sm))
                        .text_color(theme.neutral.text_3)
                        .child(text),
                )
                .child(gpui::div().flex_1().h(px(1.0)).bg(theme.neutral.border))
        } else {
            gpui::div().w_full().h(px(1.0)).bg(theme.neutral.border)
        }
    }
}

impl IntoElement for Divider {
    type Element = Component<Self>;
    fn into_element(self) -> Self::Element {
        Component::new(self)
    }
}