typography.rs

 1use gpui::{
 2    div, rems, IntoElement, ParentElement, Rems, RenderOnce, SharedString, Styled, WindowContext,
 3};
 4use settings::Settings;
 5use theme::{ActiveTheme, ThemeSettings};
 6
 7#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)]
 8pub enum HeadlineSize {
 9    XSmall,
10    Small,
11    #[default]
12    Medium,
13    Large,
14    XLarge,
15}
16
17impl HeadlineSize {
18    pub fn size(self) -> Rems {
19        match self {
20            // Based on the Major Second scale
21            Self::XSmall => rems(0.88),
22            Self::Small => rems(1.0),
23            Self::Medium => rems(1.125),
24            Self::Large => rems(1.27),
25            Self::XLarge => rems(1.43),
26        }
27    }
28
29    pub fn line_height(self) -> Rems {
30        match self {
31            Self::XSmall => rems(1.6),
32            Self::Small => rems(1.6),
33            Self::Medium => rems(1.6),
34            Self::Large => rems(1.6),
35            Self::XLarge => rems(1.6),
36        }
37    }
38}
39
40#[derive(IntoElement)]
41pub struct Headline {
42    size: HeadlineSize,
43    text: SharedString,
44}
45
46impl RenderOnce for Headline {
47    fn render(self, cx: &mut WindowContext) -> impl IntoElement {
48        let ui_font = ThemeSettings::get_global(cx).ui_font.family.clone();
49
50        div()
51            .font(ui_font)
52            .line_height(self.size.line_height())
53            .text_size(self.size.size())
54            .text_color(cx.theme().colors().text)
55            .child(self.text)
56    }
57}
58
59impl Headline {
60    pub fn new(text: impl Into<SharedString>) -> Self {
61        Self {
62            size: HeadlineSize::default(),
63            text: text.into(),
64        }
65    }
66
67    pub fn size(mut self, size: HeadlineSize) -> Self {
68        self.size = size;
69        self
70    }
71}