1use crate::derives::*;
8use crate::values::animated::ToAnimatedZero;
9use crate::Zero;
10use std::fmt::{self, Write};
11use style_traits::{CssWriter, ToCss};
12
13#[derive(
14 Animate,
15 Clone,
16 ComputeSquaredDistance,
17 Copy,
18 Debug,
19 FromPrimitive,
20 MallocSizeOf,
21 Parse,
22 PartialEq,
23 SpecifiedValueInfo,
24 ToAnimatedValue,
25 ToComputedValue,
26 ToCss,
27 ToResolvedValue,
28 ToShmem,
29 ToTyped,
30)]
31#[repr(u8)]
32#[allow(missing_docs)]
33pub enum BaselineShiftKeyword {
34 Sub,
38 Super,
42 Top,
44 Center,
46 Bottom,
48}
49
50#[derive(
53 Animate,
54 Clone,
55 ComputeSquaredDistance,
56 Copy,
57 Debug,
58 MallocSizeOf,
59 PartialEq,
60 SpecifiedValueInfo,
61 ToAnimatedValue,
62 ToComputedValue,
63 ToCss,
64 ToResolvedValue,
65 ToShmem,
66 ToTyped,
67)]
68#[repr(C, u8)]
69#[typed_value(derive_fields)]
70pub enum GenericBaselineShift<LengthPercentage> {
71 Keyword(BaselineShiftKeyword),
73 Length(LengthPercentage),
75}
76
77pub use self::GenericBaselineShift as BaselineShift;
78
79impl<L: Zero> BaselineShift<L> {
80 #[inline]
82 pub fn zero() -> Self {
83 BaselineShift::Length(Zero::zero())
84 }
85}
86
87impl<L> ToAnimatedZero for BaselineShift<L> {
88 fn to_animated_zero(&self) -> Result<Self, ()> {
89 Err(())
90 }
91}
92
93#[derive(
95 Animate,
96 Clone,
97 ComputeSquaredDistance,
98 Debug,
99 MallocSizeOf,
100 PartialEq,
101 SpecifiedValueInfo,
102 ToComputedValue,
103 ToAnimatedValue,
104 ToAnimatedZero,
105 ToResolvedValue,
106 ToShmem,
107 ToTyped,
108)]
109#[value_info(other_values = "auto")]
110#[repr(C, u8)]
111pub enum GenericContainIntrinsicSize<L> {
112 None,
114 AutoNone,
116 Length(L),
118 AutoLength(L),
120}
121
122pub use self::GenericContainIntrinsicSize as ContainIntrinsicSize;
123
124impl<L: ToCss> ToCss for ContainIntrinsicSize<L> {
125 fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
126 where
127 W: Write,
128 {
129 match *self {
130 Self::None => dest.write_str("none"),
131 Self::AutoNone => dest.write_str("auto none"),
132 Self::Length(ref l) => l.to_css(dest),
133 Self::AutoLength(ref l) => {
134 dest.write_str("auto ")?;
135 l.to_css(dest)
136 },
137 }
138 }
139}
140
141#[derive(
147 Clone,
148 ComputeSquaredDistance,
149 Copy,
150 Debug,
151 MallocSizeOf,
152 PartialEq,
153 SpecifiedValueInfo,
154 ToComputedValue,
155 ToAnimatedValue,
156 ToAnimatedZero,
157 ToResolvedValue,
158 ToShmem,
159 ToTyped,
160)]
161#[repr(transparent)]
162#[value_info(other_values = "none")]
163pub struct GenericLineClamp<I>(pub I);
164
165pub use self::GenericLineClamp as LineClamp;
166
167impl<I: Zero> LineClamp<I> {
168 pub fn none() -> Self {
170 Self(crate::Zero::zero())
171 }
172
173 pub fn is_none(&self) -> bool {
175 self.0.is_zero()
176 }
177}
178
179impl<I: Zero + ToCss> ToCss for LineClamp<I> {
180 fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
181 where
182 W: Write,
183 {
184 if self.is_none() {
185 return dest.write_str("none");
186 }
187 self.0.to_css(dest)
188 }
189}
190
191#[derive(
193 Animate,
194 Clone,
195 ComputeSquaredDistance,
196 Copy,
197 Debug,
198 MallocSizeOf,
199 Parse,
200 PartialEq,
201 SpecifiedValueInfo,
202 ToAnimatedValue,
203 ToAnimatedZero,
204 ToComputedValue,
205 ToCss,
206 ToResolvedValue,
207 ToShmem,
208 ToTyped,
209)]
210#[repr(C, u8)]
211#[typed_value(derive_fields)]
212pub enum GenericPerspective<NonNegativeLength> {
213 Length(NonNegativeLength),
215 None,
217}
218
219pub use self::GenericPerspective as Perspective;
220
221impl<L> Perspective<L> {
222 #[inline]
224 pub fn none() -> Self {
225 Perspective::None
226 }
227}
228
229#[derive(
230 Clone,
231 Copy,
232 Debug,
233 MallocSizeOf,
234 Parse,
235 PartialEq,
236 SpecifiedValueInfo,
237 ToComputedValue,
238 ToCss,
239 ToResolvedValue,
240 ToShmem,
241 ToTyped,
242)]
243#[repr(u8)]
244#[allow(missing_docs)]
245pub enum PositionProperty {
246 Static = 0,
247 Relative,
248 Absolute,
249 Fixed,
250 Sticky,
251}
252
253impl PositionProperty {
254 pub fn is_absolutely_positioned(self) -> bool {
256 matches!(self, Self::Absolute | Self::Fixed)
257 }
258}
259
260#[allow(missing_docs)]
264#[derive(
265 Clone,
266 ComputeSquaredDistance,
267 Copy,
268 Debug,
269 Eq,
270 MallocSizeOf,
271 PartialEq,
272 Parse,
273 SpecifiedValueInfo,
274 ToAnimatedValue,
275 ToComputedValue,
276 ToCss,
277 ToResolvedValue,
278 ToShmem,
279 ToTyped,
280)]
281#[repr(u8)]
282pub enum OverflowClipMarginBox {
283 ContentBox,
284 PaddingBox,
285 BorderBox,
286}
287
288#[derive(
290 Animate,
291 Clone,
292 ComputeSquaredDistance,
293 Copy,
294 Debug,
295 Eq,
296 MallocSizeOf,
297 PartialEq,
298 SpecifiedValueInfo,
299 ToAnimatedValue,
300 ToComputedValue,
301 ToAnimatedZero,
302 ToResolvedValue,
303 ToShmem,
304 ToTyped,
305)]
306#[repr(C)]
307pub struct GenericOverflowClipMargin<L> {
308 pub offset: L,
310 #[animation(constant)]
312 pub visual_box: OverflowClipMarginBox,
313}
314
315pub use self::GenericOverflowClipMargin as OverflowClipMargin;
316
317impl<L: Zero> GenericOverflowClipMargin<L> {
318 pub fn zero() -> Self {
320 Self {
321 offset: Zero::zero(),
322 visual_box: OverflowClipMarginBox::PaddingBox,
323 }
324 }
325}
326
327impl<L: Zero + ToCss> ToCss for OverflowClipMargin<L> {
328 fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
329 where
330 W: Write,
331 {
332 if self.visual_box == OverflowClipMarginBox::PaddingBox {
333 return self.offset.to_css(dest);
334 }
335 self.visual_box.to_css(dest)?;
336 if !self.offset.is_zero() {
337 dest.write_char(' ')?;
338 self.offset.to_css(dest)?;
339 }
340 Ok(())
341 }
342}