StratoSDK is a framework with a declarative approach similar to Flutter/React, written and designed entirely for Rust.
| 1 | use crate::formatted_text::weight::CustomWeight; |
| 2 | use enum_iterator::Sequence; |
| 3 | |
| 4 | /// Header sizes for formatted text blocks. |
| 5 | #[derive(Eq, PartialEq, Clone, Copy, Debug, Hash, Sequence)] |
| 6 | pub enum BlockHeaderSize { |
| 7 | Header1, |
| 8 | Header2, |
| 9 | Header3, |
| 10 | Header4, |
| 11 | Header5, |
| 12 | Header6, |
| 13 | } |
| 14 | |
| 15 | impl 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 | |
| 54 | impl 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 | |
| 67 | impl 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 |