mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-01 14:15:11 +00:00
Add Headline component
This commit is contained in:
parent
9840a8427e
commit
bca900a5d3
3 changed files with 74 additions and 0 deletions
|
@ -16,6 +16,7 @@ mod stack;
|
||||||
mod tab;
|
mod tab;
|
||||||
mod tab_bar;
|
mod tab_bar;
|
||||||
mod tooltip;
|
mod tooltip;
|
||||||
|
mod typography;
|
||||||
|
|
||||||
#[cfg(feature = "stories")]
|
#[cfg(feature = "stories")]
|
||||||
mod stories;
|
mod stories;
|
||||||
|
@ -38,6 +39,7 @@ pub use stack::*;
|
||||||
pub use tab::*;
|
pub use tab::*;
|
||||||
pub use tab_bar::*;
|
pub use tab_bar::*;
|
||||||
pub use tooltip::*;
|
pub use tooltip::*;
|
||||||
|
pub use typography::*;
|
||||||
|
|
||||||
#[cfg(feature = "stories")]
|
#[cfg(feature = "stories")]
|
||||||
pub use stories::*;
|
pub use stories::*;
|
||||||
|
|
71
crates/ui/src/components/typography.rs
Normal file
71
crates/ui/src/components/typography.rs
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
use gpui::{
|
||||||
|
div, rems, IntoElement, ParentElement, Rems, RenderOnce, SharedString, Styled, WindowContext,
|
||||||
|
};
|
||||||
|
use settings::Settings;
|
||||||
|
use theme::{ActiveTheme, ThemeSettings};
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)]
|
||||||
|
pub enum HeadlineSize {
|
||||||
|
XSmall,
|
||||||
|
Small,
|
||||||
|
#[default]
|
||||||
|
Medium,
|
||||||
|
Large,
|
||||||
|
XLarge,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HeadlineSize {
|
||||||
|
pub fn size(self) -> Rems {
|
||||||
|
match self {
|
||||||
|
// Based on the Major Second scale
|
||||||
|
Self::XSmall => rems(0.88),
|
||||||
|
Self::Small => rems(1.0),
|
||||||
|
Self::Medium => rems(1.125),
|
||||||
|
Self::Large => rems(1.27),
|
||||||
|
Self::XLarge => rems(1.43),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn line_height(self) -> Rems {
|
||||||
|
match self {
|
||||||
|
Self::XSmall => rems(1.6),
|
||||||
|
Self::Small => rems(1.6),
|
||||||
|
Self::Medium => rems(1.6),
|
||||||
|
Self::Large => rems(1.6),
|
||||||
|
Self::XLarge => rems(1.6),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(IntoElement)]
|
||||||
|
pub struct Headline {
|
||||||
|
size: HeadlineSize,
|
||||||
|
text: SharedString,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RenderOnce for Headline {
|
||||||
|
fn render(self, cx: &mut WindowContext) -> impl IntoElement {
|
||||||
|
let ui_font = ThemeSettings::get_global(cx).ui_font.family.clone();
|
||||||
|
|
||||||
|
div()
|
||||||
|
.font(ui_font)
|
||||||
|
.line_height(self.size.line_height())
|
||||||
|
.text_size(self.size.size())
|
||||||
|
.text_color(cx.theme().colors().text)
|
||||||
|
.child(self.text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Headline {
|
||||||
|
pub fn new(text: impl Into<SharedString>) -> Self {
|
||||||
|
Self {
|
||||||
|
size: HeadlineSize::default(),
|
||||||
|
text: text.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn size(mut self, size: HeadlineSize) -> Self {
|
||||||
|
self.size = size;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ pub use crate::visible_on_hover::*;
|
||||||
pub use crate::{h_stack, v_stack};
|
pub use crate::{h_stack, v_stack};
|
||||||
pub use crate::{Button, ButtonSize, ButtonStyle, IconButton};
|
pub use crate::{Button, ButtonSize, ButtonStyle, IconButton};
|
||||||
pub use crate::{ButtonCommon, Color, StyledExt};
|
pub use crate::{ButtonCommon, Color, StyledExt};
|
||||||
|
pub use crate::{Headline, HeadlineSize};
|
||||||
pub use crate::{Icon, IconElement, IconPosition, IconSize};
|
pub use crate::{Icon, IconElement, IconPosition, IconSize};
|
||||||
pub use crate::{Label, LabelCommon, LabelSize, LineHeightStyle};
|
pub use crate::{Label, LabelCommon, LabelSize, LineHeightStyle};
|
||||||
pub use theme::ActiveTheme;
|
pub use theme::ActiveTheme;
|
||||||
|
|
Loading…
Reference in a new issue