Seregon/StratoSDK

StratoSDK is a framework with a declarative approach similar to Flutter/React, written and designed entirely for Rust.

Rust/27.3 KB/No license
crates/strato-ui-core/src/text/header.rs
StratoSDK / crates / strato-ui-core / src / text / header.rs
1use crate::formatted_text::weight::CustomWeight;
2use enum_iterator::Sequence;
3 
4/// Header sizes for formatted text blocks.
5#[derive(Eq, PartialEq, Clone, Copy, Debug, Hash, Sequence)]
6pub enum BlockHeaderSize {
7 Header1,
8 Header2,
9 Header3,
10 Header4,
11 Header5,
12 Header6,
13}
14 
15impl BlockHeaderSize {
16 /// Get font size multiplication ratio for this heading level.
17 pub fn font_size_multiplication_ratio(self) -> f32 {
18 // The WHATWG HTML living standard is a useful starting point for these, but we don't
19 // follow it exactly:
20 // https://html.spec.whatwg.org/multipage/rendering.html#sections-and-headings
21 match self {
22 Self::Header1 => 2.25,
23 Self::Header2 => 1.8,
24 Self::Header3 => 1.5,
25 Self::Header4 => 1.0,
26 Self::Header5 => 0.83,
27 Self::Header6 => 0.67,
28 }
29 }
30 
31 /// Font weight for this heading level.
32 pub fn font_weight(self) -> Option<CustomWeight> {
33 match self {
34 Self::Header1 | Self::Header2 | Self::Header3 | Self::Header4 => {
35 Some(CustomWeight::Semibold)
36 }
37 Self::Header5 | Self::Header6 => None,
38 }
39 }
40 
41 /// A text label for this heading, in the format `Heading $N`.
42 pub fn label(self) -> &'static str {
43 match self {
44 BlockHeaderSize::Header1 => "Heading 1",
45 BlockHeaderSize::Header2 => "Heading 2",
46 BlockHeaderSize::Header3 => "Heading 3",
47 BlockHeaderSize::Header4 => "Heading 4",
48 BlockHeaderSize::Header5 => "Heading 5",
49 BlockHeaderSize::Header6 => "Heading 6",
50 }
51 }
52}
53 
54impl From<BlockHeaderSize> for usize {
55 fn from(header_size: BlockHeaderSize) -> Self {
56 match header_size {
57 BlockHeaderSize::Header1 => 1,
58 BlockHeaderSize::Header2 => 2,
59 BlockHeaderSize::Header3 => 3,
60 BlockHeaderSize::Header4 => 4,
61 BlockHeaderSize::Header5 => 5,
62 BlockHeaderSize::Header6 => 6,
63 }
64 }
65}
66 
67impl TryFrom<usize> for BlockHeaderSize {
68 type Error = ();
69 
70 fn try_from(header_size: usize) -> Result<Self, Self::Error> {
71 match header_size {
72 1 => Ok(BlockHeaderSize::Header1),
73 2 => Ok(BlockHeaderSize::Header2),
74 3 => Ok(BlockHeaderSize::Header3),
75 4 => Ok(BlockHeaderSize::Header4),
76 5 => Ok(BlockHeaderSize::Header5),
77 6 => Ok(BlockHeaderSize::Header6),
78 _ => Err(()),
79 }
80 }
81}
82