Files
novem/src/component/text.rs

110 lines
2.7 KiB
Rust
Raw Normal View History

2026-04-20 15:13:26 +01:00
use crate::app;
2026-05-08 02:29:38 +08:00
use gpui::{ParentElement, Refineable as _, Styled, div};
2026-04-20 15:13:26 +01:00
2026-04-23 11:18:43 +01:00
#[derive(gpui::IntoElement)]
pub(crate) struct Text {
content: gpui::AnyElement,
2026-05-08 02:29:38 +08:00
style: gpui::StyleRefinement,
2026-04-23 11:18:43 +01:00
}
pub(crate) trait TextContent: gpui::IntoElement {}
impl TextContent for &'static str {}
impl TextContent for String {}
impl TextContent for gpui::SharedString {}
pub(crate) fn text(content: impl TextContent) -> Text {
Text {
content: content.into_any_element(),
2026-05-09 19:31:12 +08:00
style: gpui::StyleRefinement::default()
.font_weight(gpui::FontWeight::NORMAL)
.opacity(1.)
.text_align(gpui::TextAlign::Left)
.line_height(gpui::relative(1.5)),
2026-05-08 02:29:38 +08:00
}
}
impl Styled for Text {
fn style(&mut self) -> &mut gpui::StyleRefinement {
&mut self.style
2026-04-23 11:18:43 +01:00
}
}
impl Text {
pub(crate) fn leading_none(self) -> Self {
self.line_height(gpui::relative(1.0))
}
pub(crate) fn leading_tight(self) -> Self {
self.line_height(gpui::relative(1.25))
}
pub(crate) fn leading_snug(self) -> Self {
self.line_height(gpui::relative(1.375))
}
pub(crate) fn leading_normal(self) -> Self {
self.line_height(gpui::relative(1.5))
}
pub(crate) fn leading_relaxed(self) -> Self {
self.line_height(gpui::relative(1.625))
}
pub(crate) fn leading_loose(self) -> Self {
self.line_height(gpui::relative(2.0))
}
pub(crate) fn leading_3(self) -> Self {
self.line_height(gpui::rems(0.75))
}
pub(crate) fn leading_4(self) -> Self {
self.line_height(gpui::rems(1.0))
}
pub(crate) fn leading_5(self) -> Self {
self.line_height(gpui::rems(1.25))
}
pub(crate) fn leading_6(self) -> Self {
self.line_height(gpui::rems(1.5))
}
pub(crate) fn leading_7(self) -> Self {
self.line_height(gpui::rems(1.75))
}
pub(crate) fn leading_8(self) -> Self {
self.line_height(gpui::rems(2.0))
}
pub(crate) fn leading_9(self) -> Self {
self.line_height(gpui::rems(2.25))
}
pub(crate) fn leading_10(self) -> Self {
self.line_height(gpui::rems(2.5))
}
}
2026-04-20 15:13:26 +01:00
2026-04-23 11:18:43 +01:00
impl gpui::RenderOnce for Text {
fn render(self, _window: &mut gpui::Window, cx: &mut gpui::App) -> impl gpui::IntoElement {
let theme = app::current_theme(cx);
2026-05-09 18:59:32 +08:00
2026-05-09 19:31:12 +08:00
let mut div = div().child(self.content);
2026-05-08 02:29:38 +08:00
div.style().refine(&self.style);
2026-05-09 18:59:32 +08:00
if div.style().text.as_ref().and_then(|it| it.color).is_none() {
// if no text color override, use theme text color
div = div.text_color(theme.colors.text);
}
2026-05-11 00:32:12 +08:00
if div.style().border_color.as_ref().is_none() {
div = div.border_color(theme.colors.border);
}
2026-04-23 11:18:43 +01:00
div
}
2026-04-20 15:13:26 +01:00
}