kozan_core/styling/
units.rs1use style::values::generics::NonNegative;
14use style::values::generics::length::{GenericMargin, GenericSize};
15use style::values::specified::length::{AbsoluteLength, FontRelativeLength, NoCalcLength};
16use style::values::specified::{self, LengthPercentage, NonNegativeLengthPercentage};
17
18#[derive(Debug, Clone, Copy)]
24pub enum CssValue {
25 Px(f32),
27 Pct(f32),
29 Em(f32),
31 Rem(f32),
33 Vw(f32),
35 Vh(f32),
37 Auto,
39}
40
41#[must_use]
45pub fn px(v: f32) -> CssValue {
46 CssValue::Px(v)
47}
48
49#[must_use]
51pub fn pct(v: f32) -> CssValue {
52 CssValue::Pct(v)
53}
54
55#[must_use]
57pub fn em(v: f32) -> CssValue {
58 CssValue::Em(v)
59}
60
61#[must_use]
63pub fn rem(v: f32) -> CssValue {
64 CssValue::Rem(v)
65}
66
67#[must_use]
69pub fn vw(v: f32) -> CssValue {
70 CssValue::Vw(v)
71}
72
73#[must_use]
75pub fn vh(v: f32) -> CssValue {
76 CssValue::Vh(v)
77}
78
79#[must_use]
81pub fn auto() -> CssValue {
82 CssValue::Auto
83}
84
85fn to_length_percentage(v: CssValue) -> LengthPercentage {
88 match v {
89 CssValue::Px(n) => LengthPercentage::Length(NoCalcLength::Absolute(AbsoluteLength::Px(n))),
90 CssValue::Pct(n) => {
91 LengthPercentage::Percentage(style::values::computed::Percentage(n / 100.0))
92 }
93 CssValue::Em(n) => {
94 LengthPercentage::Length(NoCalcLength::FontRelative(FontRelativeLength::Em(n)))
95 }
96 CssValue::Rem(n) => {
97 LengthPercentage::Length(NoCalcLength::FontRelative(FontRelativeLength::Rem(n)))
98 }
99 CssValue::Vw(n) => LengthPercentage::Length(NoCalcLength::ViewportPercentage(
100 style::values::specified::length::ViewportPercentageLength::Vw(n),
101 )),
102 CssValue::Vh(n) => LengthPercentage::Length(NoCalcLength::ViewportPercentage(
103 style::values::specified::length::ViewportPercentageLength::Vh(n),
104 )),
105 CssValue::Auto => {
106 LengthPercentage::Length(NoCalcLength::Absolute(AbsoluteLength::Px(0.0)))
108 }
109 }
110}
111
112impl From<CssValue> for specified::Size {
116 fn from(v: CssValue) -> Self {
117 match v {
118 CssValue::Auto => GenericSize::Auto,
119 other => GenericSize::LengthPercentage(NonNegative(to_length_percentage(other))),
120 }
121 }
122}
123
124impl From<CssValue> for specified::Margin {
126 fn from(v: CssValue) -> Self {
127 match v {
128 CssValue::Auto => GenericMargin::Auto,
129 other => GenericMargin::LengthPercentage(to_length_percentage(other)),
130 }
131 }
132}
133
134impl From<CssValue> for NonNegativeLengthPercentage {
136 fn from(v: CssValue) -> Self {
137 NonNegative(to_length_percentage(v))
138 }
139}
140
141use style::color::AbsoluteColor;
144
145#[must_use]
147pub fn rgb(r: f32, g: f32, b: f32) -> AbsoluteColor {
148 AbsoluteColor::new(style::color::ColorSpace::Srgb, r, g, b, 1.0)
149}
150
151#[must_use]
153pub fn rgba(r: f32, g: f32, b: f32, a: f32) -> AbsoluteColor {
154 AbsoluteColor::new(style::color::ColorSpace::Srgb, r, g, b, a)
155}
156
157#[must_use]
159pub fn rgb8(r: u8, g: u8, b: u8) -> AbsoluteColor {
160 AbsoluteColor::srgb_legacy(r, g, b, 1.0)
161}
162
163#[must_use]
165pub fn hex(v: u32) -> AbsoluteColor {
166 let r = ((v >> 16) & 0xFF) as u8;
167 let g = ((v >> 8) & 0xFF) as u8;
168 let b = (v & 0xFF) as u8;
169 AbsoluteColor::srgb_legacy(r, g, b, 1.0)
170}