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}